Refactor CRayTrace

This commit is contained in:
SlynxCZ 2026-04-14 22:01:27 +02:00
parent 12585b4161
commit 51afd30a0a
5 changed files with 459 additions and 481 deletions

View file

@ -144,36 +144,106 @@ struct TraceOptions
struct TraceResult
{
float StartPosX;
float StartPosY;
float StartPosZ;
float EndPosX;
float EndPosY;
float EndPosZ;
float HitPointX;
float HitPointY;
float HitPointZ;
float NormalX;
float NormalY;
float NormalZ;
float Fraction;
float HitOffset;
TraceResult()
{
m_flFraction = 1.0f;
m_bStartInSolid = false;
m_bExactHitPoint = false;
m_pEnt = nullptr;
m_pHitbox = nullptr;
m_pSurfaceProperties = nullptr;
}
int TriangleIndex;
int HitboxBoneIndex;
int Contents;
int RayType;
int AllSolid;
int ExactHitPoint;
explicit TraceResult(const CGameTrace* pTrace, bool bResult)
{
m_bTraceShapeResult = bResult;
m_pSurfaceProperties = pTrace->m_pSurfaceProperties;
m_pEnt = pTrace->m_pEnt;
m_pHitbox = pTrace->m_pHitbox;
m_hBody = pTrace->m_hBody;
m_hShape = pTrace->m_hShape;
m_nContents = pTrace->m_nContents;
m_BodyTransform = pTrace->m_BodyTransform;
m_ShapeAttributes = pTrace->m_ShapeAttributes;
m_vStartPos = pTrace->m_vStartPos;
m_vEndPos = pTrace->m_vEndPos;
m_vHitNormal = pTrace->m_vHitNormal;
m_vHitPoint = pTrace->m_vHitPoint;
m_flHitOffset = pTrace->m_flHitOffset;
m_flFraction = pTrace->m_flFraction;
m_nTriangle = pTrace->m_nTriangle;
m_nHitboxBoneIndex = pTrace->m_nHitboxBoneIndex;
m_eRayType = pTrace->m_eRayType;
m_bStartInSolid = pTrace->m_bStartInSolid;
m_bExactHitPoint = pTrace->m_bExactHitPoint;
}
CEntityInstance *HitEntity;
CHitBox *Hitbox;
CPhysSurfaceProperties *SurfaceProps;
IPhysicsBody *BodyHandle;
IPhysicsShape *ShapeHandle;
TraceResult(const TraceResult&) = delete;
TraceResult& operator=(const TraceResult&) = delete;
CTransform *BodyTransform;
RnCollisionAttr_t *ShapeAttributes;
TraceResult(TraceResult&&) = default;
TraceResult& operator=(TraceResult&&) = default;
const Vector& StartPos() const { return m_vStartPos; }
const Vector& EndPos() const { return m_vEndPos; }
const Vector& HitPoint() const { return m_vHitPoint; }
const Vector& Normal() const { return m_vHitNormal; }
float Fraction() const { return m_flFraction; }
float HitOffset() const { return m_flHitOffset; }
bool DidHit() const { return m_flFraction < 1.0f; }
bool IsAllSolid() const { return m_bStartInSolid; }
bool HasExactHit() const { return m_bExactHitPoint; }
CEntityInstance* HitEntity() const { return m_pEnt; }
int TriangleIndex() const { return m_nTriangle; }
int HitboxBoneIndex() const { return m_nHitboxBoneIndex; }
CHitBox* Hitbox() const { return const_cast<CHitBox*>(m_pHitbox); }
int Contents() const { return m_nContents; }
RayType_t RayType() const { return m_eRayType; }
IPhysicsBody* Body() const { return m_hBody; }
IPhysicsShape* Shape() const { return m_hShape; }
const CTransform& BodyTransform() const { return m_BodyTransform; }
const RnCollisionAttr_t& ShapeAttributes() const { return m_ShapeAttributes; }
CPhysSurfaceProperties* Surface() const { return const_cast<CPhysSurfaceProperties*>(m_pSurfaceProperties); }
private:
bool m_bTraceShapeResult; // return value from RayTrace::TraceShapeEx
const CPhysSurfaceProperties *m_pSurfaceProperties;
CEntityInstance *m_pEnt;
const CHitBox *m_pHitbox;
HPhysicsBody m_hBody;
HPhysicsShape m_hShape;
uint64 m_nContents; // contents on other side of surface hit
CTransform m_BodyTransform;
RnCollisionAttr_t m_ShapeAttributes;
Vector m_vStartPos; // start position
Vector m_vEndPos; // final position
Vector m_vHitNormal; // surface normal at impact
Vector m_vHitPoint; // exact hit point if m_bExactHitPoint is true, otherwise equal to m_vEndPos
float m_flHitOffset; // surface normal hit offset
float m_flFraction; // time completed, 1.0 = didn't hit anything
int32 m_nTriangle; // the index of the triangle that was hit
int16 m_nHitboxBoneIndex; // the index of the hitbox bone that was hit
RayType_t m_eRayType;
bool m_bStartInSolid; // if true, the initial point was in a solid area
bool m_bExactHitPoint; // if true, then m_vHitPoint is the exact hit point of the query and the shape
};
class CRayTraceInterface
@ -181,37 +251,25 @@ class CRayTraceInterface
public:
virtual ~CRayTraceInterface() = default;
virtual bool TraceShape(
const Vector* origin,
const QAngle* viewangles,
CEntityInstance* ignoreEntity,
const TraceOptions* opts,
TraceResult* outResult
) = 0;
virtual TraceResult TraceShape(const Vector& vecStart,
const QAngle& angAngles,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions) = 0;
virtual bool TraceEndShape(
const Vector* origin,
const Vector* endOrigin,
CEntityInstance* ignoreEntity,
const TraceOptions* opts,
TraceResult* outResult
) = 0;
virtual TraceResult TraceEndShape(const Vector& vecStart,
const Vector& vecEnd,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions) = 0;
virtual bool TraceHullShape(
const Vector* vecStart,
const Vector* vecEnd,
const Vector* hullMins,
const Vector* hullMaxs,
CEntityInstance* ignoreEntity,
const TraceOptions* opts,
TraceResult* outResult
) = 0;
virtual TraceResult TraceHullShape(const Vector& vecStart,
const Vector& vecEnd,
const Vector& vecMins,
const Vector& vecMaxs,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions) = 0;
virtual bool TraceShapeEx(
const Vector* vecStart,
const Vector* vecEnd,
CTraceFilter* filterInc,
Ray_t* rayInc,
TraceResult* outResult
) = 0;
virtual TraceResult TraceShapeEx(const Vector& vecStart,
const Vector& vecEnd,
CTraceFilter* pTraceFilter,
Ray_t* pRay) = 0;
};