diff --git a/data/uking_functions.csv b/data/uking_functions.csv index c15280c6..0ee7a0c8 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -4669,8 +4669,8 @@ Address,Quality,Size,Name 0x00000071000d9cf0,O,000092,_ZNK5uking6action15ChangeSceneBase18getRuntimeTypeInfoEv 0x00000071000d9d4c,U,000004,j__ZdlPv_37 0x00000071000d9d50,U,000240,_ZN4sead15FixedSafeStringILi38EEaSERKNS_14SafeStringBaseIcEE -0x00000071000d9e40,U,000004,j__ZdlPv_38 -0x00000071000d9e44,U,000240,_ZN4sead19FixedSafeStringBaseIcLi38EEaSERKNS_14SafeStringBaseIcEE +0x00000071000d9e40,O,000004,_ZN4sead15FixedSafeStringILi8EED0Ev +0x00000071000d9e44,O,000240,_ZN4sead15FixedSafeStringILi8EEaSERKNS_14SafeStringBaseIcEE 0x00000071000d9f34,O,000076,_ZN5uking6action20ChangeScheduleAnchorC1ERKN4ksys3act2ai10ActionBase7InitArgE 0x00000071000d9f80,O,000020,_ZN5uking6action20ChangeScheduleAnchorD1Ev 0x00000071000d9f94,O,000052,_ZN5uking6action20ChangeScheduleAnchorD0Ev @@ -70325,8 +70325,8 @@ Address,Quality,Size,Name 0x0000007100c7828c,U,001360, 0x0000007100c787dc,U,000636, 0x0000007100c78a58,U,000004,j__ZdlPv_830 -0x0000007100c78a5c,U,000004,j__ZdlPv_831 -0x0000007100c78a60,U,000240,_ZN4sead19FixedSafeStringBaseIcLi55EEaSERKNS_14SafeStringBaseIcEE +0x0000007100c78a5c,O,000004,_ZN4sead19FixedSafeStringBaseIcLi8EED0Ev +0x0000007100c78a60,O,000240,_ZN4sead19FixedSafeStringBaseIcLi8EEaSERKNS_14SafeStringBaseIcEE 0x0000007100c78b50,U,001068, 0x0000007100c78f7c,U,000088, 0x0000007100c78fd4,U,000096,_ZThn48_N3agl2fx7OfxBase10PresetBaseD1Ev @@ -83761,7 +83761,7 @@ Address,Quality,Size,Name 0x0000007100fb4b48,U,000104, 0x0000007100fb4bb0,U,000160, 0x0000007100fb4c50,U,000004,j__ZdlPv_1004 -0x0000007100fb4c54,U,000432, +0x0000007100fb4c54,O,000432,_ZN4sead9SafeArrayIN3agl3utl9ParameterIiEELi32EEC2Ev 0x0000007100fb4e04,U,000056, 0x0000007100fb4e3c,U,000036, 0x0000007100fb4e60,U,000016, @@ -83958,23 +83958,23 @@ Address,Quality,Size,Name 0x0000007100fc0d08,U,000048, 0x0000007100fc0d38,U,000092, 0x0000007100fc0d94,U,000008, -0x0000007100fc0d9c,U,000420, -0x0000007100fc0f40,U,000548, -0x0000007100fc1164,U,000036, -0x0000007100fc1188,U,000308,physicsParseMaterialTable -0x0000007100fc12bc,U,002660,physicsParseSubMaterialTable -0x0000007100fc1d20,U,000064, -0x0000007100fc1d60,U,000068, -0x0000007100fc1da4,U,000560, -0x0000007100fc1fd4,U,000572, -0x0000007100fc2210,U,000044, -0x0000007100fc223c,U,000096, -0x0000007100fc229c,U,000480, -0x0000007100fc247c,U,000176, -0x0000007100fc252c,U,000004,j__ZdlPv_1007 -0x0000007100fc2530,U,000664, -0x0000007100fc27c8,U,000080, -0x0000007100fc2818,U,000004,j__ZdlPv_1008 +0x0000007100fc0d9c,O,000420,_ZN4ksys4phys13MaterialTableC1Ev +0x0000007100fc0f40,O,000548,_ZN4ksys4phys13MaterialTableD1Ev +0x0000007100fc1164,O,000036,_ZN4ksys4phys13MaterialTableD0Ev +0x0000007100fc1188,O,000308,_ZN4ksys4phys13MaterialTable17loadMaterialTableEPN4sead4HeapEN3agl3utl19ResParameterArchiveE +0x0000007100fc12bc,O,002660,_ZN4ksys4phys13MaterialTable20loadSubMaterialTableEPN4sead4HeapEN3agl3utl19ResParameterArchiveE +0x0000007100fc1d20,O,000064,_ZNK4ksys4phys13MaterialTable14getSubMaterialENS0_8MaterialEi +0x0000007100fc1d60,O,000068,_ZNK4ksys4phys13MaterialTable27getSoundMatchingSubMaterialENS0_8MaterialEi +0x0000007100fc1da4,O,000560,_ZNK4ksys4phys13MaterialTable17getSubMaterialIdxENS0_8MaterialERKN4sead14SafeStringBaseIcEE +0x0000007100fc1fd4,O,000572,_ZNK4ksys4phys13MaterialTable22getSoundSubMaterialIdxENS0_8MaterialERKN4sead14SafeStringBaseIcEE +0x0000007100fc2210,O,000044,_ZNK4ksys4phys13MaterialTable18getNumSubMaterialsENS0_8MaterialE +0x0000007100fc223c,O,000096,_ZNK4ksys4phys13MaterialTable19subMaterialHasSoundENS0_8MaterialEi +0x0000007100fc229c,O,000480,_ZN4sead9SafeArrayIN3agl3utl9ParameterINS_7Vector2IfEEEELi36EEC2Ev +0x0000007100fc247c,O,000176,_ZN4ksys4phys13MaterialTable6ValuesD2Ev +0x0000007100fc252c,O,000004,_ZN4ksys4phys13MaterialTable6ValuesD0Ev +0x0000007100fc2530,O,000664,_ZN4sead9SafeArrayIN3agl3utl9ParameterINS_15FixedSafeStringILi32EEEEELi12EEC2Ev +0x0000007100fc27c8,O,000080,_ZN4ksys4phys13MaterialTable9SubValuesD2Ev +0x0000007100fc2818,O,000004,_ZN4ksys4phys13MaterialTable9SubValuesD0Ev 0x0000007100fc281c,O,000660,_ZN4ksys4phys8ParamSetC1Ev 0x0000007100fc2ab0,O,000124,_ZN4ksys4phys8ParamSetD1Ev 0x0000007100fc2b2c,O,000264,_ZN4ksys4phys8ParamSet8finalizeEv @@ -95435,25 +95435,26 @@ Address,Quality,Size,Name 0x00000071012b1c14,U,000532, 0x00000071012b1e28,U,000204, 0x00000071012b1ef4,U,000092, -0x00000071012b1f50,U,000484, -0x00000071012b2134,U,001268, -0x00000071012b2628,U,000036, +0x00000071012b1f50,m,000484,_ZN4ksys4phys10SystemDataC1Ev +0x00000071012b2134,O,000864,_ZN4ksys4phys10SystemDataD1Ev +0x00000071012b2494,O,000404,_ZN4sead9SafeArrayIN4ksys4phys10SystemData6TablesINS2_14LayerTableInfoELi32EEELi2EED2Ev +0x00000071012b2628,O,000036,_ZN4ksys4phys10SystemDataD0Ev 0x00000071012b264c,U,000368,physSystemData::x 0x00000071012b27bc,U,000544, -0x00000071012b29dc,U,000316, -0x00000071012b2b18,U,000292, -0x00000071012b2c3c,U,000284,physSystemData::x_0 -0x00000071012b2d58,U,000260,physSystemData::x_1 -0x00000071012b2e5c,U,000260,physSystemData::x_2 -0x00000071012b2f60,U,000304,physSystemData::x_3 -0x00000071012b3090,U,000260,physSystemData::x_4 -0x00000071012b3194,U,000164, -0x00000071012b3238,U,000160, -0x00000071012b32d8,U,000004,j__ZdlPv_1291 -0x00000071012b32dc,U,000480, -0x00000071012b34bc,U,000176, -0x00000071012b356c,U,000004,j__ZdlPv_1292 -0x00000071012b3570,U,000412,_ZN3aal10DeviceType5text_Ei +0x00000071012b29dc,O,000316,_ZN4ksys4phys10SystemData22loadCharacterCtrlTableEPN4sead4HeapE +0x00000071012b2b18,O,000292,_ZN4ksys4phys10SystemData22loadRagdollCtrlKeyListEPN4sead4HeapE +0x00000071012b2c3c,O,000284,_ZN4ksys4phys10SystemData17loadLayerTableResERKNS1_6TablesINS0_14LayerTableInfoELi32EEENS1_14LayerTableTypeE +0x00000071012b2d58,O,000260,_ZN4ksys4phys10SystemData20loadMaterialTableResEv +0x00000071012b2e5c,O,000260,_ZN4ksys4phys10SystemData23loadSubMaterialTableResEv +0x00000071012b2f60,O,000304,_ZN4ksys4phys10SystemData23loadContactInfoTableResENS1_14LayerTableTypeE +0x00000071012b3090,O,000260,_ZN4ksys4phys10SystemData25loadCharacterCtrlTableResEv +0x00000071012b3194,U,000164,_ZN4ksys4phys14LayerTableInfo9postRead_Ev +0x00000071012b3238,O,000160,_ZN4ksys4phys14LayerTableInfoD2Ev +0x00000071012b32d8,O,000004,_ZN4ksys4phys14LayerTableInfoD0Ev +0x00000071012b32dc,O,000480,_ZN4sead9SafeArrayIN3agl3utl9ParameterIfEELi36EEC2Ev +0x00000071012b34bc,O,000176,_ZN4ksys4phys24CharacterControllerTableD2Ev +0x00000071012b356c,O,000004,_ZN4ksys4phys24CharacterControllerTableD0Ev +0x00000071012b3570,O,000412,_ZN4ksys4phys24CharacterControllerTable4Type5text_Ei 0x00000071012b370c,U,000152, 0x00000071012b37a4,U,000420, 0x00000071012b3948,U,000908, diff --git a/lib/sead b/lib/sead index 533d0500..9b27a60d 160000 --- a/lib/sead +++ b/lib/sead @@ -1 +1 @@ -Subproject commit 533d050068a36d0c3fa08f6f15b603fbe659a304 +Subproject commit 9b27a60debe968949e19e99ec4c9ad0ca6ff91a9 diff --git a/src/KingSystem/Physics/CMakeLists.txt b/src/KingSystem/Physics/CMakeLists.txt index b4f8d18b..f1f7e050 100644 --- a/src/KingSystem/Physics/CMakeLists.txt +++ b/src/KingSystem/Physics/CMakeLists.txt @@ -24,12 +24,16 @@ target_sources(uking PRIVATE System/physContactInfoParam.h System/physDefines.cpp System/physDefines.h + System/physMaterialTable.cpp + System/physMaterialTable.h System/physParamSet.cpp System/physParamSet.h System/physRagdollControllerKeyList.h System/physRagdollControllerKeyList.cpp System/physShapeParam.cpp System/physShapeParam.h + System/physSystemData.cpp + System/physSystemData.h System/physUserTag.cpp System/physUserTag.h ) diff --git a/src/KingSystem/Physics/System/physMaterialTable.cpp b/src/KingSystem/Physics/System/physMaterialTable.cpp new file mode 100644 index 00000000..50bfe70f --- /dev/null +++ b/src/KingSystem/Physics/System/physMaterialTable.cpp @@ -0,0 +1,124 @@ +#include "KingSystem/Physics/System/physMaterialTable.h" +#include + +namespace ksys::phys { + +MaterialTable::MaterialTable() = default; + +MaterialTable::~MaterialTable() = default; + +void MaterialTable::loadMaterialTable(sead::Heap* heap, agl::utl::ResParameterArchive archive) { + addMaterialTableList("MaterialTable"); + + for (int i = 0; i < Material::size(); ++i) { + const char* material_name = materialToText(i); + auto& obj = mMaterialTable[i]; + mMaterialTablePList.addObj(&obj, material_name); + + for (int j = 0; j < Material::size(); ++j) { + const char* target_name = materialToText(j); + obj.values[j].init(sead::Vector2f::zero, target_name, target_name, &obj); + } + } + + mMaterialTablePIO.applyResParameterArchive(archive); +} + +void MaterialTable::loadSubMaterialTable(sead::Heap* heap, agl::utl::ResParameterArchive archive) { + addSubMaterialTableList("SubMaterialTable"); + + const auto SubMaterialTable = archive.getRootList().getResParameterList(0); + + auto* str_heap = sead::FrameHeap::create( + 0, "SubMaterialString", heap, 8, sead::Heap::HeapDirection::cHeapDirection_Forward, false); + + for (int i = 0; i < Material::size() && i < SubMaterialTable.getResParameterObjNum(); ++i) { + const char* material_name = materialToText(i); + auto& obj = mSubMaterialTable[i]; + mSubMaterialTablePList.addObj(&obj, material_name); + obj.num_values = SubMaterialTable.getResParameterObj(i).getNum(); + + for (int submat = 0; submat < obj.values.size(); ++submat) { + auto* key = new (str_heap) sead::FormatFixedSafeString<32>("submat_%d", submat); + obj.values[submat].init(sead::SafeString::cEmptyString, *key, *key, &obj); + } + } + + if (archive.getRootList().getResParameterListNum() >= 2) { + mSubMaterialTablePIO.addList(&mSoundSubMaterialTablePList, "SoundSubMaterialTable"); + for (int i = 0; i < Material::size() && i < SubMaterialTable.getResParameterObjNum(); ++i) { + const char* material_name = materialToText(i); + auto& obj = mSoundSubMaterialTable[i]; + mSoundSubMaterialTablePList.addObj(&obj, material_name); + obj.num_values = SubMaterialTable.getResParameterObj(i).getNum(); + + for (int submat = 0; submat < obj.values.size(); ++submat) { + auto* key = new (str_heap) sead::FormatFixedSafeString<32>("submat_%d", submat); + obj.values[submat].init(sead::SafeString::cEmptyString, *key, *key, &obj); + } + } + } + + if (archive.getRootList().getResParameterListNum() >= 3) { + mSubMaterialTablePIO.addList(&mSoundMatchingSubMaterialTablePList, + "SoundMatchingSubMaterialTable"); + const auto list = archive.getRootList().getResParameterList(2); + for (int i = 0; i < Material::size() && i < list.getResParameterObjNum(); ++i) { + const char* material_name = materialToText(i); + auto& obj = mSoundMatchingSubMaterialTable[i]; + mSoundMatchingSubMaterialTablePList.addObj(&obj, material_name); + obj.num_values = list.getResParameterObj(i).getNum(); + + for (int submat = 0; submat < obj.values.size(); ++submat) { + auto* key = new (str_heap) sead::FormatFixedSafeString<32>("submat_%d", submat); + obj.values[submat].init(sead::SafeString::cEmptyString, *key, *key, &obj); + } + } + } + + str_heap->adjust(); + mSubMaterialTablePIO.applyResParameterArchive(archive); +} + +const sead::SafeString& MaterialTable::getSubMaterial(Material material, int submat_idx) const { + return mSubMaterialTable[material].values[submat_idx].ref(); +} + +const sead::SafeString& MaterialTable::getSoundMatchingSubMaterial(Material material, + int submat_idx) const { + return mSoundMatchingSubMaterialTable[material].values[submat_idx].ref(); +} + +static int getSubMaterialIdx_(const MaterialTable::SubValues& table, Material material, + const sead::SafeString& submat_name) { + for (int i = 0; i < table.num_values; ++i) { + if (submat_name == table.values[i].ref()) + return i; + } + + if (submat_name == sead::SafeString::cEmptyString) + return 0; + + return -1; +} + +int MaterialTable::getSubMaterialIdx(Material material, const sead::SafeString& submat_name) const { + const auto& table = mSubMaterialTable[material]; + return getSubMaterialIdx_(table, material, submat_name); +} + +int MaterialTable::getSoundSubMaterialIdx(Material material, + const sead::SafeString& submat_name) const { + const auto& table = mSoundSubMaterialTable[material]; + return getSubMaterialIdx_(table, material, submat_name); +} + +int MaterialTable::getNumSubMaterials(Material material) const { + return mSubMaterialTable[material].num_values; +} + +bool MaterialTable::subMaterialHasSound(Material material, int submat_idx) const { + return getSoundSubMaterialIdx(material, getSubMaterial(material, submat_idx)) != -1; +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/System/physMaterialTable.h b/src/KingSystem/Physics/System/physMaterialTable.h new file mode 100644 index 00000000..04240b0d --- /dev/null +++ b/src/KingSystem/Physics/System/physMaterialTable.h @@ -0,0 +1,67 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include "KingSystem/Physics/System/physDefines.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::phys { + +class MaterialTable { +public: + struct Values : agl::utl::IParameterObj { + sead::SafeArray, Material::size()> values; + }; + KSYS_CHECK_SIZE_NX150(Values, 0x4b0); + + struct SubValues : agl::utl::IParameterObj { + sead::SafeArray>, 12> values; + int num_values; + }; + KSYS_CHECK_SIZE_NX150(SubValues, 0x3f8); + + MaterialTable(); + virtual ~MaterialTable(); + + void loadMaterialTable(sead::Heap* heap, agl::utl::ResParameterArchive archive); + void loadSubMaterialTable(sead::Heap* heap, agl::utl::ResParameterArchive archive); + + const sead::SafeString& getSubMaterial(Material material, int submat_idx) const; + const sead::SafeString& getSoundMatchingSubMaterial(Material material, int submat_idx) const; + + int getSubMaterialIdx(Material material, const sead::SafeString& submat_name) const; + int getSoundSubMaterialIdx(Material material, const sead::SafeString& submat_name) const; + + int getNumSubMaterials(Material material) const; + bool subMaterialHasSound(Material material, int submat_idx) const; + +private: + void addMaterialTableList(const char* name) { + mMaterialTablePIO.addList(&mMaterialTablePList, name); + } + + void addSubMaterialTableList(const char* name) { + mSubMaterialTablePIO.addList(&mSubMaterialTablePList, name); + } + + agl::utl::IParameterIO mMaterialTablePIO; + agl::utl::ParameterList mMaterialTablePList; + sead::SafeArray mMaterialTable; + + agl::utl::IParameterIO mSubMaterialTablePIO; + agl::utl::ParameterList mSubMaterialTablePList; + sead::SafeArray mSubMaterialTable; + + agl::utl::ParameterList mSoundSubMaterialTablePList; + sead::SafeArray mSoundSubMaterialTable; + + agl::utl::ParameterList mSoundMatchingSubMaterialTablePList; + sead::SafeArray mSoundMatchingSubMaterialTable; +}; +KSYS_CHECK_SIZE_NX150(MaterialTable, 0x25a28); + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/System/physSystemData.cpp b/src/KingSystem/Physics/System/physSystemData.cpp new file mode 100644 index 00000000..097b6a4b --- /dev/null +++ b/src/KingSystem/Physics/System/physSystemData.cpp @@ -0,0 +1,152 @@ +#include "KingSystem/Physics/System/physSystemData.h" +#include "KingSystem/Physics/System/physMaterialTable.h" +#include "KingSystem/Physics/System/physRagdollControllerKeyList.h" +#include "KingSystem/Resource/resHandle.h" +#include "KingSystem/Resource/resLoadRequest.h" + +namespace ksys::phys { + +SystemData::SystemData() = default; + +template +static void deleteAndNull(T*& ptr) { + if (ptr) { + delete ptr; + ptr = nullptr; + } +} + +SystemData::~SystemData() { + deleteAndNull(mMaterialTableHandle); + deleteAndNull(mSubMaterialTableHandle); + + deleteAndNull(mLayerTableInfo[0].mResHandle); + deleteAndNull(mContactInfoTableHandles[0]); + + deleteAndNull(mLayerTableInfo[1].mResHandle); + deleteAndNull(mContactInfoTableHandles[1]); + + deleteAndNull(mCharacterCtrlTable.mResHandle); + + if (auto*& handle = mRagdollCtrlKeyListHandle) { + delete handle; + handle = nullptr; + mRagdollCtrlKeyList = nullptr; + } +} + +void SystemData::load(sead::Heap* heap, LayerTable* entity_layer_table, + LayerTable* sensor_layer_table, MaterialTable* material_table, + ContactInfoTable* contact_info_table) { + loadLayerTable(heap, entity_layer_table, LayerTableType::Entity); + loadLayerTable(heap, sensor_layer_table, LayerTableType::Sensor); + loadMaterialTable(heap, material_table); + loadSubMaterialTable(heap, material_table); + loadContactInfoTable(heap, contact_info_table, LayerTableType::Entity); + loadContactInfoTable(heap, contact_info_table, LayerTableType::Sensor); + loadCharacterCtrlTable(heap); + loadRagdollCtrlKeyList(heap); +} + +void SystemData::loadMaterialTable(sead::Heap* heap, MaterialTable* table) { + mMaterialTableHandle = new (heap) res::Handle; + const auto res = loadMaterialTableRes(); + table->loadMaterialTable(heap, res); +} + +void SystemData::loadCharacterCtrlTable(sead::Heap* heap) { + mCharacterCtrlTable.addList("CharacterControllerTable"); + + auto& obj = mCharacterCtrlTable.mTables[0]; + mCharacterCtrlTable.mParamList.addObj( + &obj, CharacterControllerTable::Type(CharacterControllerTable::Type::Default).text()); + + for (int i = 0; i < Material::size(); ++i) { + const char* material_text = materialToText(i); + obj.params[i].init(0.0, material_text, material_text, &obj); + } + + mCharacterCtrlTable.mResHandle = new (heap) res::Handle; + const auto res = loadCharacterCtrlTableRes(); + mCharacterCtrlTable.mParamIO.applyResParameterArchive(res); +} + +void SystemData::loadRagdollCtrlKeyList(sead::Heap* heap) { + mRagdollCtrlKeyListHandle = new (heap) res::Handle; + + res::LoadRequest request; + request.mRequester = "physSystemData"; + const char* path = "Physics/System/RagdollControllerKeyList.brgcon"; + auto* res = mRagdollCtrlKeyListHandle->load(path, &request); + mRagdollCtrlKeyList = sead::DynamicCast(res); +} + +agl::utl::ResParameterArchive +SystemData::loadLayerTableRes(const SystemData::LayerTableInfoContainer& container, + SystemData::LayerTableType type) { + res::LoadRequest request; + request.mRequester = "physSystemData"; + const char* path{}; + switch (type) { + case LayerTableType::Entity: + path = "Physics/System/EntityLayerTable.bphyslayer"; + break; + case LayerTableType::Sensor: + path = "Physics/System/SensorLayerTable.bphyslayer"; + break; + } + const auto& resource = *container.mResHandle->load(path, &request); + auto* direct_resource = sead::DynamicCast(&resource); + return agl::utl::ResParameterArchive{direct_resource->getRawData()}; +} + +agl::utl::ResParameterArchive SystemData::loadMaterialTableRes() { + res::LoadRequest request; + request.mRequester = "physSystemData"; + const char* path = "Physics/System/PhysicsMaterialTable.bphysmaterial"; + const auto& resource = *mMaterialTableHandle->load(path, &request); + auto* direct_resource = sead::DynamicCast(&resource); + return agl::utl::ResParameterArchive{direct_resource->getRawData()}; +} + +agl::utl::ResParameterArchive SystemData::loadSubMaterialTableRes() { + res::LoadRequest request; + request.mRequester = "physSystemData"; + const char* path = "Physics/System/PhysicsSubMaterialTable.bphyssubmat"; + const auto& resource = *mSubMaterialTableHandle->load(path, &request); + auto* direct_resource = sead::DynamicCast(&resource); + return agl::utl::ResParameterArchive{direct_resource->getRawData()}; +} + +agl::utl::ResParameterArchive SystemData::loadContactInfoTableRes(SystemData::LayerTableType type) { + res::LoadRequest request; + request.mRequester = "physSystemData"; + const char* path{}; + switch (type) { + case LayerTableType::Entity: + path = "Physics/System/EntityContactInfoTable.bphyscontact"; + break; + case LayerTableType::Sensor: + path = "Physics/System/SensorContactInfoTable.bphyscontact"; + break; + } + /// @bug Possible bug? The request is never used. + const auto& resource = *mContactInfoTableHandles[int(type)]->load(path, nullptr); + auto* direct_resource = sead::DynamicCast(&resource); + return agl::utl::ResParameterArchive{direct_resource->getRawData()}; +} + +agl::utl::ResParameterArchive SystemData::loadCharacterCtrlTableRes() { + res::LoadRequest request; + request.mRequester = "physSystemData"; + const char* path = "Physics/System/CharacterControllerTable.bphyscharcon"; + const auto& resource = *mCharacterCtrlTable.mResHandle->load(path, &request); + auto* direct_resource = sead::DynamicCast(&resource); + return agl::utl::ResParameterArchive{direct_resource->getRawData()}; +} + +void LayerTableInfo::postRead_() { + // FIXME +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/System/physSystemData.h b/src/KingSystem/Physics/System/physSystemData.h new file mode 100644 index 00000000..9d119655 --- /dev/null +++ b/src/KingSystem/Physics/System/physSystemData.h @@ -0,0 +1,101 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include "KingSystem/Physics/System/physDefines.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::res { +class Handle; +} + +namespace ksys::phys { + +class ContactInfoTable; +class LayerTable; +class MaterialTable; +class RagdollControllerKeyList; + +constexpr int NumLayers = 32; + +struct LayerTableInfo : agl::utl::IParameterObj { + sead::SafeArray, NumLayers> params; + void* table; + int idx = 0; + int count; + +protected: + void postRead_() override; +}; +KSYS_CHECK_SIZE_NX150(LayerTableInfo, 0x440); + +struct CharacterControllerTable : agl::utl::IParameterObj { + SEAD_ENUM(Type, Default) + + sead::SafeArray, Material::size()> params; +}; +KSYS_CHECK_SIZE_NX150(CharacterControllerTable, 0x4b0); + +class SystemData { +public: + template + class Tables { + public: + auto& Entries() { return mTables; } + const auto& Entries() const { return mTables; } + + private: + friend class SystemData; + + void addList(const char* name) { mParamIO.addList(&mParamList, name); } + + sead::SafeArray mTables; + agl::utl::ParameterList mParamList; + agl::utl::IParameterIO mParamIO; + res::Handle* mResHandle = nullptr; + }; + + SystemData(); + virtual ~SystemData(); + + void load(sead::Heap* heap, LayerTable* entity_layer_table, LayerTable* sensor_layer_table, + MaterialTable* material_table, ContactInfoTable* contact_info_table); + +private: + enum class LayerTableType { + Entity, + Sensor, + }; + + using LayerTableInfoContainer = Tables; + + void loadLayerTable(sead::Heap* heap, LayerTable* table, LayerTableType type); + void loadMaterialTable(sead::Heap* heap, MaterialTable* table); + void loadSubMaterialTable(sead::Heap* heap, MaterialTable* table); + void loadContactInfoTable(sead::Heap* heap, ContactInfoTable* table, LayerTableType type); + void loadCharacterCtrlTable(sead::Heap* heap); + void loadRagdollCtrlKeyList(sead::Heap* heap); + + agl::utl::ResParameterArchive loadLayerTableRes(const LayerTableInfoContainer& container, + LayerTableType type); + agl::utl::ResParameterArchive loadMaterialTableRes(); + agl::utl::ResParameterArchive loadSubMaterialTableRes(); + agl::utl::ResParameterArchive loadContactInfoTableRes(LayerTableType type); + agl::utl::ResParameterArchive loadCharacterCtrlTableRes(); + + sead::SafeArray mLayerTableInfo{}; + res::Handle* mMaterialTableHandle{}; + res::Handle* mSubMaterialTableHandle{}; + sead::SafeArray mContactInfoTableHandles{}; + Tables mCharacterCtrlTable; + RagdollControllerKeyList* mRagdollCtrlKeyList{}; + res::Handle* mRagdollCtrlKeyListHandle{}; +}; +KSYS_CHECK_SIZE_NX150(SystemData, 0x11b48); + +} // namespace ksys::phys