texture_override.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. Minetest
  3. Copyright (C) 2020 Hugues Ross <hugues.ross@gmail.com>
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 2.1 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public License along
  13. with this program; if not, write to the Free Software Foundation, Inc.,
  14. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  15. */
  16. #include "texture_override.h"
  17. #include "log.h"
  18. #include "util/string.h"
  19. #include <algorithm>
  20. #include <fstream>
  21. #define override_cast static_cast<override_t>
  22. static const std::map<std::string, OverrideTarget> override_LUT = {
  23. { "top", OverrideTarget::TOP },
  24. { "bottom", OverrideTarget::BOTTOM },
  25. { "left", OverrideTarget::LEFT },
  26. { "right", OverrideTarget::RIGHT },
  27. { "front", OverrideTarget::FRONT },
  28. { "back", OverrideTarget::BACK },
  29. { "inventory", OverrideTarget::INVENTORY },
  30. { "wield", OverrideTarget::WIELD },
  31. { "special1", OverrideTarget::SPECIAL_1 },
  32. { "special2", OverrideTarget::SPECIAL_2 },
  33. { "special3", OverrideTarget::SPECIAL_3 },
  34. { "special4", OverrideTarget::SPECIAL_4 },
  35. { "special5", OverrideTarget::SPECIAL_5 },
  36. { "special6", OverrideTarget::SPECIAL_6 },
  37. { "sides", OverrideTarget::SIDES },
  38. { "all", OverrideTarget::ALL_FACES },
  39. { "*", OverrideTarget::ALL_FACES }
  40. };
  41. TextureOverrideSource::TextureOverrideSource(const std::string &filepath)
  42. {
  43. std::ifstream infile(filepath.c_str());
  44. std::string line;
  45. int line_index = 0;
  46. while (std::getline(infile, line)) {
  47. line_index++;
  48. // Also trim '\r' on DOS-style files
  49. line = trim(line);
  50. // Ignore empty lines and comments
  51. if (line.empty() || line[0] == '#')
  52. continue;
  53. // Format: mod_name:item_name target1[,...] texture_name.png
  54. std::vector<std::string> splitted = str_split(line, ' ');
  55. if (splitted.size() < 3) {
  56. warningstream << filepath << ":" << line_index
  57. << " Syntax error in texture override \"" << line
  58. << "\": Expected 3 arguments, got " << splitted.size()
  59. << std::endl;
  60. continue;
  61. }
  62. TextureOverride texture_override = {};
  63. texture_override.id = splitted[0];
  64. texture_override.texture = splitted[2];
  65. // Parse the target mask
  66. std::vector<std::string> targets = str_split(splitted[1], ',');
  67. for (const std::string &target : targets) {
  68. std::vector<std::string> kvpair = str_split(target, '=');
  69. if (kvpair.size() == 2) {
  70. // Key-value pairs
  71. if (kvpair[0] == "align_world") {
  72. // Global textures
  73. texture_override.world_scale = stoi(kvpair[1], 0, U8_MAX);
  74. continue;
  75. }
  76. }
  77. if (kvpair.size() == 1) {
  78. // Regular override flags
  79. auto pair = override_LUT.find(target);
  80. if (pair != override_LUT.end()) {
  81. texture_override.target |= override_cast(pair->second);
  82. continue;
  83. }
  84. }
  85. // Report invalid target
  86. warningstream << filepath << ":" << line_index
  87. << " Syntax error in texture override \"" << line
  88. << "\": Unknown target \"" << target << "\""
  89. << std::endl;
  90. }
  91. // If there are no valid targets, skip adding this override
  92. if (texture_override.target == override_cast(OverrideTarget::INVALID)) {
  93. continue;
  94. }
  95. m_overrides.push_back(texture_override);
  96. }
  97. }
  98. //! Get all overrides that apply to item definitions
  99. std::vector<TextureOverride> TextureOverrideSource::getItemTextureOverrides() const
  100. {
  101. std::vector<TextureOverride> found_overrides;
  102. for (const TextureOverride &texture_override : m_overrides) {
  103. if (texture_override.hasTarget(OverrideTarget::ITEM_TARGETS))
  104. found_overrides.push_back(texture_override);
  105. }
  106. return found_overrides;
  107. }
  108. //! Get all overrides that apply to node definitions
  109. std::vector<TextureOverride> TextureOverrideSource::getNodeTileOverrides() const
  110. {
  111. std::vector<TextureOverride> found_overrides;
  112. for (const TextureOverride &texture_override : m_overrides) {
  113. if (texture_override.hasTarget(OverrideTarget::NODE_TARGETS))
  114. found_overrides.push_back(texture_override);
  115. }
  116. return found_overrides;
  117. }