You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.7 KiB
81 lines
1.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef SIMPLE_PHYSICS_H |
|
#define SIMPLE_PHYSICS_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
|
|
#include "mathlib/vector.h" |
|
|
|
|
|
// CSimplePhysics is a framework for simplified physics simulation. |
|
// It simulates at a fixed timestep and uses the Verlet integrator. |
|
// |
|
// To use it, create your nodes and implement your constraints and |
|
// forces in an IHelper, then call Simulate each frame. |
|
// CSimplePhysics will figure out how many timesteps to run and will |
|
// provide predicted positions of things for you. |
|
class CSimplePhysics |
|
{ |
|
public: |
|
|
|
class CNode |
|
{ |
|
public: |
|
|
|
// Call this when initializing the nodes with their starting positions. |
|
void Init( const Vector &vPos ) |
|
{ |
|
m_vPos = m_vPrevPos = m_vPredicted = vPos; |
|
} |
|
|
|
Vector m_vPos; // At time t |
|
Vector m_vPrevPos; // At time t - m_flTimeStep |
|
Vector m_vPredicted; // Predicted position |
|
}; |
|
|
|
class IHelper |
|
{ |
|
public: |
|
virtual void GetNodeForces( CNode *pNodes, int iNode, Vector *pAccel ) = 0; |
|
virtual void ApplyConstraints( CNode *pNodes, int nNodes ) = 0; |
|
}; |
|
|
|
|
|
public: |
|
|
|
CSimplePhysics(); |
|
|
|
void Init( float flTimeStep ); |
|
|
|
void Simulate( |
|
CNode *pNodes, |
|
int nNodes, |
|
IHelper *pHelper, |
|
float dt, |
|
float flDamp ); |
|
|
|
|
|
private: |
|
|
|
double GetCurTime() { return m_flTimeStep * m_iCurTimeStep; } |
|
|
|
|
|
private: |
|
|
|
double m_flPredictedTime; // (GetCurTime()-m_flTimeStep) <= m_flPredictedTime <= GetCurTime() |
|
int m_iCurTimeStep; |
|
|
|
float m_flTimeStep; |
|
float m_flTimeStepMul; // dt*dt*0.5 |
|
}; |
|
|
|
|
|
#endif // SIMPLE_PHYSICS_H
|
|
|