diff --git a/src/assets/Assets.hpp b/src/assets/Assets.hpp index 8338eb7e..fd39e8fe 100644 --- a/src/assets/Assets.hpp +++ b/src/assets/Assets.hpp @@ -13,14 +13,6 @@ class Assets; -namespace audio { - class Sound; -} - -namespace model { - struct Model; -} - namespace assetload { /// @brief final work to do in the main thread using postfunc = std::function; diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index bf0ac243..65f52da7 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -30,6 +30,7 @@ AssetsLoader::AssetsLoader(Assets* assets, const ResPaths* paths) addLoader(AssetType::atlas, assetload::atlas); addLoader(AssetType::layout, assetload::layout); addLoader(AssetType::sound, assetload::sound); + addLoader(AssetType::model, assetload::model); } void AssetsLoader::addLoader(AssetType tag, aloader_func func) { @@ -99,6 +100,7 @@ static std::string assets_def_folder(AssetType tag) { case AssetType::atlas: return TEXTURES_FOLDER; case AssetType::layout: return LAYOUTS_FOLDER; case AssetType::sound: return SOUNDS_FOLDER; + case AssetType::model: return MODELS_FOLDER; } return ""; } @@ -155,6 +157,7 @@ void AssetsLoader::processPreloadConfig(const fs::path& file) { processPreloadList(AssetType::shader, root->list("shaders")); processPreloadList(AssetType::texture, root->list("textures")); processPreloadList(AssetType::sound, root->list("sounds")); + processPreloadList(AssetType::model, root->list("models")); // layouts are loaded automatically } diff --git a/src/assets/AssetsLoader.hpp b/src/assets/AssetsLoader.hpp index b2d81916..91eb1036 100644 --- a/src/assets/AssetsLoader.hpp +++ b/src/assets/AssetsLoader.hpp @@ -25,7 +25,8 @@ enum class AssetType { font, atlas, layout, - sound + sound, + model, }; class ResPaths; diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index 8698d61f..4a85cb94 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -9,14 +9,17 @@ #include "../coders/commons.hpp" #include "../coders/imageio.hpp" #include "../coders/json.hpp" +#include "../coders/obj.hpp" #include "../coders/GLSLExtension.hpp" #include "../graphics/core/Shader.hpp" #include "../graphics/core/Texture.hpp" #include "../graphics/core/ImageData.hpp" #include "../graphics/core/Atlas.hpp" #include "../graphics/core/Font.hpp" +#include "../graphics/core/Model.hpp" #include "../graphics/core/TextureAnimation.hpp" #include "../frontend/UiDocument.hpp" +#include "../constants.hpp" #include #include @@ -198,6 +201,30 @@ assetload::postfunc assetload::sound( }; } +assetload::postfunc assetload::model( + AssetsLoader* loader, + const ResPaths* paths, + const std::string& file, + const std::string& name, + const std::shared_ptr& +) { + auto 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) { + auto filename = TEXTURES_FOLDER+"/"+mesh.texture; + loader->add(AssetType::texture, filename, mesh.texture, nullptr); + } + assets->store(std::unique_ptr(model), name); + }; + } catch (const parsing_error& err) { + std::cerr << err.errorLog() << std::endl; + throw; + } +} + static void read_anim_file( const std::string& animFile, std::vector>& frameList diff --git a/src/assets/assetload_funcs.hpp b/src/assets/assetload_funcs.hpp index f017dcb4..71b3cb93 100644 --- a/src/assets/assetload_funcs.hpp +++ b/src/assets/assetload_funcs.hpp @@ -49,7 +49,6 @@ namespace assetload { const std::string &name, const std::shared_ptr& settings ); - postfunc sound( AssetsLoader*, const ResPaths* paths, @@ -57,6 +56,13 @@ namespace assetload { const std::string &name, const std::shared_ptr& settings ); + postfunc model( + AssetsLoader*, + const ResPaths* paths, + const std::string& file, + const std::string &name, + const std::shared_ptr& settings + ); } #endif // ASSETS_ASSET_LOADERS_HPP_ diff --git a/src/constants.hpp b/src/constants.hpp index e666563a..76c13a74 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -49,5 +49,6 @@ inline const std::string TEXTURES_FOLDER = "textures"; inline const std::string FONTS_FOLDER = "fonts"; inline const std::string LAYOUTS_FOLDER = "layouts"; inline const std::string SOUNDS_FOLDER = "sounds"; +inline const std::string MODELS_FOLDER = "models"; #endif // CONSTANTS_HPP_ diff --git a/src/graphics/render/ModelBatch.cpp b/src/graphics/render/ModelBatch.cpp index 99aef358..abbfc073 100644 --- a/src/graphics/render/ModelBatch.cpp +++ b/src/graphics/render/ModelBatch.cpp @@ -50,7 +50,7 @@ ModelBatch::ModelBatch(size_t capacity, Assets* assets, Chunks* chunks) ModelBatch::~ModelBatch() { } -void ModelBatch::draw(const model::Model& model) { +void ModelBatch::draw(const model::Model* model) { glm::vec3 gpos = combined * glm::vec4(glm::vec3(), 1.0f); light_t light = chunks->getLight(gpos.x, gpos.y, gpos.z); glm::vec4 lights ( @@ -59,7 +59,7 @@ void ModelBatch::draw(const model::Model& model) { Lightmap::extract(light, 2) / 15.0f, Lightmap::extract(light, 3) / 15.0f ); - for (const auto& mesh : model.meshes) { + for (const auto& mesh : model->meshes) { auto texture = assets->get(mesh.texture); if (texture) { texture->bind(); diff --git a/src/graphics/render/ModelBatch.hpp b/src/graphics/render/ModelBatch.hpp index 67b367f5..8b949227 100644 --- a/src/graphics/render/ModelBatch.hpp +++ b/src/graphics/render/ModelBatch.hpp @@ -83,7 +83,7 @@ public: void box(glm::vec3 pos, glm::vec3 size, glm::vec4 lights); - void draw(const model::Model& model); + void draw(const model::Model* model); void flush(); };