diff --git a/data/uking_functions.csv b/data/uking_functions.csv index c45fc44a..22e7244d 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -63646,7 +63646,7 @@ Address,Quality,Size,Name 0x0000007100b18994,O,000008,_ZN4sead15CriticalSection7tryLockEv 0x0000007100b1899c,O,000008,_ZN4sead15CriticalSection6unlockEv 0x0000007100b189a4,O,000060,_ZN4sead5MutexC1Ev -0x0000007100b189e0,U,000060,_ZN4sead5MutexC1EPNS_4HeapE +0x0000007100b189e0,O,000060,_ZN4sead5MutexC1EPNS_4HeapENS_9IDisposer14HeapNullOptionE 0x0000007100b18a1c,O,000052,_ZN4sead5MutexD1Ev 0x0000007100b18a50,O,000060,_ZN4sead5MutexD0Ev 0x0000007100b18a8c,O,000008,_ZN4sead5Mutex4lockEv @@ -84099,13 +84099,13 @@ Address,Quality,Size,Name 0x0000007100fc7348,U,000224, 0x0000007100fc7428,U,000036, 0x0000007100fc744c,U,000096,_ZN3aal6System8postCalcEi -0x0000007100fc74ac,U,000032,physicsAllocCollisionStuff -0x0000007100fc74cc,U,000024, -0x0000007100fc74e4,U,000128, -0x0000007100fc7564,U,000068, -0x0000007100fc75a8,U,000076, -0x0000007100fc75f4,U,000020, -0x0000007100fc7608,U,000052, +0x0000007100fc74ac,O,000032,_ZN4ksys4phys13CollisionInfo4makeEPN4sead4HeapERKNS2_14SafeStringBaseIcEE +0x0000007100fc74cc,O,000024,_ZN4ksys4phys13CollisionInfo4freeEPS1_ +0x0000007100fc74e4,O,000128,_ZN4ksys4phys13CollisionInfoC1ERKN4sead14SafeStringBaseIcEE +0x0000007100fc7564,O,000068,_ZN4ksys4phys13CollisionInfoD1Ev +0x0000007100fc75a8,O,000076,_ZN4ksys4phys13CollisionInfoD0Ev +0x0000007100fc75f4,O,000020,_ZN4ksys4phys17CollisionInfoBaseD2Ev +0x0000007100fc7608,O,000052,_ZN4ksys4phys17CollisionInfoBaseD0Ev 0x0000007100fc763c,O,000064,_ZN4ksys4phys16ContactPointInfo4makeEPN4sead4HeapEiRKNS2_14SafeStringBaseIcEEiii 0x0000007100fc767c,O,000024,_ZN4ksys4phys16ContactPointInfo4freeEPS1_ 0x0000007100fc7694,O,000076,_ZN4ksys4phys16ContactPointInfoC1ERKN4sead14SafeStringBaseIcEEiii diff --git a/src/KingSystem/Physics/CMakeLists.txt b/src/KingSystem/Physics/CMakeLists.txt index ac725dc3..479c28be 100644 --- a/src/KingSystem/Physics/CMakeLists.txt +++ b/src/KingSystem/Physics/CMakeLists.txt @@ -99,6 +99,7 @@ target_sources(uking PRIVATE System/physCharacterControllerParam.cpp System/physCharacterControllerParam.h + System/physCollisionInfo.cpp System/physCollisionInfo.h System/physConstraint.cpp System/physConstraint.h diff --git a/src/KingSystem/Physics/System/physCollisionInfo.cpp b/src/KingSystem/Physics/System/physCollisionInfo.cpp new file mode 100644 index 00000000..ef8f4360 --- /dev/null +++ b/src/KingSystem/Physics/System/physCollisionInfo.cpp @@ -0,0 +1,23 @@ +#include "KingSystem/Physics/System/physCollisionInfo.h" +#include "KingSystem/Physics/System/physSystem.h" + +namespace ksys::phys { + +CollisionInfo* CollisionInfo::make(sead::Heap* heap, const sead::SafeString& name) { + return System::instance()->allocCollisionInfo(heap, name); +} + +void CollisionInfo::free(CollisionInfo* info) { + System::instance()->freeCollisionInfo(info); +} + +CollisionInfo::CollisionInfo(const sead::SafeString& name) : sead::INamable(name) { + // FIXME: figure out what this is + mList.initOffset(0x10); +} + +CollisionInfo::~CollisionInfo() { + mList.clear(); +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/System/physCollisionInfo.h b/src/KingSystem/Physics/System/physCollisionInfo.h index 9a252b01..81b28576 100644 --- a/src/KingSystem/Physics/System/physCollisionInfo.h +++ b/src/KingSystem/Physics/System/physCollisionInfo.h @@ -1,7 +1,10 @@ #pragma once +#include #include #include +#include +#include #include #include "KingSystem/Physics/physDefines.h" @@ -21,7 +24,24 @@ public: private: // One layer mask for layer type (entity/sensor). sead::SafeArray mLayerMasks; - sead::Mutex mMutex; + sead::Mutex mMutex{nullptr, + sead::IDisposer::HeapNullOption::DoNotAppendDisposerIfNoHeapSpecified}; +}; + +class CollisionInfo : public CollisionInfoBase, public sead::INamable { +public: + static CollisionInfo* make(sead::Heap* heap, const sead::SafeString& name); + static void free(CollisionInfo* info); + + explicit CollisionInfo(const sead::SafeString& name); + ~CollisionInfo() override; + + static constexpr size_t getListNodeOffset() { return offsetof(CollisionInfo, mListNode); } + +private: + // FIXME: type + sead::OffsetList mList; + sead::ListNode mListNode; }; inline sead::BitFlag32& CollisionInfoBase::getLayerMask(ContactLayerType layer_type) { diff --git a/src/KingSystem/Physics/System/physSystem.h b/src/KingSystem/Physics/System/physSystem.h index 14b8f365..3e08d3e1 100644 --- a/src/KingSystem/Physics/System/physSystem.h +++ b/src/KingSystem/Physics/System/physSystem.h @@ -9,6 +9,7 @@ namespace ksys::phys { +class CollisionInfo; class ContactMgr; class GroupFilter; class MaterialTable; @@ -55,6 +56,11 @@ public: void registerContactPointLayerPair(ContactPointInfoEx* info, ContactLayer layer1, ContactLayer layer2, bool enabled); + // 0x00000071012169a4 + CollisionInfo* allocCollisionInfo(sead::Heap* heap, const sead::SafeString& name) const; + // 0x00000071012169ac + void freeCollisionInfo(CollisionInfo* info) const; + // 0x0000007101216a20 void registerRigidBodyForContactSystem(RigidBody* body);