From c11a33c5abbbe7696c6a46ee591bc9e84e65d766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Tue, 8 Mar 2022 12:59:24 +0100 Subject: [PATCH] ksys/phys: Implement ContactMgr::registerContactPoint for queries --- data/uking_functions.csv | 2 +- .../Physics/System/physContactMgr.cpp | 20 +++++++++++++++++++ .../Physics/System/physContactMgr.h | 5 +++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 19572758..25c08c6e 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -83763,7 +83763,7 @@ Address,Quality,Size,Name 0x0000007100fb31b8,U,000204,phys::ContactInfoTable::x_12 0x0000007100fb3284,O,000500,_ZN4ksys4phys10ContactMgr20registerContactPointEPNS0_16ContactPointInfoERKNS0_12ContactPointERKNS0_23RigidBodyCollisionMasksEb 0x0000007100fb3478,O,000340,_ZN4ksys4phys10ContactMgr20registerContactPointEPNS0_21LayerContactPointInfoERKNS0_12ContactPointEb -0x0000007100fb35cc,U,000376,phys::ContactInfoTable::x_16 +0x0000007100fb35cc,O,000376,_ZN4ksys4phys10ContactMgr20registerContactPointEPNS0_21QueryContactPointInfoERKNS0_12ContactPointEb 0x0000007100fb3744,O,000144,_ZN4ksys4phys10ContactMgr17registerCollisionEPNS0_13CollisionInfoEPNS0_9RigidBodyES5_ 0x0000007100fb37d4,O,000128,_ZN4ksys4phys10ContactMgr17registerCollisionEPNS0_25ContactLayerCollisionInfoEPNS0_9RigidBodyES5_ 0x0000007100fb3854,O,000228,_ZN4ksys4phys10ContactMgr19unregisterCollisionEPNS0_13CollisionInfoEPNS0_9RigidBodyES5_ diff --git a/src/KingSystem/Physics/System/physContactMgr.cpp b/src/KingSystem/Physics/System/physContactMgr.cpp index c1b29873..c7ea0aab 100644 --- a/src/KingSystem/Physics/System/physContactMgr.cpp +++ b/src/KingSystem/Physics/System/physContactMgr.cpp @@ -6,6 +6,7 @@ #include "KingSystem/Physics/System/physEntityGroupFilter.h" #include "KingSystem/Physics/System/physGroupFilter.h" #include "KingSystem/Physics/System/physLayerContactPointInfo.h" +#include "KingSystem/Physics/System/physQueryContactPointInfo.h" #include "KingSystem/Physics/System/physSystem.h" #include "KingSystem/Utils/Debug.h" @@ -231,6 +232,25 @@ bool ContactMgr::registerContactPoint(ContactPointInfo* info, const ContactPoint return disable_contact == ContactPointInfo::ShouldDisableContact::Yes; } +bool ContactMgr::registerContactPoint(QueryContactPointInfo* info, const ContactPoint& point, + bool penetrating) { + int pool_index = allocateContactPoint(); + if (pool_index == -1) + return false; + + auto& point_in_pool = mContactPointPool[pool_index]; + point_in_pool = point; + + if (info->mNumContactPoints >= info->mPoints.size() && info->_2c < 2) + return false; + + int index = info->mNumContactPoints.increment(); + info->mPoints[index] = &point_in_pool; + info->mPoints[index]->flags.makeAllZero(); + info->mPoints[index]->flags.change(ContactPoint::Flag::Penetrating, penetrating); + return true; +} + void ContactMgr::registerContactPoint(LayerContactPointInfo* info, const ContactPoint& point, bool penetrating) { int pool_index = allocateContactPoint(); diff --git a/src/KingSystem/Physics/System/physContactMgr.h b/src/KingSystem/Physics/System/physContactMgr.h index a3e7b948..4e4fec22 100644 --- a/src/KingSystem/Physics/System/physContactMgr.h +++ b/src/KingSystem/Physics/System/physContactMgr.h @@ -29,6 +29,7 @@ struct CollidingBodies; class CollisionInfo; class ContactLayerCollisionInfo; class ContactPointInfoBase; +class QueryContactPointInfo; class RigidBody; struct RigidBodyCollisionMasks; class ContactPointInfo; @@ -123,8 +124,8 @@ public: const RigidBodyCollisionMasks& colliding_body_masks, bool penetrating); - // 0x0000007100fb35cc - void registerContactPoint(void* unk_info, const ContactPoint& point, bool penetrating); + bool registerContactPoint(QueryContactPointInfo* info, const ContactPoint& point, + bool penetrating); void registerContactPoint(LayerContactPointInfo* info, const ContactPoint& point, bool penetrating);