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..875d6bf4 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 { + uint8_t getVariantIndex(uint8_t userbits) const { + if (variants == nullptr) + return 0; + return (userbits >> variants->offset) & variants->mask; + } + + const Variant& getVariantByBits(uint8_t userbits) const { if (userbits == 0 || variants == nullptr) return defaults; return variants->variants[ @@ -302,8 +308,14 @@ public: ]; } - constexpr const BlockModel& getModel(uint8_t bits) const { - return getVariant(bits).model; + const Variant& getVariant(uint8_t index) const { + if (index == 0) + return defaults; + return variants->variants[index]; + } + + const BlockModel& getModel(uint8_t bits) const { + return getVariantByBits(bits).model; } static bool isReservedBlockField(std::string_view view);