From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/public/simple_physics.cpp | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 mp/src/public/simple_physics.cpp (limited to 'mp/src/public/simple_physics.cpp') diff --git a/mp/src/public/simple_physics.cpp b/mp/src/public/simple_physics.cpp new file mode 100644 index 00000000..d08c041d --- /dev/null +++ b/mp/src/public/simple_physics.cpp @@ -0,0 +1,72 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#include "simple_physics.h" +#include "tier0/dbg.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +CSimplePhysics::CSimplePhysics() +{ + Init( 1.0f / 30.0f ); // default is 30 steps per second +} + + +void CSimplePhysics::Init( float flTimeStep ) +{ + m_flPredictedTime = 0; + m_iCurTimeStep = 0; + m_flTimeStep = flTimeStep; + m_flTimeStepMul = m_flTimeStep*m_flTimeStep*0.5f; +} + + +void CSimplePhysics::Simulate( + CSimplePhysics::CNode *pNodes, + int nNodes, + CSimplePhysics::IHelper *pHelper, + float dt, + float flDamp ) +{ + // Figure out how many time steps to run. + m_flPredictedTime += dt; + int newTimeStep = (int)ceil( m_flPredictedTime / m_flTimeStep ); + int nTimeSteps = newTimeStep - m_iCurTimeStep; + for( int iTimeStep=0; iTimeStep < nTimeSteps; iTimeStep++ ) + { + // Simulate everything.. + for( int iNode=0; iNode < nNodes; iNode++ ) + { + CSimplePhysics::CNode *pNode = &pNodes[iNode]; + + // Apply forces. + Vector vAccel; + pHelper->GetNodeForces( pNodes, iNode, &vAccel ); + Assert( vAccel.IsValid() ); + + Vector vPrevPos = pNode->m_vPos; + pNode->m_vPos = pNode->m_vPos + (pNode->m_vPos - pNode->m_vPrevPos) * flDamp + vAccel * m_flTimeStepMul; + pNode->m_vPrevPos = vPrevPos; + } + + // Apply constraints. + pHelper->ApplyConstraints( pNodes, nNodes ); + } + m_iCurTimeStep = newTimeStep; + + // Setup predicted positions. + float flInterpolant = (m_flPredictedTime - (GetCurTime() - m_flTimeStep)) / m_flTimeStep; + for( int iNode=0; iNode < nNodes; iNode++ ) + { + CSimplePhysics::CNode *pNode = &pNodes[iNode]; + VectorLerp( pNode->m_vPrevPos, pNode->m_vPos, flInterpolant, pNode->m_vPredicted ); + } +} + + -- cgit v1.2.3