mirror of https://github.com/zeldaret/botw.git
ksys/phys: Start adding SystemData
- SystemData (WIP) - MaterialTable (should be complete)
This commit is contained in:
parent
5580b49345
commit
70aaa429fe
|
@ -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.
|
2
lib/sead
2
lib/sead
|
@ -1 +1 @@
|
|||
Subproject commit 533d050068a36d0c3fa08f6f15b603fbe659a304
|
||||
Subproject commit 9b27a60debe968949e19e99ec4c9ad0ca6ff91a9
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue