refactor a bit

This commit is contained in:
MihailRis 2025-07-14 00:02:29 +03:00
parent 5fdff1f8f6
commit 29021d1178
6 changed files with 14 additions and 6 deletions

View File

@ -272,11 +272,12 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, const Content* content) {
}
}
for (const auto& [_, def] : content->blocks.getDefs()) {
add_variant(loader, def->defaults);
if (def->variants) {
for (const auto& variant : def->variants->variants) {
add_variant(loader, variant);
}
} else {
add_variant(loader, def->defaults);
}
}
for (const auto& [_, def] : content->items.getDefs()) {

View File

@ -29,13 +29,15 @@ std::unique_ptr<Content> ContentBuilder::build() {
def.rt.id = blockDefsIndices.size();
def.rt.emissive = *reinterpret_cast<uint32_t*>(def.emission);
// 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;
}
def.defaults = def.variants->variants.at(0);
} else {
def.defaults.rt.solid = def.defaults.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;

View File

@ -122,6 +122,7 @@ template<> void ContentUnitLoader<Block>::loadUnit(
if (stateBased.has("variants")) {
const auto& variants = stateBased["variants"];
def.variants = std::make_unique<Variants>();
def.variants->variants.push_back(def.defaults);
for (int i = 0; i < variants.size(); i++) {
Variant variant = def.defaults;
load_variant(variant, variants[i], name);
@ -198,7 +199,8 @@ template<> void ContentUnitLoader<Block>::loadUnit(
"block " + util::quote(def.name) + ": invalid block size"
);
}
// FIXME
// should variant modify hitbox?
if (def.defaults.model.type == BlockModelType::BLOCK &&
(def.size.x != 1 || def.size.y != 1 || def.size.z != 1)) {
def.defaults.model.type = BlockModelType::AABB;

View File

@ -66,9 +66,10 @@ 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() - 1; i++) {
for (int i = 1; i < variants.size() - 1; i++) {
refresh_variant(assets, def, variants[i], i + 1, sideregions, atlas, settings, models);
}
def.variants->variants.at(0) = def.defaults;
}
}

View File

@ -128,6 +128,7 @@ void Block::cloneTo(Block& dst) {
for (int i = 0; i < 6; i++) {
dst.defaults = defaults;
}
dst.defaults = defaults;
if (variants) {
dst.variants = std::make_unique<Variants>(*variants);
}

View File

@ -161,6 +161,7 @@ struct Variant {
};
struct Variants {
/// First variant is copy of Block::defaults
util::stack_vector<Variant, BLOCK_MAX_VARIANTS> variants {};
};
@ -294,7 +295,7 @@ public:
constexpr const Variant& getVariant(uint8_t bits) const {
if (bits == 0 || variants == nullptr)
return defaults;
return variants->variants[(bits - 1) % BLOCK_MAX_VARIANTS];
return variants->variants[bits % BLOCK_MAX_VARIANTS];
}
constexpr const BlockModel& getModel(uint8_t bits) const {