Files
funnygame/public/iphysics.h
2026-03-29 19:38:17 +03:00

101 lines
1.9 KiB
C++

#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