]> git.localhorst.tv Git - blank.git/blobdiff - src/graphics/mesh.cpp
save a little bandwidth
[blank.git] / src / graphics / mesh.cpp
index 4b0f5829d73ed552ff9fc8c4998a77b785425379..9cb8c92ae9736a0337a1c7f681e1a2fe1115f5c1 100644 (file)
@@ -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 <algorithm>
 #include <iostream>
 
@@ -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;