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)); }
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};
private:

View File

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

View File

@ -36,7 +36,7 @@ void mesh(Chunk::Chunk* chunk)
*/
// Cleanup previous data
chunk->numVertices = 0;
mesh_data->numVertices = 0;
mesh_data->chunk = chunk;
mesh_data->vertices.clear();
mesh_data->indices.clear();
@ -202,7 +202,7 @@ void mesh(Chunk::Chunk* chunk)
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();
@ -234,7 +234,7 @@ void sendtogpu(MeshData* mesh_data)
glBindVertexArray(0);
// 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
mesh_data->vertices.clear();
@ -330,22 +330,22 @@ void quad(MeshData* mesh_data, glm::vec3 bottomLeft, glm::vec3 topLeft, glm::vec
if (backFace)
{
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 2);
mesh_data->indices.push_back(mesh_data->chunk->numVertices);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 1);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 1);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 3);
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->numVertices);
mesh_data->indices.push_back(mesh_data->numVertices + 1);
mesh_data->indices.push_back(mesh_data->numVertices + 1);
mesh_data->indices.push_back(mesh_data->numVertices + 3);
mesh_data->indices.push_back(mesh_data->numVertices + 2);
}
else
{
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 2);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 3);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 1);
mesh_data->indices.push_back(mesh_data->chunk->numVertices + 1);
mesh_data->indices.push_back(mesh_data->chunk->numVertices);
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->numVertices + 3);
mesh_data->indices.push_back(mesh_data->numVertices + 1);
mesh_data->indices.push_back(mesh_data->numVertices + 1);
mesh_data->indices.push_back(mesh_data->numVertices);
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){
if(! (c->getState(Chunk::CHUNK_STATE_MESHED))) continue;
float dist = glm::distance(c->getPosition(), cameraChunkPos);
if(dist <= static_cast<float>(RENDER_DISTANCE)){
if(!c->getState(Chunk::CHUNK_STATE_MESH_LOADED)) continue;
@ -95,7 +93,7 @@ namespace renderer{
if (!out)
{
if(c->numVertices > 0)
if(c->numTriangles > 0)
{
// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // wireframe mode
theShader->setMat4("model", model);
@ -103,7 +101,7 @@ namespace renderer{
theShader->setMat4("projection", theCamera.getProjection());
glBindVertexArray(c->VAO);
glDrawElements(GL_TRIANGLES, c->numVertices , GL_UNSIGNED_INT, 0);
glDrawElements(GL_TRIANGLES, c->numTriangles , GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
}