From ff2e2f9ff7a8b52b2f098bcda36f353ab9faa595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sun, 30 Jan 2022 18:39:00 +0100 Subject: [PATCH] ksys/phys: Start adding BoxRigidBody --- data/uking_functions.csv | 24 ++++++------- src/KingSystem/Physics/CMakeLists.txt | 2 ++ .../RigidBody/Shape/physBoxRigidBody.cpp | 34 +++++++++++++++++++ .../RigidBody/Shape/physBoxRigidBody.h | 29 ++++++++++++++++ .../Physics/RigidBody/Shape/physBoxShape.h | 7 ++-- .../Physics/RigidBody/physRigidBody.cpp | 2 +- .../Physics/RigidBody/physRigidBody.h | 2 +- .../RigidBody/physRigidBodyFactory.cpp | 2 +- .../Physics/RigidBody/physRigidBodyFactory.h | 3 +- 9 files changed, 86 insertions(+), 19 deletions(-) create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.cpp create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 7686317d..5a760b2e 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -83084,7 +83084,7 @@ Address,Quality,Size,Name 0x0000007100f93e28,O,000176,_ZN4ksys4phys9RigidBody18setLinkedRigidBodyEPS1_ 0x0000007100f93ed8,O,000156,_ZNK4ksys4phys9RigidBody26isSensorMotionFlag40000SetEv 0x0000007100f93f74,O,000008,_ZN4ksys4phys9RigidBody12updateScale_Eff -0x0000007100f93f7c,O,000008,_ZN4ksys4phys9RigidBody2m4Ev +0x0000007100f93f7c,O,000008,_ZN4ksys4phys9RigidBody9getVolumeEv 0x0000007100f93f84,O,000152,_ZN4ksys4phys9RigidBody21setWaterBuoyancyScaleEf 0x0000007100f9401c,O,000148,_ZNK4ksys4phys9RigidBody21getWaterBuoyancyScaleEv 0x0000007100f940b0,O,000152,_ZN4ksys4phys9RigidBody25setWaterFlowEffectiveRateEf @@ -83147,12 +83147,12 @@ Address,Quality,Size,Name 0x0000007100f97004,O,000112,_ZNK4ksys4phys9RigidBody27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x0000007100f97074,O,000092,_ZNK4ksys4phys9RigidBody18getRuntimeTypeInfoEv 0x0000007100f970d0,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys4phys14MotionAccessorEE9isDerivedEPKNS0_9InterfaceE -0x0000007100f9715c,U,000004,j__ZN4ksys4phys16RigidBodyFactory9createBoxEPNS0_18RigidBodyParamViewEPN4sead4HeapE -0x0000007100f97160,U,000084, -0x0000007100f971b4,U,000088, -0x0000007100f9720c,U,000088, -0x0000007100f97264,U,000096, -0x0000007100f972c4,U,000096, +0x0000007100f9715c,O,000004,_ZN4ksys4phys12BoxRigidBody4makeEPNS0_22RigidBodyInstanceParamEPN4sead4HeapE +0x0000007100f97160,O,000084,_ZN4ksys4phys12BoxRigidBodyC1EP12hkpRigidBodyPNS0_8BoxShapeENS0_16ContactLayerTypeERKN4sead14SafeStringBaseIcEEbPNS7_4HeapE +0x0000007100f971b4,O,000088,_ZN4ksys4phys12BoxRigidBodyD1Ev +0x0000007100f9720c,O,000088,_ZThn32_N4ksys4phys12BoxRigidBodyD1Ev +0x0000007100f97264,O,000096,_ZN4ksys4phys12BoxRigidBodyD0Ev +0x0000007100f972c4,O,000096,_ZThn32_N4ksys4phys12BoxRigidBodyD0Ev 0x0000007100f97324,U,000056, 0x0000007100f9735c,U,000056, 0x0000007100f97394,U,000012, @@ -83160,12 +83160,12 @@ Address,Quality,Size,Name 0x0000007100f973ac,U,000072, 0x0000007100f973f4,U,000008, 0x0000007100f973fc,U,000012, -0x0000007100f97408,U,000016, -0x0000007100f97418,U,000008, -0x0000007100f97420,U,000008, +0x0000007100f97408,O,000016,_ZN4ksys4phys12BoxRigidBody9getVolumeEv +0x0000007100f97418,O,000008,_ZN4ksys4phys12BoxRigidBody9getShape_Ev +0x0000007100f97420,O,000008,_ZNK4ksys4phys12BoxRigidBody9getShape_Ev 0x0000007100f97428,U,000068, -0x0000007100f9746c,U,000288, -0x0000007100f9758c,U,000092, +0x0000007100f9746c,O,000288,_ZNK4ksys4phys12BoxRigidBody27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x0000007100f9758c,O,000092,_ZNK4ksys4phys12BoxRigidBody18getRuntimeTypeInfoEv 0x0000007100f975e8,U,000004, 0x0000007100f975ec,U,000088, 0x0000007100f97644,U,000076, diff --git a/src/KingSystem/Physics/CMakeLists.txt b/src/KingSystem/Physics/CMakeLists.txt index 4db8ebb6..77ab1141 100644 --- a/src/KingSystem/Physics/CMakeLists.txt +++ b/src/KingSystem/Physics/CMakeLists.txt @@ -42,6 +42,8 @@ target_sources(uking PRIVATE RigidBody/Shape/physBoxShape.cpp RigidBody/Shape/physBoxShape.h + RigidBody/Shape/physBoxRigidBody.cpp + RigidBody/Shape/physBoxRigidBody.h RigidBody/Shape/physCapsuleShape.cpp RigidBody/Shape/physCapsuleShape.h RigidBody/Shape/physCharacterPrismShape.cpp diff --git a/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.cpp b/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.cpp new file mode 100644 index 00000000..934f7c8c --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.cpp @@ -0,0 +1,34 @@ +#include "KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h" +#include "KingSystem/Physics/RigidBody/Shape/physBoxShape.h" +#include "KingSystem/Physics/RigidBody/physRigidBodyFactory.h" + +namespace ksys::phys { + +BoxRigidBody* BoxRigidBody::make(RigidBodyInstanceParam* param, sead::Heap* heap) { + return RigidBodyFactory::createBox(param, heap); +} + +BoxRigidBody::BoxRigidBody(hkpRigidBody* hk_body, BoxShape* shape, ContactLayerType layer_type, + const sead::SafeString& name, bool set_flag_10, sead::Heap* heap) + : RigidBodyFromShape(hk_body, layer_type, name, set_flag_10, heap), mShape(shape) {} + +BoxRigidBody::~BoxRigidBody() { + if (hasFlag(RigidBody::Flag::_10) && mShape) { + delete mShape; + mShape = nullptr; + } +} + +float BoxRigidBody::getVolume() { + return mShape->getVolume(); +} + +Shape* BoxRigidBody::getShape_() { + return mShape; +} + +const Shape* BoxRigidBody::getShape_() const { + return mShape; +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h b/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h new file mode 100644 index 00000000..bf023334 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/Shape/physBoxRigidBody.h @@ -0,0 +1,29 @@ +#pragma once + +#include "KingSystem/Physics/RigidBody/physRigidBodyFromShape.h" + +namespace ksys::phys { + +struct BoxShape; +struct RigidBodyInstanceParam; + +class BoxRigidBody : public RigidBodyFromShape { + SEAD_RTTI_OVERRIDE(BoxRigidBody, RigidBodyFromShape) +public: + static BoxRigidBody* make(RigidBodyInstanceParam* param, sead::Heap* heap); + + BoxRigidBody(hkpRigidBody* hk_body, BoxShape* shape, ContactLayerType layer_type, + const sead::SafeString& name, bool set_flag_10, sead::Heap* heap); + ~BoxRigidBody() override; + + float getVolume() override; + +protected: + Shape* getShape_() override; + const Shape* getShape_() const override; + void m9() override; + + BoxShape* mShape; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.h b/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.h index fbaa11e4..9da4a2e6 100644 --- a/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.h +++ b/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.h @@ -8,11 +8,12 @@ namespace ksys::phys { class BoxParam; +class BoxRigidBody; -struct BoxShape { - virtual ~BoxShape(); +struct BoxShape : Shape { + ~BoxShape() override; - RigidBody* createBody(bool flag, const RigidBodyInstanceParam& params, sead::Heap* heap); + BoxRigidBody* createBody(bool flag, const RigidBodyInstanceParam& params, sead::Heap* heap); }; struct BoxShapeParam { diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp index c84473d1..e459b478 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp @@ -1486,7 +1486,7 @@ float RigidBody::updateScale_(float scale, float old_scale) { return old_scale; } -float RigidBody::m4() { +float RigidBody::getVolume() { return 0.0; } diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.h b/src/KingSystem/Physics/RigidBody/physRigidBody.h index 4e852722..95bf0e86 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBody.h +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.h @@ -128,7 +128,7 @@ public: const sead::SafeString& name, sead::Heap* heap, bool set_flag_10); ~RigidBody() override; - virtual float m4(); + virtual float getVolume(); bool initMotionAccessorForDynamicMotion(sead::Heap* heap); bool initMotionAccessor(const RigidBodyInstanceParam& param, sead::Heap* heap, diff --git a/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.cpp b/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.cpp index 13d552cb..7fbdcc32 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.cpp +++ b/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.cpp @@ -44,7 +44,7 @@ RigidBody* RigidBodyFactory::createCylinderWater(RigidBodyInstanceParam* params, return shape->createBody(true, *params, heap); } -RigidBody* RigidBodyFactory::createBox(RigidBodyInstanceParam* params, sead::Heap* heap) { +BoxRigidBody* RigidBodyFactory::createBox(RigidBodyInstanceParam* params, sead::Heap* heap) { if (params->isDynamicSensor()) params->motion_type = MotionType::Keyframed; diff --git a/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.h b/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.h index d4e61915..75f563db 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.h +++ b/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.h @@ -8,6 +8,7 @@ class Heap; namespace ksys::phys { +class BoxRigidBody; class RigidBody; struct RigidBodyInstanceParam; @@ -17,7 +18,7 @@ public: static RigidBody* createCapsule(RigidBodyInstanceParam* params, sead::Heap* heap); static RigidBody* createCylinder(RigidBodyInstanceParam* params, sead::Heap* heap); static RigidBody* createCylinderWater(RigidBodyInstanceParam* params, sead::Heap* heap); - static RigidBody* createBox(RigidBodyInstanceParam* params, sead::Heap* heap); + static BoxRigidBody* createBox(RigidBodyInstanceParam* params, sead::Heap* heap); static RigidBody* createWaterBox(RigidBodyInstanceParam* params, sead::Heap* heap); static RigidBody* createPolytope(RigidBodyInstanceParam* params, sead::Heap* heap); static RigidBody* createCollection(RigidBodyInstanceParam* params, sead::Heap* heap);