summaryrefslogtreecommitdiff
path: root/src/KingSystem/Physics
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2022-03-26 12:54:14 +0100
committerLéo Lam <leo@leolam.fr>2022-03-26 17:42:31 +0100
commitb3c9e97e005eab614ee27e385d43d180a8351157 (patch)
tree43b0752c058b5952dd49a26bf7c18af22bf4ee7a /src/KingSystem/Physics
parent783e6a510f835ace5fd38a92e4e6902e8bd13a19 (diff)
ksys/phys: Add RigidBodyRequestMgr::calc1
Diffstat (limited to 'src/KingSystem/Physics')
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBody.cpp2
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBody.h2
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.cpp44
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h23
-rw-r--r--src/KingSystem/Physics/System/physUserTag.cpp4
-rw-r--r--src/KingSystem/Physics/System/physUserTag.h3
6 files changed, 59 insertions, 19 deletions
diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
index f82f0aaa..f0710bca 100644
--- a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
+++ b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
@@ -1766,7 +1766,7 @@ const char* RigidBody::getName() {
return mUserTag ? mUserTag->getName().cstr() : getHkBodyName().cstr();
}
-void RigidBody::logPosition() const {
+void RigidBody::onImpulse(RigidBody* body_b, float impulse) const {
sead::Vector3f position;
getPosition(&position);
// debug logging?
diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.h b/src/KingSystem/Physics/RigidBody/physRigidBody.h
index 34f9fd71..7368d178 100644
--- a/src/KingSystem/Physics/RigidBody/physRigidBody.h
+++ b/src/KingSystem/Physics/RigidBody/physRigidBody.h
@@ -283,7 +283,7 @@ public:
void setPosition(const sead::Vector3f& position, bool propagate_to_linked_motions);
void getPosition(sead::Vector3f* position) const;
sead::Vector3f getPosition() const;
- virtual void logPosition() const;
+ virtual void onImpulse(RigidBody* body_b, float impulse) const;
void getAabbInLocal(sead::BoundBox3f* aabb) const;
void getAabbInWorld(sead::BoundBox3f* aabb) const;
diff --git a/src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.cpp b/src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.cpp
index 77ddadbf..957454a2 100644
--- a/src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.cpp
+++ b/src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.cpp
@@ -1,5 +1,8 @@
#include "KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h"
#include <prim/seadScopedLock.h>
+#include "KingSystem/Physics/RigidBody/physRigidBody.h"
+#include "KingSystem/Physics/System/physSystem.h"
+#include "KingSystem/Physics/System/physUserTag.h"
#include "KingSystem/Physics/physMaterialMask.h"
namespace ksys::phys {
@@ -12,18 +15,18 @@ RigidBodyRequestMgr::RigidBodyRequestMgr() = default;
RigidBodyRequestMgr::~RigidBodyRequestMgr() {
for (int i = 0; i < NumRigidBodyBuffers; ++i) {
mRigidBodies1[i].freeBuffer();
- mRigidBodies2[i].freeBuffer();
+ mOobRigidBodies[i].freeBuffer();
}
_38.freeBuffer();
_50.freeBuffer();
- _98.freeBuffer();
+ mImpulseEntries.freeBuffer();
_b0.freeBuffer();
_c8.freeBuffer();
_e0.freeBuffer();
_120.freeBuffer();
_138.freeBuffer();
- _108.freeBuffer();
+ mImpulseEntriesPool.freeBuffer();
mMotionAccessors.freeBuffer();
if (mContactPoints) {
@@ -35,7 +38,7 @@ RigidBodyRequestMgr::~RigidBodyRequestMgr() {
void RigidBodyRequestMgr::init(sead::Heap* heap) {
constexpr int Buffer138Size = 0x800;
- _108.allocBufferAssert(0x100, heap);
+ mImpulseEntriesPool.allocBufferAssert(0x100, heap);
_118 = 0;
_120.allocBufferAssert(0x100, heap);
@@ -43,12 +46,12 @@ void RigidBodyRequestMgr::init(sead::Heap* heap) {
for (int i = 0; i < NumRigidBodyBuffers; ++i) {
mRigidBodies1[i].alloc(0x2000, heap);
- mRigidBodies2[i].alloc(0x100, heap);
+ mOobRigidBodies[i].alloc(0x100, heap);
}
_38.alloc(0x800, heap);
_50.alloc(0x800, heap);
- _98.alloc(0x100, heap);
+ mImpulseEntries.alloc(0x100, heap);
_b0.alloc(0x100, heap);
mMotionAccessors.allocBuffer(0x400, heap);
_138.allocBufferAssert(Buffer138Size, heap);
@@ -83,6 +86,35 @@ void RigidBodyRequestMgr::init(sead::Heap* heap) {
mWaterPoisonSubmatIdx = MaterialMask::getSubMaterialIdx(Material::Water, "Water_Poison");
}
+void RigidBodyRequestMgr::calc1(ContactLayerType layer_type, bool paused) {
+ auto lock = sead::makeScopedLock(mCriticalSections[int(layer_type)]);
+ ScopedWorldLock world_lock{layer_type};
+
+ if (!paused && layer_type == ContactLayerType::Entity)
+ processImpulseEntries();
+
+ processOobRigidBodyEntries(layer_type);
+}
+
+void RigidBodyRequestMgr::processImpulseEntries() {
+ while (auto* impulse = mImpulseEntries.pop()) {
+ if (auto* tag = impulse->body_a->getUserTag())
+ tag->onImpulse(impulse->body_a, impulse->body_b, impulse->impulse_a);
+ else
+ impulse->body_a->onImpulse(impulse->body_b, impulse->impulse_a);
+ }
+ _118 = 0;
+}
+
+void RigidBodyRequestMgr::processOobRigidBodyEntries(ContactLayerType layer_type) {
+ while (auto* body = mOobRigidBodies[int(layer_type)].pop()) {
+ if (auto* tag = body->getUserTag())
+ tag->onMaxPositionExceeded(body);
+ else
+ body->onMaxPositionExceeded();
+ }
+}
+
bool RigidBodyRequestMgr::pushRigidBody(ContactLayerType type, RigidBody* body) {
static_cast<void>(mRigidBodies1[int(type)].getSize());
return mRigidBodies1[int(type)].push(body);
diff --git a/src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h b/src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h
index e29db07b..56afd4d2 100644
--- a/src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h
+++ b/src/KingSystem/Physics/RigidBody/physRigidBodyRequestMgr.h
@@ -46,6 +46,10 @@ public:
void init(sead::Heap* heap);
+ // 0x0000007100fa6ac4
+ void calc(ContactLayerType layer_type);
+ void calc1(ContactLayerType layer_type, bool paused);
+
bool pushRigidBody(ContactLayerType type, RigidBody* body);
// 0x0000007100fa6d48
void addEntityToWorld(ContactLayerType type, hkpEntity* entity);
@@ -65,7 +69,6 @@ public:
private:
struct Unk1;
- struct Unk2;
struct Unk3;
struct Unk4 {
@@ -73,10 +76,12 @@ private:
};
KSYS_CHECK_SIZE_NX150(Unk4, 0x10);
- struct Unk5 {
- u8 _0[0x18];
+ struct ImpulseEntry {
+ RigidBody* body_a;
+ RigidBody* body_b;
+ float impulse_a;
};
- KSYS_CHECK_SIZE_NX150(Unk5, 0x18);
+ KSYS_CHECK_SIZE_NX150(ImpulseEntry, 0x18);
struct Unk6 {
sead::Vector3f _0 = sead::Vector3f::zero;
@@ -104,18 +109,22 @@ private:
bool someFunction2(const LayerContactPointInfo::ContactEvent& event);
static void someFunction(void* arg);
+ void processImpulseEntries();
+ void processOobRigidBodyEntries(ContactLayerType layer_type);
+
static constexpr int NumRigidBodyBuffers = 2;
sead::SafeArray<util::LockFreeQueue<RigidBody>, NumRigidBodyBuffers> mRigidBodies1;
util::LockFreeQueue<Unk1> _38;
util::LockFreeQueue<Unk1> _50;
- sead::SafeArray<util::LockFreeQueue<RigidBody>, NumRigidBodyBuffers> mRigidBodies2;
- util::LockFreeQueue<Unk2> _98;
+ /// Rigid bodies that are out of bounds.
+ sead::SafeArray<util::LockFreeQueue<RigidBody>, NumRigidBodyBuffers> mOobRigidBodies;
+ util::LockFreeQueue<ImpulseEntry> mImpulseEntries;
util::LockFreeQueue<Unk3> _b0;
util::LockFreeQueue<Unk4> _c8;
util::LockFreeQueue<Unk4> _e0;
sead::PtrArray<MotionAccessor> mMotionAccessors;
- sead::Buffer<Unk5> _108;
+ sead::Buffer<ImpulseEntry> mImpulseEntriesPool;
sead::Atomic<u32> _118;
sead::Buffer<Unk6> _120;
sead::Atomic<u32> _130;
diff --git a/src/KingSystem/Physics/System/physUserTag.cpp b/src/KingSystem/Physics/System/physUserTag.cpp
index 99a05991..9ac62117 100644
--- a/src/KingSystem/Physics/System/physUserTag.cpp
+++ b/src/KingSystem/Physics/System/physUserTag.cpp
@@ -7,8 +7,8 @@ void UserTag::onMaxPositionExceeded(RigidBody* body) {
body->onMaxPositionExceeded();
}
-void UserTag::m3(void* a, void* b, float c) {
- // FIXME
+void UserTag::onImpulse(RigidBody* body_a, RigidBody* body_b, float impulse_a) {
+ body_a->onImpulse(body_b, impulse_a);
}
void UserTag::onBodyShapeChanged(RigidBody* body) {}
diff --git a/src/KingSystem/Physics/System/physUserTag.h b/src/KingSystem/Physics/System/physUserTag.h
index 5da68e5b..ebf5815c 100644
--- a/src/KingSystem/Physics/System/physUserTag.h
+++ b/src/KingSystem/Physics/System/physUserTag.h
@@ -16,8 +16,7 @@ public:
/// Called when a rigid body goes beyond the broadphase border.
/// The default implementation just notifies the rigid body of this callback.
virtual void onMaxPositionExceeded(RigidBody* body);
- // a and b are probably physics bodies?
- virtual void m3(void* a, void* b, float c);
+ virtual void onImpulse(RigidBody* body_a, RigidBody* body_b, float impulse_a);
virtual void onBodyShapeChanged(RigidBody* body);
virtual void m5();
virtual const sead::SafeString& getName() const { return sead::SafeString::cEmptyString; }