diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index 09544a358..82a7fa6d6 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -125,30 +125,30 @@ std::shared_ptr ChunksRenderer::prepareVoxelsVolume( return voxelsBuffer; } -const ChunkMesh* ChunksRenderer::render( - const std::shared_ptr& chunk, bool important, bool lowPriority +void ChunksRenderer::renderBlocking(const std::shared_ptr& chunk) { + glm::ivec2 key(chunk->x, chunk->z); + ChunkMesh mesh {}; + auto voxelsBuffer = prepareVoxelsVolume(*chunk); + mesh = renderer->render(chunk.get(), *voxelsBuffer); + meshes[key] = std::move(mesh); + chunk->flags.modified = false; +} + +void ChunksRenderer::render( + const std::shared_ptr& chunk, bool lowPriority ) { glm::ivec2 key(chunk->x, chunk->z); - if (important) { - ChunkMesh mesh {}; - auto voxelsBuffer = prepareVoxelsVolume(*chunk); - mesh = renderer->render(chunk.get(), *voxelsBuffer); - meshes[key] = std::move(mesh); - chunk->flags.modified = false; - return &meshes[key]; - } if (inwork.find(key) != inwork.end() || ((inwork.size() >= threadPool.getWorkersCount() || enqueuedInFrame >= MAX_CHUNKS_ENQUEUED_IN_FRAME) && lowPriority)) { - return nullptr; + return; } chunk->flags.modified = false; enqueuedInFrame++; auto voxelsBuffer = prepareVoxelsVolume(*chunk); threadPool.enqueueJob({chunk, std::move(voxelsBuffer)}); inwork[key] = true; - return nullptr; } void ChunksRenderer::unload(const Chunk* chunk) { @@ -195,6 +195,8 @@ void ChunksRenderer::update() { } ); + int loadDistance = settings.chunks.loadDistance.get(); + const int topN = 10; int top = std::min(meshBuildQueue.size(), topN); for (int i = 0; i < top; i++) { @@ -214,12 +216,16 @@ void ChunksRenderer::update() { ) ); bool important = distance < CHUNK_W * 1.5f; - bool lowPriority = distance > CHUNK_W * settings.chunks.loadDistance.get() * 0.5; + bool lowPriority = distance > CHUNK_W * loadDistance * 0.5; if (chunk->flags.dirtyHeights) { chunk->updateHeights(); } - render(chunk, important, lowPriority); + if (important) { + renderBlocking(chunk); + } else { + render(chunk, lowPriority); + } } } diff --git a/src/graphics/render/ChunksRenderer.hpp b/src/graphics/render/ChunksRenderer.hpp index 2f25875c5..5e26adc43 100644 --- a/src/graphics/render/ChunksRenderer.hpp +++ b/src/graphics/render/ChunksRenderer.hpp @@ -54,7 +54,7 @@ public: const ContentGfxCache& cache, const EngineSettings& settings ); - virtual ~ChunksRenderer(); + ~ChunksRenderer(); void unload(const Chunk* chunk); void clear(); @@ -88,7 +88,7 @@ private: std::shared_ptr prepareVoxelsVolume(const Chunk& chunk); - const ChunkMesh* render( - const std::shared_ptr& chunk, bool important, bool lowPriority - ); + void render(const std::shared_ptr& chunk, bool lowPriority); + + void renderBlocking(const std::shared_ptr& chunk); };