diff --git a/Runtime/VectorTile.cs b/Runtime/VectorTile.cs index 35f49bc137f77a3f0ae08ccb64491857dc9b209c..ad10d351f9b039b448856b5b1ef9ae5a4b84200e 100644 --- a/Runtime/VectorTile.cs +++ b/Runtime/VectorTile.cs @@ -183,8 +183,6 @@ namespace Wander // vector tile provider. public void IdentifyLayers( Func<VectorTileLayer, List<KeyValuePair<string, object>>, int> selectionCallback ) { - Debug.Assert( triangulated, "First call Triangulate." ); - for (int l = 0;l < layers.Count;l++) { var layer = layers[l]; @@ -196,16 +194,10 @@ namespace Wander int uniqueId = selectionCallback( layer, feature.Attributes ); if (uniqueId > -1) { - if ( uniqueId == 8 ) - { - int jt = 0; - } feature.SelectedLayerIdx = uniqueId; - break; // Done with this feature. } } } - layersIdentified = true; } @@ -229,21 +221,25 @@ namespace Wander failedPixels = new List<Vector3Int>(); remappedLayerIndices = new Dictionary<byte, byte>(); byte cachedPixel = 0; + float oneOverRes = 1.0f / resolution; + + TriangulatedPolygon cachedPoly = default; + int cachedVtxIdx = -1; + int cachedTriIdx = -1; - // For each layer, for each pixel, check triangle intersections. - for (int l = 0;l < layers.Count && !cancelToken.Value;l++) + // For each pixel. + for (int y = 0;y < resolution ;y++) { - var layer = layers[l]; - float fx = (float)layer.Extent / resolution; - TriangulatedPolygon cachedPoly = default; - int cachedVtxIdx = -1; - int cachedTriIdx = -1; - for (int y = 0;y < resolution && !cancelToken.Value;y++) + for (int x = 0;x < resolution && !cancelToken.Value ;x++) { - for (int x = 0; x < resolution; x++) + bool hit = false; + + // For each layer, check triangle intersections. + for (int l = 0;l < layers.Count && !cancelToken.Value;l++) { + var layer = layers[l]; + float fx = layer.Extent * oneOverRes; Vector2 p = new Vector2(fx*x+0.5f*fx, fx*y+0.5f*fx); - bool hit = false; // First try cache, quite often adjacent pixels will hit the same triangle. if (cachedVtxIdx!=-1) @@ -259,7 +255,7 @@ namespace Wander if (hit) { texture[(resolution - y -1)*resolution+x] = cachedPixel; - continue; // Pass from cache, continue to next pixel. + break; // Pass from cache, continue to next pixel. } } } @@ -279,23 +275,19 @@ namespace Wander cachedVtxIdx = -1; cachedPoly = polygonLayers[l][f]; var mins = cachedPoly.mins; - var maxs = cachedPoly.maxs; + var maxs = cachedPoly.maxs; var denoms = cachedPoly.denoms; var vertices = cachedPoly.vertices; - for (int vIdx = 0, triIdx = 0; vIdx < vertices.Count; vIdx += 3, triIdx++) + for (int vIdx = 0, triIdx = 0;vIdx < vertices.Count;vIdx += 3, triIdx++) { - if ( p.x < mins[triIdx].x || p.x > maxs[triIdx].x ) continue; - if ( p.y < mins[triIdx].y || p.y > maxs[triIdx].y ) continue; + if (p.x < mins[triIdx].x || p.x > maxs[triIdx].x) continue; + if (p.y < mins[triIdx].y || p.y > maxs[triIdx].y) continue; hit = GeomUtil.PointIsInsideTriangle2( p, vertices[vIdx], vertices[vIdx+1], vertices[vIdx+2], denoms[triIdx] ); if (hit) { cachedTriIdx = triIdx; cachedVtxIdx = vIdx; cachedPixel = (byte)feature.SelectedLayerIdx; - if ( cachedPixel == 8 ) - { - int jt = 0; - } texture[(resolution - y -1)*resolution+x] = cachedPixel; break; } @@ -304,11 +296,13 @@ namespace Wander if (hit) break; } - if ( !hit ) - { - // texture[(resolution - y -1)*resolution+x] = 255; - failedPixels.Add( new Vector3Int( x, y, 255 ) ); - } + if (hit) break; + } + + if (!hit) + { + texture[(resolution - y -1)*resolution+x] = 255; + failedPixels.Add( new Vector3Int( x, y, 255 ) ); } } } @@ -324,11 +318,7 @@ namespace Wander for (int x = 0;x < resolution;x++) { byte pixel = texture[addr]; - if (pixel == 8 ) - { - int jt = 0; - } - if ( pixel != cachedPixel && pixel != 254 /*used for not matched layer*/ ) + if ( pixel != cachedPixel && pixel < 254 /*used for not matched layer*/ ) { if (!remappedLayerIndices.TryGetValue( pixel, out remappedPixel )) {