From 5fdff1f8f663ac77bae3f41ed0b35f89466340a4 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 13 Jul 2025 22:56:06 +0300 Subject: [PATCH] fix block solidity property --- src/content/ContentBuilder.cpp | 14 +++++++++----- src/graphics/render/BlocksRenderer.hpp | 5 +++-- src/voxels/Block.hpp | 7 ++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/content/ContentBuilder.cpp b/src/content/ContentBuilder.cpp index e7b8df3b..6f4b02a2 100644 --- a/src/content/ContentBuilder.cpp +++ b/src/content/ContentBuilder.cpp @@ -28,13 +28,17 @@ std::unique_ptr ContentBuilder::build() { // Generating runtime info def.rt.id = blockDefsIndices.size(); def.rt.emissive = *reinterpret_cast(def.emission); - def.rt.solid = def.defaults.model.type == BlockModelType::BLOCK; // FIXME - def.rt.extended = def.size.x > 1 || def.size.y > 1 || def.size.z > 1; - const float EPSILON = 0.01f; - if (def.rt.extended && glm::i8vec3(def.hitboxes[0].size() + EPSILON) == def.size) { - def.rt.solid = true; + // TODO: refactor + def.defaults.rt.solid = def.defaults.model.type == BlockModelType::BLOCK; + if (def.variants) { + for (auto& variant : def.variants->variants) { + variant.rt.solid = variant.model.type == BlockModelType::BLOCK; + } } + const float EPSILON = 0.01f; + def.rt.solid = glm::i8vec3(def.hitboxes[0].size() + EPSILON) == def.size; + def.rt.extended = def.size.x > 1 || def.size.y > 1 || def.size.z > 1; if (def.rotatable) { for (uint i = 0; i < BlockRotProfile::MAX_COUNT; i++) { diff --git a/src/graphics/render/BlocksRenderer.hpp b/src/graphics/render/BlocksRenderer.hpp index 2de4afd0..54f7f44e 100644 --- a/src/graphics/render/BlocksRenderer.hpp +++ b/src/graphics/render/BlocksRenderer.hpp @@ -130,8 +130,9 @@ class BlocksRenderer { return false; } const auto& block = *blockDefsCache[vox.id]; - uint8_t otherDrawGroup = block.getVariant(vox.state.userbits).drawGroup; - if ((otherDrawGroup && (otherDrawGroup != variant.drawGroup)) || !block.rt.solid) { + const auto& blockVariant = block.getVariant(vox.state.userbits); + uint8_t otherDrawGroup = blockVariant.drawGroup; + if ((otherDrawGroup && (otherDrawGroup != variant.drawGroup)) || !blockVariant.rt.solid) { return true; } if ((variant.culling == CullingMode::DISABLED || diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index c620ed3a..37dc2156 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -153,6 +153,11 @@ struct Variant { CullingMode culling = CullingMode::DEFAULT; /// @brief Influences visible block sides for transparent blocks uint8_t drawGroup = 0; + + struct { + /// @brief is the block completely opaque for render + bool solid = true; + } rt; }; struct Variants { @@ -258,7 +263,7 @@ public: /// @brief block runtime integer id blockid_t id; - /// @brief is the block completely opaque for render and raycast + /// @brief is the block completely opaque for raycast bool solid = true; /// @brief does the block emit any lights