diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 71b507c6..a801500e 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -219,14 +219,15 @@ void ContentLoader::loadBlock( } // block model - std::string modelName; - root.at("model").get(modelName); - if (auto model = BlockModel_from(modelName)) { + std::string modelTypeName; + root.at("model").get(modelTypeName); + root.at("model-name").get(def.modelName); + if (auto model = BlockModel_from(modelTypeName)) { if (*model == BlockModel::custom) { if (root.has("model-primitives")) { def.customModelRaw = root["model-primitives"]; - } else { - throw std::runtime_error(name + ": no 'model-primitives' found"); + } else if (def.modelName.empty()) { + throw std::runtime_error(name + ": no 'model-primitives' or 'model-name' found"); } for (uint i = 0; i < 6; i++) { std::string& texture = def.textureFaces[i]; @@ -236,8 +237,8 @@ void ContentLoader::loadBlock( } } def.model = *model; - } else if (!modelName.empty()) { - logger.error() << "unknown model " << modelName; + } else if (!modelTypeName.empty()) { + logger.error() << "unknown model " << modelTypeName; def.model = BlockModel::none; } diff --git a/src/engine.cpp b/src/engine.cpp index a75d90ff..c5bae880 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -288,14 +288,17 @@ void Engine::loadAssets() { if (content) { for (auto& [name, def] : content->blocks.getDefs()) { if (def->model == BlockModel::custom) { - assets->store( - std::make_unique( - ModelsGenerator::loadCustomBlockModel( - def->customModelRaw, *assets, !def->shadeless - ) - ), - name + ".model" - ); + if (def->modelName.empty()) { + assets->store( + std::make_unique( + ModelsGenerator::loadCustomBlockModel( + def->customModelRaw, *assets, !def->shadeless + ) + ), + name + ".model" + ); + def->modelName = def->name + ".model"; + } } } for (auto& [name, def] : content->items.getDefs()) { diff --git a/src/frontend/ContentGfxCache.cpp b/src/frontend/ContentGfxCache.cpp index 00ce478b..8890a24e 100644 --- a/src/frontend/ContentGfxCache.cpp +++ b/src/frontend/ContentGfxCache.cpp @@ -30,7 +30,7 @@ ContentGfxCache::ContentGfxCache(const Content* content, Assets* assets) } if (def->model == BlockModel::custom) { models[def->rt.id] = - assets->require(def->name + ".model"); + assets->require(def->modelName); } } } diff --git a/src/graphics/render/ModelsGenerator.cpp b/src/graphics/render/ModelsGenerator.cpp index 84faa380..a1283bac 100644 --- a/src/graphics/render/ModelsGenerator.cpp +++ b/src/graphics/render/ModelsGenerator.cpp @@ -113,7 +113,7 @@ model::Model ModelsGenerator::generate( "blocks:" + blockDef.textureFaces.at(0), assets ); } else if (blockDef.model == BlockModel::custom) { - model = assets.require(blockDef.name+".model"); + model = assets.require(blockDef.modelName); for (auto& mesh : model.meshes) { mesh.scale(glm::vec3(0.3f)); } diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index 74666a38..26b38469 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -135,6 +135,8 @@ public: /// @brief Custom model raw data dv::value customModelRaw = nullptr; + std::string modelName = ""; + /// @brief Does the block passing lights into itself bool lightPassing = false;