From 853be7f81ece8a940e03540df38c35412f7a1481 Mon Sep 17 00:00:00 2001 From: Xavier Ho Date: Thu, 11 May 2017 14:22:36 +1000 Subject: [PATCH 1/2] Oceans with no height data resolve in massively tall pillars. This commit attempts to decipher the 'no-data' region and return 0 height as appropriate. --- .../Factories/TerrainFactory.cs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/sdkproject/Assets/Mapbox/Core/Unity/MeshGeneration/Factories/TerrainFactory.cs b/sdkproject/Assets/Mapbox/Core/Unity/MeshGeneration/Factories/TerrainFactory.cs index a6dae00f0..6e27609e7 100644 --- a/sdkproject/Assets/Mapbox/Core/Unity/MeshGeneration/Factories/TerrainFactory.cs +++ b/sdkproject/Assets/Mapbox/Core/Unity/MeshGeneration/Factories/TerrainFactory.cs @@ -75,7 +75,7 @@ public override void Update() Run(tile); } } - + private void Run(UnityTile tile) { if (_generationType == TerrainGenerationType.Height) @@ -153,12 +153,22 @@ private void GenerateTerrainMesh(UnityTile tile, float heightMultiplier) var xx = Mathd.Lerp(tile.Rect.Min.x, tile.Rect.Max.x, xrat); var yy = Mathd.Lerp(tile.Rect.Min.y, tile.Rect.Max.y, yrat); + var height = heightMultiplier * Conversions.GetRelativeHeightFromColor(tile.HeightData.GetPixel( + (int)(xrat * 255), + (int)((1 - yrat) * 255)), + tile.RelativeScale); + + /* + Assuming this is in meters? The tallest point on earth is ~8,500m. + Therefore this number should be pretty safe. + */ + if (height > 100000 * tile.RelativeScale * heightMultiplier) { + height = 0; + } + mesh.Vertices.Add(new Vector3( (float)(xx - tile.Rect.Center.x), - heightMultiplier * Conversions.GetRelativeHeightFromColor(tile.HeightData.GetPixel( - (int)(xrat * 255), - (int)((1 - yrat) * 255)), - tile.RelativeScale), + height, (float)(yy - tile.Rect.Center.y))); mesh.Normals.Add(Unity.Constants.Math.Vector3Up); mesh.UV[0].Add(new Vector2(x * step, 1 - (y * step))); From 7e483ef00dd1b6a87be9524cfc674fd0ec917e1c Mon Sep 17 00:00:00 2001 From: Xavier Ho Date: Fri, 12 May 2017 09:54:56 +1000 Subject: [PATCH 2/2] Removed arbitrary height cap in favour of determing missing texture by its width --- .../Factories/TerrainFactory.cs | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/sdkproject/Assets/Mapbox/Core/Unity/MeshGeneration/Factories/TerrainFactory.cs b/sdkproject/Assets/Mapbox/Core/Unity/MeshGeneration/Factories/TerrainFactory.cs index 6e27609e7..c54e6b549 100644 --- a/sdkproject/Assets/Mapbox/Core/Unity/MeshGeneration/Factories/TerrainFactory.cs +++ b/sdkproject/Assets/Mapbox/Core/Unity/MeshGeneration/Factories/TerrainFactory.cs @@ -153,22 +153,19 @@ private void GenerateTerrainMesh(UnityTile tile, float heightMultiplier) var xx = Mathd.Lerp(tile.Rect.Min.x, tile.Rect.Max.x, xrat); var yy = Mathd.Lerp(tile.Rect.Min.y, tile.Rect.Max.y, yrat); - var height = heightMultiplier * Conversions.GetRelativeHeightFromColor(tile.HeightData.GetPixel( - (int)(xrat * 255), - (int)((1 - yrat) * 255)), - tile.RelativeScale); - - /* - Assuming this is in meters? The tallest point on earth is ~8,500m. - Therefore this number should be pretty safe. - */ - if (height > 100000 * tile.RelativeScale * heightMultiplier) { - height = 0; + // Unavailable elevation data will have width less than 256 + // (usually 8?), therefore we render at zero height + if (tile.HeightData.width < 256) + { + heightMultiplier = 0; } mesh.Vertices.Add(new Vector3( (float)(xx - tile.Rect.Center.x), - height, + heightMultiplier * Conversions.GetRelativeHeightFromColor(tile.HeightData.GetPixel( + (int)(xrat * 255), + (int)((1 - yrat) * 255)), + tile.RelativeScale), (float)(yy - tile.Rect.Center.y))); mesh.Normals.Add(Unity.Constants.Math.Vector3Up); mesh.UV[0].Add(new Vector2(x * step, 1 - (y * step)));