diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index 41d50e43..6c4ed262 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -10,6 +10,7 @@ #include "coders/imageio.hpp" #include "coders/json.hpp" #include "coders/obj.hpp" +#include "coders/vec3.hpp" #include "constants.hpp" #include "debug/Logger.hpp" #include "files/engine_paths.hpp" @@ -23,6 +24,7 @@ #include "graphics/core/Texture.hpp" #include "graphics/core/TextureAnimation.hpp" #include "objects/rigging.hpp" +#include "util/stringutil.hpp" #include "Assets.hpp" #include "AssetsLoader.hpp" @@ -190,6 +192,17 @@ assetload::postfunc assetload::sound( }; } +static void request_textures(AssetsLoader* loader, const model::Model& model) { + for (auto& mesh : model.meshes) { + if (mesh.texture.find('$') == std::string::npos) { + auto filename = TEXTURES_FOLDER + "/" + mesh.texture; + loader->add( + AssetType::TEXTURE, filename, mesh.texture, nullptr + ); + } + } +} + assetload::postfunc assetload::model( AssetsLoader* loader, const ResPaths* paths, @@ -197,19 +210,32 @@ assetload::postfunc assetload::model( const std::string& name, const std::shared_ptr& ) { - auto path = paths->find(file + ".obj"); + auto path = paths->find(file + ".vec3"); + if (fs::exists(path)) { + auto bytes = files::read_bytes_buffer(path); + auto modelVEC3 = std::make_shared(vec3::load(path.u8string(), bytes)); + return [loader, name, modelVEC3=std::move(modelVEC3)](Assets* assets) { + for (auto& [modelName, model] : modelVEC3->models) { + request_textures(loader, model.model); + std::string fullName = name; + if (name != modelName) { + fullName += "." + modelName; + } + assets->store( + std::make_unique(model.model), + fullName + ); + logger.info() << "store model " << util::quote(modelName) + << " as " << util::quote(fullName); + } + }; + } + path = paths->find(file + ".obj"); auto text = files::read_string(path); try { auto model = obj::parse(path.u8string(), text).release(); return [=](Assets* assets) { - for (auto& mesh : model->meshes) { - if (mesh.texture.find('$') == std::string::npos) { - auto filename = TEXTURES_FOLDER + "/" + mesh.texture; - loader->add( - AssetType::TEXTURE, filename, mesh.texture, nullptr - ); - } - } + request_textures(loader, *model); assets->store(std::unique_ptr(model), name); }; } catch (const parsing_error& err) {