/* INFINITY CODE 2013-2019 */
/* http://www.infinity-code.com */
using System.Reflection;
using UnityEngine;
#if FINGERS_TG
using DigitalRubyShared;
#endif
namespace Infinity_Code.Online_maps.Scripts
{
#if FINGERS_TG
[RequireComponent(typeof(FingersScript))]
#endif
[AddComponentMenu("Infinity Code/Online Maps/Plugins/Fingers - Touch Gestures Connector")]
[OnlineMapsPlugin("Fingers - Touch Gestures Connector", typeof(OnlineMapsControlBase))]
public class OnlineMapsFingersTouchGesturesConnector : MonoBehaviour
{
#if FINGERS_TG
private MethodInfo _updateCameraPosition;
private OnlineMapsControlBase _control;
private OnlineMapsCameraOrbit _cameraOrbit;
private OnlineMaps _map;
private RotateGestureRecognizer _rotateGesture;
private ScaleGestureRecognizer _scaleGesture;
[Header("Touch Behaviour Modifiers")]
public bool pivotAtCenter;
public float scaleSpeed = 0.1f;
public Vector2 speed = Vector2.one;
///
/// Starts this instance.
///
public void Start()
{
_map = OnlineMaps.instance;
_control = OnlineMapsControlBase.instance;
_cameraOrbit = OnlineMapsCameraOrbit.instance;
_rotateGesture = new RotateGestureRecognizer();
_scaleGesture = new ScaleGestureRecognizer();
_scaleGesture.StateUpdated += ScaleGestureCallback;
FingersScript.Instance.AddGesture(_scaleGesture);
if (_cameraOrbit == null) return;
if (pivotAtCenter)
{
_rotateGesture.StateUpdated += RotateCenterGestureCallback;
}
else
{
_updateCameraPosition = typeof(OnlineMapsCameraOrbit).GetMethod("UpdateCameraPosition", BindingFlags.Instance | BindingFlags.NonPublic);
_rotateGesture.StateUpdated += RotatePivotGestureCallback;
}
FingersScript.Instance.AddGesture(_rotateGesture);
}
#region Touch event callback methods
///
/// Scales the gesture callback.
///
/// The gesture.
private void ScaleGestureCallback(GestureRecognizer gesture)
{
if (gesture.State == GestureRecognizerState.Executing)
{
_map.floatZoom *= (_scaleGesture.ScaleMultiplier - 1) * scaleSpeed + 1;
}
}
///
/// Rotate around center, gesture callback.
///
/// The gesture.
private void RotateCenterGestureCallback(GestureRecognizer gesture)
{
if (gesture.State != GestureRecognizerState.Executing) return;
_control.isMapDrag = false;
_cameraOrbit.rotation.y += _rotateGesture.RotationDegreesDelta * speed.y;
}
///
/// Rotates the pivot gesture callback.
///
/// The gesture.
private void RotatePivotGestureCallback(GestureRecognizer gesture)
{
if (gesture.State != GestureRecognizerState.Executing) return;
_control.isMapDrag = false;
_control.GetCoords(out double lng1, out double lat1);
_cameraOrbit.rotation.y += _rotateGesture.RotationDegreesDelta * speed.y;
if (_cameraOrbit != null) _updateCameraPosition.Invoke(_cameraOrbit, null);
_control.GetCoords(out double lng2, out double lat2);
_map.projection.CoordinatesToTile(lng1, lat1, _map.zoom, out double tx1, out double ty1);
_map.projection.CoordinatesToTile(lng2, lat2, _map.zoom, out double tx2, out double ty2);
_map.GetTilePosition(out double ctx, out double cty);
ctx -= tx2 - tx1;
cty -= ty2 - ty1;
_map.SetTilePosition(ctx, cty);
}
#endregion
#endif
}
}