summaryrefslogtreecommitdiff
path: root/src/KingSystem/Resource/resModelResourceDivide.cpp
diff options
context:
space:
mode:
authorMonsterDruide1 <5958456@gmail.com>2021-06-22 21:26:35 +0200
committerMonsterDruide1 <5958456@gmail.com>2021-06-22 21:26:35 +0200
commitcadf1688ed84b1311f2ebace25ba6aef03267124 (patch)
treefc876349489b279bfd8057a181dbd6ca2634f6e8 /src/KingSystem/Resource/resModelResourceDivide.cpp
parentc72a150a9bdacf316905a687e78bb3ae3f6c0fa9 (diff)
ksys/res: Add ModelResourceDivide
Diffstat (limited to 'src/KingSystem/Resource/resModelResourceDivide.cpp')
-rw-r--r--src/KingSystem/Resource/resModelResourceDivide.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/KingSystem/Resource/resModelResourceDivide.cpp b/src/KingSystem/Resource/resModelResourceDivide.cpp
index 772fac7f..b1c446d3 100644
--- a/src/KingSystem/Resource/resModelResourceDivide.cpp
+++ b/src/KingSystem/Resource/resModelResourceDivide.cpp
@@ -1,7 +1,60 @@
#include "KingSystem/Resource/resModelResourceDivide.h"
+#include "KingSystem/ActorSystem/actDebug.h"
+#include "KingSystem/Resource/resLoadRequest.h"
+#include "KingSystem/Resource/resResourceMgrTask.h"
+#include "KingSystem/Utils/Byaml/Byaml.h"
namespace ksys::res {
SEAD_SINGLETON_DISPOSER_IMPL(ModelResourceDivide)
+ModelResourceDivide::~ModelResourceDivide() {
+ if (mIter)
+ delete mIter;
+}
+
+void ModelResourceDivide::init(sead::Heap* heap) {
+ auto load_request = LoadRequest();
+ load_request.mRequester = "ModelResourceDivide";
+ load_request.mLoadCompressed = true;
+ mHandle.load("System/Resource/ModelDivideTable.byml", &load_request);
+ sead::DirectResource* table = mHandle.getResource();
+ auto* cast_table = sead::DynamicCast<sead::DirectResource>(table);
+ mIter = new (heap) al::ByamlIter(cast_table->getRawData());
+}
+
+const char* ModelResourceDivide::getModelResource(const sead::SafeString& model_name,
+ const sead::SafeString& fmdb_name) const {
+ auto* debug = act::ActorDebug::instance();
+ if (debug && !debug->hasFlag(act::ActorDebug::Flag::_20000000))
+ return nullptr;
+
+ sead::FormatFixedSafeString<128> model_path("Model/%s.bfres", model_name.cstr());
+ if (ResourceMgrTask::instance()->isHostPath(model_path))
+ return nullptr;
+
+ al::ByamlIter model_iter{};
+ if (!mIter->tryGetIterByKey(&model_iter, model_name.cstr()))
+ return nullptr;
+
+ sead::FormatFixedSafeString<128> fmdb_file_name("%s.fmdb", fmdb_name.cstr());
+
+ for (int i = 0; i < model_iter.getSize(); ++i) {
+ al::ByamlIter index_iter;
+ if (!model_iter.tryGetIterByIndex(&index_iter, i))
+ break;
+ al::ByamlIter models_iter;
+ if (!index_iter.tryGetIterByKey(&models_iter, "models"))
+ break;
+ al::ByamlIter fmdb_iter;
+ const char* value;
+ if (models_iter.tryGetIterByKey(&fmdb_iter, fmdb_file_name.cstr())) {
+ if (index_iter.tryGetStringByKey(&value, "model_resource"))
+ return value;
+ return nullptr;
+ }
+ }
+ return nullptr;
+}
+
} // namespace ksys::res