From 1427e3203b7189f73ae5c3e2dc91ca9ca66360b9 Mon Sep 17 00:00:00 2001
From: bart <bart.knuiman@wur.nl>
Date: Wed, 15 Mar 2023 14:50:47 +0100
Subject: [PATCH] Caching works now!

---
 Runtime/VectorTile.cs | 141 ++++++++++++++++++++++--------------------
 1 file changed, 74 insertions(+), 67 deletions(-)

diff --git a/Runtime/VectorTile.cs b/Runtime/VectorTile.cs
index 61606eb..6b418c7 100644
--- a/Runtime/VectorTile.cs
+++ b/Runtime/VectorTile.cs
@@ -197,92 +197,101 @@ namespace Wander
 
         public void OptimizeForPointIsInsideTriangle()
         {
-            Stopwatch sw = new Stopwatch();
-            sw.Restart();
-            for (int i = 0;i < polygonLayers.Count;i++)
+            try
             {
-                for (int j = 0;j < polygonLayers[i].Count;j++)
+                Stopwatch sw = new Stopwatch();
+                sw.Restart();
+                for (int i = 0;i < polygonLayers.Count;i++)
                 {
-                    polygonLayers[i][j].OptimizeForIsPointInTriangle();
+                    for (int j = 0;j < polygonLayers[i].Count;j++)
+                    {
+                        polygonLayers[i][j].OptimizeForIsPointInTriangle();
+                    }
                 }
-            }
 
-            // Generate quadtree
-            List<QuadTreeNode> stack = new List<QuadTreeNode>();
-            root = new QuadTreeNode();
-            root.triangles = new List<(int, int, int)>();
-            root.min = new Vector2( 0, 0 );
-            root.max = new Vector2( 4096, 4096 ); // TODO 4096 should be max of all layer extents.
-            for (int l = 0;l < polygonLayers.Count;l++)
-            {
-                var layer = layers[l];
-                for (int f = 0;f < layer.VectorTileFeatures.Count;f++)
+                // Generate quadtree
+                List<QuadTreeNode> stack = new List<QuadTreeNode>();
+                root = new QuadTreeNode();
+                root.triangles = new List<(int, int, int)>();
+                root.min = new Vector2( 0, 0 );
+                root.max = new Vector2( 4096, 4096 ); // TODO 4096 should be max of all layer extents.
+                for (int l = 0;l < polygonLayers.Count;l++)
                 {
-                    var feature = layer.VectorTileFeatures[f];
+                    var layer = layers[l];
+                    for (int f = 0;f < layer.VectorTileFeatures.Count;f++)
+                    {
+                        var feature = layer.VectorTileFeatures[f];
 
-                    if (feature.GeometryType != Tile.GeomType.Polygon)
-                        continue;
+                        if (feature.GeometryType != Tile.GeomType.Polygon)
+                            continue;
 
-                    var polygons = polygonLayers[l][f];
-                    if (polygons.vertices.Count == 0)
-                        continue;
+                        var polygons = polygonLayers[l][f];
+                        if (polygons.vertices.Count == 0)
+                            continue;
 
-                    if (feature.SelectedLayerIdx == 254)
-                        continue;
+                        if (feature.SelectedLayerIdx == 254)
+                            continue;
 
-                    if (feature.RelativeHeight > 0)
-                        continue;
+                        if (feature.RelativeHeight != 0)
+                            continue;
 
-                    var poly = polygonLayers[l][f];
-                    for (int t = 0;t < poly.vertices.Count/3;t++)
-                    {
-                        root.triangles.Add( (l, f, t) );
+                        var poly = polygonLayers[l][f];
+                        for (int t = 0;t < poly.vertices.Count/3;t++)
+                        {
+                            root.triangles.Add( (l, f, t) );
+                        }
                     }
                 }
-            }
-            stack.Add( root );
-            while (stack.Count > 0)
-            {
-                var node = stack[0];
-                stack.RemoveAt( 0 );
-                if (node.triangles.Count < 4)
-                    continue;
-                if (node.depth > 7)
-                    continue;
-                node.children = new QuadTreeNode[4];
-                var hs = (node.max - node.min) / 2;
-                Vector2 [] mins = new [] {
+                stack.Add( root );
+                while (stack.Count > 0)
+                {
+                    var node = stack[0];
+                    stack.RemoveAt( 0 );
+                    if (node.triangles.Count < 4)
+                        continue;
+                    if (node.depth > 7)
+                        continue;
+                    node.children = new QuadTreeNode[4];
+                    var hs = (node.max - node.min) / 2;
+                    Vector2 [] mins = new [] {
                     node.min,
                     new Vector2(node.min.x+hs.x, node.min.y),
                     new Vector2(node.min.x,      node.min.y+hs.y),
                     new Vector2(node.min.x+hs.x, node.min.y+hs.y)
                 };
-                for (int i = 0;i < 4;i++)
-                {
-                    var n2   = new QuadTreeNode();
-                    n2.depth = node.depth+1;
-                    n2.min   = mins[i];
-                    n2.max   = n2.min + hs;
-                    n2.triangles = new List<(int, int, int)>();
-                    for ( int t = 0; t < node.triangles.Count; t++ )
+                    for (int i = 0;i < 4;i++)
                     {
-                        int l  = node.triangles[t].Item1;
-                        int f  = node.triangles[t].Item2;
-                        int t2 = node.triangles[t].Item3;
-                        var min2 = polygonLayers[l][f].mins[t2];
-                        var max2 = polygonLayers[l][f].maxs[t2];
-                        if ( (min2.x > n2.max.x) || (min2.y > n2.max.y) || (max2.x < n2.min.x) || (max2.y < n2.min.y) )
+                        var n2   = new QuadTreeNode();
+                        n2.depth = node.depth+1;
+                        n2.min   = mins[i];
+                        n2.max   = n2.min + hs;
+                        n2.triangles = new List<(int, int, int)>();
+                        for (int t = 0;t < node.triangles.Count;t++)
                         {
-                            continue;
+                            int l  = node.triangles[t].Item1;
+                            int f  = node.triangles[t].Item2;
+                            int t2 = node.triangles[t].Item3;
+                            var min2 = polygonLayers[l][f].mins[t2];
+                            var max2 = polygonLayers[l][f].maxs[t2];
+                            if ((min2.x > n2.max.x) || (min2.y > n2.max.y) || (max2.x < n2.min.x) || (max2.y < n2.min.y))
+                            {
+                                continue;
+                            }
+                            n2.triangles.Add( node.triangles[t] );
+                            UnityEngine.Debug.Assert( layers[l].VectorTileFeatures[f].SelectedLayerIdx != 254 &&
+                                                      layers[l].VectorTileFeatures[f].RelativeHeight == 0 );
                         }
-                        n2.triangles.Add( (l, f, t2) );
+                        node.children[i] = n2;
+                        stack.Add( n2 );
                     }
-                    node.children[i] = n2;
-                    stack.Add( n2 );
-                }   
-                node.triangles = null;
+                    node.triangles = null;
+                }
+                UnityEngine.Debug.Log( "Optimize for raytracing took " + sw.ElapsedMilliseconds );
+            }
+            catch ( Exception e )
+            {
+                UnityEngine.Debug.LogException( e );
             }
-            UnityEngine.Debug.Log( "Optimize for raytracing took " + sw.ElapsedMilliseconds );
         }
 
         // Identify feature by specifying a (unique) index based on some criteria. This can very per
@@ -381,9 +390,7 @@ namespace Wander
                                 hit = GeomUtil.PointIsInsideTriangle2( p, vertices[t2*3], vertices[t2*3+1], vertices[t2*3+2], denoms[t2] );
                                 if (hit)
                                 {
-                                    // TODO caching the TriIdx doees not work, I have no clue why, it should only function
-                                    // as a hint, as where to start. But using this hint results in massive number of triangles going wrong...
-                                 //   cachedTriIdx = ti; 
+                                    cachedTriIdx = ti; 
                                     var layerIdx = (byte)layers[l].VectorTileFeatures[f].SelectedLayerIdx;
                                     texture[(resolution - y -1)*resolution+x] = layerIdx;
                                     break;
-- 
GitLab