diff --git a/src/renderer.cpp b/src/renderer.cpp index 0c5796c..e4f67b3 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -158,37 +158,38 @@ namespace renderer{ distz >= -RENDER_DISTANCE && distz < RENDER_DISTANCE){ if(!c->getState(Chunk::CHUNK_STATE_MESH_LOADED)) continue; - // Increase total vertex count - vertices += c->numVertices; - // reset out-of-vision and unload flags c->setState(Chunk::CHUNK_STATE_OUTOFVISION, false); c->setState(Chunk::CHUNK_STATE_UNLOADED, false); - // Perform frustum culling and eventually render - glm::vec3 chunk = c->getPosition(); - glm::vec4 chunkW = glm::vec4(chunk.x*static_cast(CHUNK_SIZE), chunk.y*static_cast(CHUNK_SIZE), chunk.z*static_cast(CHUNK_SIZE),1.0); - glm::mat4 model = glm::translate(glm::mat4(1.0), ((float)CHUNK_SIZE) * chunk); - - // Check if all the corners of the chunk are outside any of the planes - // TODO (?) implement frustum culling as per (Inigo Quilez)[https://iquilezles.org/articles/frustumcorrect/], and check each - // plane against each corner of the chunk - bool out=false; - int a{0}; - for(int p = 0; p < 6; p++){ - a = 0; - for(int i = 0; i < 8; i++) a += glm::dot(frustumPlanes[p], glm::vec4(chunkW.x + ((float)(i & 1))*CHUNK_SIZE, chunkW.y - + ((float)((i & 2) >> 1))*CHUNK_SIZE, chunkW.z + ((float)((i & 4) >> 2))*CHUNK_SIZE, 1.0)) < 0.0; - - if(a==8){ - out=true; - break; - } - } - - if (!out) + if(c->numVertices > 0) { - if(c->numVertices > 0) + + // Increase total vertex count + vertices += c->numVertices; + + // Perform frustum culling and eventually render + glm::vec3 chunk = c->getPosition(); + glm::vec4 chunkW = glm::vec4(chunk.x*static_cast(CHUNK_SIZE), chunk.y*static_cast(CHUNK_SIZE), chunk.z*static_cast(CHUNK_SIZE),1.0); + glm::mat4 model = glm::translate(glm::mat4(1.0), ((float)CHUNK_SIZE) * chunk); + + // Check if all the corners of the chunk are outside any of the planes + // TODO (?) implement frustum culling as per (Inigo Quilez)[https://iquilezles.org/articles/frustumcorrect/], and check each + // plane against each corner of the chunk + bool out=false; + int a{0}; + for(int p = 0; p < 6; p++){ + a = 0; + for(int i = 0; i < 8; i++) a += glm::dot(frustumPlanes[p], glm::vec4(chunkW.x + ((float)(i & 1))*CHUNK_SIZE, chunkW.y + + ((float)((i & 2) >> 1))*CHUNK_SIZE, chunkW.z + ((float)((i & 4) >> 2))*CHUNK_SIZE, 1.0)) < 0.0; + + if(a==8){ + out=true; + break; + } + } + + if (!out) { theShader->setMat4("model", model); theShader->setMat4("view", theCamera.getView()); @@ -204,7 +205,7 @@ namespace renderer{ }else{ // When the chunk is outside render distance - if(c->getState(Chunk::CHUNK_STATE_OUTOFVISION)){ + /*if(c->getState(Chunk::CHUNK_STATE_OUTOFVISION)){ oof++; if(glfwGetTime() - c->unload_timer > UNLOAD_TIMEOUT){ // If chunk was already out and enough time has passed @@ -217,8 +218,11 @@ namespace renderer{ c->setState(Chunk::CHUNK_STATE_OUTOFVISION, true); c->setState(Chunk::CHUNK_STATE_UNLOADED, false); c->unload_timer = glfwGetTime(); - } - + }*/ + c->setState(Chunk::CHUNK_STATE_OUTOFVISION, true); + c->setState(Chunk::CHUNK_STATE_UNLOADED, true); + //render_todelete.push_back(c); + oof++; } } @@ -230,14 +234,14 @@ namespace renderer{ debug::window::set_parameter("render_chunks_deleted", (int) (render_todelete.size())); debug::window::set_parameter("render_chunks_vertices", vertices); - for(auto& c : render_todelete){ - c->deleteBuffers(); + /*for(auto& c : render_todelete){ // we can get away with unsafe erase as access to the container is only done by this // thread chunks_torender.unsafe_erase(c); c->setState(Chunk::CHUNK_STATE_UNLOADED, true); + //c->deleteBuffers(); } - render_todelete.clear(); + render_todelete.clear();*/ /* DISPLAY TEXTURE ON A QUAD THAT FILLS THE SCREEN */ // Now to render the quad, with the texture on top