ksys/phys: Finish ContactMgr

This commit is contained in:
Léo Lam 2022-03-14 01:06:38 +01:00
parent a9d5f88968
commit 2a9e3318b5
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
4 changed files with 65 additions and 8 deletions

View File

@ -83751,12 +83751,12 @@ Address,Quality,Size,Name
0x0000007100fb295c,O,000220,_ZN4ksys4phys10ContactMgr25makeLayerContactPointInfoEPN4sead4HeapEiiRKNS2_14SafeStringBaseIcEEiii 0x0000007100fb295c,O,000220,_ZN4ksys4phys10ContactMgr25makeLayerContactPointInfoEPN4sead4HeapEiiRKNS2_14SafeStringBaseIcEEiii
0x0000007100fb2a38,O,000100,_ZN4ksys4phys10ContactMgr24registerContactPointInfoEPNS0_20ContactPointInfoBaseE 0x0000007100fb2a38,O,000100,_ZN4ksys4phys10ContactMgr24registerContactPointInfoEPNS0_20ContactPointInfoBaseE
0x0000007100fb2a9c,O,000056,_ZN4ksys4phys10ContactMgr17makeCollisionInfoEPN4sead4HeapERKNS2_14SafeStringBaseIcEE 0x0000007100fb2a9c,O,000056,_ZN4ksys4phys10ContactMgr17makeCollisionInfoEPN4sead4HeapERKNS2_14SafeStringBaseIcEE
0x0000007100fb2ad4,U,000156,phys::ContactInfoTable::x_2 0x0000007100fb2ad4,O,000156,_ZN4ksys4phys10ContactMgr34makeContactLayerCollisionInfoGroupEPN4sead4HeapENS0_12ContactLayerEiRKNS2_14SafeStringBaseIcEE
0x0000007100fb2b70,O,000148,_ZN4ksys4phys10ContactMgr20freeContactPointInfoEPNS0_20ContactPointInfoBaseE 0x0000007100fb2b70,O,000148,_ZN4ksys4phys10ContactMgr20freeContactPointInfoEPNS0_20ContactPointInfoBaseE
0x0000007100fb2c04,O,000144,_ZN4ksys4phys10ContactMgr17freeCollisionInfoEPNS0_13CollisionInfoE 0x0000007100fb2c04,O,000144,_ZN4ksys4phys10ContactMgr17freeCollisionInfoEPNS0_13CollisionInfoE
0x0000007100fb2c94,O,000216,_ZN4ksys4phys10ContactMgr21clearCollisionEntriesEPNS0_13CollisionInfoE 0x0000007100fb2c94,O,000216,_ZN4ksys4phys10ContactMgr21clearCollisionEntriesEPNS0_13CollisionInfoE
0x0000007100fb2d6c,U,000136,phys::ContactInfoTable::x_7 0x0000007100fb2d6c,O,000136,_ZN4ksys4phys10ContactMgr34freeContactLayerCollisionInfoGroupEPNS0_30ContactLayerCollisionInfoGroupE
0x0000007100fb2df4,U,000312,phys::ContactInfoTable::x_8 0x0000007100fb2df4,O,000312,_ZN4ksys4phys10ContactMgr21clearCollisionEntriesEPNS0_30ContactLayerCollisionInfoGroupE
0x0000007100fb2f2c,m,000120,_ZN4ksys4phys10ContactMgr18clearContactPointsEv 0x0000007100fb2f2c,m,000120,_ZN4ksys4phys10ContactMgr18clearContactPointsEv
0x0000007100fb2fa4,O,000152,_ZN4ksys4phys10ContactMgr27removeContactPointsWithBodyEPNS0_9RigidBodyE 0x0000007100fb2fa4,O,000152,_ZN4ksys4phys10ContactMgr27removeContactPointsWithBodyEPNS0_9RigidBodyE
0x0000007100fb303c,O,000380,_ZN4ksys4phys10ContactMgr30removeCollisionEntriesWithBodyEPNS0_9RigidBodyE 0x0000007100fb303c,O,000380,_ZN4ksys4phys10ContactMgr30removeCollisionEntriesWithBodyEPNS0_9RigidBodyE

Can't render this file because it is too large.

View File

@ -48,6 +48,10 @@ public:
CollidingBodiesIterator collidingBodiesEnd() const; CollidingBodiesIterator collidingBodiesEnd() const;
CollidingBodiesRange getCollidingBodies() const; CollidingBodiesRange getCollidingBodies() const;
const sead::PtrArray<ContactLayerCollisionInfo>& getCollisionInfo() const {
return mCollisionInfoInstances;
}
static constexpr size_t getListNodeOffset() { static constexpr size_t getListNodeOffset() {
return offsetof(ContactLayerCollisionInfoGroup, mListNode); return offsetof(ContactLayerCollisionInfoGroup, mListNode);
} }

View File

@ -5,6 +5,7 @@
#include "KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h" #include "KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h"
#include "KingSystem/Physics/System/physCollisionInfo.h" #include "KingSystem/Physics/System/physCollisionInfo.h"
#include "KingSystem/Physics/System/physContactLayerCollisionInfo.h" #include "KingSystem/Physics/System/physContactLayerCollisionInfo.h"
#include "KingSystem/Physics/System/physContactLayerCollisionInfoGroup.h"
#include "KingSystem/Physics/System/physContactPointInfo.h" #include "KingSystem/Physics/System/physContactPointInfo.h"
#include "KingSystem/Physics/System/physEntityGroupFilter.h" #include "KingSystem/Physics/System/physEntityGroupFilter.h"
#include "KingSystem/Physics/System/physGroupFilter.h" #include "KingSystem/Physics/System/physGroupFilter.h"
@ -33,8 +34,7 @@ struct ContactMgr::ImpulseEntry {
ContactMgr::ContactMgr() { ContactMgr::ContactMgr() {
mContactPointInfoInstances.initOffset(ContactPointInfo::getListNodeOffset()); mContactPointInfoInstances.initOffset(ContactPointInfo::getListNodeOffset());
mCollisionInfoInstances.initOffset(CollisionInfo::getListNodeOffset()); mCollisionInfoInstances.initOffset(CollisionInfo::getListNodeOffset());
// FIXME: figure out what this offset is mLayerColInfoGroups.initOffset(ContactLayerCollisionInfoGroup::getListNodeOffset());
mList3.initOffset(0x40);
mCollidingBodiesFreeList.initOffset(CollidingBodies::getListNodeOffset()); mCollidingBodiesFreeList.initOffset(CollidingBodies::getListNodeOffset());
mImpulseEntriesFreeList.initOffset(ImpulseEntry::getListNodeOffset()); mImpulseEntriesFreeList.initOffset(ImpulseEntry::getListNodeOffset());
mImpulseEntries.initOffset(ImpulseEntry::getListNodeOffset()); mImpulseEntries.initOffset(ImpulseEntry::getListNodeOffset());
@ -135,6 +135,15 @@ CollisionInfo* ContactMgr::makeCollisionInfo(sead::Heap* heap, const sead::SafeS
return new (heap) CollisionInfo(name); return new (heap) CollisionInfo(name);
} }
ContactLayerCollisionInfoGroup*
ContactMgr::makeContactLayerCollisionInfoGroup(sead::Heap* heap, ContactLayer layer, int capacity,
const sead::SafeString& name) {
auto* group = new (heap) ContactLayerCollisionInfoGroup(layer, name);
group->init(heap, capacity);
registerContactLayerCollisionInfoGroup(group);
return group;
}
void ContactMgr::registerContactPointInfo(ContactPointInfoBase* info) { void ContactMgr::registerContactPointInfo(ContactPointInfoBase* info) {
auto lock = sead::makeScopedLock(mContactPointInfoMutex); auto lock = sead::makeScopedLock(mContactPointInfoMutex);
if (!info->isLinked()) if (!info->isLinked())
@ -177,6 +186,27 @@ void ContactMgr::freeCollisionInfo(CollisionInfo* info) {
delete info; delete info;
} }
void ContactMgr::registerContactLayerCollisionInfoGroup(ContactLayerCollisionInfoGroup* group) {
auto lock = sead::makeScopedLock(mLayerColInfoGroupMutex);
mLayerColInfoGroups.pushBack(group);
}
void ContactMgr::unregisterContactLayerCollisionInfoGroup(ContactLayerCollisionInfoGroup* group) {
auto lock = sead::makeScopedLock(mLayerColInfoGroupMutex);
mLayerColInfoGroups.erase(group);
}
void ContactMgr::freeContactLayerCollisionInfoGroup(ContactLayerCollisionInfoGroup* group) {
if (!group)
return;
clearCollisionEntries(group);
unregisterContactLayerCollisionInfoGroup(group);
group->finalize();
delete group;
}
// NON_MATCHING: two sub instructions reordered // NON_MATCHING: two sub instructions reordered
void ContactMgr::clearContactPoints() { void ContactMgr::clearContactPoints() {
auto lock = sead::makeScopedLock(mContactPointInfoMutex); auto lock = sead::makeScopedLock(mContactPointInfoMutex);
@ -434,6 +464,20 @@ void ContactMgr::clearCollisionEntries(CollisionInfo* info) {
} }
} }
void ContactMgr::clearCollisionEntries(ContactLayerCollisionInfoGroup* group) {
auto lock = sead::makeScopedLock(mCollidingBodiesMutex);
for (int i = 0; i < group->getCollisionInfo().size(); ++i) {
ContactLayerCollisionInfo* info = group->getCollisionInfo()[i];
auto info_lock = sead::makeScopedLock(*info);
for (auto& entry : info->getCollidingBodies().robustRange()) {
info->getCollidingBodies().erase(&entry);
freeCollidingBodiesEntry(&entry);
}
}
}
void ContactMgr::addImpulseEntry(RigidBody* body_a, RigidBody* body_b) { void ContactMgr::addImpulseEntry(RigidBody* body_a, RigidBody* body_b) {
auto lock = sead::makeScopedLock(mImpulseEntriesMutex); auto lock = sead::makeScopedLock(mImpulseEntriesMutex);

View File

@ -28,6 +28,7 @@ enum class IsIndoorStage;
struct CollidingBodies; struct CollidingBodies;
class CollisionInfo; class CollisionInfo;
class ContactLayerCollisionInfo; class ContactLayerCollisionInfo;
class ContactLayerCollisionInfoGroup;
class ContactPointInfoBase; class ContactPointInfoBase;
class QueryContactPointInfo; class QueryContactPointInfo;
class RigidBody; class RigidBody;
@ -100,6 +101,10 @@ public:
CollisionInfo* makeCollisionInfo(sead::Heap* heap, const sead::SafeString& name); CollisionInfo* makeCollisionInfo(sead::Heap* heap, const sead::SafeString& name);
ContactLayerCollisionInfoGroup*
makeContactLayerCollisionInfoGroup(sead::Heap* heap, ContactLayer layer, int capacity,
const sead::SafeString& name);
// endregion // endregion
void registerContactPointInfo(ContactPointInfoBase* info); void registerContactPointInfo(ContactPointInfoBase* info);
@ -110,6 +115,10 @@ public:
void unregisterCollisionInfo(CollisionInfo* info); void unregisterCollisionInfo(CollisionInfo* info);
void freeCollisionInfo(CollisionInfo* info); void freeCollisionInfo(CollisionInfo* info);
void registerContactLayerCollisionInfoGroup(ContactLayerCollisionInfoGroup* group);
void unregisterContactLayerCollisionInfoGroup(ContactLayerCollisionInfoGroup* group);
void freeContactLayerCollisionInfoGroup(ContactLayerCollisionInfoGroup* group);
void clearContactPoints(); void clearContactPoints();
/// Remove all contact points with the specified rigid body. /// Remove all contact points with the specified rigid body.
/// @note For efficiency reasons, this actually only invalidates the contact points. /// @note For efficiency reasons, this actually only invalidates the contact points.
@ -138,6 +147,7 @@ public:
void unregisterCollisionWithBody(ContactLayerCollisionInfo* info, RigidBody* body); void unregisterCollisionWithBody(ContactLayerCollisionInfo* info, RigidBody* body);
void clearCollisionEntries(CollisionInfo* info); void clearCollisionEntries(CollisionInfo* info);
void clearCollisionEntries(ContactLayerCollisionInfoGroup* group);
bool initLayerMasks(ContactPointInfo* info, const sead::SafeString& receiver_name) const; bool initLayerMasks(ContactPointInfo* info, const sead::SafeString& receiver_name) const;
bool initLayerMasks(CollisionInfo* info, const sead::SafeString& receiver_name) const; bool initLayerMasks(CollisionInfo* info, const sead::SafeString& receiver_name) const;
@ -180,13 +190,12 @@ private:
sead::Atomic<int> mNumContactPoints = 0; sead::Atomic<int> mNumContactPoints = 0;
sead::OffsetList<ContactPointInfoBase> mContactPointInfoInstances; sead::OffsetList<ContactPointInfoBase> mContactPointInfoInstances;
sead::OffsetList<CollisionInfo> mCollisionInfoInstances; sead::OffsetList<CollisionInfo> mCollisionInfoInstances;
sead::OffsetList<void*> mList3; sead::OffsetList<ContactLayerCollisionInfoGroup> mLayerColInfoGroups;
sead::OffsetList<ImpulseEntry> mImpulseEntriesFreeList; sead::OffsetList<ImpulseEntry> mImpulseEntriesFreeList;
sead::OffsetList<ImpulseEntry> mImpulseEntries; sead::OffsetList<ImpulseEntry> mImpulseEntries;
sead::Mutex mContactPointInfoMutex; sead::Mutex mContactPointInfoMutex;
sead::Mutex mCollisionInfoMutex; sead::Mutex mCollisionInfoMutex;
// TODO: rename mList3 and mMutex3 sead::Mutex mLayerColInfoGroupMutex;
sead::Mutex mMutex3;
sead::Mutex mCollidingBodiesMutex; sead::Mutex mCollidingBodiesMutex;
sead::Mutex mImpulseEntriesMutex; sead::Mutex mImpulseEntriesMutex;
sead::SafeArray<ContactInfoTable, 2> mContactInfoTables{}; sead::SafeArray<ContactInfoTable, 2> mContactInfoTables{};