prime/include/MetroidPrime/CPhysicsActor.hpp

140 lines
4.3 KiB
C++

#ifndef _CPHYSICSACTOR_HPP
#define _CPHYSICSACTOR_HPP
#include "types.h"
#include "MetroidPrime/CActor.hpp"
#include "MetroidPrime/CAxisAngle.hpp"
#include "MetroidPrime/CPhysicsState.hpp"
#include "Kyoto/Math/CAABox.hpp"
#include "Kyoto/Math/CMatrix3f.hpp"
#include "Kyoto/Math/CNUQuaternion.hpp"
#include "Kyoto/Math/CVector3f.hpp"
#include "Collision/CCollidableAABox.hpp"
#include "rstl/optional_object.hpp"
struct SMoverData {
CVector3f x0_velocity;
CAxisAngle xc_angularVelocity;
CVector3f x18_momentum;
CAxisAngle x24_;
f32 x30_mass;
SMoverData(f32 mass, const CVector3f& velocity, const CAxisAngle& angularVelocity,
const CVector3f& momentum, const CAxisAngle& unk)
: x0_velocity(velocity)
, xc_angularVelocity(angularVelocity)
, x18_momentum(momentum)
, x24_(unk)
, x30_mass(mass) {}
};
class CMotionState {
public:
CMotionState(const CVector3f& translation, const CNUQuaternion& orientation,
const CVector3f& velocity, const CAxisAngle& angularMomentum)
: x0_translation(translation)
, xc_orientation(orientation)
, x1c_velocity(velocity)
, x28_angularMomentum(angularMomentum) {}
private:
CVector3f x0_translation;
CNUQuaternion xc_orientation;
CVector3f x1c_velocity;
CAxisAngle x28_angularMomentum;
};
CHECK_SIZEOF(CMotionState, 0x34)
class CCollisionInfoList;
class CPhysicsActor : public CActor {
public:
CPhysicsActor(TUniqueId uid, bool active, const rstl::string& name, const CEntityInfo& info,
const CTransform4f& xf, const CModelData& mData, const CMaterialList& matList,
const CAABox& aabb, const SMoverData& moverData, const CActorParameters& actParams,
f32 stepUp, f32 stepDown);
~CPhysicsActor() override;
// CActor
CVector3f GetOrbitPosition(const CStateManager& mgr) const override;
CVector3f GetAimPosition(const CStateManager& mgr, f32 val) const override;
// CPhysicsActor
virtual const CCollisionPrimitive* GetCollisionPrimitive() const;
virtual CTransform4f GetPrimitiveTransform() const;
virtual void CollidedWith(TUniqueId id, const CCollisionInfoList& list, CStateManager& mgr);
virtual f32 GetStepDownHeight() const;
virtual f32 GetStepUpHeight() const;
virtual f32 GetWeight() const;
void SetMass(float mass);
CAABox GetBoundingBox() const;
void ApplyImpulseWR(const CVector3f& impulse, const CAxisAngle& angularImpulse);
void ApplyTorqueWR(const CVector3f& torque);
void ApplyForceWR(const CVector3f& force, const CAxisAngle& torque);
void ApplyImpulseOR(const CVector3f& impulse, const CAxisAngle& angularImpulse);
void ApplyForceOR(const CVector3f& impulse, const CAxisAngle& torque);
void MoveCollisionPrimitive(const CVector3f&);
void SetVelocityWR(const CVector3f&);
void SetAngularVelocityWR(const CAxisAngle& angVel);
void SetVelocityOR(const CVector3f& vel);
CAxisAngle GetAngularVelocityOR() const;
void SetAngularVelocityOR(const CAxisAngle& angleVel);
void ClearForcesAndTorques();
void ComputeDerivedQuantities();
void Stop();
CPhysicsState GetPhysicsState() const;
void SetPhysicsState(const CPhysicsState& state);
CMotionState GetMotionState() const;
void SetMotionState(const CMotionState& state);
bool GetMovable() const { return xf8_24_movable; }
void SetMovable(bool v) { xf8_24_movable = v; }
private:
f32 xe8_mass;
f32 xec_massRecip;
f32 xf0_inertiaTensor;
f32 xf4_inertiaTensorRecip;
bool xf8_24_movable : 1;
bool xf8_25_angularEnabled : 1;
bool xf9_standardCollider;
CVector3f xfc_constantForce;
CAxisAngle x108_angularMomentum;
CMatrix3f x114_;
CVector3f x138_velocity;
CAxisAngle x144_angularVelocity;
CVector3f x150_momentum;
CVector3f x15c_force;
CVector3f x168_impulse;
CAxisAngle x174_torque;
CAxisAngle x180_angularImpulse;
CVector3f x18c_moveImpulse;
CAxisAngle x198_moveAngularImpulse;
CAABox x1a4_baseBoundingBox;
CCollidableAABox x1c0_collisionPrimitive;
CVector3f x1e8_primitiveOffset;
CMotionState x1f4_lastNonCollidingState;
rstl::optional_object< CVector3f > x228_lastFloorPlaneNormal;
f32 x238_maximumCollisionVelocity;
f32 x23c_stepUpHeight;
f32 x240_stepDownHeight;
f32 x244_restitutionCoefModifier;
f32 x248_collisionAccuracyModifier;
uint x24c_numTicksStuck;
uint x250_numTicksPartialUpdate;
uint x254_;
};
CHECK_SIZEOF(CPhysicsActor, 0x258)
#endif