X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2Fmesh.cpp;h=9cb8c92ae9736a0337a1c7f681e1a2fe1115f5c1;hb=2ad195d00eea2c4d48f3f1a3ccc60a8176e7da20;hp=4b0f5829d73ed552ff9fc8c4998a77b785425379;hpb=3542823a1af7f5063d7cc8da84efa248eb889b8a;p=blank.git diff --git a/src/graphics/mesh.cpp b/src/graphics/mesh.cpp index 4b0f582..9cb8c92 100644 --- a/src/graphics/mesh.cpp +++ b/src/graphics/mesh.cpp @@ -1,9 +1,11 @@ #include "BlockMesh.hpp" #include "EntityMesh.hpp" -#include "OutlineMesh.hpp" +#include "PrimitiveMesh.hpp" #include "SkyBoxMesh.hpp" #include "SpriteMesh.hpp" +#include "../geometry/primitive.hpp" + #include #include @@ -29,8 +31,8 @@ void EntityMesh::Update(const Buffer &buf) noexcept { 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_HSL, buf.hsl_mods, true); + vao.PushAttribute(ATTRIB_RGB, buf.rgb_mods, true); vao.PushAttribute(ATTRIB_NORMAL, buf.normals); vao.PushIndices(ATTRIB_INDEX, buf.indices); } @@ -60,8 +62,8 @@ void BlockMesh::Update(const Buffer &buf) noexcept { 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_HSL, buf.hsl_mods, true); + vao.PushAttribute(ATTRIB_RGB, buf.rgb_mods, true); vao.PushAttribute(ATTRIB_LIGHT, buf.lights); vao.PushIndices(ATTRIB_INDEX, buf.indices); } @@ -72,26 +74,71 @@ void BlockMesh::Draw() const noexcept { } -void OutlineMesh::Update(const Buffer &buf) noexcept { +void PrimitiveMesh::Buffer::FillRect( + float w, float h, + const Color &color, + const glm::vec2 &pivot +) { + 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); + + colors.resize(4, color); + + indices.assign({ 0, 2, 1, 1, 2, 3 }); +} + +void PrimitiveMesh::Buffer::OutlineBox(const AABB &box, const Color &color) { + Clear(); + Reserve(8, 24); + + vertices.emplace_back(box.min.x, box.min.y, box.min.z); + vertices.emplace_back(box.min.x, box.min.y, box.max.z); + vertices.emplace_back(box.min.x, box.max.y, box.min.z); + vertices.emplace_back(box.min.x, box.max.y, box.max.z); + vertices.emplace_back(box.max.x, box.min.y, box.min.z); + vertices.emplace_back(box.max.x, box.min.y, box.max.z); + vertices.emplace_back(box.max.x, box.max.y, box.min.z); + vertices.emplace_back(box.max.x, box.max.y, box.max.z); + + colors.resize(8, color); + + indices.assign({ + 0, 1, 1, 3, 3, 2, 2, 0, // left + 4, 5, 5, 7, 7, 6, 6, 4, // right + 0, 4, 1, 5, 3, 7, 2, 6, // others + }); +} + + +void PrimitiveMesh::Update(const Buffer &buf) noexcept { #ifndef NDEBUG if (buf.colors.size() < buf.vertices.size()) { - std::cerr << "OutlineMesh: not enough colors!" << std::endl; + std::cerr << "PrimitiveMesh: not enough colors!" << std::endl; } #endif vao.Bind(); vao.PushAttribute(ATTRIB_VERTEX, buf.vertices); - vao.PushAttribute(ATTRIB_COLOR, buf.colors); + vao.PushAttribute(ATTRIB_COLOR, buf.colors, true); vao.PushIndices(ATTRIB_INDEX, buf.indices); } -void OutlineMesh::Draw() noexcept { +void PrimitiveMesh::DrawLines() noexcept { glEnable(GL_LINE_SMOOTH); glLineWidth(2.0f); vao.DrawLineElements(); } +void PrimitiveMesh::DrawTriangles() noexcept { + vao.DrawTriangleElements(); +} + void SkyBoxMesh::LoadUnitBox() { Buffer buffer;