ksys/phys: Start adding SystemData

- SystemData (WIP)
- MaterialTable (should be complete)
This commit is contained in:
Léo Lam 2021-10-28 20:48:35 +02:00
parent 5580b49345
commit 70aaa429fe
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
7 changed files with 489 additions and 40 deletions

View File

@ -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,

Can't render this file because it is too large.

@ -1 +1 @@
Subproject commit 533d050068a36d0c3fa08f6f15b603fbe659a304
Subproject commit 9b27a60debe968949e19e99ec4c9ad0ca6ff91a9

View File

@ -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
)

View File

@ -0,0 +1,124 @@
#include "KingSystem/Physics/System/physMaterialTable.h"
#include <heap/seadFrameHeap.h>
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

View File

@ -0,0 +1,67 @@
#pragma once
#include <agl/Utils/aglParameter.h>
#include <agl/Utils/aglParameterIO.h>
#include <agl/Utils/aglParameterList.h>
#include <agl/Utils/aglParameterObj.h>
#include <agl/Utils/aglResParameter.h>
#include <container/seadSafeArray.h>
#include "KingSystem/Physics/System/physDefines.h"
#include "KingSystem/Utils/Types.h"
namespace ksys::phys {
class MaterialTable {
public:
struct Values : agl::utl::IParameterObj {
sead::SafeArray<agl::utl::Parameter<sead::Vector2f>, Material::size()> values;
};
KSYS_CHECK_SIZE_NX150(Values, 0x4b0);
struct SubValues : agl::utl::IParameterObj {
sead::SafeArray<agl::utl::Parameter<sead::FixedSafeString<32>>, 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<Values, Material::size()> mMaterialTable;
agl::utl::IParameterIO mSubMaterialTablePIO;
agl::utl::ParameterList mSubMaterialTablePList;
sead::SafeArray<SubValues, Material::size()> mSubMaterialTable;
agl::utl::ParameterList mSoundSubMaterialTablePList;
sead::SafeArray<SubValues, Material::size()> mSoundSubMaterialTable;
agl::utl::ParameterList mSoundMatchingSubMaterialTablePList;
sead::SafeArray<SubValues, Material::size()> mSoundMatchingSubMaterialTable;
};
KSYS_CHECK_SIZE_NX150(MaterialTable, 0x25a28);
} // namespace ksys::phys

View File

@ -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 <typename T>
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<RagdollControllerKeyList>(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<const sead::DirectResource>(&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<const sead::DirectResource>(&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<const sead::DirectResource>(&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<const sead::DirectResource>(&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<const sead::DirectResource>(&resource);
return agl::utl::ResParameterArchive{direct_resource->getRawData()};
}
void LayerTableInfo::postRead_() {
// FIXME
}
} // namespace ksys::phys

View File

@ -0,0 +1,101 @@
#pragma once
#include <agl/Utils/aglParameter.h>
#include <agl/Utils/aglParameterIO.h>
#include <agl/Utils/aglParameterList.h>
#include <agl/Utils/aglParameterObj.h>
#include <agl/Utils/aglResParameter.h>
#include <container/seadSafeArray.h>
#include <prim/seadEnum.h>
#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<agl::utl::Parameter<int>, 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<agl::utl::Parameter<float>, Material::size()> params;
};
KSYS_CHECK_SIZE_NX150(CharacterControllerTable, 0x4b0);
class SystemData {
public:
template <typename Table, int Count>
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<Table, Count> 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<LayerTableInfo, NumLayers>;
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<LayerTableInfoContainer, 2> mLayerTableInfo{};
res::Handle* mMaterialTableHandle{};
res::Handle* mSubMaterialTableHandle{};
sead::SafeArray<res::Handle*, 2> mContactInfoTableHandles{};
Tables<CharacterControllerTable, 1> mCharacterCtrlTable;
RagdollControllerKeyList* mRagdollCtrlKeyList{};
res::Handle* mRagdollCtrlKeyListHandle{};
};
KSYS_CHECK_SIZE_NX150(SystemData, 0x11b48);
} // namespace ksys::phys