From 6dfabe9ff305a5edde3364f7c2191d4176da5251 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 17 Jul 2025 00:10:45 +0300 Subject: [PATCH] fix variant indexing --- src/graphics/render/BlocksRenderer.cpp | 12 ++++++------ src/graphics/render/BlocksRenderer.hpp | 2 +- src/voxels/Block.hpp | 16 ++++++++++++++-- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index ed22b427..ae9e5d99 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -294,7 +294,7 @@ static bool is_aligned(const glm::vec3& v, float e = 1e-6f) { void BlocksRenderer::blockCustomModel( const glm::ivec3& icoord, const Block& block, blockstate states, bool lights, bool ao ) { - const auto& variant = block.getVariant(states.userbits); + const auto& variant = block.getVariantByBits(states.userbits); glm::vec3 X(1, 0, 0); glm::vec3 Y(0, 1, 0); glm::vec3 Z(0, 0, 1); @@ -370,7 +370,7 @@ void BlocksRenderer::blockCube( bool lights, bool ao ) { - const auto& variant = block.getVariant(states.userbits); + const auto& variant = block.getVariantByBits(states.userbits); glm::ivec3 X(1, 0, 0); glm::ivec3 Y(0, 1, 0); glm::ivec3 Z(0, 0, 1); @@ -488,8 +488,8 @@ void BlocksRenderer::render( blockid_t id = vox.id; blockstate state = vox.state; const auto& def = *blockDefsCache[id]; - const auto& variant = def.getVariant(state.userbits); - uint8_t variantId = state.userbits; + uint8_t variantId = def.getVariantIndex(state.userbits); + const auto& variant = def.getVariant(variantId); if (id == 0 || variant.drawGroup != drawGroup || state.segment) { continue; } @@ -561,7 +561,7 @@ SortingMeshData BlocksRenderer::renderTranslucent( blockid_t id = vox.id; blockstate state = vox.state; const auto& def = *blockDefsCache[id]; - uint8_t variantId = state.userbits; + uint8_t variantId = def.getVariantIndex(state.userbits); const auto& variant = def.getVariant(variantId); if (id == 0 || variant.drawGroup != drawGroup || state.segment) { continue; @@ -687,7 +687,7 @@ void BlocksRenderer::build(const Chunk* chunk, const Chunks* chunks) { const voxel& vox = voxels[i]; blockid_t id = vox.id; const auto& def = *blockDefsCache[id]; - const auto& variant = def.getVariant(vox.state.userbits); + const auto& variant = def.getVariantByBits(vox.state.userbits); if (beginEnds[variant.drawGroup][0] == 0) { beginEnds[variant.drawGroup][0] = i+1; diff --git a/src/graphics/render/BlocksRenderer.hpp b/src/graphics/render/BlocksRenderer.hpp index 54f7f44e..7d950ac4 100644 --- a/src/graphics/render/BlocksRenderer.hpp +++ b/src/graphics/render/BlocksRenderer.hpp @@ -130,7 +130,7 @@ class BlocksRenderer { return false; } const auto& block = *blockDefsCache[vox.id]; - const auto& blockVariant = block.getVariant(vox.state.userbits); + const auto& blockVariant = block.getVariantByBits(vox.state.userbits); uint8_t otherDrawGroup = blockVariant.drawGroup; if ((otherDrawGroup && (otherDrawGroup != variant.drawGroup)) || !blockVariant.rt.solid) { return true; diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index 2ffe99e2..e1c25979 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -294,7 +294,13 @@ public: void cloneTo(Block& dst); - constexpr const Variant& getVariant(uint8_t userbits) const { + constexpr uint8_t getVariantIndex(uint8_t userbits) const { + if (variants == nullptr) + return 0; + return (userbits >> variants->offset) & variants->mask; + } + + constexpr const Variant& getVariantByBits(uint8_t userbits) const { if (userbits == 0 || variants == nullptr) return defaults; return variants->variants[ @@ -302,8 +308,14 @@ public: ]; } + constexpr const Variant& getVariant(uint8_t index) const { + if (index == 0) + return defaults; + return variants->variants[index]; + } + constexpr const BlockModel& getModel(uint8_t bits) const { - return getVariant(bits).model; + return getVariantByBits(bits).model; } static bool isReservedBlockField(std::string_view view);