Changed float4 to float3

This commit is contained in:
Robin Engman 2014-01-28 09:52:58 +01:00
parent 018d6e3c5a
commit f96c5a9f7e
5 changed files with 116 additions and 116 deletions

View File

@ -31,8 +31,8 @@ namespace
ICustomBody::State protoState; proto->GetState( protoState ); ICustomBody::State protoState; proto->GetState( protoState );
ICustomBody::State deuterState; deuter->GetState( deuterState ); ICustomBody::State deuterState; deuter->GetState( deuterState );
Float4 protoG = protoState.GetLinearMomentum( worldPointOfContact ), Float4 protoG = protoState.GetLinearMomentum( worldPointOfContact.xyz ),
deuterG = deuterState.GetLinearMomentum( worldPointOfContact ); deuterG = deuterState.GetLinearMomentum( worldPointOfContact.xyz );
// calc from perspective of deuter // calc from perspective of deuter
Float4 normal; deuter->GetNormalAt( worldPointOfContact, normal ); Float4 normal; deuter->GetNormalAt( worldPointOfContact, normal );
@ -40,7 +40,7 @@ namespace
deuterG_Magnitude = deuterG.Dot( normal ); deuterG_Magnitude = deuterG.Dot( normal );
// if they are not relatively moving towards eachother, there is no collision // if they are not relatively moving towards eachother, there is no collision
Float deltaPos = normal.Dot( deuterState.GetCenterPosition() - protoState.GetCenterPosition() ); Float deltaPos = normal.Dot( Float4(deuterState.GetCenterPosition(), 1) - Float4(protoState.GetCenterPosition(), 1) );
if( deltaPos < 0.0f ) if( deltaPos < 0.0f )
{ {
if( protoG_Magnitude >= deuterG_Magnitude ) if( protoG_Magnitude >= deuterG_Magnitude )
@ -95,13 +95,13 @@ namespace
// } // }
Float kineticEnergyPBefore = Oyster::Physics3D::Formula::LinearKineticEnergy( protoState.GetMass(), protoState.GetLinearMomentum().xyz/protoState.GetMass() ); Float kineticEnergyPBefore = Oyster::Physics3D::Formula::LinearKineticEnergy( protoState.GetMass(), protoState.GetLinearMomentum()/protoState.GetMass() );
// protoState.ApplyForwarding( forwardedDeltaPos, forwardedDeltaAxis ); // protoState.ApplyForwarding( forwardedDeltaPos, forwardedDeltaAxis );
protoState.ApplyImpulse( bounce, worldPointOfContact, normal ); protoState.ApplyImpulse( bounce.xyz, worldPointOfContact.xyz, normal.xyz );
proto->SetState( protoState ); proto->SetState( protoState );
Float kineticEnergyPAFter = Oyster::Physics3D::Formula::LinearKineticEnergy( protoState.GetMass(), (protoState.GetLinearMomentum().xyz + protoState.GetLinearImpulse().xyz)/protoState.GetMass() ); Float kineticEnergyPAFter = Oyster::Physics3D::Formula::LinearKineticEnergy( protoState.GetMass(), (protoState.GetLinearMomentum() + protoState.GetLinearImpulse())/protoState.GetMass() );
proto->CallSubscription_CollisionResponse( deuter, kineticEnergyPBefore - kineticEnergyPAFter ); proto->CallSubscription_CollisionResponse( deuter, kineticEnergyPBefore - kineticEnergyPAFter );
@ -179,7 +179,7 @@ void API_Impl::Update()
{ {
case Gravity::GravityType_Well: case Gravity::GravityType_Well:
{ {
Float4 d = Float4( this->gravity[i].well.position, 1.0f ) - state.GetCenterPosition(); Float4 d = Float4( this->gravity[i].well.position, 1.0f ) - Float4( state.GetCenterPosition(), 1.0f );
Float rSquared = d.Dot( d ); Float rSquared = d.Dot( d );
if( rSquared != 0.0 ) if( rSquared != 0.0 )
{ {
@ -201,7 +201,7 @@ void API_Impl::Update()
if( gravityImpulse != Float4::null ) if( gravityImpulse != Float4::null )
{ {
state.ApplyLinearImpulse( gravityImpulse ); state.ApplyLinearImpulse( gravityImpulse.xyz );
(*proto)->SetGravityNormal( gravityImpulse.GetNormalized().xyz ); (*proto)->SetGravityNormal( gravityImpulse.GetNormalized().xyz );
(*proto)->SetState( state ); (*proto)->SetState( state );
} }

View File

@ -56,7 +56,7 @@ SimpleRigidBody::SimpleRigidBody()
SimpleRigidBody::SimpleRigidBody( const API::SimpleBodyDescription &desc ) SimpleRigidBody::SimpleRigidBody( const API::SimpleBodyDescription &desc )
{ {
this->rigid.SetRotation( desc.rotation ); //this->rigid.SetRotation( desc.rotation );
this->rigid.centerPos = desc.centerPosition; this->rigid.centerPos = desc.centerPosition;
this->rigid.SetSize( desc.size ); this->rigid.SetSize( desc.size );
this->rigid.SetMass_KeepMomentum( desc.mass ); this->rigid.SetMass_KeepMomentum( desc.mass );
@ -143,8 +143,8 @@ void SimpleRigidBody::SetState( const SimpleRigidBody::State &state )
if( state.IsForwarded() ) if( state.IsForwarded() )
{ {
this->deltaPos += state.GetForward_DeltaPos(); this->deltaPos += Float4(state.GetForward_DeltaPos(), 0);
this->deltaAxis += state.GetForward_DeltaAxis(); this->deltaAxis += Float4(state.GetForward_DeltaAxis(), 0);
this->isForwarded; this->isForwarded;
} }
@ -205,7 +205,7 @@ Sphere & SimpleRigidBody::GetBoundingSphere( Sphere &targetMem ) const
Float4 & SimpleRigidBody::GetNormalAt( const Float4 &worldPos, Float4 &targetMem ) const Float4 & SimpleRigidBody::GetNormalAt( const Float4 &worldPos, Float4 &targetMem ) const
{ {
Float4 offset = worldPos - this->rigid.centerPos; Float4 offset = worldPos.xyz - this->rigid.centerPos;
Float distance = offset.Dot( offset ); Float distance = offset.Dot( offset );
Float3 normal = Float3::null; Float3 normal = Float3::null;
@ -295,7 +295,7 @@ UpdateState SimpleRigidBody::Update( Float timeStepLength )
{ {
if( this->isForwarded ) if( this->isForwarded )
{ {
this->rigid.Move( this->deltaPos, this->deltaAxis ); this->rigid.Move( this->deltaPos.xyz, this->deltaAxis.xyz );
this->deltaPos = Float4::null; this->deltaPos = Float4::null;
this->deltaAxis = Float4::null; this->deltaAxis = Float4::null;
this->isForwarded = false; this->isForwarded = false;
@ -310,7 +310,7 @@ UpdateState SimpleRigidBody::Update( Float timeStepLength )
void SimpleRigidBody::Predict( Float4 &outDeltaPos, Float4 &outDeltaAxis, const Float4 &actingLinearImpulse, const Float4 &actingAngularImpulse, Float deltaTime ) void SimpleRigidBody::Predict( Float4 &outDeltaPos, Float4 &outDeltaAxis, const Float4 &actingLinearImpulse, const Float4 &actingAngularImpulse, Float deltaTime )
{ {
this->rigid.Predict_LeapFrog( outDeltaPos, outDeltaAxis, actingLinearImpulse, actingAngularImpulse, deltaTime ); this->rigid.Predict_LeapFrog( outDeltaPos.xyz, outDeltaAxis.xyz, actingLinearImpulse.xyz, actingAngularImpulse.xyz, deltaTime );
} }
void SimpleRigidBody::SetScene( void *scene ) void SimpleRigidBody::SetScene( void *scene )

View File

@ -24,7 +24,7 @@ SphericalRigidBody::SphericalRigidBody()
SphericalRigidBody::SphericalRigidBody( const API::SphericalBodyDescription &desc ) SphericalRigidBody::SphericalRigidBody( const API::SphericalBodyDescription &desc )
{ {
this->rigid = RigidBody(); this->rigid = RigidBody();
this->rigid.SetRotation( desc.rotation ); //this->rigid.SetRotation( desc.rotation );
this->rigid.centerPos = desc.centerPosition; this->rigid.centerPos = desc.centerPosition;
this->rigid.boundingReach = Float4( desc.radius, desc.radius, desc.radius, 0.0f ); this->rigid.boundingReach = Float4( desc.radius, desc.radius, desc.radius, 0.0f );
this->rigid.SetMass_KeepMomentum( desc.mass ); this->rigid.SetMass_KeepMomentum( desc.mass );
@ -108,8 +108,8 @@ void SphericalRigidBody::SetState( const SphericalRigidBody::State &state )
if( state.IsForwarded() ) if( state.IsForwarded() )
{ {
this->deltaPos += state.GetForward_DeltaPos(); this->deltaPos += Float4(state.GetForward_DeltaPos(), 0);
this->deltaAxis += state.GetForward_DeltaAxis(); this->deltaAxis += Float4(state.GetForward_DeltaAxis());
this->isForwarded = false; this->isForwarded = false;
} }
@ -171,7 +171,7 @@ Sphere & SphericalRigidBody::GetBoundingSphere( Sphere &targetMem ) const
Float4 & SphericalRigidBody::GetNormalAt( const Float4 &worldPos, Float4 &targetMem ) const Float4 & SphericalRigidBody::GetNormalAt( const Float4 &worldPos, Float4 &targetMem ) const
{ {
targetMem = worldPos - this->rigid.centerPos; targetMem = worldPos.xyz - this->rigid.centerPos;
Float magnitude = targetMem.GetMagnitude(); Float magnitude = targetMem.GetMagnitude();
if( magnitude != 0.0f ) if( magnitude != 0.0f )
{ // sanity check { // sanity check
@ -220,7 +220,7 @@ UpdateState SphericalRigidBody::Update( Float timeStepLength )
{ {
if( this->isForwarded ) if( this->isForwarded )
{ {
this->rigid.Move( this->deltaPos, this->deltaAxis ); this->rigid.Move( this->deltaPos.xyz, this->deltaAxis.xyz );
this->deltaPos = Float4::null; this->deltaPos = Float4::null;
this->deltaAxis = Float4::null; this->deltaAxis = Float4::null;
this->isForwarded = false; this->isForwarded = false;
@ -235,7 +235,7 @@ UpdateState SphericalRigidBody::Update( Float timeStepLength )
void SphericalRigidBody::Predict( ::Oyster::Math::Float4 &outDeltaPos, ::Oyster::Math::Float4 &outDeltaAxis, const ::Oyster::Math::Float4 &actingLinearImpulse, const ::Oyster::Math::Float4 &actingAngularImpulse, ::Oyster::Math::Float deltaTime ) void SphericalRigidBody::Predict( ::Oyster::Math::Float4 &outDeltaPos, ::Oyster::Math::Float4 &outDeltaAxis, const ::Oyster::Math::Float4 &actingLinearImpulse, const ::Oyster::Math::Float4 &actingAngularImpulse, ::Oyster::Math::Float deltaTime )
{ {
this->rigid.Predict_LeapFrog( outDeltaPos, outDeltaAxis, actingLinearImpulse, actingAngularImpulse, deltaTime ); this->rigid.Predict_LeapFrog( outDeltaPos.xyz, outDeltaAxis.xyz, actingLinearImpulse.xyz, actingAngularImpulse.xyz, deltaTime );
} }
void SphericalRigidBody::SetSubscription( ICustomBody::EventAction_Collision functionPointer ) void SphericalRigidBody::SetSubscription( ICustomBody::EventAction_Collision functionPointer )

View File

@ -13,8 +13,8 @@ namespace Oyster
inline SimpleBodyDescription::SimpleBodyDescription() inline SimpleBodyDescription::SimpleBodyDescription()
{ {
this->rotation = ::Oyster::Math::Float4x4::identity; this->rotation = ::Oyster::Math::Float4x4::identity;
this->centerPosition = ::Oyster::Math::Float4::standard_unit_w; this->centerPosition = ::Oyster::Math::Float3::null;
this->size = ::Oyster::Math::Float4( 1.0f ); this->size = ::Oyster::Math::Float3( 1.0f );
this->mass = 12.0f; this->mass = 12.0f;
this->restitutionCoeff = 1.0f; this->restitutionCoeff = 1.0f;
this->frictionCoeff_Dynamic = 0.5f; this->frictionCoeff_Dynamic = 0.5f;
@ -29,7 +29,7 @@ namespace Oyster
inline SphericalBodyDescription::SphericalBodyDescription() inline SphericalBodyDescription::SphericalBodyDescription()
{ {
this->rotation = ::Oyster::Math::Float4x4::identity; this->rotation = ::Oyster::Math::Float4x4::identity;
this->centerPosition = ::Oyster::Math::Float4::standard_unit_w; this->centerPosition = ::Oyster::Math::Float3::null;
this->radius = 0.5f; this->radius = 0.5f;
this->mass = 10.0f; this->mass = 10.0f;
this->restitutionCoeff = 1.0f; this->restitutionCoeff = 1.0f;
@ -41,7 +41,7 @@ namespace Oyster
this->ignoreGravity = false; this->ignoreGravity = false;
} }
inline CustomBodyState::CustomBodyState( ::Oyster::Math::Float mass, ::Oyster::Math::Float restitutionCoeff, ::Oyster::Math::Float staticFrictionCoeff, ::Oyster::Math::Float kineticFrictionCoeff, const ::Oyster::Physics3D::MomentOfInertia &inertiaTensor, const ::Oyster::Math::Float4 &reach, const ::Oyster::Math::Float4 &centerPos, const ::Oyster::Math::Float4 &rotation, const ::Oyster::Math::Float4 &linearMomentum, const ::Oyster::Math::Float4 &angularMomentum, const ::Oyster::Math::Float4 &gravityNormal ) inline CustomBodyState::CustomBodyState( ::Oyster::Math::Float mass, ::Oyster::Math::Float restitutionCoeff, ::Oyster::Math::Float staticFrictionCoeff, ::Oyster::Math::Float kineticFrictionCoeff, const ::Oyster::Physics3D::MomentOfInertia &inertiaTensor, const ::Oyster::Math::Float3 &reach, const ::Oyster::Math::Float3 &centerPos, const ::Oyster::Math::Float3 &rotation, const ::Oyster::Math::Float3 &linearMomentum, const ::Oyster::Math::Float3 &angularMomentum, const ::Oyster::Math::Float3 &gravityNormal )
{ {
this->mass = mass; this->mass = mass;
this->restitutionCoeff = restitutionCoeff; this->restitutionCoeff = restitutionCoeff;
@ -53,8 +53,8 @@ namespace Oyster
this->angularAxis = rotation; this->angularAxis = rotation;
this->linearMomentum = linearMomentum; this->linearMomentum = linearMomentum;
this->angularMomentum = angularMomentum; this->angularMomentum = angularMomentum;
this->linearImpulse = this->angularImpulse = ::Oyster::Math::Float4::null; this->linearImpulse = this->angularImpulse = ::Oyster::Math::Float3::null;
this->deltaPos = this->deltaAxis = ::Oyster::Math::Float4::null; this->deltaPos = this->deltaAxis = ::Oyster::Math::Float3::null;
this->isSpatiallyAltered = this->isDisturbed = this->isForwarded = false; this->isSpatiallyAltered = this->isDisturbed = this->isForwarded = false;
this->gravityNormal = gravityNormal; this->gravityNormal = gravityNormal;
} }
@ -107,87 +107,87 @@ namespace Oyster
return this->inertiaTensor; return this->inertiaTensor;
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetReach() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetReach() const
{ {
return this->reach; return this->reach;
} }
inline ::Oyster::Math::Float4 CustomBodyState::GetSize() const inline ::Oyster::Math::Float3 CustomBodyState::GetSize() const
{ {
return 2.0f * this->GetReach(); return 2.0f * this->GetReach();
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetCenterPosition() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetCenterPosition() const
{ {
return this->centerPos; return this->centerPos;
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetAngularAxis() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetAngularAxis() const
{ {
return this->angularAxis; return this->angularAxis;
} }
inline ::Oyster::Math::Float4x4 CustomBodyState::GetRotation() const inline ::Oyster::Math::Float4x4 CustomBodyState::GetRotation() const
{ {
return ::Oyster::Math3D::RotationMatrix( this->GetAngularAxis().xyz ); return ::Oyster::Math3D::RotationMatrix( this->GetAngularAxis() );
} }
inline ::Oyster::Math::Float4x4 CustomBodyState::GetOrientation() const inline ::Oyster::Math::Float4x4 CustomBodyState::GetOrientation() const
{ {
return ::Oyster::Math3D::OrientationMatrix( this->angularAxis.xyz, this->centerPos.xyz ); return ::Oyster::Math3D::OrientationMatrix( this->angularAxis, this->centerPos );
} }
inline ::Oyster::Math::Float4x4 CustomBodyState::GetOrientation( const ::Oyster::Math::Float4 &offset ) const inline ::Oyster::Math::Float4x4 CustomBodyState::GetOrientation( const ::Oyster::Math::Float3 &offset ) const
{ {
return ::Oyster::Math3D::OrientationMatrix( this->angularAxis.xyz, (this->centerPos + offset).xyz ); return ::Oyster::Math3D::OrientationMatrix( this->angularAxis, (this->centerPos + offset) );
} }
inline ::Oyster::Math::Float4x4 CustomBodyState::GetView() const inline ::Oyster::Math::Float4x4 CustomBodyState::GetView() const
{ {
return ::Oyster::Math3D::ViewMatrix( this->angularAxis.xyz, this->centerPos.xyz ); return ::Oyster::Math3D::ViewMatrix( this->angularAxis, this->centerPos );
} }
inline ::Oyster::Math::Float4x4 CustomBodyState::GetView( const ::Oyster::Math::Float4 &offset ) const inline ::Oyster::Math::Float4x4 CustomBodyState::GetView( const ::Oyster::Math::Float3 &offset ) const
{ {
return ::Oyster::Math3D::ViewMatrix( this->angularAxis.xyz, (this->centerPos + offset).xyz ); return ::Oyster::Math3D::ViewMatrix( this->angularAxis, (this->centerPos + offset) );
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetLinearMomentum() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetLinearMomentum() const
{ {
return this->linearMomentum; return this->linearMomentum;
} }
inline ::Oyster::Math::Float4 CustomBodyState::GetLinearMomentum( const ::Oyster::Math::Float4 &at ) const inline ::Oyster::Math::Float3 CustomBodyState::GetLinearMomentum( const ::Oyster::Math::Float3 &at ) const
{ {
return this->linearMomentum + ::Oyster::Physics3D::Formula::TangentialLinearMomentum( this->angularMomentum, at - this->centerPos ); return this->linearMomentum + ::Oyster::Physics3D::Formula::TangentialLinearMomentum( this->angularMomentum, at - this->centerPos );
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetAngularMomentum() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetAngularMomentum() const
{ {
return this->angularMomentum; return this->angularMomentum;
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetLinearImpulse() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetLinearImpulse() const
{ {
return this->linearImpulse; return this->linearImpulse;
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetAngularImpulse() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetAngularImpulse() const
{ {
return this->angularImpulse; return this->angularImpulse;
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetForward_DeltaPos() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetForward_DeltaPos() const
{ {
return this->deltaPos; return this->deltaPos;
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetForward_DeltaAxis() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetForward_DeltaAxis() const
{ {
return this->deltaAxis; return this->deltaAxis;
} }
inline const ::Oyster::Math::Float4 & CustomBodyState::GetGravityNormal() const inline const ::Oyster::Math::Float3 & CustomBodyState::GetGravityNormal() const
{ {
return this->gravityNormal; return this->gravityNormal;
} }
@ -227,39 +227,39 @@ namespace Oyster
inline void CustomBodyState::SetMomentOfInertia_KeepVelocity( const ::Oyster::Physics3D::MomentOfInertia &tensor ) inline void CustomBodyState::SetMomentOfInertia_KeepVelocity( const ::Oyster::Physics3D::MomentOfInertia &tensor )
{ {
::Oyster::Math::Quaternion rotation = ::Oyster::Math3D::Rotation(this->angularAxis); ::Oyster::Math::Quaternion rotation = ::Oyster::Math3D::Rotation(this->angularAxis);
::Oyster::Math::Float4 w = this->inertiaTensor.CalculateAngularVelocity( rotation, this->angularMomentum ); ::Oyster::Math::Float3 w = this->inertiaTensor.CalculateAngularVelocity( rotation, this->angularMomentum );
this->inertiaTensor = tensor; this->inertiaTensor = tensor;
this->angularMomentum = this->inertiaTensor.CalculateAngularMomentum( rotation, w ); this->angularMomentum = this->inertiaTensor.CalculateAngularMomentum( rotation, w );
} }
inline void CustomBodyState::SetSize( const ::Oyster::Math::Float4 &size ) inline void CustomBodyState::SetSize( const ::Oyster::Math::Float3 &size )
{ {
this->SetReach( 0.5f * size ); this->SetReach( 0.5f * size );
} }
inline void CustomBodyState::SetReach( const ::Oyster::Math::Float4 &halfSize ) inline void CustomBodyState::SetReach( const ::Oyster::Math::Float3 &halfSize )
{ {
this->reach.xyz = halfSize; this->reach = halfSize;
this->reach = ::Utility::Value::Max( this->reach, ::Oyster::Math::Float4::null ); this->reach = ::Utility::Value::Max( this->reach, ::Oyster::Math::Float3::null );
this->isSpatiallyAltered = this->isDisturbed = true; this->isSpatiallyAltered = this->isDisturbed = true;
} }
inline void CustomBodyState::SetCenterPosition( const ::Oyster::Math::Float4 &centerPos ) inline void CustomBodyState::SetCenterPosition( const ::Oyster::Math::Float3 &centerPos )
{ {
this->centerPos.xyz = centerPos; this->centerPos = centerPos;
this->isSpatiallyAltered = this->isDisturbed = true; this->isSpatiallyAltered = this->isDisturbed = true;
} }
inline void CustomBodyState::SetRotation( const ::Oyster::Math::Float4 &angularAxis ) inline void CustomBodyState::SetRotation( const ::Oyster::Math::Float3 &angularAxis )
{ {
this->angularAxis.xyz = angularAxis; this->angularAxis = angularAxis;
this->isSpatiallyAltered = this->isDisturbed = true; this->isSpatiallyAltered = this->isDisturbed = true;
} }
inline void CustomBodyState::SetOrientation( const ::Oyster::Math::Float3 &angularAxis, const ::Oyster::Math::Float3 &translation ) inline void CustomBodyState::SetOrientation( const ::Oyster::Math::Float3 &angularAxis, const ::Oyster::Math::Float3 &translation )
{ {
this->angularAxis.xyz = angularAxis ; this->angularAxis = angularAxis ;
this->centerPos.xyz = translation; this->centerPos = translation;
this->isSpatiallyAltered = this->isDisturbed = true; this->isSpatiallyAltered = this->isDisturbed = true;
} }
@ -276,70 +276,70 @@ namespace Oyster
inline void CustomBodyState::SetLinearMomentum( const ::Oyster::Math::Float4 &g ) inline void CustomBodyState::SetLinearMomentum( const ::Oyster::Math::Float3 &g )
{ {
this->linearMomentum.xyz = g; this->linearMomentum = g;
this->isDisturbed = true; this->isDisturbed = true;
} }
inline void CustomBodyState::SetAngularMomentum( const ::Oyster::Math::Float4 &h ) inline void CustomBodyState::SetAngularMomentum( const ::Oyster::Math::Float3 &h )
{ {
this->angularMomentum.xyz = h; this->angularMomentum = h;
this->isDisturbed = true; this->isDisturbed = true;
} }
inline void CustomBodyState::SetLinearImpulse( const ::Oyster::Math::Float4 &j ) inline void CustomBodyState::SetLinearImpulse( const ::Oyster::Math::Float3 &j )
{ {
this->linearImpulse.xyz = j; this->linearImpulse = j;
this->isDisturbed = true; this->isDisturbed = true;
} }
inline void CustomBodyState::SetAngularImpulse( const ::Oyster::Math::Float4 &j ) inline void CustomBodyState::SetAngularImpulse( const ::Oyster::Math::Float3 &j )
{ {
this->angularImpulse.xyz = j; this->angularImpulse = j;
this->isDisturbed = true; this->isDisturbed = true;
} }
inline void CustomBodyState::SetGravityNormal( const ::Oyster::Math::Float4 &gravityNormal ) inline void CustomBodyState::SetGravityNormal( const ::Oyster::Math::Float3 &gravityNormal )
{ {
this->gravityNormal = gravityNormal; this->gravityNormal = gravityNormal;
} }
inline void CustomBodyState::AddRotation( const ::Oyster::Math::Float4 &angularAxis ) inline void CustomBodyState::AddRotation( const ::Oyster::Math::Float3 &angularAxis )
{ {
this->angularAxis += angularAxis; this->angularAxis += angularAxis;
this->isSpatiallyAltered = this->isDisturbed = true; this->isSpatiallyAltered = this->isDisturbed = true;
} }
inline void CustomBodyState::AddTranslation( const ::Oyster::Math::Float4 &deltaPos ) inline void CustomBodyState::AddTranslation( const ::Oyster::Math::Float3 &deltaPos )
{ {
this->centerPos += deltaPos; this->centerPos += deltaPos;
this->isSpatiallyAltered = this->isDisturbed = true; this->isSpatiallyAltered = this->isDisturbed = true;
} }
inline void CustomBodyState::ApplyLinearImpulse( const ::Oyster::Math::Float4 &j ) inline void CustomBodyState::ApplyLinearImpulse( const ::Oyster::Math::Float3 &j )
{ {
this->linearImpulse += j; this->linearImpulse += j;
this->isDisturbed = true; this->isDisturbed = true;
} }
inline void CustomBodyState::ApplyAngularImpulse( const ::Oyster::Math::Float4 &j ) inline void CustomBodyState::ApplyAngularImpulse( const ::Oyster::Math::Float3 &j )
{ {
this->angularImpulse += j; this->angularImpulse += j;
this->isDisturbed = true; this->isDisturbed = true;
} }
inline void CustomBodyState::ApplyImpulse( const ::Oyster::Math::Float4 &j, const ::Oyster::Math::Float4 &at, const ::Oyster::Math::Float4 &normal ) inline void CustomBodyState::ApplyImpulse( const ::Oyster::Math::Float3 &j, const ::Oyster::Math::Float3 &at, const ::Oyster::Math::Float3 &normal )
{ {
::Oyster::Math::Float4 offset = at - this->centerPos; ::Oyster::Math::Float3 offset = at - this->centerPos;
::Oyster::Math::Float4 deltaAngularImpulse = ::Oyster::Physics3D::Formula::AngularMomentum( j, offset ); ::Oyster::Math::Float3 deltaAngularImpulse = ::Oyster::Physics3D::Formula::AngularMomentum( j, offset );
this->linearImpulse += j - ::Oyster::Physics3D::Formula::TangentialLinearMomentum( deltaAngularImpulse, offset ); this->linearImpulse += j - ::Oyster::Physics3D::Formula::TangentialLinearMomentum( deltaAngularImpulse, offset );
this->angularImpulse += deltaAngularImpulse; this->angularImpulse += deltaAngularImpulse;
this->isDisturbed = true; this->isDisturbed = true;
} }
inline void CustomBodyState::ApplyForwarding( const ::Oyster::Math::Float4 &deltaPos, const ::Oyster::Math::Float4 &deltaAxis ) inline void CustomBodyState::ApplyForwarding( const ::Oyster::Math::Float3 &deltaPos, const ::Oyster::Math::Float3 &deltaAxis )
{ {
this->deltaPos += deltaPos; this->deltaPos += deltaPos;
this->deltaAxis += deltaAxis; this->deltaAxis += deltaAxis;

View File

@ -12,8 +12,8 @@ namespace Oyster { namespace Physics
struct SimpleBodyDescription struct SimpleBodyDescription
{ {
::Oyster::Math::Float4x4 rotation; ::Oyster::Math::Float4x4 rotation;
::Oyster::Math::Float4 centerPosition; ::Oyster::Math::Float3 centerPosition;
::Oyster::Math::Float4 size; ::Oyster::Math::Float3 size;
::Oyster::Math::Float mass; ::Oyster::Math::Float mass;
::Oyster::Math::Float restitutionCoeff; ::Oyster::Math::Float restitutionCoeff;
::Oyster::Math::Float frictionCoeff_Static; ::Oyster::Math::Float frictionCoeff_Static;
@ -30,7 +30,7 @@ namespace Oyster { namespace Physics
struct SphericalBodyDescription struct SphericalBodyDescription
{ {
::Oyster::Math::Float4x4 rotation; ::Oyster::Math::Float4x4 rotation;
::Oyster::Math::Float4 centerPosition; ::Oyster::Math::Float3 centerPosition;
::Oyster::Math::Float radius; ::Oyster::Math::Float radius;
::Oyster::Math::Float mass; ::Oyster::Math::Float mass;
::Oyster::Math::Float restitutionCoeff; ::Oyster::Math::Float restitutionCoeff;
@ -52,12 +52,12 @@ namespace Oyster { namespace Physics
::Oyster::Math::Float staticFrictionCoeff = 1.0f, ::Oyster::Math::Float staticFrictionCoeff = 1.0f,
::Oyster::Math::Float kineticFrictionCoeff = 1.0f, ::Oyster::Math::Float kineticFrictionCoeff = 1.0f,
const ::Oyster::Physics3D::MomentOfInertia &inertiaTensor = ::Oyster::Physics3D::MomentOfInertia(), const ::Oyster::Physics3D::MomentOfInertia &inertiaTensor = ::Oyster::Physics3D::MomentOfInertia(),
const ::Oyster::Math::Float4 &reach = ::Oyster::Math::Float4::null, const ::Oyster::Math::Float3 &reach = ::Oyster::Math::Float3::null,
const ::Oyster::Math::Float4 &centerPos = ::Oyster::Math::Float4::standard_unit_w, const ::Oyster::Math::Float3 &centerPos = ::Oyster::Math::Float3::null,
const ::Oyster::Math::Float4 &rotation = ::Oyster::Math::Float4::null, const ::Oyster::Math::Float3 &rotation = ::Oyster::Math::Float3::null,
const ::Oyster::Math::Float4 &linearMomentum = ::Oyster::Math::Float4::null, const ::Oyster::Math::Float3 &linearMomentum = ::Oyster::Math::Float3::null,
const ::Oyster::Math::Float4 &angularMomentum = ::Oyster::Math::Float4::null, const ::Oyster::Math::Float3 &angularMomentum = ::Oyster::Math::Float3::null,
const ::Oyster::Math::Float4 &gravityNormal = ::Oyster::Math::Float4::null); const ::Oyster::Math::Float3 &gravityNormal = ::Oyster::Math::Float3::null);
CustomBodyState & operator = ( const CustomBodyState &state ); CustomBodyState & operator = ( const CustomBodyState &state );
@ -66,23 +66,23 @@ namespace Oyster { namespace Physics
const ::Oyster::Math::Float GetFrictionCoeff_Static() const; const ::Oyster::Math::Float GetFrictionCoeff_Static() const;
const ::Oyster::Math::Float GetFrictionCoeff_Kinetic() const; const ::Oyster::Math::Float GetFrictionCoeff_Kinetic() const;
const ::Oyster::Physics3D::MomentOfInertia & GetMomentOfInertia() const; const ::Oyster::Physics3D::MomentOfInertia & GetMomentOfInertia() const;
const ::Oyster::Math::Float4 & GetReach() const; const ::Oyster::Math::Float3 & GetReach() const;
::Oyster::Math::Float4 GetSize() const; ::Oyster::Math::Float3 GetSize() const;
const ::Oyster::Math::Float4 & GetCenterPosition() const; const ::Oyster::Math::Float3 & GetCenterPosition() const;
const ::Oyster::Math::Float4 & GetAngularAxis() const; const ::Oyster::Math::Float3 & GetAngularAxis() const;
::Oyster::Math::Float4x4 GetRotation() const; ::Oyster::Math::Float4x4 GetRotation() const;
::Oyster::Math::Float4x4 GetOrientation() const; ::Oyster::Math::Float4x4 GetOrientation() const;
::Oyster::Math::Float4x4 GetOrientation( const ::Oyster::Math::Float4 &offset ) const; ::Oyster::Math::Float4x4 GetOrientation( const ::Oyster::Math::Float3 &offset ) const;
::Oyster::Math::Float4x4 GetView() const; ::Oyster::Math::Float4x4 GetView() const;
::Oyster::Math::Float4x4 GetView( const ::Oyster::Math::Float4 &offset ) const; ::Oyster::Math::Float4x4 GetView( const ::Oyster::Math::Float3 &offset ) const;
const ::Oyster::Math::Float4 & GetLinearMomentum() const; const ::Oyster::Math::Float3 & GetLinearMomentum() const;
::Oyster::Math::Float4 GetLinearMomentum( const ::Oyster::Math::Float4 &at ) const; ::Oyster::Math::Float3 GetLinearMomentum( const ::Oyster::Math::Float3 &at ) const;
const ::Oyster::Math::Float4 & GetAngularMomentum() const; const ::Oyster::Math::Float3 & GetAngularMomentum() const;
const ::Oyster::Math::Float4 & GetLinearImpulse() const; const ::Oyster::Math::Float3 & GetLinearImpulse() const;
const ::Oyster::Math::Float4 & GetAngularImpulse() const; const ::Oyster::Math::Float3 & GetAngularImpulse() const;
const ::Oyster::Math::Float4 & GetForward_DeltaPos() const; const ::Oyster::Math::Float3 & GetForward_DeltaPos() const;
const ::Oyster::Math::Float4 & GetForward_DeltaAxis() const; const ::Oyster::Math::Float3 & GetForward_DeltaAxis() const;
const ::Oyster::Math::Float4 & GetGravityNormal() const; const ::Oyster::Math::Float3 & GetGravityNormal() const;
void SetMass_KeepMomentum( ::Oyster::Math::Float m ); void SetMass_KeepMomentum( ::Oyster::Math::Float m );
void SetMass_KeepVelocity( ::Oyster::Math::Float m ); void SetMass_KeepVelocity( ::Oyster::Math::Float m );
@ -90,26 +90,26 @@ namespace Oyster { namespace Physics
void SetFrictionCoeff( ::Oyster::Math::Float staticU, ::Oyster::Math::Float kineticU ); void SetFrictionCoeff( ::Oyster::Math::Float staticU, ::Oyster::Math::Float kineticU );
void SetMomentOfInertia_KeepMomentum( const ::Oyster::Physics3D::MomentOfInertia &tensor ); void SetMomentOfInertia_KeepMomentum( const ::Oyster::Physics3D::MomentOfInertia &tensor );
void SetMomentOfInertia_KeepVelocity( const ::Oyster::Physics3D::MomentOfInertia &tensor ); void SetMomentOfInertia_KeepVelocity( const ::Oyster::Physics3D::MomentOfInertia &tensor );
void SetSize( const ::Oyster::Math::Float4 &size ); void SetSize( const ::Oyster::Math::Float3 &size );
void SetReach( const ::Oyster::Math::Float4 &halfSize ); void SetReach( const ::Oyster::Math::Float3 &halfSize );
void SetCenterPosition( const ::Oyster::Math::Float4 &centerPos ); void SetCenterPosition( const ::Oyster::Math::Float3 &centerPos );
void SetRotation( const ::Oyster::Math::Float4 &angularAxis ); void SetRotation( const ::Oyster::Math::Float3 &angularAxis );
//void SetRotation( const ::Oyster::Math::Float4x4 &rotation ); //void SetRotation( const ::Oyster::Math::Float4x4 &rotation );
//void SetOrientation( const ::Oyster::Math::Float4x4 &orientation ); //void SetOrientation( const ::Oyster::Math::Float4x4 &orientation );
void SetOrientation( const ::Oyster::Math::Float3 &angularAxis, const ::Oyster::Math::Float3 &translation ); void SetOrientation( const ::Oyster::Math::Float3 &angularAxis, const ::Oyster::Math::Float3 &translation );
void SetLinearMomentum( const ::Oyster::Math::Float4 &g ); void SetLinearMomentum( const ::Oyster::Math::Float3 &g );
void SetAngularMomentum( const ::Oyster::Math::Float4 &h ); void SetAngularMomentum( const ::Oyster::Math::Float3 &h );
void SetLinearImpulse( const ::Oyster::Math::Float4 &j ); void SetLinearImpulse( const ::Oyster::Math::Float3 &j );
void SetAngularImpulse( const ::Oyster::Math::Float4 &j ); void SetAngularImpulse( const ::Oyster::Math::Float3 &j );
void SetGravityNormal( const ::Oyster::Math::Float4 &gravityNormal ); void SetGravityNormal( const ::Oyster::Math::Float3 &gravityNormal );
void AddRotation( const ::Oyster::Math::Float4 &angularAxis ); void AddRotation( const ::Oyster::Math::Float3 &angularAxis );
void AddTranslation( const ::Oyster::Math::Float4 &deltaPos ); void AddTranslation( const ::Oyster::Math::Float3 &deltaPos );
void ApplyLinearImpulse( const ::Oyster::Math::Float4 &j ); void ApplyLinearImpulse( const ::Oyster::Math::Float3 &j );
void ApplyAngularImpulse( const ::Oyster::Math::Float4 &j ); void ApplyAngularImpulse( const ::Oyster::Math::Float3 &j );
void ApplyImpulse( const ::Oyster::Math::Float4 &j, const ::Oyster::Math::Float4 &at, const ::Oyster::Math::Float4 &normal ); void ApplyImpulse( const ::Oyster::Math::Float3 &j, const ::Oyster::Math::Float3 &at, const ::Oyster::Math::Float3 &normal );
void ApplyForwarding( const ::Oyster::Math::Float4 &deltaPos, const ::Oyster::Math::Float4 &deltaAxis ); void ApplyForwarding( const ::Oyster::Math::Float3 &deltaPos, const ::Oyster::Math::Float3 &deltaAxis );
bool IsSpatiallyAltered() const; bool IsSpatiallyAltered() const;
bool IsDisturbed() const; bool IsDisturbed() const;
@ -118,11 +118,11 @@ namespace Oyster { namespace Physics
private: private:
::Oyster::Math::Float mass, restitutionCoeff, staticFrictionCoeff, kineticFrictionCoeff; ::Oyster::Math::Float mass, restitutionCoeff, staticFrictionCoeff, kineticFrictionCoeff;
::Oyster::Physics3D::MomentOfInertia inertiaTensor; ::Oyster::Physics3D::MomentOfInertia inertiaTensor;
::Oyster::Math::Float4 reach, centerPos, angularAxis; ::Oyster::Math::Float3 reach, centerPos, angularAxis;
::Oyster::Math::Float4 linearMomentum, angularMomentum; ::Oyster::Math::Float3 linearMomentum, angularMomentum;
::Oyster::Math::Float4 linearImpulse, angularImpulse; ::Oyster::Math::Float3 linearImpulse, angularImpulse;
::Oyster::Math::Float4 deltaPos, deltaAxis; // Forwarding data sum ::Oyster::Math::Float3 deltaPos, deltaAxis; // Forwarding data sum
::Oyster::Math::Float4 gravityNormal; ::Oyster::Math::Float3 gravityNormal;
bool isSpatiallyAltered, isDisturbed, isForwarded; bool isSpatiallyAltered, isDisturbed, isForwarded;
}; };