write number of triangles to Chunk only when sending to GPU

previously the current number of vertices was stored in the chunk, and the same variable got later reused for the number of triangles. This modification increases clarity and avoid glitches when blockpicking
pull/2/head
EmaMaker 2023-05-26 23:05:29 +02:00
parent 6113886117
commit 105fff0029
4 changed files with 21 additions and 21 deletions

View File

@ -56,7 +56,7 @@ namespace Chunk
std::unique_ptr<Block[]> getBlocksArray(int* len) { return (this->blocks.toArray(len)); } std::unique_ptr<Block[]> getBlocksArray(int* len) { return (this->blocks.toArray(len)); }
public: public:
GLuint VAO{0}, VBO{0}, EBO{0}, colorBuffer{0}, numVertices{0}; GLuint VAO{0}, VBO{0}, EBO{0}, colorBuffer{0}, numTriangles{0};
std::atomic<float> unload_timer{0}; std::atomic<float> unload_timer{0};
private: private:

View File

@ -15,6 +15,8 @@
namespace chunkmesher{ namespace chunkmesher{
struct MeshData{ struct MeshData{
Chunk::Chunk* chunk; Chunk::Chunk* chunk;
GLuint numVertices{0};
std::vector<GLfloat> vertices; std::vector<GLfloat> vertices;
std::vector<GLfloat> colors; std::vector<GLfloat> colors;
std::vector<GLuint> indices; std::vector<GLuint> indices;

View File

@ -36,7 +36,7 @@ void mesh(Chunk::Chunk* chunk)
*/ */
// Cleanup previous data // Cleanup previous data
chunk->numVertices = 0; mesh_data->numVertices = 0;
mesh_data->chunk = chunk; mesh_data->chunk = chunk;
mesh_data->vertices.clear(); mesh_data->vertices.clear();
mesh_data->indices.clear(); mesh_data->indices.clear();
@ -202,7 +202,7 @@ void mesh(Chunk::Chunk* chunk)
void sendtogpu(MeshData* mesh_data) void sendtogpu(MeshData* mesh_data)
{ {
if (mesh_data->chunk->numVertices > 0) if (mesh_data->numVertices > 0)
{ {
if(mesh_data->chunk->VAO == 0) mesh_data->chunk->createBuffers(); if(mesh_data->chunk->VAO == 0) mesh_data->chunk->createBuffers();
@ -234,7 +234,7 @@ void sendtogpu(MeshData* mesh_data)
glBindVertexArray(0); glBindVertexArray(0);
// save the number of indices of the mesh, it is needed later for drawing // save the number of indices of the mesh, it is needed later for drawing
mesh_data->chunk->numVertices = (GLuint)(mesh_data->indices.size()); mesh_data->chunk->numTriangles = (GLuint)(mesh_data->indices.size());
// once data has been sent to the GPU, it can be cleared from system RAM // once data has been sent to the GPU, it can be cleared from system RAM
mesh_data->vertices.clear(); mesh_data->vertices.clear();
@ -330,22 +330,22 @@ void quad(MeshData* mesh_data, glm::vec3 bottomLeft, glm::vec3 topLeft, glm::vec
if (backFace) if (backFace)
{ {
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 2); mesh_data->indices.push_back(mesh_data->numVertices + 2);
mesh_data->indices.push_back(mesh_data->chunk->numVertices); mesh_data->indices.push_back(mesh_data->numVertices);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 1); mesh_data->indices.push_back(mesh_data->numVertices + 1);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 1); mesh_data->indices.push_back(mesh_data->numVertices + 1);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 3); mesh_data->indices.push_back(mesh_data->numVertices + 3);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 2); mesh_data->indices.push_back(mesh_data->numVertices + 2);
} }
else else
{ {
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 2); mesh_data->indices.push_back(mesh_data->numVertices + 2);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 3); mesh_data->indices.push_back(mesh_data->numVertices + 3);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 1); mesh_data->indices.push_back(mesh_data->numVertices + 1);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 1); mesh_data->indices.push_back(mesh_data->numVertices + 1);
mesh_data->indices.push_back(mesh_data->chunk->numVertices); mesh_data->indices.push_back(mesh_data->numVertices);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 2); mesh_data->indices.push_back(mesh_data->numVertices + 2);
} }
mesh_data->chunk->numVertices += 4; mesh_data->numVertices += 4;
} }
}; };

View File

@ -62,8 +62,6 @@ namespace renderer{
} }
for(auto& c : chunks_torender){ for(auto& c : chunks_torender){
if(! (c->getState(Chunk::CHUNK_STATE_MESHED))) continue;
float dist = glm::distance(c->getPosition(), cameraChunkPos); float dist = glm::distance(c->getPosition(), cameraChunkPos);
if(dist <= static_cast<float>(RENDER_DISTANCE)){ if(dist <= static_cast<float>(RENDER_DISTANCE)){
if(!c->getState(Chunk::CHUNK_STATE_MESH_LOADED)) continue; if(!c->getState(Chunk::CHUNK_STATE_MESH_LOADED)) continue;
@ -95,7 +93,7 @@ namespace renderer{
if (!out) if (!out)
{ {
if(c->numVertices > 0) if(c->numTriangles > 0)
{ {
// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // wireframe mode // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // wireframe mode
theShader->setMat4("model", model); theShader->setMat4("model", model);
@ -103,7 +101,7 @@ namespace renderer{
theShader->setMat4("projection", theCamera.getProjection()); theShader->setMat4("projection", theCamera.getProjection());
glBindVertexArray(c->VAO); glBindVertexArray(c->VAO);
glDrawElements(GL_TRIANGLES, c->numVertices , GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, c->numTriangles , GL_UNSIGNED_INT, 0);
glBindVertexArray(0); glBindVertexArray(0);
} }
} }