From 61e4648924ce01979f8496b3e3f86509ec238ff4 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 11 Dec 2025 23:54:16 +0300 Subject: [PATCH 01/12] update grass and dirt textures --- res/content/base/textures/blocks/dirt.png | Bin 779 -> 6349 bytes res/content/base/textures/blocks/grass.png | Bin 6960 -> 7212 bytes .../base/textures/blocks/grass_side.png | Bin 7842 -> 6393 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res/content/base/textures/blocks/dirt.png b/res/content/base/textures/blocks/dirt.png index 9fc51ad886ba3d044344e3825dccabb6a02a1d68..8df51c45e355596f22cfefa5c550d1dd69d63b24 100644 GIT binary patch literal 6349 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 delta 756 zcmVHt2jmy> z-N{1$!HNY_5-n~+&c5c7nWvtvuIj3DZ<{~=_`Q4GM$mQKUr#BkiudTmr0-)Ki)~bJ z`7DcCXU2mbx3e)lw;1b%SpVNmk<;hkuVBu2nE5PBI+JVL2HQ zXSvoE)2kk)XDU$DM4M&ZD%sU-@NhF{6n12ltE2&k;|a%h*&L3X(oE+@>cU`Nqmnc) zX_WkMbIoSAr*2#9E@L(rs%Xhy&n31SLQ`-|QhL6}Y8_FGJxrSBWO+{5>p@%64-NaI z;_Eu0Y#nw{Mt_ty^xclQvACO08H54*NS$N}<~(z#V9&P%uwWNgc&4RlY@T&XrKB%E z4Kdz;$L}jV*P*U!hW#FkNgxKHPn@;{oy#sc!|C|-VZpccUN^K%h9PO?;8O}!pZ7z` z?Q}?9mXbycI!Tk}lFBw04!5(B5=+X)r|L?nYccAFtbaBKY|9WOM?4#rk}@p{LEIkI zz9AEfk+g4Ghzkox9*{W%wBes`E5YorwP$rLM=^5_C(^RQ+%G3IO)Xfd5@n7e!uLaI zU0e=t_bE4vu|~6*UwL#==Kl>oi@L2q zz}L4uQJgWCVg7!4p>6awJcp}+%Qm%n+F0Un&}}HS#*`D!$&Jw0Rm-VO=mnty7OA9k z9EaaNO(bEC9}LLe*UY99Ui9x7`=Xe6Uhnw%ZmO#P``wlEQqCY#e)%xw-&c)jI}~wo me(`)4=*4s_PuOgZ3I72brju)WbCOs90000?RET zXBAlj5(30>Fhf;#kmctv*zKNP<>vjR(yq2?B&36mgrQCQ>(6ffz=v7Yh>sdl2o@hn zk~pKGc75`^la+bjKkV6f>Nl5w(dF=T>!*gTfA*7ovP2mze}6NiWebjHL6U7>Ukq(W zZXjYb>Nb?NA;(KV+dy8^vLR`_PvL0mSorWS5GQNVlxDyEi@+nT&Cjn6(Q01f26DwDXKKGkfwuHBedkJ#5o*(-S z`OmD((BC|Z?td0P_h+(kA$p1a`1W44&pBfjSpq^G_N30K%og+xxEQY009t^}fE-dh z$CYp?vbun^YKuK^6-vaQtCLWrOr6?%7Ak-!+zdxFm%OBY^1}FFZ0s@y^m5LvVVHT3b>d@umNK*H||gaBh+_L z{S5GVy?zF-4h;GcPZUKC zW$(Or?|*}jUVZX8xFErY5MmgMVva6~i9UuHqsA1oIu-RAG^%RSoH#iwnm&aTlctn% zhR+Pk8KW~4az6NQhaBD<;fRMG>Bt4?Q>6G3N-SDZ$(5_CSU+m0v1&~VC-F zJ8z#@tK&6PCS$7#M^LRp^+Db=v*z)#dwZI1f}cMBH}u~%gk&2HJ_`0Au9Vf^qpjss zF@L`crh7MinC;~F;G|35IQ)1y*05B9R(Y7QTg3#I3TkEjtSEf@13UjXMqSFbCBs%} z+g7QlP`^cE%T}_t zurYyf+4WlWJpc`??d%v42p4e=R)nuvI)9i8*DPOQnHxUMcX;s*&(oEVaCzj1%Tr`N z%1++LPNJj}X&Hh1X3^YoD?JU*kKqrMufS%ERxrXnV_JA*%sb_7gg-ybC`9JF%w5^Q zw-S>3)ZL8cv~Lj3a;uAn`~UVZX)? z*@n~FGswC@<_WTjStyBaTDhE-lG;_jW8T_t?6|rUCn$QF*|A*ZrzG0GewS z#jm2sa&TGG5p00hK$6@1(~;V-;eRR4=P|J-vtt8Uaa$(QJq*aP+)DapbB!~5;E30b z0QOdEh_(Ak&rbYWC~@}byz8NMgI!t;yCATik)2h74d2qoak@Kqt?3a5rJd!3qyCk^ z=2<6h9Sfb#r>Oo?wB92I2gcb@`;08F{0lhOo$_72rJz)n9eH$`V#A^cCtAOi`#4H| zQ2eO(_Bwi*g`UW?1>RZ2{-l6pEfQ7bELtKp%Xe1UAxxCQYGuAcnHL60!SCu1L^~gm zNNyuaq?frfSb99q9Tr3 zg(6f4wL+^7CYOFelZK?l#ZhoAIQX$xb#QUk)xlK|1V2FB1t&!pDe-?vp+$@b$NhMB z?{W7I5NbuH+il~3Zj`M=EGnhat5U}+Lgg@Mtn{@X3+(SAGxl2{Kh%wvcNM%E18%l7Kx=? z3#%>6@|I3KMI6?2gYt!x#~SA?&U&%J8u#Qc3}uX!WvZ5==x=HspKkvkz)ZR=ulig_#gc4*3M2&e|SluDA4}mI3FWG$1YH>I?ng8 zY@?`MD z$4m%*x7Z^QN&lnyz<->;`L%nYMwfa8An`gD0^}y@3G!2`na7n)tqusloB7^<0OQM1 zJnVMK0|oED{^fBPdJ(gHC3DSz61Zhg?IbMDSq{(i2M z6Ych=p>fyjYNz{EHTyXuM>`kcbn)u|C_61Lrcpz`Ok!GX%3BrX7IRYmQBj3bUQDZv z?udo8LMbl?n`bI|;~nq8=9$9yxNAA_u9^T;FR$^cO@amh(`tuG6@dFSE1qZ9OQjQd z)h4NQ0*ntj{x={Fth`lGs_-o@rd|WU^TfVT$HDmMPWv)bui4r?l8&U|76o6NzC}J% QHvj+t07*qoM6N<$g4WMlh5!Hn delta 2275 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 diff --git a/res/content/base/textures/blocks/grass_side.png b/res/content/base/textures/blocks/grass_side.png index 553bd8b4fe79b91d9123742283df254af9ff6d7c..c6b2a8c4c0f4a8e76cce240d55da4d3cae028740 100644 GIT binary patch delta 3187 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 Date: Thu, 11 Dec 2025 23:54:23 +0300 Subject: [PATCH 02/12] update main shader --- res/shaders/main.glslf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/shaders/main.glslf b/res/shaders/main.glslf index 115cb9274..3a12c406e 100644 --- a/res/shaders/main.glslf +++ b/res/shaders/main.glslf @@ -30,7 +30,7 @@ void main() { texColor.rgb = u_debugNormals ? (a_normal * 0.5 + 0.5) : vec3(1.0); f_color = texColor; - f_color.rgb *= min(vec3(1.0), a_torchLight.rgb + a_skyLight); + f_color.rgb *= max(a_torchLight.rgb, a_skyLight); #ifndef ADVANCED_RENDER vec3 fogColor = texture(u_skybox, a_dir).rgb; From 9286d483650f68d3f6779a90178109ad25ab5b2b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 12 Dec 2025 19:36:12 +0300 Subject: [PATCH 03/12] feat: blocks renderer optimization --- src/graphics/render/BlocksRenderer.cpp | 3 +-- src/voxels/Chunks.cpp | 5 +++-- src/voxels/Chunks.hpp | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index f2788df38..0d508223b 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -692,8 +692,7 @@ void BlocksRenderer::build(const Chunk* chunk, const Chunks* chunks) { voxelsBuffer->setPosition( chunk->x * CHUNK_W - voxelBufferPadding, 0, chunk->z * CHUNK_D - voxelBufferPadding); - chunks->getVoxels(*voxelsBuffer, settings.graphics.backlight.get()); - + chunks->getVoxels(*voxelsBuffer, settings.graphics.backlight.get(), chunk->top + 1); if (voxelsBuffer->pickBlockId( chunk->x * CHUNK_W, 0, chunk->z * CHUNK_D ) == BLOCK_VOID) { diff --git a/src/voxels/Chunks.cpp b/src/voxels/Chunks.cpp index eded34e89..96c709639 100644 --- a/src/voxels/Chunks.cpp +++ b/src/voxels/Chunks.cpp @@ -334,7 +334,8 @@ bool Chunks::putChunk(const std::shared_ptr& chunk) { // reduce nesting on next modification // 25.06.2024: not now // 11.11.2024: not now -void Chunks::getVoxels(VoxelsVolume& volume, bool backlight) const { +// 12.12.2025: not now +void Chunks::getVoxels(VoxelsVolume& volume, bool backlight, int top) const { voxel* voxels = volume.getVoxels(); light_t* lights = volume.getLights(); int x = volume.getX(); @@ -342,7 +343,7 @@ void Chunks::getVoxels(VoxelsVolume& volume, bool backlight) const { int z = volume.getZ(); int w = volume.getW(); - int h = volume.getH(); + int h = std::min(volume.getH(), top); int d = volume.getD(); int scx = floordiv(x); diff --git a/src/voxels/Chunks.hpp b/src/voxels/Chunks.hpp index 214e47c67..2448d8333 100644 --- a/src/voxels/Chunks.hpp +++ b/src/voxels/Chunks.hpp @@ -9,6 +9,7 @@ #include "typedefs.hpp" #include "voxel.hpp" +#include "constants.hpp" #include "util/AreaMap2D.hpp" class VoxelRenderer; @@ -126,7 +127,7 @@ public: bool isReplaceableBlock(int32_t x, int32_t y, int32_t z); bool isObstacleBlock(int32_t x, int32_t y, int32_t z); - void getVoxels(VoxelsVolume& volume, bool backlight = false) const; + void getVoxels(VoxelsVolume& volume, bool backlight = false, int top = CHUNK_H) const; void setCenter(int32_t x, int32_t z); void resize(uint32_t newW, uint32_t newD); From 8710cdfba3594a0557e715b33c3e9bf313643784 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 16 Dec 2025 12:34:15 +0300 Subject: [PATCH 04/12] increase precipitation brightness --- src/graphics/render/PrecipitationRenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/render/PrecipitationRenderer.cpp b/src/graphics/render/PrecipitationRenderer.cpp index 68c955c34..484425273 100644 --- a/src/graphics/render/PrecipitationRenderer.cpp +++ b/src/graphics/render/PrecipitationRenderer.cpp @@ -149,7 +149,7 @@ void PrecipitationRenderer::render( glm::cross(glm::vec3(0, 1, 0), face.right), FACE_SIZE, light_at(chunks, pos.x, y, pos.z), - glm::vec3(2.0f), + glm::vec3(3.0f), calc_uv(pos, face.right, timer, weather) ); } From 13b7377b3f32dae50f67ca4d336ba307cd4cb4ca Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 17 Dec 2025 22:07:48 +0300 Subject: [PATCH 05/12] reduce doppler effect --- src/audio/AL/ALAudio.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/audio/AL/ALAudio.cpp b/src/audio/AL/ALAudio.cpp index 048a8630a..21ff330d6 100644 --- a/src/audio/AL/ALAudio.cpp +++ b/src/audio/AL/ALAudio.cpp @@ -485,6 +485,8 @@ ALAudio::ALAudio(ALCdevice* device, ALCcontext* context) for (auto& name : inputDevices) { logger.info() << " " << name; } + + alDopplerFactor(1.0 / 3.0); } ALAudio::~ALAudio() { @@ -654,6 +656,7 @@ void ALAudio::setListener( ) { ALfloat listenerOri[] = {at.x, at.y, at.z, up.x, up.y, up.z}; + logger.info() << "velcotiy: " << glm::length(velocity); AL_CHECK(alListener3f(AL_POSITION, position.x, position.y, position.z)); AL_CHECK(alListener3f(AL_VELOCITY, velocity.x, velocity.y, velocity.z)); AL_CHECK(alListenerfv(AL_ORIENTATION, listenerOri)); From c0a288705e326261c018c8559e06ffc5c383fe28 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 17 Dec 2025 23:56:04 +0300 Subject: [PATCH 06/12] add ObjectsPool::countTotal --- src/util/ObjectsPool.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/util/ObjectsPool.hpp b/src/util/ObjectsPool.hpp index 075024f8e..25f633ab1 100644 --- a/src/util/ObjectsPool.hpp +++ b/src/util/ObjectsPool.hpp @@ -46,6 +46,10 @@ namespace util { freeObjects.push(ptr); }); } + + size_t countTotal() const { + return objects.size(); + } private: std::vector> objects; std::queue freeObjects; From 0c62951062a92c31ccf4655d141ff840bd7ecf7b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 17 Dec 2025 23:59:11 +0300 Subject: [PATCH 07/12] cleanup --- src/audio/AL/ALAudio.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/audio/AL/ALAudio.cpp b/src/audio/AL/ALAudio.cpp index 21ff330d6..41ce83c08 100644 --- a/src/audio/AL/ALAudio.cpp +++ b/src/audio/AL/ALAudio.cpp @@ -656,7 +656,6 @@ void ALAudio::setListener( ) { ALfloat listenerOri[] = {at.x, at.y, at.z, up.x, up.y, up.z}; - logger.info() << "velcotiy: " << glm::length(velocity); AL_CHECK(alListener3f(AL_POSITION, position.x, position.y, position.z)); AL_CHECK(alListener3f(AL_VELOCITY, velocity.x, velocity.y, velocity.z)); AL_CHECK(alListenerfv(AL_ORIENTATION, listenerOri)); From c46a6ad3bda64aff68be1850f2cb9ce1922d32ff Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Dec 2025 00:30:33 +0300 Subject: [PATCH 08/12] move BlocksRenderer voxels buffer fill to main thread --- src/graphics/render/BlocksRenderer.cpp | 29 ++++------- src/graphics/render/BlocksRenderer.hpp | 20 +++++--- src/graphics/render/ChunksRenderer.cpp | 68 +++++++++++++++++++------- src/graphics/render/ChunksRenderer.hpp | 9 +++- 4 files changed, 81 insertions(+), 45 deletions(-) diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index 3edb40919..623ba3c3d 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -28,10 +28,6 @@ BlocksRenderer::BlocksRenderer( cache(cache), settings(settings) { - voxelsBuffer = std::make_unique( - CHUNK_W + voxelBufferPadding*2, - CHUNK_H, - CHUNK_D + voxelBufferPadding*2); blockDefsCache = content.getIndices()->blocks.getDefs(); } @@ -687,12 +683,9 @@ SortingMeshData BlocksRenderer::renderTranslucent( return sortingMesh; } -void BlocksRenderer::build(const Chunk* chunk, const Chunks* chunks) { +void BlocksRenderer::build(const Chunk* chunk, const VoxelsVolume& volume) { this->chunk = chunk; - voxelsBuffer->setPosition( - chunk->x * CHUNK_W - voxelBufferPadding, 0, - chunk->z * CHUNK_D - voxelBufferPadding); - chunks->getVoxels(*voxelsBuffer, settings.graphics.backlight.get(), chunk->top + 1); + this->voxelsBuffer = &volume; if (voxelsBuffer->pickBlockId( chunk->x * CHUNK_W, 0, chunk->z * CHUNK_D ) == BLOCK_VOID) { @@ -733,7 +726,7 @@ void BlocksRenderer::build(const Chunk* chunk, const Chunks* chunks) { indexCount = 0; denseIndexCount = 0; - denseRender = false; //settings.graphics.denseRender.get(); + denseRender = false; densePass = false; render(voxels, beginEnds); @@ -762,15 +755,18 @@ ChunkMeshData BlocksRenderer::createMesh() { util::Buffer(denseIndexBuffer.get(), denseIndexCount), }, util::Buffer( - ChunkVertex::ATTRIBUTES, sizeof(ChunkVertex::ATTRIBUTES) / sizeof(VertexAttribute) + ChunkVertex::ATTRIBUTES, + sizeof(ChunkVertex::ATTRIBUTES) / sizeof(VertexAttribute) ) ), std::move(sortingMesh) }; } -ChunkMesh BlocksRenderer::render(const Chunk *chunk, const Chunks *chunks) { - build(chunk, chunks); +ChunkMesh BlocksRenderer::render( + const Chunk* chunk, const VoxelsVolume& volume +) { + build(chunk, volume); return ChunkMesh{std::make_unique>( vertexBuffer.get(), vertexCount, @@ -781,11 +777,6 @@ ChunkMesh BlocksRenderer::render(const Chunk *chunk, const Chunks *chunks) { ), std::move(sortingMesh)}; } -VoxelsVolume* BlocksRenderer::getVoxelsBuffer() const { - return voxelsBuffer.get(); -} - size_t BlocksRenderer::getMemoryConsumption() const { - size_t volume = voxelsBuffer->getW() * voxelsBuffer->getH() * voxelsBuffer->getD(); - return capacity * (sizeof(ChunkVertex) + sizeof(uint32_t) * 2) + volume * (sizeof(voxel) + sizeof(light_t)); + return capacity * (sizeof(ChunkVertex) + sizeof(uint32_t) * 2); } diff --git a/src/graphics/render/BlocksRenderer.hpp b/src/graphics/render/BlocksRenderer.hpp index a954fad6e..2006baab3 100644 --- a/src/graphics/render/BlocksRenderer.hpp +++ b/src/graphics/render/BlocksRenderer.hpp @@ -32,13 +32,12 @@ class BlocksRenderer { size_t indexCount; size_t denseIndexCount; size_t capacity; - int voxelBufferPadding = 2; bool overflow = false; bool cancelled = false; bool densePass = false; bool denseRender = false; const Chunk* chunk = nullptr; - std::unique_ptr voxelsBuffer; + const VoxelsVolume* voxelsBuffer = nullptr; const Block* const* blockDefsCache; const ContentGfxCache& cache; @@ -152,9 +151,13 @@ class BlocksRenderer { glm::vec4 pickLight(int x, int y, int z) const; glm::vec4 pickLight(const glm::ivec3& coord) const; - glm::vec4 pickSoftLight(const glm::ivec3& coord, const glm::ivec3& right, const glm::ivec3& up) const; - glm::vec4 pickSoftLight(float x, float y, float z, const glm::ivec3& right, const glm::ivec3& up) const; - + glm::vec4 pickSoftLight( + const glm::ivec3& coord, const glm::ivec3& right, const glm::ivec3& up + ) const; + glm::vec4 pickSoftLight( + float x, float y, float z, const glm::ivec3& right, const glm::ivec3& up + ) const; + void render(const voxel* voxels, const int beginEnds[256][2]); SortingMeshData renderTranslucent(const voxel* voxels, int beginEnds[256][2]); public: @@ -166,10 +169,11 @@ public: ); virtual ~BlocksRenderer(); - void build(const Chunk* chunk, const Chunks* chunks); - ChunkMesh render(const Chunk* chunk, const Chunks* chunks); + void build(const Chunk* chunk, const VoxelsVolume& volume); + ChunkMesh render( + const Chunk* chunk, const VoxelsVolume& volume + ); ChunkMeshData createMesh(); - VoxelsVolume* getVoxelsBuffer() const; size_t getMemoryConsumption() const; diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index b0dfaec3e..8289967c1 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -12,24 +12,22 @@ #include "window/Camera.hpp" #include "maths/FrustumCulling.hpp" #include "util/listutil.hpp" +#include "util/ObjectsPool.hpp" #include "settings.hpp" static debug::Logger logger("chunks-render"); size_t ChunksRenderer::visibleChunks = 0; -class RendererWorker : public util::Worker, RendererResult> { - const Chunks& chunks; +class RendererWorker : public util::Worker { BlocksRenderer renderer; public: RendererWorker( const Level& level, - const Chunks& chunks, const ContentGfxCache& cache, const EngineSettings& settings ) - : chunks(chunks), - renderer( + : renderer( settings.graphics.denseRender.get() ? settings.graphics.chunkMaxVerticesDense.get() : settings.graphics.chunkMaxVertices.get(), @@ -39,8 +37,10 @@ public: ) { } - RendererResult operator()(const std::shared_ptr& chunk) override { - renderer.build(chunk.get(), &chunks); + RendererResult operator()(const RendererJob& job) override { + auto chunk = job.chunk; + auto volume = job.volume; + renderer.build(chunk.get(), *volume); if (renderer.isCancelled()) { return RendererResult { glm::ivec2(chunk->x, chunk->z), true, ChunkMeshData {}}; @@ -51,6 +51,9 @@ public: } }; +static util::ObjectsPool voxelsVolumesPool {}; +static inline const int VOXELS_BUFFER_PADDING = 2; + ChunksRenderer::ChunksRenderer( const Level* level, const Chunks& chunks, @@ -67,7 +70,7 @@ ChunksRenderer::ChunksRenderer( "chunks-render-pool", [&]() { return std::make_shared( - *level, chunks, cache, settings + *level, cache, settings ); }, [&](RendererResult& result) { @@ -87,30 +90,61 @@ ChunksRenderer::ChunksRenderer( level->content, cache, settings ); logger.info() << "created " << threadPool.getWorkersCount() << " workers"; - logger.info() << "memory consumption is " - << renderer->getMemoryConsumption() * threadPool.getWorkersCount() - << " B"; + logger.info() << "memory consumption is " + << renderer->getMemoryConsumption() * + threadPool.getWorkersCount() + + voxelsVolumesPool.countTotal() * + (sizeof(VoxelsVolume) + + (CHUNK_W + VOXELS_BUFFER_PADDING * 2) * CHUNK_H * + (CHUNK_D + VOXELS_BUFFER_PADDING * 2) * + (sizeof(voxel) + sizeof(light_t))) + << " B"; } ChunksRenderer::~ChunksRenderer() = default; +std::shared_ptr ChunksRenderer::prepareVoxelsVolume( + const Chunk& chunk +) { + auto voxelsBuffer = voxelsVolumesPool.create( + CHUNK_W + VOXELS_BUFFER_PADDING * 2, + CHUNK_H, + CHUNK_D + VOXELS_BUFFER_PADDING * 2 + ); + voxelsBuffer->setPosition( + chunk.x * CHUNK_W - VOXELS_BUFFER_PADDING, 0, + chunk.z * CHUNK_D - VOXELS_BUFFER_PADDING + ); + chunks.getVoxels( + *voxelsBuffer, settings.graphics.backlight.get(), chunk.top + 1 + ); + return voxelsBuffer; +} + const Mesh* ChunksRenderer::render( const std::shared_ptr& chunk, bool important ) { + glm::ivec2 key(chunk->x, chunk->z); chunk->flags.modified = false; if (important) { - auto mesh = renderer->render(chunk.get(), &chunks); - meshes[glm::ivec2(chunk->x, chunk->z)] = ChunkMesh { - std::move(mesh.mesh), std::move(mesh.sortingMeshData) - }; + auto voxelsBuffer = prepareVoxelsVolume(*chunk); + inwork[key] = true; + + auto mesh = renderer->render(chunk.get(), *voxelsBuffer); + meshes[glm::ivec2(chunk->x, chunk->z)] = + ChunkMesh {std::move(mesh.mesh), std::move(mesh.sortingMeshData)}; return meshes[glm::ivec2(chunk->x, chunk->z)].mesh.get(); } - glm::ivec2 key(chunk->x, chunk->z); if (inwork.find(key) != inwork.end()) { return nullptr; } + auto voxelsBuffer = prepareVoxelsVolume(*chunk); inwork[key] = true; - threadPool.enqueueJob(chunk); + chunks.getVoxels( + *voxelsBuffer, settings.graphics.backlight.get(), chunk->top + 1 + ); + + threadPool.enqueueJob({chunk, std::move(voxelsBuffer)}); return nullptr; } diff --git a/src/graphics/render/ChunksRenderer.hpp b/src/graphics/render/ChunksRenderer.hpp index 9215a8638..9794a8405 100644 --- a/src/graphics/render/ChunksRenderer.hpp +++ b/src/graphics/render/ChunksRenderer.hpp @@ -21,6 +21,7 @@ class Chunks; class Frustum; class BlocksRenderer; class ContentGfxCache; +class VoxelsVolume; struct EngineSettings; struct ChunksSortEntry { @@ -38,6 +39,11 @@ struct RendererResult { ChunkMeshData meshData; }; +struct RendererJob { + std::shared_ptr chunk; + std::shared_ptr volume; +}; + class ChunksRenderer { const Chunks& chunks; const Assets& assets; @@ -48,10 +54,11 @@ class ChunksRenderer { std::unordered_map meshes; std::unordered_map inwork; std::vector indices; - util::ThreadPool, RendererResult> threadPool; + util::ThreadPool threadPool; const Mesh* retrieveChunk( size_t index, const Camera& camera, bool culling ); + std::shared_ptr prepareVoxelsVolume(const Chunk& chunk); public: ChunksRenderer( const Level* level, From 64e2040734cb90dcd95aa34e092a5c7acaa0a127 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Dec 2025 20:07:39 +0300 Subject: [PATCH 09/12] fix false-positive intellisense errors --- src/graphics/render/Emitter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graphics/render/Emitter.cpp b/src/graphics/render/Emitter.cpp index cc7450f9f..aa817b354 100644 --- a/src/graphics/render/Emitter.cpp +++ b/src/graphics/render/Emitter.cpp @@ -126,7 +126,7 @@ void Emitter::update( } void Emitter::stop() { - count = 0; + this->count = 0; } bool Emitter::isDead() const { @@ -138,7 +138,7 @@ bool Emitter::isReferred() const { } const EmitterOrigin& Emitter::getOrigin() const { - return origin; + return this->origin; } void Emitter::setOrigin(const EmitterOrigin& origin) { From 1de669092c899e980260721e4d3a54d82ea4b630 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Dec 2025 20:30:22 +0300 Subject: [PATCH 10/12] improve soft lights calculation for blocks with custom model --- src/graphics/render/BlocksRenderer.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index efc969b6d..732e479c7 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -345,7 +345,14 @@ void BlocksRenderer::blockCustomModel( auto p1 = p + n * eps; auto p2 = p + n * 0.5f; aoColor = pickSoftLight(p1.x, p1.y, p1.z, glm::ivec3(r), glm::ivec3(t)); - aoColor = glm::max(aoColor, pickSoftLight(p2.x, p2.y, p2.z, glm::ivec3(r), glm::ivec3(t))); + if (!block.lightPassing) { + aoColor = glm::max( + aoColor, + pickSoftLight( + p2.x, p2.y, p2.z, glm::ivec3(r), glm::ivec3(t) + ) + ); + } } this->vertex( coord + vcoord.x * X + vcoord.y * Y + vcoord.z * Z, From 78062e2197be750d3a6fa87d44e8079286323cdd Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Dec 2025 20:32:26 +0300 Subject: [PATCH 11/12] fix: 'shadeless' block property ignored if custom model is used --- src/graphics/render/BlocksRenderer.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index 732e479c7..d153cb040 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -309,6 +309,7 @@ void BlocksRenderer::blockCustomModel( overflow = true; return; } + bool shading = mesh.shading && !block.shadeless; for (int triangle = 0; triangle < mesh.vertices.size() / 3; triangle++) { auto r = mesh.vertices[triangle * 3 + (triangle % 2) * 2].coord - mesh.vertices[triangle * 3 + 1].coord; @@ -338,7 +339,7 @@ void BlocksRenderer::blockCustomModel( const auto& vcoord = vertex.coord - 0.5f; glm::vec4 aoColor {1.0f, 1.0f, 1.0f, 1.0f}; - if (mesh.shading && ao) { + if (shading && ao) { const float eps = 0.05f; auto p = coord + vcoord.x * X + vcoord.y * Y + vcoord.z * Z + r * 0.5f + t * 0.5f + n * eps; @@ -358,9 +359,9 @@ void BlocksRenderer::blockCustomModel( coord + vcoord.x * X + vcoord.y * Y + vcoord.z * Z, vertex.uv.x, vertex.uv.y, - mesh.shading ? (glm::vec4(d, d, d, d) * aoColor) : glm::vec4(1, 1, 1, d), + shading ? (glm::vec4(d, d, d, d) * aoColor) : glm::vec4(1, 1, 1, d), n, - mesh.shading ? 0.0f : 1.0 + shading ? 0.0f : 1.0 ); indexBuffer[indexCount++] = vertexOffset++; } From 48105d086bddf284eef6bb46b81a60d13f7647e1 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Dec 2025 20:44:04 +0300 Subject: [PATCH 12/12] disable custom model extended blocks culling until splitting it --- src/graphics/render/BlocksRenderer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index d153cb040..8466008da 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -326,7 +326,9 @@ void BlocksRenderer::blockCustomModel( 0.5f; vp = vp.x * X + vp.y * Y + vp.z * Z; - if (!isOpen(glm::floor(coord + vp + 0.5f + n * 1e-3f), block, variant) && is_aligned(n)) { + if (!block.rt.extended + && !isOpen(glm::floor(coord + vp + 0.5f + n * 1e-3f), block, variant) + && is_aligned(n)) { continue; }