diff options
author | SmallJoker <SmallJoker@users.noreply.github.com> | 2022-08-13 08:52:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-13 08:52:16 +0200 |
commit | 023a1c2427fa34d5a87e7234c0c322d56765082b (patch) | |
tree | 2a24ab5e2838452959d225b1015292350b1a0d57 /src/texture_override.cpp | |
parent | 8bf1609cccba24e2516ecb98dbf694b91fe697bf (diff) | |
download | minetest-023a1c2427fa34d5a87e7234c0c322d56765082b.tar.xz |
Textures: introduce world-align overrides (#12540)
Many games do not care about world align textures, however texture packs should have the capabilities to change that if they have suitable textures. This commmit now introduces a node property override for world-align in particular to force a certain scale on the selected override tiles.
Diffstat (limited to 'src/texture_override.cpp')
-rw-r--r-- | src/texture_override.cpp | 85 |
1 files changed, 46 insertions, 39 deletions
diff --git a/src/texture_override.cpp b/src/texture_override.cpp index effdb0efd..81c986ccf 100644 --- a/src/texture_override.cpp +++ b/src/texture_override.cpp @@ -26,6 +26,26 @@ with this program; if not, write to the Free Software Foundation, Inc., #define override_cast static_cast<override_t> +static const std::map<std::string, OverrideTarget> override_LUT = { + { "top", OverrideTarget::TOP }, + { "bottom", OverrideTarget::BOTTOM }, + { "left", OverrideTarget::LEFT }, + { "right", OverrideTarget::RIGHT }, + { "front", OverrideTarget::FRONT }, + { "back", OverrideTarget::BACK }, + { "inventory", OverrideTarget::INVENTORY }, + { "wield", OverrideTarget::WIELD }, + { "special1", OverrideTarget::SPECIAL_1 }, + { "special2", OverrideTarget::SPECIAL_2 }, + { "special3", OverrideTarget::SPECIAL_3 }, + { "special4", OverrideTarget::SPECIAL_4 }, + { "special5", OverrideTarget::SPECIAL_5 }, + { "special6", OverrideTarget::SPECIAL_6 }, + { "sides", OverrideTarget::SIDES }, + { "all", OverrideTarget::ALL_FACES }, + { "*", OverrideTarget::ALL_FACES } +}; + TextureOverrideSource::TextureOverrideSource(std::string filepath) { std::ifstream infile(filepath.c_str()); @@ -41,8 +61,9 @@ TextureOverrideSource::TextureOverrideSource(std::string filepath) if (line.empty() || line[0] == '#') continue; + // Format: mod_name:item_name target1[,...] texture_name.png std::vector<std::string> splitted = str_split(line, ' '); - if (splitted.size() != 3) { + if (splitted.size() < 3) { warningstream << filepath << ":" << line_index << " Syntax error in texture override \"" << line << "\": Expected 3 arguments, got " << splitted.size() @@ -57,45 +78,31 @@ TextureOverrideSource::TextureOverrideSource(std::string filepath) // Parse the target mask std::vector<std::string> targets = str_split(splitted[1], ','); for (const std::string &target : targets) { - if (target == "top") - texture_override.target |= override_cast(OverrideTarget::TOP); - else if (target == "bottom") - texture_override.target |= override_cast(OverrideTarget::BOTTOM); - else if (target == "left") - texture_override.target |= override_cast(OverrideTarget::LEFT); - else if (target == "right") - texture_override.target |= override_cast(OverrideTarget::RIGHT); - else if (target == "front") - texture_override.target |= override_cast(OverrideTarget::FRONT); - else if (target == "back") - texture_override.target |= override_cast(OverrideTarget::BACK); - else if (target == "inventory") - texture_override.target |= override_cast(OverrideTarget::INVENTORY); - else if (target == "wield") - texture_override.target |= override_cast(OverrideTarget::WIELD); - else if (target == "special1") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_1); - else if (target == "special2") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_2); - else if (target == "special3") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_3); - else if (target == "special4") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_4); - else if (target == "special5") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_5); - else if (target == "special6") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_6); - else if (target == "sides") - texture_override.target |= override_cast(OverrideTarget::SIDES); - else if (target == "all" || target == "*") - texture_override.target |= override_cast(OverrideTarget::ALL_FACES); - else { - // Report invalid target - warningstream << filepath << ":" << line_index - << " Syntax error in texture override \"" << line - << "\": Unknown target \"" << target << "\"" - << std::endl; + std::vector<std::string> kvpair = str_split(target, '='); + if (kvpair.size() == 2) { + // Key-value pairs + if (kvpair[0] == "align_world") { + // Global textures + texture_override.world_scale = stoi(kvpair[1], 0, U8_MAX); + continue; + } + } + if (kvpair.size() == 1) { + // Regular override flags + auto pair = override_LUT.find(target); + + if (pair != override_LUT.end()) { + texture_override.target |= override_cast(pair->second); + continue; + } } + + // Report invalid target + warningstream << filepath << ":" << line_index + << " Syntax error in texture override \"" << line + << "\": Unknown target \"" << target << "\"" + << std::endl; + } // If there are no valid targets, skip adding this override |