-
Notifications
You must be signed in to change notification settings - Fork 82
/
Copy pathphysics_environment.h
176 lines (149 loc) · 8.99 KB
/
physics_environment.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
//========= 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