summaryrefslogtreecommitdiff
path: root/src/KingSystem
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-10-30 12:38:27 +0200
committerLéo Lam <leo@leolam.fr>2021-10-30 16:17:39 +0200
commitd10dd65dcd371c87012b31700a871a8d6c5a9aa1 (patch)
treee054c0b585b6daead48586330bc348bc58cf3c16 /src/KingSystem
parent70aaa429fe82098d954d0945bfb1b8253a7fa45a (diff)
ksys/phys: Add some prerequisites for ContactInfoTable
Diffstat (limited to 'src/KingSystem')
-rw-r--r--src/KingSystem/Physics/CMakeLists.txt2
-rw-r--r--src/KingSystem/Physics/System/physContactInfoTable.cpp1
-rw-r--r--src/KingSystem/Physics/System/physContactInfoTable.h23
-rw-r--r--src/KingSystem/Physics/System/physDefines.cpp11
-rw-r--r--src/KingSystem/Physics/System/physDefines.h8
-rw-r--r--src/KingSystem/Physics/System/physSystemData.cpp34
-rw-r--r--src/KingSystem/Physics/System/physSystemData.h13
7 files changed, 72 insertions, 20 deletions
diff --git a/src/KingSystem/Physics/CMakeLists.txt b/src/KingSystem/Physics/CMakeLists.txt
index f1f7e050..7f2b64b9 100644
--- a/src/KingSystem/Physics/CMakeLists.txt
+++ b/src/KingSystem/Physics/CMakeLists.txt
@@ -22,6 +22,8 @@ target_sources(uking PRIVATE
System/physConstraint.h
System/physContactInfoParam.cpp
System/physContactInfoParam.h
+ System/physContactInfoTable.cpp
+ System/physContactInfoTable.h
System/physDefines.cpp
System/physDefines.h
System/physMaterialTable.cpp
diff --git a/src/KingSystem/Physics/System/physContactInfoTable.cpp b/src/KingSystem/Physics/System/physContactInfoTable.cpp
new file mode 100644
index 00000000..637cf21f
--- /dev/null
+++ b/src/KingSystem/Physics/System/physContactInfoTable.cpp
@@ -0,0 +1 @@
+#include "KingSystem/Physics/System/physContactInfoTable.h"
diff --git a/src/KingSystem/Physics/System/physContactInfoTable.h b/src/KingSystem/Physics/System/physContactInfoTable.h
new file mode 100644
index 00000000..84fc8b0a
--- /dev/null
+++ b/src/KingSystem/Physics/System/physContactInfoTable.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <agl/Utils/aglResParameter.h>
+#include "KingSystem/Physics/System/physDefines.h"
+
+namespace sead {
+class Heap;
+}
+
+namespace ksys::phys {
+
+// FIXME
+class ContactInfoTable {
+public:
+ ContactInfoTable();
+ virtual ~ContactInfoTable();
+
+ void init(sead::Heap* heap);
+
+ void load(sead::Heap* heap, agl::utl::ResParameterArchive archive, ContactLayerType type);
+};
+
+} // namespace ksys::phys
diff --git a/src/KingSystem/Physics/System/physDefines.cpp b/src/KingSystem/Physics/System/physDefines.cpp
index 16cb9503..94fd34d3 100644
--- a/src/KingSystem/Physics/System/physDefines.cpp
+++ b/src/KingSystem/Physics/System/physDefines.cpp
@@ -12,6 +12,17 @@ u32 makeContactLayerMask(ContactLayer layer) {
return 1 << (layer - ContactLayer::SensorObject);
}
+u32 getContactLayerBase(ContactLayerType type) {
+ if (type == ContactLayerType::Entity)
+ return ContactLayer::EntityObject;
+ return ContactLayer::SensorObject;
+}
+
+u32 getContactLayerBaseRelativeValue(ContactLayer layer) {
+ return layer - (layer < ContactLayer::SensorObject ? ContactLayer::EntityObject :
+ ContactLayer::SensorObject);
+}
+
const char* contactLayerToText(ContactLayer layer) {
return layer.text();
}
diff --git a/src/KingSystem/Physics/System/physDefines.h b/src/KingSystem/Physics/System/physDefines.h
index 4dd56af1..4105db15 100644
--- a/src/KingSystem/Physics/System/physDefines.h
+++ b/src/KingSystem/Physics/System/physDefines.h
@@ -5,6 +5,11 @@
namespace ksys::phys {
+enum class ContactLayerType {
+ Entity,
+ Sensor,
+};
+
SEAD_ENUM(ContactLayer,
EntityObject,\
EntitySmallObject,\
@@ -161,7 +166,8 @@ enum class MotionType {
bool isSensorLayer(ContactLayer layer);
u32 makeContactLayerMask(ContactLayer layer);
-
+u32 getContactLayerBase(ContactLayerType type);
+u32 getContactLayerBaseRelativeValue(ContactLayer layer);
const char* contactLayerToText(ContactLayer layer);
ContactLayer contactLayerFromText(const sead::SafeString& text);
diff --git a/src/KingSystem/Physics/System/physSystemData.cpp b/src/KingSystem/Physics/System/physSystemData.cpp
index 097b6a4b..41f3845e 100644
--- a/src/KingSystem/Physics/System/physSystemData.cpp
+++ b/src/KingSystem/Physics/System/physSystemData.cpp
@@ -1,4 +1,5 @@
#include "KingSystem/Physics/System/physSystemData.h"
+#include "KingSystem/Physics/System/physContactInfoTable.h"
#include "KingSystem/Physics/System/physMaterialTable.h"
#include "KingSystem/Physics/System/physRagdollControllerKeyList.h"
#include "KingSystem/Resource/resHandle.h"
@@ -38,12 +39,12 @@ SystemData::~SystemData() {
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);
+ loadLayerTable(heap, entity_layer_table, ContactLayerType::Entity);
+ loadLayerTable(heap, sensor_layer_table, ContactLayerType::Sensor);
loadMaterialTable(heap, material_table);
loadSubMaterialTable(heap, material_table);
- loadContactInfoTable(heap, contact_info_table, LayerTableType::Entity);
- loadContactInfoTable(heap, contact_info_table, LayerTableType::Sensor);
+ loadContactInfoTable(heap, contact_info_table, ContactLayerType::Entity);
+ loadContactInfoTable(heap, contact_info_table, ContactLayerType::Sensor);
loadCharacterCtrlTable(heap);
loadRagdollCtrlKeyList(heap);
}
@@ -54,6 +55,19 @@ void SystemData::loadMaterialTable(sead::Heap* heap, MaterialTable* table) {
table->loadMaterialTable(heap, res);
}
+void SystemData::loadSubMaterialTable(sead::Heap* heap, MaterialTable* table) {
+ mSubMaterialTableHandle = new (heap) res::Handle;
+ const auto res = loadSubMaterialTableRes();
+ table->loadSubMaterialTable(heap, res);
+}
+
+void SystemData::loadContactInfoTable(sead::Heap* heap, ContactInfoTable* table,
+ ContactLayerType type) {
+ mContactInfoTableHandles[int(type)] = new (heap) res::Handle;
+ const auto res = loadContactInfoTableRes(type);
+ table->load(heap, res, type);
+}
+
void SystemData::loadCharacterCtrlTable(sead::Heap* heap) {
mCharacterCtrlTable.addList("CharacterControllerTable");
@@ -83,15 +97,15 @@ void SystemData::loadRagdollCtrlKeyList(sead::Heap* heap) {
agl::utl::ResParameterArchive
SystemData::loadLayerTableRes(const SystemData::LayerTableInfoContainer& container,
- SystemData::LayerTableType type) {
+ ContactLayerType type) {
res::LoadRequest request;
request.mRequester = "physSystemData";
const char* path{};
switch (type) {
- case LayerTableType::Entity:
+ case ContactLayerType::Entity:
path = "Physics/System/EntityLayerTable.bphyslayer";
break;
- case LayerTableType::Sensor:
+ case ContactLayerType::Sensor:
path = "Physics/System/SensorLayerTable.bphyslayer";
break;
}
@@ -118,15 +132,15 @@ agl::utl::ResParameterArchive SystemData::loadSubMaterialTableRes() {
return agl::utl::ResParameterArchive{direct_resource->getRawData()};
}
-agl::utl::ResParameterArchive SystemData::loadContactInfoTableRes(SystemData::LayerTableType type) {
+agl::utl::ResParameterArchive SystemData::loadContactInfoTableRes(ContactLayerType type) {
res::LoadRequest request;
request.mRequester = "physSystemData";
const char* path{};
switch (type) {
- case LayerTableType::Entity:
+ case ContactLayerType::Entity:
path = "Physics/System/EntityContactInfoTable.bphyscontact";
break;
- case LayerTableType::Sensor:
+ case ContactLayerType::Sensor:
path = "Physics/System/SensorContactInfoTable.bphyscontact";
break;
}
diff --git a/src/KingSystem/Physics/System/physSystemData.h b/src/KingSystem/Physics/System/physSystemData.h
index 9d119655..4392727b 100644
--- a/src/KingSystem/Physics/System/physSystemData.h
+++ b/src/KingSystem/Physics/System/physSystemData.h
@@ -67,25 +67,20 @@ public:
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 loadLayerTable(sead::Heap* heap, LayerTable* table, ContactLayerType 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 loadContactInfoTable(sead::Heap* heap, ContactInfoTable* table, ContactLayerType type);
void loadCharacterCtrlTable(sead::Heap* heap);
void loadRagdollCtrlKeyList(sead::Heap* heap);
agl::utl::ResParameterArchive loadLayerTableRes(const LayerTableInfoContainer& container,
- LayerTableType type);
+ ContactLayerType type);
agl::utl::ResParameterArchive loadMaterialTableRes();
agl::utl::ResParameterArchive loadSubMaterialTableRes();
- agl::utl::ResParameterArchive loadContactInfoTableRes(LayerTableType type);
+ agl::utl::ResParameterArchive loadContactInfoTableRes(ContactLayerType type);
agl::utl::ResParameterArchive loadCharacterCtrlTableRes();
sead::SafeArray<LayerTableInfoContainer, 2> mLayerTableInfo{};