You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2311 lines
80 KiB
C++
2311 lines
80 KiB
C++
/*
|
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
|
* its licensors.
|
|
*
|
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
|
* distribution (the "License"). All use of this software is governed by the License,
|
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
*
|
|
*/
|
|
// Original file Copyright Crytek GMBH or its affiliates, used under license.
|
|
|
|
#include "RenderDll_precompiled.h"
|
|
#include "RenderAuxGeom.h"
|
|
#include <IStereoRenderer.h>
|
|
|
|
#if defined(ENABLE_RENDER_AUX_GEOM)
|
|
|
|
static inline uint32 PackColor(const ColorB& col)
|
|
{
|
|
return(((uint8) (col.a) << 24) +
|
|
((uint8) (col.r) << 16) +
|
|
((uint8) (col.g) << 8) +
|
|
((uint8) (col.b)));
|
|
}
|
|
|
|
static inline ColorB
|
|
ScaleColor(ColorB color, float scale)
|
|
{
|
|
Vec3 col((float) color.r, (float) color.g, (float) color.b);
|
|
col *= scale;
|
|
return(ColorB((uint8) col.x, (uint8)col.y, (uint8) col.z, color.a));
|
|
}
|
|
|
|
static inline uint32 AlphaFlags(const ColorB& colV)
|
|
{
|
|
if (colV.a > 0 && colV.a < 0xFF)
|
|
{
|
|
return e_AlphaBlended;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
CAuxGeomCB::CAuxGeomCB(IRenderAuxGeomImpl* pRenderAuxGeom)
|
|
: m_pRenderAuxGeom(pRenderAuxGeom)
|
|
, m_lastFlushPos(0)
|
|
{
|
|
assert(m_pRenderAuxGeom != 0);
|
|
m_cbCurrent = AddCBuffer();
|
|
}
|
|
|
|
CAuxGeomCB::~CAuxGeomCB()
|
|
{
|
|
for (CBList::iterator it = m_cbData.begin(); it != m_cbData.end(); ++it)
|
|
{
|
|
delete *it;
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::SetRenderFlags(const SAuxGeomRenderFlags& renderFlags)
|
|
{
|
|
// make sure caller only tries to set public bits
|
|
assert(0 == (renderFlags.m_renderFlags & ~e_PublicParamsMask));
|
|
m_cbCurrent->m_curRenderFlags = renderFlags;
|
|
}
|
|
|
|
|
|
SAuxGeomRenderFlags CAuxGeomCB::GetRenderFlags()
|
|
{
|
|
return(m_cbCurrent->m_curRenderFlags);
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawPoint(const Vec3& v, const ColorB& col, uint8 size)
|
|
{
|
|
assert(size > 0);
|
|
SAuxVertex* pVertex(0);
|
|
AddPrimitive(pVertex, 1, CreatePointRenderFlags(size));
|
|
|
|
pVertex->xyz = v;
|
|
pVertex->color.dcolor = PackColor(col);
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawPoints(const Vec3* v, uint32 numPoints, const ColorB& col, uint8 size)
|
|
{
|
|
assert(size > 0);
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, numPoints, CreatePointRenderFlags(size));
|
|
|
|
uint32 color(PackColor(col));
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = color;
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawPoints(const Vec3* v, uint32 numPoints, const ColorB* col, uint8 size)
|
|
{
|
|
assert(size > 0);
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, numPoints, CreatePointRenderFlags(size));
|
|
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = PackColor(col[ i ]);
|
|
}
|
|
}
|
|
|
|
void CAuxGeomCB::DrawLine(const Vec3& v0, const ColorB& colV0, const Vec3& v1, const ColorB& colV1, float thickness)
|
|
{
|
|
if (thickness <= 1.0f)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, 2, CreateLineRenderFlags(false) | AlphaFlags(colV0) | AlphaFlags(colV1));
|
|
|
|
pVertices[ 0 ].xyz = v0;
|
|
pVertices[ 0 ].color.dcolor = PackColor(colV0);
|
|
pVertices[ 1 ].xyz = v1;
|
|
pVertices[ 1 ].color.dcolor = PackColor(colV1);
|
|
}
|
|
else
|
|
{
|
|
DrawThickLine(v0, colV0, v1, colV1, thickness);
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawLines(const Vec3* v, uint32 numPoints, const ColorB& col, float thickness)
|
|
{
|
|
assert((numPoints >= 2) && (0 == (numPoints & 1)));
|
|
|
|
if (thickness <= 1.0f)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, numPoints, CreateLineRenderFlags(false) | AlphaFlags(col));
|
|
|
|
uint32 color(PackColor(col));
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = color;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (uint32 i(0); i < numPoints; i += 2)
|
|
{
|
|
DrawThickLine(v[ i ], col, v[ i + 1], col, thickness);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawLines(const Vec3* v, uint32 numPoints, const ColorB* col, float thickness)
|
|
{
|
|
assert((numPoints >= 2) && (0 == (numPoints & 1)));
|
|
|
|
if (thickness <= 1.0f)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, numPoints, CreateLineRenderFlags(false));
|
|
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = PackColor(col[ i ]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (uint32 i(0); i < numPoints; i += 2)
|
|
{
|
|
DrawThickLine(v[ i ], col[ i ], v[ i + 1], col[ i + 1 ], thickness);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawLines(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB& col, float thickness)
|
|
{
|
|
assert(numPoints >= 2);
|
|
assert((numIndices >= 2) && (0 == (numIndices & 1)));
|
|
|
|
if (thickness <= 1.0f)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
AddIndexedPrimitive(pVertices, numPoints, pIndices, numIndices, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
uint32 color(PackColor(col));
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = color;
|
|
}
|
|
|
|
memcpy(pIndices, ind, sizeof(pIndices[0]) * numIndices);
|
|
}
|
|
else
|
|
{
|
|
for (uint32 i(0); i < numIndices; i += 2)
|
|
{
|
|
DrawThickLine(v[ ind[ i ] ], col, v[ ind[ i + 1 ] ], col, thickness);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawLines(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB* col, float thickness)
|
|
{
|
|
assert(numPoints >= 2);
|
|
assert((numIndices >= 2) && (0 == (numIndices & 1)));
|
|
|
|
if (thickness <= 1.0f)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
AddIndexedPrimitive(pVertices, numPoints, pIndices, numIndices, CreateLineRenderFlags(true));
|
|
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = PackColor(col[ i ]);
|
|
}
|
|
|
|
memcpy(pIndices, ind, sizeof(pIndices[0]) * numIndices);
|
|
}
|
|
else
|
|
{
|
|
for (uint32 i(0); i < numIndices; i += 2)
|
|
{
|
|
DrawThickLine(v[ ind[ i ] ], col[ ind[ i ] ], v[ ind[ i + 1 ] ], col[ ind[ i + 1 ] ], thickness);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawPolyline(const Vec3* v, uint32 numPoints, bool closed, const ColorB& col, float thickness)
|
|
{
|
|
assert(numPoints >= 2);
|
|
assert(!closed || numPoints >= 3); // if "closed" then we need at least three vertices
|
|
|
|
if (thickness <= 1.0f)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
AddIndexedPrimitive(pVertices, numPoints, pIndices, (false != closed) ? 2 * numPoints : 2 * (numPoints - 1), CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
uint32 color(PackColor(col));
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = color;
|
|
}
|
|
|
|
for (uint32 i(0); i < numPoints - 1; ++i)
|
|
{
|
|
pIndices[ 0 ] = i;
|
|
pIndices[ 1 ] = i + 1;
|
|
pIndices += 2;
|
|
}
|
|
if (false != closed)
|
|
{
|
|
pIndices[ 0 ] = numPoints - 1;
|
|
pIndices[ 1 ] = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (uint32 i(0); i < numPoints - 1; ++i)
|
|
{
|
|
DrawThickLine(v[ i ], col, v[ i + 1 ], col, thickness);
|
|
}
|
|
if (false != closed)
|
|
{
|
|
DrawThickLine(v[ numPoints - 1 ], col, v[ 0 ], col, thickness);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawPolyline(const Vec3* v, uint32 numPoints, bool closed, const ColorB* col, float thickness)
|
|
{
|
|
assert(numPoints >= 2);
|
|
assert(!closed || numPoints >= 3); // if "closed" then we need at least three vertices
|
|
|
|
if (thickness <= 1.0f)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
AddIndexedPrimitive(pVertices, numPoints, pIndices, (false != closed) ? 2 * numPoints : 2 * (numPoints - 1), CreateLineRenderFlags(true));
|
|
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = PackColor(col[ i ]);
|
|
}
|
|
|
|
for (uint32 i(0); i < numPoints - 1; ++i)
|
|
{
|
|
pIndices[ 0 ] = i;
|
|
pIndices[ 1 ] = i + 1;
|
|
pIndices += 2;
|
|
}
|
|
if (false != closed)
|
|
{
|
|
pIndices[ 0 ] = numPoints - 1;
|
|
pIndices[ 1 ] = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (uint32 i(0); i < numPoints - 1; ++i)
|
|
{
|
|
DrawThickLine(v[ i ], col[ i ], v[ i + 1 ], col[ i + 1 ], thickness);
|
|
}
|
|
if (false != closed)
|
|
{
|
|
DrawThickLine(v[ numPoints - 1 ], col[ numPoints - 1 ], v[ 0 ], col[ 0 ], thickness);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawThickLine(const Vec3& v0, const ColorB& colV0, const Vec3& v1, const ColorB& colV1, float thickness)
|
|
{
|
|
assert(thickness > 0.0f);
|
|
assert(0 != gRenDev);
|
|
|
|
// allocate space for two triangles
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, 6, CreateTriangleRenderFlags(false) | e_TriListParam_ProcessThickLines);
|
|
|
|
// Encode paramaters for thick line in vertex memory.
|
|
// The actual "aux render" implementation has to process these before feeding it to the GPU.
|
|
// This was done as implementation needs access to several render specific informations
|
|
// (see D3DRenderAuxGeom.cpp for an implementation).
|
|
pVertices[ 0 ].xyz = v0;
|
|
pVertices[ 0 ].color.dcolor = PackColor(colV0);
|
|
pVertices[ 1 ].xyz = v1;
|
|
pVertices[ 1 ].color.dcolor = PackColor(colV1);
|
|
|
|
pVertices[ 2 ].xyz = Vec3(thickness, 0.0f, 0.0f);
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawTriangle(const Vec3& v0, const ColorB& colV0, const Vec3& v1, const ColorB& colV1, const Vec3& v2, const ColorB& colV2)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, 3, CreateTriangleRenderFlags(false));
|
|
|
|
pVertices[ 0 ].xyz = v0;
|
|
pVertices[ 0 ].color.dcolor = PackColor(colV0);
|
|
|
|
pVertices[ 1 ].xyz = v1;
|
|
pVertices[ 1 ].color.dcolor = PackColor(colV1);
|
|
|
|
pVertices[ 2 ].xyz = v2;
|
|
pVertices[ 2 ].color.dcolor = PackColor(colV2);
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawTriangles(const Vec3* v, uint32 numPoints, const ColorB& col)
|
|
{
|
|
assert((numPoints >= 3) && (0 == (numPoints % 3)));
|
|
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, numPoints, CreateTriangleRenderFlags(false));
|
|
|
|
uint32 color(PackColor(col));
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = color;
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawTriangles(const Vec3* v, uint32 numPoints, const ColorB* col)
|
|
{
|
|
assert((numPoints >= 3) && (0 == (numPoints % 3)));
|
|
|
|
SAuxVertex* pVertices(0);
|
|
AddPrimitive(pVertices, numPoints, CreateTriangleRenderFlags(false));
|
|
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = PackColor(col[ i ]);
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawTriangles(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB& col)
|
|
{
|
|
assert(numPoints >= 3);
|
|
assert((numIndices >= 3) && (0 == (numIndices % 3)));
|
|
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
AddIndexedPrimitive(pVertices, numPoints, pIndices, numIndices, CreateTriangleRenderFlags(true));
|
|
|
|
uint32 color(PackColor(col));
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = color;
|
|
}
|
|
|
|
memcpy(pIndices, ind, sizeof(pIndices[0]) * numIndices);
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawTriangles(const Vec3* v, uint32 numPoints, const vtx_idx* ind, uint32 numIndices, const ColorB* col)
|
|
{
|
|
assert(numPoints >= 3);
|
|
assert((numIndices >= 3) && (0 == (numIndices % 3)));
|
|
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
AddIndexedPrimitive(pVertices, numPoints, pIndices, numIndices, CreateTriangleRenderFlags(true));
|
|
|
|
for (uint32 i(0); i < numPoints; ++i)
|
|
{
|
|
pVertices[ i ].xyz = v[ i ];
|
|
pVertices[ i ].color.dcolor = PackColor(col[ i ]);
|
|
}
|
|
|
|
memcpy(pIndices, ind, sizeof(pIndices[0]) * numIndices);
|
|
}
|
|
|
|
void CAuxGeomCB::DrawQuad(float width, float height, const Matrix34& matWorld, const ColorB& col, bool drawShaded)
|
|
{
|
|
if (width <= 0.0f && height <= 0.0f)
|
|
{
|
|
return;
|
|
}
|
|
|
|
SAuxDrawObjParams* pDrawParams(0);
|
|
AddObject(pDrawParams, CreateObjectRenderFlags(eDOT_Quad));
|
|
|
|
Matrix34 scaleMatrix = Matrix33::CreateScale(Vec3(width, 1.0f, height));
|
|
Matrix34 finalMatrix = matWorld * scaleMatrix;
|
|
|
|
Matrix33 rotationMatrix;
|
|
matWorld.GetRotation33(rotationMatrix);
|
|
|
|
pDrawParams->m_matWorld = finalMatrix;
|
|
pDrawParams->m_matWorldRotation = rotationMatrix;
|
|
pDrawParams->m_color = PackColor(col);
|
|
pDrawParams->m_size = max(width, height) * 0.5f;
|
|
pDrawParams->m_shaded = drawShaded;
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawAABB(const AABB& aabb, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
|
|
if (eBBD_Extremes_Color_Encoded == bbDrawStyle)
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 24, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 1;
|
|
pIndices[ 3 ] = 2;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
pIndices[ 6 ] = 3;
|
|
pIndices[ 7 ] = 0;
|
|
|
|
pIndices[ 8 ] = 4;
|
|
pIndices[ 9 ] = 5;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 6;
|
|
pIndices[ 12 ] = 6;
|
|
pIndices[ 13 ] = 7;
|
|
pIndices[ 14 ] = 7;
|
|
pIndices[ 15 ] = 4;
|
|
|
|
pIndices[ 16 ] = 0;
|
|
pIndices[ 17 ] = 4;
|
|
pIndices[ 18 ] = 1;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 2;
|
|
pIndices[ 21 ] = 6;
|
|
pIndices[ 22 ] = 3;
|
|
pIndices[ 23 ] = 7;
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 36, CreateTriangleRenderFlags(true));
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 2;
|
|
pIndices[ 3 ] = 0;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
|
|
pIndices[ 6 ] = 7;
|
|
pIndices[ 7 ] = 6;
|
|
pIndices[ 8 ] = 5;
|
|
pIndices[ 9 ] = 7;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 4;
|
|
|
|
pIndices[ 12 ] = 3;
|
|
pIndices[ 13 ] = 2;
|
|
pIndices[ 14 ] = 6;
|
|
pIndices[ 15 ] = 3;
|
|
pIndices[ 16 ] = 6;
|
|
pIndices[ 17 ] = 7;
|
|
|
|
pIndices[ 18 ] = 4;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 1;
|
|
pIndices[ 21 ] = 4;
|
|
pIndices[ 22 ] = 1;
|
|
pIndices[ 23 ] = 0;
|
|
|
|
pIndices[ 24 ] = 1;
|
|
pIndices[ 25 ] = 5;
|
|
pIndices[ 26 ] = 6;
|
|
pIndices[ 27 ] = 1;
|
|
pIndices[ 28 ] = 6;
|
|
pIndices[ 29 ] = 2;
|
|
|
|
pIndices[ 30 ] = 4;
|
|
pIndices[ 31 ] = 0;
|
|
pIndices[ 32 ] = 3;
|
|
pIndices[ 33 ] = 4;
|
|
pIndices[ 34 ] = 3;
|
|
pIndices[ 35 ] = 7;
|
|
}
|
|
|
|
uint32 color(PackColor(col));
|
|
uint32 colorMin(PackColor(ColorB(15, 15, 15, col.a)));
|
|
uint32 colorMax(PackColor(ColorB(255, 255, 255, col.a)));
|
|
|
|
pVertices[ 0 ].xyz = Vec3(aabb.min.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ 0 ].color.dcolor = colorMin;
|
|
pVertices[ 1 ].xyz = Vec3(aabb.min.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ 1 ].color.dcolor = color;
|
|
pVertices[ 2 ].xyz = Vec3(aabb.max.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ 2 ].color.dcolor = color;
|
|
pVertices[ 3 ].xyz = Vec3(aabb.max.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ 3 ].color.dcolor = color;
|
|
pVertices[ 4 ].xyz = Vec3(aabb.min.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ 4 ].color.dcolor = color;
|
|
pVertices[ 5 ].xyz = Vec3(aabb.min.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ 5 ].color.dcolor = color;
|
|
pVertices[ 6 ].xyz = Vec3(aabb.max.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ 6 ].color.dcolor = colorMax;
|
|
pVertices[ 7 ].xyz = Vec3(aabb.max.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ 7 ].color.dcolor = color;
|
|
}
|
|
else
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 24, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
uint32 color(PackColor(col));
|
|
|
|
pVertices[ 0 ].xyz = Vec3(aabb.min.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ 0 ].color.dcolor = color;
|
|
pVertices[ 1 ].xyz = Vec3(aabb.min.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ 1 ].color.dcolor = color;
|
|
pVertices[ 2 ].xyz = Vec3(aabb.max.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ 2 ].color.dcolor = color;
|
|
pVertices[ 3 ].xyz = Vec3(aabb.max.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ 3 ].color.dcolor = color;
|
|
pVertices[ 4 ].xyz = Vec3(aabb.min.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ 4 ].color.dcolor = color;
|
|
pVertices[ 5 ].xyz = Vec3(aabb.min.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ 5 ].color.dcolor = color;
|
|
pVertices[ 6 ].xyz = Vec3(aabb.max.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ 6 ].color.dcolor = color;
|
|
pVertices[ 7 ].xyz = Vec3(aabb.max.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ 7 ].color.dcolor = color;
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 1;
|
|
pIndices[ 3 ] = 2;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
pIndices[ 6 ] = 3;
|
|
pIndices[ 7 ] = 0;
|
|
|
|
pIndices[ 8 ] = 4;
|
|
pIndices[ 9 ] = 5;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 6;
|
|
pIndices[ 12 ] = 6;
|
|
pIndices[ 13 ] = 7;
|
|
pIndices[ 14 ] = 7;
|
|
pIndices[ 15 ] = 4;
|
|
|
|
pIndices[ 16 ] = 0;
|
|
pIndices[ 17 ] = 4;
|
|
pIndices[ 18 ] = 1;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 2;
|
|
pIndices[ 21 ] = 6;
|
|
pIndices[ 22 ] = 3;
|
|
pIndices[ 23 ] = 7;
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 24, pIndices, 36, CreateTriangleRenderFlags(true));
|
|
|
|
Vec3 xyz(aabb.min.x, aabb.min.y, aabb.min.z);
|
|
Vec3 xyZ(aabb.min.x, aabb.min.y, aabb.max.z);
|
|
Vec3 xYz(aabb.min.x, aabb.max.y, aabb.min.z);
|
|
Vec3 xYZ(aabb.min.x, aabb.max.y, aabb.max.z);
|
|
Vec3 Xyz(aabb.max.x, aabb.min.y, aabb.min.z);
|
|
Vec3 XyZ(aabb.max.x, aabb.min.y, aabb.max.z);
|
|
Vec3 XYz(aabb.max.x, aabb.max.y, aabb.min.z);
|
|
Vec3 XYZ(aabb.max.x, aabb.max.y, aabb.max.z);
|
|
|
|
uint32 colDown(PackColor(ScaleColor(col, 0.5f)));
|
|
pVertices[ 0 ].xyz = xyz;
|
|
pVertices[ 0 ].color.dcolor = colDown;
|
|
pVertices[ 1 ].xyz = xYz;
|
|
pVertices[ 1 ].color.dcolor = colDown;
|
|
pVertices[ 2 ].xyz = XYz;
|
|
pVertices[ 2 ].color.dcolor = colDown;
|
|
pVertices[ 3 ].xyz = Xyz;
|
|
pVertices[ 3 ].color.dcolor = colDown;
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 2;
|
|
pIndices[ 3 ] = 0;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
|
|
uint32 colTop(PackColor(col));
|
|
pVertices[ 4 ].xyz = xyZ;
|
|
pVertices[ 4 ].color.dcolor = colTop;
|
|
pVertices[ 5 ].xyz = XyZ;
|
|
pVertices[ 5 ].color.dcolor = colTop;
|
|
pVertices[ 6 ].xyz = XYZ;
|
|
pVertices[ 6 ].color.dcolor = colTop;
|
|
pVertices[ 7 ].xyz = xYZ;
|
|
pVertices[ 7 ].color.dcolor = colTop;
|
|
|
|
pIndices[ 6 ] = 4;
|
|
pIndices[ 7 ] = 5;
|
|
pIndices[ 8 ] = 6;
|
|
pIndices[ 9 ] = 4;
|
|
pIndices[ 10 ] = 6;
|
|
pIndices[ 11 ] = 7;
|
|
|
|
uint32 colBack(PackColor(ScaleColor(col, 0.6f)));
|
|
pVertices[ 8 ].xyz = xyz;
|
|
pVertices[ 8 ].color.dcolor = colBack;
|
|
pVertices[ 9 ].xyz = Xyz;
|
|
pVertices[ 9 ].color.dcolor = colBack;
|
|
pVertices[ 10 ].xyz = XyZ;
|
|
pVertices[ 10 ].color.dcolor = colBack;
|
|
pVertices[ 11 ].xyz = xyZ;
|
|
pVertices[ 11 ].color.dcolor = colBack;
|
|
|
|
pIndices[ 12 ] = 8;
|
|
pIndices[ 13 ] = 9;
|
|
pIndices[ 14 ] = 10;
|
|
pIndices[ 15 ] = 8;
|
|
pIndices[ 16 ] = 10;
|
|
pIndices[ 17 ] = 11;
|
|
|
|
uint32 colFront(PackColor(ScaleColor(col, 0.9f)));
|
|
pVertices[ 12 ].xyz = xYz;
|
|
pVertices[ 12 ].color.dcolor = colFront;
|
|
pVertices[ 13 ].xyz = xYZ;
|
|
pVertices[ 13 ].color.dcolor = colFront;
|
|
pVertices[ 14 ].xyz = XYZ;
|
|
pVertices[ 14 ].color.dcolor = colFront;
|
|
pVertices[ 15 ].xyz = XYz;
|
|
pVertices[ 15 ].color.dcolor = colFront;
|
|
|
|
pIndices[ 18 ] = 12;
|
|
pIndices[ 19 ] = 13;
|
|
pIndices[ 20 ] = 14;
|
|
pIndices[ 21 ] = 12;
|
|
pIndices[ 22 ] = 14;
|
|
pIndices[ 23 ] = 15;
|
|
|
|
uint32 colLeft(PackColor(ScaleColor(col, 0.7f)));
|
|
pVertices[ 16 ].xyz = xyz;
|
|
pVertices[ 16 ].color.dcolor = colLeft;
|
|
pVertices[ 17 ].xyz = xyZ;
|
|
pVertices[ 17 ].color.dcolor = colLeft;
|
|
pVertices[ 18 ].xyz = xYZ;
|
|
pVertices[ 18 ].color.dcolor = colLeft;
|
|
pVertices[ 19 ].xyz = xYz;
|
|
pVertices[ 19 ].color.dcolor = colLeft;
|
|
|
|
pIndices[ 24 ] = 16;
|
|
pIndices[ 25 ] = 17;
|
|
pIndices[ 26 ] = 18;
|
|
pIndices[ 27 ] = 16;
|
|
pIndices[ 28 ] = 18;
|
|
pIndices[ 29 ] = 19;
|
|
|
|
uint32 colRight(PackColor(ScaleColor(col, 0.8f)));
|
|
pVertices[ 20 ].xyz = Xyz;
|
|
pVertices[ 20 ].color.dcolor = colRight;
|
|
pVertices[ 21 ].xyz = XYz;
|
|
pVertices[ 21 ].color.dcolor = colRight;
|
|
pVertices[ 22 ].xyz = XYZ;
|
|
pVertices[ 22 ].color.dcolor = colRight;
|
|
pVertices[ 23 ].xyz = XyZ;
|
|
pVertices[ 23 ].color.dcolor = colRight;
|
|
|
|
pIndices[ 30 ] = 20;
|
|
pIndices[ 31 ] = 21;
|
|
pIndices[ 32 ] = 22;
|
|
pIndices[ 33 ] = 20;
|
|
pIndices[ 34 ] = 22;
|
|
pIndices[ 35 ] = 23;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawAABBs(const AABB* aabbs, uint32 aabbCount, bool bSolid, const ColorB& col,
|
|
const EBoundingBoxDrawStyle& bbDrawStyle)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
|
|
if (eBBD_Extremes_Color_Encoded == bbDrawStyle)
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8 * aabbCount, pIndices, 24 * aabbCount, CreateLineRenderFlags(true));
|
|
|
|
for (size_t i = 0; i < aabbCount; ++i)
|
|
{
|
|
size_t n = i * 24;
|
|
size_t nv = i * 8;
|
|
pIndices[ n + 0 ] = 0;
|
|
pIndices[ n + 1 ] = nv + 1;
|
|
pIndices[ n + 2 ] = 1;
|
|
pIndices[ n + 3 ] = nv + 2;
|
|
pIndices[ n + 4 ] = 2;
|
|
pIndices[ n + 5 ] = nv + 3;
|
|
pIndices[ n + 6 ] = 3;
|
|
pIndices[ n + 7 ] = nv + 0;
|
|
|
|
pIndices[ n + 8 ] = 4;
|
|
pIndices[ n + 9 ] = nv + 5;
|
|
pIndices[ n + 10 ] = 5;
|
|
pIndices[ n + 11 ] = nv + 6;
|
|
pIndices[ n + 12 ] = 6;
|
|
pIndices[ n + 13 ] = nv + 7;
|
|
pIndices[ n + 14 ] = 7;
|
|
pIndices[ n + 15 ] = nv + 4;
|
|
|
|
pIndices[ n + 16 ] = 0;
|
|
pIndices[ n + 17 ] = nv + 4;
|
|
pIndices[ n + 18 ] = 1;
|
|
pIndices[ n + 19 ] = nv + 5;
|
|
pIndices[ n + 20 ] = 2;
|
|
pIndices[ n + 21 ] = nv + 6;
|
|
pIndices[ n + 22 ] = 3;
|
|
pIndices[ n + 23 ] = nv + 7;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8 * aabbCount, pIndices, 36 * aabbCount, CreateTriangleRenderFlags(true));
|
|
|
|
for (size_t i = 0; i < aabbCount; ++i)
|
|
{
|
|
size_t n = i * 36;
|
|
size_t nv = i * 8;
|
|
|
|
pIndices[ n + 0 ] = nv + 0;
|
|
pIndices[ n + 1 ] = nv + 1;
|
|
pIndices[ n + 2 ] = nv + 2;
|
|
pIndices[ n + 3 ] = nv + 0;
|
|
pIndices[ n + 4 ] = nv + 2;
|
|
pIndices[ n + 5 ] = nv + 3;
|
|
|
|
pIndices[ n + 6 ] = nv + 7;
|
|
pIndices[ n + 7 ] = nv + 6;
|
|
pIndices[ n + 8 ] = nv + 5;
|
|
pIndices[ n + 9 ] = nv + 7;
|
|
pIndices[ n + 10 ] = nv + 5;
|
|
pIndices[ n + 11 ] = nv + 4;
|
|
|
|
pIndices[ n + 12 ] = nv + 3;
|
|
pIndices[ n + 13 ] = nv + 2;
|
|
pIndices[ n + 14 ] = nv + 6;
|
|
pIndices[ n + 15 ] = nv + 3;
|
|
pIndices[ n + 16 ] = nv + 6;
|
|
pIndices[ n + 17 ] = nv + 7;
|
|
|
|
pIndices[ n + 18 ] = nv + 4;
|
|
pIndices[ n + 19 ] = nv + 5;
|
|
pIndices[ n + 20 ] = nv + 1;
|
|
pIndices[ n + 21 ] = nv + 4;
|
|
pIndices[ n + 22 ] = nv + 1;
|
|
pIndices[ n + 23 ] = nv + 0;
|
|
|
|
pIndices[ n + 24 ] = nv + 1;
|
|
pIndices[ n + 25 ] = nv + 5;
|
|
pIndices[ n + 26 ] = nv + 6;
|
|
pIndices[ n + 27 ] = nv + 1;
|
|
pIndices[ n + 28 ] = nv + 6;
|
|
pIndices[ n + 29 ] = nv + 2;
|
|
|
|
pIndices[ n + 30 ] = nv + 4;
|
|
pIndices[ n + 31 ] = nv + 0;
|
|
pIndices[ n + 32 ] = nv + 3;
|
|
pIndices[ n + 33 ] = nv + 4;
|
|
pIndices[ n + 34 ] = nv + 3;
|
|
pIndices[ n + 35 ] = nv + 7;
|
|
}
|
|
}
|
|
|
|
uint32 color(PackColor(col));
|
|
uint32 colorMin(PackColor(ColorB(15, 15, 15, col.a)));
|
|
uint32 colorMax(PackColor(ColorB(255, 255, 255, col.a)));
|
|
|
|
for (size_t i = 0; i < aabbCount; ++i)
|
|
{
|
|
const AABB& aabb = aabbs[i];
|
|
|
|
size_t n = i * 8;
|
|
pVertices[ n + 0 ].xyz = Vec3(aabb.min.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ n + 0 ].color.dcolor = colorMin;
|
|
pVertices[ n + 1 ].xyz = Vec3(aabb.min.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ n + 1 ].color.dcolor = color;
|
|
pVertices[ n + 2 ].xyz = Vec3(aabb.max.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ n + 2 ].color.dcolor = color;
|
|
pVertices[ n + 3 ].xyz = Vec3(aabb.max.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ n + 3 ].color.dcolor = color;
|
|
pVertices[ n + 4 ].xyz = Vec3(aabb.min.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ n + 4 ].color.dcolor = color;
|
|
pVertices[ n + 5 ].xyz = Vec3(aabb.min.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ n + 5 ].color.dcolor = color;
|
|
pVertices[ n + 6 ].xyz = Vec3(aabb.max.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ n + 6 ].color.dcolor = colorMax;
|
|
pVertices[ n + 7 ].xyz = Vec3(aabb.max.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ n + 7 ].color.dcolor = color;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8 * aabbCount, pIndices, 24 * aabbCount, CreateLineRenderFlags(true));
|
|
|
|
uint32 color(PackColor(col));
|
|
|
|
for (size_t i = 0; i < aabbCount; ++i)
|
|
{
|
|
const AABB& aabb = aabbs[i];
|
|
size_t nv = i * 24;
|
|
size_t n = i * 8;
|
|
|
|
pVertices[ nv + 0 ].xyz = Vec3(aabb.min.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ nv + 0 ].color.dcolor = color;
|
|
pVertices[ nv + 1 ].xyz = Vec3(aabb.min.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ nv + 1 ].color.dcolor = color;
|
|
pVertices[ nv + 2 ].xyz = Vec3(aabb.max.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ nv + 2 ].color.dcolor = color;
|
|
pVertices[ nv + 3 ].xyz = Vec3(aabb.max.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ nv + 3 ].color.dcolor = color;
|
|
pVertices[ nv + 4 ].xyz = Vec3(aabb.min.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ nv + 4 ].color.dcolor = color;
|
|
pVertices[ nv + 5 ].xyz = Vec3(aabb.min.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ nv + 5 ].color.dcolor = color;
|
|
pVertices[ nv + 6 ].xyz = Vec3(aabb.max.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ nv + 6 ].color.dcolor = color;
|
|
pVertices[ nv + 7 ].xyz = Vec3(aabb.max.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ nv + 7 ].color.dcolor = color;
|
|
|
|
pIndices[ n + 0 ] = nv + 0;
|
|
pIndices[ n + 1 ] = nv + 1;
|
|
pIndices[ n + 2 ] = nv + 1;
|
|
pIndices[ n + 3 ] = nv + 2;
|
|
pIndices[ n + 4 ] = nv + 2;
|
|
pIndices[ n + 5 ] = nv + 3;
|
|
pIndices[ n + 6 ] = nv + 3;
|
|
pIndices[ n + 7 ] = nv + 0;
|
|
|
|
pIndices[ n + 8 ] = nv + 4;
|
|
pIndices[ n + 9 ] = nv + 5;
|
|
pIndices[ n + 10 ] = nv + 5;
|
|
pIndices[ n + 11 ] = nv + 6;
|
|
pIndices[ n + 12 ] = nv + 6;
|
|
pIndices[ n + 13 ] = nv + 7;
|
|
pIndices[ n + 14 ] = nv + 7;
|
|
pIndices[ n + 15 ] = nv + 4;
|
|
|
|
pIndices[ n + 16 ] = nv + 0;
|
|
pIndices[ n + 17 ] = nv + 4;
|
|
pIndices[ n + 18 ] = nv + 1;
|
|
pIndices[ n + 19 ] = nv + 5;
|
|
pIndices[ n + 20 ] = nv + 2;
|
|
pIndices[ n + 21 ] = nv + 6;
|
|
pIndices[ n + 22 ] = nv + 3;
|
|
pIndices[ n + 23 ] = nv + 7;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 24 * aabbCount, pIndices, 36 * aabbCount, CreateTriangleRenderFlags(true));
|
|
|
|
for (size_t i = 0; i < aabbCount; ++i)
|
|
{
|
|
const AABB& aabb = aabbs[i];
|
|
|
|
size_t n = i * 36;
|
|
size_t nv = i * 24;
|
|
|
|
Vec3 xyz(aabb.min.x, aabb.min.y, aabb.min.z);
|
|
Vec3 xyZ(aabb.min.x, aabb.min.y, aabb.max.z);
|
|
Vec3 xYz(aabb.min.x, aabb.max.y, aabb.min.z);
|
|
Vec3 xYZ(aabb.min.x, aabb.max.y, aabb.max.z);
|
|
Vec3 Xyz(aabb.max.x, aabb.min.y, aabb.min.z);
|
|
Vec3 XyZ(aabb.max.x, aabb.min.y, aabb.max.z);
|
|
Vec3 XYz(aabb.max.x, aabb.max.y, aabb.min.z);
|
|
Vec3 XYZ(aabb.max.x, aabb.max.y, aabb.max.z);
|
|
|
|
uint32 colDown(PackColor(ScaleColor(col, 0.5f)));
|
|
pVertices[ nv + 0 ].xyz = xyz;
|
|
pVertices[ nv + 0 ].color.dcolor = colDown;
|
|
pVertices[ nv + 1 ].xyz = xYz;
|
|
pVertices[ nv + 1 ].color.dcolor = colDown;
|
|
pVertices[ nv + 2 ].xyz = XYz;
|
|
pVertices[ nv + 2 ].color.dcolor = colDown;
|
|
pVertices[ nv + 3 ].xyz = Xyz;
|
|
pVertices[ nv + 3 ].color.dcolor = colDown;
|
|
|
|
pIndices[ n + 0 ] = nv + 0;
|
|
pIndices[ n + 1 ] = nv + 1;
|
|
pIndices[ n + 2 ] = nv + 2;
|
|
pIndices[ n + 3 ] = nv + 0;
|
|
pIndices[ n + 4 ] = nv + 2;
|
|
pIndices[ n + 5 ] = nv + 3;
|
|
|
|
uint32 colTop(PackColor(col));
|
|
pVertices[ nv + 4 ].xyz = xyZ;
|
|
pVertices[ nv + 4 ].color.dcolor = colTop;
|
|
pVertices[ nv + 5 ].xyz = XyZ;
|
|
pVertices[ nv + 5 ].color.dcolor = colTop;
|
|
pVertices[ nv + 6 ].xyz = XYZ;
|
|
pVertices[ nv + 6 ].color.dcolor = colTop;
|
|
pVertices[ nv + 7 ].xyz = xYZ;
|
|
pVertices[ nv + 7 ].color.dcolor = colTop;
|
|
|
|
pIndices[ n + 6 ] = nv + 4;
|
|
pIndices[ n + 7 ] = nv + 5;
|
|
pIndices[ n + 8 ] = nv + 6;
|
|
pIndices[ n + 9 ] = nv + 4;
|
|
pIndices[ n + 10 ] = nv + 6;
|
|
pIndices[ n + 11 ] = nv + 7;
|
|
|
|
uint32 colBack(PackColor(ScaleColor(col, 0.6f)));
|
|
pVertices[ nv + 8 ].xyz = xyz;
|
|
pVertices[ nv + 8 ].color.dcolor = colBack;
|
|
pVertices[ nv + 9 ].xyz = Xyz;
|
|
pVertices[ nv + 9 ].color.dcolor = colBack;
|
|
pVertices[ nv + 10 ].xyz = XyZ;
|
|
pVertices[ nv + 10 ].color.dcolor = colBack;
|
|
pVertices[ nv + 11 ].xyz = xyZ;
|
|
pVertices[ nv + 11 ].color.dcolor = colBack;
|
|
|
|
pIndices[ n + 12 ] = nv + 8;
|
|
pIndices[ n + 13 ] = nv + 9;
|
|
pIndices[ n + 14 ] = nv + 10;
|
|
pIndices[ n + 15 ] = nv + 8;
|
|
pIndices[ n + 16 ] = nv + 10;
|
|
pIndices[ n + 17 ] = nv + 11;
|
|
|
|
uint32 colFront(PackColor(ScaleColor(col, 0.9f)));
|
|
pVertices[ nv + 12 ].xyz = xYz;
|
|
pVertices[ nv + 12 ].color.dcolor = colFront;
|
|
pVertices[ nv + 13 ].xyz = xYZ;
|
|
pVertices[ nv + 13 ].color.dcolor = colFront;
|
|
pVertices[ nv + 14 ].xyz = XYZ;
|
|
pVertices[ nv + 14 ].color.dcolor = colFront;
|
|
pVertices[ nv + 15 ].xyz = XYz;
|
|
pVertices[ nv + 15 ].color.dcolor = colFront;
|
|
|
|
pIndices[ n + 18 ] = nv + 12;
|
|
pIndices[ n + 19 ] = nv + 13;
|
|
pIndices[ n + 20 ] = nv + 14;
|
|
pIndices[ n + 21 ] = nv + 12;
|
|
pIndices[ n + 22 ] = nv + 14;
|
|
pIndices[ n + 23 ] = nv + 15;
|
|
|
|
uint32 colLeft(PackColor(ScaleColor(col, 0.7f)));
|
|
pVertices[ nv + 16 ].xyz = xyz;
|
|
pVertices[ nv + 16 ].color.dcolor = colLeft;
|
|
pVertices[ nv + 17 ].xyz = xyZ;
|
|
pVertices[ nv + 17 ].color.dcolor = colLeft;
|
|
pVertices[ nv + 18 ].xyz = xYZ;
|
|
pVertices[ nv + 18 ].color.dcolor = colLeft;
|
|
pVertices[ nv + 19 ].xyz = xYz;
|
|
pVertices[ nv + 19 ].color.dcolor = colLeft;
|
|
|
|
pIndices[ n + 24 ] = nv + 16;
|
|
pIndices[ n + 25 ] = nv + 17;
|
|
pIndices[ n + 26 ] = nv + 18;
|
|
pIndices[ n + 27 ] = nv + 16;
|
|
pIndices[ n + 28 ] = nv + 18;
|
|
pIndices[ n + 29 ] = nv + 19;
|
|
|
|
uint32 colRight(PackColor(ScaleColor(col, 0.8f)));
|
|
pVertices[ nv + 20 ].xyz = Xyz;
|
|
pVertices[ nv + 20 ].color.dcolor = colRight;
|
|
pVertices[ nv + 21 ].xyz = XYz;
|
|
pVertices[ nv + 21 ].color.dcolor = colRight;
|
|
pVertices[ nv + 22 ].xyz = XYZ;
|
|
pVertices[ nv + 22 ].color.dcolor = colRight;
|
|
pVertices[ nv + 23 ].xyz = XyZ;
|
|
pVertices[ nv + 23 ].color.dcolor = colRight;
|
|
|
|
pIndices[ n + 30 ] = nv + 20;
|
|
pIndices[ n + 31 ] = nv + 21;
|
|
pIndices[ n + 32 ] = nv + 22;
|
|
pIndices[ n + 33 ] = nv + 20;
|
|
pIndices[ n + 34 ] = nv + 22;
|
|
pIndices[ n + 35 ] = nv + 23;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAuxGeomCB::DrawAABB(const AABB& aabb, const Matrix34& matWorld, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
|
|
if (eBBD_Extremes_Color_Encoded == bbDrawStyle)
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 24, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 1;
|
|
pIndices[ 3 ] = 2;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
pIndices[ 6 ] = 3;
|
|
pIndices[ 7 ] = 0;
|
|
|
|
pIndices[ 8 ] = 4;
|
|
pIndices[ 9 ] = 5;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 6;
|
|
pIndices[ 12 ] = 6;
|
|
pIndices[ 13 ] = 7;
|
|
pIndices[ 14 ] = 7;
|
|
pIndices[ 15 ] = 4;
|
|
|
|
pIndices[ 16 ] = 0;
|
|
pIndices[ 17 ] = 4;
|
|
pIndices[ 18 ] = 1;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 2;
|
|
pIndices[ 21 ] = 6;
|
|
pIndices[ 22 ] = 3;
|
|
pIndices[ 23 ] = 7;
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 36, CreateTriangleRenderFlags(true));
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 2;
|
|
pIndices[ 3 ] = 0;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
|
|
pIndices[ 6 ] = 7;
|
|
pIndices[ 7 ] = 6;
|
|
pIndices[ 8 ] = 5;
|
|
pIndices[ 9 ] = 7;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 4;
|
|
|
|
pIndices[ 12 ] = 3;
|
|
pIndices[ 13 ] = 2;
|
|
pIndices[ 14 ] = 6;
|
|
pIndices[ 15 ] = 3;
|
|
pIndices[ 16 ] = 6;
|
|
pIndices[ 17 ] = 7;
|
|
|
|
pIndices[ 18 ] = 4;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 1;
|
|
pIndices[ 21 ] = 4;
|
|
pIndices[ 22 ] = 1;
|
|
pIndices[ 23 ] = 0;
|
|
|
|
pIndices[ 24 ] = 1;
|
|
pIndices[ 25 ] = 5;
|
|
pIndices[ 26 ] = 6;
|
|
pIndices[ 27 ] = 1;
|
|
pIndices[ 28 ] = 6;
|
|
pIndices[ 29 ] = 2;
|
|
|
|
pIndices[ 30 ] = 4;
|
|
pIndices[ 31 ] = 0;
|
|
pIndices[ 32 ] = 3;
|
|
pIndices[ 33 ] = 4;
|
|
pIndices[ 34 ] = 3;
|
|
pIndices[ 35 ] = 7;
|
|
}
|
|
|
|
uint32 color(PackColor(col));
|
|
uint32 colorMin(PackColor(ColorB(15, 15, 15, col.a)));
|
|
uint32 colorMax(PackColor(ColorB(255, 255, 255, col.a)));
|
|
|
|
pVertices[ 0 ].xyz = matWorld * Vec3(aabb.min.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ 0 ].color.dcolor = colorMin;
|
|
pVertices[ 1 ].xyz = matWorld * Vec3(aabb.min.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ 1 ].color.dcolor = color;
|
|
pVertices[ 2 ].xyz = matWorld * Vec3(aabb.max.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ 2 ].color.dcolor = color;
|
|
pVertices[ 3 ].xyz = matWorld * Vec3(aabb.max.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ 3 ].color.dcolor = color;
|
|
pVertices[ 4 ].xyz = matWorld * Vec3(aabb.min.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ 4 ].color.dcolor = color;
|
|
pVertices[ 5 ].xyz = matWorld * Vec3(aabb.min.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ 5 ].color.dcolor = color;
|
|
pVertices[ 6 ].xyz = matWorld * Vec3(aabb.max.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ 6 ].color.dcolor = colorMax;
|
|
pVertices[ 7 ].xyz = matWorld * Vec3(aabb.max.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ 7 ].color.dcolor = color;
|
|
}
|
|
else
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 24, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
uint32 color(PackColor(col));
|
|
|
|
pVertices[ 0 ].xyz = matWorld * Vec3(aabb.min.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ 0 ].color.dcolor = color;
|
|
pVertices[ 1 ].xyz = matWorld * Vec3(aabb.min.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ 1 ].color.dcolor = color;
|
|
pVertices[ 2 ].xyz = matWorld * Vec3(aabb.max.x, aabb.max.y, aabb.min.z);
|
|
pVertices[ 2 ].color.dcolor = color;
|
|
pVertices[ 3 ].xyz = matWorld * Vec3(aabb.max.x, aabb.min.y, aabb.min.z);
|
|
pVertices[ 3 ].color.dcolor = color;
|
|
pVertices[ 4 ].xyz = matWorld * Vec3(aabb.min.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ 4 ].color.dcolor = color;
|
|
pVertices[ 5 ].xyz = matWorld * Vec3(aabb.min.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ 5 ].color.dcolor = color;
|
|
pVertices[ 6 ].xyz = matWorld * Vec3(aabb.max.x, aabb.max.y, aabb.max.z);
|
|
pVertices[ 6 ].color.dcolor = color;
|
|
pVertices[ 7 ].xyz = matWorld * Vec3(aabb.max.x, aabb.min.y, aabb.max.z);
|
|
pVertices[ 7 ].color.dcolor = color;
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 1;
|
|
pIndices[ 3 ] = 2;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
pIndices[ 6 ] = 3;
|
|
pIndices[ 7 ] = 0;
|
|
|
|
pIndices[ 8 ] = 4;
|
|
pIndices[ 9 ] = 5;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 6;
|
|
pIndices[ 12 ] = 6;
|
|
pIndices[ 13 ] = 7;
|
|
pIndices[ 14 ] = 7;
|
|
pIndices[ 15 ] = 4;
|
|
|
|
pIndices[ 16 ] = 0;
|
|
pIndices[ 17 ] = 4;
|
|
pIndices[ 18 ] = 1;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 2;
|
|
pIndices[ 21 ] = 6;
|
|
pIndices[ 22 ] = 3;
|
|
pIndices[ 23 ] = 7;
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 24, pIndices, 36, CreateTriangleRenderFlags(true));
|
|
|
|
Vec3 xyz(matWorld * Vec3(aabb.min.x, aabb.min.y, aabb.min.z));
|
|
Vec3 xyZ(matWorld * Vec3(aabb.min.x, aabb.min.y, aabb.max.z));
|
|
Vec3 xYz(matWorld * Vec3(aabb.min.x, aabb.max.y, aabb.min.z));
|
|
Vec3 xYZ(matWorld * Vec3(aabb.min.x, aabb.max.y, aabb.max.z));
|
|
Vec3 Xyz(matWorld * Vec3(aabb.max.x, aabb.min.y, aabb.min.z));
|
|
Vec3 XyZ(matWorld * Vec3(aabb.max.x, aabb.min.y, aabb.max.z));
|
|
Vec3 XYz(matWorld * Vec3(aabb.max.x, aabb.max.y, aabb.min.z));
|
|
Vec3 XYZ(matWorld * Vec3(aabb.max.x, aabb.max.y, aabb.max.z));
|
|
|
|
uint32 colDown(PackColor(ScaleColor(col, 0.5f)));
|
|
pVertices[ 0 ].xyz = xyz;
|
|
pVertices[ 0 ].color.dcolor = colDown;
|
|
pVertices[ 1 ].xyz = xYz;
|
|
pVertices[ 1 ].color.dcolor = colDown;
|
|
pVertices[ 2 ].xyz = XYz;
|
|
pVertices[ 2 ].color.dcolor = colDown;
|
|
pVertices[ 3 ].xyz = Xyz;
|
|
pVertices[ 3 ].color.dcolor = colDown;
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 2;
|
|
pIndices[ 3 ] = 0;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
|
|
uint32 colTop(PackColor(col));
|
|
pVertices[ 4 ].xyz = xyZ;
|
|
pVertices[ 4 ].color.dcolor = colTop;
|
|
pVertices[ 5 ].xyz = XyZ;
|
|
pVertices[ 5 ].color.dcolor = colTop;
|
|
pVertices[ 6 ].xyz = XYZ;
|
|
pVertices[ 6 ].color.dcolor = colTop;
|
|
pVertices[ 7 ].xyz = xYZ;
|
|
pVertices[ 7 ].color.dcolor = colTop;
|
|
|
|
pIndices[ 6 ] = 4;
|
|
pIndices[ 7 ] = 5;
|
|
pIndices[ 8 ] = 6;
|
|
pIndices[ 9 ] = 4;
|
|
pIndices[ 10 ] = 6;
|
|
pIndices[ 11 ] = 7;
|
|
|
|
uint32 colBack(PackColor(ScaleColor(col, 0.6f)));
|
|
pVertices[ 8 ].xyz = xyz;
|
|
pVertices[ 8 ].color.dcolor = colBack;
|
|
pVertices[ 9 ].xyz = Xyz;
|
|
pVertices[ 9 ].color.dcolor = colBack;
|
|
pVertices[ 10 ].xyz = XyZ;
|
|
pVertices[ 10 ].color.dcolor = colBack;
|
|
pVertices[ 11 ].xyz = xyZ;
|
|
pVertices[ 11 ].color.dcolor = colBack;
|
|
|
|
pIndices[ 12 ] = 8;
|
|
pIndices[ 13 ] = 9;
|
|
pIndices[ 14 ] = 10;
|
|
pIndices[ 15 ] = 8;
|
|
pIndices[ 16 ] = 10;
|
|
pIndices[ 17 ] = 11;
|
|
|
|
uint32 colFront(PackColor(ScaleColor(col, 0.9f)));
|
|
pVertices[ 12 ].xyz = xYz;
|
|
pVertices[ 12 ].color.dcolor = colFront;
|
|
pVertices[ 13 ].xyz = xYZ;
|
|
pVertices[ 13 ].color.dcolor = colFront;
|
|
pVertices[ 14 ].xyz = XYZ;
|
|
pVertices[ 14 ].color.dcolor = colFront;
|
|
pVertices[ 15 ].xyz = XYz;
|
|
pVertices[ 15 ].color.dcolor = colFront;
|
|
|
|
pIndices[ 18 ] = 12;
|
|
pIndices[ 19 ] = 13;
|
|
pIndices[ 20 ] = 14;
|
|
pIndices[ 21 ] = 12;
|
|
pIndices[ 22 ] = 14;
|
|
pIndices[ 23 ] = 15;
|
|
|
|
uint32 colLeft(PackColor(ScaleColor(col, 0.7f)));
|
|
pVertices[ 16 ].xyz = xyz;
|
|
pVertices[ 16 ].color.dcolor = colLeft;
|
|
pVertices[ 17 ].xyz = xyZ;
|
|
pVertices[ 17 ].color.dcolor = colLeft;
|
|
pVertices[ 18 ].xyz = xYZ;
|
|
pVertices[ 18 ].color.dcolor = colLeft;
|
|
pVertices[ 19 ].xyz = xYz;
|
|
pVertices[ 19 ].color.dcolor = colLeft;
|
|
|
|
pIndices[ 24 ] = 16;
|
|
pIndices[ 25 ] = 17;
|
|
pIndices[ 26 ] = 18;
|
|
pIndices[ 27 ] = 16;
|
|
pIndices[ 28 ] = 18;
|
|
pIndices[ 29 ] = 19;
|
|
|
|
uint32 colRight(PackColor(ScaleColor(col, 0.8f)));
|
|
pVertices[ 20 ].xyz = Xyz;
|
|
pVertices[ 20 ].color.dcolor = colRight;
|
|
pVertices[ 21 ].xyz = XYz;
|
|
pVertices[ 21 ].color.dcolor = colRight;
|
|
pVertices[ 22 ].xyz = XYZ;
|
|
pVertices[ 22 ].color.dcolor = colRight;
|
|
pVertices[ 23 ].xyz = XyZ;
|
|
pVertices[ 23 ].color.dcolor = colRight;
|
|
|
|
pIndices[ 30 ] = 20;
|
|
pIndices[ 31 ] = 21;
|
|
pIndices[ 32 ] = 22;
|
|
pIndices[ 33 ] = 20;
|
|
pIndices[ 34 ] = 22;
|
|
pIndices[ 35 ] = 23;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawOBB(const OBB& obb, const Vec3& pos, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
|
|
if (eBBD_Extremes_Color_Encoded == bbDrawStyle)
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 24, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 1;
|
|
pIndices[ 3 ] = 2;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
pIndices[ 6 ] = 3;
|
|
pIndices[ 7 ] = 0;
|
|
|
|
pIndices[ 8 ] = 4;
|
|
pIndices[ 9 ] = 5;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 6;
|
|
pIndices[ 12 ] = 6;
|
|
pIndices[ 13 ] = 7;
|
|
pIndices[ 14 ] = 7;
|
|
pIndices[ 15 ] = 4;
|
|
|
|
pIndices[ 16 ] = 0;
|
|
pIndices[ 17 ] = 4;
|
|
pIndices[ 18 ] = 1;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 2;
|
|
pIndices[ 21 ] = 6;
|
|
pIndices[ 22 ] = 3;
|
|
pIndices[ 23 ] = 7;
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 36, CreateTriangleRenderFlags(true));
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 2;
|
|
pIndices[ 3 ] = 0;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
|
|
pIndices[ 6 ] = 7;
|
|
pIndices[ 7 ] = 6;
|
|
pIndices[ 8 ] = 5;
|
|
pIndices[ 9 ] = 7;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 4;
|
|
|
|
pIndices[ 12 ] = 3;
|
|
pIndices[ 13 ] = 2;
|
|
pIndices[ 14 ] = 6;
|
|
pIndices[ 15 ] = 3;
|
|
pIndices[ 16 ] = 6;
|
|
pIndices[ 17 ] = 7;
|
|
|
|
pIndices[ 18 ] = 4;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 1;
|
|
pIndices[ 21 ] = 4;
|
|
pIndices[ 22 ] = 1;
|
|
pIndices[ 23 ] = 0;
|
|
|
|
pIndices[ 24 ] = 1;
|
|
pIndices[ 25 ] = 5;
|
|
pIndices[ 26 ] = 6;
|
|
pIndices[ 27 ] = 1;
|
|
pIndices[ 28 ] = 6;
|
|
pIndices[ 29 ] = 2;
|
|
|
|
pIndices[ 30 ] = 4;
|
|
pIndices[ 31 ] = 0;
|
|
pIndices[ 32 ] = 3;
|
|
pIndices[ 33 ] = 4;
|
|
pIndices[ 34 ] = 3;
|
|
pIndices[ 35 ] = 7;
|
|
}
|
|
|
|
uint32 color(PackColor(col));
|
|
uint32 colorMin(PackColor(ColorB(15, 15, 15, col.a)));
|
|
uint32 colorMax(PackColor(ColorB(255, 255, 255, col.a)));
|
|
|
|
AABB aabb(obb.c - obb.h, obb.c + obb.h);
|
|
pVertices[ 0 ].xyz = obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.min.z) + pos;
|
|
pVertices[ 0 ].color.dcolor = colorMin;
|
|
pVertices[ 1 ].xyz = obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.min.z) + pos;
|
|
pVertices[ 1 ].color.dcolor = color;
|
|
pVertices[ 2 ].xyz = obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.min.z) + pos;
|
|
pVertices[ 2 ].color.dcolor = color;
|
|
pVertices[ 3 ].xyz = obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.min.z) + pos;
|
|
pVertices[ 3 ].color.dcolor = color;
|
|
pVertices[ 4 ].xyz = obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.max.z) + pos;
|
|
pVertices[ 4 ].color.dcolor = color;
|
|
pVertices[ 5 ].xyz = obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.max.z) + pos;
|
|
pVertices[ 5 ].color.dcolor = color;
|
|
pVertices[ 6 ].xyz = obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.max.z) + pos;
|
|
pVertices[ 6 ].color.dcolor = colorMax;
|
|
pVertices[ 7 ].xyz = obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.max.z) + pos;
|
|
pVertices[ 7 ].color.dcolor = color;
|
|
}
|
|
else
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 24, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
uint32 color(PackColor(col));
|
|
|
|
AABB aabb(obb.c - obb.h, obb.c + obb.h);
|
|
pVertices[ 0 ].xyz = obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.min.z) + pos;
|
|
pVertices[ 0 ].color.dcolor = color;
|
|
pVertices[ 1 ].xyz = obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.min.z) + pos;
|
|
pVertices[ 1 ].color.dcolor = color;
|
|
pVertices[ 2 ].xyz = obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.min.z) + pos;
|
|
pVertices[ 2 ].color.dcolor = color;
|
|
pVertices[ 3 ].xyz = obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.min.z) + pos;
|
|
pVertices[ 3 ].color.dcolor = color;
|
|
pVertices[ 4 ].xyz = obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.max.z) + pos;
|
|
pVertices[ 4 ].color.dcolor = color;
|
|
pVertices[ 5 ].xyz = obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.max.z) + pos;
|
|
pVertices[ 5 ].color.dcolor = color;
|
|
pVertices[ 6 ].xyz = obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.max.z) + pos;
|
|
pVertices[ 6 ].color.dcolor = color;
|
|
pVertices[ 7 ].xyz = obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.max.z) + pos;
|
|
pVertices[ 7 ].color.dcolor = color;
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 1;
|
|
pIndices[ 3 ] = 2;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
pIndices[ 6 ] = 3;
|
|
pIndices[ 7 ] = 0;
|
|
|
|
pIndices[ 8 ] = 4;
|
|
pIndices[ 9 ] = 5;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 6;
|
|
pIndices[ 12 ] = 6;
|
|
pIndices[ 13 ] = 7;
|
|
pIndices[ 14 ] = 7;
|
|
pIndices[ 15 ] = 4;
|
|
|
|
pIndices[ 16 ] = 0;
|
|
pIndices[ 17 ] = 4;
|
|
pIndices[ 18 ] = 1;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 2;
|
|
pIndices[ 21 ] = 6;
|
|
pIndices[ 22 ] = 3;
|
|
pIndices[ 23 ] = 7;
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 24, pIndices, 36, CreateTriangleRenderFlags(true));
|
|
|
|
AABB aabb(obb.c - obb.h, obb.c + obb.h);
|
|
Vec3 xyz(obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.min.z) + pos);
|
|
Vec3 xyZ(obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.max.z) + pos);
|
|
Vec3 xYz(obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.min.z) + pos);
|
|
Vec3 xYZ(obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.max.z) + pos);
|
|
Vec3 Xyz(obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.min.z) + pos);
|
|
Vec3 XyZ(obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.max.z) + pos);
|
|
Vec3 XYz(obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.min.z) + pos);
|
|
Vec3 XYZ(obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.max.z) + pos);
|
|
|
|
uint32 colDown(PackColor(ScaleColor(col, 0.5f)));
|
|
pVertices[ 0 ].xyz = xyz;
|
|
pVertices[ 0 ].color.dcolor = colDown;
|
|
pVertices[ 1 ].xyz = xYz;
|
|
pVertices[ 1 ].color.dcolor = colDown;
|
|
pVertices[ 2 ].xyz = XYz;
|
|
pVertices[ 2 ].color.dcolor = colDown;
|
|
pVertices[ 3 ].xyz = Xyz;
|
|
pVertices[ 3 ].color.dcolor = colDown;
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 2;
|
|
pIndices[ 3 ] = 0;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
|
|
uint32 colTop(PackColor(col));
|
|
pVertices[ 4 ].xyz = xyZ;
|
|
pVertices[ 4 ].color.dcolor = colTop;
|
|
pVertices[ 5 ].xyz = XyZ;
|
|
pVertices[ 5 ].color.dcolor = colTop;
|
|
pVertices[ 6 ].xyz = XYZ;
|
|
pVertices[ 6 ].color.dcolor = colTop;
|
|
pVertices[ 7 ].xyz = xYZ;
|
|
pVertices[ 7 ].color.dcolor = colTop;
|
|
|
|
pIndices[ 6 ] = 4;
|
|
pIndices[ 7 ] = 5;
|
|
pIndices[ 8 ] = 6;
|
|
pIndices[ 9 ] = 4;
|
|
pIndices[ 10 ] = 6;
|
|
pIndices[ 11 ] = 7;
|
|
|
|
uint32 colBack(PackColor(ScaleColor(col, 0.6f)));
|
|
pVertices[ 8 ].xyz = xyz;
|
|
pVertices[ 8 ].color.dcolor = colBack;
|
|
pVertices[ 9 ].xyz = Xyz;
|
|
pVertices[ 9 ].color.dcolor = colBack;
|
|
pVertices[ 10 ].xyz = XyZ;
|
|
pVertices[ 10 ].color.dcolor = colBack;
|
|
pVertices[ 11 ].xyz = xyZ;
|
|
pVertices[ 11 ].color.dcolor = colBack;
|
|
|
|
pIndices[ 12 ] = 8;
|
|
pIndices[ 13 ] = 9;
|
|
pIndices[ 14 ] = 10;
|
|
pIndices[ 15 ] = 8;
|
|
pIndices[ 16 ] = 10;
|
|
pIndices[ 17 ] = 11;
|
|
|
|
uint32 colFront(PackColor(ScaleColor(col, 0.9f)));
|
|
pVertices[ 12 ].xyz = xYz;
|
|
pVertices[ 12 ].color.dcolor = colFront;
|
|
pVertices[ 13 ].xyz = xYZ;
|
|
pVertices[ 13 ].color.dcolor = colFront;
|
|
pVertices[ 14 ].xyz = XYZ;
|
|
pVertices[ 14 ].color.dcolor = colFront;
|
|
pVertices[ 15 ].xyz = XYz;
|
|
pVertices[ 15 ].color.dcolor = colFront;
|
|
|
|
pIndices[ 18 ] = 12;
|
|
pIndices[ 19 ] = 13;
|
|
pIndices[ 20 ] = 14;
|
|
pIndices[ 21 ] = 12;
|
|
pIndices[ 22 ] = 14;
|
|
pIndices[ 23 ] = 15;
|
|
|
|
uint32 colLeft(PackColor(ScaleColor(col, 0.7f)));
|
|
pVertices[ 16 ].xyz = xyz;
|
|
pVertices[ 16 ].color.dcolor = colLeft;
|
|
pVertices[ 17 ].xyz = xyZ;
|
|
pVertices[ 17 ].color.dcolor = colLeft;
|
|
pVertices[ 18 ].xyz = xYZ;
|
|
pVertices[ 18 ].color.dcolor = colLeft;
|
|
pVertices[ 19 ].xyz = xYz;
|
|
pVertices[ 19 ].color.dcolor = colLeft;
|
|
|
|
pIndices[ 24 ] = 16;
|
|
pIndices[ 25 ] = 17;
|
|
pIndices[ 26 ] = 18;
|
|
pIndices[ 27 ] = 16;
|
|
pIndices[ 28 ] = 18;
|
|
pIndices[ 29 ] = 19;
|
|
|
|
uint32 colRight(PackColor(ScaleColor(col, 0.8f)));
|
|
pVertices[ 20 ].xyz = Xyz;
|
|
pVertices[ 20 ].color.dcolor = colRight;
|
|
pVertices[ 21 ].xyz = XYz;
|
|
pVertices[ 21 ].color.dcolor = colRight;
|
|
pVertices[ 22 ].xyz = XYZ;
|
|
pVertices[ 22 ].color.dcolor = colRight;
|
|
pVertices[ 23 ].xyz = XyZ;
|
|
pVertices[ 23 ].color.dcolor = colRight;
|
|
|
|
pIndices[ 30 ] = 20;
|
|
pIndices[ 31 ] = 21;
|
|
pIndices[ 32 ] = 22;
|
|
pIndices[ 33 ] = 20;
|
|
pIndices[ 34 ] = 22;
|
|
pIndices[ 35 ] = 23;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawOBB(const OBB& obb, const Matrix34& matWorld, bool bSolid, const ColorB& col, const EBoundingBoxDrawStyle& bbDrawStyle)
|
|
{
|
|
SAuxVertex* pVertices(0);
|
|
vtx_idx* pIndices(0);
|
|
|
|
if (eBBD_Extremes_Color_Encoded == bbDrawStyle)
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 24, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 1;
|
|
pIndices[ 3 ] = 2;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
pIndices[ 6 ] = 3;
|
|
pIndices[ 7 ] = 0;
|
|
|
|
pIndices[ 8 ] = 4;
|
|
pIndices[ 9 ] = 5;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 6;
|
|
pIndices[ 12 ] = 6;
|
|
pIndices[ 13 ] = 7;
|
|
pIndices[ 14 ] = 7;
|
|
pIndices[ 15 ] = 4;
|
|
|
|
pIndices[ 16 ] = 0;
|
|
pIndices[ 17 ] = 4;
|
|
pIndices[ 18 ] = 1;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 2;
|
|
pIndices[ 21 ] = 6;
|
|
pIndices[ 22 ] = 3;
|
|
pIndices[ 23 ] = 7;
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 36, CreateTriangleRenderFlags(true));
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 2;
|
|
pIndices[ 3 ] = 0;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
|
|
pIndices[ 6 ] = 7;
|
|
pIndices[ 7 ] = 6;
|
|
pIndices[ 8 ] = 5;
|
|
pIndices[ 9 ] = 7;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 4;
|
|
|
|
pIndices[ 12 ] = 3;
|
|
pIndices[ 13 ] = 2;
|
|
pIndices[ 14 ] = 6;
|
|
pIndices[ 15 ] = 3;
|
|
pIndices[ 16 ] = 6;
|
|
pIndices[ 17 ] = 7;
|
|
|
|
pIndices[ 18 ] = 4;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 1;
|
|
pIndices[ 21 ] = 4;
|
|
pIndices[ 22 ] = 1;
|
|
pIndices[ 23 ] = 0;
|
|
|
|
pIndices[ 24 ] = 1;
|
|
pIndices[ 25 ] = 5;
|
|
pIndices[ 26 ] = 6;
|
|
pIndices[ 27 ] = 1;
|
|
pIndices[ 28 ] = 6;
|
|
pIndices[ 29 ] = 2;
|
|
|
|
pIndices[ 30 ] = 4;
|
|
pIndices[ 31 ] = 0;
|
|
pIndices[ 32 ] = 3;
|
|
pIndices[ 33 ] = 4;
|
|
pIndices[ 34 ] = 3;
|
|
pIndices[ 35 ] = 7;
|
|
}
|
|
|
|
uint32 color(PackColor(col));
|
|
uint32 colorMin(PackColor(ColorB(15, 15, 15, col.a)));
|
|
uint32 colorMax(PackColor(ColorB(255, 255, 255, col.a)));
|
|
|
|
AABB aabb(obb.c - obb.h, obb.c + obb.h);
|
|
pVertices[ 0 ].xyz = matWorld * (obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.min.z));
|
|
pVertices[ 0 ].color.dcolor = colorMin;
|
|
pVertices[ 1 ].xyz = matWorld * (obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.min.z));
|
|
pVertices[ 1 ].color.dcolor = color;
|
|
pVertices[ 2 ].xyz = matWorld * (obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.min.z));
|
|
pVertices[ 2 ].color.dcolor = color;
|
|
pVertices[ 3 ].xyz = matWorld * (obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.min.z));
|
|
pVertices[ 3 ].color.dcolor = color;
|
|
pVertices[ 4 ].xyz = matWorld * (obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.max.z));
|
|
pVertices[ 4 ].color.dcolor = color;
|
|
pVertices[ 5 ].xyz = matWorld * (obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.max.z));
|
|
pVertices[ 5 ].color.dcolor = color;
|
|
pVertices[ 6 ].xyz = matWorld * (obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.max.z));
|
|
pVertices[ 6 ].color.dcolor = colorMax;
|
|
pVertices[ 7 ].xyz = matWorld * (obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.max.z));
|
|
pVertices[ 7 ].color.dcolor = color;
|
|
}
|
|
else
|
|
{
|
|
if (false == bSolid)
|
|
{
|
|
AddIndexedPrimitive(pVertices, 8, pIndices, 24, CreateLineRenderFlags(true) | AlphaFlags(col));
|
|
|
|
uint32 color(PackColor(col));
|
|
|
|
AABB aabb(obb.c - obb.h, obb.c + obb.h);
|
|
pVertices[ 0 ].xyz = matWorld * (obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.min.z));
|
|
pVertices[ 0 ].color.dcolor = color;
|
|
pVertices[ 1 ].xyz = matWorld * (obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.min.z));
|
|
pVertices[ 1 ].color.dcolor = color;
|
|
pVertices[ 2 ].xyz = matWorld * (obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.min.z));
|
|
pVertices[ 2 ].color.dcolor = color;
|
|
pVertices[ 3 ].xyz = matWorld * (obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.min.z));
|
|
pVertices[ 3 ].color.dcolor = color;
|
|
pVertices[ 4 ].xyz = matWorld * (obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.max.z));
|
|
pVertices[ 4 ].color.dcolor = color;
|
|
pVertices[ 5 ].xyz = matWorld * (obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.max.z));
|
|
pVertices[ 5 ].color.dcolor = color;
|
|
pVertices[ 6 ].xyz = matWorld * (obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.max.z));
|
|
pVertices[ 6 ].color.dcolor = color;
|
|
pVertices[ 7 ].xyz = matWorld * (obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.max.z));
|
|
pVertices[ 7 ].color.dcolor = color;
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 1;
|
|
pIndices[ 3 ] = 2;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
pIndices[ 6 ] = 3;
|
|
pIndices[ 7 ] = 0;
|
|
|
|
pIndices[ 8 ] = 4;
|
|
pIndices[ 9 ] = 5;
|
|
pIndices[ 10 ] = 5;
|
|
pIndices[ 11 ] = 6;
|
|
pIndices[ 12 ] = 6;
|
|
pIndices[ 13 ] = 7;
|
|
pIndices[ 14 ] = 7;
|
|
pIndices[ 15 ] = 4;
|
|
|
|
pIndices[ 16 ] = 0;
|
|
pIndices[ 17 ] = 4;
|
|
pIndices[ 18 ] = 1;
|
|
pIndices[ 19 ] = 5;
|
|
pIndices[ 20 ] = 2;
|
|
pIndices[ 21 ] = 6;
|
|
pIndices[ 22 ] = 3;
|
|
pIndices[ 23 ] = 7;
|
|
}
|
|
else
|
|
{
|
|
AddIndexedPrimitive(pVertices, 24, pIndices, 36, CreateTriangleRenderFlags(true));
|
|
|
|
AABB aabb(obb.c - obb.h, obb.c + obb.h);
|
|
Vec3 xyz(matWorld * (obb.m33* Vec3(aabb.min.x, aabb.min.y, aabb.min.z)));
|
|
Vec3 xyZ(matWorld * (obb.m33* Vec3(aabb.min.x, aabb.min.y, aabb.max.z)));
|
|
Vec3 xYz(matWorld * (obb.m33* Vec3(aabb.min.x, aabb.max.y, aabb.min.z)));
|
|
Vec3 xYZ(matWorld * (obb.m33* Vec3(aabb.min.x, aabb.max.y, aabb.max.z)));
|
|
Vec3 Xyz(matWorld * (obb.m33* Vec3(aabb.max.x, aabb.min.y, aabb.min.z)));
|
|
Vec3 XyZ(matWorld * (obb.m33* Vec3(aabb.max.x, aabb.min.y, aabb.max.z)));
|
|
Vec3 XYz(matWorld * (obb.m33* Vec3(aabb.max.x, aabb.max.y, aabb.min.z)));
|
|
Vec3 XYZ(matWorld * (obb.m33* Vec3(aabb.max.x, aabb.max.y, aabb.max.z)));
|
|
|
|
uint32 colDown(PackColor(ScaleColor(col, 0.5f)));
|
|
pVertices[ 0 ].xyz = xyz;
|
|
pVertices[ 0 ].color.dcolor = colDown;
|
|
pVertices[ 1 ].xyz = xYz;
|
|
pVertices[ 1 ].color.dcolor = colDown;
|
|
pVertices[ 2 ].xyz = XYz;
|
|
pVertices[ 2 ].color.dcolor = colDown;
|
|
pVertices[ 3 ].xyz = Xyz;
|
|
pVertices[ 3 ].color.dcolor = colDown;
|
|
|
|
pIndices[ 0 ] = 0;
|
|
pIndices[ 1 ] = 1;
|
|
pIndices[ 2 ] = 2;
|
|
pIndices[ 3 ] = 0;
|
|
pIndices[ 4 ] = 2;
|
|
pIndices[ 5 ] = 3;
|
|
|
|
uint32 colTop(PackColor(col));
|
|
pVertices[ 4 ].xyz = xyZ;
|
|
pVertices[ 4 ].color.dcolor = colTop;
|
|
pVertices[ 5 ].xyz = XyZ;
|
|
pVertices[ 5 ].color.dcolor = colTop;
|
|
pVertices[ 6 ].xyz = XYZ;
|
|
pVertices[ 6 ].color.dcolor = colTop;
|
|
pVertices[ 7 ].xyz = xYZ;
|
|
pVertices[ 7 ].color.dcolor = colTop;
|
|
|
|
pIndices[ 6 ] = 4;
|
|
pIndices[ 7 ] = 5;
|
|
pIndices[ 8 ] = 6;
|
|
pIndices[ 9 ] = 4;
|
|
pIndices[ 10 ] = 6;
|
|
pIndices[ 11 ] = 7;
|
|
|
|
uint32 colBack(PackColor(ScaleColor(col, 0.6f)));
|
|
pVertices[ 8 ].xyz = xyz;
|
|
pVertices[ 8 ].color.dcolor = colBack;
|
|
pVertices[ 9 ].xyz = Xyz;
|
|
pVertices[ 9 ].color.dcolor = colBack;
|
|
pVertices[ 10 ].xyz = XyZ;
|
|
pVertices[ 10 ].color.dcolor = colBack;
|
|
pVertices[ 11 ].xyz = xyZ;
|
|
pVertices[ 11 ].color.dcolor = colBack;
|
|
|
|
pIndices[ 12 ] = 8;
|
|
pIndices[ 13 ] = 9;
|
|
pIndices[ 14 ] = 10;
|
|
pIndices[ 15 ] = 8;
|
|
pIndices[ 16 ] = 10;
|
|
pIndices[ 17 ] = 11;
|
|
|
|
uint32 colFront(PackColor(ScaleColor(col, 0.9f)));
|
|
pVertices[ 12 ].xyz = xYz;
|
|
pVertices[ 12 ].color.dcolor = colFront;
|
|
pVertices[ 13 ].xyz = xYZ;
|
|
pVertices[ 13 ].color.dcolor = colFront;
|
|
pVertices[ 14 ].xyz = XYZ;
|
|
pVertices[ 14 ].color.dcolor = colFront;
|
|
pVertices[ 15 ].xyz = XYz;
|
|
pVertices[ 15 ].color.dcolor = colFront;
|
|
|
|
pIndices[ 18 ] = 12;
|
|
pIndices[ 19 ] = 13;
|
|
pIndices[ 20 ] = 14;
|
|
pIndices[ 21 ] = 12;
|
|
pIndices[ 22 ] = 14;
|
|
pIndices[ 23 ] = 15;
|
|
|
|
uint32 colLeft(PackColor(ScaleColor(col, 0.7f)));
|
|
pVertices[ 16 ].xyz = xyz;
|
|
pVertices[ 16 ].color.dcolor = colLeft;
|
|
pVertices[ 17 ].xyz = xyZ;
|
|
pVertices[ 17 ].color.dcolor = colLeft;
|
|
pVertices[ 18 ].xyz = xYZ;
|
|
pVertices[ 18 ].color.dcolor = colLeft;
|
|
pVertices[ 19 ].xyz = xYz;
|
|
pVertices[ 19 ].color.dcolor = colLeft;
|
|
|
|
pIndices[ 24 ] = 16;
|
|
pIndices[ 25 ] = 17;
|
|
pIndices[ 26 ] = 18;
|
|
pIndices[ 27 ] = 16;
|
|
pIndices[ 28 ] = 18;
|
|
pIndices[ 29 ] = 19;
|
|
|
|
uint32 colRight(PackColor(ScaleColor(col, 0.8f)));
|
|
pVertices[ 20 ].xyz = Xyz;
|
|
pVertices[ 20 ].color.dcolor = colRight;
|
|
pVertices[ 21 ].xyz = XYz;
|
|
pVertices[ 21 ].color.dcolor = colRight;
|
|
pVertices[ 22 ].xyz = XYZ;
|
|
pVertices[ 22 ].color.dcolor = colRight;
|
|
pVertices[ 23 ].xyz = XyZ;
|
|
pVertices[ 23 ].color.dcolor = colRight;
|
|
|
|
pIndices[ 30 ] = 20;
|
|
pIndices[ 31 ] = 21;
|
|
pIndices[ 32 ] = 22;
|
|
pIndices[ 33 ] = 20;
|
|
pIndices[ 34 ] = 22;
|
|
pIndices[ 35 ] = 23;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void CAuxGeomCB::DrawSphere(const Vec3& pos, float radius, const ColorB& col, bool drawShaded)
|
|
{
|
|
if (radius > 0.0f)
|
|
{
|
|
SAuxDrawObjParams* pDrawParams(0);
|
|
AddObject(pDrawParams, CreateObjectRenderFlags(eDOT_Sphere));
|
|
|
|
pDrawParams->m_matWorld = Matrix34::CreateTranslationMat(pos) * Matrix33::CreateScale(Vec3(radius, radius, radius));
|
|
pDrawParams->m_matWorldRotation.SetIdentity();
|
|
pDrawParams->m_color = PackColor(col);
|
|
pDrawParams->m_size = radius;
|
|
pDrawParams->m_shaded = drawShaded;
|
|
}
|
|
}
|
|
|
|
void CAuxGeomCB::DrawDisk(const Vec3& pos, const Vec3& dir, float radius, const ColorB& col, bool drawShaded)
|
|
{
|
|
if (radius > 0.0f && dir.GetLengthSquared() > 0.0f)
|
|
{
|
|
SAuxDrawObjParams* pDrawParams(0);
|
|
AddObject(pDrawParams, CreateObjectRenderFlags(eDOT_Disk));
|
|
|
|
Vec3 direction(dir.normalized());
|
|
Vec3 orthogonal(direction.GetOrthogonal().normalized());
|
|
|
|
Matrix33 matRot;
|
|
matRot.SetIdentity();
|
|
matRot.SetColumn(0, orthogonal);
|
|
matRot.SetColumn(1, direction);
|
|
matRot.SetColumn(2, orthogonal.Cross(direction));
|
|
|
|
pDrawParams->m_matWorld = Matrix34::CreateTranslationMat(pos) * matRot * Matrix33::CreateScale(Vec3(radius, 1.0, radius));
|
|
pDrawParams->m_matWorldRotation = matRot;
|
|
pDrawParams->m_color = PackColor(col);
|
|
pDrawParams->m_size = radius;
|
|
pDrawParams->m_shaded = drawShaded;
|
|
}
|
|
}
|
|
|
|
void CAuxGeomCB::DrawCone(const Vec3& pos, const Vec3& dir, float radius, float height, const ColorB& col, bool drawShaded)
|
|
{
|
|
if (radius > 0.0f && height > 0.0f && dir.GetLengthSquared() > 0.0f)
|
|
{
|
|
SAuxDrawObjParams* pDrawParams(0);
|
|
AddObject(pDrawParams, CreateObjectRenderFlags(eDOT_Cone));
|
|
|
|
Vec3 direction(dir.normalized());
|
|
Vec3 orthogonal(direction.GetOrthogonal().normalized());
|
|
|
|
Matrix33 matRot;
|
|
matRot.SetIdentity();
|
|
matRot.SetColumn(0, orthogonal);
|
|
matRot.SetColumn(1, direction);
|
|
matRot.SetColumn(2, orthogonal.Cross(direction));
|
|
|
|
pDrawParams->m_matWorld = Matrix34::CreateTranslationMat(pos) * matRot * Matrix33::CreateScale(Vec3(radius, height, radius));
|
|
pDrawParams->m_matWorldRotation = matRot;
|
|
pDrawParams->m_color = PackColor(col);
|
|
pDrawParams->m_size = max(radius, height * 0.5f);
|
|
pDrawParams->m_shaded = drawShaded;
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawCylinder(const Vec3& pos, const Vec3& dir, float radius, float height, const ColorB& col, bool drawShaded)
|
|
{
|
|
if (radius > 0.0f && height > 0.0f && dir.GetLengthSquared() > 0.0f)
|
|
{
|
|
SAuxDrawObjParams* pDrawParams(0);
|
|
AddObject(pDrawParams, CreateObjectRenderFlags(eDOT_Cylinder));
|
|
|
|
Vec3 direction(dir.normalized());
|
|
Vec3 orthogonal(direction.GetOrthogonal().normalized());
|
|
|
|
Matrix33 matRot;
|
|
matRot.SetIdentity();
|
|
matRot.SetColumn(0, orthogonal);
|
|
matRot.SetColumn(1, direction);
|
|
matRot.SetColumn(2, orthogonal.Cross(direction));
|
|
|
|
pDrawParams->m_matWorld = Matrix34::CreateTranslationMat(pos) * matRot * Matrix33::CreateScale(Vec3(radius, height, radius));
|
|
pDrawParams->m_matWorldRotation = matRot;
|
|
pDrawParams->m_color = PackColor(col);
|
|
pDrawParams->m_size = max(radius, height * 0.5f);
|
|
pDrawParams->m_shaded = drawShaded;
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::DrawBone(const Vec3& p, const Vec3& c, ColorB col)
|
|
{
|
|
Vec3 vBoneVec = c - p;
|
|
float fBoneLength = vBoneVec.GetLength();
|
|
|
|
if (fBoneLength < 1e-4)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Matrix33 m33 = Matrix33::CreateRotationV0V1(Vec3(1, 0, 0), vBoneVec / fBoneLength);
|
|
Matrix34 m34 = Matrix34(m33, p);
|
|
|
|
f32 t = min(0.01f, fBoneLength * 0.05f);
|
|
|
|
//bone points in x-direction
|
|
Vec3 s = Vec3(ZERO);
|
|
Vec3 m0 = Vec3(t, +t, +t);
|
|
Vec3 m1 = Vec3(t, -t, +t);
|
|
Vec3 m2 = Vec3(t, -t, -t);
|
|
Vec3 m3 = Vec3(t, +t, -t);
|
|
Vec3 e = Vec3(fBoneLength, 0, 0);
|
|
|
|
Vec3 VBuffer[6];
|
|
ColorB CBuffer[6];
|
|
|
|
VBuffer[0] = m34 * s;
|
|
CBuffer[0] = RGBA8(0xff, 0x1f, 0x1f, 0x00); //start of bone (joint)
|
|
|
|
VBuffer[1] = m34 * m0;
|
|
CBuffer[1] = col;
|
|
VBuffer[2] = m34 * m1;
|
|
CBuffer[2] = col;
|
|
VBuffer[3] = m34 * m2;
|
|
CBuffer[3] = col;
|
|
VBuffer[4] = m34 * m3;
|
|
CBuffer[4] = col;
|
|
|
|
VBuffer[5] = m34 * e;
|
|
CBuffer[5] = RGBA8(0x07, 0x0f, 0x1f, 0x00); //end of bone
|
|
|
|
|
|
DrawLine(VBuffer[0], CBuffer[0], VBuffer[1], CBuffer[1]);
|
|
DrawLine(VBuffer[0], CBuffer[0], VBuffer[2], CBuffer[2]);
|
|
DrawLine(VBuffer[0], CBuffer[0], VBuffer[3], CBuffer[3]);
|
|
DrawLine(VBuffer[0], CBuffer[0], VBuffer[4], CBuffer[4]);
|
|
|
|
DrawLine(VBuffer[1], CBuffer[1], VBuffer[2], CBuffer[2]);
|
|
DrawLine(VBuffer[2], CBuffer[2], VBuffer[3], CBuffer[3]);
|
|
DrawLine(VBuffer[3], CBuffer[3], VBuffer[4], CBuffer[4]);
|
|
DrawLine(VBuffer[4], CBuffer[4], VBuffer[1], CBuffer[1]);
|
|
|
|
DrawLine(VBuffer[5], CBuffer[5], VBuffer[1], CBuffer[1]);
|
|
DrawLine(VBuffer[5], CBuffer[5], VBuffer[2], CBuffer[2]);
|
|
DrawLine(VBuffer[5], CBuffer[5], VBuffer[3], CBuffer[3]);
|
|
DrawLine(VBuffer[5], CBuffer[5], VBuffer[4], CBuffer[4]);
|
|
}
|
|
|
|
#include "CommonRender.h"
|
|
|
|
|
|
void CAuxGeomCB::RenderText(Vec3 pos, SDrawTextInfo& ti, const char* format, va_list args)
|
|
{
|
|
if (format && !gEnv->IsDedicated())
|
|
{
|
|
char str[512];
|
|
|
|
vsnprintf_s(str, sizeof(str), sizeof(str) - 1, format, args);
|
|
str[sizeof(str) - 1] = '\0';
|
|
gEnv->pRenderer->DrawTextQueued(pos, ti, str);
|
|
}
|
|
}
|
|
|
|
void CAuxGeomCB::Flush()
|
|
{
|
|
Flush(false);
|
|
}
|
|
|
|
void CAuxGeomCB::Flush(bool reset)
|
|
{
|
|
size_t lastFlushPos = GetLastFlushPos();
|
|
size_t curFlushPos = GetCurFlushPos();
|
|
if ((lastFlushPos < curFlushPos) || reset)
|
|
{
|
|
UpdateLastFlushPos();
|
|
SAuxGeomCBRawDataPackaged data = SAuxGeomCBRawDataPackaged(AccessData());
|
|
m_pRenderAuxGeom->Flush(data, lastFlushPos, curFlushPos, reset);
|
|
}
|
|
}
|
|
|
|
void CAuxGeomCB::UpdateLastFlushPos()
|
|
{
|
|
bool shouldUpdate = true;
|
|
|
|
// If stereo is enabled then we don't want to reset the flush position UNLESS we're rendering the second eye. Otherwise,
|
|
// the aux geom will only get drawn to the first eye.
|
|
if (gEnv->pRenderer->IsStereoEnabled())
|
|
{
|
|
if (gEnv->pRenderer->GetIStereoRenderer()->GetStatus() == IStereoRenderer::Status::kRenderingFirstEye)
|
|
{
|
|
shouldUpdate = false;
|
|
}
|
|
}
|
|
|
|
if (shouldUpdate)
|
|
{
|
|
m_lastFlushPos = GetCurFlushPos();
|
|
}
|
|
}
|
|
|
|
void CAuxGeomCB::Commit([[maybe_unused]] uint frames)
|
|
{
|
|
Flush();
|
|
}
|
|
|
|
void CAuxGeomCB::Process()
|
|
{
|
|
m_pRenderAuxGeom->FlushTextMessages(m_cbCurrent->m_TextMessages, true);
|
|
m_lastFlushPos = 0;
|
|
m_cbCurrent->Reset();
|
|
}
|
|
|
|
// Note: Runs on MainThread in RC_EndFrame before enqueing the the render command
|
|
void CAuxGeomCBMainThread::Commit(uint frames)
|
|
{
|
|
m_cbCurrent->SetUsed(true);
|
|
m_cbCurrent->SetCount(frames);
|
|
|
|
Flush(true);
|
|
|
|
assert(m_cbCurrent->m_curTransMatIdx == -1);
|
|
m_cbCurrent->m_curTransMatIdx = -1;
|
|
|
|
m_cbCurrent->SetUsed(true);
|
|
m_cbCurrent->SetCount(frames);
|
|
|
|
// Select the next buffer. Note that between m_CBReady[2] and m_cbCurrent all being uniquely allocated, this works out to a triple buffering scenario.
|
|
// This allows us to not have to change shared code with the other classes that reference m_cbCurrent as the currently active buffer.
|
|
// NOTE: In this case, there does not appear to be any reason to require the atomic interlocked exchange.
|
|
// It appears they only use the InterlockedExchange to do the swap in one line of code.
|
|
const unsigned char nextBuffer = m_currentReadyBuffer + 1;
|
|
m_currentReadyBuffer = (nextBuffer == c_numCBReadyBuffers) ? 0 : nextBuffer;
|
|
m_cbCurrent = (SAuxGeomCBRawData*)CryInterlockedExchangePointer((void* volatile*)&m_CBReady[m_currentReadyBuffer], m_cbCurrent);
|
|
|
|
m_lastFlushPos = 0;
|
|
|
|
m_cbCurrent->Reset();
|
|
}
|
|
|
|
// Note: Runs on RenderThread in RT_EndFrame
|
|
void CAuxGeomCBMainThread::Process()
|
|
{
|
|
m_pRenderAuxGeom->FlushTextMessages(m_CBReady[m_currentReadyBuffer]->m_TextMessages, true);
|
|
m_CBReady[m_currentReadyBuffer]->SetUsed(false);
|
|
}
|
|
|
|
|
|
void CAuxGeomCBWorkerThread::Flush()
|
|
{
|
|
}
|
|
|
|
void CAuxGeomCBWorkerThread::Commit(uint frames)
|
|
{
|
|
m_cbCurrent->SetUsed(true);
|
|
m_cbCurrent->SetCount(frames);
|
|
|
|
Flush();
|
|
|
|
assert(m_cbCurrent->m_curTransMatIdx == -1);
|
|
m_cbCurrent->m_curTransMatIdx = -1;
|
|
|
|
m_cbCurrent = (SAuxGeomCBRawData*)CryInterlockedExchangePointer((void* volatile*)&m_CBReady, m_cbCurrent);
|
|
|
|
if (!m_cbCurrent)
|
|
{
|
|
for (CBList::iterator it = m_cbData.begin(); it != m_cbData.end(); ++it)
|
|
{
|
|
if (!(*it)->IsUsed())
|
|
{
|
|
m_cbCurrent = *it;
|
|
}
|
|
}
|
|
|
|
if (!m_cbCurrent)
|
|
{
|
|
m_cbCurrent = AddCBuffer();
|
|
}
|
|
}
|
|
|
|
m_lastFlushPos = 0;
|
|
|
|
m_cbCurrent->Reset();
|
|
}
|
|
|
|
void CAuxGeomCBWorkerThread::Process()
|
|
{
|
|
if (SAuxGeomCBRawData* current = (SAuxGeomCBRawData*)CryInterlockedExchangePointer((void* volatile*)&m_CBReady, 0))
|
|
{
|
|
if (m_cbProcessed)
|
|
{
|
|
m_cbProcessed->SetUsed(false);
|
|
}
|
|
|
|
m_cbProcessed = current;
|
|
}
|
|
|
|
if (SAuxGeomCBRawData* processed = m_cbProcessed)
|
|
{
|
|
if (size_t curFlushPos = processed->m_auxPushBuffer.size())
|
|
{
|
|
SAuxGeomCBRawDataPackaged data = SAuxGeomCBRawDataPackaged(processed);
|
|
m_pRenderAuxGeom->Flush(data, 0, curFlushPos);
|
|
}
|
|
|
|
m_pRenderAuxGeom->FlushTextMessages(processed->m_TextMessages, false);
|
|
|
|
if (processed->Count() == 1)
|
|
{
|
|
processed->SetUsed(false);
|
|
m_cbProcessed = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::SAuxGeomCBRawData::GetSortedPushBuffer(size_t begin, size_t end, AuxSortedPushBuffer& auxSortedPushBuffer) const
|
|
{
|
|
assert(begin < end);
|
|
assert(end <= m_auxPushBuffer.size());
|
|
|
|
auxSortedPushBuffer.reserve(end - begin);
|
|
auxSortedPushBuffer.resize(0);
|
|
|
|
for (AuxPushBuffer::const_iterator it(m_auxPushBuffer.begin() + begin), itEnd(m_auxPushBuffer.begin() + end); it != itEnd; ++it)
|
|
{
|
|
auxSortedPushBuffer.push_back(&(*it));
|
|
}
|
|
|
|
std::sort(auxSortedPushBuffer.begin(), auxSortedPushBuffer.end(), PushBufferSortFunc());
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::AddPushBufferEntry(uint32 numVertices, uint32 numIndices, const SAuxGeomRenderFlags& renderFlags)
|
|
{
|
|
assert(numVertices > 0);
|
|
|
|
AuxPushBuffer& auxPushBuffer(AccessData()->m_auxPushBuffer);
|
|
|
|
EPrimType primType(GetPrimType(renderFlags));
|
|
if (false == auxPushBuffer.empty() &&
|
|
auxPushBuffer[ auxPushBuffer.size() - 1 ].m_renderFlags == renderFlags &&
|
|
auxPushBuffer[ auxPushBuffer.size() - 1 ].m_transMatrixIdx == GetTransMatrixIndex() &&
|
|
(e_PtList == primType || e_LineList == primType || e_TriList == primType))
|
|
{
|
|
// Perform a runtime optimization (pre-merging) which effectively reduces the number of PB entries created.
|
|
// We can merge this entry with the previous one as its render flags match with the ones of the previous entry
|
|
// (e.g. merges consecutive DrawLine(...) calls with same render flags into one PB entry).
|
|
|
|
// Only done for non-indexed primitives as otherwise there would be the additional overhead of patching
|
|
// the indices for each push buffer entry. Indices already and still have to be patched during rendering
|
|
// anyway (merging) so in case of indexed primitives there'd be no real benefit. Also, merging up too many
|
|
// indexed primitves could potentially produce a push buffer entry which cannot be rendered as it exceeds
|
|
// the vb/ib buffer size for auxiliary geometries in the renderer.
|
|
SAuxPushBufferEntry& lastPBEntry(auxPushBuffer[ auxPushBuffer.size() - 1 ]);
|
|
lastPBEntry.m_numVertices += numVertices;
|
|
lastPBEntry.m_numIndices += numIndices;
|
|
}
|
|
else
|
|
{
|
|
// create new push buffer entry
|
|
auxPushBuffer.push_back(SAuxPushBufferEntry(numVertices, numIndices,
|
|
AccessData()->m_auxVertexBuffer.size(), AccessData()->m_auxIndexBuffer.size(), GetTransMatrixIndex(), renderFlags));
|
|
}
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::AddPrimitive(SAuxVertex*& pVertices, uint32 numVertices, const SAuxGeomRenderFlags& renderFlags)
|
|
{
|
|
assert(numVertices > 0);
|
|
|
|
// add push buffer entry to allow later merging of batches commited via DP
|
|
AddPushBufferEntry(numVertices, 0, renderFlags);
|
|
|
|
// get vertex ptr
|
|
AuxVertexBuffer& auxVertexBuffer(AccessData()->m_auxVertexBuffer);
|
|
AuxVertexBuffer::size_type oldVBSize(auxVertexBuffer.size());
|
|
auxVertexBuffer.resize(oldVBSize + numVertices);
|
|
pVertices = &auxVertexBuffer[ oldVBSize ];
|
|
}
|
|
|
|
void CAuxGeomCB::AddIndexedPrimitive(SAuxVertex*& pVertices, uint32 numVertices, vtx_idx*& pIndices, uint32 numIndices, const SAuxGeomRenderFlags& renderFlags)
|
|
{
|
|
assert(numVertices > 0);
|
|
assert(numIndices > 0);
|
|
|
|
// add push buffer entry to allow later merging of batches commited via DIP
|
|
AddPushBufferEntry(numVertices, numIndices, renderFlags);
|
|
|
|
// get vertex ptr
|
|
AuxVertexBuffer& auxVertexBuffer(AccessData()->m_auxVertexBuffer);
|
|
AuxVertexBuffer::size_type oldVBSize(auxVertexBuffer.size());
|
|
auxVertexBuffer.resize(oldVBSize + numVertices);
|
|
pVertices = &auxVertexBuffer[ oldVBSize ];
|
|
|
|
// get index ptr
|
|
AuxIndexBuffer& auxIndexBuffer(AccessData()->m_auxIndexBuffer);
|
|
AuxIndexBuffer::size_type oldIBSize(auxIndexBuffer.size());
|
|
auxIndexBuffer.resize(oldIBSize + numIndices);
|
|
pIndices = &auxIndexBuffer[ oldIBSize ];
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::AddObject(SAuxDrawObjParams*& pDrawParams, const SAuxGeomRenderFlags& renderFlags)
|
|
{
|
|
// create new push buffer entry
|
|
AuxPushBuffer& auxPushBuffer(AccessData()->m_auxPushBuffer);
|
|
AuxDrawObjParamBuffer& auxDrawObjParamBuffer(AccessData()->m_auxDrawObjParamBuffer);
|
|
auxPushBuffer.push_back(SAuxPushBufferEntry(auxDrawObjParamBuffer.size(), GetTransMatrixIndex(), renderFlags));
|
|
|
|
// get draw param buffer ptr
|
|
AuxDrawObjParamBuffer::size_type oldSize(auxDrawObjParamBuffer.size());
|
|
auxDrawObjParamBuffer.resize(oldSize + 1);
|
|
pDrawParams = &auxDrawObjParamBuffer[ oldSize ];
|
|
}
|
|
|
|
|
|
void CAuxGeomCB::SAuxGeomCBRawData::GetMemoryUsage(ICrySizer* pSizer) const
|
|
{
|
|
pSizer->AddObject(&m_auxPushBuffer, m_auxPushBuffer.capacity() * sizeof(AuxPushBuffer::value_type));
|
|
pSizer->AddObject(&m_auxVertexBuffer, m_auxVertexBuffer.capacity() * sizeof(AuxVertexBuffer::value_type));
|
|
pSizer->AddObject(&m_auxIndexBuffer, m_auxIndexBuffer.capacity() * sizeof(AuxIndexBuffer::value_type));
|
|
pSizer->AddObject(&m_auxDrawObjParamBuffer, m_auxDrawObjParamBuffer.capacity() * sizeof(AuxDrawObjParamBuffer::value_type));
|
|
pSizer->AddObject(m_TextMessages);
|
|
}
|
|
|
|
#endif // #if defined(ENABLE_RENDER_AUX_GEOM)
|