diff options
Diffstat (limited to 'src/KingSystem/Physics/System/physSystemData.cpp')
| -rw-r--r-- | src/KingSystem/Physics/System/physSystemData.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
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 <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 |
