2022-07-07 21:31:00 +02:00
|
|
|
|
//===== Copyright <20> 2005-2005, Valve Corporation, All rights reserved. ======//
|
|
|
|
|
//
|
|
|
|
|
// Purpose: A set of utilities to render standard shapes
|
|
|
|
|
//
|
|
|
|
|
//===========================================================================//
|
2022-07-10 14:30:28 +02:00
|
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2022-07-07 21:31:00 +02:00
|
|
|
|
|
|
|
|
|
#include "mathlib/color.h"
|
|
|
|
|
#include "mathlib/vector.h"
|
|
|
|
|
#include "mathlib/vector2d.h"
|
|
|
|
|
#include "mathlib/vector4d.h"
|
|
|
|
|
#include "mathlib/mathlib.h"
|
|
|
|
|
#include "tier2/renderutils.h"
|
2023-05-10 00:05:38 +02:00
|
|
|
|
#include "engine/debugoverlay.h" // TODO[ AMOS ]: must be a public interface!
|
2022-07-07 21:31:00 +02:00
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render angled box:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// ^ /|
|
|
|
|
|
// | /
|
|
|
|
|
// | +----------+
|
|
|
|
|
// | /| /|
|
|
|
|
|
// / | / |
|
|
|
|
|
// +----------+ |
|
|
|
|
|
// | +-------|--+
|
|
|
|
|
// | / | /
|
|
|
|
|
// |/ |/
|
|
|
|
|
// +----------+ --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawBox(const Vector3D& vOrigin, const QAngle& vAngles, const Vector3D& vMins, const Vector3D& vMaxs, Color color, bool bZBuffer)
|
|
|
|
|
{
|
|
|
|
|
Vector3D vPoints[8];
|
|
|
|
|
PointsFromAngledBox(vAngles, vMins, vMaxs, &*vPoints);
|
|
|
|
|
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[0], vOrigin + vPoints[1], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[1], vOrigin + vPoints[2], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[2], vOrigin + vPoints[3], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[3], vOrigin + vPoints[0], color, bZBuffer);
|
|
|
|
|
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[4], vOrigin + vPoints[5], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[5], vOrigin + vPoints[6], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[6], vOrigin + vPoints[7], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[7], vOrigin + vPoints[4], color, bZBuffer);
|
|
|
|
|
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[0], vOrigin + vPoints[4], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[1], vOrigin + vPoints[5], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[2], vOrigin + vPoints[6], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin + vPoints[3], vOrigin + vPoints[7], color, bZBuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render cylinder:
|
2022-07-11 20:35:20 +02:00
|
|
|
|
// +y _+z
|
|
|
|
|
// ^ /|
|
|
|
|
|
// | /
|
|
|
|
|
// |.-'"|"'-. /
|
|
|
|
|
// (----|----)
|
|
|
|
|
// |'-._|_.-'|
|
|
|
|
|
// | | |
|
|
|
|
|
// | | |
|
|
|
|
|
// | <--+--> |--> +r
|
|
|
|
|
// | | |
|
|
|
|
|
// | | |
|
|
|
|
|
// "-._|_.-" --> +x
|
2022-07-10 14:30:28 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawCylinder(const Vector3D& vOrigin, const QAngle& vAngles, float flRadius, float flHeight, Color color, int nSides, bool bZBuffer)
|
|
|
|
|
{
|
|
|
|
|
float flDegrees = 360.f / float(nSides);
|
|
|
|
|
QAngle vComposed;
|
2022-07-12 21:02:10 +02:00
|
|
|
|
Vector3D vForward;
|
|
|
|
|
vector<Vector3D> vvPoints;
|
2022-07-10 14:30:28 +02:00
|
|
|
|
|
|
|
|
|
AngleVectors(vAngles, &vForward);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < nSides; i++)
|
|
|
|
|
{
|
|
|
|
|
Vector3D right;
|
|
|
|
|
|
|
|
|
|
AngleCompose(vAngles, { 0.f, 0.f, flDegrees * i }, vComposed);
|
|
|
|
|
AngleVectors(vComposed, nullptr, &right, nullptr);
|
|
|
|
|
vvPoints.push_back(vOrigin + (right * flRadius));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < nSides; i++)
|
|
|
|
|
{
|
|
|
|
|
Vector3D vStart = vvPoints[i];
|
|
|
|
|
Vector3D vEnd = i == 0 ? vvPoints[nSides - 1] : vvPoints[i - 1];
|
|
|
|
|
|
|
|
|
|
v_RenderLine(vStart, vEnd, color, bZBuffer);
|
|
|
|
|
v_RenderLine(vStart + (vForward * flHeight), vEnd + (vForward * flHeight), color, bZBuffer);
|
|
|
|
|
v_RenderLine(vStart, vStart + (vForward * flHeight), color, bZBuffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-11 20:35:20 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render capsule:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// ^ /|
|
|
|
|
|
// | /
|
|
|
|
|
// |.-'"|"'-. /
|
|
|
|
|
// |----|----|
|
|
|
|
|
// | | |
|
|
|
|
|
// | | |
|
|
|
|
|
// | <--+--> |--> +r
|
|
|
|
|
// | | |
|
|
|
|
|
// | | |
|
|
|
|
|
// |----|----|
|
|
|
|
|
// "-..|..-" --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2022-07-11 20:45:14 +02:00
|
|
|
|
void DebugDrawCapsule(const Vector3D& vStart, const QAngle& vAngles, const Vector3D& vRadius, float flHeight, Color color, bool bZBuffer)
|
2022-07-11 20:35:20 +02:00
|
|
|
|
{
|
2022-07-12 21:02:10 +02:00
|
|
|
|
Vector3D vForward, vUp;
|
|
|
|
|
QAngle vHemi, vComposed;
|
|
|
|
|
|
2022-07-11 20:35:20 +02:00
|
|
|
|
AngleVectors(vAngles, nullptr, nullptr, &vUp);
|
|
|
|
|
|
2022-07-12 21:02:10 +02:00
|
|
|
|
for (int i = 0; i < 4; i++)
|
2022-07-11 20:35:20 +02:00
|
|
|
|
{
|
2022-07-12 21:02:10 +02:00
|
|
|
|
AngleCompose(vAngles, { 0.f, 90.f * i, 0.f }, vComposed);
|
2022-07-11 20:35:20 +02:00
|
|
|
|
AngleVectors(vComposed, &vForward);
|
2022-07-12 21:02:10 +02:00
|
|
|
|
v_RenderLine(vStart + (vForward * vRadius), vStart + (vForward * vRadius) + (vUp * flHeight), color, bZBuffer);
|
2022-07-11 20:35:20 +02:00
|
|
|
|
}
|
|
|
|
|
|
2022-07-12 21:02:10 +02:00
|
|
|
|
AngleCompose(vAngles, { 180.f, 180.f, 0.f }, vHemi);
|
2022-07-11 20:35:20 +02:00
|
|
|
|
|
2022-07-11 21:43:57 +02:00
|
|
|
|
DebugDrawHemiSphere(vStart + (vUp * flHeight), vAngles, vRadius, color, 8, bZBuffer);
|
|
|
|
|
DebugDrawHemiSphere(vStart, vHemi, vRadius, color, 8, bZBuffer);
|
2022-07-11 20:35:20 +02:00
|
|
|
|
}
|
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render sphere:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// ^ /|
|
|
|
|
|
// | /
|
|
|
|
|
// | .--"|"--. /
|
|
|
|
|
// .' | '.
|
|
|
|
|
// / | \
|
|
|
|
|
// | <----( )---->-|--> +r
|
|
|
|
|
// \ | /
|
|
|
|
|
// '. | .'
|
|
|
|
|
// "-.._|_..-" --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawSphere(const Vector3D& vOrigin, float flRadius, Color color, int nSegments, bool bZBuffer)
|
|
|
|
|
{
|
2022-07-12 14:52:12 +02:00
|
|
|
|
DebugDrawCircle(vOrigin, { 90.f, 0.f, 0.f }, flRadius, color, nSegments, bZBuffer);
|
|
|
|
|
DebugDrawCircle(vOrigin, { 0.f, 90.f, 0.f }, flRadius, color, nSegments, bZBuffer);
|
|
|
|
|
DebugDrawCircle(vOrigin, { 0.f, 0.f, 90.f }, flRadius, color, nSegments, bZBuffer);
|
2022-07-10 14:30:28 +02:00
|
|
|
|
}
|
|
|
|
|
|
2022-07-11 20:35:20 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render hemisphere:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// ^ /|
|
|
|
|
|
// | /
|
|
|
|
|
// | .--"|"--. /
|
|
|
|
|
// .' | '.
|
|
|
|
|
// / | \ /--> +r
|
|
|
|
|
// | <----( )---->-|/ --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2022-07-11 20:45:14 +02:00
|
|
|
|
void DebugDrawHemiSphere(const Vector3D& vOrigin, const QAngle& vAngles, const Vector3D& vRadius, Color color, int nSegments, bool bZBuffer)
|
2022-07-11 20:35:20 +02:00
|
|
|
|
{
|
|
|
|
|
bool bFirstLoop = true;
|
2022-11-24 15:41:52 +01:00
|
|
|
|
float flDegrees = 360.0f / float(nSegments * 2);
|
2022-07-11 20:35:20 +02:00
|
|
|
|
|
2022-07-12 21:02:10 +02:00
|
|
|
|
Vector3D vStart[4], vEnd[4], vForward[4];
|
2022-07-11 20:35:20 +02:00
|
|
|
|
QAngle vComposed[4];
|
|
|
|
|
|
2022-07-11 21:43:57 +02:00
|
|
|
|
for (int i = 0; i < (nSegments + 1); i++)
|
2022-07-11 20:35:20 +02:00
|
|
|
|
{
|
2022-07-12 15:06:44 +02:00
|
|
|
|
AngleCompose(vAngles, { flDegrees * i - 180, 0, 0 }, vComposed[0]);
|
2022-07-11 20:35:20 +02:00
|
|
|
|
AngleCompose(vAngles, { 0, flDegrees * i - 90, 0 }, vComposed[1]);
|
|
|
|
|
AngleCompose(vAngles, { flDegrees * i + 180, 90, 0 }, vComposed[2]);
|
|
|
|
|
AngleCompose(vAngles, { 0, flDegrees * i + 90, 0 }, vComposed[3]);
|
|
|
|
|
|
|
|
|
|
AngleVectors(vComposed[0], &vForward[0]);
|
|
|
|
|
AngleVectors(vComposed[1], &vForward[1]);
|
|
|
|
|
AngleVectors(vComposed[2], &vForward[2]);
|
|
|
|
|
AngleVectors(vComposed[3], &vForward[3]);
|
|
|
|
|
|
2022-07-11 20:45:14 +02:00
|
|
|
|
vEnd[0] = vOrigin + (vForward[0] * vRadius);
|
|
|
|
|
vEnd[1] = vOrigin + (vForward[1] * vRadius);
|
|
|
|
|
vEnd[2] = vOrigin + (vForward[2] * vRadius);
|
|
|
|
|
vEnd[3] = vOrigin + (vForward[3] * vRadius);
|
2022-07-11 20:35:20 +02:00
|
|
|
|
|
|
|
|
|
if (!bFirstLoop)
|
|
|
|
|
{
|
|
|
|
|
v_RenderLine(vStart[0], vEnd[0], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vStart[1], vEnd[1], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vStart[2], vEnd[2], color, bZBuffer);
|
|
|
|
|
v_RenderLine(vStart[3], vEnd[3], color, bZBuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vStart[0] = vEnd[0];
|
|
|
|
|
vStart[1] = vEnd[1];
|
|
|
|
|
vStart[2] = vEnd[2];
|
|
|
|
|
vStart[3] = vEnd[3];
|
|
|
|
|
|
|
|
|
|
bFirstLoop = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render circle:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// ^ /|
|
|
|
|
|
// | /
|
|
|
|
|
// | .--"""--. /
|
|
|
|
|
// .' '.
|
|
|
|
|
// / \
|
|
|
|
|
// | <----( )---->-|--> +r
|
|
|
|
|
// \ /
|
|
|
|
|
// '. .'
|
|
|
|
|
// "-..___..-" --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawCircle(const Vector3D& vOrigin, const QAngle& vAngles, float flRadius, Color color, int nSegments, bool bZBuffer)
|
|
|
|
|
{
|
|
|
|
|
bool bFirstLoop = true;
|
|
|
|
|
float flDegrees = 360.f / float(nSegments);
|
|
|
|
|
|
2022-07-12 21:02:10 +02:00
|
|
|
|
Vector3D vStart, vEnd, vFirstend, vForward;
|
|
|
|
|
QAngle vComposed;
|
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
for (int i = 0; i < nSegments; i++)
|
|
|
|
|
{
|
|
|
|
|
AngleCompose(vAngles, { 0.f, flDegrees * i, 0.f }, vComposed);
|
|
|
|
|
AngleVectors(vComposed, &vForward);
|
|
|
|
|
vEnd = vOrigin + (vForward * flRadius);
|
|
|
|
|
|
|
|
|
|
if (bFirstLoop)
|
|
|
|
|
vFirstend = vEnd;
|
|
|
|
|
|
|
|
|
|
if (!bFirstLoop)
|
|
|
|
|
v_RenderLine(vStart, vEnd, color, bZBuffer);
|
|
|
|
|
|
|
|
|
|
vStart = vEnd;
|
|
|
|
|
|
|
|
|
|
bFirstLoop = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
v_RenderLine(vEnd, vFirstend, color, bZBuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render square:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// | /|
|
|
|
|
|
// .--------------.
|
|
|
|
|
// | |
|
|
|
|
|
// | |
|
|
|
|
|
// | |
|
|
|
|
|
// | |
|
|
|
|
|
// | |
|
|
|
|
|
// | |
|
|
|
|
|
// '--------------' --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawSquare(const Vector3D& vOrigin, const QAngle& vAngles, float flSquareSize, Color color, bool bZBuffer)
|
|
|
|
|
{
|
|
|
|
|
DebugDrawCircle(vOrigin, vAngles, flSquareSize, color, 4, bZBuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render triangle:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// | /|
|
|
|
|
|
// | /\ /
|
|
|
|
|
// | / \ /
|
|
|
|
|
// | / \ /
|
|
|
|
|
// | / \
|
|
|
|
|
// | / \
|
|
|
|
|
// | / \
|
|
|
|
|
// / \
|
|
|
|
|
// '--------------' --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawTriangle(const Vector3D& vOrigin, const QAngle& vAngles, float flTriangleSize, Color color, bool bZBuffer)
|
2022-07-07 21:31:00 +02:00
|
|
|
|
{
|
2022-07-10 14:30:28 +02:00
|
|
|
|
DebugDrawCircle(vOrigin, vAngles, flTriangleSize, color, 3, bZBuffer);
|
|
|
|
|
}
|
2022-07-08 20:17:30 +02:00
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render mark:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// | /|
|
|
|
|
|
// | /
|
|
|
|
|
// \ /--> +r
|
|
|
|
|
// ___\/___
|
|
|
|
|
// /\
|
|
|
|
|
// / \
|
|
|
|
|
// / --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawMark(const Vector3D& vOrigin, float flRadius, const vector<int>& vColor, bool bZBuffer)
|
|
|
|
|
{
|
|
|
|
|
v_RenderLine((vOrigin - Vector3D{ flRadius, 0.f, 0.f }), (vOrigin + Vector3D{ flRadius, 0.f, 0.f }), Color(vColor[0], vColor[1], vColor[2], vColor[3]), bZBuffer);
|
|
|
|
|
v_RenderLine((vOrigin - Vector3D{ 0.f, flRadius, 0.f }), (vOrigin + Vector3D{ 0.f, flRadius, 0.f }), Color(vColor[0], vColor[1], vColor[2], vColor[3]), bZBuffer);
|
|
|
|
|
v_RenderLine((vOrigin - Vector3D{ 0.f, 0.f, flRadius }), (vOrigin + Vector3D{ 0.f, 0.f, flRadius }), Color(vColor[0], vColor[1], vColor[2], vColor[3]), bZBuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render star:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// | /|
|
|
|
|
|
// | /
|
|
|
|
|
// \ /--> +r
|
|
|
|
|
// ___\/___
|
|
|
|
|
// /\
|
|
|
|
|
// / \
|
|
|
|
|
// --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2023-05-31 23:58:24 +02:00
|
|
|
|
void DrawStar(const Vector3D& vOrigin, float flRadius, bool bZBuffer)
|
2022-07-10 14:30:28 +02:00
|
|
|
|
{
|
|
|
|
|
Vector3D vForward;
|
|
|
|
|
for (int i = 0; i < 50; i++)
|
|
|
|
|
{
|
|
|
|
|
AngleVectors({ RandomFloat(0.f, 360.f), RandomFloat(0.f, 360.f), RandomFloat(0.f, 360.f) }, &vForward);
|
2023-05-31 23:58:24 +02:00
|
|
|
|
v_RenderLine(vOrigin, vOrigin + vForward * flRadius, Color(RandomInt(0, 255), RandomInt(0, 255), RandomInt(0, 255), 255), bZBuffer);
|
2022-07-10 14:30:28 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-07-08 20:17:30 +02:00
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render arrow:
|
|
|
|
|
// +y _+z
|
|
|
|
|
// | /|
|
|
|
|
|
// | . /
|
|
|
|
|
// | / \
|
|
|
|
|
// / \
|
|
|
|
|
// /_____\ --> r
|
|
|
|
|
// |
|
|
|
|
|
// |
|
|
|
|
|
// | --> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawArrow(const Vector3D& vOrigin, const Vector3D& vEnd, float flArraySize, Color color, bool bZBuffer)
|
|
|
|
|
{
|
|
|
|
|
Vector3D vAngles;
|
2022-07-08 20:17:30 +02:00
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
v_RenderLine(vOrigin, vEnd, color, bZBuffer);
|
|
|
|
|
AngleVectors(Vector3D(vEnd - vOrigin).Normalized().AsQAngle(), &vAngles);
|
|
|
|
|
DebugDrawCircle(vEnd, vAngles.AsQAngle(), flArraySize, color, 3, bZBuffer);
|
2022-07-07 21:31:00 +02:00
|
|
|
|
}
|
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: render 3d axis:
|
|
|
|
|
// +y
|
|
|
|
|
// ^
|
|
|
|
|
// | _+z
|
|
|
|
|
// | /|
|
|
|
|
|
// | /
|
|
|
|
|
// | /
|
|
|
|
|
// |/
|
|
|
|
|
// +----------> +x
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void DebugDrawAxis(const Vector3D& vOrigin, const QAngle& vAngles, float flScale, bool bZBuffer)
|
2022-07-07 21:31:00 +02:00
|
|
|
|
{
|
2022-07-12 21:02:10 +02:00
|
|
|
|
Vector3D vForward, vRight, vUp;
|
2022-07-10 14:30:28 +02:00
|
|
|
|
AngleVectors(vAngles, &vForward, &vRight, &vUp);
|
2022-07-07 21:31:00 +02:00
|
|
|
|
|
2022-07-10 14:30:28 +02:00
|
|
|
|
v_RenderLine(vOrigin, vOrigin + vForward * flScale, Color(0, 255, 0, 255), bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin, vOrigin + vUp * flScale, Color(255, 0, 0, 255), bZBuffer);
|
|
|
|
|
v_RenderLine(vOrigin, vOrigin + vRight * flScale, Color(0, 0, 255, 255), bZBuffer);
|
|
|
|
|
}
|