feat: models loading

This commit is contained in:
MihailRis 2024-06-22 23:43:56 +03:00
parent d54b6b2e58
commit ea0add3017
8 changed files with 43 additions and 13 deletions

View File

@ -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<void(Assets*)>;

View File

@ -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 "<error>";
}
@ -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
}

View File

@ -25,7 +25,8 @@ enum class AssetType {
font,
atlas,
layout,
sound
sound,
model,
};
class ResPaths;

View File

@ -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 <iostream>
#include <stdexcept>
@ -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<AssetCfg>&
) {
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::Model>(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<std::pair<std::string, int>>& frameList

View File

@ -49,7 +49,6 @@ namespace assetload {
const std::string &name,
const std::shared_ptr<AssetCfg>& settings
);
postfunc sound(
AssetsLoader*,
const ResPaths* paths,
@ -57,6 +56,13 @@ namespace assetload {
const std::string &name,
const std::shared_ptr<AssetCfg>& settings
);
postfunc model(
AssetsLoader*,
const ResPaths* paths,
const std::string& file,
const std::string &name,
const std::shared_ptr<AssetCfg>& settings
);
}
#endif // ASSETS_ASSET_LOADERS_HPP_

View File

@ -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_

View File

@ -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<Texture>(mesh.texture);
if (texture) {
texture->bind();

View File

@ -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();
};