diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/physics.h | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/physics.h')
| -rw-r--r-- | mp/src/game/server/physics.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/mp/src/game/server/physics.h b/mp/src/game/server/physics.h new file mode 100644 index 00000000..7e85d477 --- /dev/null +++ b/mp/src/game/server/physics.h @@ -0,0 +1,189 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: This is the abstraction layer for the physics simulation system
+// Any calls to the external physics library (ipion) should be made through this
+// layer. Eventually, the physics system will probably become a DLL and made
+// accessible to the client & server side code.
+//
+// $Workfile: $
+// $Date: $
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef PHYSICS_H
+#define PHYSICS_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "physics_shared.h"
+
+class CBaseEntity;
+class IPhysicsMaterial;
+class IPhysicsConstraint;
+class IPhysicsSpring;
+class IPhysicsSurfaceProps;
+class CTakeDamageInfo;
+class ConVar;
+
+extern IPhysicsMaterial *g_Material;
+extern ConVar phys_pushscale;
+extern ConVar phys_timescale;
+
+struct objectparams_t;
+extern IPhysicsGameTrace *physgametrace;
+
+class IPhysicsCollisionSolver;
+class IPhysicsCollisionEvent;
+class IPhysicsObjectEvent;
+extern IPhysicsCollisionSolver * const g_pCollisionSolver;
+extern IPhysicsCollisionEvent * const g_pCollisionEventHandler;
+extern IPhysicsObjectEvent * const g_pObjectEventHandler;
+
+// HACKHACK: We treat anything >= 500kg as a special "large mass" that does more impact damage
+// and has special recovery on crushing/killing other objects
+// also causes screen shakes on impact with static/world objects
+const float VPHYSICS_LARGE_OBJECT_MASS = 500.0f;
+
+struct gamevcollisionevent_t : public vcollisionevent_t
+{
+ Vector preVelocity[2];
+ Vector postVelocity[2];
+ AngularImpulse preAngularVelocity[2];
+ CBaseEntity *pEntities[2];
+
+ void Init( vcollisionevent_t *pEvent )
+ {
+ *((vcollisionevent_t *)this) = *pEvent;
+ pEntities[0] = NULL;
+ pEntities[1] = NULL;
+ }
+};
+
+struct triggerevent_t
+{
+ CBaseEntity *pTriggerEntity;
+ IPhysicsObject *pTriggerPhysics;
+ CBaseEntity *pEntity;
+ IPhysicsObject *pObject;
+ bool bStart;
+
+ inline void Init( CBaseEntity *triggerEntity, IPhysicsObject *triggerPhysics, CBaseEntity *entity, IPhysicsObject *object, bool startTouch )
+ {
+ pTriggerEntity = triggerEntity;
+ pTriggerPhysics= triggerPhysics;
+ pEntity = entity;
+ pObject = object;
+ bStart = startTouch;
+ }
+ inline void Clear()
+ {
+ memset( this, 0, sizeof(*this) );
+ }
+};
+
+// parse solid parameter overrides out of a string
+void PhysSolidOverride( solid_t &solid, string_t overrideScript );
+
+extern CEntityList *g_pShadowEntities;
+#ifdef PORTAL
+extern CEntityList *g_pShadowEntities_Main;
+#endif
+void PhysAddShadow( CBaseEntity *pEntity );
+void PhysRemoveShadow( CBaseEntity *pEntity );
+bool PhysHasShadow( CBaseEntity *pEntity );
+
+void PhysEnableFloating( IPhysicsObject *pObject, bool bEnable );
+
+void PhysCollisionSound( CBaseEntity *pEntity, IPhysicsObject *pPhysObject, int channel, int surfaceProps, int surfacePropsHit, float deltaTime, float speed );
+void PhysCollisionScreenShake( gamevcollisionevent_t *pEvent, int index );
+void PhysCollisionDust( gamevcollisionevent_t *pEvent, surfacedata_t *phit );
+#if HL2_EPISODIC
+void PhysCollisionWarpEffect( gamevcollisionevent_t *pEvent, surfacedata_t *phit );
+#endif
+void PhysBreakSound( CBaseEntity *pEntity, IPhysicsObject *pPhysObject, Vector vecOrigin );
+
+// plays the impact sound for a particular material
+void PhysicsImpactSound( CBaseEntity *pEntity, IPhysicsObject *pPhysObject, int channel, int surfaceProps, int surfacePropsHit, float volume, float impactSpeed );
+
+void PhysCallbackDamage( CBaseEntity *pEntity, const CTakeDamageInfo &info );
+void PhysCallbackDamage( CBaseEntity *pEntity, const CTakeDamageInfo &info, gamevcollisionevent_t &event, int hurtIndex );
+
+// Applies force impulses at a later time
+void PhysCallbackImpulse( IPhysicsObject *pPhysicsObject, const Vector &vecCenterForce, const AngularImpulse &vecCenterTorque );
+
+// Sets the velocity at a later time
+void PhysCallbackSetVelocity( IPhysicsObject *pPhysicsObject, const Vector &vecVelocity );
+
+// queue up a delete on this object
+void PhysCallbackRemove(IServerNetworkable *pRemove);
+
+bool PhysGetDamageInflictorVelocityStartOfFrame( IPhysicsObject *pInflictor, Vector &velocity, AngularImpulse &angVelocity );
+
+// force a physics entity to sleep immediately
+void PhysForceEntityToSleep( CBaseEntity *pEntity, IPhysicsObject *pObject );
+
+// teleport an entity to it's position relative to an object it's constrained to
+void PhysTeleportConstrainedEntity( CBaseEntity *pTeleportSource, IPhysicsObject *pObject0, IPhysicsObject *pObject1, const Vector &prevPosition, const QAngle &prevAngles, bool physicsRotate );
+
+void PhysGetListOfPenetratingEntities( CBaseEntity *pSearch, CUtlVector<CBaseEntity *> &list );
+bool PhysShouldCollide( IPhysicsObject *pObj0, IPhysicsObject *pObj1 );
+
+// returns true when processing a callback - so we can defer things that can't be done inside a callback
+bool PhysIsInCallback();
+bool PhysIsFinalTick();
+
+bool PhysGetTriggerEvent( triggerevent_t *pEvent, CBaseEntity *pTrigger );
+// note: pErrorEntity is used to report errors (object not found, more than one found). It can be NULL
+IPhysicsObject *FindPhysicsObjectByName( const char *pName, CBaseEntity *pErrorEntity );
+bool PhysFindOrAddVehicleScript( const char *pScriptName, struct vehicleparams_t *pParams, struct vehiclesounds_t *pSounds );
+void PhysFlushVehicleScripts();
+
+// this is called to flush all queues when the delete list is cleared
+void PhysOnCleanupDeleteList();
+
+struct masscenteroverride_t
+{
+ enum align_type
+ {
+ ALIGN_POINT = 0,
+ ALIGN_AXIS = 1,
+ };
+
+ void Defaults()
+ {
+ entityName = NULL_STRING;
+ }
+
+ void SnapToPoint( string_t name, const Vector &pointWS )
+ {
+ entityName = name;
+ center = pointWS;
+ axis.Init();
+ alignType = ALIGN_POINT;
+ }
+
+ void SnapToAxis( string_t name, const Vector &axisStartWS, const Vector &unitAxisDirWS )
+ {
+ entityName = name;
+ center = axisStartWS;
+ axis = unitAxisDirWS;
+ alignType = ALIGN_AXIS;
+ }
+
+ Vector center;
+ Vector axis;
+ int alignType;
+ string_t entityName;
+};
+
+void PhysSetMassCenterOverride( masscenteroverride_t &override );
+// NOTE: this removes the entry from the table as well as retrieving it
+void PhysGetMassCenterOverride( CBaseEntity *pEntity, vcollide_t *pCollide, solid_t &solidOut );
+float PhysGetEntityMass( CBaseEntity *pEntity );
+void PhysSetEntityGameFlags( CBaseEntity *pEntity, unsigned short flags );
+
+void DebugDrawContactPoints(IPhysicsObject *pPhysics);
+
+#endif // PHYSICS_H
|