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()
|
public static bool Initialize()
|
||||||
{
|
{
|
||||||
Handle = (nint)Utilities.MetaFactory("CRayTraceInterface001")!;
|
Handle = (nint)Utilities.MetaFactory("CRayTraceInterface002")!;
|
||||||
|
|
||||||
if (Handle == 0)
|
if (Handle == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
#include "gametrace.h"
|
#include "gametrace.h"
|
||||||
#include "entityinstance.h"
|
#include "entityinstance.h"
|
||||||
|
|
||||||
#define RAYTRACE_INTERFACE_VERSION "CRayTraceInterface001"
|
#define RAYTRACE_INTERFACE_VERSION "CRayTraceInterface002"
|
||||||
|
|
||||||
enum class InteractionLayers : uint64_t
|
enum class InteractionLayers : uint64_t
|
||||||
{
|
{
|
||||||
|
|
@ -172,28 +172,28 @@ public:
|
||||||
virtual ~CRayTraceInterface() = default;
|
virtual ~CRayTraceInterface() = default;
|
||||||
|
|
||||||
virtual bool TraceShape(const Vector* pVecStart,
|
virtual bool TraceShape(const Vector* pVecStart,
|
||||||
const QAngle* pAngAngles,
|
const QAngle* pAngAngles,
|
||||||
CEntityInstance* pIgnoreEntity,
|
CEntityInstance* pIgnoreEntity,
|
||||||
TraceOptions* pTraceOptions,
|
TraceOptions* pTraceOptions,
|
||||||
TraceResult* pTraceResult) = 0;
|
TraceResult* pTraceResult) = 0;
|
||||||
|
|
||||||
virtual bool TraceEndShape(const Vector* pVecStart,
|
virtual bool TraceEndShape(const Vector* pVecStart,
|
||||||
const Vector* pVecEnd,
|
const Vector* pVecEnd,
|
||||||
CEntityInstance* pIgnoreEntity,
|
CEntityInstance* pIgnoreEntity,
|
||||||
TraceOptions* pTraceOptions,
|
TraceOptions* pTraceOptions,
|
||||||
TraceResult* pTraceResult) = 0;
|
TraceResult* pTraceResult) = 0;
|
||||||
|
|
||||||
virtual bool TraceHullShape(const Vector* pVecStart,
|
virtual bool TraceHullShape(const Vector* pVecStart,
|
||||||
const Vector* pVecEnd,
|
const Vector* pVecEnd,
|
||||||
const Vector* pVecMins,
|
const Vector* pVecMins,
|
||||||
const Vector* pVecMaxs,
|
const Vector* pVecMaxs,
|
||||||
CEntityInstance* pIgnoreEntity,
|
CEntityInstance* pIgnoreEntity,
|
||||||
TraceOptions* pTraceOptions,
|
TraceOptions* pTraceOptions,
|
||||||
TraceResult* pTraceResult) = 0;
|
TraceResult* pTraceResult) = 0;
|
||||||
|
|
||||||
virtual bool TraceShapeEx(const Vector* pVecStart,
|
virtual bool TraceShapeEx(const Vector* pVecStart,
|
||||||
const Vector* pVecEnd,
|
const Vector* pVecEnd,
|
||||||
CTraceFilter* pTraceFilter,
|
CTraceFilter* pTraceFilter,
|
||||||
Ray_t* pRay,
|
Ray_t* pRay,
|
||||||
TraceResult* pTraceResult) = 0;
|
TraceResult* pTraceResult) = 0;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
185
src/raytrace.cpp
185
src/raytrace.cpp
|
|
@ -28,89 +28,100 @@ namespace RayTracePlugin::RayTrace
|
||||||
return true;
|
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");
|
CBeam* beam = UTIL_CreateEntityByName<CBeam>("env_beam");
|
||||||
if (!beam) return;
|
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_fWidth() = 1.5f;
|
||||||
beam->m_nRenderMode() = kRenderNormal;
|
beam->m_nRenderMode() = kRenderNormal;
|
||||||
beam->m_nRenderFX() = kRenderFxNone;
|
beam->m_nRenderFX() = kRenderFxNone;
|
||||||
|
|
||||||
beam->Teleport(&start, &VectorExtends::RotationZero, &VectorExtends::VectorZero);
|
beam->Teleport(&vecStart, &VectorExtends::RotationZero, &VectorExtends::VectorZero);
|
||||||
beam->m_vecEndPos() = end;
|
beam->m_vecEndPos() = vecEnd;
|
||||||
beam->DispatchSpawn();
|
beam->DispatchSpawn();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CRayTrace::TraceShape(const Vector* pVecStart, const QAngle* pAngAngles, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
|
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;
|
*pTraceResult = result.value();
|
||||||
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
|
return true;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CRayTrace::TraceEndShape(const Vector* pVecStart, const Vector* pVecEnd, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
|
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;
|
*pTraceResult = result.value();
|
||||||
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
|
return true;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CRayTrace::TraceHullShape(const Vector* pVecStart, const Vector* pVecEnd, const Vector* pVecMins,
|
bool CRayTrace::TraceHullShape(const Vector* pVecStart, const Vector* pVecEnd, const Vector* pVecMins,
|
||||||
const Vector* pVecMaxs, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
|
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();
|
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
|
||||||
|
|
||||||
|
|
@ -128,37 +139,61 @@ namespace RayTracePlugin::RayTrace
|
||||||
}
|
}
|
||||||
|
|
||||||
Ray_t ray;
|
Ray_t ray;
|
||||||
ray.Init(pVecMins ? *pVecMins : VectorExtends::VectorZero, pVecMaxs ? *pVecMaxs : VectorExtends::VectorZero);
|
auto res = TraceShapeExInternal(vecStart, vecEnd, filter, ray);
|
||||||
|
|
||||||
auto res = TraceShapeEx(pVecStart, pVecEnd, &filter, &ray, pTraceResult);
|
|
||||||
|
|
||||||
if (pTraceOptions && pTraceOptions->DrawBeam)
|
if (pTraceOptions && pTraceOptions->DrawBeam)
|
||||||
{
|
{
|
||||||
Color col = res ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
|
Color col = res.has_value() ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
|
||||||
DrawBeam(pVecEnd ? *pVecEnd : VectorExtends::VectorZero, (res && pTraceResult) ? pTraceResult->EndPos : (pVecEnd ? *pVecEnd : VectorExtends::VectorZero), col);
|
DrawBeam(vecStart, res ? res->EndPos : vecEnd, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
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)
|
if (!m_pCNavPhysicsInterface_TraceShape)
|
||||||
{
|
{
|
||||||
FP_ERROR("CNavPhysicsInterface::TraceShape is not bound!");
|
FP_ERROR("CNavPhysicsInterface::TraceShape is not bound!");
|
||||||
return false;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector vecStartCopy = pVecStart ? *pVecStart : VectorExtends::VectorZero;
|
Vector vecStartCopy = vecStart;
|
||||||
Vector vecEndCopy = pVecEnd ? *pVecEnd : VectorExtends::VectorZero;
|
Vector vecEndCopy = vecEnd;
|
||||||
CGameTrace trace;
|
CGameTrace trace;
|
||||||
|
|
||||||
bool bResult = m_pCNavPhysicsInterface_TraceShape.RCast<
|
m_pCNavPhysicsInterface_TraceShape.RCast<bool (*)(void*, Ray_t&, Vector&, Vector&, CTraceFilter*, CGameTrace*)>()(nullptr, ray, vecStartCopy, vecEndCopy, &traceFilter, &trace);
|
||||||
bool (*)(void*, Ray_t&, Vector&, Vector&, CTraceFilter*, CGameTrace*)>()(
|
|
||||||
nullptr, *pRay, vecStartCopy, vecEndCopy, pTraceFilter, &trace);
|
|
||||||
|
|
||||||
*pTraceResult = TraceResult(&trace);
|
return TraceResult(&trace);
|
||||||
|
|
||||||
return bResult;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,20 @@ namespace RayTracePlugin::RayTrace
|
||||||
class CRayTrace : public CRayTraceInterface {
|
class CRayTrace : public CRayTraceInterface {
|
||||||
public:
|
public:
|
||||||
bool Initialize();
|
bool Initialize();
|
||||||
|
void DrawBeam(const Vector& vecStart, const Vector& vecEnd, const Color& colRender);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool TraceShape(const Vector* pVecStart, const QAngle* pAngAngles, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult) override;
|
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 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 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;
|
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:
|
protected:
|
||||||
DynLibUtils::CMemory m_pCNavPhysicsInterface_TraceShape;
|
DynLibUtils::CMemory m_pCNavPhysicsInterface_TraceShape;
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue