This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/csgo/sdk/IEngineTrace.h
2020-08-04 13:13:01 -04:00

266 lines
8.7 KiB
C++

#pragma once
class CTraceListData;
class CPhysCollide;
class Vector4D;
class ITraceListData;
struct virtualmeshlist_t;
struct BrushSideInfo_t;
enum TraceType_t {
TRACE_EVERYTHING = 0,
TRACE_WORLD_ONLY,
TRACE_ENTITIES_ONLY,
TRACE_EVERYTHING_FILTER_PROPS,
};
enum DebugTraceCounterBehavior_t {
kTRACE_COUNTER_SET = 0,
kTRACE_COUNTER_INC,
};
struct cplane_t {
Vector normal;
float dist;
unsigned char type;
unsigned char signbits;
unsigned char pad[2];
};
struct csurface_t {
const char* name;
short surfaceProps;
unsigned short flags;
};
struct trace_t {
Vector startpos;
Vector endpos;
cplane_t plane;
float fraction;
int contents;
unsigned int dispFlags;
bool allsolid;
bool startsolid;
float fractionleftsolid;
csurface_t surface;
HitGroups hitgroup;
short physicsbone;
unsigned short worldSurfaceIndex;
C_BaseEntity* m_pEntityHit;
int hitbox;
};
struct Ray_t {
VectorAligned m_Start;
VectorAligned m_Delta;
VectorAligned m_StartOffset;
VectorAligned m_Extents;
const matrix3x4_t* m_pWorldAxisTransform;
bool m_IsRay;
bool m_IsSwept;
Ray_t() : m_pWorldAxisTransform(NULL) {}
void Init(Vector vecStart, Vector vecEnd) {
m_Delta = vecEnd - vecStart;
m_IsSwept = (m_Delta.LengthSqr() != 0);
m_Extents.x = m_Extents.y = m_Extents.z = 0.0f;
m_pWorldAxisTransform = NULL;
m_IsRay = true;
m_StartOffset.x = m_StartOffset.y = m_StartOffset.z = 0.0f;
m_Start = vecStart;
}
void Init(Vector const& start, Vector const& end, Vector const& mins,
Vector const& maxs) {
m_Delta = end - start;
m_pWorldAxisTransform = NULL;
m_IsSwept = (m_Delta.LengthSqr() != 0);
m_Extents = maxs - mins;
m_Extents *= 0.5f;
m_IsRay = (m_Extents.LengthSqr() < 1e-6);
// Offset m_Start to be in the center of the box...
m_StartOffset = maxs + mins;
m_StartOffset *= 0.5f;
m_Start = start + m_StartOffset;
m_StartOffset *= -1.0f;
}
};
class ITraceFilter {
public:
virtual bool ShouldHitEntity(C_BaseEntity* pEntity, int contentsMask) = 0;
virtual TraceType_t GetTraceType() const = 0;
};
class CTraceFilter : public ITraceFilter {
public:
bool ShouldHitEntity(C_BaseEntity* pEntityHandle, int contentsMask) {
return !(pEntityHandle == pSkip);
}
virtual TraceType_t GetTraceType() const { return TRACE_EVERYTHING; }
void* pSkip;
};
class IEntityEnumerator {
public:
// This gets called with each handle
virtual bool EnumEntity(IHandleEntity* pHandleEntity) = 0;
};
class CTraceFilterWorldOnly : public ITraceFilter {
public:
bool ShouldHitEntity(C_BaseEntity* pEntityHandle, int contentsMask) {
return false;
}
TraceType_t GetTraceType() const { return TRACE_WORLD_ONLY; }
};
class CTraceFilterEntitiesOnly : public ITraceFilter {
public:
bool ShouldHitEntity(C_BaseEntity* pEntityHandle, int contentsMask) {
return !(pEntityHandle == pSkip);
}
virtual TraceType_t GetTraceType() const { return TRACE_ENTITIES_ONLY; }
void* pSkip;
};
class IEngineTrace {
public:
// Returns the contents mask + entity at a particular world-space position
virtual int GetPointContents(const Vector& vecAbsPosition,
int contentsMask = MASK_ALL,
IHandleEntity** ppEntity = NULL) = 0;
// Returns the contents mask of the world only @ the world-space position
// (static props are ignored)
virtual int GetPointContents_WorldOnly(const Vector& vecAbsPosition,
int contentsMask = MASK_ALL) = 0;
// Get the point contents, but only test the specific entity. This works
// on static props and brush models.
//
// If the entity isn't a static prop or a brush model, it returns
// CONTENTS_EMPTY and sets bFailed to true if bFailed is non-null.
virtual int GetPointContents_Collideable(ICollideable* pCollide,
const Vector& vecAbsPosition) = 0;
// Traces a ray against a particular entity
virtual void ClipRayToEntity(const Ray_t& ray, unsigned int fMask,
IHandleEntity* pEnt, trace_t* pTrace) = 0;
// Traces a ray against a particular entity
virtual void ClipRayToCollideable(const Ray_t& ray, unsigned int fMask,
ICollideable* pCollide,
trace_t* pTrace) = 0;
// A version that simply accepts a ray (can work as a traceline or
// tracehull)
virtual void TraceRay(const Ray_t& ray, unsigned int fMask,
ITraceFilter* pTraceFilter, trace_t* pTrace) = 0;
// A version that sets up the leaf and entity lists and allows you to pass
// those in for collision.
virtual void SetupLeafAndEntityListRay(const Ray_t& ray,
ITraceListData* pTraceData) = 0;
virtual void SetupLeafAndEntityListBox(const Vector& vecBoxMin,
const Vector& vecBoxMax,
ITraceListData* pTraceData) = 0;
virtual void TraceRayAgainstLeafAndEntityList(const Ray_t& ray,
ITraceListData* pTraceData,
unsigned int fMask,
ITraceFilter* pTraceFilter,
trace_t* pTrace) = 0;
// A version that sweeps a collideable through the world
// abs start + abs end represents the collision origins you want to sweep
// the collideable through vecAngles represents the collision angles of the
// collideable during the sweep
virtual void SweepCollideable(ICollideable* pCollide,
const Vector& vecAbsStart,
const Vector& vecAbsEnd,
const QAngle& vecAngles, unsigned int fMask,
ITraceFilter* pTraceFilter,
trace_t* pTrace) = 0;
// Enumerates over all entities along a ray
// If triggers == true, it enumerates all triggers along a ray
virtual void EnumerateEntities(const Ray_t& ray, bool triggers,
IEntityEnumerator* pEnumerator) = 0;
// Same thing, but enumerate entitys within a box
virtual void EnumerateEntities(const Vector& vecAbsMins,
const Vector& vecAbsMaxs,
IEntityEnumerator* pEnumerator) = 0;
// Convert a handle entity to a collideable. Useful inside enumer
virtual ICollideable* GetCollideable(IHandleEntity* pEntity) = 0;
// HACKHACK: Temp for performance measurments
virtual int GetStatByIndex(int index, bool bClear) = 0;
// finds brushes in an AABB, prone to some false positives
virtual void GetBrushesInAABB(const Vector& vMins, const Vector& vMaxs,
CUtlVector<int>* pOutput,
int iContentsMask = 0xFFFFFFFF) = 0;
// Creates a CPhysCollide out of all displacements wholly or partially
// contained in the specified AABB
virtual CPhysCollide* GetCollidableFromDisplacementsInAABB(
const Vector& vMins, const Vector& vMaxs) = 0;
// gets the number of displacements in the world
virtual int GetNumDisplacements() = 0;
// gets a specific diplacement mesh
virtual void GetDisplacementMesh(int nIndex,
virtualmeshlist_t* pMeshTriList) = 0;
// retrieve brush planes and contents, returns true if data is being
// returned in the output pointers, false if the brush doesn't exist
virtual bool GetBrushInfo(int iBrush,
CUtlVector<BrushSideInfo_t>* pBrushSideInfoOut,
int* pContentsOut) = 0;
virtual bool PointOutsideWorld(
const Vector& ptTest) = 0; // Tests a point to see if it's outside any
// playable area
// Walks bsp to find the leaf containing the specified point
virtual int GetLeafContainingPoint(const Vector& ptTest) = 0;
virtual ITraceListData* AllocTraceListData() = 0;
virtual void FreeTraceListData(ITraceListData*) = 0;
/// Used only in debugging: get/set/clear/increment the trace debug counter.
/// See comment below for details.
virtual int GetSetDebugTraceCounter(
int value, DebugTraceCounterBehavior_t behavior) = 0;
};