Update interface version
This commit is contained in:
parent
b5f3d79c16
commit
2dabb9f29d
4 changed files with 139 additions and 95 deletions
|
|
@ -170,7 +170,7 @@ public static class NativeBridge
|
|||
|
||||
public static bool Initialize()
|
||||
{
|
||||
Handle = (nint)Utilities.MetaFactory("CRayTraceInterface001")!;
|
||||
Handle = (nint)Utilities.MetaFactory("CRayTraceInterface002")!;
|
||||
|
||||
if (Handle == 0)
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
#include "gametrace.h"
|
||||
#include "entityinstance.h"
|
||||
|
||||
#define RAYTRACE_INTERFACE_VERSION "CRayTraceInterface001"
|
||||
#define RAYTRACE_INTERFACE_VERSION "CRayTraceInterface002"
|
||||
|
||||
enum class InteractionLayers : uint64_t
|
||||
{
|
||||
|
|
@ -172,28 +172,28 @@ public:
|
|||
virtual ~CRayTraceInterface() = default;
|
||||
|
||||
virtual bool TraceShape(const Vector* pVecStart,
|
||||
const QAngle* pAngAngles,
|
||||
CEntityInstance* pIgnoreEntity,
|
||||
TraceOptions* pTraceOptions,
|
||||
TraceResult* pTraceResult) = 0;
|
||||
const QAngle* pAngAngles,
|
||||
CEntityInstance* pIgnoreEntity,
|
||||
TraceOptions* pTraceOptions,
|
||||
TraceResult* pTraceResult) = 0;
|
||||
|
||||
virtual bool TraceEndShape(const Vector* pVecStart,
|
||||
const Vector* pVecEnd,
|
||||
CEntityInstance* pIgnoreEntity,
|
||||
TraceOptions* pTraceOptions,
|
||||
TraceResult* pTraceResult) = 0;
|
||||
const Vector* pVecEnd,
|
||||
CEntityInstance* pIgnoreEntity,
|
||||
TraceOptions* pTraceOptions,
|
||||
TraceResult* pTraceResult) = 0;
|
||||
|
||||
virtual bool TraceHullShape(const Vector* pVecStart,
|
||||
const Vector* pVecEnd,
|
||||
const Vector* pVecMins,
|
||||
const Vector* pVecMaxs,
|
||||
CEntityInstance* pIgnoreEntity,
|
||||
TraceOptions* pTraceOptions,
|
||||
TraceResult* pTraceResult) = 0;
|
||||
const Vector* pVecEnd,
|
||||
const Vector* pVecMins,
|
||||
const Vector* pVecMaxs,
|
||||
CEntityInstance* pIgnoreEntity,
|
||||
TraceOptions* pTraceOptions,
|
||||
TraceResult* pTraceResult) = 0;
|
||||
|
||||
virtual bool TraceShapeEx(const Vector* pVecStart,
|
||||
const Vector* pVecEnd,
|
||||
CTraceFilter* pTraceFilter,
|
||||
Ray_t* pRay,
|
||||
TraceResult* pTraceResult) = 0;
|
||||
const Vector* pVecEnd,
|
||||
CTraceFilter* pTraceFilter,
|
||||
Ray_t* pRay,
|
||||
TraceResult* pTraceResult) = 0;
|
||||
};
|
||||
|
|
|
|||
185
src/raytrace.cpp
185
src/raytrace.cpp
|
|
@ -28,89 +28,100 @@ namespace RayTracePlugin::RayTrace
|
|||
return true;
|
||||
}
|
||||
|
||||
static void DrawBeam(const Vector& start, const Vector& end, const Color& color)
|
||||
void CRayTrace::DrawBeam(const Vector& vecStart, const Vector& vecEnd, const Color& colRender)
|
||||
{
|
||||
CBeam* beam = UTIL_CreateEntityByName<CBeam>("env_beam");
|
||||
if (!beam) return;
|
||||
|
||||
beam->m_clrRender().SetColor(color.r(), color.g(), color.b(), color.a());
|
||||
beam->m_clrRender() = colRender;
|
||||
beam->m_fWidth() = 1.5f;
|
||||
beam->m_nRenderMode() = kRenderNormal;
|
||||
beam->m_nRenderFX() = kRenderFxNone;
|
||||
|
||||
beam->Teleport(&start, &VectorExtends::RotationZero, &VectorExtends::VectorZero);
|
||||
beam->m_vecEndPos() = end;
|
||||
beam->Teleport(&vecStart, &VectorExtends::RotationZero, &VectorExtends::VectorZero);
|
||||
beam->m_vecEndPos() = vecEnd;
|
||||
beam->DispatchSpawn();
|
||||
}
|
||||
|
||||
bool CRayTrace::TraceShape(const Vector* pVecStart, const QAngle* pAngAngles, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
|
||||
{
|
||||
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
|
||||
auto result = TraceShapeInternal(*pVecStart, *pAngAngles, pIgnoreEntity, pTraceOptions);
|
||||
if (!result.has_value())
|
||||
return false;
|
||||
|
||||
filter.m_nInteractsAs = 0;
|
||||
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
|
||||
filter.m_nInteractsExclude = 0;
|
||||
|
||||
if (pTraceOptions)
|
||||
{
|
||||
if (pTraceOptions->InteractsWith != static_cast<uint64_t>(MASK_SHOT_PHYSICS))
|
||||
filter.m_nInteractsWith = pTraceOptions->InteractsWith;
|
||||
|
||||
if (pTraceOptions->InteractsExclude != 0)
|
||||
filter.m_nInteractsExclude = pTraceOptions->InteractsExclude;
|
||||
}
|
||||
|
||||
Vector forward;
|
||||
AngleVectors(pAngAngles ? *pAngAngles : VectorExtends::RotationZero, &forward);
|
||||
Vector vecEnd{
|
||||
pVecStart ? pVecStart->x : 0 + forward.x * 8192.f,
|
||||
pVecStart ? pVecStart->y : 0 + forward.y * 8192.f,
|
||||
pVecStart ? pVecStart->z : 0 + forward.z * 8192.f
|
||||
};
|
||||
|
||||
Ray_t ray;
|
||||
auto res = TraceShapeEx(pVecStart, &vecEnd, &filter, &ray, pTraceResult);
|
||||
|
||||
if (pTraceOptions && pTraceOptions->DrawBeam)
|
||||
{
|
||||
Color col = res ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
|
||||
DrawBeam(pVecStart ? *pVecStart : VectorExtends::VectorZero, (res && pTraceResult) ? pTraceResult->EndPos : vecEnd, col);
|
||||
}
|
||||
|
||||
return res;
|
||||
*pTraceResult = result.value();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRayTrace::TraceEndShape(const Vector* pVecStart, const Vector* pVecEnd, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
|
||||
{
|
||||
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
|
||||
auto result = TraceEndShapeInternal(*pVecStart, *pVecEnd, pIgnoreEntity, pTraceOptions);
|
||||
if (!result.has_value())
|
||||
return false;
|
||||
|
||||
filter.m_nInteractsAs = 0;
|
||||
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
|
||||
filter.m_nInteractsExclude = 0;
|
||||
|
||||
if (pTraceOptions)
|
||||
{
|
||||
if (pTraceOptions->InteractsWith != static_cast<uint64_t>(MASK_SHOT_PHYSICS))
|
||||
filter.m_nInteractsWith = pTraceOptions->InteractsWith;
|
||||
|
||||
if (pTraceOptions->InteractsExclude != 0)
|
||||
filter.m_nInteractsExclude = pTraceOptions->InteractsExclude;
|
||||
}
|
||||
|
||||
Ray_t ray;
|
||||
auto res = TraceShapeEx(pVecStart, pVecEnd, &filter, &ray, pTraceResult);
|
||||
|
||||
if (pTraceOptions && pTraceOptions->DrawBeam)
|
||||
{
|
||||
Color col = res ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
|
||||
DrawBeam(pVecEnd ? *pVecEnd : VectorExtends::VectorZero, (res && pTraceResult) ? pTraceResult->EndPos : (pVecEnd ? *pVecEnd : VectorExtends::VectorZero), col);
|
||||
}
|
||||
|
||||
return res;
|
||||
*pTraceResult = result.value();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRayTrace::TraceHullShape(const Vector* pVecStart, const Vector* pVecEnd, const Vector* pVecMins,
|
||||
const Vector* pVecMaxs, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
|
||||
{
|
||||
auto result = TraceHullShapeInternal(*pVecStart, *pVecEnd, *pVecMins, *pVecMaxs, pIgnoreEntity, pTraceOptions);
|
||||
if (!result.has_value())
|
||||
return false;
|
||||
|
||||
*pTraceResult = result.value();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRayTrace::TraceShapeEx(const Vector* pVecStart, const Vector* pVecEnd, CTraceFilter* pTraceFilter, Ray_t* pRay, TraceResult* pTraceResult)
|
||||
{
|
||||
auto result = TraceShapeExInternal(*pVecStart, *pVecEnd, *pTraceFilter, *pRay);
|
||||
if (!result.has_value())
|
||||
return false;
|
||||
|
||||
*pTraceResult = result.value();
|
||||
return true;
|
||||
}
|
||||
|
||||
std::optional<TraceResult> CRayTrace::TraceShapeInternal(const Vector& vecStart, const QAngle& angAngles, CEntityInstance* pIgnoreEntity, const TraceOptions* pTraceOptions)
|
||||
{
|
||||
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
|
||||
|
||||
filter.m_nInteractsAs = 0;
|
||||
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
|
||||
filter.m_nInteractsExclude = 0;
|
||||
|
||||
if (pTraceOptions)
|
||||
{
|
||||
if (pTraceOptions->InteractsWith != static_cast<uint64_t>(MASK_SHOT_PHYSICS))
|
||||
filter.m_nInteractsWith = pTraceOptions->InteractsWith;
|
||||
|
||||
if (pTraceOptions->InteractsExclude != 0)
|
||||
filter.m_nInteractsExclude = pTraceOptions->InteractsExclude;
|
||||
}
|
||||
|
||||
Vector vecForward;
|
||||
AngleVectors(angAngles, &vecForward);
|
||||
Vector vecEnd{
|
||||
vecStart.x + vecForward.x * 8192.f,
|
||||
vecStart.y + vecForward.y * 8192.f,
|
||||
vecStart.z + vecForward.z * 8192.f
|
||||
};
|
||||
|
||||
Ray_t ray;
|
||||
auto res = TraceShapeExInternal(vecStart, vecEnd, filter, ray);
|
||||
|
||||
if (pTraceOptions && pTraceOptions->DrawBeam)
|
||||
{
|
||||
Color col = res.has_value() ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
|
||||
DrawBeam(vecStart, res ? res->EndPos : vecEnd, col);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
std::optional<TraceResult> CRayTrace::TraceEndShapeInternal(const Vector& vecStart, const Vector& vecEnd, CEntityInstance* pIgnoreEntity, const TraceOptions* pTraceOptions)
|
||||
{
|
||||
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
|
||||
|
||||
|
|
@ -128,37 +139,61 @@ namespace RayTracePlugin::RayTrace
|
|||
}
|
||||
|
||||
Ray_t ray;
|
||||
ray.Init(pVecMins ? *pVecMins : VectorExtends::VectorZero, pVecMaxs ? *pVecMaxs : VectorExtends::VectorZero);
|
||||
|
||||
auto res = TraceShapeEx(pVecStart, pVecEnd, &filter, &ray, pTraceResult);
|
||||
auto res = TraceShapeExInternal(vecStart, vecEnd, filter, ray);
|
||||
|
||||
if (pTraceOptions && pTraceOptions->DrawBeam)
|
||||
{
|
||||
Color col = res ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
|
||||
DrawBeam(pVecEnd ? *pVecEnd : VectorExtends::VectorZero, (res && pTraceResult) ? pTraceResult->EndPos : (pVecEnd ? *pVecEnd : VectorExtends::VectorZero), col);
|
||||
Color col = res.has_value() ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
|
||||
DrawBeam(vecStart, res ? res->EndPos : vecEnd, col);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
bool CRayTrace::TraceShapeEx(const Vector* pVecStart, const Vector* pVecEnd, CTraceFilter* pTraceFilter, Ray_t* pRay, TraceResult* pTraceResult)
|
||||
std::optional<TraceResult> CRayTrace::TraceHullShapeInternal(const Vector& vecStart, const Vector& vecEnd, const Vector& vecMins, const Vector& vecMaxs, CEntityInstance* pIgnoreEntity, const TraceOptions* pTraceOptions)
|
||||
{
|
||||
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
|
||||
|
||||
filter.m_nInteractsAs = 0;
|
||||
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
|
||||
filter.m_nInteractsExclude = 0;
|
||||
|
||||
if (pTraceOptions)
|
||||
{
|
||||
if (pTraceOptions->InteractsWith != static_cast<uint64_t>(MASK_SHOT_PHYSICS))
|
||||
filter.m_nInteractsWith = pTraceOptions->InteractsWith;
|
||||
|
||||
if (pTraceOptions->InteractsExclude != 0)
|
||||
filter.m_nInteractsExclude = pTraceOptions->InteractsExclude;
|
||||
}
|
||||
|
||||
Ray_t ray;
|
||||
ray.Init(vecMins, vecMaxs);
|
||||
auto res = TraceShapeExInternal(vecStart, vecEnd, filter, ray);
|
||||
|
||||
if (pTraceOptions && pTraceOptions->DrawBeam)
|
||||
{
|
||||
Color col = res.has_value() ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
|
||||
DrawBeam(vecStart, res ? res->EndPos : vecEnd, col);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
std::optional<TraceResult> CRayTrace::TraceShapeExInternal(const Vector& vecStart, const Vector& vecEnd, CTraceFilter& traceFilter, Ray_t ray)
|
||||
{
|
||||
if (!m_pCNavPhysicsInterface_TraceShape)
|
||||
{
|
||||
FP_ERROR("CNavPhysicsInterface::TraceShape is not bound!");
|
||||
return false;
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
Vector vecStartCopy = pVecStart ? *pVecStart : VectorExtends::VectorZero;
|
||||
Vector vecEndCopy = pVecEnd ? *pVecEnd : VectorExtends::VectorZero;
|
||||
Vector vecStartCopy = vecStart;
|
||||
Vector vecEndCopy = vecEnd;
|
||||
CGameTrace trace;
|
||||
|
||||
bool bResult = m_pCNavPhysicsInterface_TraceShape.RCast<
|
||||
bool (*)(void*, Ray_t&, Vector&, Vector&, CTraceFilter*, CGameTrace*)>()(
|
||||
nullptr, *pRay, vecStartCopy, vecEndCopy, pTraceFilter, &trace);
|
||||
m_pCNavPhysicsInterface_TraceShape.RCast<bool (*)(void*, Ray_t&, Vector&, Vector&, CTraceFilter*, CGameTrace*)>()(nullptr, ray, vecStartCopy, vecEndCopy, &traceFilter, &trace);
|
||||
|
||||
*pTraceResult = TraceResult(&trace);
|
||||
|
||||
return bResult;
|
||||
return TraceResult(&trace);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,11 +30,20 @@ namespace RayTracePlugin::RayTrace
|
|||
class CRayTrace : public CRayTraceInterface {
|
||||
public:
|
||||
bool Initialize();
|
||||
void DrawBeam(const Vector& vecStart, const Vector& vecEnd, const Color& colRender);
|
||||
|
||||
public:
|
||||
bool TraceShape(const Vector* pVecStart, const QAngle* pAngAngles, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult) override;
|
||||
bool TraceEndShape(const Vector* pVecStart, const Vector* pVecEnd, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult) override;
|
||||
bool TraceHullShape(const Vector* pVecStart, const Vector* pVecEnd, const Vector* pVecMins, const Vector* pVecMaxs, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult) override;
|
||||
bool TraceShapeEx(const Vector* pVecStart, const Vector* pVecEnd, CTraceFilter* pTraceFilter, Ray_t* pRay, TraceResult* pTraceResult) override;
|
||||
|
||||
public:
|
||||
std::optional<TraceResult> TraceShapeInternal(const Vector& vecStart, const QAngle& angAngles, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr);
|
||||
std::optional<TraceResult> TraceEndShapeInternal(const Vector& vecStart, const Vector& vecEnd, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr);
|
||||
std::optional<TraceResult> TraceHullShapeInternal(const Vector& vecStart, const Vector& vecEnd, const Vector& vecMins, const Vector& vecMaxs, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr);
|
||||
std::optional<TraceResult> TraceShapeExInternal(const Vector& vecStart, const Vector& vecEnd, CTraceFilter& traceFilter, Ray_t ray);
|
||||
|
||||
protected:
|
||||
DynLibUtils::CMemory m_pCNavPhysicsInterface_TraceShape;
|
||||
protected:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue