feat: add export / file packing
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
#include <destrum/Assets/AssetManager.h>
|
||||
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <destrum/Assets/ModelFile.h>
|
||||
#include <destrum/FS/AssetFS.h>
|
||||
|
||||
#include "AssetFSIOSystem.h"
|
||||
|
||||
namespace {
|
||||
std::string ToReference(std::string_view reference) {
|
||||
if (reference.empty()) {
|
||||
@@ -30,6 +33,14 @@ namespace {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
// Assimp opens files itself, so with packed assets it has to go through AssetFS
|
||||
std::unique_ptr<Assimp::IOSystem> MakeIOSystem() {
|
||||
if (!AssetFS::GetInstance().IsPacked()) {
|
||||
return nullptr;
|
||||
}
|
||||
return std::make_unique<AssetFSIOSystem>();
|
||||
}
|
||||
|
||||
// Cooked texture paths are relative to the model file, imported ones are absolute
|
||||
void ResolveTexturePaths(ModelDoc::ModelAsset& model, const std::filesystem::path& modelDir) {
|
||||
for (ModelDoc::MaterialInfo& material : model.materials) {
|
||||
@@ -95,7 +106,7 @@ ModelDoc::ModelAsset AssetManager::LoadCookedOrImport(
|
||||
const ModelDoc::LoadOptions& options) const
|
||||
{
|
||||
if (const auto cookedPath = FindCookedModel(reference)) {
|
||||
ModelDoc::ModelAsset model = ModelFile::ReadFromFile(*cookedPath);
|
||||
ModelDoc::ModelAsset model = ModelFile::Read(AssetFS::GetInstance().ReadFile(*cookedPath));
|
||||
if (ModelFile::SupportsLoadOptions(model, options)) {
|
||||
ModelFile::ApplyLoadOptions(model, options);
|
||||
ResolveTexturePaths(model, cookedPath->parent_path());
|
||||
@@ -105,7 +116,7 @@ ModelDoc::ModelAsset AssetManager::LoadCookedOrImport(
|
||||
spdlog::debug("Importing {}, its cooked model doesn't match the requested load options", reference);
|
||||
}
|
||||
|
||||
return ModelDoc::LoadModel(Resolve(reference).generic_string(), options);
|
||||
return ModelDoc::LoadModel(Resolve(reference).generic_string(), options, MakeIOSystem());
|
||||
}
|
||||
|
||||
std::vector<SkeletalAnimation> AssetManager::LoadAnimationClips(
|
||||
@@ -115,7 +126,8 @@ std::vector<SkeletalAnimation> AssetManager::LoadAnimationClips(
|
||||
const std::string sourceReference = ToReference(reference);
|
||||
auto clips = ModelDoc::LoadAnimationClips(
|
||||
Resolve(sourceReference).generic_string(),
|
||||
targetSkeleton);
|
||||
targetSkeleton,
|
||||
MakeIOSystem());
|
||||
for (std::size_t index = 0; index < clips.size(); ++index) {
|
||||
auto& clip = clips[index];
|
||||
clip.assetReference.path = sourceReference;
|
||||
|
||||
Reference in New Issue
Block a user