Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using Mapbox.BaseModule.Data.Tiles;
using Mapbox.BaseModule.Map;
using Mapbox.BaseModule.Unity;
using Mapbox.BaseModule.Utilities;
Expand Down Expand Up @@ -289,6 +290,112 @@ private MeshDataArray CreateBaseMeshSkirts(float size, int sideVertexCount)
//mesh.Triangles.Add(_newTriangleList.ToArray());
return mesh;
}


/// <summary>
/// Checkes all neighbours of the given tile and stitches the edges to achieve a smooth mesh surface.
/// </summary>
/// <param name="tile">UnityMapTile of the tile being processed.</param>
/// <param name="allTiles">All tiles, including this tile, used to find neighbors</param>
///
public void FixStitches(UnityMapTile tile, Dictionary<UnwrappedTileId, UnityMapTile> allTiles)
{
UnwrappedTileId tileId = tile.UnwrappedTileId;
int sampleCount = _useTileSkirts
? _elevationOptions.modificationOptions.sampleCount + 3
: _elevationOptions.modificationOptions.sampleCount + 1;

Vector3[] targetVerts;
Vector3[] verts = tile.MeshFilter.sharedMesh.vertices;
var meshVertCount = verts.Length;
if (allTiles.ContainsKey(tileId.North) && allTiles[tileId.North].TerrainContainer.State == TileContainerState.Final)
{
targetVerts = allTiles[tileId.North].MeshFilter.sharedMesh.vertices;

for (int i = 0; i < sampleCount; i++)
{
int source_i = meshVertCount - sampleCount + i;
int target_i = i;
verts[source_i] = new Vector3(verts[source_i].x, targetVerts[target_i].y, verts[source_i].z);
}
allTiles[tileId.North].MeshFilter.sharedMesh.vertices = targetVerts;
}

if (allTiles.ContainsKey(tileId.South) && allTiles[tileId.South].TerrainContainer.State == TileContainerState.Final)
{
targetVerts = allTiles[tileId.South].MeshFilter.sharedMesh.vertices;

for (int i = 0; i < sampleCount; i++)
{
int source_i = i;
int target_i = meshVertCount - sampleCount + i;
verts[source_i] = new Vector3(verts[source_i].x, targetVerts[target_i].y, verts[source_i].z);
}
}

if (allTiles.ContainsKey(tileId.West) && allTiles[tileId.West].TerrainContainer.State == TileContainerState.Final)
{
targetVerts = allTiles[tileId.West].MeshFilter.sharedMesh.vertices;

for (int i = 0; i < sampleCount; i++)
{
int target_i = i * sampleCount + sampleCount - 1;
int source_i = i * sampleCount;
verts[source_i] = new Vector3(verts[source_i].x, targetVerts[target_i].y, verts[source_i].z);
}
}

if (allTiles.ContainsKey(tileId.East) && allTiles[tileId.East].TerrainContainer.State == TileContainerState.Final)
{
targetVerts = allTiles[tileId.East].MeshFilter.sharedMesh.vertices;

for (int i = 0; i < sampleCount; i++)
{
int target_i = i * sampleCount;
int source_i = i * sampleCount + sampleCount - 1;
verts[source_i] = new Vector3(verts[source_i].x, targetVerts[target_i].y, verts[source_i].z);
}
}

if (allTiles.ContainsKey(tileId.NorthWest) && allTiles[tileId.NorthWest].TerrainContainer.State == TileContainerState.Final)
{
targetVerts = allTiles[tileId.NorthWest].MeshFilter.sharedMesh.vertices;

int source_i = meshVertCount - sampleCount;
int target_i = sampleCount - 1;
verts[source_i] = new Vector3(verts[source_i].x, targetVerts[target_i].y, verts[source_i].z);
}

if (allTiles.ContainsKey(tileId.NorthEast) && allTiles[tileId.NorthEast].TerrainContainer.State == TileContainerState.Final)
{
targetVerts = allTiles[tileId.NorthEast].MeshFilter.sharedMesh.vertices;

int source_i = meshVertCount - 1;
int target_i = 0;
verts[source_i] = new Vector3(verts[source_i].x, targetVerts[target_i].y, verts[source_i].z);
}

if (allTiles.ContainsKey(tileId.SouthWest) && allTiles[tileId.SouthWest].TerrainContainer.State == TileContainerState.Final)
{
targetVerts = allTiles[tileId.SouthWest].MeshFilter.sharedMesh.vertices;

int source_i = 0;
int target_i = meshVertCount - 1;
verts[source_i] = new Vector3(verts[source_i].x, targetVerts[target_i].y, verts[source_i].z);
}

if (allTiles.ContainsKey(tileId.SouthEast) && allTiles[tileId.SouthEast].TerrainContainer.State == TileContainerState.Final)
{
targetVerts = allTiles[tileId.SouthEast].MeshFilter.sharedMesh.vertices;
int source_i = sampleCount - 1;
int target_i = meshVertCount - sampleCount;
verts[source_i] = new Vector3(verts[source_i].x, targetVerts[target_i].y, verts[source_i].z);
}

tile.MeshFilter.sharedMesh.vertices = verts;
tile.MeshFilter.sharedMesh.RecalculateNormals();
}

#endregion
}
}
7 changes: 5 additions & 2 deletions Runtime/Mapbox/BaseModule/Unity/UnityTileTerrainContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,13 @@ public void SetTerrainData(TerrainData terrainData, bool useShaderElevation, Til
private void FixMeshBounds(bool useShaderElevation)
{
Mesh mesh = _unityMapTile.MeshFilter.mesh;
if (mesh != null && useShaderElevation)
if (mesh != null)
{
mesh.RecalculateBounds();
mesh.bounds = GetBoundsAdjustedForElevation();
if (useShaderElevation)
{
mesh.bounds = GetBoundsAdjustedForElevation();
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions Runtime/Mapbox/ImageModule/Terrain/TerrainLayerModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ public class TerrainLayerModule : ITerrainLayerModule
private TerrainStrategy _terrainStrategy;

//Terrain module doesn't support cpu elevation now after TileCreator changes
public TerrainLayerModule(Source<TerrainData> source, TerrainLayerModuleSettings settings) : base()
public TerrainLayerModule(Source<TerrainData> source, TerrainLayerModuleSettings settings, TerrainStrategy terrainStrategy) : base()
{
_settings = settings;
_retainedTerrainTiles = new HashSet<CanonicalTileId>();
_rasterSource = source;
_terrainStrategy = new ElevatedTerrainStrategy();
_terrainStrategy = terrainStrategy;
}

public virtual IEnumerator Initialize()
Expand Down
3 changes: 2 additions & 1 deletion Runtime/Mapbox/ImageModule/Unity/TerrainLayerModuleScript.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ public override ILayerModule ConstructModule(MapService service, IMapInformation
var module =
new TerrainLayerModule(
service.GetTerrainRasterSource(Settings.DataSettings),
Settings);
Settings,
new ElevatedTerrainStrategy());

mapInformation.QueryElevation = module.QueryElevation;
ModuleImplementation = module;
Expand Down