From 6d6d38c2180ae79d69498acdd3a525399579995a Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 20 Dec 2025 22:33:47 +0300 Subject: [PATCH] fix block model change wrapper reaction --- src/graphics/render/BlockWrapsRenderer.cpp | 19 ++++++++++++++----- src/graphics/render/BlockWrapsRenderer.hpp | 4 +++- .../scripting/lua/libs/libblockwraps.cpp | 3 ++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/graphics/render/BlockWrapsRenderer.cpp b/src/graphics/render/BlockWrapsRenderer.cpp index 497e2d2c7..c169bebfb 100644 --- a/src/graphics/render/BlockWrapsRenderer.cpp +++ b/src/graphics/render/BlockWrapsRenderer.cpp @@ -25,7 +25,7 @@ BlockWrapsRenderer::BlockWrapsRenderer( BlockWrapsRenderer::~BlockWrapsRenderer() = default; -void BlockWrapsRenderer::draw(const BlockWrapper& wrapper, const Texture* texture) { +void BlockWrapsRenderer::draw(BlockWrapper& wrapper, const Texture* texture) { if (wrapper.cullingBits == 0x0) { return; } @@ -41,8 +41,15 @@ void BlockWrapsRenderer::draw(const BlockWrapper& wrapper, const Texture* textur return; } - const auto& def = level.content.getIndices()->blocks.require(wrapper.vox->id); - switch (def.getModel(wrapper.vox->state.userbits).type) { + // one frame can be invalid due to texture change but ok + const auto& def = + level.content.getIndices()->blocks.require(wrapper.vox->id); + + if (wrapper.modelType != def.getModel(wrapper.vox->state.userbits).type) { + wrapper.dirtySides = 0xFF; + refreshWrapper(wrapper); + } + switch (wrapper.modelType) { case BlockModelType::BLOCK: batch->cube( glm::vec3(wrapper.position) + glm::vec3(0.5f), @@ -78,7 +85,8 @@ void BlockWrapsRenderer::refreshWrapper(BlockWrapper& wrapper) { if ((wrapper.cullingBits & (1 << i)) == 0) { continue; } - auto texRegion = util::get_texture_region(assets, wrapper.textureFaces[i], ""); + auto texRegion = + util::get_texture_region(assets, wrapper.textureFaces[i], ""); wrapper.texRegions[i] = texRegion; wrapper.uvRegions[i] = texRegion.region; @@ -91,7 +99,8 @@ void BlockWrapsRenderer::refreshWrapper(BlockWrapper& wrapper) { return; } const auto& def = level.content.getIndices()->blocks.require(vox->id); - switch (def.getModel(vox->state.userbits).type) { + wrapper.modelType = def.getModel(vox->state.userbits).type; + switch (wrapper.modelType) { case BlockModelType::AABB: { const auto& aabb = (def.rotatable ? def.rt.hitboxes[vox->state.rotation] diff --git a/src/graphics/render/BlockWrapsRenderer.hpp b/src/graphics/render/BlockWrapsRenderer.hpp index faf593a7f..ebb4d0e8a 100644 --- a/src/graphics/render/BlockWrapsRenderer.hpp +++ b/src/graphics/render/BlockWrapsRenderer.hpp @@ -7,6 +7,7 @@ #include #include "assets/assets_util.hpp" +#include "voxels/Block.hpp" #include "MainBatch.hpp" #include "typedefs.hpp" @@ -24,6 +25,7 @@ struct BlockWrapper { util::TextureRegion texRegions[6] {}; UVRegion uvRegions[6] {}; const voxel* vox = nullptr; + BlockModelType modelType {}; uint8_t cullingBits = 0xFF; uint8_t dirtySides = 0xFF; }; @@ -38,7 +40,7 @@ class BlockWrapsRenderer { std::unordered_map> wrappers; u64id_t nextWrapper = 1; - void draw(const BlockWrapper& wrapper, const Texture* texture); + void draw(BlockWrapper& wrapper, const Texture* texture); void refreshWrapper(BlockWrapper& wrapper); public: diff --git a/src/logic/scripting/lua/libs/libblockwraps.cpp b/src/logic/scripting/lua/libs/libblockwraps.cpp index dc956eda8..30aaa60c6 100644 --- a/src/logic/scripting/lua/libs/libblockwraps.cpp +++ b/src/logic/scripting/lua/libs/libblockwraps.cpp @@ -47,7 +47,8 @@ static int l_set_faces(lua::State* L) { } } else { auto texture = lua::require_string(L, 2 + i);; - if ((wrapper->cullingBits & (1 << i)) == 0x0 || wrapper->textureFaces[i] != texture) { + if ((wrapper->cullingBits & (1 << i)) == 0x0 + || wrapper->textureFaces[i] != texture) { wrapper->cullingBits |= (1 << i); wrapper->textureFaces[i] = texture; }