using System.Collections.Generic;
using UnityEngine;
public class MarkerDrawer : MonoBehaviour
{
public GameObject prefab;
[SerializeField] private int Reach = 17;
///
/// Coefficient of scaling of markers for zoom = 20.
/// It can be a constant or be pre-calculated depending on your needs.
///
private static float coof = 256;
private OnlineMapsTileSetControl control;
private Drawer newDrawe;
private void Start()
{
control = OnlineMapsTileSetControl.instance;
newDrawe = new Drawer(control, prefab);
control.markerDrawer = newDrawe;
control.OnMapClick += OnClick;
}
private void OnDisable()
{
control.OnMapClick -= OnClick;
}
private void OnClick()
{
double lng, lat;
control.GetCoords(out lng, out lat);
DrawRect(lng, lat);
}
private void DrawRect(double lng, double lat)
{
double nlng, nlat;
float dist = Mathf.Sqrt(2 * (2 * Reach) * (2 * Reach)) / 1000;
OnlineMapsUtils.GetCoordinateInDistance(lng, lat, dist / 2, 45, out nlng, out nlat);
double blng, blat;
OnlineMapsUtils.GetCoordinateInDistance(lng, lat, dist / 2, 225, out blng, out blat);
var marker = OnlineMapsMarkerManager.instance.Create(lng, lat);
marker.SetPosition(lng, lat);
marker.scale = 1 / Mathf.Pow(2, 19 - OnlineMaps.instance.floatZoom);
List points = new List();
points.Add(new Vector2((float)blng, (float)blat));
points.Add(new Vector2((float)blng, (float)nlat));
points.Add(new Vector2((float)nlng, (float)nlat));
points.Add(new Vector2((float)nlng, (float)blat));
points.Add(new Vector2((float)blng, (float)blat));
OnlineMapsDrawingElementManager.instance.Add(new OnlineMapsDrawingLine(points));
}
public class Drawer : OnlineMapsMarker2DDrawer
{
private OnlineMapsTileSetControl control;
private GameObject prefab;
public Drawer(OnlineMapsTileSetControl control, GameObject _prefab)
{
this.control = control;
prefab = _prefab;
control.OnDrawMarkers += OnDrawMarkers;
// control.OnMapZoom will not work when changing the zoom using the inspector.
map.OnChangeZoom += OnZoom;
}
public override void Dispose()
{
control.OnDrawMarkers -= OnDrawMarkers;
control.OnMapZoom -= OnZoom;
control = null;
}
private void OnZoom()
{
float scale = 1 / Mathf.Pow(2, 19 - map.floatZoom);
foreach (var marker in OnlineMapsMarkerManager.instance.items)
{
marker.scale = scale;
}
}
private void OnDrawMarkers()
{
double tlx, tly, brx, bry;
map.GetCorners(out tlx, out tly, out brx, out bry);
foreach (OnlineMapsMarker marker in OnlineMapsMarkerManager.instance.items)
{
DrawMarker(marker, tlx, tly, brx, bry);
}
}
private void DrawMarker(OnlineMapsMarker marker, double tlx, double tly, double brx, double bry)
{
double px, py;
marker.GetPosition(out px, out py);
GameObject markerInstance = marker["instance"] as GameObject;
if (marker.scale < 0.01f || px < tlx || px > brx || py < bry || py > tly)
{
if (markerInstance != null)
{
OnlineMapsUtils.Destroy(markerInstance);
marker["instance"] = null;
}
return;
}
if (markerInstance == null)
{
marker["instance"] = markerInstance = Instantiate(prefab);
markerInstance.transform.SetParent(control.transform);
}
float scale = coof * marker.scale;
markerInstance.transform.localScale = new Vector3(scale, scale, scale);
double lng, lat;
marker.GetPosition(out lng, out lat);
markerInstance.transform.position = control.GetWorldPosition(lng, lat);
}
}
}