diff --git a/src/graphics/core/MeshData.hpp b/src/graphics/core/MeshData.hpp index a5b0140c..62b32903 100644 --- a/src/graphics/core/MeshData.hpp +++ b/src/graphics/core/MeshData.hpp @@ -16,6 +16,8 @@ struct MeshData { util::Buffer indices; util::Buffer attrs; + MeshData() = default; + /// @param vertices vertex data buffer /// @param indices nullable indices buffer /// @param attrs vertex attribute sizes (must be null-terminated) diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index e457fb69..eb3a134a 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -531,7 +531,18 @@ void BlocksRenderer::build(const Chunk* chunk, const ChunksStorage* chunks) { render(voxels); } -std::shared_ptr BlocksRenderer::createMesh() { +MeshData BlocksRenderer::createMesh() { + const vattr attrs[]{ {3}, {2}, {1}, {0} }; + return MeshData( + util::Buffer(vertexBuffer.get(), vertexOffset), + util::Buffer(indexBuffer.get(), indexSize), + util::Buffer({{3}, {2}, {1}, {0}}) + ); +} + +std::shared_ptr BlocksRenderer::render(const Chunk* chunk, const ChunksStorage* chunks) { + build(chunk, chunks); + const vattr attrs[]{ {3}, {2}, {1}, {0} }; size_t vcount = vertexOffset / BlocksRenderer::VERTEX_SIZE; return std::make_shared( @@ -539,11 +550,6 @@ std::shared_ptr BlocksRenderer::createMesh() { ); } -std::shared_ptr BlocksRenderer::render(const Chunk* chunk, const ChunksStorage* chunks) { - build(chunk, chunks); - return createMesh(); -} - VoxelsVolume* BlocksRenderer::getVoxelsBuffer() const { return voxelsBuffer.get(); } diff --git a/src/graphics/render/BlocksRenderer.hpp b/src/graphics/render/BlocksRenderer.hpp index e0da218c..60aa3a07 100644 --- a/src/graphics/render/BlocksRenderer.hpp +++ b/src/graphics/render/BlocksRenderer.hpp @@ -10,6 +10,7 @@ #include "voxels/Block.hpp" #include "voxels/Chunk.hpp" #include "voxels/VoxelsVolume.hpp" +#include "graphics/core/MeshData.hpp" class Content; class Mesh; @@ -148,7 +149,7 @@ public: void build(const Chunk* chunk, const ChunksStorage* chunks); std::shared_ptr render(const Chunk* chunk, const ChunksStorage* chunks); - std::shared_ptr createMesh(); + MeshData createMesh(); VoxelsVolume* getVoxelsBuffer() const; bool isCancelled() const { diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index 04bcb548..31232f15 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -27,7 +27,13 @@ public: RendererResult operator()(const std::shared_ptr& chunk) override { renderer.build(chunk.get(), level->chunksStorage.get()); - return RendererResult {glm::ivec2(chunk->x, chunk->z), &renderer}; + if (renderer.isCancelled()) { + return RendererResult { + glm::ivec2(chunk->x, chunk->z), true, MeshData()}; + } + auto meshData = renderer.createMesh(); + return RendererResult { + glm::ivec2(chunk->x, chunk->z), false, std::move(meshData)}; } }; @@ -40,13 +46,12 @@ ChunksRenderer::ChunksRenderer( "chunks-render-pool", [=](){return std::make_shared(level, cache, settings);}, [=](RendererResult& mesh){ - if (!mesh.renderer->isCancelled()) { - meshes[mesh.key] = mesh.renderer->createMesh(); + if (!mesh.cancelled) { + meshes[mesh.key] = std::make_shared(mesh.meshData); } inwork.erase(mesh.key); }, settings->graphics.chunkMaxRenderers.get()) { - threadPool.setStandaloneResults(false); threadPool.setStopOnFail(false); renderer = std::make_unique( settings->graphics.chunkMaxVertices.get(), diff --git a/src/graphics/render/ChunksRenderer.hpp b/src/graphics/render/ChunksRenderer.hpp index 89691c4e..da02ad0e 100644 --- a/src/graphics/render/ChunksRenderer.hpp +++ b/src/graphics/render/ChunksRenderer.hpp @@ -9,6 +9,7 @@ #include "voxels/Block.hpp" #include "voxels/ChunksStorage.hpp" #include "util/ThreadPool.hpp" +#include "graphics/core/MeshData.hpp" class Mesh; class Chunk; @@ -19,7 +20,8 @@ struct EngineSettings; struct RendererResult { glm::ivec2 key; - BlocksRenderer* renderer; + bool cancelled; + MeshData meshData; }; class ChunksRenderer {