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
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
13 changed files with 115 additions and 27 deletions

View File

@ -11945,7 +11945,7 @@ Address,Quality,Size,Name
0x00000071001c069c,O,000092,_ZNK5uking6action29ItemAmiiboCreateFromDropTable18getRuntimeTypeInfoEv
0x00000071001c06f8,U,000204,phys::RigidBodyParamView1::rtti1
0x00000071001c07c4,U,000092,phys::RigidBodyParamView1::rtti2
0x00000071001c0820,U,000140,
0x00000071001c0820,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys4phys22RigidBodyInstanceParamEE9isDerivedEPKNS0_9InterfaceE
0x00000071001c08ac,U,000220,
0x00000071001c0988,U,000176,sinitAmiiboDropTables
0x00000071001c0a38,U,000184,AI_Action_ItemAmiiboSelectDropTable::ctor
@ -21667,8 +21667,8 @@ Address,Quality,Size,Name
0x000000710033e548,O,000092,_ZNK5uking2ai12BoxWaterRoot18getRuntimeTypeInfoEv
0x000000710033e5a4,U,000204,
0x000000710033e670,U,000092,
0x000000710033e6cc,U,000112,
0x000000710033e73c,U,000092,
0x000000710033e6cc,O,000112,_ZNK4ksys4phys22RigidBodyInstanceParam27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x000000710033e73c,O,000092,_ZNK4ksys4phys22RigidBodyInstanceParam18getRuntimeTypeInfoEv
0x000000710033e798,U,000052,
0x000000710033e7cc,U,000100,AI_AI_BreathAttackEnemyBattle::ctor
0x000000710033e830,U,000068,_ZN5uking2ai23BreathAttackEnemyBattleD1Ev
@ -82961,11 +82961,11 @@ Address,Quality,Size,Name
0x0000007100f8c540,U,000008,
0x0000007100f8c548,U,000140,
0x0000007100f8c5d4,O,000492,_ZN4ksys4phys9RigidBodyC1ENS1_4TypeEjP12hkpRigidBodyRKN4sead14SafeStringBaseIcEEPNS5_4HeapEb
0x0000007100f8c7c0,U,000160,RigidBody::dtor
0x0000007100f8c860,U,000160,
0x0000007100f8c900,U,000168,RigidBody::dtorDelete
0x0000007100f8c9a8,U,000168,
0x0000007100f8ca50,U,000584,phys::RigidBody::initMotionAccessor
0x0000007100f8c7c0,O,000160,_ZN4ksys4phys9RigidBodyD1Ev
0x0000007100f8c860,O,000160,_ZThn32_N4ksys4phys9RigidBodyD1Ev
0x0000007100f8c900,O,000168,_ZN4ksys4phys9RigidBodyD0Ev
0x0000007100f8c9a8,O,000168,_ZThn32_N4ksys4phys9RigidBodyD0Ev
0x0000007100f8ca50,O,000584,_ZN4ksys4phys9RigidBody34initMotionAccessorForDynamicMotionEPN4sead4HeapE
0x0000007100f8cc98,U,000172,phys::RigidBody::initRigidMotion
0x0000007100f8cd44,U,000552,phys::RigidBody::initMotion
0x0000007100f8cf6c,O,000052,_ZNK4ksys4phys9RigidBody13getHkBodyNameEv
@ -83143,8 +83143,8 @@ Address,Quality,Size,Name
0x0000007100f96d58,U,000204,phys::RigidBody::x_128
0x0000007100f96e24,U,000096,
0x0000007100f96e84,U,000384,
0x0000007100f97004,U,000112,RigidBody::rtti1
0x0000007100f97074,U,000092,RigidBody::rtti2
0x0000007100f97004,O,000112,_ZNK4ksys4phys9RigidBody27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x0000007100f97074,O,000092,_ZNK4ksys4phys9RigidBody18getRuntimeTypeInfoEv
0x0000007100f970d0,O,000140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys4phys14MotionAccessorEE9isDerivedEPKNS0_9InterfaceE
0x0000007100f9715c,U,000004,j__ZN4ksys4phys16RigidBodyFactory9createBoxEPNS0_18RigidBodyParamViewEPN4sead4HeapE
0x0000007100f97160,U,000084,
@ -83333,7 +83333,7 @@ Address,Quality,Size,Name
0x0000007100f9f34c,O,003092,_ZN4ksys4phys14RigidBodyParam4InfoC1Ev
0x0000007100f9ff60,O,000344,_ZN4ksys4phys14RigidBodyParam5parseERKN3agl3utl16ResParameterListEPN4sead4HeapE
0x0000007100fa00b8,U,003684,ksys::phys::RigidBodyParam::createRigidBody
0x0000007100fa0f1c,U,000308,ksys::phys::RigidBodyParam::getParams
0x0000007100fa0f1c,O,000308,_ZNK4ksys4phys14RigidBodyParam17makeInstanceParamEPNS0_22RigidBodyInstanceParamE
0x0000007100fa1050,U,000296,ksys::phys::RigidBodyParam::createEntityShape
0x0000007100fa1178,O,000028,_ZNK4ksys4phys14RigidBodyParam15getContactLayerEv
0x0000007100fa1194,O,000028,_ZNK4ksys4phys14RigidBodyParam12getGroundHitEv
@ -83897,7 +83897,7 @@ Address,Quality,Size,Name
0x0000007100fbaddc,U,000256,
0x0000007100fbaedc,O,000060,_ZNK4ksys4phys11InstanceSet14sub_7100FBAEDCEii
0x0000007100fbaf18,U,000244,
0x0000007100fbb00c,M,000384,_ZN4ksys4phys11InstanceSet14sub_7100FBB00CEPNS0_9RigidBodyEPNS0_14RigidBodyParamE
0x0000007100fbb00c,O,000384,_ZN4ksys4phys11InstanceSet14sub_7100FBB00CEPNS0_9RigidBodyEPNS0_14RigidBodyParamE
0x0000007100fbb18c,U,000272,
0x0000007100fbb29c,U,000216,
0x0000007100fbb374,U,000172,

Can't render this file because it is too large.

View File

@ -1,6 +1,7 @@
#pragma once
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
namespace ksys::phys {

View File

@ -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"

View File

@ -1,6 +1,7 @@
#pragma once
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
namespace ksys::phys {

View File

@ -1,6 +1,7 @@
#pragma once
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
namespace ksys::phys {

View File

@ -1,6 +1,7 @@
#pragma once
#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h"
namespace ksys::phys {

View File

@ -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)

View File

@ -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;

View File

@ -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"

View File

@ -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 {

View File

@ -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);
}

View File

@ -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;

View File

@ -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()]);