You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.3 KiB
109 lines
3.3 KiB
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Mapbox.Unity.MeshGeneration.Data;
|
|
using Mapbox.Unity.Map;
|
|
using Mapbox.Utils;
|
|
using Mapbox.Unity.Utilities;
|
|
|
|
namespace Mapbox.Unity.MeshGeneration.Factories.TerrainStrategies
|
|
{
|
|
|
|
public class FlatSphereTerrainStrategy : TerrainStrategy
|
|
{
|
|
public float Radius { get { return _elevationOptions.modificationOptions.earthRadius; } }
|
|
public override int RequiredVertexCount
|
|
{
|
|
get { return _elevationOptions.modificationOptions.sampleCount * _elevationOptions.modificationOptions.sampleCount; }
|
|
}
|
|
|
|
public override void Initialize(ElevationLayerProperties elOptions)
|
|
{
|
|
_elevationOptions = elOptions;
|
|
}
|
|
|
|
public override void RegisterTile(UnityTile tile)
|
|
{
|
|
if (_elevationOptions.unityLayerOptions.addToLayer && tile.gameObject.layer != _elevationOptions.unityLayerOptions.layerId)
|
|
{
|
|
tile.gameObject.layer = _elevationOptions.unityLayerOptions.layerId;
|
|
}
|
|
|
|
if ((int)tile.ElevationType != (int)ElevationLayerType.GlobeTerrain ||
|
|
tile.MeshFilter.sharedMesh.vertexCount != RequiredVertexCount)
|
|
{
|
|
tile.MeshFilter.sharedMesh.Clear();
|
|
tile.ElevationType = TileTerrainType.Globe;
|
|
}
|
|
|
|
GenerateTerrainMesh(tile);
|
|
}
|
|
|
|
void GenerateTerrainMesh(UnityTile tile)
|
|
{
|
|
var verts = new List<Vector3>();
|
|
var _sampleCount = _elevationOptions.modificationOptions.sampleCount;
|
|
var _radius = _elevationOptions.modificationOptions.earthRadius;
|
|
for (float x = 0; x < _sampleCount; x++)
|
|
{
|
|
for (float y = 0; y < _sampleCount; y++)
|
|
{
|
|
var xx = Mathf.Lerp((float)tile.Rect.Min.x, ((float)tile.Rect.Min.x + (float)tile.Rect.Size.x),
|
|
x / (_sampleCount - 1));
|
|
var yy = Mathf.Lerp((float)tile.Rect.Max.y, ((float)tile.Rect.Max.y + (float)tile.Rect.Size.y),
|
|
y / (_sampleCount - 1));
|
|
|
|
var ll = Conversions.MetersToLatLon(new Vector2d(xx, yy));
|
|
|
|
var latitude = (float)(Mathf.Deg2Rad * ll.x);
|
|
var longitude = (float)(Mathf.Deg2Rad * ll.y);
|
|
|
|
float xPos = (_radius) * Mathf.Cos(latitude) * Mathf.Cos(longitude);
|
|
float zPos = (_radius) * Mathf.Cos(latitude) * Mathf.Sin(longitude);
|
|
float yPos = (_radius) * Mathf.Sin(latitude);
|
|
|
|
var pp = new Vector3(xPos, yPos, zPos);
|
|
verts.Add(pp);
|
|
}
|
|
}
|
|
|
|
var trilist = new List<int>();
|
|
for (int y = 0; y < _sampleCount - 1; y++)
|
|
{
|
|
for (int x = 0; x < _sampleCount - 1; x++)
|
|
{
|
|
trilist.Add((y * _sampleCount) + x);
|
|
trilist.Add((y * _sampleCount) + x + _sampleCount + 1);
|
|
trilist.Add((y * _sampleCount) + x + _sampleCount);
|
|
|
|
trilist.Add((y * _sampleCount) + x);
|
|
trilist.Add((y * _sampleCount) + x + 1);
|
|
trilist.Add((y * _sampleCount) + x + _sampleCount + 1);
|
|
}
|
|
}
|
|
|
|
var uvlist = new List<Vector2>();
|
|
var step = 1f / (_sampleCount - 1);
|
|
for (int i = 0; i < _sampleCount; i++)
|
|
{
|
|
for (int j = 0; j < _sampleCount; j++)
|
|
{
|
|
uvlist.Add(new Vector2(i * step, (j * step)));
|
|
}
|
|
}
|
|
|
|
tile.MeshFilter.sharedMesh.SetVertices(verts);
|
|
tile.MeshFilter.sharedMesh.SetTriangles(trilist, 0);
|
|
tile.MeshFilter.sharedMesh.SetUVs(0, uvlist);
|
|
tile.MeshFilter.sharedMesh.RecalculateBounds();
|
|
tile.MeshFilter.sharedMesh.RecalculateNormals();
|
|
|
|
tile.transform.localPosition = Mapbox.Unity.Constants.Math.Vector3Zero;
|
|
}
|
|
|
|
public override void UnregisterTile(UnityTile tile)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|