]> git.localhorst.tv Git - blank.git/commitdiff
avoid zero vertex draw calls
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 18 Dec 2015 13:28:42 +0000 (14:28 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 18 Dec 2015 13:28:42 +0000 (14:28 +0100)
src/graphics/BlockMesh.hpp
src/graphics/EntityMesh.hpp
src/graphics/PrimitiveMesh.hpp
src/graphics/SkyBoxMesh.hpp
src/graphics/SpriteMesh.hpp
src/graphics/VertexArray.hpp
src/graphics/mesh.cpp
src/world/chunk.cpp

index 399ff320ddd8e06bf19387b171ed6b8684d79123..534299233a2cc5d6eae9f5aa47b117246acc3d4c 100644 (file)
@@ -69,7 +69,13 @@ public:
 public:
        void Update(const Buffer &) noexcept;
 
-       void Draw() const noexcept;
+       bool Empty() const noexcept {
+               return vao.Empty();
+       }
+
+       void Draw() const noexcept {
+               vao.DrawTriangleElements();
+       }
 
 private:
        VAO vao;
index 804bb6ede5f1a59488fdff2226b9492267c4c36a..58b29e51f7726fa078b8036443e857a587c25730 100644 (file)
@@ -69,7 +69,13 @@ public:
 public:
        void Update(const Buffer &) noexcept;
 
-       void Draw() const noexcept;
+       bool Empty() const noexcept {
+               return vao.Empty();
+       }
+
+       void Draw() const noexcept {
+               vao.DrawTriangleElements();
+       }
 
 private:
        VAO vao;
index 6a8b6967df6606a081ff2b5be69c428bc62ec454..577321a73e8204e281a265c8402d193900445cbe 100644 (file)
@@ -66,8 +66,14 @@ public:
 public:
        void Update(const Buffer &) noexcept;
 
-       void DrawLines() noexcept;
-       void DrawTriangles() noexcept;
+       bool Empty() const noexcept {
+               return vao.Empty();
+       }
+
+       void DrawLines() const noexcept;
+       void DrawTriangles() const noexcept {
+               vao.DrawTriangleElements();
+       }
 
 private:
        VAO vao;
index ab1da8dc807280d2d65a9508d0ca907c31dd2550..2378327fc50a3848cdd0a3664fc06e6dc43a0823 100644 (file)
@@ -47,7 +47,13 @@ public:
        void LoadUnitBox();
        void Update(const Buffer &) noexcept;
 
-       void Draw() const noexcept;
+       bool Empty() const noexcept {
+               return vao.Empty();
+       }
+
+       void Draw() const noexcept {
+               vao.DrawTriangleElements();
+       }
 
 private:
        VAO vao;
index a7cfd64ef837c1574c292a0a1223fab81fa34d11..0c6c9a1918b3f97758335147d872471e8b5f85bb 100644 (file)
@@ -60,7 +60,13 @@ public:
 public:
        void Update(const Buffer &) noexcept;
 
-       void Draw() noexcept;
+       bool Empty() const noexcept {
+               return vao.Empty();
+       }
+
+       void Draw() const noexcept {
+               vao.DrawTriangleElements();
+       }
 
 private:
        VAO vao;
index 5f70f4227365849f5416b220fd36a679d011f0c7..ab02a56f175e9be943b88b9973918bddacfb57f8 100644 (file)
@@ -24,6 +24,8 @@ public:
        VertexArray<N> &operator =(VertexArray<N> &&) noexcept;
 
 public:
+       bool Empty() const noexcept { return idx_count == 0; }
+
        void Bind() const noexcept;
 
        template <class T>
index 9cb8c92ae9736a0337a1c7f681e1a2fe1115f5c1..906b20f3e0732d802e61c740380259f0d63fdc34 100644 (file)
@@ -18,10 +18,10 @@ void EntityMesh::Update(const Buffer &buf) noexcept {
                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;
+               std::cerr << "EntityMesh: not enough HSL modifiers!" << std::endl;
        }
        if (buf.rgb_mods.size() < buf.vertices.size()) {
-               std::cerr << "BlockMesh: not enough RGB modifiers!" << std::endl;
+               std::cerr << "EntityMesh: not enough RGB modifiers!" << std::endl;
        }
        if (buf.normals.size() < buf.vertices.size()) {
                std::cerr << "EntityMesh: not enough normals!" << std::endl;
@@ -38,11 +38,6 @@ void EntityMesh::Update(const Buffer &buf) noexcept {
 }
 
 
-void EntityMesh::Draw() const noexcept {
-       vao.DrawTriangleElements();
-}
-
-
 void BlockMesh::Update(const Buffer &buf) noexcept {
 #ifndef NDEBUG
        if (buf.tex_coords.size() < buf.vertices.size()) {
@@ -69,11 +64,6 @@ void BlockMesh::Update(const Buffer &buf) noexcept {
 }
 
 
-void BlockMesh::Draw() const noexcept {
-       vao.DrawTriangleElements();
-}
-
-
 void PrimitiveMesh::Buffer::FillRect(
        float w, float h,
        const Color &color,
@@ -129,16 +119,12 @@ void PrimitiveMesh::Update(const Buffer &buf) noexcept {
 }
 
 
-void PrimitiveMesh::DrawLines() noexcept {
+void PrimitiveMesh::DrawLines() const noexcept {
        glEnable(GL_LINE_SMOOTH);
        glLineWidth(2.0f);
        vao.DrawLineElements();
 }
 
-void PrimitiveMesh::DrawTriangles() noexcept {
-       vao.DrawTriangleElements();
-}
-
 
 void SkyBoxMesh::LoadUnitBox() {
        Buffer buffer;
@@ -169,10 +155,6 @@ void SkyBoxMesh::Update(const Buffer &buf) noexcept {
        vao.PushIndices(ATTRIB_INDEX, buf.indices);
 }
 
-void SkyBoxMesh::Draw() const noexcept {
-       vao.DrawTriangleElements();
-}
-
 
 void SpriteMesh::Buffer::LoadRect(
        float w, float h,
@@ -210,9 +192,4 @@ void SpriteMesh::Update(const Buffer &buf) noexcept {
        vao.PushIndices(ATTRIB_INDEX, buf.indices);
 }
 
-
-void SpriteMesh::Draw() noexcept {
-       vao.DrawTriangleElements();
-}
-
 }
index 6eb027a58f233173dc1026de7da64e4931ad7f59..596bcaf08985765f4a0f96aa928c4cef3d040e94 100644 (file)
@@ -815,33 +815,21 @@ void ChunkRenderer::Render(Viewport &viewport) {
        Frustum frustum(transpose(chunk_prog.GetVP()));
        AABB box;
 
-       //std::cout << "V = " << chunk_prog.View() << std::endl;
-       //std::cout << "P = " << chunk_prog.Projection() << std::endl;
-       //std::cout << "VP = " << chunk_prog.GetVP() << std::endl;
-       //std::cout << "frustum = " << frustum << std::endl;
-
        for (int i = 0; i < index.TotalChunks(); ++i) {
                if (!index[i]) continue;
                box.min = (index[i]->Position() - index.Base()) * ExactLocation::Extent();
                box.max = box.min + ExactLocation::FExtent();
 
                if (!CullTest(box, frustum)) {
-
-                       //glm::mat4 m(index[i]->Transform(index.Base()));
-                       //if (CullTest(Chunk::Bounds(), chunk_prog.GetVP() * m)) {
-                       //      std::cout << "M = " << m << std::endl;
-                       //      std::cout << "box = " << box.min << ", " << box.max << std::endl;
-                       //      std::cout << "should've been culled" << std::endl;
-                       //}
-
                        if (index[i]->ShouldUpdateMesh()) {
                                index[i]->Update(models[i]);
                        }
-                       chunk_prog.SetM(index[i]->Transform(index.Base()));
-                       models[i].Draw();
+                       if (!models[i].Empty()) {
+                               chunk_prog.SetM(index[i]->Transform(index.Base()));
+                               models[i].Draw();
+                       }
                }
        }
-       //std::cout << std::endl;
 }