ksys/phys: Add prerequisites for RigidBody (RigidBodyParam fixes)

Seems to have fixed _ZN4ksys4phys11InstanceSet14sub_7100FBB00CEPNS0_9RigidBodyEPNS0_14RigidBodyParamE
This commit is contained in:
Léo Lam
2022-01-16 11:42:40 +01:00
parent 544c33e2eb
commit 2ed36c7dc0
13 changed files with 115 additions and 27 deletions
@@ -1,6 +1,7 @@
#pragma once
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
namespace ksys::phys {
@@ -5,6 +5,7 @@
#include <prim/seadTypedBitFlag.h>
#include <thread/seadAtomic.h>
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
#include "KingSystem/Physics/System/physDefines.h"
#include "KingSystem/Physics/System/physMaterialMask.h"
@@ -1,6 +1,7 @@
#pragma once
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
namespace ksys::phys {
@@ -1,6 +1,7 @@
#pragma once
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
namespace ksys::phys {
@@ -1,6 +1,7 @@
#pragma once
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
namespace ksys::phys {
@@ -1,7 +1,12 @@
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include <Havok/Physics2012/Dynamics/Collide/hkpResponseModifier.h>
#include <Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h>
#include "KingSystem/Physics/RigidBody/physMotionAccessor.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyMotion.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyMotionProxy.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
#include "KingSystem/Physics/System/physMemSystem.h"
#include "KingSystem/Physics/physConversions.h"
namespace ksys::phys {
@@ -26,6 +31,52 @@ RigidBody::RigidBody(Type type, u32 mass_scaling, hkpRigidBody* hk_body,
mFlags.set(Flag::_100);
}
RigidBody::~RigidBody() {
if (mType != Type::_0 && mType != Type::TerrainHeightField &&
mType != Type::CharacterController) {
mHkBody->setName(nullptr);
mHkBody->deallocateInternalArrays();
}
if (mMotionAccessor) {
delete mMotionAccessor;
mMotionAccessor = nullptr;
}
}
namespace {
struct RigidBodyDynamicInstanceParam : RigidBodyInstanceParam {};
} // namespace
bool RigidBody::initMotionAccessorForDynamicMotion(sead::Heap* heap) {
if (isMassScaling())
mMotionAccessor = new (heap) RigidBodyMotionProxy(this);
else
mMotionAccessor = new (heap) RigidBodyMotion(this);
RigidBodyDynamicInstanceParam param;
auto* body = getHkBody();
param.motion_type = MotionType::Dynamic;
param.mass = body->getMass();
hkMatrix3 inertia;
body->getInertiaLocal(inertia);
constexpr float MinInertia = 0.001;
param.inertia = {sead::Mathf::max(inertia(0, 0), MinInertia),
sead::Mathf::max(inertia(1, 1), MinInertia),
sead::Mathf::max(inertia(2, 2), MinInertia)};
param.center_of_mass = toVec3(body->getCenterOfMassLocal());
param.linear_damping = body->getLinearDamping();
param.angular_damping = body->getAngularDamping();
param.gravity_factor = body->getGravityFactor();
param.time_factor = body->getTimeFactor();
param.max_linear_velocity = body->getMaxLinearVelocity();
param.max_angular_velocity_rad = body->getMaxAngularVelocity();
mMotionAccessor->init(param, heap);
return true;
}
sead::SafeString RigidBody::getHkBodyName() const {
const char* name = mHkBody->getName();
if (!name)
@@ -8,7 +8,6 @@
#include <thread/seadAtomic.h>
#include <thread/seadCriticalSection.h>
#include "KingSystem/Physics/RigidBody/physRigidBodyAccessor.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
#include "KingSystem/Physics/System/physDefines.h"
#include "KingSystem/Utils/Types.h"
@@ -20,13 +19,14 @@ class hkpMotion;
namespace ksys::phys {
class MotionAccessor;
struct RigidBodyInstanceParam;
class RigidBodyMotion;
class RigidContactPoints;
class UserTag;
class RigidBase {
public:
virtual ~RigidBase() = 0;
virtual ~RigidBase() = default;
};
class RigidBody : public sead::IDisposer, public RigidBase {
@@ -107,9 +107,9 @@ public:
virtual const char* getName();
// 0x0000007100f8ca50
bool initMotionAccessor(sead::Heap* heap);
bool initMotionAccessorForDynamicMotion(sead::Heap* heap);
// 0x0000007100f8cc98
void initMotionAndAccessor();
void initMotionAccessor();
// 0x0000007100f8cd44
void initMotion(hkpMotion* motion, MotionType motion_type,
const RigidBodyInstanceParam& params);
@@ -182,7 +182,7 @@ public:
void setCollideWater(bool);
void sub_7100F8F51C();
void sub_7100F8F8CC(ContactLayer, GroundHit, void*);
void sub_7100F8F9E8(u32*, void*);
void sub_7100F8F9E8(ReceiverMask*, void*);
void sub_7100F8FA44(ContactLayer, u32);
hkpMotion* getMotion() const;
@@ -9,6 +9,7 @@
#include <prim/seadSafeString.h>
#include <prim/seadScopedLock.h>
#include "KingSystem/Physics/RigidBody/physRigidBodyMotionProxy.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
#include "KingSystem/Physics/physConversions.h"
#include "KingSystem/Utils/Debug.h"
@@ -2,6 +2,7 @@
#include <Havok/Common/Base/hkBase.h>
#include <Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h>
#include "KingSystem/Physics/RigidBody/physRigidBodyMotion.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
#include "KingSystem/Physics/physConversions.h"
namespace ksys::phys {
@@ -66,6 +66,36 @@ bool RigidBodyParam::parse(const agl::utl::ResParameterList& res_list, sead::Hea
return true;
}
void RigidBodyParam::makeInstanceParam(RigidBodyInstanceParam* param) const {
param->mass = *info.mass;
param->name = info.rigid_body_name->cstr();
param->inertia = *info.inertia;
param->center_of_mass = *info.center_of_mass;
param->max_linear_velocity = *info.max_linear_velocity;
param->max_angular_velocity_rad = *info.max_angular_velocity_rad;
param->toi = *info.toi;
param->motion_type = getMotionType();
param->linear_damping = *info.linear_damping;
param->angular_damping = *info.angular_damping;
param->max_impulse = *info.max_impulse;
param->col_impulse_scale = *info.col_impulse_scale;
param->ignore_normal_for_impulse = *info.ignore_normal_for_impulse;
param->always_character_mass_scaling = *info.always_character_mass_scaling;
param->friction_scale = *info.friction_scale;
param->restitution_scale = *info.restitution_scale;
param->water_buoyancy_scale = *info.water_buoyancy_scale;
param->water_flow_effective_rate = *info.water_flow_effective_rate;
param->magne_mass_scaling_factor = *info.magne_mass_scaling_factor;
param->contact_layer = getContactLayer();
param->groundhit = getGroundHit();
param->groundhit_mask = info.ground_hit_mask;
param->contact_mask = *info.contact_mask;
param->no_hit_ground = *info.no_hit_ground;
param->no_hit_water = *info.no_hit_water;
param->no_char_standing_on = *info.no_char_standing_on;
receiverMaskGetSensorLayerMaskForType(&param->receiver_mask, *info.receiver_type);
}
ContactLayer RigidBodyParam::getContactLayer() const {
return contactLayerFromText(*info.layer);
}
@@ -57,7 +57,7 @@ public:
sead::Vector3f center_of_mass = sead::Vector3f::zero;
float linear_damping = 0.0f;
float angular_damping = 0.05f;
f32 _3c = 1.0f;
f32 gravity_factor = 1.0f;
f32 time_factor = 1.0f;
float max_linear_velocity = 200.0f;
float max_angular_velocity_rad = 200.0f;
@@ -74,20 +74,21 @@ public:
void* p = nullptr;
ContactLayer contact_layer = ContactLayer::EntityObject;
GroundHit groundhit = GroundHit::HitAll;
u32 info_5e0 = 0;
u32 groundhit_mask = 0;
u32 contact_mask = 0;
u32 flags = 0x80000000;
ReceiverMask receiver_mask;
bool ignore_normal_for_impulse = false;
bool no_hit_ground = false;
bool no_hit_water = false;
bool no_char_standing_on = false;
bool _90 = false;
bool isDynamicSensor() const {
return getContactLayerType(contact_layer) == ContactLayerType::Sensor &&
motion_type == MotionType::Dynamic;
}
};
KSYS_CHECK_SIZE_NX150(RigidBodyInstanceParam, 0x90);
KSYS_CHECK_SIZE_NX150(RigidBodyInstanceParam, 0x98);
struct RigidBodyParam : agl::utl::ParameterList {
struct Info : agl::utl::ParameterObj {
@@ -152,7 +153,7 @@ struct RigidBodyParam : agl::utl::ParameterList {
// TODO: types and names
void* createRigidBody(void* x, sead::Heap* heap, bool y);
bool getParams(RigidBodyInstanceParam* params) const;
void makeInstanceParam(RigidBodyInstanceParam* param) const;
void* createEntityShape(void* x, void* y, sead::Heap* heap);
ContactLayer getContactLayer() const;
@@ -122,17 +122,16 @@ void* InstanceSet::sub_7100FBAEDC(s32 idx1, s32 idx2) const {
return mRigidBodySets[idx1]->getRigidBody(idx2);
}
// NON_MATCHING
void InstanceSet::sub_7100FBB00C(phys::RigidBody* body, phys::RigidBodyParam* param) {
if (body == nullptr)
return;
phys::RigidBodyInstanceParam instance_params;
param->getParams(&instance_params);
param->makeInstanceParam(&instance_params);
if (instance_params.contact_layer == phys::ContactLayer::SensorCustomReceiver) {
body->sub_7100F8F9E8(&instance_params.flags, _188[body->isMassScaling()]);
} else if (instance_params.info_5e0) {
body->sub_7100F8FA44(instance_params.contact_layer, instance_params.info_5e0);
body->sub_7100F8F9E8(&instance_params.receiver_mask, _188[body->isMassScaling()]);
} else if (instance_params.groundhit_mask) {
body->sub_7100F8FA44(instance_params.contact_layer, instance_params.groundhit_mask);
} else {
body->sub_7100F8F8CC(instance_params.contact_layer, instance_params.groundhit,
_188[body->isMassScaling()]);