2022-08-28 22:31:01 +01:00
|
|
|
|
|
|
|
#include "cbase.h"
|
|
|
|
|
|
|
|
#include "vjolt_controller_motion.h"
|
|
|
|
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
|
|
#include "tier0/memdbgon.h"
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
JoltPhysicsMotionController::JoltPhysicsMotionController( IMotionEvent *pHandler )
|
|
|
|
: m_pMotionEvent( pHandler )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
JoltPhysicsMotionController::~JoltPhysicsMotionController()
|
|
|
|
{
|
|
|
|
for ( JoltPhysicsObject *pObject : m_pObjects )
|
|
|
|
pObject->RemoveDestroyedListener( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::SetEventHandler( IMotionEvent *pHandler )
|
|
|
|
{
|
|
|
|
m_pMotionEvent = pHandler;
|
|
|
|
}
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::AttachObject( IPhysicsObject *pObject, bool bCheckIfAlreadyAttached )
|
|
|
|
{
|
|
|
|
if ( !pObject || pObject->IsStatic() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
JoltPhysicsObject *pPhysicsObject = static_cast< JoltPhysicsObject * >( pObject );
|
2022-09-02 10:56:21 +01:00
|
|
|
if ( bCheckIfAlreadyAttached && VectorContains( m_pObjects, pPhysicsObject ) )
|
2022-08-28 22:31:01 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
pPhysicsObject->AddDestroyedListener( this );
|
2022-09-02 10:56:21 +01:00
|
|
|
m_pObjects.push_back( pPhysicsObject );
|
2022-08-28 22:31:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::DetachObject( IPhysicsObject *pObject )
|
|
|
|
{
|
|
|
|
if ( !pObject )
|
|
|
|
return;
|
|
|
|
|
|
|
|
JoltPhysicsObject *pPhysicsObject = static_cast< JoltPhysicsObject * >( pObject );
|
2022-09-02 10:56:21 +01:00
|
|
|
Erase( m_pObjects, pPhysicsObject );
|
2022-08-28 22:31:01 +01:00
|
|
|
pPhysicsObject->RemoveDestroyedListener( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
int JoltPhysicsMotionController::CountObjects( void )
|
|
|
|
{
|
2022-09-02 10:56:21 +01:00
|
|
|
return int( m_pObjects.size() );
|
2022-08-28 22:31:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::GetObjects( IPhysicsObject **pObjectList )
|
|
|
|
{
|
2022-09-02 10:56:21 +01:00
|
|
|
for ( size_t i = 0; i < m_pObjects.size(); i++ )
|
2022-08-28 22:31:01 +01:00
|
|
|
pObjectList[ i ] = m_pObjects[ i ];
|
|
|
|
}
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::ClearObjects( void )
|
|
|
|
{
|
2022-09-02 10:56:21 +01:00
|
|
|
m_pObjects.clear();
|
2022-08-28 22:31:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::WakeObjects( void )
|
|
|
|
{
|
|
|
|
for ( JoltPhysicsObject *pObject : m_pObjects )
|
|
|
|
pObject->Wake();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::SetPriority( priority_t priority )
|
|
|
|
{
|
|
|
|
// Not relevant to us.
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::OnJoltPhysicsObjectDestroyed( JoltPhysicsObject *pObject )
|
|
|
|
{
|
|
|
|
JoltPhysicsObject *pPhysicsObject = static_cast< JoltPhysicsObject * >( pObject );
|
2022-09-02 10:56:21 +01:00
|
|
|
Erase( m_pObjects, pPhysicsObject );
|
2022-08-28 22:31:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void JoltPhysicsMotionController::OnPreSimulate( float flDeltaTime )
|
|
|
|
{
|
|
|
|
if ( !m_pMotionEvent )
|
|
|
|
return;
|
|
|
|
|
|
|
|
for ( JoltPhysicsObject *pObject : m_pObjects )
|
|
|
|
{
|
|
|
|
if ( !pObject->IsMoveable() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
Vector vecLocalVelocity = vec3_origin;
|
|
|
|
Vector vecAngularVelocity = vec3_origin;
|
|
|
|
IMotionEvent::simresult_e simResult = m_pMotionEvent->Simulate( this, pObject, flDeltaTime, vecLocalVelocity, vecAngularVelocity );
|
|
|
|
|
|
|
|
vecLocalVelocity *= flDeltaTime;
|
|
|
|
vecAngularVelocity *= flDeltaTime;
|
|
|
|
|
|
|
|
// Convert linear velocity to world space
|
|
|
|
Vector vecWorldLinearVelocity = vec3_origin;
|
|
|
|
pObject->LocalToWorldVector( &vecWorldLinearVelocity, vecLocalVelocity );
|
|
|
|
|
|
|
|
switch ( simResult )
|
|
|
|
{
|
|
|
|
case IMotionEvent::SIM_NOTHING:
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case IMotionEvent::SIM_LOCAL_ACCELERATION:
|
|
|
|
{
|
|
|
|
pObject->AddVelocity( &vecWorldLinearVelocity, &vecAngularVelocity );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case IMotionEvent::SIM_LOCAL_FORCE:
|
|
|
|
{
|
|
|
|
pObject->ApplyForceCenter( vecWorldLinearVelocity );
|
|
|
|
pObject->ApplyTorqueCenter( vecAngularVelocity );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case IMotionEvent::SIM_GLOBAL_ACCELERATION:
|
|
|
|
{
|
|
|
|
pObject->AddVelocity( &vecLocalVelocity, &vecAngularVelocity );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case IMotionEvent::SIM_GLOBAL_FORCE:
|
|
|
|
{
|
|
|
|
pObject->ApplyForceCenter( vecLocalVelocity );
|
|
|
|
pObject->ApplyTorqueCenter( vecAngularVelocity );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
Log_Warning( LOG_VJolt, "Invalid motion event\n" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|