/* * 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 "StdAfx.h" #include "RenderAuxGeom.h" #include #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]; int written = 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(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)