diff options
Diffstat (limited to 'src/KingSystem/Physics/System/physClosestPointQueryWithInfo.cpp')
| -rw-r--r-- | src/KingSystem/Physics/System/physClosestPointQueryWithInfo.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/KingSystem/Physics/System/physClosestPointQueryWithInfo.cpp b/src/KingSystem/Physics/System/physClosestPointQueryWithInfo.cpp index b0125f27..65f34b68 100644 --- a/src/KingSystem/Physics/System/physClosestPointQueryWithInfo.cpp +++ b/src/KingSystem/Physics/System/physClosestPointQueryWithInfo.cpp @@ -1,4 +1,6 @@ #include "KingSystem/Physics/System/physClosestPointQueryWithInfo.h" +#include "KingSystem/Physics/RigidBody/Shape/Sphere/physSphereRigidBody.h" +#include "KingSystem/Physics/RigidBody/Shape/Sphere/physSphereShape.h" #include "KingSystem/Physics/System/physQueryContactPointInfo.h" #include "KingSystem/Physics/System/physSystem.h" @@ -19,4 +21,91 @@ ClosestPointQueryWithInfo::~ClosestPointQueryWithInfo() { } } +SphereBasedClosestPointQuery::SphereBasedClosestPointQuery( + const sead::Vector3f& position, float sphere_radius, ContactLayer layer, GroundHit ground_hit, + SystemGroupHandler* group_handler, int num_points, const sead::SafeString& name, int a, + LowPriority low_priority) + : ClosestPointQueryWithInfo(nullptr, num_points, name, a, low_priority) { + auto* heap = System::instance()->getPhysicsTempHeap(low_priority); + + SphereParam sphere_param; + sphere_param.name = sead::SafeString::cEmptyString.cstr(); + sphere_param.radius = sphere_radius; + sphere_param.contact_layer = layer; + sphere_param.groundhit = ground_hit; + sphere_param.motion_type = MotionType::Fixed; + sphere_param._90 = true; + sphere_param.system_group_handler = group_handler; + makeAndSetSphere(&sphere_param, heap, position); +} + +SphereBasedClosestPointQuery::SphereBasedClosestPointQuery( + const sead::Vector3f& position, float sphere_radius, ContactLayer layer, + const LayerMaskBuilder& layer_mask_builder, int num_points, const sead::SafeString& name, int a, + LowPriority low_priority) + : ClosestPointQueryWithInfo(nullptr, num_points, name, a, low_priority) { + auto* heap = System::instance()->getPhysicsTempHeap(low_priority); + + SphereParam sphere_param; + sphere_param.name = sead::SafeString::cEmptyString.cstr(); + sphere_param.radius = sphere_radius; + sphere_param.contact_layer = layer; + sphere_param.motion_type = MotionType::Fixed; + sphere_param._90 = true; + makeAndSetSphere(&sphere_param, heap, position, &layer_mask_builder); +} + +SphereBasedClosestPointQuery::SphereBasedClosestPointQuery( + const sead::Vector3f& position, float sphere_radius, const SensorCollisionMask& mask, + SystemGroupHandler* group_handler, int num_points, const sead::SafeString& name, int a, + LowPriority low_priority) + : ClosestPointQueryWithInfo(nullptr, num_points, name, a, low_priority) { + auto* heap = System::instance()->getPhysicsTempHeap(low_priority); + + SphereParam sphere_param; + sphere_param.name = sead::SafeString::cEmptyString.cstr(); + sphere_param.radius = sphere_radius; + sphere_param.contact_layer = ContactLayer::SensorCustomReceiver; + sphere_param.groundhit = GroundHit::HitAll; + sphere_param.receiver_mask = mask; + sphere_param.motion_type = MotionType::Fixed; + sphere_param.system_group_handler = group_handler; + sphere_param._90 = true; + makeAndSetSphere(&sphere_param, heap, position); +} + +SphereBasedClosestPointQuery::SphereBasedClosestPointQuery(RigidBody* sphere, + const sead::Vector3f& position, + int num_points, + const sead::SafeString& name, int a, + LowPriority low_priority) + : ClosestPointQueryWithInfo(sphere, num_points, name, a, low_priority) { + [[maybe_unused]] auto* heap = System::instance()->getPhysicsTempHeap(low_priority); + mSphere = sphere; + mMtx.setTranslation(position); +} + +SphereBasedClosestPointQuery::~SphereBasedClosestPointQuery() { + if (mStatus == Status::_2 || mStatus == Status::_3) { + delete mSphere; + } +} + +void SphereBasedClosestPointQuery::makeAndSetSphere(RigidBodyInstanceParam* sphere_param, + sead::Heap* heap, + const sead::Vector3f& position, + const LayerMaskBuilder* layer_mask_builder) { + mSphere = SphereRigidBody::make(sphere_param, heap); + mBody = mSphere; + + if (layer_mask_builder != nullptr) { + setLayerMasksAndBodyCollisionFilterInfo(*layer_mask_builder); + } + + if (mBody) { + mMtx.setTranslation(position); + mStatus = Status::_3; + } +} + } // namespace ksys::phys |
