From 6a489a08f85558271dfc4a7ff589e998d4d5bd61 Mon Sep 17 00:00:00 2001
From: Sebastian Gaida <gaida@ca-digit.com>
Date: Tue, 27 Jul 2021 12:25:10 +0200
Subject: [PATCH] [#87] change global variable to local

---
 modules/meshlet/src/vkcv/meshlet/Tipsify.cpp | 32 ++++++++++++++------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/modules/meshlet/src/vkcv/meshlet/Tipsify.cpp b/modules/meshlet/src/vkcv/meshlet/Tipsify.cpp
index 48357b06..db80a217 100644
--- a/modules/meshlet/src/vkcv/meshlet/Tipsify.cpp
+++ b/modules/meshlet/src/vkcv/meshlet/Tipsify.cpp
@@ -6,8 +6,6 @@
 namespace vkcv::meshlet {
 
     const int maxUsedVertices           = 128;
-    size_t testTriangleIndex;
-    std::vector<uint32_t> skippedIndices;
 
     /**
      * modulo operation with maxUsedVertices
@@ -26,6 +24,8 @@ namespace vkcv::meshlet {
      * @param usedVerticeOffset
      * @param vertexCount
      * @param lowestLivingVertexIndex
+     * @param currentTriangleIndex
+     * @param skippedIndices
      * @return a VertexIndex to be used as fanningVertexIndex
      */
     int skipDeadEnd(
@@ -34,7 +34,9 @@ namespace vkcv::meshlet {
             int &usedVerticeCount,
             int &usedVerticeOffset,
             int vertexCount,
-            int &lowestLivingVertexIndex) {
+            int &lowestLivingVertexIndex,
+            int &currentTriangleIndex,
+            std::vector<uint32_t> &skippedIndices) {
 
         // returns the latest vertex used that has a living triangle
         while (mod(usedVerticeCount) != usedVerticeOffset) {
@@ -49,7 +51,8 @@ namespace vkcv::meshlet {
         while (lowestLivingVertexIndex + 1 < vertexCount) {
             lowestLivingVertexIndex++;
             if (livingTriangles[lowestLivingVertexIndex] > 0) {
-                skippedIndices.push_back(static_cast<uint32_t>(testTriangleIndex * 3));
+                // add index of the vertex to skippedIndices
+                skippedIndices.push_back(static_cast<uint32_t>(currentTriangleIndex * 3));
                 return lowestLivingVertexIndex;
             }
         }
@@ -69,6 +72,8 @@ namespace vkcv::meshlet {
      * @param usedVerticeStack
      * @param usedVerticeCount
      * @param usedVerticeOffset
+     * @param currentTriangleIndex
+     * @param skippedIndices
      * @return a VertexIndex to be used as fanningVertexIndex
      */
     int getNextVertexIndex(int vertexCount,
@@ -81,7 +86,9 @@ namespace vkcv::meshlet {
                            const std::vector<uint8_t> &livingTriangles,
                            const std::vector<uint32_t> &usedVerticeStack,
                            int &usedVerticeCount,
-                           int &usedVerticeOffset) {
+                           int &usedVerticeOffset,
+                           int &currentTriangleIndex,
+                           std::vector<uint32_t> &skippedIndices) {
         int nextVertexIndex = -1;
         int maxPriority     = -1;
         // calculates the next possibleCandidates that is recently used
@@ -113,7 +120,9 @@ namespace vkcv::meshlet {
                     usedVerticeCount,
                     usedVerticeOffset,
                     vertexCount,
-                    lowestLivingVertexIndex);
+                    lowestLivingVertexIndex,
+                    currentTriangleIndex,
+                    skippedIndices);
         }
         return nextVertexIndex;
     }
@@ -125,7 +134,7 @@ namespace vkcv::meshlet {
 
         if (indexBuffer32Bit.empty() || vertexCount <= 0) {
             vkcv_log(LogLevel::ERROR, "Invalid Input.");
-            return tipsifyResult(indexBuffer32Bit ,skippedIndices );
+            return tipsifyResult(indexBuffer32Bit , {} );
         }
         int triangleCount = indexBuffer32Bit.size() / 3;
 
@@ -199,7 +208,10 @@ namespace vkcv::meshlet {
 
         std::vector<uint32_t> possibleCandidates(3 * maxOffset);
 
-        testTriangleIndex = 0;
+        int currentTriangleIndex = 0;
+        // list of vertex indices where a deadEnd was reached
+        // useful to know where the mesh is potentially not contiguous
+        std::vector<uint32_t> skippedIndices;
 
         // run while not all indices are fanned out, -1 equals all are fanned out
         while (currentVertexIndex >= 0) {
@@ -219,7 +231,7 @@ namespace vkcv::meshlet {
                     // this allows us to iterate over the indexBuffer with the first vertex of the triangle as start
                     const uint32_t *vertexIndexOfTriangle        = &indexBuffer32Bit[3 * triangleIndex];
 
-                    testTriangleIndex++;
+                    currentTriangleIndex++;
 
                     // save emitted vertexIndexOfTriangle to reorderedTriangleIndexBuffer and set it to emitted
                     reorderedTriangleIndexBuffer[triangleOutputOffset++]    = triangleIndex;
@@ -255,7 +267,7 @@ namespace vkcv::meshlet {
             // search for the next vertexIndex to fan out
             currentVertexIndex = getNextVertexIndex(
                     vertexCount, lowestLivingVertexIndex, cacheSize, possibleCandidates, numPossibleCandidates, lastTimestampCache, currentTimeStamp,
-                    livingVertices, usedVerticeStack, usedVerticeCount, usedVerticeOffset);
+                    livingVertices, usedVerticeStack, usedVerticeCount, usedVerticeOffset, currentTriangleIndex, skippedIndices);
         }
 
         std::vector<uint32_t> reorderedIndexBuffer(3 * triangleCount);
-- 
GitLab