void HavokCharacter::Update( const float fTimestep )
{
hkpWorld* pWorld = HavokManager::Instance()->GetWorld();
if( pWorld == NULL )
return;
if( m_pHavokRigidBody == NULL )
return;
const bool bJump = m_bCameraControl && ( !m_bOldJump && GetKey( VK_SPACE ) );
const bool bCrouch = m_bCameraControl && GetKey( 'C' );
m_bOldJump = m_bCameraControl && GetKey( VK_SPACE );
pWorld->lock();
pWorld->markForWrite();
hkVector4 p = m_pHavokRigidBody->getPosition();
// TODO - the input code belongs in a player class or something
hkpCharacterInput xInput;
hkpCharacterOutput output;
float fDX = 0.0f;
float fDZ = 0.0f;
float fStepWidth = CHARACTER_SCALE_RATIO * 0.5f;
if( m_bCameraControl )
{
if( GetKey( VK_UP ) )
{
fDZ -= fStepWidth;
}
if( GetKey( VK_DOWN ) )
{
fDZ += fStepWidth;
}
if( GetKey( VK_LEFT ) )
{
fDX -= fStepWidth;
}
if( GetKey( VK_RIGHT ) )
{
fDX += fStepWidth;
}
}
else
{
fDX = m_xMovement.x;
fDZ = m_xMovement.y;
}
xInput.m_inputLR = fDX;
xInput.m_inputUD = fDZ;
xInput.m_wantJump = bJump;
xInput.m_atLadder = false;
xInput.m_up = m_up;
xInput.m_forward = m_forward;
xInput.m_forward.normalize3();
hkQuaternion orient;
orient.setAxisAngle( m_up, 0 );
xInput.m_forward.setRotatedDir( orient, xInput.m_forward );
hkStepInfo stepInfo;
stepInfo.m_deltaTime = fTimestep;
stepInfo.m_invDeltaTime = 1.0f / fTimestep;
//stepInfo.m_endTime = HavokManager::Instance()->GetStopwatch()->getElapsedSeconds();
xInput.m_stepInfo = stepInfo;
hkVector4 characterGravity = m_up;
float gravity = -16 * CHARACTER_SCALE_RATIO;
characterGravity.mul4( hkVector4( gravity, gravity, gravity ) );
xInput.m_characterGravity = characterGravity;
hkpRigidBody* const pRigidBody = m_pHavokRigidBody->getRigidBody();
xInput.m_velocity = pRigidBody->getLinearVelocity();
xInput.m_position = pRigidBody->getPosition();
m_pHavokRigidBody->checkSupport( stepInfo, xInput.m_surfaceInfo );
const hkpCollidable* const pCollidable = pRigidBody->getCollidable();
if( pRigidBody == NULL )
{
assert( 0 && "A character's Havok collidable pointer has been nulled. We are going to assume they aren't crouching." );
}
const bool bIsCrouched = pCollidable ? ( pRigidBody->getCollidable()->getShape() == m_pCrouchShape ) : false;
if ( bIsCrouched && !bCrouch )
pRigidBody->setShape( m_pStandShape );
if ( !bIsCrouched && bCrouch )
pRigidBody->setShape( m_pCrouchShape );
// Calculate and set current acceleration for mass factor modifier
{
// calculate and set acceleration for mass factor modifier
hkVector4 currentVel;
currentVel = pRigidBody->getLinearVelocity();
hkVector4 currentAcc;
currentAcc.setSub4(output.m_velocity, currentVel);
currentAcc.mul4( 1/fTimestep );
m_pHavokRigidBody->setLinearAccelerationToMassModifier(currentAcc);
}
// Apply the character state machine
m_characterContext->update( xInput, output );
m_pHavokRigidBody->setLinearVelocity( output.m_velocity, fTimestep );
pWorld->unmarkForWrite();
pWorld->unlock();
}