summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBody.cpp12
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBody.h12
-rw-r--r--src/KingSystem/Physics/System/physCollisionInfo.h1
-rw-r--r--src/KingSystem/Physics/System/physContactListener.cpp4
-rw-r--r--src/KingSystem/Physics/System/physSystem.h3
5 files changed, 24 insertions, 8 deletions
diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
index 9ec4ffe2..71746819 100644
--- a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
+++ b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
@@ -16,6 +16,7 @@
#include "KingSystem/Physics/RigidBody/physRigidBodyMotionSensor.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h"
+#include "KingSystem/Physics/System/physCollisionInfo.h"
#include "KingSystem/Physics/System/physEntityGroupFilter.h"
#include "KingSystem/Physics/System/physGroupFilter.h"
#include "KingSystem/Physics/System/physSensorGroupFilter.h"
@@ -473,6 +474,17 @@ void RigidBody::x_10() {
x_8(nullptr);
}
+void RigidBody::setCollisionInfo(CollisionInfo* info) {
+ if (mCollisionInfo != info) {
+ if (mCollisionInfo && isFlag8Set())
+ System::instance()->registerRigidBodyForContactSystem(this);
+ mCollisionInfo = info;
+ }
+
+ if (isFlag8Set() && mCollisionInfo && !mCollisionInfo->isLinked())
+ System::instance()->registerCollisionInfo(mCollisionInfo);
+}
+
void RigidBody::setContactPointInfo(ContactPointInfo* info) {
mContactPointInfo = info;
if (isFlag8Set() && mContactPointInfo && !mContactPointInfo->isLinked())
diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.h b/src/KingSystem/Physics/RigidBody/physRigidBody.h
index 5cd3cd40..3f219a4e 100644
--- a/src/KingSystem/Physics/RigidBody/physRigidBody.h
+++ b/src/KingSystem/Physics/RigidBody/physRigidBody.h
@@ -24,11 +24,12 @@ class hkpMotion;
namespace ksys::phys {
+class CollisionInfo;
+class ContactPointInfo;
class MotionAccessor;
struct RigidBodyInstanceParam;
class RigidBodyMotionEntity;
class RigidBodyMotionSensor;
-class ContactPointInfo;
class SystemGroupHandler;
class UserTag;
@@ -187,10 +188,9 @@ public:
// 0x0000007100f8e3fc
void x_11();
- // TODO: rename
- void* get90() const { return _90; }
- // 0x0000007100f8e72c
- void x_12_setField90(void* field_90);
+ CollisionInfo* getCollisionInfo() const { return mCollisionInfo; }
+ void setCollisionInfo(CollisionInfo* info);
+
ContactPointInfo* getContactPointInfo() const { return mContactPointInfo; }
void setContactPointInfo(ContactPointInfo* info);
@@ -584,7 +584,7 @@ protected:
hkpRigidBody* mHkBody;
UserTag* mUserTag = nullptr;
ContactPointInfo* mContactPointInfo = nullptr;
- void* _90 = nullptr;
+ CollisionInfo* mCollisionInfo = nullptr;
u16 _98 = 0;
RigidBodyAccessor mRigidBodyAccessor;
f32 mScale = 1.0f;
diff --git a/src/KingSystem/Physics/System/physCollisionInfo.h b/src/KingSystem/Physics/System/physCollisionInfo.h
index 81b28576..7a96a2fe 100644
--- a/src/KingSystem/Physics/System/physCollisionInfo.h
+++ b/src/KingSystem/Physics/System/physCollisionInfo.h
@@ -36,6 +36,7 @@ public:
explicit CollisionInfo(const sead::SafeString& name);
~CollisionInfo() override;
+ bool isLinked() const { return mListNode.isLinked(); }
static constexpr size_t getListNodeOffset() { return offsetof(CollisionInfo, mListNode); }
private:
diff --git a/src/KingSystem/Physics/System/physContactListener.cpp b/src/KingSystem/Physics/System/physContactListener.cpp
index 4a2a72aa..7fbd3c56 100644
--- a/src/KingSystem/Physics/System/physContactListener.cpp
+++ b/src/KingSystem/Physics/System/physContactListener.cpp
@@ -98,10 +98,10 @@ void ContactListener::handleCollisionRemoved(const hkpCollisionEvent& event, Rig
const auto layer_a = body_a->getContactLayer();
const auto layer_b = body_b->getContactLayer();
- if (auto* unk = body_a->get90())
+ if (auto* unk = body_a->getCollisionInfo())
mMgr->x_19(unk, body_a, body_b);
- if (auto* unk = body_b->get90())
+ if (auto* unk = body_b->getCollisionInfo())
mMgr->x_19(unk, body_b, body_a);
const auto i = int(layer_a - mLayerBase);
diff --git a/src/KingSystem/Physics/System/physSystem.h b/src/KingSystem/Physics/System/physSystem.h
index 3e08d3e1..12339455 100644
--- a/src/KingSystem/Physics/System/physSystem.h
+++ b/src/KingSystem/Physics/System/physSystem.h
@@ -53,6 +53,9 @@ public:
void freeContactPointInfoEx(ContactPointInfoEx* info) const;
void registerContactPointInfo(ContactPointInfo* info) const;
+ // 0x000000710121696c
+ void registerCollisionInfo(CollisionInfo* info) const;
+ // 0x0000007101216974
void registerContactPointLayerPair(ContactPointInfoEx* info, ContactLayer layer1,
ContactLayer layer2, bool enabled);