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 blockpickingpull/2/head
parent
6113886117
commit
105fff0029
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue