2013-11-12 12:33:52 +01:00
/////////////////////////////////////////////////////////////////////
// Created by Dan Andersson 2013
/////////////////////////////////////////////////////////////////////
# ifndef OYSTER_PHYSICS_3D_RIGIDBODY_H
# define OYSTER_PHYSICS_3D_RIGIDBODY_H
# include "OysterMath.h"
# include "OysterCollision3D.h"
# include "OysterPhysics3D.h"
namespace Oyster { namespace Physics3D
{
struct RigidBody
2013-12-19 21:39:20 +01:00
{ //! A struct of a simple rigid body.
2013-11-12 12:33:52 +01:00
public :
2013-12-19 21:39:20 +01:00
: : Oyster : : Math : : Float4 centerPos , //!< Location of the body's center in the world.
axis , //!< Euler rotationAxis of the body.
boundingReach , //!<
momentum_Linear , //!< The linear momentum G (kg*m/s).
momentum_Angular , //!< The angular momentum H (Nm*s) around an parallell axis.
impulse_Linear , //!< The linear impulse sum Jl (kg*m/s) that will be consumed each update.
impulse_Angular ; //!< The angular impulse sum Ja (kg*m^2/s) that will be consumed each update.
: : Oyster : : Math : : Float restitutionCoeff , //!<
frictionCoeff_Static , //!<
frictionCoeff_Kinetic ; //!<
RigidBody ( ) ;
2013-11-12 12:33:52 +01:00
RigidBody & operator = ( const RigidBody & body ) ;
2013-12-19 21:39:20 +01:00
void Update_LeapFrog ( : : Oyster : : Math : : Float updateFrameLength ) ;
2013-11-12 12:33:52 +01:00
2013-12-19 21:39:20 +01:00
void ApplyImpulse ( const : : Oyster : : Math : : Float4 & worldJ , const : : Oyster : : Math : : Float4 & atWorldPos ) ;
void ApplyImpulse_Linear ( const : : Oyster : : Math : : Float4 & worldJ ) ;
void ApplyImpulse_Angular ( const : : Oyster : : Math : : Float4 & worldJ ) ;
void ApplyForce ( const : : Oyster : : Math : : Float4 & worldF , : : Oyster : : Math : : Float updateFrameLength ) ;
void ApplyForce ( const : : Oyster : : Math : : Float4 & worldF , : : Oyster : : Math : : Float updateFrameLength , const : : Oyster : : Math : : Float4 & atWorldPos ) ;
2013-11-12 12:33:52 +01:00
// GET METHODS ////////////////////////////////
2013-12-19 21:39:20 +01:00
const : : Oyster : : Math : : Float4x4 & GetMomentOfInertia ( ) const ;
: : Oyster : : Math : : Float GetMass ( ) const ;
const : : Oyster : : Math : : Quaternion & GetRotation ( ) const ;
: : Oyster : : Math : : Float4x4 GetRotationMatrix ( ) const ;
: : Oyster : : Math : : Float4x4 GetOrientation ( ) const ;
: : Oyster : : Math : : Float4x4 GetView ( ) const ;
: : Oyster : : Math : : Float4x4 GetToWorldMatrix ( ) const ;
: : Oyster : : Math : : Float4x4 GetToLocalMatrix ( ) const ;
: : Oyster : : Math : : Float4 GetSize ( ) const ;
: : Oyster : : Math : : Float4 GetVelocity_Linear ( ) const ;
: : Oyster : : Math : : Float4 GetVelocity_Angular ( ) const ;
: : Oyster : : Math : : Float4 GetLinearMomentum ( const : : Oyster : : Math : : Float4 & atWorldPos ) const ;
2013-11-12 12:33:52 +01:00
// SET METHODS ////////////////////////////////
2013-12-19 21:39:20 +01:00
void SetMomentOfInertia_KeepVelocity ( const : : Oyster : : Math : : Float4x4 & localTensorI ) ;
void SetMomentOfInertia_KeepMomentum ( const : : Oyster : : Math : : Float4x4 & localTensorI ) ;
2013-11-12 12:33:52 +01:00
void SetMass_KeepVelocity ( const : : Oyster : : Math : : Float & m ) ;
void SetMass_KeepMomentum ( const : : Oyster : : Math : : Float & m ) ;
void SetOrientation ( const : : Oyster : : Math : : Float4x4 & o ) ;
2013-11-25 16:35:56 +01:00
void SetRotation ( const : : Oyster : : Math : : Float4x4 & r ) ;
2013-12-19 21:39:20 +01:00
void SetSize ( const : : Oyster : : Math : : Float4 & widthHeight ) ;
2013-11-20 11:09:27 +01:00
2013-12-19 21:39:20 +01:00
void SetMomentum_Linear ( const : : Oyster : : Math : : Float4 & worldG , const : : Oyster : : Math : : Float4 & atWorldPos ) ;
void SetVelocity_Linear ( const : : Oyster : : Math : : Float4 & worldV ) ;
void SetVelocity_Linear ( const : : Oyster : : Math : : Float4 & worldV , const : : Oyster : : Math : : Float4 & atWorldPos ) ;
void SetVelocity_Angular ( const : : Oyster : : Math : : Float4 & worldW ) ;
void SetImpulse_Linear ( const : : Oyster : : Math : : Float4 & worldJ , const : : Oyster : : Math : : Float4 & atWorldPos ) ;
void SetForce ( const : : Oyster : : Math : : Float4 & worldF , : : Oyster : : Math : : Float updateFrameLength ) ;
void SetForce ( const : : Oyster : : Math : : Float4 & worldF , : : Oyster : : Math : : Float updateFrameLength , const : : Oyster : : Math : : Float4 & atWorldPos ) ;
2013-11-12 12:33:52 +01:00
private :
2013-12-19 21:39:20 +01:00
: : Oyster : : Math : : Float mass ; //!< m (kg)
: : Oyster : : Math : : Float4x4 momentOfInertiaTensor ; //!< I (Nm*s) Tensor matrix ( only need to be 3x3 matrix, but is 4x4 for future hardware acceleration ) (localValue)
: : Oyster : : Math : : Quaternion rotation ; //!< RotationAxis of the body.
2013-11-12 12:33:52 +01:00
} ;
} }
2013-12-19 21:39:20 +01:00
# include "RigidBody_Inline.h"
2013-11-12 12:33:52 +01:00
# endif