diff --git a/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs b/Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs index f103ba777..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; @@ -43,6 +42,40 @@ 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 && useShaderElevation) + { + mesh.RecalculateBounds(); + mesh.bounds = GetBoundsAdjustedForElevation(); + } + } + + private Bounds GetBoundsAdjustedForElevation() + { + Mesh mesh = _unityMapTile.MeshFilter.mesh; + if (TerrainData == null || TerrainData.ElevationValues == null) + { + return mesh.bounds; + } + + float maxY = float.MinValue; + float minY = float.MaxValue; + foreach (float t in TerrainData.ElevationValues) + { + float elevationScaled = t * _unityMapTile.TileScale; + maxY = Mathf.Max(maxY, elevationScaled); + minY = Mathf.Min(minY, elevationScaled); + } + 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() @@ -130,4 +163,4 @@ public enum TileContainerState Temporary, Final } -} \ No newline at end of file +} 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 +}