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