#include "texture_set.h" #include "m2_tokvec.h" #include #include namespace fmt { bool parse_texture_set(const std::string& text, TextureSet& out, std::string* err) { TokVecMap tv; std::string perr; parse_tokvec(text, tv, &perr); out = TextureSet{}; if (!tv.has("textureset")) { if (err) *err = "textureset 缺首行 `TextureSet`"; return false; } if (!tv.has("texturecount")) { if (err) *err = "textureset 缺 TextureCount"; return false; } out.declared_count = (int)tv.inum("texturecount"); if (out.declared_count < 0) { if (err) *err = "textureset TextureCount 非法"; return false; } for (int i = 1; i <= out.declared_count; ++i) { char key[32]; std::snprintf(key, sizeof(key), "texture%03d", i); const auto* v = tv.find(key); if (!v) { if (err) *err = std::string("textureset 缺块 ") + key; return false; } if (v->size() < 8) { if (err) *err = std::string("textureset 块 ") + key + " token 不足 8 个"; return false; } TextureLayer L; L.texture = (*v)[0]; L.u_scale = (float)std::atof((*v)[1].c_str()); L.v_scale = (float)std::atof((*v)[2].c_str()); L.u_offset = (float)std::atof((*v)[3].c_str()); L.v_offset = (float)std::atof((*v)[4].c_str()); L.splat_enabled = std::atoi((*v)[5].c_str()) != 0; L.height_begin = (unsigned short)std::atoi((*v)[6].c_str()); L.height_end = (unsigned short)std::atoi((*v)[7].c_str()); out.layers.push_back(std::move(L)); } return true; } bool parse_texture_set_file(const std::string& path, TextureSet& out, std::string* err) { std::string text; if (!read_file(path, text)) { if (err) *err = "打不开 " + path; return false; } return parse_texture_set(text, out, err); } } // namespace fmt