#ifndef PHYSICS_H #define PHYSICS_H #include "tier0/platform.h" #include "trig.h" typedef void *HShape; typedef void *HCollider; #ifndef PHYSICS_OBJECT_DEFINED struct BallShape_t { float m_fRadius; }; struct CuboidShape_t { float m_fExtentX; float m_fExtentY; float m_fExtentZ; }; struct TriangleMeshShape_t { float *m_pfPositions; uint32_t m_nPositionCount; uint32_t *m_puIndicies; uint32_t m_nIndiciesCount; }; struct CastResult_t { bool m_bIsHit; HCollider m_hCollider; Vector m_vCollisionPoint; // 0 to 1 float m_fTime; // 0 to lenght float m_fDistance; }; enum EPhysicsBodyType { k_EPhysics_Static, k_EPhysics_Dynamic, k_EPhysics_KinematicPositionBased, k_EPhysics_KinematicVelocityBased, }; #endif abstract_class IPhysicsBody { public: virtual void SetPosition( Vector vPosition ) = 0; virtual void SetRotation( Quat vRotation ) = 0; virtual Vector GetPosition() = 0; virtual Quat GetRotation() = 0; virtual void SetType( EPhysicsBodyType eType ) = 0; virtual void SetGravityScale( float fScale ) = 0; }; abstract_class IPhysicsWorld { public: virtual void Frame( float fDelta ) = 0; virtual IPhysicsBody *CreateRigidBody( HCollider hCollider, EPhysicsBodyType eType ) = 0; virtual void DestroyPhysicsBody( IPhysicsBody *pBody ) = 0; virtual void SetGravity( float fGravity ) = 0; virtual CastResult_t RayCast( Vector vBegin, Vector vEnd ) = 0; virtual CastResult_t ShapeCast( HShape hShape, Quat vOrientation, Vector vBegin, Vector vEnd ) = 0; }; abstract_class IPhysics { public: virtual HShape CreateBall( BallShape_t ball ) = 0; virtual HShape CreateCube( CuboidShape_t ball ) = 0; virtual HShape CreateTriangleMesh( TriangleMeshShape_t shape ) = 0; virtual void DestroyShape( HShape hShape ) = 0; virtual HCollider CreateCollider( HShape hShape ) = 0; virtual IPhysicsWorld *CreateWorld() = 0; virtual void DestroyWorld( IPhysicsWorld *pWorld ) = 0; }; #define PHYSICS_INTERFACE_VERSION "Physics001" #endif