ksys/phys: Add RigidBody::setCollisionInfo

This commit is contained in:
Léo Lam 2022-03-01 19:48:35 +01:00
parent 6077a63ea6
commit 35cc8dd9ee
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
6 changed files with 25 additions and 9 deletions

View File

@ -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

Can't render this file because it is too large.

View File

@ -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())

View File

@ -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;

View File

@ -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:

View File

@ -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);

View File

@ -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);