1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

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.
This commit is contained in:
SmallJoker 2022-08-13 08:52:16 +02:00 committed by GitHub
parent 8bf1609ccc
commit 023a1c2427
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 71 additions and 52 deletions

View file

@ -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