add 'offset', 'bits' properties & fix is_solid_at
This commit is contained in:
parent
29021d1178
commit
7e0b58d96b
@ -39,7 +39,9 @@ std::unique_ptr<Content> ContentBuilder::build() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const float EPSILON = 0.01f;
|
const float EPSILON = 0.01f;
|
||||||
def.rt.solid = glm::i8vec3(def.hitboxes[0].size() + EPSILON) == def.size;
|
def.rt.solid =
|
||||||
|
def.obstacle &&
|
||||||
|
(glm::i8vec3(def.hitboxes[0].size() + EPSILON) == def.size);
|
||||||
def.rt.extended = def.size.x > 1 || def.size.y > 1 || def.size.z > 1;
|
def.rt.extended = def.size.x > 1 || def.size.y > 1 || def.size.z > 1;
|
||||||
|
|
||||||
if (def.rotatable) {
|
if (def.rotatable) {
|
||||||
|
|||||||
@ -121,7 +121,18 @@ template<> void ContentUnitLoader<Block>::loadUnit(
|
|||||||
const auto& stateBased = root["state-based"];
|
const auto& stateBased = root["state-based"];
|
||||||
if (stateBased.has("variants")) {
|
if (stateBased.has("variants")) {
|
||||||
const auto& variants = stateBased["variants"];
|
const auto& variants = stateBased["variants"];
|
||||||
|
|
||||||
|
int offset = 0;
|
||||||
|
int bitsCount = 4;
|
||||||
|
stateBased.at("offset").get(offset);
|
||||||
|
stateBased.at("bits").get(bitsCount);
|
||||||
|
if (offset < 0 || bitsCount <= 0 || offset + bitsCount > 8) {
|
||||||
|
throw std::runtime_error("Invalid state-based bits configuration");
|
||||||
|
}
|
||||||
|
|
||||||
def.variants = std::make_unique<Variants>();
|
def.variants = std::make_unique<Variants>();
|
||||||
|
def.variants->offset = 0;
|
||||||
|
def.variants->mask = 0xF;
|
||||||
def.variants->variants.push_back(def.defaults);
|
def.variants->variants.push_back(def.defaults);
|
||||||
for (int i = 0; i < variants.size(); i++) {
|
for (int i = 0; i < variants.size(); i++) {
|
||||||
Variant variant = def.defaults;
|
Variant variant = def.defaults;
|
||||||
|
|||||||
@ -161,6 +161,8 @@ struct Variant {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Variants {
|
struct Variants {
|
||||||
|
uint8_t offset;
|
||||||
|
uint8_t mask;
|
||||||
/// First variant is copy of Block::defaults
|
/// First variant is copy of Block::defaults
|
||||||
util::stack_vector<Variant, BLOCK_MAX_VARIANTS> variants {};
|
util::stack_vector<Variant, BLOCK_MAX_VARIANTS> variants {};
|
||||||
};
|
};
|
||||||
@ -292,10 +294,12 @@ public:
|
|||||||
|
|
||||||
void cloneTo(Block& dst);
|
void cloneTo(Block& dst);
|
||||||
|
|
||||||
constexpr const Variant& getVariant(uint8_t bits) const {
|
constexpr const Variant& getVariant(uint8_t userbits) const {
|
||||||
if (bits == 0 || variants == nullptr)
|
if (userbits == 0 || variants == nullptr)
|
||||||
return defaults;
|
return defaults;
|
||||||
return variants->variants[bits % BLOCK_MAX_VARIANTS];
|
return variants->variants[
|
||||||
|
(userbits >> variants->offset) & variants->mask
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr const BlockModel& getModel(uint8_t bits) const {
|
constexpr const BlockModel& getModel(uint8_t bits) const {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user