diff --git a/src/content/loading/BlockLoader.cpp b/src/content/loading/BlockLoader.cpp index 1936f94e..4d13c4c0 100644 --- a/src/content/loading/BlockLoader.cpp +++ b/src/content/loading/BlockLoader.cpp @@ -117,6 +117,22 @@ template<> void ContentUnitLoader::loadUnit( load_variant(def.defaults, root, name); + if (root.has("state-based")) { + const auto& stateBased = root["state-based"]; + if (stateBased.has("variants")) { + const auto& variants = stateBased["variants"]; + def.variants = std::make_unique(); + for (int i = 0; i < variants.size(); i++) { + Variant variant = def.defaults; + load_variant(variant, variants[i], name); + def.variants->variants.push_back(variant); + } + while (def.variants->variants.size() < BLOCK_MAX_VARIANTS) { + def.variants->variants.push_back(def.defaults); + } + } + } + root.at("material").get(def.material); // rotation profile diff --git a/src/frontend/ContentGfxCache.cpp b/src/frontend/ContentGfxCache.cpp index 3b898ac2..85d484ba 100644 --- a/src/frontend/ContentGfxCache.cpp +++ b/src/frontend/ContentGfxCache.cpp @@ -66,7 +66,7 @@ void ContentGfxCache::refresh(const Block& def, const Atlas& atlas) { refresh_variant(assets, def, def.defaults, 0, sideregions, atlas, settings, models); if (def.variants) { const auto& variants = def.variants->variants; - for (int i = 0; i < variants.size(); i++) { + for (int i = 0; i < variants.size() - 1; i++) { refresh_variant(assets, def, variants[i], i + 1, sideregions, atlas, settings, models); } } @@ -79,8 +79,7 @@ void ContentGfxCache::refresh() { const auto& blocks = indices->blocks.getIterable(); for (blockid_t i = 0; i < blocks.size(); i++) { - auto def = blocks[i]; - refresh(*def, atlas); + refresh(*blocks[i], atlas); } } diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index e18abf2f..c620ed3a 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -156,7 +156,7 @@ struct Variant { }; struct Variants { - util::stack_vector variants; + util::stack_vector variants {}; }; /// @brief Block properties definition @@ -289,7 +289,7 @@ public: constexpr const Variant& getVariant(uint8_t bits) const { if (bits == 0 || variants == nullptr) return defaults; - return variants->variants[(bits - 1) % variants->variants.size()]; + return variants->variants[(bits - 1) % BLOCK_MAX_VARIANTS]; } constexpr const BlockModel& getModel(uint8_t bits) const {