Kaynağa Gözat

duDebugDrawTorque add override

added an override flag to stop detour from setting our depth mask state. This was causing navmesh to draw through other objects when it wasnt meant to

Reset our bounds box for each draw cache
marauder2k7 1 ay önce
ebeveyn
işleme
5c2ed84b24

+ 33 - 7
Engine/source/navigation/duDebugDrawTorque.cpp

@@ -42,6 +42,7 @@ duDebugDrawTorque::duDebugDrawTorque()
    VECTOR_SET_ASSOCIATION(mDrawCache);
    VECTOR_SET_ASSOCIATION(mDrawCache);
    mPrimType = 0;
    mPrimType = 0;
    mVertCount = 0;
    mVertCount = 0;
+   mOverrideState = false;
 }
 }
 
 
 duDebugDrawTorque::~duDebugDrawTorque()
 duDebugDrawTorque::~duDebugDrawTorque()
@@ -50,7 +51,26 @@ duDebugDrawTorque::~duDebugDrawTorque()
 
 
 void duDebugDrawTorque::depthMask(bool state)
 void duDebugDrawTorque::depthMask(bool state)
 {
 {
+   if (mOverrideState)
+      return;
+
    mDesc.setZReadWrite(state);
    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)
 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;
    case DU_DRAW_QUADS:  mPrimType = DU_DRAW_QUADS; break;
    }
    }
 
 
-   mDesc.setCullMode(GFXCullCW);
-   mDesc.setBlend(false);
-   mDesc.setZReadWrite(true);
 }
 }
 
 
 /// Submit a vertex
 /// Submit a vertex
@@ -151,10 +168,7 @@ void duDebugDrawTorque::end()
       return;
       return;
 
 
    const U32 maxVertsPerDraw = GFX_MAX_DYNAMIC_VERTS;
    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)
    switch (mPrimType)
    {
    {
    case DU_DRAW_POINTS:
    case DU_DRAW_POINTS:
@@ -165,6 +179,9 @@ void duDebugDrawTorque::end()
       {
       {
          const U32 pointsThisBatch = getMin(maxVertsPerDraw, totalPoints - p);
          const U32 pointsThisBatch = getMin(maxVertsPerDraw, totalPoints - p);
          const U32 batchVerts = pointsThisBatch;
          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<GFXVertexPCT> buffer;
          GFXVertexBufferHandle<GFXVertexPCT> buffer;
          buffer.set(GFX, batchVerts, GFXBufferTypeStatic);
          buffer.set(GFX, batchVerts, GFXBufferTypeStatic);
@@ -218,6 +235,9 @@ void duDebugDrawTorque::end()
       {
       {
          const U32 linesThisBatch = getMin(maxVertsPerDraw / vertsPerLine, totalLines - l);
          const U32 linesThisBatch = getMin(maxVertsPerDraw / vertsPerLine, totalLines - l);
          const U32 batchVerts = linesThisBatch * vertsPerLine;
          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<GFXVertexPCT> buffer;
          GFXVertexBufferHandle<GFXVertexPCT> buffer;
          buffer.set(GFX, batchVerts, GFXBufferTypeStatic);
          buffer.set(GFX, batchVerts, GFXBufferTypeStatic);
@@ -273,6 +293,9 @@ void duDebugDrawTorque::end()
       {
       {
          const U32 trisThisBatch = getMin(maxVertsPerDraw / vertsPerTri, totalTris - t);
          const U32 trisThisBatch = getMin(maxVertsPerDraw / vertsPerTri, totalTris - t);
          const U32 batchVerts = trisThisBatch * vertsPerTri;
          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<GFXVertexPCT> buffer;
          GFXVertexBufferHandle<GFXVertexPCT> buffer;
          buffer.set(GFX, batchVerts, GFXBufferTypeStatic);
          buffer.set(GFX, batchVerts, GFXBufferTypeStatic);
@@ -330,6 +353,9 @@ void duDebugDrawTorque::end()
          const U32 quadsThisBatch = getMin(maxVertsPerDraw / vertsPerQuad, totalQuads - q);
          const U32 quadsThisBatch = getMin(maxVertsPerDraw / vertsPerQuad, totalQuads - q);
          const U32 batchVerts = quadsThisBatch * vertsPerQuad;
          const U32 batchVerts = quadsThisBatch * vertsPerQuad;
          const U32 batchIndices = quadsThisBatch * 6;
          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<GFXVertexPCT> buffer;
          GFXVertexBufferHandle<GFXVertexPCT> buffer;
          buffer.set(GFX, batchVerts, GFXBufferTypeStatic);
          buffer.set(GFX, batchVerts, GFXBufferTypeStatic);

+ 8 - 0
Engine/source/navigation/duDebugDrawTorque.h

@@ -61,6 +61,13 @@ public:
    /// Enable/disable Z read.
    /// Enable/disable Z read.
    void depthMask(bool state) override;
    void depthMask(bool state) override;
 
 
+   /// <summary>
+   /// Enable/disable Z read and overrides any setting that will come from detour.
+   /// </summary>
+   /// <param name="state">Z read state.</param>
+   /// <param name="isOverride">Set to true to override any future changes.</param>
+   void depthMask(bool state, bool isOverride);
+
    /// Begin drawing primitives.
    /// Begin drawing primitives.
    /// @param prim [in] primitive type to draw, one of rcDebugDrawPrimitives.
    /// @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.
    /// @param size [in] size of a primitive, applies to point size and line width only.
@@ -127,6 +134,7 @@ private:
 
 
    U32 mPrimType;
    U32 mPrimType;
    U32 mVertCount;
    U32 mVertCount;
+   bool mOverrideState;
 
 
    void _vertex(const float x, const float y, const float z, unsigned int color);
    void _vertex(const float x, const float y, const float z, unsigned int color);
 };
 };

+ 16 - 2
Engine/source/navigation/navMesh.cpp

@@ -1566,7 +1566,7 @@ void NavMesh::renderToDrawer()
    if (no)
    if (no)
    {
    {
       NavMesh* n = static_cast<NavMesh*>(no);
       NavMesh* n = static_cast<NavMesh*>(no);
-
+      mDbgDraw.depthMask(true, true);
       if (n->nm &&
       if (n->nm &&
          (m_drawMode == DRAWMODE_NAVMESH ||
          (m_drawMode == DRAWMODE_NAVMESH ||
             m_drawMode == DRAWMODE_NAVMESH_TRANS ||
             m_drawMode == DRAWMODE_NAVMESH_TRANS ||
@@ -1583,6 +1583,8 @@ void NavMesh::renderToDrawer()
             duDebugDrawNavMeshPortals(&mDbgDraw, *n->nm);
             duDebugDrawNavMeshPortals(&mDbgDraw, *n->nm);
       }
       }
 
 
+      mDbgDraw.depthMask(true, false);
+
       for (Tile& tile : n->mTiles)
       for (Tile& tile : n->mTiles)
       {
       {
          if (tile.chf && m_drawMode == DRAWMODE_COMPACT)
          if (tile.chf && m_drawMode == DRAWMODE_COMPACT)
@@ -1612,35 +1614,47 @@ void NavMesh::renderToDrawer()
 
 
          if (tile.cset && m_drawMode == DRAWMODE_RAW_CONTOURS)
          if (tile.cset && m_drawMode == DRAWMODE_RAW_CONTOURS)
          {
          {
+            mDbgDraw.depthMask(false);
             duDebugDrawRawContours(&mDbgDraw, *tile.cset);
             duDebugDrawRawContours(&mDbgDraw, *tile.cset);
+            mDbgDraw.depthMask(true);
          }
          }
 
 
          if (tile.cset && m_drawMode == DRAWMODE_BOTH_CONTOURS)
          if (tile.cset && m_drawMode == DRAWMODE_BOTH_CONTOURS)
          {
          {
+            mDbgDraw.depthMask(false);
             duDebugDrawRawContours(&mDbgDraw, *tile.cset);
             duDebugDrawRawContours(&mDbgDraw, *tile.cset);
             duDebugDrawContours(&mDbgDraw, *tile.cset);
             duDebugDrawContours(&mDbgDraw, *tile.cset);
+            mDbgDraw.depthMask(true);
          }
          }
 
 
          if (tile.cset && m_drawMode == DRAWMODE_CONTOURS)
          if (tile.cset && m_drawMode == DRAWMODE_CONTOURS)
          {
          {
+            mDbgDraw.depthMask(false);
             duDebugDrawContours(&mDbgDraw, *tile.cset);
             duDebugDrawContours(&mDbgDraw, *tile.cset);
+            mDbgDraw.depthMask(true);
          }
          }
 
 
          if (tile.chf && tile.cset && m_drawMode == DRAWMODE_REGION_CONNECTIONS)
          if (tile.chf && tile.cset && m_drawMode == DRAWMODE_REGION_CONNECTIONS)
          {
          {
+            
             duDebugDrawCompactHeightfieldRegions(&mDbgDraw, *tile.chf);
             duDebugDrawCompactHeightfieldRegions(&mDbgDraw, *tile.chf);
-
+            mDbgDraw.depthMask(false);
             duDebugDrawRegionConnections(&mDbgDraw, *tile.cset);
             duDebugDrawRegionConnections(&mDbgDraw, *tile.cset);
+            mDbgDraw.depthMask(true);
          }
          }
 
 
          if (tile.pmesh && m_drawMode == DRAWMODE_POLYMESH)
          if (tile.pmesh && m_drawMode == DRAWMODE_POLYMESH)
          {
          {
+            mDbgDraw.depthMask(false);
             duDebugDrawPolyMesh(&mDbgDraw, *tile.pmesh);
             duDebugDrawPolyMesh(&mDbgDraw, *tile.pmesh);
+            mDbgDraw.depthMask(true);
          }
          }
 
 
          if (tile.dmesh && m_drawMode == DRAWMODE_POLYMESH_DETAIL)
          if (tile.dmesh && m_drawMode == DRAWMODE_POLYMESH_DETAIL)
          {
          {
+            mDbgDraw.depthMask(false);
             duDebugDrawPolyMeshDetail(&mDbgDraw, *tile.dmesh);
             duDebugDrawPolyMeshDetail(&mDbgDraw, *tile.dmesh);
+            mDbgDraw.depthMask(true);
          }
          }
 
 
       }
       }