mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Refactor texture overrides and add new features (#9600)
* Refactor texture overrides, and add new features: - Texture overrides can support multiple targets in one line - Texture override files can have comment lines - Item images/wield images can be overridden * Formatting changes * Address soime feedback - Pass vectors by const reference - Log syntax errors as warnings - Remove 'C' prefix from TextureOverrideSource * Simplify override target checks with an inline helper function * make linter happy * Apply feedback suggestions Co-Authored-By: rubenwardy <rw@rubenwardy.com> * Remove remaining != 0 checks * Update copyright notice Co-authored-by: sfan5 <sfan5@live.de> Co-authored-by: rubenwardy <rw@rubenwardy.com>
This commit is contained in:
parent
7e21b3cd48
commit
5cf6318117
11 changed files with 285 additions and 71 deletions
120
src/texture_override.cpp
Normal file
120
src/texture_override.cpp
Normal file
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2020 Hugues Ross <hugues.ross@gmail.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "texture_override.h"
|
||||
|
||||
#include "log.h"
|
||||
#include "util/string.h"
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
|
||||
TextureOverrideSource::TextureOverrideSource(std::string filepath)
|
||||
{
|
||||
std::ifstream infile(filepath.c_str());
|
||||
std::string line;
|
||||
int line_index = 0;
|
||||
while (std::getline(infile, line)) {
|
||||
line_index++;
|
||||
|
||||
// Also trim '\r' on DOS-style files
|
||||
line = trim(line);
|
||||
|
||||
// Ignore empty lines and comments
|
||||
if (line.empty() || line[0] == '#')
|
||||
continue;
|
||||
|
||||
std::vector<std::string> splitted = str_split(line, ' ');
|
||||
if (splitted.size() != 3) {
|
||||
warningstream << filepath << ":" << line_index
|
||||
<< " Syntax error in texture override \"" << line
|
||||
<< "\": Expected 3 arguments, got " << splitted.size()
|
||||
<< std::endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
TextureOverride texture_override = {};
|
||||
texture_override.id = splitted[0];
|
||||
texture_override.texture = splitted[2];
|
||||
|
||||
// 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 |= static_cast<u8>(OverrideTarget::TOP);
|
||||
else if (target == "bottom")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::BOTTOM);
|
||||
else if (target == "left")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::LEFT);
|
||||
else if (target == "right")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::RIGHT);
|
||||
else if (target == "front")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::FRONT);
|
||||
else if (target == "back")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::BACK);
|
||||
else if (target == "inventory")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::INVENTORY);
|
||||
else if (target == "wield")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::WIELD);
|
||||
else if (target == "sides")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::SIDES);
|
||||
else if (target == "all" || target == "*")
|
||||
texture_override.target |= static_cast<u8>(OverrideTarget::ALL_FACES);
|
||||
else {
|
||||
// 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
|
||||
if (texture_override.target == static_cast<u8>(OverrideTarget::INVALID)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
m_overrides.push_back(texture_override);
|
||||
}
|
||||
}
|
||||
|
||||
//! Get all overrides that apply to item definitions
|
||||
std::vector<TextureOverride> TextureOverrideSource::getItemTextureOverrides()
|
||||
{
|
||||
std::vector<TextureOverride> found_overrides;
|
||||
|
||||
for (const TextureOverride &texture_override : m_overrides) {
|
||||
if (texture_override.hasTarget(OverrideTarget::ITEM_TARGETS))
|
||||
found_overrides.push_back(texture_override);
|
||||
}
|
||||
|
||||
return found_overrides;
|
||||
}
|
||||
|
||||
//! Get all overrides that apply to node definitions
|
||||
std::vector<TextureOverride> TextureOverrideSource::getNodeTileOverrides()
|
||||
{
|
||||
std::vector<TextureOverride> found_overrides;
|
||||
|
||||
for (const TextureOverride &texture_override : m_overrides) {
|
||||
if (texture_override.hasTarget(OverrideTarget::ALL_FACES))
|
||||
found_overrides.push_back(texture_override);
|
||||
}
|
||||
|
||||
return found_overrides;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue