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.
176 lines
9.0 KiB
176 lines
9.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef PHYSICS_WORLD_H |
|
#define PHYSICS_WORLD_H |
|
#pragma once |
|
|
|
#include "vphysics_interface.h" |
|
#include "ivu_types.hxx" |
|
#include "utlvector.h" |
|
|
|
class IVP_Environment; |
|
class CSleepObjects; |
|
class CPhysicsListenerCollision; |
|
class CPhysicsListenerConstraint; |
|
class IVP_Listener_Collision; |
|
class IVP_Listener_Constraint; |
|
class IVP_Listener_Object; |
|
class IVP_Controller; |
|
class CPhysicsFluidController; |
|
class CCollisionSolver; |
|
class CPhysicsObject; |
|
class CDeleteQueue; |
|
class IVPhysicsDebugOverlay; |
|
struct constraint_limitedhingeparams_t; |
|
struct vphysics_save_iphysicsobject_t; |
|
|
|
class CPhysicsEnvironment : public IPhysicsEnvironment |
|
{ |
|
public: |
|
CPhysicsEnvironment( void ); |
|
~CPhysicsEnvironment( void ); |
|
|
|
virtual void SetDebugOverlay( CreateInterfaceFn debugOverlayFactory ); |
|
virtual IVPhysicsDebugOverlay *GetDebugOverlay( void ); |
|
|
|
void SetGravity( const Vector& gravityVector ); |
|
IPhysicsObject *CreatePolyObject( const CPhysCollide *pCollisionModel, int materialIndex, const Vector& position, const QAngle& angles, objectparams_t *pParams ); |
|
IPhysicsObject *CreatePolyObjectStatic( const CPhysCollide *pCollisionModel, int materialIndex, const Vector& position, const QAngle& angles, objectparams_t *pParams ); |
|
virtual unsigned int GetObjectSerializeSize( IPhysicsObject *pObject ) const; |
|
virtual void SerializeObjectToBuffer( IPhysicsObject *pObject, unsigned char *pBuffer, unsigned int bufferSize ); |
|
virtual IPhysicsObject *UnserializeObjectFromBuffer( void *pGameData, unsigned char *pBuffer, unsigned int bufferSize, bool enableCollisions ); |
|
|
|
|
|
|
|
IPhysicsSpring *CreateSpring( IPhysicsObject *pObjectStart, IPhysicsObject *pObjectEnd, springparams_t *pParams ); |
|
IPhysicsFluidController *CreateFluidController( IPhysicsObject *pFluidObject, fluidparams_t *pParams ); |
|
IPhysicsConstraint *CreateRagdollConstraint( IPhysicsObject *pReferenceObject, IPhysicsObject *pAttachedObject, IPhysicsConstraintGroup *pGroup, const constraint_ragdollparams_t &ragdoll ); |
|
|
|
virtual IPhysicsConstraint *CreateHingeConstraint( IPhysicsObject *pReferenceObject, IPhysicsObject *pAttachedObject, IPhysicsConstraintGroup *pGroup, const constraint_hingeparams_t &hinge ); |
|
virtual IPhysicsConstraint *CreateLimitedHingeConstraint( IPhysicsObject *pReferenceObject, IPhysicsObject *pAttachedObject, IPhysicsConstraintGroup *pGroup, const constraint_limitedhingeparams_t &hinge ); |
|
virtual IPhysicsConstraint *CreateFixedConstraint( IPhysicsObject *pReferenceObject, IPhysicsObject *pAttachedObject, IPhysicsConstraintGroup *pGroup, const constraint_fixedparams_t &fixed ); |
|
virtual IPhysicsConstraint *CreateSlidingConstraint( IPhysicsObject *pReferenceObject, IPhysicsObject *pAttachedObject, IPhysicsConstraintGroup *pGroup, const constraint_slidingparams_t &sliding ); |
|
virtual IPhysicsConstraint *CreateBallsocketConstraint( IPhysicsObject *pReferenceObject, IPhysicsObject *pAttachedObject, IPhysicsConstraintGroup *pGroup, const constraint_ballsocketparams_t &ballsocket ); |
|
virtual IPhysicsConstraint *CreatePulleyConstraint( IPhysicsObject *pReferenceObject, IPhysicsObject *pAttachedObject, IPhysicsConstraintGroup *pGroup, const constraint_pulleyparams_t &pulley ); |
|
virtual IPhysicsConstraint *CreateLengthConstraint( IPhysicsObject *pReferenceObject, IPhysicsObject *pAttachedObject, IPhysicsConstraintGroup *pGroup, const constraint_lengthparams_t &length ); |
|
|
|
virtual IPhysicsConstraintGroup *CreateConstraintGroup( const constraint_groupparams_t &group ); |
|
virtual void DestroyConstraintGroup( IPhysicsConstraintGroup *pGroup ); |
|
|
|
void Simulate( float deltaTime ); |
|
float GetSimulationTimestep() const; |
|
void SetSimulationTimestep( float timestep ); |
|
float GetSimulationTime() const; |
|
float GetNextFrameTime() const; |
|
bool IsInSimulation() const; |
|
|
|
virtual void DestroyObject( IPhysicsObject * ); |
|
virtual void DestroySpring( IPhysicsSpring * ); |
|
virtual void DestroyFluidController( IPhysicsFluidController * ); |
|
virtual void DestroyConstraint( IPhysicsConstraint * ); |
|
|
|
virtual void SetCollisionEventHandler( IPhysicsCollisionEvent *pCollisionEvents ); |
|
virtual void SetObjectEventHandler( IPhysicsObjectEvent *pObjectEvents ); |
|
virtual void SetConstraintEventHandler( IPhysicsConstraintEvent *pConstraintEvents ); |
|
|
|
virtual IPhysicsShadowController *CreateShadowController( IPhysicsObject *pObject, bool allowTranslation, bool allowRotation ); |
|
virtual void DestroyShadowController( IPhysicsShadowController * ); |
|
virtual IPhysicsMotionController *CreateMotionController( IMotionEvent *pHandler ); |
|
virtual void DestroyMotionController( IPhysicsMotionController *pController ); |
|
virtual IPhysicsPlayerController *CreatePlayerController( IPhysicsObject *pObject ); |
|
virtual void DestroyPlayerController( IPhysicsPlayerController *pController ); |
|
virtual IPhysicsVehicleController *CreateVehicleController( IPhysicsObject *pVehicleBodyObject, const vehicleparams_t ¶ms, unsigned int nVehicleType, IPhysicsGameTrace *pGameTrace ); |
|
virtual void DestroyVehicleController( IPhysicsVehicleController *pController ); |
|
|
|
virtual void SetQuickDelete( bool bQuick ) |
|
{ |
|
m_deleteQuick = bQuick; |
|
} |
|
virtual bool ShouldQuickDelete() const { return m_deleteQuick; } |
|
virtual void TraceBox( trace_t *ptr, const Vector &mins, const Vector &maxs, const Vector &start, const Vector &end ); |
|
virtual void SetCollisionSolver( IPhysicsCollisionSolver *pCollisionSolver ); |
|
virtual void GetGravity( Vector *pGravityVector ) const; |
|
virtual int GetActiveObjectCount() const; |
|
virtual void GetActiveObjects( IPhysicsObject **pOutputObjectList ) const; |
|
virtual const IPhysicsObject **GetObjectList( int *pOutputObjectCount ) const; |
|
virtual bool TransferObject( IPhysicsObject *pObject, IPhysicsEnvironment *pDestinationEnvironment ); |
|
|
|
IVP_Environment *GetIVPEnvironment( void ) { return m_pPhysEnv; } |
|
void ClearDeadObjects( void ); |
|
IVP_Controller *GetDragController() { return m_pDragController; } |
|
const IVP_Controller *GetDragController() const { return m_pDragController; } |
|
virtual void SetAirDensity( float density ); |
|
virtual float GetAirDensity( void ) const; |
|
virtual void ResetSimulationClock( void ); |
|
virtual IPhysicsObject *CreateSphereObject( float radius, int materialIndex, const Vector &position, const QAngle &angles, objectparams_t *pParams, bool isStatic ); |
|
virtual void CleanupDeleteList(); |
|
virtual void EnableDeleteQueue( bool enable ) { m_queueDeleteObject = enable; } |
|
// debug |
|
virtual bool IsCollisionModelUsed( CPhysCollide *pCollide ) const; |
|
|
|
// trace against the physics world |
|
virtual void TraceRay( const Ray_t &ray, unsigned int fMask, IPhysicsTraceFilter *pTraceFilter, trace_t *pTrace ); |
|
virtual void SweepCollideable( const CPhysCollide *pCollide, const Vector &vecAbsStart, const Vector &vecAbsEnd, |
|
const QAngle &vecAngles, unsigned int fMask, IPhysicsTraceFilter *pTraceFilter, trace_t *pTrace ); |
|
|
|
// performance tuning |
|
virtual void GetPerformanceSettings( physics_performanceparams_t *pOutput ) const; |
|
virtual void SetPerformanceSettings( const physics_performanceparams_t *pSettings ); |
|
|
|
// perf/cost statistics |
|
virtual void ReadStats( physics_stats_t *pOutput ); |
|
virtual void ClearStats(); |
|
virtual void EnableConstraintNotify( bool bEnable ); |
|
// debug |
|
virtual void DebugCheckContacts(void); |
|
|
|
// Save/restore |
|
bool Save( const physsaveparams_t ¶ms ); |
|
void PreRestore( const physprerestoreparams_t ¶ms ); |
|
bool Restore( const physrestoreparams_t ¶ms ); |
|
void PostRestore(); |
|
void PhantomAdd( CPhysicsObject *pObject ); |
|
void PhantomRemove( CPhysicsObject *pObject ); |
|
|
|
void AddPlayerController( IPhysicsPlayerController *pController ); |
|
void RemovePlayerController( IPhysicsPlayerController *pController ); |
|
IPhysicsPlayerController *FindPlayerController( IPhysicsObject *pObject ); |
|
|
|
IPhysicsCollisionEvent *GetCollisionEventHandler(); |
|
// a constraint is being disabled - report the game DLL as "broken" |
|
void NotifyConstraintDisabled( IPhysicsConstraint *pConstraint ); |
|
|
|
private: |
|
IVP_Environment *m_pPhysEnv; |
|
IVP_Controller *m_pDragController; |
|
IVPhysicsDebugOverlay *m_pDebugOverlay; // Interface to use for drawing debug overlays. |
|
CUtlVector<IPhysicsObject *> m_objects; |
|
CUtlVector<IPhysicsObject *> m_deadObjects; |
|
CUtlVector<CPhysicsFluidController *> m_fluids; |
|
CUtlVector<IPhysicsPlayerController *> m_playerControllers; |
|
CSleepObjects *m_pSleepEvents; |
|
CPhysicsListenerCollision *m_pCollisionListener; |
|
CCollisionSolver *m_pCollisionSolver; |
|
CPhysicsListenerConstraint *m_pConstraintListener; |
|
CDeleteQueue *m_pDeleteQueue; |
|
int m_lastObjectThisTick; |
|
bool m_deleteQuick; |
|
bool m_inSimulation; |
|
bool m_queueDeleteObject; |
|
bool m_fixedTimestep; |
|
bool m_enableConstraintNotify; |
|
}; |
|
|
|
extern IPhysicsEnvironment *CreatePhysicsEnvironment( void ); |
|
|
|
class IVP_Synapse_Friction; |
|
class IVP_Real_Object; |
|
extern IVP_Real_Object *GetOppositeSynapseObject( IVP_Synapse_Friction *pfriction ); |
|
extern IPhysicsObjectPairHash *CreateObjectPairHash(); |
|
|
|
#endif // PHYSICS_WORLD_H
|
|
|