X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2Fmesh.cpp;fp=src%2Fgraphics%2Fmesh.cpp;h=4b0f5829d73ed552ff9fc8c4998a77b785425379;hb=3542823a1af7f5063d7cc8da84efa248eb889b8a;hp=0000000000000000000000000000000000000000;hpb=1c2994622a6b73f90cbd3ec9c09ffb4d7724cab4;p=blank.git diff --git a/src/graphics/mesh.cpp b/src/graphics/mesh.cpp new file mode 100644 index 0000000..4b0f582 --- /dev/null +++ b/src/graphics/mesh.cpp @@ -0,0 +1,171 @@ +#include "BlockMesh.hpp" +#include "EntityMesh.hpp" +#include "OutlineMesh.hpp" +#include "SkyBoxMesh.hpp" +#include "SpriteMesh.hpp" + +#include +#include + + +namespace blank { + +void EntityMesh::Update(const Buffer &buf) noexcept { +#ifndef NDEBUG + if (buf.tex_coords.size() < buf.vertices.size()) { + std::cerr << "EntityMesh: not enough tex coords!" << std::endl; + } + if (buf.hsl_mods.size() < buf.vertices.size()) { + std::cerr << "BlockMesh: not enough HSL modifiers!" << std::endl; + } + if (buf.rgb_mods.size() < buf.vertices.size()) { + std::cerr << "BlockMesh: not enough RGB modifiers!" << std::endl; + } + if (buf.normals.size() < buf.vertices.size()) { + std::cerr << "EntityMesh: not enough normals!" << std::endl; + } +#endif + + vao.Bind(); + vao.PushAttribute(ATTRIB_VERTEX, buf.vertices); + vao.PushAttribute(ATTRIB_TEXCOORD, buf.tex_coords); + vao.PushAttribute(ATTRIB_HSL, buf.hsl_mods); + vao.PushAttribute(ATTRIB_RGB, buf.rgb_mods); + vao.PushAttribute(ATTRIB_NORMAL, buf.normals); + vao.PushIndices(ATTRIB_INDEX, buf.indices); +} + + +void EntityMesh::Draw() const noexcept { + vao.DrawTriangleElements(); +} + + +void BlockMesh::Update(const Buffer &buf) noexcept { +#ifndef NDEBUG + if (buf.tex_coords.size() < buf.vertices.size()) { + std::cerr << "BlockMesh: not enough tex coords!" << std::endl; + } + if (buf.hsl_mods.size() < buf.vertices.size()) { + std::cerr << "BlockMesh: not enough HSL modifiers!" << std::endl; + } + if (buf.rgb_mods.size() < buf.vertices.size()) { + std::cerr << "BlockMesh: not enough RGB modifiers!" << std::endl; + } + if (buf.lights.size() < buf.vertices.size()) { + std::cerr << "BlockMesh: not enough lights!" << std::endl; + } +#endif + + vao.Bind(); + vao.PushAttribute(ATTRIB_VERTEX, buf.vertices); + vao.PushAttribute(ATTRIB_TEXCOORD, buf.tex_coords); + vao.PushAttribute(ATTRIB_HSL, buf.hsl_mods); + vao.PushAttribute(ATTRIB_RGB, buf.rgb_mods); + vao.PushAttribute(ATTRIB_LIGHT, buf.lights); + vao.PushIndices(ATTRIB_INDEX, buf.indices); +} + + +void BlockMesh::Draw() const noexcept { + vao.DrawTriangleElements(); +} + + +void OutlineMesh::Update(const Buffer &buf) noexcept { +#ifndef NDEBUG + if (buf.colors.size() < buf.vertices.size()) { + std::cerr << "OutlineMesh: not enough colors!" << std::endl; + } +#endif + + vao.Bind(); + vao.PushAttribute(ATTRIB_VERTEX, buf.vertices); + vao.PushAttribute(ATTRIB_COLOR, buf.colors); + vao.PushIndices(ATTRIB_INDEX, buf.indices); +} + + +void OutlineMesh::Draw() noexcept { + glEnable(GL_LINE_SMOOTH); + glLineWidth(2.0f); + vao.DrawLineElements(); +} + + +void SkyBoxMesh::LoadUnitBox() { + Buffer buffer; + buffer.vertices = { + { 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, -1.0f }, + { 1.0f, -1.0f, 1.0f }, + { 1.0f, -1.0f, -1.0f }, + { -1.0f, 1.0f, 1.0f }, + { -1.0f, 1.0f, -1.0f }, + { -1.0f, -1.0f, 1.0f }, + { -1.0f, -1.0f, -1.0f }, + }; + buffer.indices = { + 5, 7, 3, 3, 1, 5, + 6, 7, 5, 5, 4, 6, + 3, 2, 0, 0, 1, 3, + 6, 4, 0, 0, 2, 6, + 5, 1, 0, 0, 4, 5, + 7, 6, 3, 3, 6, 2, + }; + Update(buffer); +} + +void SkyBoxMesh::Update(const Buffer &buf) noexcept { + vao.Bind(); + vao.PushAttribute(ATTRIB_VERTEX, buf.vertices); + vao.PushIndices(ATTRIB_INDEX, buf.indices); +} + +void SkyBoxMesh::Draw() const noexcept { + vao.DrawTriangleElements(); +} + + +void SpriteMesh::Buffer::LoadRect( + float w, float h, + const glm::vec2 &pivot, + const glm::vec2 &tex_begin, + const glm::vec2 &tex_end +) { + Clear(); + Reserve(4, 6); + + vertices.emplace_back( -pivot.x, -pivot.y, 0.0f); + vertices.emplace_back(w-pivot.x, -pivot.y, 0.0f); + vertices.emplace_back( -pivot.x, h-pivot.y, 0.0f); + vertices.emplace_back(w-pivot.x, h-pivot.y, 0.0f); + + coords.emplace_back(tex_begin.x, tex_begin.y); + coords.emplace_back(tex_end.x, tex_begin.y); + coords.emplace_back(tex_begin.x, tex_end.y); + coords.emplace_back(tex_end.x, tex_end.y); + + indices.assign({ 0, 2, 1, 1, 2, 3 }); +} + + +void SpriteMesh::Update(const Buffer &buf) noexcept { +#ifndef NDEBUG + if (buf.coords.size() < buf.vertices.size()) { + std::cerr << "SpriteMesh: not enough coords!" << std::endl; + } +#endif + + vao.Bind(); + vao.PushAttribute(ATTRIB_VERTEX, buf.vertices); + vao.PushAttribute(ATTRIB_TEXCOORD, buf.coords); + vao.PushIndices(ATTRIB_INDEX, buf.indices); +} + + +void SpriteMesh::Draw() noexcept { + vao.DrawTriangleElements(); +} + +}