/* 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
}
}