mirror of
https://github.com/zeldaret/botw
synced 2026-09-10 11:55:19 -04:00
ksys/phys: Add RigidContactPoints allocation functions
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user