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
0x0000007100fb2a38,O,000100,_ZN4ksys4phys10ContactMgr24registerContactPointInfoEPNS0_20ContactPointInfoBaseE
0x0000007100fb2a9c,O,000056,_ZN4ksys4phys10ContactMgr17makeCollisionInfoEPN4sead4HeapERKNS2_14SafeStringBaseIcEE
0x0000007100fb2ad4,U,000156,phys::ContactInfoTable::x_2
0x0000007100fb2ad4,O,000156,_ZN4ksys4phys10ContactMgr34makeContactLayerCollisionInfoGroupEPN4sead4HeapENS0_12ContactLayerEiRKNS2_14SafeStringBaseIcEE
0x0000007100fb2b70,O,000148,_ZN4ksys4phys10ContactMgr20freeContactPointInfoEPNS0_20ContactPointInfoBaseE
0x0000007100fb2c04,O,000144,_ZN4ksys4phys10ContactMgr17freeCollisionInfoEPNS0_13CollisionInfoE
0x0000007100fb2c94,O,000216,_ZN4ksys4phys10ContactMgr21clearCollisionEntriesEPNS0_13CollisionInfoE
0x0000007100fb2d6c,U,000136,phys::ContactInfoTable::x_7
0x0000007100fb2df4,U,000312,phys::ContactInfoTable::x_8
0x0000007100fb2d6c,O,000136,_ZN4ksys4phys10ContactMgr34freeContactLayerCollisionInfoGroupEPNS0_30ContactLayerCollisionInfoGroupE
0x0000007100fb2df4,O,000312,_ZN4ksys4phys10ContactMgr21clearCollisionEntriesEPNS0_30ContactLayerCollisionInfoGroupE
0x0000007100fb2f2c,m,000120,_ZN4ksys4phys10ContactMgr18clearContactPointsEv
0x0000007100fb2fa4,O,000152,_ZN4ksys4phys10ContactMgr27removeContactPointsWithBodyEPNS0_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;
CollidingBodiesRange getCollidingBodies() const;
const sead::PtrArray<ContactLayerCollisionInfo>& getCollisionInfo() const {
return mCollisionInfoInstances;
}
static constexpr size_t getListNodeOffset() {
return offsetof(ContactLayerCollisionInfoGroup, mListNode);
}

View File

@ -5,6 +5,7 @@
#include "KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h"
#include "KingSystem/Physics/System/physCollisionInfo.h"
#include "KingSystem/Physics/System/physContactLayerCollisionInfo.h"
#include "KingSystem/Physics/System/physContactLayerCollisionInfoGroup.h"
#include "KingSystem/Physics/System/physContactPointInfo.h"
#include "KingSystem/Physics/System/physEntityGroupFilter.h"
#include "KingSystem/Physics/System/physGroupFilter.h"
@ -33,8 +34,7 @@ struct ContactMgr::ImpulseEntry {
ContactMgr::ContactMgr() {
mContactPointInfoInstances.initOffset(ContactPointInfo::getListNodeOffset());
mCollisionInfoInstances.initOffset(CollisionInfo::getListNodeOffset());
// FIXME: figure out what this offset is
mList3.initOffset(0x40);
mLayerColInfoGroups.initOffset(ContactLayerCollisionInfoGroup::getListNodeOffset());
mCollidingBodiesFreeList.initOffset(CollidingBodies::getListNodeOffset());
mImpulseEntriesFreeList.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);
}
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) {
auto lock = sead::makeScopedLock(mContactPointInfoMutex);
if (!info->isLinked())
@ -177,6 +186,27 @@ void ContactMgr::freeCollisionInfo(CollisionInfo* 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
void ContactMgr::clearContactPoints() {
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) {
auto lock = sead::makeScopedLock(mImpulseEntriesMutex);

View File

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