diff --git a/Engine/source/navigation/duDebugDrawTorque.cpp b/Engine/source/navigation/duDebugDrawTorque.cpp index 8bcd5a48c..637c483b2 100644 --- a/Engine/source/navigation/duDebugDrawTorque.cpp +++ b/Engine/source/navigation/duDebugDrawTorque.cpp @@ -42,6 +42,7 @@ duDebugDrawTorque::duDebugDrawTorque() VECTOR_SET_ASSOCIATION(mDrawCache); mPrimType = 0; mVertCount = 0; + mOverrideState = false; } duDebugDrawTorque::~duDebugDrawTorque() @@ -50,7 +51,26 @@ duDebugDrawTorque::~duDebugDrawTorque() void duDebugDrawTorque::depthMask(bool state) { + if (mOverrideState) + return; + mDesc.setZReadWrite(state); + if (!state) + { + mDesc.setCullMode(GFXCullNone); + mDesc.setBlend(true); + } + else + { + mDesc.setCullMode(GFXCullCW); + mDesc.setBlend(false); + } +} + +void duDebugDrawTorque::depthMask(bool state, bool isOverride) +{ + depthMask(state); + mOverrideState = isOverride; } void duDebugDrawTorque::texture(bool state) @@ -92,9 +112,6 @@ void duDebugDrawTorque::begin(duDebugDrawPrimitives prim, float size) case DU_DRAW_QUADS: mPrimType = DU_DRAW_QUADS; break; } - mDesc.setCullMode(GFXCullCW); - mDesc.setBlend(false); - mDesc.setZReadWrite(true); } /// Submit a vertex @@ -151,10 +168,7 @@ void duDebugDrawTorque::end() return; const U32 maxVertsPerDraw = GFX_MAX_DYNAMIC_VERTS; - Box3F box; - box.minExtents.set(F32_MAX, F32_MAX, F32_MAX); - box.maxExtents.set(-F32_MAX, -F32_MAX, -F32_MAX); - + switch (mPrimType) { case DU_DRAW_POINTS: @@ -165,6 +179,9 @@ void duDebugDrawTorque::end() { const U32 pointsThisBatch = getMin(maxVertsPerDraw, totalPoints - p); const U32 batchVerts = pointsThisBatch; + Box3F box; + box.minExtents.set(F32_MAX, F32_MAX, F32_MAX); + box.maxExtents.set(-F32_MAX, -F32_MAX, -F32_MAX); GFXVertexBufferHandle buffer; buffer.set(GFX, batchVerts, GFXBufferTypeStatic); @@ -218,6 +235,9 @@ void duDebugDrawTorque::end() { const U32 linesThisBatch = getMin(maxVertsPerDraw / vertsPerLine, totalLines - l); const U32 batchVerts = linesThisBatch * vertsPerLine; + Box3F box; + box.minExtents.set(F32_MAX, F32_MAX, F32_MAX); + box.maxExtents.set(-F32_MAX, -F32_MAX, -F32_MAX); GFXVertexBufferHandle buffer; buffer.set(GFX, batchVerts, GFXBufferTypeStatic); @@ -273,6 +293,9 @@ void duDebugDrawTorque::end() { const U32 trisThisBatch = getMin(maxVertsPerDraw / vertsPerTri, totalTris - t); const U32 batchVerts = trisThisBatch * vertsPerTri; + Box3F box; + box.minExtents.set(F32_MAX, F32_MAX, F32_MAX); + box.maxExtents.set(-F32_MAX, -F32_MAX, -F32_MAX); GFXVertexBufferHandle buffer; buffer.set(GFX, batchVerts, GFXBufferTypeStatic); @@ -330,6 +353,9 @@ void duDebugDrawTorque::end() const U32 quadsThisBatch = getMin(maxVertsPerDraw / vertsPerQuad, totalQuads - q); const U32 batchVerts = quadsThisBatch * vertsPerQuad; const U32 batchIndices = quadsThisBatch * 6; + Box3F box; + box.minExtents.set(F32_MAX, F32_MAX, F32_MAX); + box.maxExtents.set(-F32_MAX, -F32_MAX, -F32_MAX); GFXVertexBufferHandle buffer; buffer.set(GFX, batchVerts, GFXBufferTypeStatic); diff --git a/Engine/source/navigation/duDebugDrawTorque.h b/Engine/source/navigation/duDebugDrawTorque.h index c18daf66e..a1c69ac4f 100644 --- a/Engine/source/navigation/duDebugDrawTorque.h +++ b/Engine/source/navigation/duDebugDrawTorque.h @@ -61,6 +61,13 @@ public: /// Enable/disable Z read. void depthMask(bool state) override; + /// + /// Enable/disable Z read and overrides any setting that will come from detour. + /// + /// Z read state. + /// Set to true to override any future changes. + void depthMask(bool state, bool isOverride); + /// Begin drawing primitives. /// @param prim [in] primitive type to draw, one of rcDebugDrawPrimitives. /// @param size [in] size of a primitive, applies to point size and line width only. @@ -127,6 +134,7 @@ private: U32 mPrimType; U32 mVertCount; + bool mOverrideState; void _vertex(const float x, const float y, const float z, unsigned int color); }; diff --git a/Engine/source/navigation/navMesh.cpp b/Engine/source/navigation/navMesh.cpp index 4a7e3dd06..d3c974141 100644 --- a/Engine/source/navigation/navMesh.cpp +++ b/Engine/source/navigation/navMesh.cpp @@ -1566,7 +1566,7 @@ void NavMesh::renderToDrawer() if (no) { NavMesh* n = static_cast(no); - + mDbgDraw.depthMask(true, true); if (n->nm && (m_drawMode == DRAWMODE_NAVMESH || m_drawMode == DRAWMODE_NAVMESH_TRANS || @@ -1583,6 +1583,8 @@ void NavMesh::renderToDrawer() duDebugDrawNavMeshPortals(&mDbgDraw, *n->nm); } + mDbgDraw.depthMask(true, false); + for (Tile& tile : n->mTiles) { if (tile.chf && m_drawMode == DRAWMODE_COMPACT) @@ -1612,35 +1614,47 @@ void NavMesh::renderToDrawer() if (tile.cset && m_drawMode == DRAWMODE_RAW_CONTOURS) { + mDbgDraw.depthMask(false); duDebugDrawRawContours(&mDbgDraw, *tile.cset); + mDbgDraw.depthMask(true); } if (tile.cset && m_drawMode == DRAWMODE_BOTH_CONTOURS) { + mDbgDraw.depthMask(false); duDebugDrawRawContours(&mDbgDraw, *tile.cset); duDebugDrawContours(&mDbgDraw, *tile.cset); + mDbgDraw.depthMask(true); } if (tile.cset && m_drawMode == DRAWMODE_CONTOURS) { + mDbgDraw.depthMask(false); duDebugDrawContours(&mDbgDraw, *tile.cset); + mDbgDraw.depthMask(true); } if (tile.chf && tile.cset && m_drawMode == DRAWMODE_REGION_CONNECTIONS) { + duDebugDrawCompactHeightfieldRegions(&mDbgDraw, *tile.chf); - + mDbgDraw.depthMask(false); duDebugDrawRegionConnections(&mDbgDraw, *tile.cset); + mDbgDraw.depthMask(true); } if (tile.pmesh && m_drawMode == DRAWMODE_POLYMESH) { + mDbgDraw.depthMask(false); duDebugDrawPolyMesh(&mDbgDraw, *tile.pmesh); + mDbgDraw.depthMask(true); } if (tile.dmesh && m_drawMode == DRAWMODE_POLYMESH_DETAIL) { + mDbgDraw.depthMask(false); duDebugDrawPolyMeshDetail(&mDbgDraw, *tile.dmesh); + mDbgDraw.depthMask(true); } }