diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 7cb7f42f..e94176cb 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -96592,30 +96592,30 @@ 0x00000071012f1868,sub_71012F1868,756, 0x00000071012f1b5c,sub_71012F1B5C,756, 0x00000071012f1e50,sub_71012F1E50,168, -0x00000071012f1ef8,sub_71012F1EF8,896, +0x00000071012f1ef8,sub_71012F1EF8,896,_ZN4ksys3res9ASSetting10BoneParams5parseERKNS0_13ASParamParser9ParseArgsE! 0x00000071012f2278,sub_71012F2278,300, 0x00000071012f23a4,sub_71012F23A4,132, 0x00000071012f2428,sub_71012F2428,508, 0x00000071012f2624,sub_71012F2624,636, -0x00000071012f28a0,sub_71012F28A0,428, +0x00000071012f28a0,sub_71012F28A0,428,_ZNK4ksys3act9ASSetting13getBoneParamsERKN4sead14SafeStringBaseIcEE? 0x00000071012f2a4c,sub_71012F2A4C,80, -0x00000071012f2a9c,sub_71012F2A9C,252, -0x00000071012f2b98,sub_71012F2B98,360, -0x00000071012f2d00,sub_71012F2D00,8, -0x00000071012f2d08,sub_71012F2D08,8, -0x00000071012f2d10,sub_71012F2D10,36, -0x00000071012f2d34,sub_71012F2D34,40, -0x00000071012f2d5c,sub_71012F2D5C,40, -0x00000071012f2d84,nullsub_4831,4, -0x00000071012f2d88,nullsub_4832,4, -0x00000071012f2d8c,sub_71012F2D8C,1016, -0x00000071012f3184,sub_71012F3184,376, -0x00000071012f32fc,sub_71012F32FC,8, -0x00000071012f3304,sub_71012F3304,100, -0x00000071012f3368,sub_71012F3368,108, -0x00000071012f33d4,ASSetting::createInstance,152, -0x00000071012f346c,sub_71012F346C,88, -0x00000071012f34c4,ASSetting::init,132, +0x00000071012f2a9c,sub_71012F2A9C,252,_ZN4ksys3res9ASSettingC1Ev +0x00000071012f2b98,sub_71012F2B98,360,_ZN4ksys3res9ASSettingD1Ev +0x00000071012f2d00,sub_71012F2D00,8,_ZThn464_N4ksys3res9ASSettingD1Ev +0x00000071012f2d08,sub_71012F2D08,8,_ZThn496_N4ksys3res9ASSettingD1Ev +0x00000071012f2d10,sub_71012F2D10,36,_ZN4ksys3res9ASSettingD0Ev +0x00000071012f2d34,sub_71012F2D34,40,_ZThn464_N4ksys3res9ASSettingD0Ev +0x00000071012f2d5c,sub_71012F2D5C,40,_ZThn496_N4ksys3res9ASSettingD0Ev +0x00000071012f2d84,nullsub_4831,4,_ZN4ksys3res9ASSetting9doCreate_EPhjPN4sead4HeapE +0x00000071012f2d88,nullsub_4832,4,_ZThn464_N4ksys3res9ASSetting9doCreate_EPhjPN4sead4HeapE +0x00000071012f2d8c,sub_71012F2D8C,1016,_ZN4ksys3res9ASSetting6parse_EPhmPN4sead4HeapE +0x00000071012f3184,sub_71012F3184,376,_ZN4ksys3res17allocBlenderBonesERN4sead6BufferINS0_9ASSetting11BlenderBoneEEEiPNS1_4HeapEi +0x00000071012f32fc,sub_71012F32FC,8,_ZThn464_N4ksys3res9ASSetting6parse_EPhmPN4sead4HeapE +0x00000071012f3304,sub_71012F3304,100,_ZN4ksys3act9ASSetting18SingletonDisposer_D2Ev +0x00000071012f3368,sub_71012F3368,108,_ZN4ksys3act9ASSetting18SingletonDisposer_D0Ev +0x00000071012f33d4,ASSetting::createInstance,152,_ZN4ksys3act9ASSetting14createInstanceEPN4sead4HeapE +0x00000071012f346c,sub_71012F346C,88,_ZN4ksys3act9ASSetting14deleteInstanceEv +0x00000071012f34c4,ASSetting::init,132,_ZN4ksys3act9ASSetting4initERKN4sead14SafeStringBaseIcEE 0x00000071012f3548,sub_71012F3548,204, 0x00000071012f3614,sub_71012F3614,92, 0x00000071012f3670,sub_71012F3670,104, @@ -96646,20 +96646,20 @@ 0x00000071012f45e0,sub_71012F45E0,188, 0x00000071012f469c,sub_71012F469C,204, 0x00000071012f4768,sub_71012F4768,92, -0x00000071012f47c4,sub_71012F47C4,36, +0x00000071012f47c4,sub_71012F47C4,36,_ZN4ksys3res13ASParamParserD2Ev 0x00000071012f47e8,j__ZdlPv_1320,4, -0x00000071012f47ec,sub_71012F47EC,204, -0x00000071012f48b8,sub_71012F48B8,92, -0x00000071012f4914,sub_71012F4914,164, -0x00000071012f49b8,sub_71012F49B8,128, -0x00000071012f4a38,sub_71012F4A38,8, -0x00000071012f4a40,sub_71012F4A40,92, -0x00000071012f4a9c,sub_71012F4A9C,8, -0x00000071012f4aa4,sub_71012F4AA4,8, -0x00000071012f4aac,sub_71012F4AAC,92, -0x00000071012f4b08,sub_71012F4B08,8, -0x00000071012f4b10,sub_71012F4B10,20, -0x00000071012f4b24,sub_71012F4B24,52, +0x00000071012f47ec,sub_71012F47EC,204,_ZNK4ksys3res9ASSetting10BoneParams27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f48b8,sub_71012F48B8,92,_ZNK4ksys3res9ASSetting10BoneParams18getRuntimeTypeInfoEv +0x00000071012f4914,sub_71012F4914,164,_ZN4ksys3res9ASSetting10BoneParamsD1Ev +0x00000071012f49b8,sub_71012F49B8,128,_ZN4ksys3res9ASSetting10BoneParamsD0Ev +0x00000071012f4a38,sub_71012F4A38,8,_ZNK4ksys3res9ASSetting27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f4a40,sub_71012F4A40,92,_ZNK4ksys3res9ASSetting18getRuntimeTypeInfoEv +0x00000071012f4a9c,sub_71012F4A9C,8,_ZNK4ksys3res9ASSetting10needsParseEv +0x00000071012f4aa4,sub_71012F4AA4,8,_ZThn464_NK4ksys3res9ASSetting27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f4aac,sub_71012F4AAC,92,_ZThn464_NK4ksys3res9ASSetting18getRuntimeTypeInfoEv +0x00000071012f4b08,sub_71012F4B08,8,_ZThn464_NK4ksys3res9ASSetting10needsParseEv +0x00000071012f4b10,sub_71012F4B10,20,_ZN4ksys3act9ASSettingD1Ev +0x00000071012f4b24,sub_71012F4B24,52,_ZN4ksys3act9ASSettingD0Ev 0x00000071012f4b58,sub_71012F4B58,56, 0x00000071012f4b90,sub_71012F4B90,124, 0x00000071012f4c0c,sub_71012F4C0C,124, @@ -96670,11 +96670,11 @@ 0x00000071012f4ec0,sub_71012F4EC0,124, 0x00000071012f4f3c,sub_71012F4F3C,8, 0x00000071012f4f44,sub_71012F4F44,268, -0x00000071012f5050,sub_71012F5050,112, -0x00000071012f50c0,sub_71012F50C0,92, -0x00000071012f511c,j__ZdlPv_1321,4, -0x00000071012f5120,sub_71012F5120,8, -0x00000071012f5128,sub_71012F5128,372, +0x00000071012f5050,sub_71012F5050,112,_ZNK4ksys3res13ASParamParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f50c0,sub_71012F50C0,92,_ZNK4ksys3res13ASParamParser18getRuntimeTypeInfoEv +0x00000071012f511c,j__ZdlPv_1321,4,_ZN4ksys3res13ASParamParserD0Ev +0x00000071012f5120,sub_71012F5120,8,_ZN4ksys3res13ASParamParser5parseERKNS1_9ParseArgsE +0x00000071012f5128,sub_71012F5128,372,_ZN4ksys3res9ASSetting33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071012f529c,nullsub_4833,4,_ZN4ksys3res9Awareness9doCreate_EPhjPN4sead4HeapE 0x00000071012f52a0,nullsub_4834,4,_ZThn632_N4ksys3res9Awareness9doCreate_EPhjPN4sead4HeapE 0x00000071012f52a4,Bawareness::parse,5992,_ZN4ksys3res9Awareness6parse_EPhmPN4sead4HeapE diff --git a/src/KingSystem/ActorSystem/CMakeLists.txt b/src/KingSystem/ActorSystem/CMakeLists.txt index ff71baf1..2ca08b2c 100644 --- a/src/KingSystem/ActorSystem/CMakeLists.txt +++ b/src/KingSystem/ActorSystem/CMakeLists.txt @@ -50,6 +50,8 @@ target_sources(uking PRIVATE actAiQueries.h actAiRoot.cpp actAiRoot.h + actASSetting.cpp + actASSetting.h actAttention.cpp actAttention.h actBaseProc.cpp diff --git a/src/KingSystem/ActorSystem/actASSetting.cpp b/src/KingSystem/ActorSystem/actASSetting.cpp index 1dff9658..0202a85c 100644 --- a/src/KingSystem/ActorSystem/actASSetting.cpp +++ b/src/KingSystem/ActorSystem/actASSetting.cpp @@ -1 +1,31 @@ #include "KingSystem/ActorSystem/actASSetting.h" +#include "KingSystem/Resource/resLoadRequest.h" +#include "KingSystem/Resource/resResourceASSetting.h" + +namespace ksys::act { + +SEAD_SINGLETON_DISPOSER_IMPL(ASSetting) + +ASSetting::~ASSetting() = default; + +void ASSetting::init(const sead::SafeString& config_path) { + res::LoadRequest req; + req.mRequester = "ASSetting"; + req._22 = true; + mHandle.load(config_path, &req); +} + +// NON_MATCHING: sead::DirectResource to res::ASSetting cast nullptr check; branching for the return +const res::ASSetting::BoneParams* ASSetting::getBoneParams(const sead::SafeString& key) const { + auto* res = sead::DynamicCast(mHandle.getResource()); + if (!res) + return nullptr; + + for (const auto& bones : res->getBlenderBones()) { + if (key == bones.mKeyName.ref()) + return &bones.mBoneParams; + } + return nullptr; +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actASSetting.h b/src/KingSystem/ActorSystem/actASSetting.h index 79731bd6..289d68dd 100644 --- a/src/KingSystem/ActorSystem/actASSetting.h +++ b/src/KingSystem/ActorSystem/actASSetting.h @@ -1,6 +1,10 @@ #pragma once #include +#include +#include "KingSystem/Resource/resHandle.h" +#include "KingSystem/Resource/resResourceASSetting.h" +#include "KingSystem/Utils/Types.h" namespace ksys::act { @@ -8,6 +12,15 @@ namespace ksys::act { class ASSetting { SEAD_SINGLETON_DISPOSER(ASSetting) ASSetting() = default; + virtual ~ASSetting(); + +public: + void init(const sead::SafeString& config_path); + const res::ASSetting::BoneParams* getBoneParams(const sead::SafeString& key) const; + +private: + res::Handle mHandle; }; +KSYS_CHECK_SIZE_NX150(ASSetting, 0x78); } // namespace ksys::act diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index 6236e6bd..beb48433 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -142,6 +142,8 @@ target_sources(uking PRIVATE resResourceAS.h resResourceASList.cpp resResourceASList.h + resResourceASSetting.cpp + resResourceASSetting.h resResourceAttClient.cpp resResourceAttClient.h resResourceAttClientList.cpp 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& 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 diff --git a/src/KingSystem/Resource/resResourceASSetting.h b/src/KingSystem/Resource/resResourceASSetting.h new file mode 100644 index 00000000..2a6d0d02 --- /dev/null +++ b/src/KingSystem/Resource/resResourceASSetting.h @@ -0,0 +1,80 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "KingSystem/Resource/resResource.h" + +namespace ksys::res { + +class ASParamParser { + SEAD_RTTI_BASE(ASParamParser) +public: + struct ParseArgs { + void* user_data; + agl::utl::ResParameterList res_list; + sead::Heap* heap; + }; + + virtual ~ASParamParser() = default; + virtual bool parse(const ParseArgs& args) { return true; } + + agl::utl::ParameterList& getList() { return mList; } + const agl::utl::ParameterList& getList() const { return mList; } + +protected: + u32 _8 = 8; + agl::utl::ParameterList mList; +}; +KSYS_CHECK_SIZE_NX150(ASParamParser, 0x58); + +class ASSetting : public agl::utl::IParameterIO, public Resource { + SEAD_RTTI_OVERRIDE(ASSetting, Resource) + +public: + struct BoneParam { + agl::utl::ParameterObj mObj; + agl::utl::Parameter mBone; + agl::utl::Parameter mWeight; + }; + KSYS_CHECK_SIZE_NX150(BoneParam, 0x78); + + class BoneParams : public ASParamParser { + SEAD_RTTI_OVERRIDE(BoneParams, ASParamParser) + public: + ~BoneParams() override; + bool parse(const ParseArgs& args) override; + + sead::Buffer mBuffer; + }; + + struct BlenderBone { + agl::utl::ParameterList mList; + agl::utl::ParameterObj mNameParamObj; + agl::utl::Parameter mKeyName; + BoneParams mBoneParams; + }; + KSYS_CHECK_SIZE_NX150(BlenderBone, 0x108); + + ASSetting(); + ~ASSetting() override; + + void doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) override; + bool needsParse() const override { return true; } + bool parse_(u8* data, size_t size, sead::Heap* heap) override; + + const sead::Buffer& getBlenderBones() const { return mBlenderBones; } + +private: + sead::Buffer mBlenderBones; + agl::utl::ParameterList mBlenderBoneList; +}; +KSYS_CHECK_SIZE_NX150(ASSetting, 0x260); + +} // namespace ksys::res