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