/* INFINITY CODE 2013-2019 */ /* http://www.infinity-code.com */ using System; using UnityEngine; #if RWT3 using InfinityCode.RealWorldTerrain; #endif /// /// Real World Terrain Connector /// [AddComponentMenu("Infinity Code/Online Maps/Plugins/Real World Terrain Connector")] [OnlineMapsPlugin("Real World Terrain Connector", typeof(OnlineMapsControlBase))] public class OnlineMapsRWTConnector : MonoBehaviour, IOnlineMapsSavableComponent { /// /// Connection mode /// public Mode mode = Mode.markerOnPosition; /// /// Which object should be displayed on the map. /// public PositionMode positionMode = PositionMode.transform; /// /// The texture of the marker to be displayed on the map. /// public Texture2D markerTexture; /// /// The label of the marker to be displayed on the map. /// public string markerLabel; /// /// Position, which must be shown on the map. /// public Vector3 scenePosition; /// /// Coordinates, which must be shown on the map. /// public Vector2 coordinates; /// /// Transform, which must be shown on the map. /// public Transform targetTransform; private OnlineMapsSavableItem[] savableItems; #if RWT || RWT3 private RealWorldTerrainContainer rwt; private OnlineMapsMarker marker; private OnlineMaps map; #endif /// /// Coordinates of selecteted object /// public Vector2 currentPosition { get { if (positionMode == PositionMode.coordinates) return coordinates; if (positionMode == PositionMode.scenePosition) return WorldPositionToCoordinates(scenePosition); if (positionMode == PositionMode.transform) return WorldPositionToCoordinates(targetTransform.position); return Vector2.zero; } } public OnlineMapsSavableItem[] GetSavableItems() { if (savableItems != null) return savableItems; savableItems = new[] { new OnlineMapsSavableItem("rwtConnector", "RWT Connector", SaveSettings) { loadCallback = LoadSettings } }; return savableItems; } private void LoadSettings(OnlineMapsJSONObject json) { json.DeserializeObject(this); } private OnlineMapsJSONItem SaveSettings() { return OnlineMapsJSON.Serialize(this); } /// /// Converts position to geographic coordinates. /// /// World position /// Geographic coordinates public Vector2 WorldPositionToCoordinates(Vector3 position) { #if RWT3 Vector2 result; rwt.GetCoordinatesByWorldPosition(position, out result); return result; #elif RWT RealWorldTerrainItem[,] terrains = rwt.terrains; foreach (RealWorldTerrainItem item in terrains) { Vector3 tp = item.terrain.transform.position; Vector3 size = item.terrainData.size; if (tp.x <= position.x && tp.z <= position.z && tp.x + size.x >= position.x && tp.z + size.z >= position.z) { float dx = item.bottomRight.x - item.topLeft.x; float dy = item.topLeft.y - item.bottomRight.y; float rx = (position.x - tp.x) / size.x; float rz = (position.z - tp.z) / size.z; float px = dx * rx; float py = dy * rz; return new Vector2(px + item.topLeft.x, py + item.bottomRight.y); } } return Vector2.zero; #else return Vector2.zero; #endif } #if RWT || RWT3 private void Start() { rwt = GetComponent(); if (rwt == null) { Debug.LogError("Real World Terrain Connector should be together c Real World Terrain Container."); OnlineMapsUtils.Destroy(this); return; } if (positionMode == PositionMode.transform && targetTransform == null) { Debug.LogError("Target Transform is not specified."); OnlineMapsUtils.Destroy(this); return; } map = OnlineMaps.instance; if (mode == Mode.centerOnPosition) { map.position = currentPosition; } else if (mode == Mode.markerOnPosition) { marker = OnlineMapsMarkerManager.CreateItem(currentPosition, markerTexture, markerLabel); } } private void Update() { if (mode == Mode.markerOnPosition) { Vector2 newPos = currentPosition; if (marker.position != newPos) { marker.position = newPos; map.Redraw(); } } else if (mode == Mode.centerOnPosition) { Vector2 newPos = currentPosition; if (map.position != newPos) { map.position = currentPosition; map.Redraw(); } } } #endif /// /// Connection mode /// public enum Mode { markerOnPosition, centerOnPosition } /// /// Which object should be displayed on the map. /// public enum PositionMode { transform, coordinates, scenePosition } }