From 87e8bafae2588a85cc2471ac1510f0425606e6b7 Mon Sep 17 00:00:00 2001 From: theo3 Date: Mon, 29 Nov 2021 00:00:56 -0800 Subject: [PATCH] havok stubs and ksys::phys work --- CMakeLists.txt | 3 + data/uking_functions.csv | 274 +++++++++--------- lib/hkStubs/CMakeLists.txt | 25 ++ .../Base/Container/String/hkStringPtr.h | 11 + .../Havok/Common/Base/Math/Vector/hkVector4.h | 15 + lib/hkStubs/Havok/Common/Base/Math/hkMath.h | 5 + .../Havok/Common/Base/Object/hkBaseObject.h | 8 + .../Common/Base/Object/hkReferencedObject.h | 10 + .../Havok/Common/Base/Types/hkBaseTypes.h | 64 ++++ lib/hkStubs/Havok/Common/Base/hkBase.h | 9 + .../Shape/Convex/Capsule/hkpCapsuleShape.h | 10 + .../Collide/Shape/Convex/hkpConvexShape.h | 6 + .../Shape/HeightField/hkpSphereRepShape.h | 6 + .../Havok/Physics/Collide/Shape/hkpShape.h | 14 + .../Havok/Physics/Dynamics/Entity/hkpEntity.h | 25 ++ .../Physics/Dynamics/Entity/hkpRigidBody.h | 9 + .../Havok/Physics/Dynamics/World/hkpWorld.cpp | 3 + .../Havok/Physics/Dynamics/World/hkpWorld.h | 5 + .../Physics/Dynamics/World/hkpWorldEntity.h | 21 ++ src/KingSystem/Physics/CMakeLists.txt | 20 ++ .../Physics/RigidBody/Shape/physBoxShape.cpp | 0 .../Physics/RigidBody/Shape/physBoxShape.h | 27 ++ .../RigidBody/Shape/physCapsuleShape.cpp | 118 ++++++++ .../RigidBody/Shape/physCapsuleShape.h | 78 +++++ .../RigidBody/Shape/physCylinderShape.cpp | 0 .../RigidBody/Shape/physCylinderShape.h | 27 ++ .../RigidBody/Shape/physSphereShape.cpp | 0 .../Physics/RigidBody/Shape/physSphereShape.h | 27 ++ .../Shape/physWaterCylinderShape.cpp | 0 .../RigidBody/Shape/physWaterCylinderShape.h | 27 ++ .../Physics/RigidBody/physMotionAccessor.cpp | 34 +++ .../Physics/RigidBody/physMotionAccessor.h | 28 ++ .../Physics/RigidBody/physRigidBody.cpp | 86 ++++++ .../Physics/RigidBody/physRigidBody.h | 106 +++++++ .../RigidBody/physRigidBodyFactory.cpp | 56 ++++ .../Physics/RigidBody/physRigidBodyFactory.h | 26 ++ .../Physics/RigidBody/physRigidBodyParam.h | 67 +++-- src/KingSystem/Physics/System/physDefines.cpp | 2 +- src/KingSystem/Physics/System/physDefines.h | 2 +- .../Physics/System/physMemSystem.cpp | 0 src/KingSystem/Physics/System/physMemSystem.h | 21 ++ src/KingSystem/Physics/physInstanceSet.cpp | 211 ++++++++++++++ src/KingSystem/Physics/physInstanceSet.h | 124 ++++++++ 43 files changed, 1440 insertions(+), 170 deletions(-) create mode 100644 lib/hkStubs/CMakeLists.txt create mode 100644 lib/hkStubs/Havok/Common/Base/Container/String/hkStringPtr.h create mode 100644 lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4.h create mode 100644 lib/hkStubs/Havok/Common/Base/Math/hkMath.h create mode 100644 lib/hkStubs/Havok/Common/Base/Object/hkBaseObject.h create mode 100644 lib/hkStubs/Havok/Common/Base/Object/hkReferencedObject.h create mode 100644 lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h create mode 100644 lib/hkStubs/Havok/Common/Base/hkBase.h create mode 100644 lib/hkStubs/Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h create mode 100644 lib/hkStubs/Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h create mode 100644 lib/hkStubs/Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h create mode 100644 lib/hkStubs/Havok/Physics/Collide/Shape/hkpShape.h create mode 100644 lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpEntity.h create mode 100644 lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpRigidBody.h create mode 100644 lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.cpp create mode 100644 lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.h create mode 100644 lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorldEntity.h create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physBoxShape.cpp create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physBoxShape.h create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.cpp create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physCylinderShape.cpp create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physCylinderShape.h create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physSphereShape.cpp create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physSphereShape.h create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physWaterCylinderShape.cpp create mode 100644 src/KingSystem/Physics/RigidBody/Shape/physWaterCylinderShape.h create mode 100644 src/KingSystem/Physics/RigidBody/physMotionAccessor.cpp create mode 100644 src/KingSystem/Physics/RigidBody/physMotionAccessor.h create mode 100644 src/KingSystem/Physics/RigidBody/physRigidBody.cpp create mode 100644 src/KingSystem/Physics/RigidBody/physRigidBody.h create mode 100644 src/KingSystem/Physics/RigidBody/physRigidBodyFactory.cpp create mode 100644 src/KingSystem/Physics/RigidBody/physRigidBodyFactory.h create mode 100644 src/KingSystem/Physics/System/physMemSystem.cpp create mode 100644 src/KingSystem/Physics/System/physMemSystem.h create mode 100644 src/KingSystem/Physics/physInstanceSet.cpp create mode 100644 src/KingSystem/Physics/physInstanceSet.h diff --git a/CMakeLists.txt b/CMakeLists.txt index fa0e9f2b..748ade8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,4 +48,7 @@ target_link_libraries(uking PRIVATE evfl) add_subdirectory(lib/xlink2) target_link_libraries(uking PRIVATE xlink2) +add_subdirectory(lib/hkStubs) +target_link_libraries(uking PRIVATE hkStubs) + add_subdirectory(src) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index f40e4444..c326796a 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -82947,28 +82947,28 @@ Address,Quality,Size,Name 0x0000007100f8c4e4,U,000092, 0x0000007100f8c540,U,000008, 0x0000007100f8c548,U,000140, -0x0000007100f8c5d4,U,000492, +0x0000007100f8c5d4,W,000492,_ZN4ksys4phys9RigidBodyC1EjjP12hkpRigidBodyRKN4sead14SafeStringBaseIcEEPNS4_4HeapEb 0x0000007100f8c7c0,U,000160, 0x0000007100f8c860,U,000160, 0x0000007100f8c900,U,000168, 0x0000007100f8c9a8,U,000168, 0x0000007100f8ca50,U,000584, 0x0000007100f8cc98,U,000172, -0x0000007100f8cd44,U,000552, +0x0000007100f8cd44,U,000552,phys::RigidBody::initMotion 0x0000007100f8cf6c,U,000052, 0x0000007100f8cfa0,U,000424, -0x0000007100f8d148,U,000144, +0x0000007100f8d148,O,000144,_ZN4ksys4phys9RigidBody13setMotionFlagENS1_10MotionFlagE 0x0000007100f8d1d8,U,000032, -0x0000007100f8d1f8,U,000012, -0x0000007100f8d204,U,000012, -0x0000007100f8d210,U,000012, -0x0000007100f8d21c,U,000236, +0x0000007100f8d1f8,O,000012,_ZNK4ksys4phys9RigidBody14sub_7100F8D1F8Ev +0x0000007100f8d204,O,000012,_ZNK4ksys4phys9RigidBody14sub_7100F8D204Ev +0x0000007100f8d210,O,000012,_ZNK4ksys4phys9RigidBody14sub_7100F8D210Ev +0x0000007100f8d21c,m,000236,_ZN4ksys4phys9RigidBody14sub_7100F8D21CEv 0x0000007100f8d308,U,000888, 0x0000007100f8d680,U,000140, 0x0000007100f8d70c,U,000156, 0x0000007100f8d7a8,U,000152, 0x0000007100f8d840,U,001156, -0x0000007100f8dcc4,U,000056,collisionStuffMaybe::x +0x0000007100f8dcc4,O,000056,_ZNK4ksys4phys9RigidBody13getMotionInfoEv 0x0000007100f8dcfc,U,001044, 0x0000007100f8e110,U,000748, 0x0000007100f8e3fc,U,000816, @@ -82976,17 +82976,17 @@ Address,Quality,Size,Name 0x0000007100f8e7b4,U,000052, 0x0000007100f8e7e8,U,000724, 0x0000007100f8eabc,U,000384, -0x0000007100f8ec3c,U,000312, -0x0000007100f8ed74,U,000196,physicsSetVelocityAndAngularVelocityMaybe +0x0000007100f8ec3c,U,000312,RigidBody::setLinearVelocity +0x0000007100f8ed74,U,000196,RigidBody::setAngularVelocity 0x0000007100f8ee38,U,000024, 0x0000007100f8ee50,U,000048, 0x0000007100f8ee80,U,000384, 0x0000007100f8f000,U,000012, 0x0000007100f8f00c,U,000080, 0x0000007100f8f05c,U,000080, -0x0000007100f8f0ac,U,000008, -0x0000007100f8f0b4,U,000012, -0x0000007100f8f0c0,U,000008, +0x0000007100f8f0ac,O,000008,_ZN4ksys4phys9RigidBody14setContactMaskEj +0x0000007100f8f0b4,O,000012,_ZN4ksys4phys9RigidBody13setContactAllEv +0x0000007100f8f0c0,O,000008,_ZN4ksys4phys9RigidBody14setContactNoneEv 0x0000007100f8f0c8,U,000176, 0x0000007100f8f178,U,000064, 0x0000007100f8f1b8,U,000012, @@ -83257,11 +83257,11 @@ Address,Quality,Size,Name 0x0000007100f99050,U,000008, 0x0000007100f99058,U,000204, 0x0000007100f99124,U,000092, -0x0000007100f99180,U,000188, -0x0000007100f9923c,U,000188, -0x0000007100f992f8,U,000188, -0x0000007100f993b4,U,000188, -0x0000007100f99470,U,000188, +0x0000007100f99180,O,000188,_ZN4ksys4phys16RigidBodyFactory12createSphereEPNS0_18RigidBodyParamViewEPN4sead4HeapE +0x0000007100f9923c,O,000188,_ZN4ksys4phys16RigidBodyFactory13createCapsuleEPNS0_18RigidBodyParamViewEPN4sead4HeapE +0x0000007100f992f8,O,000188,_ZN4ksys4phys16RigidBodyFactory14createCylinderEPNS0_18RigidBodyParamViewEPN4sead4HeapE +0x0000007100f993b4,O,000188,_ZN4ksys4phys16RigidBodyFactory19createWaterCylinderEPNS0_18RigidBodyParamViewEPN4sead4HeapE +0x0000007100f99470,O,000188,_ZN4ksys4phys16RigidBodyFactory9createBoxEPNS0_18RigidBodyParamViewEPN4sead4HeapE 0x0000007100f9952c,U,000188, 0x0000007100f995e8,U,000188, 0x0000007100f996a4,U,000188, @@ -83569,20 +83569,20 @@ Address,Quality,Size,Name 0x0000007100fab688,U,000276, 0x0000007100fab79c,U,000008, 0x0000007100fab7a4,U,000184, -0x0000007100fab85c,U,000332, -0x0000007100fab9a8,U,000184, -0x0000007100faba60,U,000008, -0x0000007100faba68,U,000060, -0x0000007100fabac4,U,000064, -0x0000007100fabb04,U,000072, -0x0000007100fabb4c,U,000060, -0x0000007100fabb88,U,000192, -0x0000007100fabc48,U,000140, -0x0000007100fabcd4,U,000008, -0x0000007100fabcdc,U,000008, +0x0000007100fab85c,m,000332,_ZN4ksys4phys12CapsuleShape4initEPN4sead4HeapE +0x0000007100fab9a8,O,000184,_ZN4ksys4phys11CapsuleBody5cloneEPN4sead4HeapE +0x0000007100faba60,O,000008,_ZNK4ksys4phys11CapsuleBody9getRadiusEv +0x0000007100faba68,O,000060,_ZNK4ksys4phys11CapsuleBody11getVerticesEPN4sead7Vector3IfEES5_ +0x0000007100fabac4,O,000064,_ZN4ksys4phys11CapsuleBodyD1Ev +0x0000007100fabb04,O,000072,_ZN4ksys4phys11CapsuleBodyD0Ev +0x0000007100fabb4c,m,000060,_ZN4ksys4phys11CapsuleBody9setRadiusEf +0x0000007100fabb88,O,000192,_ZN4ksys4phys11CapsuleBody11setVerticesERKN4sead7Vector3IfEES6_ +0x0000007100fabc48,m,000140,_ZNK4ksys4phys11CapsuleBody9getVolumeEv +0x0000007100fabcd4,O,000008,_ZN4ksys4phys11CapsuleBody8getShapeEv +0x0000007100fabcdc,O,000008,_ZNK4ksys4phys11CapsuleBody8getShapeEv 0x0000007100fabce4,U,000252, 0x0000007100fabde0,U,000160, -0x0000007100fabe80,U,000192, +0x0000007100fabe80,m,000192,_ZN4ksys4phys11CapsuleBody14sub_7100FABE80EPN4sead7Vector3IfEES5_RK9hkVector4 0x0000007100fabf40,U,000204, 0x0000007100fac00c,U,000092, 0x0000007100fac068,U,000008, @@ -83851,13 +83851,13 @@ Address,Quality,Size,Name 0x0000007100fb918c,U,000492,ActorPhysics::setModel 0x0000007100fb9378,U,001456, 0x0000007100fb9928,U,000468, -0x0000007100fb9afc,U,000032,ActorPhysics::setFlag2 -0x0000007100fb9b1c,U,000024,ActorPhysics::clothVisibleStuff -0x0000007100fb9b34,U,000016, -0x0000007100fb9b44,U,000016, -0x0000007100fb9b54,U,000088,ActorPhysics::clothVisibleStuff_0 -0x0000007100fb9bac,U,000128, -0x0000007100fb9c2c,U,000040, +0x0000007100fb9afc,O,000032,_ZN4ksys4phys11InstanceSet8setFlag2Ev +0x0000007100fb9b1c,O,000024,_ZN4ksys4phys11InstanceSet17clothVisibleStuffEv +0x0000007100fb9b34,O,000016,_ZN4ksys4phys11InstanceSet9setInDemoEv +0x0000007100fb9b44,O,000016,_ZN4ksys4phys11InstanceSet11resetInDemoEv +0x0000007100fb9b54,O,000088,_ZN4ksys4phys11InstanceSet19clothVisibleStuff_0Ei +0x0000007100fb9bac,O,000128,_ZN4ksys4phys11InstanceSet14sub_7100FB9BACEPS1_ +0x0000007100fb9c2c,O,000040,_ZNK4ksys4phys11InstanceSet14sub_7100FB9C2CEv 0x0000007100fb9c54,U,000208,ActorPhysics::calcMaybe 0x0000007100fb9d24,U,000140, 0x0000007100fb9db0,U,000224, @@ -83870,17 +83870,17 @@ Address,Quality,Size,Name 0x0000007100fba508,U,000096, 0x0000007100fba568,U,000596,ActorPhysics::setMtx_x 0x0000007100fba7bc,U,000512, -0x0000007100fba9bc,U,000128, +0x0000007100fba9bc,O,000128,_ZN4ksys4phys11InstanceSet14sub_7100FBA9BCEv 0x0000007100fbaa3c,U,000140, 0x0000007100fbaac8,U,000160, 0x0000007100fbab68,U,000228, 0x0000007100fbac4c,U,000148, -0x0000007100fbace0,U,000148, -0x0000007100fbad74,U,000104, +0x0000007100fbace0,O,000148,_ZN4ksys4phys11InstanceSet14sub_7100FBACE0ENS0_12ContactLayerE +0x0000007100fbad74,O,000104,_ZN4ksys4phys11InstanceSet14sub_7100FBAD74Ev 0x0000007100fbaddc,U,000256, -0x0000007100fbaedc,U,000060, +0x0000007100fbaedc,O,000060,_ZNK4ksys4phys11InstanceSet14sub_7100FBAEDCEii 0x0000007100fbaf18,U,000244, -0x0000007100fbb00c,U,000384, +0x0000007100fbb00c,M,000384,_ZN4ksys4phys11InstanceSet14sub_7100FBB00CEPNS0_9RigidBodyEPNS0_14RigidBodyParamE 0x0000007100fbb18c,U,000272, 0x0000007100fbb29c,U,000216, 0x0000007100fbb374,U,000172, @@ -83891,16 +83891,16 @@ Address,Quality,Size,Name 0x0000007100fbb7bc,U,000348,ActorPhysics::findBodyByName_0 0x0000007100fbb918,U,000392, 0x0000007100fbbaa0,U,000392,ActorPhysics::findX -0x0000007100fbbc28,U,000080, -0x0000007100fbbc78,U,000292, -0x0000007100fbbd9c,U,000292, +0x0000007100fbbc28,O,000080,_ZNK4ksys4phys11InstanceSet14sub_7100FBBC28ERKN4sead14SafeStringBaseIcEE +0x0000007100fbbc78,O,000292,_ZNK4ksys4phys11InstanceSet14sub_7100FBBC78ERKN4sead14SafeStringBaseIcEE +0x0000007100fbbd9c,O,000292,_ZNK4ksys4phys11InstanceSet14sub_7100FBBD9CERKN4sead14SafeStringBaseIcEE 0x0000007100fbbec0,U,000004,nullsub_4244 0x0000007100fbbec4,U,002420, 0x0000007100fbc838,U,000088, 0x0000007100fbc890,U,000936, 0x0000007100fbcc38,U,001012, 0x0000007100fbd02c,U,000600, -0x0000007100fbd284,U,000160, +0x0000007100fbd284,O,000160,_ZN4ksys4phys11InstanceSet14sub_7100FBD284ERKN4sead8Matrix34IfEE 0x0000007100fbd324,U,000108, 0x0000007100fbd390,U,000092, 0x0000007100fbd3ec,U,000036, @@ -83911,7 +83911,7 @@ Address,Quality,Size,Name 0x0000007100fbd94c,U,000056, 0x0000007100fbd984,U,000132, 0x0000007100fbda08,U,000036, -0x0000007100fbda2c,U,000304, +0x0000007100fbda2c,O,000304,_ZNK4ksys4phys11InstanceSet14sub_7100FBDA2CERKN4sead14SafeStringBaseIcEE 0x0000007100fbdb5c,U,000052, 0x0000007100fbdb90,U,000072, 0x0000007100fbdbd8,U,000076, @@ -95349,15 +95349,15 @@ Address,Quality,Size,Name 0x00000071012ae830,U,001508, 0x00000071012aee14,U,002304, 0x00000071012af714,U,001036, -0x00000071012afb20,U,000028, -0x00000071012afb3c,U,000004,nullsub_4775 -0x00000071012afb40,U,000004,j__ZdlPv_1290 -0x00000071012afb44,U,000008, -0x00000071012afb4c,U,000008, -0x00000071012afb54,U,000008, -0x00000071012afb5c,U,000020, -0x00000071012afb70,U,000020, -0x00000071012afb84,U,000032, +0x00000071012afb20,O,000028,_ZN4ksys4phys14MotionAccessorC1EPNS0_9RigidBodyE +0x00000071012afb3c,O,000004,_ZN4ksys4phys14MotionAccessorD1Ev +0x00000071012afb40,O,000004,_ZN4ksys4phys14MotionAccessorD0Ev +0x00000071012afb44,O,000008,_ZNK4ksys4phys14MotionAccessor13getMotionInfoEv +0x00000071012afb4c,O,000008,_ZNK4ksys4phys14MotionAccessor9getMotionEv +0x00000071012afb54,O,000008,_ZN4ksys4phys14MotionAccessor13setMotionFlagENS0_9RigidBody10MotionFlagE +0x00000071012afb5c,O,000020,_ZNK4ksys4phys14MotionAccessor12hasMotionSetENS0_9RigidBody10MotionFlagE +0x00000071012afb70,O,000020,_ZNK4ksys4phys14MotionAccessor17hasMotionDisabledENS0_9RigidBody10MotionFlagE +0x00000071012afb84,O,000032,_ZN4ksys4phys14MotionAccessor17disableMotionFlagENS0_9RigidBody10MotionFlagE 0x00000071012afba4,U,000112, 0x00000071012afc14,U,000092, 0x00000071012afc70,U,000048,HavokResource::ctor @@ -102883,7 +102883,7 @@ Address,Quality,Size,Name 0x000000710157f5c8,U,000108, 0x000000710157f634,U,000272, 0x000000710157f744,U,000052, -0x000000710157f778,U,000020, +0x000000710157f778,L,000020,hkpWorldObject::checkReadOnly 0x000000710157f78c,U,000492, 0x000000710157f978,U,000468, 0x000000710157fb4c,U,000012, @@ -102951,7 +102951,7 @@ Address,Quality,Size,Name 0x00000071015821d8,U,000344, 0x0000007101582330,U,000352, 0x0000007101582490,U,000384, -0x0000007101582610,U,000348, +0x0000007101582610,L,000348,hkSweptTransformUtil::freezeMotionState 0x000000710158276c,U,000352, 0x00000071015828cc,U,000036, 0x00000071015828f0,U,000148, @@ -103230,7 +103230,7 @@ Address,Quality,Size,Name 0x000000710158b814,U,000032,_ZN2nn3nex15DDLDeclarations4LoadEv 0x000000710158b834,U,000060, 0x000000710158b8b4,U,000064, -0x000000710158b8f4,U,000172, +0x000000710158b8f4,L,000172,hkRotation::set 0x000000710158b9a0,U,000212, 0x000000710158ba74,U,000280, 0x000000710158bb8c,U,000608, @@ -103285,7 +103285,7 @@ Address,Quality,Size,Name 0x000000710158da68,U,000020, 0x000000710158da7c,U,000004,nullsub_5081 0x000000710158da80,U,000080, -0x000000710158dad0,U,000040, +0x000000710158dad0,L,000040,hkStringPtr::operatorEQ 0x000000710158daf8,U,000048, 0x000000710158db28,U,000020, 0x000000710158db3c,U,000468, @@ -103330,7 +103330,7 @@ Address,Quality,Size,Name 0x000000710158f19c,U,000240, 0x000000710158f28c,U,000144, 0x000000710158f31c,U,000016, -0x000000710158f32c,U,000228, +0x000000710158f32c,L,000228,hkUFloat8::operatorEQ 0x000000710158f410,U,000152, 0x000000710158f4a8,U,000092, 0x000000710158f504,U,001264, @@ -103872,7 +103872,7 @@ Address,Quality,Size,Name 0x00000071015bdab4,U,000608, 0x00000071015bdd14,U,000876, 0x00000071015be080,U,000084, -0x00000071015be0d4,U,000008, +0x00000071015be0d4,L,000008,hkpConvexShape::isConvex 0x00000071015be0dc,U,000040, 0x00000071015be104,U,000012, 0x00000071015be110,U,000056, @@ -103907,7 +103907,7 @@ Address,Quality,Size,Name 0x00000071015bf7c8,U,001764, 0x00000071015bfeac,U,000872, 0x00000071015c0214,U,000792, -0x00000071015c052c,U,000076, +0x00000071015c052c,L,000076,hkpCapsuleShape::hkpCapsuleShape 0x00000071015c0578,U,000060, 0x00000071015c05b4,U,000012, 0x00000071015c05c0,U,000024, @@ -105025,7 +105025,7 @@ Address,Quality,Size,Name 0x00000071015fbe7c,U,000096, 0x00000071015fbedc,U,000064, 0x00000071015fbf1c,U,000064, -0x00000071015fbf5c,U,000056, +0x00000071015fbf5c,L,000056,hkpFixedRigidMotion::hkpFixedRigidMotion 0x00000071015fbf94,U,000004,nullsub_5162 0x00000071015fbf98,U,000140, 0x00000071015fc024,U,000004,nullsub_5163 @@ -105036,7 +105036,7 @@ Address,Quality,Size,Name 0x00000071015fc098,U,000012, 0x00000071015fc0a4,U,000176, 0x00000071015fc154,U,000364, -0x00000071015fc2c0,U,000364, +0x00000071015fc2c0,L,000364,hkpPhantom::firePhantomAdded 0x00000071015fc42c,U,000364, 0x00000071015fc598,U,001312, 0x00000071015fcab8,U,000156, @@ -105045,16 +105045,16 @@ Address,Quality,Size,Name 0x00000071015fcc98,U,000432, 0x00000071015fce48,U,000088, 0x00000071015fcea0,U,000148, -0x00000071015fcf34,U,000188, +0x00000071015fcf34,L,000188,hkpRigidBodyCinfo::hkpRigidBodyCinfo 0x00000071015fcff0,U,000288, 0x00000071015fd110,U,000360, 0x00000071015fd278,U,000460, 0x00000071015fd444,U,000320, 0x00000071015fd584,U,000272, 0x00000071015fd694,U,000280, -0x00000071015fd7ac,U,000240, +0x00000071015fd7ac,L,000240,hkpEntity::hkpEntity 0x00000071015fd89c,U,000288, -0x00000071015fd9bc,U,000276, +0x00000071015fd9bc,L,000276,hkpEntity::setCachedShapeData 0x00000071015fdad0,U,000916, 0x00000071015fde64,U,000072, 0x00000071015fdeac,U,000088, @@ -105062,10 +105062,10 @@ Address,Quality,Size,Name 0x00000071015fdfec,U,000176, 0x00000071015fe09c,U,000144, 0x00000071015fe12c,U,000028, -0x00000071015fe148,U,000144, +0x00000071015fe148,L,000144,hkpEntity::activate 0x00000071015fe1d8,U,000040, 0x00000071015fe200,U,000220, -0x00000071015fe2dc,U,001056, +0x00000071015fe2dc,L,001056,hkpEntity::deallocateInternalArrays 0x00000071015fe6fc,U,000016, 0x00000071015fe70c,U,000052, 0x00000071015fe740,U,000052, @@ -105083,11 +105083,11 @@ Address,Quality,Size,Name 0x00000071016003e8,U,000364, 0x0000007101600554,U,000088, 0x00000071016005ac,U,001300, -0x0000007101600ac0,U,000008, -0x0000007101600ac8,U,001932, +0x0000007101600ac0,L,000008,hkpWorld::queueOperation +0x0000007101600ac8,L,001932,hkpWorld::updateCollisionFilterOnEntity 0x0000007101601254,U,000828, 0x0000007101601590,U,000308, -0x00000071016016c4,U,000224, +0x00000071016016c4,L,000224,hkpWorld::reenableCollisionBetweenEntityPair 0x00000071016017a4,U,000464, 0x0000007101601974,U,001748, 0x0000007101602048,U,000276, @@ -105096,9 +105096,9 @@ Address,Quality,Size,Name 0x00000071016024c4,U,000412, 0x0000007101602660,U,000712, 0x0000007101602928,U,000060, -0x0000007101602964,U,000360, +0x0000007101602964,L,000360,hkpWorld::addPhantom 0x0000007101602acc,U,001248, -0x0000007101602fac,U,000416, +0x0000007101602fac,L,000416,hkpWorld::removePhantom 0x000000710160314c,U,000096, 0x00000071016031ac,U,000076, 0x00000071016031f8,U,000096, @@ -105125,7 +105125,7 @@ Address,Quality,Size,Name 0x0000007101603890,U,000004,nullsub_5166 0x0000007101603894,U,001088, 0x0000007101603cd4,U,000008, -0x0000007101603cdc,U,004924, +0x0000007101603cdc,L,004924,_ZN8hkpWorldC1Ev 0x0000007101605018,U,000384, 0x0000007101605198,U,000204, 0x0000007101605264,U,000224, @@ -105138,8 +105138,8 @@ Address,Quality,Size,Name 0x0000007101605ae4,U,000232, 0x0000007101605bcc,U,000404, 0x0000007101605d60,U,000232, -0x0000007101605e48,U,000012, -0x0000007101605e54,U,000012, +0x0000007101605e48,U,000012,hkpWorld::internal_executePendingOperations +0x0000007101605e54,U,000012,hkpWorld::internal_executePendingBodyOperation 0x0000007101605e60,U,000108, 0x0000007101605ecc,U,000248, 0x0000007101605fc4,U,000004,nullsub_5167 @@ -105166,11 +105166,11 @@ Address,Quality,Size,Name 0x00000071016063e4,U,000328, 0x000000710160652c,U,000216, 0x0000007101606604,U,000084, -0x0000007101606658,U,000148, +0x0000007101606658,L,000148,hkpMotion::hkpMotion 0x00000071016066ec,U,000144, 0x000000710160677c,U,000036, 0x00000071016067a0,U,000076, -0x00000071016067ec,U,000052, +0x00000071016067ec,L,000052,hkpMotion::getMass 0x0000007101606820,U,000008, 0x0000007101606828,U,000020, 0x000000710160683c,U,000016, @@ -105183,7 +105183,7 @@ Address,Quality,Size,Name 0x00000071016068a4,U,000012, 0x00000071016068b0,U,000024, 0x00000071016068c8,U,000156, -0x0000007101606964,U,000008, +0x0000007101606964,L,000008,hkpMotion::setDeactivationClass 0x000000710160696c,U,000136, 0x00000071016069f4,U,000084, 0x0000007101606a48,U,000132, @@ -105210,11 +105210,11 @@ Address,Quality,Size,Name 0x0000007101607d74,U,000092, 0x0000007101607dd0,U,000068, 0x0000007101607e14,U,000232, -0x0000007101607efc,U,000344, +0x0000007101607efc,L,000344,hkpWorldCinfo::hkpWorldCinfo 0x0000007101608054,U,000032, 0x0000007101608074,U,000244, 0x0000007101608168,U,000084, -0x00000071016081bc,U,000968, +0x00000071016081bc,L,000968,hkpWorldOperationUtil::updateEntityBP 0x0000007101608584,U,000452, 0x0000007101608748,U,000432, 0x00000071016088f8,U,000416, @@ -105236,10 +105236,10 @@ Address,Quality,Size,Name 0x000000710160af54,U,000064, 0x000000710160af94,U,001240, 0x000000710160b46c,U,000816, -0x000000710160b79c,U,001552, +0x000000710160b79c,L,001552,hkpWorldOperationUtil::setRigidBodyMotionType 0x000000710160bdac,U,000640, 0x000000710160c02c,U,000376, -0x000000710160c1a4,U,001284, +0x000000710160c1a4,L,001284,hkpWorldOperationUtil::replaceMotionObject 0x000000710160c6a8,U,000640, 0x000000710160c928,U,000060, 0x000000710160c964,U,000388, @@ -105285,17 +105285,17 @@ Address,Quality,Size,Name 0x000000710160eb78,U,000180, 0x000000710160ec2c,U,000004,nullsub_5174 0x000000710160ec30,U,000088, -0x000000710160ec88,U,000096, -0x000000710160ece8,U,000044, +0x000000710160ec88,L,000096,hkpMultiThreadedSimulation::create +0x000000710160ece8,L,000044,hkpMultiThreadedSimulation_registerSelf 0x000000710160ed14,U,000136, 0x000000710160ed9c,U,001340, -0x000000710160f2d8,U,002200, +0x000000710160f2d8,L,002200,hkpMultiThreadedSimulation::finishMtStep 0x000000710160fb70,U,000036, 0x000000710160fb94,U,000012, 0x000000710160fba0,U,000012, 0x000000710160fbac,U,000004,nullsub_5175 0x000000710160fbb0,U,000004,nullsub_5176 -0x000000710160fbb4,U,000520, +0x000000710160fbb4,L,000520,hkpMultiThreadedSimulation::addToiEventWithCriticalSectionLoc 0x000000710160fdbc,U,001088, 0x00000071016101fc,U,000736, 0x00000071016104dc,U,001708, @@ -105313,31 +105313,31 @@ Address,Quality,Size,Name 0x0000007101611744,U,000096, 0x00000071016117a4,U,000280, 0x00000071016118bc,U,000208, -0x000000710161198c,U,000436, -0x0000007101611b40,U,001160, -0x0000007101611fc8,U,000172, +0x000000710161198c,L,000436,createDynamicRigidMotion +0x0000007101611b40,L,001160,hkpRigidBody::hkpRigidBody +0x0000007101611fc8,L,000172,hkpRigidBody::enableDeactivation 0x0000007101612074,U,000052, 0x00000071016120a8,U,000020, 0x00000071016120bc,U,000104, 0x0000007101612124,U,000372, -0x0000007101612298,U,000016, -0x00000071016122a8,U,000008, -0x00000071016122b0,U,000820, -0x00000071016125e4,U,000128, -0x0000007101612664,U,000664, -0x00000071016128fc,U,000448, +0x0000007101612298,L,000016,hkpRigidBody::isDeactivationEnabled +0x00000071016122a8,L,000008,hkpRigidBody::getMotionState +0x00000071016122b0,L,000820,hkpRigidBody::clone +0x00000071016125e4,L,000128,hkpRigidBody::setMotionType +0x0000007101612664,L,000664,hkpRigidBody::setShape +0x00000071016128fc,L,000448,hkpRigidBody::updateShape 0x0000007101612abc,U,000208, -0x0000007101612b8c,U,000032, -0x0000007101612bac,U,000272, -0x0000007101612cbc,U,000048, -0x0000007101612cec,U,000048, -0x0000007101612d1c,U,000048, +0x0000007101612b8c,L,000032,hkpRigidBody::getStoredDynamicMotion +0x0000007101612bac,L,000272,hkpRigidBody::updateBroadphaseAndResetCollisionInformationOfWarpedBody +0x0000007101612cbc,L,000048,hkpRigidBody::setPosition +0x0000007101612cec,L,000048,hkpRigidBody::setPositionAndRotation +0x0000007101612d1c,U,000048,hkpRigidBody::setTransform 0x0000007101612d4c,U,000020, 0x0000007101612d60,U,000020, 0x0000007101612d74,U,000020, -0x0000007101612d88,U,000020, +0x0000007101612d88,L,000020,hkpRigidBody::setInertiaInvLocal 0x0000007101612d9c,U,000076, -0x0000007101612de8,U,000112, +0x0000007101612de8,L,000112,hkpKeyframedRigidMotion::dtor 0x0000007101612e58,U,000192, 0x0000007101612f18,U,000004,nullsub_5177 0x0000007101612f1c,U,000004,nullsub_5178 @@ -105490,9 +105490,9 @@ Address,Quality,Size,Name 0x000000710161b19c,U,000508, 0x000000710161b398,U,000508, 0x000000710161b594,U,000508, -0x000000710161b790,U,000508, -0x000000710161b98c,U,000508, -0x000000710161bb88,U,000508, +0x000000710161b790,L,000508,hkpWorldCallbackUtil::fireEntityShapeSet +0x000000710161b98c,L,000508,hkpWorldCallbackUtil::fireEntitySetMotionType +0x000000710161bb88,L,000508,hkpWorldCallbackUtil::firePhantomAdded 0x000000710161bd84,U,000508, 0x000000710161bf80,U,000508, 0x000000710161c17c,U,000508, @@ -105513,7 +105513,7 @@ Address,Quality,Size,Name 0x000000710161e304,U,000524, 0x000000710161e510,U,000524, 0x000000710161e71c,U,000524, -0x000000710161e928,U,000508, +0x000000710161e928,L,000508,hkpWorldCallbackUtil::fireInactiveEntityMoved 0x000000710161eb24,U,000512, 0x000000710161ed24,U,000512, 0x000000710161ef24,U,000512, @@ -105528,7 +105528,7 @@ Address,Quality,Size,Name 0x000000710161fd40,U,000072, 0x000000710161fd88,U,000252, 0x000000710161fe84,U,000152, -0x000000710161ff1c,U,001608, +0x000000710161ff1c,L,001608,hkpSimulation::collideEntitiesBroadPhaseDiscrete 0x0000007101620564,U,000996, 0x0000007101620948,U,000148, 0x00000071016209dc,U,000404, @@ -105637,10 +105637,10 @@ Address,Quality,Size,Name 0x0000007101624d50,U,000084, 0x0000007101624da4,U,000032, 0x0000007101624dc4,U,000188, -0x0000007101624e80,U,003460, +0x0000007101624e80,L,003460,hkpWorldOperationQueue::queueOperation 0x0000007101625c04,U,000056, 0x0000007101625c3c,U,000508, -0x0000007101625e38,U,004644, +0x0000007101625e38,L,004644,hkpWorldOperationQueue::executeAllPending 0x000000710162705c,U,000092, 0x00000071016270b8,U,000360, 0x0000007101627220,U,000344, @@ -105676,8 +105676,8 @@ Address,Quality,Size,Name 0x000000710162c518,U,002492, 0x000000710162ced4,U,000232, 0x000000710162cfbc,U,000684, -0x000000710162d268,U,000232, -0x000000710162d350,U,000232, +0x000000710162d268,L,000232,hkpEntityCallbackUtil::fireEntityShapeSet +0x000000710162d350,L,000232,hkpEntityCallbackUtil::fireEntitySetMotionType 0x000000710162d438,U,000232, 0x000000710162d520,U,000356, 0x000000710162d684,U,000356, @@ -105711,7 +105711,7 @@ Address,Quality,Size,Name 0x000000710162e998,U,000096, 0x000000710162e9f8,U,000960, 0x000000710162edb8,U,000872, -0x000000710162f120,U,000268, +0x000000710162f120,L,000268,hkpContinuousSimulation::advanceTime 0x000000710162f22c,U,000460, 0x000000710162f3f8,U,000920, 0x000000710162f790,U,000492, @@ -106054,9 +106054,9 @@ Address,Quality,Size,Name 0x000000710166dccc,U,000160, 0x000000710166dd6c,U,000160, 0x000000710166de0c,U,000184, -0x000000710166dec4,U,000012, -0x000000710166ded0,U,000040, -0x000000710166def8,U,000080, +0x000000710166dec4,L,000012,hkpShapeDisplayBuilder::hkpShapeDisplayBuilderEnvironment::hkpShapeDisplayBuilderEnvironment +0x000000710166ded0,L,000040,hkpShapeDisplayBuilder::hkpShapeDisplayBuilder +0x000000710166def8,L,000080,hkpShapeDisplayBuilder::buildDisplayGeometries 0x000000710166df48,U,002124, 0x000000710166e794,U,000244, 0x000000710166e888,U,001268, @@ -106075,7 +106075,7 @@ Address,Quality,Size,Name 0x00000071016718cc,U,001284, 0x0000007101671dd0,U,001000, 0x00000071016721b8,U,000092, -0x0000007101672214,U,000084, +0x0000007101672214,U,000084,hkpUserShapeDisplayBuilder::dtor 0x0000007101672268,U,000080, 0x00000071016722b8,U,000224, 0x0000007101672398,U,000084, @@ -106108,7 +106108,7 @@ Address,Quality,Size,Name 0x0000007101674958,U,000084, 0x00000071016749ac,U,000460, 0x0000007101674b78,U,000096, -0x0000007101674bd8,U,000124, +0x0000007101674bd8,L,000124,hkpPhysicsContext::hkpPhysicsContext 0x0000007101674c54,U,000376, 0x0000007101674dcc,U,000208, 0x0000007101674e9c,U,000008, @@ -106126,9 +106126,9 @@ Address,Quality,Size,Name 0x0000007101675104,U,000096, 0x0000007101675164,U,000152, 0x00000071016751fc,U,000832, -0x000000710167553c,U,000576, +0x000000710167553c,L,000576,hkpPhysicsContext::addForInspection 0x000000710167577c,U,000152, -0x0000007101675814,U,000248, +0x0000007101675814,L,000248,hkpPhysicsContext::addWorld 0x000000710167590c,U,000004, 0x0000007101675910,U,000008, 0x0000007101675918,U,000036, @@ -106139,17 +106139,17 @@ Address,Quality,Size,Name 0x00000071016759a4,U,000036, 0x00000071016759c8,U,000016, 0x00000071016759d8,U,000016, -0x00000071016759e8,U,000108, +0x00000071016759e8,L,000108,hkpPhysicsContext::constraintAddedCallback 0x0000007101675a54,U,000108, -0x0000007101675ac0,U,000088, +0x0000007101675ac0,L,000088,hkpPhysicsContext::constraintRemovedCallback 0x0000007101675b18,U,000088, -0x0000007101675b70,U,000036, +0x0000007101675b70,L,000036,hkpPhysicsContext::actionAddedCallback 0x0000007101675b94,U,000036, -0x0000007101675bb8,U,000016, +0x0000007101675bb8,L,000016,hkpPhysicsContext::actionRemovedCallback 0x0000007101675bc8,U,000016, 0x0000007101675bd8,U,000144, 0x0000007101675c68,U,000088, -0x0000007101675cc0,U,000012, +0x0000007101675cc0,U,000012,hkpPhysicsContext::getType 0x0000007101675ccc,U,000012, 0x0000007101675cd8,U,000088, 0x0000007101675d30,U,000004,nullsub_5221 @@ -106221,7 +106221,7 @@ Address,Quality,Size,Name 0x000000710167811c,U,000148, 0x00000071016781b0,U,000516, 0x00000071016783b4,U,000392, -0x000000710167853c,U,000364, +0x000000710167853c,L,000364,hkpCharacterRigidBody::hkpCharacterRigidBody 0x00000071016786a8,U,000088, 0x0000007101678700,U,000328, 0x0000007101678848,U,000008, @@ -106402,7 +106402,7 @@ Address,Quality,Size,Name 0x000000710167e99c,U,000008, 0x000000710167e9a4,U,000096, 0x000000710167ea04,U,000212, -0x000000710167ead8,U,000060, +0x000000710167ead8,L,000060,hkpSweptTransformDisplayViewer::registerViewer 0x000000710167eb14,U,000088, 0x000000710167eb6c,U,000436, 0x000000710167ed20,U,000088, @@ -106421,7 +106421,7 @@ Address,Quality,Size,Name 0x000000710167f1f8,U,000072, 0x000000710167f240,U,000004, 0x000000710167f244,U,000008, -0x000000710167f24c,U,001620, +0x000000710167f24c,L,001620,hkpSweptTransformDisplayViewer::entityAddedCallback 0x000000710167f8a0,U,000008, 0x000000710167f8a8,U,000344, 0x000000710167fa00,U,000008, @@ -107025,7 +107025,7 @@ Address,Quality,Size,Name 0x000000710169c43c,U,000008, 0x000000710169c444,U,000164, 0x000000710169c4e8,U,000548, -0x000000710169c70c,U,000624,hkSerializeUtil::savePackfile +0x000000710169c70c,L,000624,hkSerializeUtil::savePackfile 0x000000710169c97c,U,000588, 0x000000710169cbc8,U,000156, 0x000000710169cc64,U,000020, @@ -107042,14 +107042,14 @@ Address,Quality,Size,Name 0x000000710169d084,U,000044, 0x000000710169d0b0,U,000048, 0x000000710169d0e0,U,000184, -0x000000710169d198,U,000428,hkNativePackfileUtils::validatePackfileHeader +0x000000710169d198,L,000428,hkNativePackfileUtils::validatePackfileHeader 0x000000710169d344,U,000544, -0x000000710169d564,U,001192,hkNativePackfileUtils::loadInPlace +0x000000710169d564,L,001192,hkNativePackfileUtils::loadInPlace 0x000000710169da0c,U,000216, 0x000000710169dae4,U,000032, 0x000000710169db04,U,000044, 0x000000710169db30,U,000172, -0x000000710169dbdc,U,000256,hkCreateBuiltInTypeRegistry +0x000000710169dbdc,L,000256,hkCreateBuiltInTypeRegistry 0x000000710169dcdc,U,000084, 0x000000710169dd30,U,000016, 0x000000710169dd40,U,000016, @@ -107332,13 +107332,13 @@ Address,Quality,Size,Name 0x00000071016b0e70,U,004444, 0x00000071016b1fcc,U,000968, 0x00000071016b2394,U,000008, -0x00000071016b239c,U,000136, +0x00000071016b239c,L,000136,hkVisualDebugger::hkVisualDebugger 0x00000071016b2424,U,000244, 0x00000071016b2518,U,000944, 0x00000071016b28c8,U,000688, 0x00000071016b2b78,U,000500, 0x00000071016b2d6c,U,000088, -0x00000071016b2dc4,U,000196, +0x00000071016b2dc4,L,000196,hkVisualDebugger::addTrackedObjects 0x00000071016b2e88,U,000216, 0x00000071016b2f60,U,000240, 0x00000071016b3050,U,000152, @@ -107367,7 +107367,7 @@ Address,Quality,Size,Name 0x00000071016b3a58,U,000004,nullsub_5256 0x00000071016b3a5c,U,000236, 0x00000071016b3b48,U,000088, -0x00000071016b3ba0,U,000364, +0x00000071016b3ba0,L,000364,hkProcessFactory::registerProcess 0x00000071016b3d0c,U,000212, 0x00000071016b3de0,U,000152, 0x00000071016b3e78,U,000156, diff --git a/lib/hkStubs/CMakeLists.txt b/lib/hkStubs/CMakeLists.txt new file mode 100644 index 00000000..c6c2dead --- /dev/null +++ b/lib/hkStubs/CMakeLists.txt @@ -0,0 +1,25 @@ +project(hkStubs CXX ASM) + +add_library(hkStubs OBJECT + Havok/Common/Base/Container/String/hkStringPtr.h + Havok/Common/Base/Types/hkBaseTypes.h + Havok/Common/Base/hkBase.h + Havok/Common/Base/Math/hkMath.h + Havok/Common/Base/Math/Vector/hkVector4.h + Havok/Common/Base/Object/hkBaseObject.h + Havok/Common/Base/Object/hkReferencedObject.h + Havok/Physics/Collide/Shape/hkpShape.h + Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h + Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h + Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h + Havok/Physics/Dynamics/Entity/hkpEntity.h + Havok/Physics/Dynamics/Entity/hkpRigidBody.h + Havok/Physics/Dynamics/World/hkpWorld.h + Havok/Physics/Dynamics/World/hkpWorld.cpp + Havok/Physics/Dynamics/World/hkpWorldEntity.h +) + +target_compile_options(hkStubs PRIVATE -fno-exceptions) +target_compile_options(hkStubs PRIVATE -fno-strict-aliasing) +target_compile_options(hkStubs PRIVATE -Wno-invalid-offsetof) +target_include_directories(hkStubs PUBLIC ./) diff --git a/lib/hkStubs/Havok/Common/Base/Container/String/hkStringPtr.h b/lib/hkStubs/Havok/Common/Base/Container/String/hkStringPtr.h new file mode 100644 index 00000000..a0d57263 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Container/String/hkStringPtr.h @@ -0,0 +1,11 @@ +#pragma once + +class hkStringPtr { +public: + hkStringPtr(); + + hkStringPtr& operator=(const char* s); + +private: + const char* m_stringAndFlag; +}; diff --git a/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4.h b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4.h new file mode 100644 index 00000000..6ca0f7ee --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4.h @@ -0,0 +1,15 @@ +#pragma once + +class hkVector4 { +public: + hkVector4() {} + hkVector4(hkReal x, hkReal y, hkReal z, hkReal w = 0) { + v[0] = x; + v[1] = y; + v[2] = z; + v[3] = w; + } + m128 v; + + void sub_7100FABE80(const hkVector4&, const hkVector4&); +}; diff --git a/lib/hkStubs/Havok/Common/Base/Math/hkMath.h b/lib/hkStubs/Havok/Common/Base/Math/hkMath.h new file mode 100644 index 00000000..c9a2f723 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Math/hkMath.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +#include diff --git a/lib/hkStubs/Havok/Common/Base/Object/hkBaseObject.h b/lib/hkStubs/Havok/Common/Base/Object/hkBaseObject.h new file mode 100644 index 00000000..072425f7 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Object/hkBaseObject.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +class hkBaseObject { +public: + virtual ~hkBaseObject() {} +}; diff --git a/lib/hkStubs/Havok/Common/Base/Object/hkReferencedObject.h b/lib/hkStubs/Havok/Common/Base/Object/hkReferencedObject.h new file mode 100644 index 00000000..aacc1c8e --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Object/hkReferencedObject.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +class hkReferencedObject : public hkBaseObject { +public: + virtual ~hkReferencedObject() {} + + virtual const void* getClassType() const; +}; diff --git a/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h b/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h new file mode 100644 index 00000000..9e7752e6 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h @@ -0,0 +1,64 @@ +#pragma once + +using hkFloat32 = float; +using hkDouble64 = double; +using hkReal = hkFloat32; + +using hkChar = signed char; +using hkInt8 = signed char; +using hkInt16 = signed short; +using hkInt32 = signed int; + +using hkUchar = unsigned char; +using hkUint8 = unsigned char; +using hkUint16 = unsigned short; +using hkUint32 = unsigned int; + +using hkUint64 = unsigned long long; +using m128 = __attribute((vector_size(16))) float; + +class hkHalf { +public: + hkHalf() {} + + explicit hkHalf(const float& f) { + int t = ((const int*)&f)[0]; + m_value = hkInt16(t >> 16); + } + + hkHalf& operator=(const float& f) { + int t = ((const int*)&f)[0]; + m_value = hkInt16(t >> 16); + return *this; + } + + hkHalf& operator=(const hkHalf& o) { + m_value = o.m_value; + return *this; + } + + bool operator==(const hkHalf& o) const { return (m_value == o.m_value); } + + void store(float* f) const { + hkUint32* i = (hkUint32*)f; + i[0] = m_value << 16; + } + + void setZero() { m_value = 0; } + + void setOne() { m_value = 0x3F80; } + + operator float() const { + union { + int i; + float f; + } u; + u.i = (m_value << 16); + return u.f; + } + + hkInt16 getInt16() const { return m_value; } + +private: + hkInt16 m_value; +}; diff --git a/lib/hkStubs/Havok/Common/Base/hkBase.h b/lib/hkStubs/Havok/Common/Base/hkBase.h new file mode 100644 index 00000000..ddb7b42b --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/hkBase.h @@ -0,0 +1,9 @@ +#pragma once + +#include +#include +#include + +#include + +#include diff --git a/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h b/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h new file mode 100644 index 00000000..0935d807 --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +class hkpCapsuleShape : public hkpShape { +public: + hkpCapsuleShape(const hkVector4& vertexA, const hkVector4& vertexB, hkReal radius); + virtual ~hkpCapsuleShape(); +}; diff --git a/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h b/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h new file mode 100644 index 00000000..b742852e --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// TODO +class hkpConvexShape {}; diff --git a/lib/hkStubs/Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h b/lib/hkStubs/Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h new file mode 100644 index 00000000..4e48a478 --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// TODO +class hkpSphereRepShape {}; diff --git a/lib/hkStubs/Havok/Physics/Collide/Shape/hkpShape.h b/lib/hkStubs/Havok/Physics/Collide/Shape/hkpShape.h new file mode 100644 index 00000000..bedf8639 --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Collide/Shape/hkpShape.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +class hkpShape : public hkReferencedObject { +public: + virtual ~hkpShape(); + + virtual hkReal getMaximumProjection(const hkVector4& direction) const; + + hkUchar filler[0x8]; + hkUint64 m_type; + hkUchar filler2[0x30]; +}; diff --git a/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpEntity.h b/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpEntity.h new file mode 100644 index 00000000..a51c2209 --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpEntity.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +class hkpMotion { +public: + virtual ~hkpMotion(); + hkUchar _0[0xc0]; + + /* 0xc8 */ hkHalf m_motionState__m_timeFactor; + /* */ hkUchar _cc[0x128 - 0xcc]; + /* 0x128 */ void* _128; +}; + +struct hkpMaxSizeMotion : hkpMotion { + hkUchar fill[0x140 - sizeof(hkpMotion)]; +}; // 0x140 + +class hkpEntity : public hkpWorldEntity { +public: + virtual ~hkpEntity(); + + /* */ hkUchar _133[0x150 - 0x133]; + /* 0x150 */ hkpMaxSizeMotion m_motion; +}; diff --git a/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpRigidBody.h b/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpRigidBody.h new file mode 100644 index 00000000..7a5a2534 --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpRigidBody.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +class hkpRigidBody : public hkpEntity { +public: + virtual ~hkpRigidBody(); + void enableDeactivation(bool _enableDeactivation); +}; diff --git a/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.cpp b/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.cpp new file mode 100644 index 00000000..c51ce06c --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.cpp @@ -0,0 +1,3 @@ +#include "Havok/Physics/Dynamics/World/hkpWorld.h" + +hkpWorld::hkpWorld() {} diff --git a/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.h b/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.h new file mode 100644 index 00000000..ea246a97 --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.h @@ -0,0 +1,5 @@ +#pragma once + +class hkpWorld { + hkpWorld(); +}; diff --git a/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorldEntity.h b/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorldEntity.h new file mode 100644 index 00000000..3dd937bc --- /dev/null +++ b/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorldEntity.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +class hkpWorldEntity : public hkReferencedObject { +public: + virtual ~hkpWorldEntity() {} + + void setUserData(void* data) { m_userData = data; } + + void setName(const char* name) { m_name = name; } + + /* */ hkUchar _8[0x18 - 0x8]; + /* 0x018 */ void* m_userData; + /* */ hkUchar _20[0x88 - 0x20]; + /* 0x088 */ hkReal _88; + /* */ hkUchar _8c[0xb0 - 0x8c]; + /* 0x0b0 */ hkStringPtr m_name; + /* */ hkUchar _b8[0x132 - 0xb8]; + /* 0x132 */ hkUchar _132; +}; diff --git a/src/KingSystem/Physics/CMakeLists.txt b/src/KingSystem/Physics/CMakeLists.txt index 7f2b64b9..1d755e79 100644 --- a/src/KingSystem/Physics/CMakeLists.txt +++ b/src/KingSystem/Physics/CMakeLists.txt @@ -1,4 +1,6 @@ target_sources(uking PRIVATE + physInstanceSet.cpp + physInstanceSet.h Cloth/physClothParam.cpp Cloth/physClothParam.h Ragdoll/physRagdollConfig.cpp @@ -7,10 +9,26 @@ target_sources(uking PRIVATE Ragdoll/physRagdollParam.h RigidBody/physEdgeRigidBodyParam.cpp RigidBody/physEdgeRigidBodyParam.h + RigidBody/physMotionAccessor.cpp + RigidBody/physMotionAccessor.h + RigidBody/physRigidBody.cpp + RigidBody/physRigidBody.h + RigidBody/physRigidBodyFactory.cpp + RigidBody/physRigidBodyFactory.h RigidBody/physRigidBodyParam.cpp RigidBody/physRigidBodyParam.h RigidBody/physRigidBodySetParam.cpp RigidBody/physRigidBodySetParam.h + RigidBody/Shape/physBoxShape.cpp + RigidBody/Shape/physBoxShape.h + RigidBody/Shape/physCapsuleShape.cpp + RigidBody/Shape/physCapsuleShape.h + RigidBody/Shape/physCylinderShape.cpp + RigidBody/Shape/physCylinderShape.h + RigidBody/Shape/physSphereShape.cpp + RigidBody/Shape/physSphereShape.h + RigidBody/Shape/physWaterCylinderShape.cpp + RigidBody/Shape/physWaterCylinderShape.h SupportBone/physSupportBoneParam.cpp SupportBone/physSupportBoneParam.h SupportBone/physSupportBoneResource.cpp @@ -28,6 +46,8 @@ target_sources(uking PRIVATE System/physDefines.h System/physMaterialTable.cpp System/physMaterialTable.h + System/physMemSystem.cpp + System/physMemSystem.h System/physParamSet.cpp System/physParamSet.h System/physRagdollControllerKeyList.h diff --git a/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.cpp b/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.h b/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.h new file mode 100644 index 00000000..92595353 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/Shape/physBoxShape.h @@ -0,0 +1,27 @@ +#pragma once + +#include "KingSystem/Physics/RigidBody/physRigidBody.h" + +namespace ksys::phys { + +class BoxView; + +struct BoxBody { + virtual ~BoxBody(); + + RigidBody* init(u32 flag, RigidBodyParamView* view, sead::Heap* heap); +}; + +struct BoxShape { + BoxBody* init(sead::Heap* heap); +}; + +class BoxView : public RigidBodyParamView { + SEAD_RTTI_OVERRIDE(BoxView, RigidBodyParamView) +public: + u8 _90; + float _94; + BoxShape shape; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.cpp b/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.cpp new file mode 100644 index 00000000..45ccc240 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.cpp @@ -0,0 +1,118 @@ +#include "KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h" +#include +#include +#include + +namespace ksys::phys { + +CapsuleBody* CapsuleShape::init(sead::Heap* heap) { + void* ptr = heap->tryAlloc(sizeof(hkpCapsuleShape), 0x10); + if (ptr == nullptr) + return nullptr; + + auto* hk_shape = + new (ptr) hkpCapsuleShape(hkVector4(vertex_a.x, vertex_a.y, vertex_a.z), + hkVector4(vertex_b.x, vertex_b.y, vertex_b.z), radius); + auto* body = new (heap) CapsuleBody(vertex_a, vertex_b, radius, _20, _28, _30, _34, hk_shape); + if (_38) { + body->unk.shape_type = 1 << 23; + } + body->unk._10 = nullptr; + hk_shape->m_type = body->unk.shape_type; + return body; +} + +CapsuleBody* CapsuleBody::clone(sead::Heap* heap) { + CapsuleShape shape; + + shape._20 = 0; + shape._28 = sead::SafeString::cEmptyString.cstr(); + shape._30 = 0; + shape._34 = 0; + shape._38 = false; + shape.radius = radius; + shape.vertex_a = vertex_a; + shape.vertex_b = vertex_b; + + CapsuleBody* body = shape.init(heap); + body->unk.shape_type = unk.shape_type; + body->unk._10 = nullptr; + if (body->shape != nullptr) + body->shape->m_type = unk.shape_type; + return body; +} + +f32 CapsuleBody::getRadius() const { + return radius; +} + +void CapsuleBody::getVertices(sead::Vector3f* va, sead::Vector3f* vb) const { + if (va != nullptr) + *va = vertex_a; + if (vb != nullptr) + *vb = vertex_b; +} + +CapsuleBody::~CapsuleBody() { + if (shape != nullptr) { + ::operator delete(shape); + shape = nullptr; + } +} + +bool CapsuleBody::setRadius(f32 r) { + if (r <= 0.0f || r == radius) { + return false; + } + radius = r; + flags.set(Flag::Modified); + return true; +} + +bool CapsuleBody::setVertices(const sead::Vector3f& va, const sead::Vector3f& vb) { + if (vertex_a == va && vertex_b == vb) { + return false; + } + vertex_a = va; + vertex_b = vb; + flags.set(Flag::Modified); + return true; +} + +f32 CapsuleBody::getVolume() const { + f32 dy = vertex_a.y - vertex_b.y; + f32 dx = vertex_a.x - vertex_b.x; + f32 dz = vertex_a.z - vertex_b.z; + f32 dist = sqrtf(dx * dx + dy * dy + dz * dz); + f32 pi_r_sq = radius * radius * sead::Mathf::pi(); + f32 c = (radius * 4.0f) / 3.0f; + return pi_r_sq * (dist + c); +} + +hkpShape* CapsuleBody::getShape() { + return shape; +} + +const hkpShape* CapsuleBody::getShape() const { + return shape; +} + +void CapsuleBody::sub_7100FABE80(sead::Vector3f* veca, sead::Vector3f* vecb, + const hkVector4& rb_vec) { + if (veca != nullptr) { + hkVector4 tmp; + tmp.sub_7100FABE80(rb_vec, hkVector4(vertex_a.x, vertex_a.y, vertex_a.z)); + veca->x = tmp.v[0]; + veca->y = tmp.v[1]; + veca->z = tmp.v[2]; + } + if (vecb != nullptr) { + hkVector4 tmp; + tmp.sub_7100FABE80(rb_vec, hkVector4(vertex_b.x, vertex_b.y, vertex_b.z)); + vecb->x = tmp.v[0]; + vecb->y = tmp.v[1]; + vecb->z = tmp.v[2]; + } +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h b/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h new file mode 100644 index 00000000..73eb1d3b --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h @@ -0,0 +1,78 @@ +#pragma once + +#include +#include +#include +#include "KingSystem/Physics/RigidBody/physRigidBody.h" + +class hkpShape; +class hkVector4; + +namespace ksys::phys { + +class CapsuleView; +struct CapsuleShape; + +struct CapsuleBody { + enum class Flag { + Modified = 1 << 0, + }; + + struct Unk { + Unk(u32 a1, const char* a2, u32 a3, u32 a4, u32 a5); + virtual ~Unk(); + + u32 shape_type = 0; + const char* _10; + }; + + CapsuleBody(const sead::Vector3f& va, const sead::Vector3f& vb, f32 r, u32 a4, const char* a5, + u32 a6, u32 a7, hkpShape* a8) + : vertex_a(va), vertex_b(vb), radius(r), unk(a4, a5, a6, a7, 0), shape(a8) {} + virtual ~CapsuleBody(); + + virtual hkpShape* getShape(); + virtual const hkpShape* getShape() const; + virtual void updateChanges(); + virtual void scaleVerts(f32 scale); + + RigidBody* init(u32 flag, RigidBodyParamView* view, sead::Heap* heap); + CapsuleBody* clone(sead::Heap* heap); + f32 getRadius() const; + void getVertices(sead::Vector3f* va, sead::Vector3f* vb) const; + bool setRadius(f32 r); + bool setVertices(const sead::Vector3f& va, const sead::Vector3f& vb); + f32 getVolume() const; + void sub_7100FABE80(sead::Vector3f* veca, sead::Vector3f* vecb, const hkVector4& rb_vec); + + sead::Vector3f vertex_a; + sead::TypedBitFlag> flags{}; + sead::Vector3f vertex_b; + f32 radius; + Unk unk; + hkpShape* shape; +}; + +struct CapsuleShape { + CapsuleBody* init(sead::Heap* heap); + + sead::Vector3f vertex_a; + sead::Vector3f vertex_b; + f32 radius; + u32 _1c; + u32 _20; + const char* _28; + u32 _30; + u32 _34; + bool _38; +}; + +class CapsuleView : public RigidBodyParamView { + SEAD_RTTI_OVERRIDE(CapsuleView, RigidBodyParamView) +public: + u8 _90; + float _94; + CapsuleShape shape; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/Shape/physCylinderShape.cpp b/src/KingSystem/Physics/RigidBody/Shape/physCylinderShape.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/KingSystem/Physics/RigidBody/Shape/physCylinderShape.h b/src/KingSystem/Physics/RigidBody/Shape/physCylinderShape.h new file mode 100644 index 00000000..966315aa --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/Shape/physCylinderShape.h @@ -0,0 +1,27 @@ +#pragma once + +#include "KingSystem/Physics/RigidBody/physRigidBody.h" + +namespace ksys::phys { + +class CylinderView; + +struct CylinderBody { + virtual ~CylinderBody(); + + RigidBody* init(u32 flag, RigidBodyParamView* view, sead::Heap* heap); +}; + +struct CylinderShape { + CylinderBody* init(sead::Heap* heap); +}; + +class CylinderView : public RigidBodyParamView { + SEAD_RTTI_OVERRIDE(CylinderView, RigidBodyParamView) +public: + u8 _90; + float _94; + CylinderShape shape; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/Shape/physSphereShape.cpp b/src/KingSystem/Physics/RigidBody/Shape/physSphereShape.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/KingSystem/Physics/RigidBody/Shape/physSphereShape.h b/src/KingSystem/Physics/RigidBody/Shape/physSphereShape.h new file mode 100644 index 00000000..fa791563 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/Shape/physSphereShape.h @@ -0,0 +1,27 @@ +#pragma once + +#include "KingSystem/Physics/RigidBody/physRigidBody.h" + +namespace ksys::phys { + +class SphereView; + +struct SphereBody { + virtual ~SphereBody(); + + RigidBody* init(u32 flag, RigidBodyParamView* view, sead::Heap* heap); +}; + +struct SphereShape { + SphereBody* init(sead::Heap* heap); +}; + +class SphereView : public RigidBodyParamView { + SEAD_RTTI_OVERRIDE(SphereView, RigidBodyParamView) +public: + u8 _90; + float _94; + SphereShape shape; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/Shape/physWaterCylinderShape.cpp b/src/KingSystem/Physics/RigidBody/Shape/physWaterCylinderShape.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/KingSystem/Physics/RigidBody/Shape/physWaterCylinderShape.h b/src/KingSystem/Physics/RigidBody/Shape/physWaterCylinderShape.h new file mode 100644 index 00000000..d5225b24 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/Shape/physWaterCylinderShape.h @@ -0,0 +1,27 @@ +#pragma once + +#include "KingSystem/Physics/RigidBody/physRigidBody.h" + +namespace ksys::phys { + +class WaterCylinderView; + +struct WaterCylinderBody { + virtual ~WaterCylinderBody(); + + RigidBody* init(u32 flag, RigidBodyParamView* view, sead::Heap* heap); +}; + +struct WaterCylinderShape { + WaterCylinderBody* init(sead::Heap* heap); +}; + +class WaterCylinderView : public RigidBodyParamView { + SEAD_RTTI_OVERRIDE(WaterCylinderView, RigidBodyParamView) +public: + u8 _90; + float _94; + WaterCylinderShape shape; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physMotionAccessor.cpp b/src/KingSystem/Physics/RigidBody/physMotionAccessor.cpp new file mode 100644 index 00000000..325c7e1f --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/physMotionAccessor.cpp @@ -0,0 +1,34 @@ +#include "KingSystem/Physics/RigidBody/physMotionAccessor.h" +#include "KingSystem/Physics/RigidBody/physRigidBody.h" + +namespace ksys::phys { + +MotionAccessor::MotionAccessor(RigidBody* body) : mBody(body) {} + +MotionAccessor::~MotionAccessor() = default; + +MotionType MotionAccessor::getMotionInfo() const { + return mBody->getMotionInfo(); +} + +hkpMotion* MotionAccessor::getMotion() const { + return mBody->getMotion(); +} + +void MotionAccessor::setMotionFlag(RigidBody::MotionFlag flag) { + mBody->setMotionFlag(flag); +} + +bool MotionAccessor::hasMotionSet(RigidBody::MotionFlag flag) const { + return mBody->getMotionFlags().isOn(flag); +} + +bool MotionAccessor::hasMotionDisabled(RigidBody::MotionFlag flag) const { + return mBody->getMotionFlags().isOff(flag); +} + +void MotionAccessor::disableMotionFlag(RigidBody::MotionFlag flag) { + mBody->resetMotionFlagDirect(flag); +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physMotionAccessor.h b/src/KingSystem/Physics/RigidBody/physMotionAccessor.h new file mode 100644 index 00000000..3b18cf24 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/physMotionAccessor.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include "KingSystem/Physics/RigidBody/physRigidBody.h" + +class hkpMotion; + +namespace ksys::phys { + +class MotionAccessor { + SEAD_RTTI_BASE(MotionAccessor) +public: + explicit MotionAccessor(RigidBody* body); + virtual ~MotionAccessor(); + + MotionType getMotionInfo() const; + hkpMotion* getMotion() const; + void setMotionFlag(RigidBody::MotionFlag flag); + bool hasMotionSet(RigidBody::MotionFlag flag) const; + bool hasMotionDisabled(RigidBody::MotionFlag flag) const; + void disableMotionFlag(RigidBody::MotionFlag flag); + +private: + RigidBody* mBody; + void* _10 = nullptr; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp new file mode 100644 index 00000000..a79ea7dd --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp @@ -0,0 +1,86 @@ +#include "KingSystem/Physics/RigidBody/physRigidBody.h" +#include +#include "KingSystem/Physics/System/physMemSystem.h" + +namespace ksys::phys { + +// NON_MATCHING +RigidBody::RigidBody(u32 a, u32 mass_scaling, hkpRigidBody* hk_body, const sead::SafeString& name, + sead::Heap* heap, bool a7) + : mHkBody(hk_body), mHkBodyMgr(hk_body), _b4(a) { + if (!name.isEmpty()) { + hk_body->setName(name.cstr()); + } + hk_body->setUserData(this); + hk_body->m_motion._128 = nullptr; + hk_body->m_motion.m_motionState__m_timeFactor.setOne(); + hk_body->enableDeactivation(true); + hk_body->_88 = 0.1f; + if (mFlags.isOn(Flag1::MassScaling)) { + hk_body->_132 |= 1; + } + + mFlags.change(Flag1::_80, _b4 == 5); + mFlags.change(Flag1::MassScaling, mass_scaling); + mFlags.change(Flag1::_10, a7); + mFlags.set(Flag1::_100); +} + +void RigidBody::setMotionFlag(MotionFlag flag) { + auto lock = sead::makeScopedLock(mCS); + + mMotionFlags.set(flag); + + if (mFlags.isOff(Flag1::_20) && mFlags.isOff(Flag1::_2)) { + mFlags.set(Flag1::_2); + MemSystem::instance()->_160->sub_7100FA6C8C(mFlags.isOn(Flag1::MassScaling), this); + } +} + +bool RigidBody::sub_7100F8D1F8() const { + return mFlags.isOn(Flag1::_8); +} + +bool RigidBody::sub_7100F8D204() const { + return mMotionFlags.isOn(MotionFlag::_1); +} + +bool RigidBody::sub_7100F8D210() const { + return mMotionFlags.isOn(MotionFlag::_2); +} + +// NON_MATCHING: mFlags is loaded differently +void RigidBody::sub_7100F8D21C() { + auto lock = sead::makeScopedLock(mCS); + + if (mMotionFlags.isOn(MotionFlag::_1)) { + mMotionFlags.reset(MotionFlag::_1); + mMotionFlags.set(MotionFlag::_2); + } else if (mFlags.isOn(Flag1::_8)) { + setMotionFlag(MotionFlag::_2); + } +} + +MotionType RigidBody::getMotionInfo() const { + if (mMotionFlags.isOn(MotionFlag::Dynamic)) + return MotionType::Dynamic; + if (mMotionFlags.isOn(MotionFlag::Keyframed)) + return MotionType::Keyframed; + if (mMotionFlags.isOn(MotionFlag::Fixed)) + return MotionType::Fixed; + return mHkBodyMgr.getMotionInfo(); +} + +void RigidBody::setContactMask(u32 value) { + mContactMask.setDirect(value); +} + +void RigidBody::setContactAll() { + mContactMask.makeAllOne(); +} + +void RigidBody::setContactNone() { + mContactMask.makeAllZero(); +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.h b/src/KingSystem/Physics/RigidBody/physRigidBody.h new file mode 100644 index 00000000..d6c14505 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.h @@ -0,0 +1,106 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h" +#include "KingSystem/Physics/System/physDefines.h" +#include "KingSystem/Utils/Types.h" + +class hkpRigidBody; +class hkpMotion; + +namespace ksys::phys { + +class MotionAccessor; + +class RigidBase { +public: + virtual ~RigidBase(); +}; + +class RigidBody : public sead::IDisposer, public RigidBase { + SEAD_RTTI_BASE(RigidBody) +public: + struct HkBodyMgr { + explicit HkBodyMgr(hkpRigidBody* body); + virtual ~HkBodyMgr(); + MotionType getMotionInfo() const; + + void* p; + }; + + enum class Flag1 { + MassScaling = 1 << 0, + _2 = 1 << 1, + _4 = 1 << 2, + _8 = 1 << 3, + _10 = 1 << 4, + _20 = 1 << 5, + _40 = 1 << 6, + _80 = 1 << 7, + _100 = 1 << 8, + }; + + enum class MotionFlag { + _1 = 1 << 0, + _2 = 1 << 1, + Dynamic = 1 << 2, + Keyframed = 1 << 3, + Fixed = 1 << 4, + _20 = 1 << 5, + }; + + RigidBody(u32 a, u32 mass_scaling, hkpRigidBody* hk_body, const sead::SafeString& name, + sead::Heap* heap, bool a7); + virtual ~RigidBody(); + + void sub_7100F8CFA0(); + void setMotionFlag(MotionFlag); + bool sub_7100F8D1F8() const; + bool sub_7100F8D204() const; + bool sub_7100F8D210() const; + void sub_7100F8D21C(); + void sub_7100F8D680(); + MotionType getMotionInfo() const; + u32 addContactLayer(ContactLayer); + u32 removeContactLayer(ContactLayer); + void setContactMask(u32); + void setContactAll(); + void setContactNone(); + void setCollideGround(bool); + void setCollideWater(bool); + void sub_7100F8F51C(); + void sub_7100F8F8CC(ContactLayer, GroundHit, void*); + void sub_7100F8F9E8(u32*, void*); + void sub_7100F8FA44(ContactLayer, u32); + hkpMotion* getMotion() const; + + bool isMassScaling() const { return mFlags.isOn(Flag1::MassScaling); } + const auto& getMotionFlags() const { return mMotionFlags; } + void resetMotionFlagDirect(const MotionFlag flag) { mMotionFlags.reset(flag); } + +private: + sead::CriticalSection mCS; + sead::TypedBitFlag> mFlags{}; + sead::TypedBitFlag> mMotionFlags{}; + sead::BitFlag32 mContactMask{}; + hkpRigidBody* mHkBody; + void* mActor = nullptr; + void* _88 = nullptr; + void* _90 = nullptr; + u16 _98 = 0; + HkBodyMgr mHkBodyMgr; + f32 _b0 = 0.0f; + u32 _b4; + MotionAccessor* mMotionAccessor = nullptr; + u16 _c0 = 0; + void* _c8 = nullptr; + void* _d0; +}; +KSYS_CHECK_SIZE_NX150(RigidBody, 0xD8); + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.cpp b/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.cpp new file mode 100644 index 00000000..57f8bdbe --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.cpp @@ -0,0 +1,56 @@ +#include "KingSystem/Physics/RigidBody/physRigidBodyFactory.h" + +#include "KingSystem/Physics/RigidBody/Shape/physBoxShape.h" +#include "KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h" +#include "KingSystem/Physics/RigidBody/Shape/physCylinderShape.h" +#include "KingSystem/Physics/RigidBody/Shape/physSphereShape.h" +#include "KingSystem/Physics/RigidBody/Shape/physWaterCylinderShape.h" + +namespace ksys::phys { + +RigidBody* RigidBodyFactory::createSphere(RigidBodyParamView* view, sead::Heap* heap) { + if (view->isDynamicSensor()) + view->motion_type = MotionType::Keyframed; + + auto* v = sead::DynamicCast(view); + SphereBody* body = v->shape.init(heap); + return body->init(1, view, heap); +} + +RigidBody* RigidBodyFactory::createCapsule(RigidBodyParamView* view, sead::Heap* heap) { + if (view->isDynamicSensor()) + view->motion_type = MotionType::Keyframed; + + auto* v = sead::DynamicCast(view); + CapsuleBody* body = v->shape.init(heap); + return body->init(1, view, heap); +} + +RigidBody* RigidBodyFactory::createCylinder(RigidBodyParamView* view, sead::Heap* heap) { + if (view->isDynamicSensor()) + view->motion_type = MotionType::Keyframed; + + auto* v = sead::DynamicCast(view); + CylinderBody* body = v->shape.init(heap); + return body->init(1, view, heap); +} + +RigidBody* RigidBodyFactory::createWaterCylinder(RigidBodyParamView* view, sead::Heap* heap) { + if (view->isDynamicSensor()) + view->motion_type = MotionType::Keyframed; + + auto* v = sead::DynamicCast(view); + WaterCylinderBody* body = v->shape.init(heap); + return body->init(1, view, heap); +} + +RigidBody* RigidBodyFactory::createBox(RigidBodyParamView* view, sead::Heap* heap) { + if (view->isDynamicSensor()) + view->motion_type = MotionType::Keyframed; + + auto* v = sead::DynamicCast(view); + BoxBody* body = v->shape.init(heap); + return body->init(1, view, heap); +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.h b/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.h new file mode 100644 index 00000000..22da0920 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/physRigidBodyFactory.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace sead { +class Heap; +} // namespace sead + +namespace ksys::phys { + +class RigidBody; +struct RigidBodyParamView; + +class RigidBodyFactory { +public: + static RigidBody* createSphere(RigidBodyParamView* view, sead::Heap* heap); + static RigidBody* createCapsule(RigidBodyParamView* view, sead::Heap* heap); + static RigidBody* createCylinder(RigidBodyParamView* view, sead::Heap* heap); + static RigidBody* createWaterCylinder(RigidBodyParamView* view, sead::Heap* heap); + static RigidBody* createBox(RigidBodyParamView* view, sead::Heap* heap); + static RigidBody* createWaterBox(RigidBodyParamView* view, sead::Heap* heap); + static RigidBody* createPolytope(RigidBodyParamView* view, sead::Heap* heap); + static RigidBody* createCollection(RigidBodyParamView* view, sead::Heap* heap); +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physRigidBodyParam.h b/src/KingSystem/Physics/RigidBody/physRigidBodyParam.h index 4804ecd1..c72f2155 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBodyParam.h +++ b/src/KingSystem/Physics/RigidBody/physRigidBodyParam.h @@ -49,37 +49,42 @@ struct ShapeParam; struct RigidBodyParamView { SEAD_RTTI_BASE(RigidBodyParamView) public: - const char* name; - u32 _10; - MotionType motion_type; - float mass; - sead::Vector3f inertia; - sead::Vector3f center_of_mass; - float linear_damping; - float angular_damping; - u8 _3c[8]; - float max_linear_velocity; - float max_angular_velocity_rad; - float max_impulse; - float col_impulse_scale; - float friction_scale; - float restitution_scale; - float water_buoyancy_scale; - float water_flow_effective_rate; - float magne_mass_scaling_factor; - bool gap68; - bool toi; - bool always_character_mass_scaling; - bool gap6B[13]; - ContactLayer contact_layer; - GroundHit groundhit; - u32 info_5e0; - u32 contact_mask; - u32 flags; - bool ignore_normal_for_impulse; - bool no_hit_ground; - bool no_hit_water; - bool no_char_standing_on; + const char* name = "no name"; + u32 _10 = -1; + MotionType motion_type = MotionType::Dynamic; + float mass = 1.0f; + sead::Vector3f inertia = sead::Vector3f::ones; + sead::Vector3f center_of_mass = sead::Vector3f::zero; + float linear_damping = 0.0f; + float angular_damping = 0.05f; + f32 _3c = 1.0f; + f32 _40 = 1.0f; + float max_linear_velocity = 200.0f; + float max_angular_velocity_rad = 200.0f; + float max_impulse = -1.0f; + float col_impulse_scale = 1.0f; + float friction_scale = 1.0f; + float restitution_scale = 1.0f; + float water_buoyancy_scale = 1.0f; + float water_flow_effective_rate = 1.0f; + float magne_mass_scaling_factor = 1.0f; + bool gap68 = true; + bool toi = false; + bool always_character_mass_scaling = false; + void* p = nullptr; + ContactLayer contact_layer = ContactLayer::EntityObject; + GroundHit groundhit = GroundHit::HitAll; + u32 info_5e0 = 0; + u32 contact_mask = 0; + u32 flags = 0x80000000; + bool ignore_normal_for_impulse = false; + bool no_hit_ground = false; + bool no_hit_water = false; + bool no_char_standing_on = false; + + bool isDynamicSensor() const { + return isSensorLayer(contact_layer) == 1 && motion_type == MotionType::Dynamic; + } }; KSYS_CHECK_SIZE_NX150(RigidBodyParamView, 0x90); diff --git a/src/KingSystem/Physics/System/physDefines.cpp b/src/KingSystem/Physics/System/physDefines.cpp index 94fd34d3..d5f2d123 100644 --- a/src/KingSystem/Physics/System/physDefines.cpp +++ b/src/KingSystem/Physics/System/physDefines.cpp @@ -2,7 +2,7 @@ namespace ksys::phys { -bool isSensorLayer(ContactLayer layer) { +u32 isSensorLayer(ContactLayer layer) { return layer > ContactLayer::EntityEnd; } diff --git a/src/KingSystem/Physics/System/physDefines.h b/src/KingSystem/Physics/System/physDefines.h index 4105db15..4664b7b2 100644 --- a/src/KingSystem/Physics/System/physDefines.h +++ b/src/KingSystem/Physics/System/physDefines.h @@ -164,7 +164,7 @@ enum class MotionType { Unknown = 3, }; -bool isSensorLayer(ContactLayer layer); +u32 isSensorLayer(ContactLayer layer); u32 makeContactLayerMask(ContactLayer layer); u32 getContactLayerBase(ContactLayerType type); u32 getContactLayerBaseRelativeValue(ContactLayer layer); diff --git a/src/KingSystem/Physics/System/physMemSystem.cpp b/src/KingSystem/Physics/System/physMemSystem.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/KingSystem/Physics/System/physMemSystem.h b/src/KingSystem/Physics/System/physMemSystem.h new file mode 100644 index 00000000..5866d072 --- /dev/null +++ b/src/KingSystem/Physics/System/physMemSystem.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace ksys::phys { + +class RigidBody; + +class MemSystem { + SEAD_SINGLETON_DISPOSER(MemSystem) +public: + struct Struct160 { + void sub_7100FA6C8C(bool, RigidBody*); + }; + + u8 _20[0x140]; + Struct160* _160; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/physInstanceSet.cpp b/src/KingSystem/Physics/physInstanceSet.cpp new file mode 100644 index 00000000..3742d678 --- /dev/null +++ b/src/KingSystem/Physics/physInstanceSet.cpp @@ -0,0 +1,211 @@ +#include "KingSystem/Physics/physInstanceSet.h" + +namespace ksys::phys { + +void InstanceSet::setFlag2() { + mFlags.set(Flag::_2); + if (_d8 != nullptr) { + mFlags.set(Flag::_2); + mFlags.set(Flag::DisableDraw); + } +} + +void InstanceSet::clothVisibleStuff() { + if (_d8 != nullptr) { + mFlags.set(Flag::DisableDraw); + } +} + +void InstanceSet::setInDemo() { + mFlags.set(Flag::InDemo); +} + +void InstanceSet::resetInDemo() { + mFlags.reset(Flag::InDemo); +} + +void InstanceSet::clothVisibleStuff_0(s32 setting) { + if (mFlags.isOn(Flag::InDemo)) + return; + + switch (setting) { + case -2: + mFlags.reset(Flag::Cloth2); + mFlags.set(Flag::Cloth1); + break; + case -1: + mFlags.reset(Flag::Cloth3); + mFlags.reset(Flag::Cloth2); + mFlags.reset(Flag::Cloth1); + mFlags.set(Flag::Cloth2); + mFlags.set(Flag::Cloth3); + break; + case 0: + mFlags.reset(Flag::Cloth1); + mFlags.reset(Flag::Cloth2); + mFlags.set(Flag::Cloth3); + break; + case 1: + mFlags.reset(Flag::Cloth1); + mFlags.reset(Flag::Cloth2); + mFlags.reset(Flag::Cloth3); + break; + } +} + +void InstanceSet::sub_7100FB9BAC(InstanceSet* other) { + if (other == nullptr) + return; + + u32 idx = other->sub_7100FB9C2C(); + clothVisibleStuff_0(idx); +} + +u32 InstanceSet::sub_7100FB9C2C() const { + u32 idx; + if (mFlags.isOn(Flag::Cloth1)) { + idx = -2; + } else if (mFlags.isOn(Flag::Cloth2)) { + idx = -1; + } else if (mFlags.isOn(Flag::Cloth3)) { + idx = 0; + } else { + idx = 1; + } + return idx; +} + +void InstanceSet::sub_7100FBA9BC() { + for (auto& rb : mRigidBodySets) { + rb.sub_7100FA97FC(); + } + + for (auto& body : mList) { + body->sub_7100F8CFA0(); + } + + if (mCollisionController != nullptr) + mCollisionController->sub_7100F5EC30(); +} + +void InstanceSet::sub_7100FBACE0(phys::ContactLayer layer) { + bool sensor = phys::isSensorLayer(layer); + + for (auto& rb : mRigidBodySets) { + rb.disableCollisionMaybe(layer); + } + if (sensor) + return; + + if (mRagdollController != nullptr) + mRagdollController->sub_7101221728(layer); + + if (mCollisionController != nullptr) + mCollisionController->enableCollisionMaybe_0(layer); +} + +void InstanceSet::sub_7100FBAD74() { + for (auto& rb : mRigidBodySets) { + rb.disableAllContact(); + } + if (mRagdollController != nullptr) { + mRagdollController->sub_71012217A8(); + } + if (mCollisionController != nullptr) { + mCollisionController->sub_7100F60604(); + } +} + +void* InstanceSet::sub_7100FBAEDC(s32 idx1, s32 idx2) const { + if (mRigidBodySets.size() <= idx1) + return nullptr; + return mRigidBodySets[idx1]->getRigidBody(idx2); +} + +// NON_MATCHING +void InstanceSet::sub_7100FBB00C(phys::RigidBody* body, phys::RigidBodyParam* param) { + if (body == nullptr) + return; + + phys::RigidBodyParamView view; + param->getParams(&view); + if (view.contact_layer == phys::ContactLayer::SensorCustomReceiver) { + body->sub_7100F8F9E8(&view.flags, _188[body->isMassScaling()]); + } else if (view.info_5e0) { + body->sub_7100F8FA44(view.contact_layer, view.info_5e0); + } else { + body->sub_7100F8F8CC(view.contact_layer, view.groundhit, _188[body->isMassScaling()]); + } + body->setCollideGround(view.no_hit_ground == 0); + body->setCollideWater(view.no_hit_water == 0); + body->sub_7100F8F51C(); +} + +void* InstanceSet::sub_7100FBBC28(const sead::SafeString& name) const { + for (auto& rb : mRigidBodySets) { + void* p = rb.findXByName(name); + if (p != nullptr) + return p; + } + return nullptr; +} + +s32 InstanceSet::sub_7100FBBC78(const sead::SafeString& name) const { + s32 idx = 0; + for (auto& info : mContactInfos) { + if (name == info.mName) + return idx; + idx++; + } + return -1; +} + +s32 InstanceSet::sub_7100FBBD9C(const sead::SafeString& name) const { + s32 idx = 0; + for (auto& info : mCollisionInfos) { + if (name == info.mName) + return idx; + idx++; + } + return -1; +} + +void InstanceSet::sub_7100FBD284(const sead::Matrix34f& mtx) { + if (mFlags.isOff(Flag::_1)) + return; + + if (mFlags.isOn(Flag::_80000000)) { + sub_7100FBC890(mtx, true, false); + } else { + mFlags.reset(Flag::_8); + if (mFlags.isOn(Flag::_2)) + setMtxAndScale(mtx, false, false, mScale); + } + mFlags.reset(Flag::_80000000); + + if (mRagdollController == nullptr) + return; + + if (mRagdollController->sub_7101221CC4() == 0) + sub_7100FBC890(mtx, false, false); +} + +s32 InstanceSet::sub_7100FBDA2C(const sead::SafeString& name) const { + if (mRagdollBlendWt == nullptr) + return -1; + + s32 idx = mRagdollBlendWt->findStateIdx(name); + if (idx >= 0) + return idx + 2; + + if (name == "full_dynamic") { + return 1; + } + if (name == "full_key_framed") { + return 0; + } + + return -1; +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/physInstanceSet.h b/src/KingSystem/Physics/physInstanceSet.h new file mode 100644 index 00000000..76b31d5e --- /dev/null +++ b/src/KingSystem/Physics/physInstanceSet.h @@ -0,0 +1,124 @@ +#pragma once + +#include +#include +#include +#include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/Physics/RigidBody/physRigidBody.h" +#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h" + +namespace ksys::res { + +class RagdollBlendWeight { +public: + s32 findStateIdx(const sead::SafeString& name) const; +}; + +} // namespace ksys::res + +namespace ksys::phys { + +class Ragdoll {}; + +class RagdollController { +public: + u32 sub_7101221CC4(); + void sub_7101221728(ContactLayer); + void sub_71012217A8(); +}; + +class CollisionController { +public: + void sub_7100F5EC30(); + void sub_7100F60604(); + void enableCollisionMaybe_0(ContactLayer); +}; + +struct CollisionInfo { + u8 filler[0x50]; + sead::SafeString mName; +}; + +struct ContactInfo { + u8 filler[0x8]; + sead::SafeString mName; +}; + +class RigidBodySet { +public: + void disableAllContact(); + void sub_7100FA97FC(); + void disableCollisionMaybe(ContactLayer); + void* findXByName(const sead::SafeString& name) const; + + RigidBody* getRigidBody() const { return mBodies[0]; } + RigidBody* getRigidBody(s32 idx) const { return mBodies[idx]; } + +private: + u8 _0[0x18]; + sead::PtrArray mBodies; +}; + +class InstanceSet : public sead::hostio::Node { +public: + enum class Flag : u32 { + _1 = 1 << 0, + _2 = 1 << 1, + _8 = 1 << 3, + DisableDraw = 1 << 2, + _200000 = 1 << 21, + Cloth1 = 1 << 22, + Cloth2 = 1 << 23, + Cloth3 = 1 << 24, + InDemo = 1 << 25, + _80000000 = 1u << 31, + }; + + void setFlag2(); + void clothVisibleStuff(); + void setInDemo(); + void resetInDemo(); + void clothVisibleStuff_0(s32 setting); + void sub_7100FB9BAC(InstanceSet* other); + u32 sub_7100FB9C2C() const; + void sub_7100FBA9BC(); + void sub_7100FBACE0(ContactLayer layer); + void sub_7100FBAD74(); + void* sub_7100FBAEDC(s32 rigidbody_idx, s32 ragdoll_idx) const; + void sub_7100FBB00C(RigidBody* body, RigidBodyParam* param); + void setMtxAndScale(const sead::Matrix34f& mtx, bool a2, bool a3, f32 scale); + void sub_7100FBB4B4(); + void* findX(const sead::SafeString& a1, const sead::SafeString& a2) const; + void* sub_7100FBBC28(const sead::SafeString& name) const; + s32 sub_7100FBBC78(const sead::SafeString& name) const; + s32 sub_7100FBBD9C(const sead::SafeString& name) const; + void sub_7100FBD284(const sead::Matrix34f& mtx); + void sub_7100FBC890(const sead::Matrix34f& mtx, bool a2, bool a3); + s32 sub_7100FBDA2C(const sead::SafeString& name) const; + +private: + u8 _8[0x18]; + sead::TypedBitFlag mFlags; + void* _28; + f32 mScale; + u8 _34[0x40 - 0x34]; + sead::PtrArray mRigidBodySets; + sead::PtrArray mCollisionInfos; + sead::PtrArray mContactInfos; + + u8 _70[0x10]; + CollisionController* mCollisionController; + u8 _88[8]; + RagdollController* mRagdollController; + u8 _98[0xb8 - 0x98]; + res::RagdollBlendWeight* mRagdollBlendWt; + u8 _c0[0xd8 - 0xc0]; + void* _d8; + u8 _e0[0x148 - 0xe0]; + sead::TList mList; + u8 _160[0x188 - 0x160]; + void* _188[2]; +}; +KSYS_CHECK_SIZE_NX150(InstanceSet, 0x198); + +} // namespace ksys::phys