diff options
| author | Léo Lam <leo@leolam.fr> | 2021-03-20 00:32:24 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-03-20 14:36:27 +0100 |
| commit | 737a9b522b9d05e9a918240a191e6a7973cc6a4d (patch) | |
| tree | 6d7eceeafb4983ab82f0d45d6244c68de7db7389 /src/KingSystem/Resource/resResourceASSetting.cpp | |
| parent | 8c8d9c0e7036d22d3eebe1c8dca54b44b601e8e5 (diff) | |
ksys: Add ASSetting
Diffstat (limited to 'src/KingSystem/Resource/resResourceASSetting.cpp')
| -rw-r--r-- | src/KingSystem/Resource/resResourceASSetting.cpp | 106 |
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 |
