add VEC3 models support
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
#include "coders/imageio.hpp"
|
#include "coders/imageio.hpp"
|
||||||
#include "coders/json.hpp"
|
#include "coders/json.hpp"
|
||||||
#include "coders/obj.hpp"
|
#include "coders/obj.hpp"
|
||||||
|
#include "coders/vec3.hpp"
|
||||||
#include "constants.hpp"
|
#include "constants.hpp"
|
||||||
#include "debug/Logger.hpp"
|
#include "debug/Logger.hpp"
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
@@ -23,6 +24,7 @@
|
|||||||
#include "graphics/core/Texture.hpp"
|
#include "graphics/core/Texture.hpp"
|
||||||
#include "graphics/core/TextureAnimation.hpp"
|
#include "graphics/core/TextureAnimation.hpp"
|
||||||
#include "objects/rigging.hpp"
|
#include "objects/rigging.hpp"
|
||||||
|
#include "util/stringutil.hpp"
|
||||||
#include "Assets.hpp"
|
#include "Assets.hpp"
|
||||||
#include "AssetsLoader.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(
|
assetload::postfunc assetload::model(
|
||||||
AssetsLoader* loader,
|
AssetsLoader* loader,
|
||||||
const ResPaths* paths,
|
const ResPaths* paths,
|
||||||
@@ -197,19 +210,32 @@ assetload::postfunc assetload::model(
|
|||||||
const std::string& name,
|
const std::string& name,
|
||||||
const std::shared_ptr<AssetCfg>&
|
const std::shared_ptr<AssetCfg>&
|
||||||
) {
|
) {
|
||||||
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::File>(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>(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);
|
auto text = files::read_string(path);
|
||||||
try {
|
try {
|
||||||
auto model = obj::parse(path.u8string(), text).release();
|
auto model = obj::parse(path.u8string(), text).release();
|
||||||
return [=](Assets* assets) {
|
return [=](Assets* assets) {
|
||||||
for (auto& mesh : model->meshes) {
|
request_textures(loader, *model);
|
||||||
if (mesh.texture.find('$') == std::string::npos) {
|
|
||||||
auto filename = TEXTURES_FOLDER + "/" + mesh.texture;
|
|
||||||
loader->add(
|
|
||||||
AssetType::TEXTURE, filename, mesh.texture, nullptr
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assets->store(std::unique_ptr<model::Model>(model), name);
|
assets->store(std::unique_ptr<model::Model>(model), name);
|
||||||
};
|
};
|
||||||
} catch (const parsing_error& err) {
|
} catch (const parsing_error& err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user