diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 22e7244d..6005e7d9 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -82986,7 +82986,7 @@ Address,Quality,Size,Name 0x0000007100f8dcfc,O,001044,_ZN4ksys4phys9RigidBody19replaceMotionObjectEv 0x0000007100f8e110,O,000748,_ZN4ksys4phys9RigidBody4x_10Ev 0x0000007100f8e3fc,U,000816,phys::RigidBody::x_11 -0x0000007100f8e72c,U,000136,phys::RigidBody::x_12 +0x0000007100f8e72c,O,000136,_ZN4ksys4phys9RigidBody16setCollisionInfoEPNS0_13CollisionInfoE 0x0000007100f8e7b4,O,000052,_ZN4ksys4phys9RigidBody19setContactPointInfoEPNS0_16ContactPointInfoE 0x0000007100f8e7e8,O,000264,_ZN4ksys4phys9RigidBody26setFixedAndPreserveImpulseEbb 0x0000007100f8e8f0,O,000460,_ZN4ksys4phys9RigidBody6freezeEbbb 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);