using System; using UnityEngine; public class TilesetOverlayExample2 : MonoBehaviour { // Overlay texture in mercator projection public Texture texture; public Shader shader; /// /// Border coordinates of the overlay /// public double leftLongitude; public double topLatitude; public double rightLongitude; public double bottomLatitude; // Overlay transparency [Range(0, 1)] public float alpha = 1; private Mesh overlayMesh; private Material material; private void Start() { // Create overlay container GameObject overlayContainer = new GameObject("OverlayContainer"); overlayContainer.transform.parent = transform; // Init overlay material MeshRenderer meshRenderer = overlayContainer.AddComponent(); MeshFilter meshFilter = overlayContainer.AddComponent(); if (shader == null) { material = new Material(Shader.Find("Transparent/Diffuse")); material.renderQueue += 1000; } else material = new Material(shader); material.mainTexture = texture; meshRenderer.sharedMaterial = material; overlayMesh = meshFilter.sharedMesh = new Mesh(); overlayMesh.name = "Overlay Mesh"; overlayMesh.MarkDynamic(); overlayMesh.vertices = new Vector3[4]; // Subscribe to events OnlineMapsTileSetControl.instance.OnMeshUpdated += UpdateMesh; // Init mesh UpdateMesh(); } private void UpdateMesh() { overlayMesh.Clear(); OnlineMapsTileSetControl control = OnlineMapsTileSetControl.instance; Vector3 p1 = control.transform.worldToLocalMatrix * control.GetWorldPosition(leftLongitude, topLatitude); Vector3 p2 = control.transform.worldToLocalMatrix * control.GetWorldPosition(rightLongitude, bottomLatitude); Vector2 size = control.sizeInScene; size.x *= -1; if (p1.x > 0 && p2.x > 0) return; if (p1.x < size.x && p2.x < size.x) return; if (p1.z < 0 && p2.z < 0) return; if (p1.z > size.y && p2.z > size.y) return; Vector2 uv0 = new Vector2(0, 1); Vector2 uv1 = new Vector2(1, 0); Vector3 v1 = p1; Vector3 v2 = p2; if (p1.x > 0) { float m = p1.x / (p1.x - p2.x); uv0.x = m; v1.x = 0; } if (p1.z < 0) { float m = p1.z / (p1.z - p2.z); uv0.y = 1 - m; v1.z = 0; } if (p2.x < size.x) { float m = (p1.x - size.x) / (p1.x - p2.x); uv1.x = m; v2.x = size.x; } if (p2.z > size.y) { float m = (size.y - p2.z) / (p1.z - p2.z); uv1.y = m; v2.z = size.y; } overlayMesh.vertices = new[] { new Vector3(v1.x, 0.1f, v1.z), new Vector3(v2.x, 0.1f, v1.z), new Vector3(v2.x, 0.1f, v2.z), new Vector3(v1.x, 0.1f, v2.z), }; overlayMesh.normals = new[] { Vector3.up, Vector3.up, Vector3.up, Vector3.up }; overlayMesh.uv = new[] { uv0, new Vector2(uv1.x, uv0.y), uv1, new Vector2(uv0.x, uv1.y), }; // Init triangles overlayMesh.SetTriangles(new[] { 0, 1, 2, 0, 2, 3 }, 0); overlayMesh.RecalculateBounds(); overlayMesh.RecalculateNormals(); } private void Update() { if (Math.Abs(material.color.a - alpha) > float.Epsilon) { Color color = material.color; color.a = alpha; material.color = color; } } }