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.
2020-08-04 13:13:01 -04:00

193 lines
7.8 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
#ifndef ENGINE_IENGINETRACE_H
#define ENGINE_IENGINETRACE_H
#ifdef _WIN32
#pragma once
#endif
#include "../basehandle.h"
#include "../mathlib/vector4d.h"
#include "../tier1/utlvector.h" //need CUtlVector for IEngineTrace::GetBrushesIn*()
class Vector;
class IHandleEntity;
struct Ray_t;
class CGameTrace;
typedef CGameTrace trace_t;
class ICollideable;
class QAngle;
class CTraceListData;
class CPhysCollide;
struct cplane_t;
//-----------------------------------------------------------------------------
// The standard trace filter... NOTE: Most normal traces inherit from
// CTraceFilter!!!
//-----------------------------------------------------------------------------
enum TraceType_t {
TRACE_EVERYTHING = 0,
TRACE_WORLD_ONLY, // NOTE: This does *not* test static props!!!
TRACE_ENTITIES_ONLY, // NOTE: This version will *not* test static props
TRACE_EVERYTHING_FILTER_PROPS, // NOTE: This version will pass the
// IHandleEntity for props through the
// filter, unlike all other filters
};
abstract_class ITraceFilter {
public:
virtual bool ShouldHitEntity(IHandleEntity * pEntity, int contentsMask) = 0;
virtual TraceType_t GetTraceType() const = 0;
};
//-----------------------------------------------------------------------------
// Classes are expected to inherit these + implement the ShouldHitEntity method
//-----------------------------------------------------------------------------
// This is the one most normal traces will inherit from
class CTraceFilter : public ITraceFilter {
public:
virtual TraceType_t GetTraceType() const { return TRACE_EVERYTHING; }
};
class CTraceFilterEntitiesOnly : public ITraceFilter {
public:
virtual TraceType_t GetTraceType() const { return TRACE_ENTITIES_ONLY; }
};
//-----------------------------------------------------------------------------
// Classes need not inherit from these
//-----------------------------------------------------------------------------
class CTraceFilterWorldOnly : public ITraceFilter {
public:
bool ShouldHitEntity(IHandleEntity *pServerEntity, int contentsMask) {
return false;
}
virtual TraceType_t GetTraceType() const { return TRACE_WORLD_ONLY; }
};
class CTraceFilterWorldAndPropsOnly : public ITraceFilter {
public:
bool ShouldHitEntity(IHandleEntity *pServerEntity, int contentsMask) {
return false;
}
virtual TraceType_t GetTraceType() const { return TRACE_EVERYTHING; }
};
class CTraceFilterHitAll : public CTraceFilter {
public:
virtual bool ShouldHitEntity(IHandleEntity *pServerEntity,
int contentsMask) {
return true;
}
};
//-----------------------------------------------------------------------------
// Enumeration interface for EnumerateLinkEntities
//-----------------------------------------------------------------------------
abstract_class IEntityEnumerator {
public:
// This gets called with each handle
virtual bool EnumEntity(IHandleEntity * pHandleEntity) = 0;
};
//-----------------------------------------------------------------------------
// Interface the engine exposes to the game DLL
//-----------------------------------------------------------------------------
#define INTERFACEVERSION_ENGINETRACE_SERVER "EngineTraceServer003"
#define INTERFACEVERSION_ENGINETRACE_CLIENT "EngineTraceClient003"
abstract_class IEngineTrace {
public:
// Returns the contents mask + entity at a particular world-space position
virtual int GetPointContents(const Vector &vecAbsPosition,
IHandleEntity **ppEntity = NULL) = 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,
CTraceListData &traceData) = 0;
virtual void SetupLeafAndEntityListBox(const Vector &vecBoxMin,
const Vector &vecBoxMax,
CTraceListData &traceData) = 0;
virtual void TraceRayAgainstLeafAndEntityList(
const Ray_t &ray, CTraceListData &traceData, 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;
// 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<Vector4D> *pPlanesOut,
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;
};
#endif // ENGINE_IENGINETRACE_H