ksys/phys: Add RigidContactPoints allocation functions

This commit is contained in:
Léo Lam
2021-12-29 17:58:17 +01:00
parent 8ba8563775
commit 32531ba067
9 changed files with 63 additions and 16 deletions
@@ -4,6 +4,7 @@
#include "KingSystem/Physics/System/physGroupFilter.h"
#include "KingSystem/Physics/System/physMemSystem.h"
#include "KingSystem/Physics/System/physRigidContactPoints.h"
#include "KingSystem/Physics/System/physRigidContactPointsEx.h"
namespace ksys::phys {
@@ -72,13 +73,22 @@ RigidContactPoints* ContactMgr::allocContactPoints(sead::Heap* heap, int num,
return points;
}
void ContactMgr::registerContactPoints(RigidContactPoints* points) {
RigidContactPointsEx* ContactMgr::allocContactPointsEx(sead::Heap* heap, int num, int num2,
const sead::SafeString& name, int a, int b,
int c) {
auto* points = new (heap) RigidContactPointsEx(name, a, b, c);
points->allocPoints(heap, num, num2);
registerContactPoints(points);
return points;
}
void ContactMgr::registerContactPoints(IRigidContactPoints* points) {
auto lock = sead::makeScopedLock(mMutex1);
if (!points->isLinked())
mRigidContactPoints.pushBack(points);
}
void ContactMgr::freeContactPoints(RigidContactPoints* points) {
void ContactMgr::freeContactPoints(IRigidContactPoints* points) {
if (!points)
return;
@@ -20,7 +20,9 @@ class Heap;
namespace ksys::phys {
class IRigidContactPoints;
class RigidContactPoints;
class RigidContactPointsEx;
struct ContactInfoTable {
struct Receiver : agl::utl::ParameterObj {
@@ -54,8 +56,10 @@ public:
RigidContactPoints* allocContactPoints(sead::Heap* heap, int num, const sead::SafeString& name,
int a, int b, int c);
void registerContactPoints(RigidContactPoints* points);
void freeContactPoints(RigidContactPoints* points);
RigidContactPointsEx* allocContactPointsEx(sead::Heap* heap, int num, int num2,
const sead::SafeString& name, int a, int b, int c);
void registerContactPoints(IRigidContactPoints* points);
void freeContactPoints(IRigidContactPoints* points);
private:
void doLoadContactInfoTable(agl::utl::ResParameterArchive archive, ContactLayerType type,
@@ -66,7 +70,7 @@ private:
sead::OffsetList<void*> mList0;
int mList0Size = 0;
sead::Atomic<int> _34 = 0;
sead::OffsetList<RigidContactPoints> mRigidContactPoints;
sead::OffsetList<IRigidContactPoints> mRigidContactPoints;
sead::OffsetList<void*> mList2;
sead::OffsetList<void*> mList3;
sead::OffsetList<void*> mList4;
@@ -1,5 +1,6 @@
#include "KingSystem/Physics/System/physMemSystem.h"
#include "KingSystem/Physics/System/physContactMgr.h"
#include "KingSystem/Physics/System/physRigidContactPoints.h"
namespace ksys::phys {
@@ -15,6 +16,12 @@ void MemSystem::freeContactPoints(RigidContactPoints* points) const {
mContactMgr->freeContactPoints(points);
}
RigidContactPointsEx* MemSystem::allocContactPointsEx(sead::Heap* heap, int num, int num2,
const sead::SafeString& name, int a, int b,
int c) const {
return mContactMgr->allocContactPointsEx(heap, num, num2, name, a, b, c);
}
void MemSystem::registerContactPoints(RigidContactPoints* points) const {
mContactMgr->registerContactPoints(points);
}
@@ -32,6 +32,10 @@ public:
RigidContactPoints* allocContactPoints(sead::Heap* heap, int num, const sead::SafeString& name,
int a, int b, int c) const;
void freeContactPoints(RigidContactPoints* points) const;
RigidContactPointsEx* allocContactPointsEx(sead::Heap* heap, int num, int num2,
const sead::SafeString& name, int a, int b,
int c) const;
void freeContactPointsEx(RigidContactPointsEx* points) const;
void registerContactPoints(RigidContactPoints* points) const;
void registerContactPointLayerPair(RigidContactPointsEx* points, ContactLayer layer1,
ContactLayer layer2, bool enabled);
@@ -1,7 +1,17 @@
#include "KingSystem/Physics/System/physRigidContactPoints.h"
#include "KingSystem/Physics/System/physMemSystem.h"
namespace ksys::phys {
RigidContactPoints* RigidContactPoints::make(sead::Heap* heap, int num,
const sead::SafeString& name, int a, int b, int c) {
return MemSystem::instance()->allocContactPoints(heap, num, name, a, b, c);
}
void RigidContactPoints::free(RigidContactPoints* instance) {
MemSystem::instance()->freeContactPoints(instance);
}
RigidContactPoints::RigidContactPoints(const sead::SafeString& name, int a, int b, int c)
: IRigidContactPoints(name, a, b, c) {}
@@ -19,6 +19,7 @@ public:
IRigidContactPoints(const sead::SafeString& name, int a, int b, int c)
: sead::INamable(name), _2c(a), _30(b), _34(c) {}
virtual ~IRigidContactPoints() = default;
virtual void freePoints() = 0;
bool isLinked() const { return mListNode.isLinked(); }
static constexpr size_t getListNodeOffset() { return offsetof(IRigidContactPoints, mListNode); }
@@ -41,7 +42,7 @@ public:
RigidContactPoints(const sead::SafeString& name, int a, int b, int c);
~RigidContactPoints() override;
virtual void freePoints();
void freePoints() override;
virtual void allocPoints(sead::Heap* heap, int num);
private:
@@ -3,6 +3,16 @@
namespace ksys::phys {
RigidContactPointsEx* RigidContactPointsEx::make(sead::Heap* heap, int num, int num2,
const sead::SafeString& name, int a, int b,
int c) {
return MemSystem::instance()->allocContactPointsEx(heap, num, num2, name, a, b, c);
}
void RigidContactPointsEx::free(RigidContactPointsEx* instance) {
MemSystem::instance()->freeContactPointsEx(instance);
}
bool RigidContactPointsEx::registerLayerPair(ContactLayer layer1, ContactLayer layer2,
bool enabled) {
if (mLayerType == ContactLayerType::Invalid)
@@ -100,12 +100,13 @@ public:
const Point* const* mPointsStart = nullptr;
};
static RigidContactPointsEx* make();
static RigidContactPointsEx* make(sead::Heap* heap, int num, int num2,
const sead::SafeString& name, int a, int b, int c);
static void free(RigidContactPointsEx* instance);
RigidContactPointsEx(const sead::SafeString& name, int a, int b, int c);
~RigidContactPointsEx() override;
virtual void freePoints();
void freePoints() override;
virtual void allocPoints(sead::Heap* heap, int num, int num2);
bool registerLayerPair(ContactLayer layer1, ContactLayer layer2, bool enabled);