From 88921dbd7aa707c959137b334b3afb72e73a2b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Tue, 11 Jan 2022 19:25:09 +0100 Subject: [PATCH] ksys/phys: Add 3 easy RigidBody functions and fix some types --- data/uking_functions.csv | 6 +- .../Physics/RigidBody/physRigidBody.cpp | 15 ++++- .../Physics/RigidBody/physRigidBody.h | 67 +++++++++++++++++-- .../Physics/System/physInstanceSet.cpp | 2 +- 4 files changed, 81 insertions(+), 9 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 5f196b41..c851d1c3 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -82967,14 +82967,14 @@ Address,Quality,Size,Name 0x0000007100f8ca50,U,000584, 0x0000007100f8cc98,U,000172,phys::RigidBody::x_0 0x0000007100f8cd44,U,000552,phys::RigidBody::initMotion -0x0000007100f8cf6c,U,000052,phys::RigidBody::x +0x0000007100f8cf6c,O,000052,_ZNK4ksys4phys9RigidBody7getNameEv 0x0000007100f8cfa0,U,000424, 0x0000007100f8d148,O,000144,_ZN4ksys4phys9RigidBody13setMotionFlagENS1_10MotionFlagE -0x0000007100f8d1d8,U,000032, +0x0000007100f8d1d8,O,000032,_ZNK4ksys4phys9RigidBody8isActiveEv 0x0000007100f8d1f8,O,000012,_ZNK4ksys4phys9RigidBody14sub_7100F8D1F8Ev 0x0000007100f8d204,O,000012,_ZNK4ksys4phys9RigidBody14sub_7100F8D204Ev 0x0000007100f8d210,O,000012,_ZNK4ksys4phys9RigidBody14sub_7100F8D210Ev -0x0000007100f8d21c,m,000236,_ZN4ksys4phys9RigidBody14sub_7100F8D21CEv +0x0000007100f8d21c,O,000236,_ZN4ksys4phys9RigidBody14sub_7100F8D21CEv 0x0000007100f8d308,U,000888, 0x0000007100f8d680,U,000140, 0x0000007100f8d70c,U,000156, diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp index 7a6c3bb9..3515c812 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp @@ -26,6 +26,13 @@ RigidBody::RigidBody(u32 a, u32 mass_scaling, hkpRigidBody* hk_body, const sead: mFlags.set(Flag::_100); } +sead::SafeString RigidBody::getName() const { + const char* name = mHkBody->getName(); + if (!name) + return sead::SafeString::cEmptyString; + return name; +} + void RigidBody::setMotionFlag(MotionFlag flag) { auto lock = sead::makeScopedLock(mCS); @@ -38,6 +45,10 @@ void RigidBody::setMotionFlag(MotionFlag flag) { } } +bool RigidBody::isActive() const { + return mHkBody->isActive(); +} + bool RigidBody::sub_7100F8D1F8() const { return mFlags.isOn(Flag::_8); } @@ -50,8 +61,10 @@ bool RigidBody::sub_7100F8D210() const { return mMotionFlags.isOn(MotionFlag::_2); } -// NON_MATCHING: mFlags is loaded differently void RigidBody::sub_7100F8D21C() { + // debug code that survived because mFlags is atomic? + static_cast(mFlags.isOn(Flag::_8)); + auto lock = sead::makeScopedLock(mCS); if (mMotionFlags.isOn(MotionFlag::_1)) { diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.h b/src/KingSystem/Physics/RigidBody/physRigidBody.h index 16b45e81..e13d0aa5 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBody.h +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.h @@ -17,6 +17,8 @@ class hkpMotion; namespace ksys::phys { class MotionAccessor; +class RigidContactPoints; +class UserTag; class RigidBase { public: @@ -56,7 +58,7 @@ public: virtual void m5(); virtual void m6(); virtual void m7(); - virtual void m8(); + virtual void m8(float); // FIXME: should be pure virtual void m9(); virtual void m10(); @@ -65,14 +67,71 @@ public: virtual void m13(); virtual void m14(); - void sub_7100F8CFA0(); + // 0x0000007100f8ca50 + bool initMotionAccessor(sead::Heap* heap); + // 0x0000007100f8cc98 + void initMotionAndAccessor(); + // 0x0000007100f8cd44 + void initMotion(); + + sead::SafeString getName() const; + + // 0x0000007100f8cfa0 + void x_0(); + void setMotionFlag(MotionFlag); + + bool isActive() const; + + // 0x0000007100f8d1f8 bool sub_7100F8D1F8() const; + // 0x0000007100f8d204 bool sub_7100F8D204() const; + // 0x0000007100f8d210 bool sub_7100F8D210() const; + // 0x0000007100f8d21c void sub_7100F8D21C(); - void sub_7100F8D680(); + // 0x0000007100f8d308 + bool x_6(); + + // 0x0000007100f8d680 + // FIXME: rename after we figure out what the two types of MotionAccessor are + MotionAccessor* getMotionAccessorType1(); + // 0x0000007100f8d70c + void* getMotionAccessorType2Stuff(); + // 0x0000007100f8d7a8 + void motionAccessorType2Stuff2(); + // 0x0000007100f8d840 + void x_8(); + MotionType getMotionInfo() const; + + // Motion functions + // 0x0000007100f8dcfc + void x_9(); + // 0x0000007100f8e110 + void x_10(); + // 0x0000007100f8e3fc + void x_11(); + + // 0x0000007100f8e72c + void x_12(); + // 0x0000007100f8e7b4 + void setContactPoints(RigidContactPoints* points); + + // 0x0000007100f8e7e8 + void x_13(bool a, bool b); + // 0x0000007100f8e8f0 + void x_14(bool a, bool b, bool c); + // 0x0000007100f8eabc + void x_15(bool a, bool b); + // 0x0000007100f8ec3c + bool setLinearVelocityMaybe(const sead::Vector3f& velocity, float x); + // 0x0000007100f8ed74 + bool setAngularVelocityMaybe(const sead::Vector3f& velocity, float x); + // 0x0000007100f8ee38 + void x_16(); + u32 addContactLayer(ContactLayer); u32 removeContactLayer(ContactLayer); void setContactMask(u32); @@ -96,7 +155,7 @@ private: sead::TypedBitFlag> mMotionFlags{}; sead::BitFlag32 mContactMask{}; hkpRigidBody* mHkBody; - void* mActor = nullptr; + UserTag* mUserTag = nullptr; void* _88 = nullptr; void* _90 = nullptr; u16 _98 = 0; diff --git a/src/KingSystem/Physics/System/physInstanceSet.cpp b/src/KingSystem/Physics/System/physInstanceSet.cpp index bfcb0581..12ea0bb2 100644 --- a/src/KingSystem/Physics/System/physInstanceSet.cpp +++ b/src/KingSystem/Physics/System/physInstanceSet.cpp @@ -81,7 +81,7 @@ void InstanceSet::sub_7100FBA9BC() { } for (auto& body : mList) { - body->sub_7100F8CFA0(); + body->x_0(); } if (mCollisionController != nullptr)