summaryrefslogtreecommitdiff
path: root/src/KingSystem/Resource/resResourceASSetting.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-03-20 00:32:24 +0100
committerLéo Lam <leo@leolam.fr>2021-03-20 14:36:27 +0100
commit737a9b522b9d05e9a918240a191e6a7973cc6a4d (patch)
tree6d7eceeafb4983ab82f0d45d6244c68de7db7389 /src/KingSystem/Resource/resResourceASSetting.cpp
parent8c8d9c0e7036d22d3eebe1c8dca54b44b601e8e5 (diff)
ksys: Add ASSetting
Diffstat (limited to 'src/KingSystem/Resource/resResourceASSetting.cpp')
-rw-r--r--src/KingSystem/Resource/resResourceASSetting.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/KingSystem/Resource/resResourceASSetting.cpp b/src/KingSystem/Resource/resResourceASSetting.cpp
new file mode 100644
index 00000000..cab069d7
--- /dev/null
+++ b/src/KingSystem/Resource/resResourceASSetting.cpp
@@ -0,0 +1,106 @@
+#include "KingSystem/Resource/resResourceASSetting.h"
+
+namespace ksys::res {
+
+ASSetting::ASSetting() {
+ mType = "assetting";
+ mVersion = 0;
+}
+
+ASSetting::~ASSetting() {
+ mBlenderBones.freeBuffer();
+}
+
+void ASSetting::doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) {}
+
+bool allocBlenderBones(sead::Buffer<ASSetting::BlenderBone>& buffer, int size, sead::Heap* heap,
+ int align = sizeof(void*)) {
+ return buffer.tryAllocBuffer(size, heap, align);
+}
+
+bool ASSetting::parse_(u8* data, size_t size, sead::Heap* heap) {
+ if (!data)
+ return true;
+
+ agl::utl::ResParameterArchive archive{data};
+ const auto root = archive.getRootList();
+
+ addList(&mBlenderBoneList, "BlenderBone");
+
+ const auto lists = agl::utl::getResParameterList(root, "BlenderBone");
+ if (!lists.ptr())
+ return true;
+
+ const auto num_blender_bones = lists.getResParameterListNum();
+ if (num_blender_bones == 0)
+ return true;
+
+ if (!allocBlenderBones(mBlenderBones, num_blender_bones, heap))
+ return false;
+
+ auto res_it = lists.listBegin();
+ const auto res_it_end = lists.listEnd();
+ sead::FixedSafeString<32> list_name{"BlenderBone"};
+ const auto list_name_base_len = list_name.calcLength();
+
+ ASParamParser::ParseArgs args;
+ args.res_list = {};
+ args.heap = heap;
+
+ auto it = mBlenderBones.begin();
+ const auto end = mBlenderBones.end();
+ for (; it != end && res_it != res_it_end; ++it, ++res_it) {
+ list_name.trim(list_name_base_len);
+ list_name.appendWithFormat("%d", it.getIndex());
+ mBlenderBoneList.addList(&it->mList, list_name);
+
+ it->mKeyName.init("", "KeyName", "キー名", "", &it->mNameParamObj);
+ it->mList.addObj(&it->mNameParamObj, "NameParam");
+ it->mList.addList(&it->mBoneParams.getList(), "BoneParam");
+
+ const auto list = *res_it;
+ args.user_data = std::addressof(*it);
+ args.res_list = agl::utl::getResParameterList(list, "BoneParam");
+ if (!it->mBoneParams.parse(args))
+ return false;
+ }
+
+ applyResParameterArchive(archive);
+ return true;
+}
+
+ASSetting::BoneParams::~BoneParams() {
+ mBuffer.freeBuffer();
+}
+
+// NON_MATCHING: parameter object iteration(???)
+bool ASSetting::BoneParams::parse(const ASParamParser::ParseArgs& args) {
+ const auto num_objects = args.res_list.getResParameterObjNum();
+ if (num_objects == 0)
+ return true;
+
+ if (!mBuffer.tryAllocBuffer(num_objects, args.heap))
+ return false;
+
+ sead::FixedSafeString<32> obj_name{"BoneParam"};
+ const auto obj_name_base_len = obj_name.calcLength();
+
+ auto it = mBuffer.begin();
+ const auto end = mBuffer.end();
+
+ auto res_it = args.res_list.objBegin();
+ const auto res_end = args.res_list.objEnd();
+
+ for (; it != end && res_it != res_end; ++it, ++res_it) {
+ it->mBone.init("", "Bone", "ボーン名", "", &it->mObj);
+ it->mWeight.init(0.0, "Weight", "ウェイト値", "Min=0.f,Max=1.f", &it->mObj);
+
+ obj_name.trim(obj_name_base_len);
+ obj_name.appendWithFormat("%d", res_it.getIndex());
+ mList.addObj(&it->mObj, obj_name);
+ }
+
+ return true;
+}
+
+} // namespace ksys::res