blob: b1c446d3d3bdb8bbee385f8beb10511a6d2ba831 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
|