mirror of https://github.com/zeldaret/botw.git
112 lines
4.9 KiB
C++
112 lines
4.9 KiB
C++
#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"
|
|
|
|
namespace ksys::phys {
|
|
|
|
ClosestPointQueryWithInfo::ClosestPointQueryWithInfo(RigidBody* body, int num_points,
|
|
const sead::SafeString& name, int a,
|
|
LowPriority low_priority)
|
|
: ClosestPointQuery(body, nullptr) {
|
|
mStatus = Status::_1;
|
|
auto* heap = System::instance()->getPhysicsTempHeap(low_priority);
|
|
mContactPointInfo = QueryContactPointInfo::make(heap, num_points, name, a, 0);
|
|
}
|
|
|
|
ClosestPointQueryWithInfo::~ClosestPointQueryWithInfo() {
|
|
if (mStatus == Status::_1 || mStatus == Status::_3) {
|
|
QueryContactPointInfo::free(mContactPointInfo);
|
|
}
|
|
}
|
|
|
|
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
|