From 6b302518fb6cd6537cb68984f87378fd66525006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Mon, 31 Jan 2022 20:09:32 +0100 Subject: [PATCH] ksys/phys: Finish BoxRigidBody --- data/uking_functions.csv | 16 ++++---- .../RigidBody/Shape/physBoxRigidBody.cpp | 41 +++++++++++++++++++ .../RigidBody/Shape/physBoxRigidBody.h | 14 ++++++- .../TeraMesh/physTeraMeshRigidBody.h | 2 +- .../Physics/RigidBody/physRigidBody.h | 13 +++++- .../RigidBody/physRigidBodyFromShape.h | 2 +- 6 files changed, 76 insertions(+), 12 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index d5bd9a73..2cf9d1ca 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -83153,17 +83153,17 @@ Address,Quality,Size,Name 0x0000007100f9720c,O,000088,_ZThn32_N4ksys4phys12BoxRigidBodyD1Ev 0x0000007100f97264,O,000096,_ZN4ksys4phys12BoxRigidBodyD0Ev 0x0000007100f972c4,O,000096,_ZThn32_N4ksys4phys12BoxRigidBodyD0Ev -0x0000007100f97324,U,000056, -0x0000007100f9735c,U,000056, -0x0000007100f97394,U,000012, -0x0000007100f973a0,U,000012, -0x0000007100f973ac,U,000072, -0x0000007100f973f4,U,000008, -0x0000007100f973fc,U,000012, +0x0000007100f97324,O,000056,_ZN4ksys4phys12BoxRigidBody10setExtentsERKN4sead7Vector3IfEE +0x0000007100f9735c,O,000056,_ZN4ksys4phys12BoxRigidBody12setTranslateERKN4sead7Vector3IfEE +0x0000007100f97394,O,000012,_ZNK4ksys4phys12BoxRigidBody10getExtentsEv +0x0000007100f973a0,O,000012,_ZNK4ksys4phys12BoxRigidBody12getTranslateEv +0x0000007100f973ac,O,000072,_ZN4ksys4phys12BoxRigidBody23getTransformedTranslateEPN4sead7Vector3IfEE +0x0000007100f973f4,O,000008,_ZN4ksys4phys12BoxRigidBody15setMaterialMaskERKNS0_12MaterialMaskE +0x0000007100f973fc,O,000012,_ZNK4ksys4phys12BoxRigidBody15getMaterialMaskEv 0x0000007100f97408,O,000016,_ZN4ksys4phys12BoxRigidBody9getVolumeEv 0x0000007100f97418,O,000008,_ZN4ksys4phys12BoxRigidBody9getShape_Ev 0x0000007100f97420,O,000008,_ZNK4ksys4phys12BoxRigidBody9getShape_Ev -0x0000007100f97428,U,000068, +0x0000007100f97428,O,000068,_ZN4ksys4phys12BoxRigidBody17getCollisionMasksEPNS0_9RigidBody14CollisionMasksE 0x0000007100f9746c,O,000288,_ZNK4ksys4phys12BoxRigidBody27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x0000007100f9758c,O,000092,_ZNK4ksys4phys12BoxRigidBody18getRuntimeTypeInfoEv 0x0000007100f975e8,U,000004, diff --git a/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.cpp b/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.cpp index 934f7c8c..68a80bd9 100644 --- a/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.cpp +++ b/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.cpp @@ -1,4 +1,5 @@ #include "KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h" +#include #include "KingSystem/Physics/RigidBody/Shape/physBoxShape.h" #include "KingSystem/Physics/RigidBody/physRigidBodyFactory.h" @@ -19,6 +20,39 @@ BoxRigidBody::~BoxRigidBody() { } } +void BoxRigidBody::setExtents(const sead::Vector3f& extents) { + if (mShape->setExtents(extents)) + updateShape(); +} + +void BoxRigidBody::setTranslate(const sead::Vector3f& translate) { + if (mShape->setTranslate(translate)) + updateShape(); +} + +const sead::Vector3f& BoxRigidBody::getExtents() const { + return mShape->mExtents; +} + +const sead::Vector3f& BoxRigidBody::getTranslate() const { + return mShape->mTranslate; +} + +void BoxRigidBody::getTransformedTranslate(sead::Vector3f* translate) { + lock(); + const auto& transform = getHkBody()->getMotion()->getMotionState()->getTransform(); + unlock(); + mShape->getTranslate(translate, transform); +} + +void BoxRigidBody::setMaterialMask(const MaterialMask& mask) { + mShape->setMaterialMask(mask); +} + +const MaterialMask& BoxRigidBody::getMaterialMask() const { + return mShape->mMaterialMask; +} + float BoxRigidBody::getVolume() { return mShape->getVolume(); } @@ -31,4 +65,11 @@ const Shape* BoxRigidBody::getShape_() const { return mShape; } +u32 BoxRigidBody::getCollisionMasks(RigidBody::CollisionMasks* masks) { + masks->ignored_layers = ~mContactMask.getDirect(); + masks->collision_filter_info = getCollisionFilterInfo(); + masks->material_mask = getMaterialMask().getRawData(); + return 0; +} + } // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h b/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h index a4f0a0a4..bed01760 100644 --- a/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h +++ b/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h @@ -16,12 +16,24 @@ public: const sead::SafeString& name, bool set_flag_10, sead::Heap* heap); ~BoxRigidBody() override; + /// Set the box extents and trigger a shape update. + void setExtents(const sead::Vector3f& extents); + /// Set the box translation and trigger a shape update. + void setTranslate(const sead::Vector3f& translate); + + const sead::Vector3f& getExtents() const; + const sead::Vector3f& getTranslate() const; + void getTransformedTranslate(sead::Vector3f* translate); + + void setMaterialMask(const MaterialMask& mask); + const MaterialMask& getMaterialMask() const; + float getVolume() override; protected: Shape* getShape_() override; const Shape* getShape_() const override; - void m9() override; + u32 getCollisionMasks(CollisionMasks* masks) override; BoxShape* mShape; }; diff --git a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h index e46e39d7..2257f7f3 100644 --- a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h +++ b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h @@ -9,7 +9,7 @@ class TeraMeshRigidBody : public RigidBody { public: TeraMeshRigidBody(hkpRigidBody* hk_body, sead::Heap* heap); - void m9() override; + u32 getCollisionMasks(CollisionMasks* masks) override; }; } // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.h b/src/KingSystem/Physics/RigidBody/physRigidBody.h index 95bf0e86..e5c6c715 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBody.h +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.h @@ -40,6 +40,16 @@ public: class RigidBody : public sead::IDisposer, public RigidBase { SEAD_RTTI_BASE(RigidBody) public: + struct CollisionMasks { + /// See MaterialMaskData. + u32 material_mask; + /// EntityCollisionFilterInfo or ReceiverMask. + u32 collision_filter_info; + /// Contact layers we do not collide with. + /// One bit per ContactLayer -- layers are relative to the layer base value. + u32 ignored_layers; + }; + enum class Type { FromShape = 0, _1 = 1, @@ -509,7 +519,8 @@ public: bool isEntityMotionFlag200On() const; protected: - virtual void m9() = 0; + // FIXME: return type + virtual u32 getCollisionMasks(CollisionMasks* masks) = 0; /// Called whenever a shape update is requested. /// @return the new shape to use for the Havok rigid body or null to keep the current hkpShape diff --git a/src/KingSystem/Physics/RigidBody/physRigidBodyFromShape.h b/src/KingSystem/Physics/RigidBody/physRigidBodyFromShape.h index 0eb01083..afaa5b90 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBodyFromShape.h +++ b/src/KingSystem/Physics/RigidBody/physRigidBodyFromShape.h @@ -14,7 +14,7 @@ public: const sead::SafeString& name, bool set_flag_10, sead::Heap* heap); ~RigidBodyFromShape() override; - const MaterialMask* getMaterialMask() const; + const MaterialMask* tryGetMaterialMask() const; protected: const hkpShape* getNewHavokShape_() override;