From 9fb7f8cd50648b91964c37bf0da825ecd44497c8 Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Tue, 8 Apr 2025 17:40:44 -0400 Subject: [PATCH 1/3] correct more bounds --- Runtime/Mapbox/VectorModule/VectorLayerVisualizer.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/Mapbox/VectorModule/VectorLayerVisualizer.cs b/Runtime/Mapbox/VectorModule/VectorLayerVisualizer.cs index aee393414..9c3bbb457 100644 --- a/Runtime/Mapbox/VectorModule/VectorLayerVisualizer.cs +++ b/Runtime/Mapbox/VectorModule/VectorLayerVisualizer.cs @@ -219,6 +219,7 @@ protected List GameObjectModifications(CanonicalTileId canonicalTile if(!_results.ContainsKey(canonicalTileId)) _results.Add(canonicalTileId, new List()); _results[canonicalTileId].Add(entity); + entity.Mesh.RecalculateBounds(); OnVectorMeshCreated(entity.GameObject); } } @@ -312,4 +313,4 @@ protected MeshData CombineMeshData(HashSet meshDataList) public Action OnVectorMeshCreated = list => { }; public Action OnVectorMeshDestroyed = go => { }; } -} \ No newline at end of file +} From 6d31d3d93f4f2e4947dc6795fe05795d41771e2f Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Mon, 7 Apr 2025 20:11:49 -0400 Subject: [PATCH 2/3] Fix mesh bounds on terrain tiles --- .../Unity/UnityTileTerrainContainer.cs | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs b/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs index f103ba777..0d53a1311 100644 --- a/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs +++ b/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs @@ -43,6 +43,44 @@ public void SetTerrainData(TerrainData terrainData, bool useShaderElevation, Til TerrainData.ElevationValuesUpdated += OnElevationValuesUpdated; _unityMapTile.Material.SetFloat(_elevationMultiplierFieldNameID, useShaderElevation ? 1 : 0); + FixMeshBounds(useShaderElevation); + } + + private void FixMeshBounds(bool useShaderElevation) + { + Mesh mesh = _unityMapTile.MeshFilter.mesh; + if (mesh == null) + { + return; + } + + float elevation = useShaderElevation ? GetMaxExtent() : 0f; + Vector3 newExtents = mesh.bounds.extents; + newExtents.y = elevation; + mesh.bounds = new Bounds(mesh.bounds.center, newExtents); + } + + private float GetMaxExtent() + { + if (TerrainData == null || TerrainData.ElevationValues == null) + { + return 0; + } + + float max = 0; + float min = float.MaxValue; + for (int i = 0; i < TerrainData.ElevationValues.Length; i++) + { + if (TerrainData.ElevationValues[i] > max) + { + max = TerrainData.ElevationValues[i]; + } + if (TerrainData.ElevationValues[i] < min) + { + min = TerrainData.ElevationValues[i]; + } + } + return Mathf.Max(Mathf.Abs(min), max); } public void OnTerrainUpdated() @@ -130,4 +168,4 @@ public enum TileContainerState Temporary, Final } -} \ No newline at end of file +} From 34062612b8295ea902ad9315a6bd8ac5e5ba4a67 Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Tue, 6 May 2025 12:57:50 -0400 Subject: [PATCH 3/3] Bugfix: used extent instead of size in bounds constructor --- .../Unity/UnityTileTerrainContainer.cs | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs b/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs index 0d53a1311..b9c5d7ddf 100644 --- a/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs +++ b/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs @@ -1,5 +1,4 @@ using System; -using Mapbox.BaseModule.Data.DataFetchers; using Mapbox.BaseModule.Data.Tiles; using UnityEngine; using TerrainData = Mapbox.BaseModule.Data.DataFetchers.TerrainData; @@ -49,38 +48,34 @@ public void SetTerrainData(TerrainData terrainData, bool useShaderElevation, Til private void FixMeshBounds(bool useShaderElevation) { Mesh mesh = _unityMapTile.MeshFilter.mesh; - if (mesh == null) + if (mesh != null && useShaderElevation) { - return; + mesh.RecalculateBounds(); + mesh.bounds = GetBoundsAdjustedForElevation(); } - - float elevation = useShaderElevation ? GetMaxExtent() : 0f; - Vector3 newExtents = mesh.bounds.extents; - newExtents.y = elevation; - mesh.bounds = new Bounds(mesh.bounds.center, newExtents); } - private float GetMaxExtent() + private Bounds GetBoundsAdjustedForElevation() { + Mesh mesh = _unityMapTile.MeshFilter.mesh; if (TerrainData == null || TerrainData.ElevationValues == null) { - return 0; + return mesh.bounds; } - float max = 0; - float min = float.MaxValue; - for (int i = 0; i < TerrainData.ElevationValues.Length; i++) + float maxY = float.MinValue; + float minY = float.MaxValue; + foreach (float t in TerrainData.ElevationValues) { - if (TerrainData.ElevationValues[i] > max) - { - max = TerrainData.ElevationValues[i]; - } - if (TerrainData.ElevationValues[i] < min) - { - min = TerrainData.ElevationValues[i]; - } + float elevationScaled = t * _unityMapTile.TileScale; + maxY = Mathf.Max(maxY, elevationScaled); + minY = Mathf.Min(minY, elevationScaled); } - return Mathf.Max(Mathf.Abs(min), max); + Vector3 center = mesh.bounds.center; + center.y = (maxY + minY) / 2; + Vector3 size = mesh.bounds.size; + size.y = maxY - minY; + return new Bounds(center, size); } public void OnTerrainUpdated()