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/shared/physics_shared.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/shared/physics_shared.h')
| -rw-r--r-- | mp/src/game/shared/physics_shared.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/mp/src/game/shared/physics_shared.h b/mp/src/game/shared/physics_shared.h new file mode 100644 index 00000000..15caf8e0 --- /dev/null +++ b/mp/src/game/shared/physics_shared.h @@ -0,0 +1,175 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef PHYSICS_SHARED_H
+#define PHYSICS_SHARED_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+class IPhysics;
+class IPhysicsEnvironment;
+class IPhysicsSurfaceProps;
+class IPhysicsCollision;
+class IPhysicsObject;
+class IPhysicsObjectPairHash;
+class CSoundPatch;
+
+
+extern IPhysicsObject *g_PhysWorldObject;
+extern IPhysics *physics;
+extern IPhysicsCollision *physcollision;
+extern IPhysicsEnvironment *physenv;
+#ifdef PORTAL
+extern IPhysicsEnvironment *physenv_main;
+#endif
+extern IPhysicsSurfaceProps *physprops;
+extern IPhysicsObjectPairHash *g_EntityCollisionHash;
+
+extern const objectparams_t g_PhysDefaultObjectParams;
+
+// Compute enough energy of a reference mass travelling at speed
+// makes numbers more intuitive
+#define MASS_SPEED2ENERGY(mass, speed) ((speed)*(speed)*(mass))
+
+// energy of a 10kg mass moving at speed
+#define MASS10_SPEED2ENERGY(speed) MASS_SPEED2ENERGY(10,speed)
+
+#define MASS_ENERGY2SPEED(mass,energy) (FastSqrt((energy)/mass))
+
+#define ENERGY_VOLUME_SCALE (1.0f / 15500.0f)
+
+#define FLUID_TIME_MAX 2.0f // keep track of last time hitting fluid for up to 2 seconds
+
+// VPHYSICS object game-specific flags
+#define FVPHYSICS_DMG_SLICE 0x0001 // does slice damage, not just blunt damage
+#define FVPHYSICS_CONSTRAINT_STATIC 0x0002 // object is constrained to the world, so it should behave like a static
+#define FVPHYSICS_PLAYER_HELD 0x0004 // object is held by the player, so have a very inelastic collision response
+#define FVPHYSICS_PART_OF_RAGDOLL 0x0008 // object is part of a client or server ragdoll
+#define FVPHYSICS_MULTIOBJECT_ENTITY 0x0010 // object is part of a multi-object entity
+#define FVPHYSICS_HEAVY_OBJECT 0x0020 // HULK SMASH! (Do large damage even if the mass is small)
+#define FVPHYSICS_PENETRATING 0x0040 // This object is currently stuck inside another object
+#define FVPHYSICS_NO_PLAYER_PICKUP 0x0080 // Player can't pick this up for some game rule reason
+#define FVPHYSICS_WAS_THROWN 0x0100 // Player threw this object
+#define FVPHYSICS_DMG_DISSOLVE 0x0200 // does dissolve damage, not just blunt damage
+#define FVPHYSICS_NO_IMPACT_DMG 0x0400 // don't do impact damage to anything
+#define FVPHYSICS_NO_NPC_IMPACT_DMG 0x0800 // Don't do impact damage to NPC's. This is temporary for NPC's shooting combine balls (sjb)
+#define FVPHYSICS_NO_SELF_COLLISIONS 0x8000 // don't collide with other objects that are part of the same entity
+
+//-----------------------------------------------------------------------------
+// Purpose: A little cache of current objects making noises
+//-----------------------------------------------------------------------------
+struct friction_t
+{
+ CSoundPatch *patch;
+ CBaseEntity *pObject;
+ float flLastUpdateTime;
+ float flLastEffectTime;
+};
+
+enum
+{
+ TOUCH_START=0,
+ TOUCH_END,
+};
+
+struct touchevent_t
+{
+ CBaseEntity *pEntity0;
+ CBaseEntity *pEntity1;
+ int touchType;
+ Vector endPoint; //sv
+ Vector normal; //sv
+};
+
+struct fluidevent_t
+{
+ EHANDLE hEntity;
+ float impactTime;
+};
+
+void PhysFrictionSound( CBaseEntity *pEntity, IPhysicsObject *pObject, float energy, int surfaceProps, int surfacePropsHit );
+void PhysFrictionSound( CBaseEntity *pEntity, IPhysicsObject *pObject, const char *pSoundName, HSOUNDSCRIPTHANDLE& handle, float flVolume );
+void PhysCleanupFrictionSounds( CBaseEntity *pEntity );
+void PhysFrictionEffect( Vector &vecPos, Vector vecVel, float energy, int surfaceProps, int surfacePropsHit );
+
+// Convenience routine
+// ORs gameFlags with the physics object's current game flags
+inline unsigned short PhysSetGameFlags( IPhysicsObject *pPhys, unsigned short gameFlags )
+{
+ unsigned short flags = pPhys->GetGameFlags();
+ flags |= gameFlags;
+ pPhys->SetGameFlags( flags );
+
+ return flags;
+}
+// mask off gameFlags
+inline unsigned short PhysClearGameFlags( IPhysicsObject *pPhys, unsigned short gameFlags )
+{
+ unsigned short flags = pPhys->GetGameFlags();
+ flags &= ~gameFlags;
+ pPhys->SetGameFlags( flags );
+
+ return flags;
+}
+
+
+// Create a vphysics object based on a model
+IPhysicsObject *PhysModelCreate( CBaseEntity *pEntity, int modelIndex, const Vector &origin, const QAngle &angles, solid_t *pSolid = NULL );
+
+IPhysicsObject *PhysModelCreateBox( CBaseEntity *pEntity, const Vector &mins, const Vector &maxs, const Vector &origin, bool isStatic );
+IPhysicsObject *PhysModelCreateOBB( CBaseEntity *pEntity, const Vector &mins, const Vector &maxs, const Vector &origin, const QAngle &angle, bool isStatic );
+
+// Create a vphysics object based on a BSP model (unmoveable)
+IPhysicsObject *PhysModelCreateUnmoveable( CBaseEntity *pEntity, int modelIndex, const Vector &origin, const QAngle &angles );
+
+// Create a vphysics object based on an existing collision model
+IPhysicsObject *PhysModelCreateCustom( CBaseEntity *pEntity, const CPhysCollide *pModel, const Vector &origin, const QAngle &angles, const char *pName, bool isStatic, solid_t *pSolid = NULL );
+
+// Create a bbox collision model (these may be shared among entities, they are auto-deleted at end of level. do not manage)
+CPhysCollide *PhysCreateBbox( const Vector &mins, const Vector &maxs );
+
+// Create a vphysics sphere object
+IPhysicsObject *PhysSphereCreate( CBaseEntity *pEntity, float radius, const Vector &origin, solid_t &solid );
+
+// Destroy a physics object created using PhysModelCreate...()
+void PhysDestroyObject( IPhysicsObject *pObject, CBaseEntity *pEntity = NULL );
+
+void PhysDisableObjectCollisions( IPhysicsObject *pObject0, IPhysicsObject *pObject1 );
+void PhysDisableEntityCollisions( IPhysicsObject *pObject0, IPhysicsObject *pObject1 );
+void PhysDisableEntityCollisions( CBaseEntity *pEntity0, CBaseEntity *pEntity1 );
+void PhysEnableObjectCollisions( IPhysicsObject *pObject0, IPhysicsObject *pObject1 );
+void PhysEnableEntityCollisions( IPhysicsObject *pObject0, IPhysicsObject *pObject1 );
+void PhysEnableEntityCollisions( CBaseEntity *pEntity0, CBaseEntity *pEntity1 );
+bool PhysEntityCollisionsAreDisabled( CBaseEntity *pEntity0, CBaseEntity *pEntity1 );
+
+// create the world physics objects
+IPhysicsObject *PhysCreateWorld_Shared( CBaseEntity *pWorld, vcollide_t *pWorldCollide, const objectparams_t &defaultParams );
+
+// parse the parameters for a single solid from the model's collision data
+bool PhysModelParseSolid( solid_t &solid, CBaseEntity *pEntity, int modelIndex );
+// parse the parameters for a solid matching a particular index
+bool PhysModelParseSolidByIndex( solid_t &solid, CBaseEntity *pEntity, int modelIndex, int solidIndex );
+
+void PhysParseSurfaceData( class IPhysicsSurfaceProps *pProps, class IFileSystem *pFileSystem );
+
+// fill out this solid_t with the AABB defaults (high inertia/no rotation)
+void PhysGetDefaultAABBSolid( solid_t &solid );
+
+// Compute an output velocity based on sliding along the current contact points
+// in the closest direction toward inputVelocity.
+void PhysComputeSlideDirection( IPhysicsObject *pPhysics, const Vector &inputVelocity, const AngularImpulse &inputAngularVelocity,
+ Vector *pOutputVelocity, Vector *pOutputAngularVelocity, float minMass );
+
+void PhysForceClearVelocity( IPhysicsObject *pPhys );
+bool PhysHasContactWithOtherInDirection( IPhysicsObject *pPhysics, const Vector &dir );
+
+//-----------------------------------------------------------------------------
+// Singleton access
+//-----------------------------------------------------------------------------
+IGameSystem* PhysicsGameSystem();
+
+#endif // PHYSICS_SHARED_H
|