2209 lines
		
	
	
		
			70 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			2209 lines
		
	
	
		
			70 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | /*********************************************** | ||
|  | 				EasyTouch V | ||
|  | 	Copyright © 2014-2015 The Hedgehog Team | ||
|  |     http://www.thehedgehogteam.com/Forum/ | ||
|  | 		 | ||
|  | 	  The.Hedgehog.Team@gmail.com | ||
|  | 		 | ||
|  | **********************************************/ | ||
|  | 
 | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.EventSystems; | ||
|  | using System.Collections; | ||
|  | using System.Collections.Generic; | ||
|  | 
 | ||
|  | namespace HedgehogTeam.EasyTouch{ | ||
|  | /// <summary> | ||
|  | /// This is the main class of Easytouch engine.  | ||
|  | ///  | ||
|  | /// For add Easy Touch to your scene | ||
|  | /// It is a fake singleton, so you can simply access their settings via a script with all static methods or with the inspector.<br> | ||
|  | /// </summary> | ||
|  | public class EasyTouch : MonoBehaviour { | ||
|  | 
 | ||
|  | 	#region private classes | ||
|  | 	[System.Serializable] | ||
|  | 	private class DoubleTap{ | ||
|  | 		public bool inDoubleTap = false; | ||
|  | 		public bool inWait = false; | ||
|  | 		public float time=0; | ||
|  | 		public int count=0; | ||
|  | 		public Finger finger; | ||
|  | 
 | ||
|  | 		public void Stop(){ | ||
|  | 			inDoubleTap = false; | ||
|  | 			inWait = false; | ||
|  | 			time=0; | ||
|  | 			count=0; | ||
|  | 		} | ||
|  | 	}	 | ||
|  | 
 | ||
|  | 	private class PickedObject{ | ||
|  | 		public GameObject pickedObj; | ||
|  | 		public Camera pickedCamera; | ||
|  | 		public bool isGUI; | ||
|  | 	} | ||
|  | 	#endregion | ||
|  | 
 | ||
|  | 	#region Delegate | ||
|  | 	public delegate void TouchCancelHandler(Gesture gesture); | ||
|  | 	public delegate void Cancel2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void TouchStartHandler(Gesture gesture); | ||
|  | 	public delegate void TouchDownHandler(Gesture gesture); | ||
|  | 	public delegate void TouchUpHandler(Gesture gesture); | ||
|  | 	public delegate void SimpleTapHandler(Gesture gesture); | ||
|  | 	public delegate void DoubleTapHandler(Gesture gesture); | ||
|  | 	public delegate void LongTapStartHandler(Gesture gesture); | ||
|  | 	public delegate void LongTapHandler(Gesture gesture); | ||
|  | 	public delegate void LongTapEndHandler(Gesture gesture); | ||
|  | 	public delegate void DragStartHandler(Gesture gesture); | ||
|  | 	public delegate void DragHandler(Gesture gesture); | ||
|  | 	public delegate void DragEndHandler(Gesture gesture); | ||
|  | 	public delegate void SwipeStartHandler(Gesture gesture); | ||
|  | 	public delegate void SwipeHandler(Gesture gesture); | ||
|  | 	public delegate void SwipeEndHandler(Gesture gesture); | ||
|  | 	public delegate void TouchStart2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void TouchDown2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void TouchUp2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void SimpleTap2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void DoubleTap2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void LongTapStart2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void LongTap2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void LongTapEnd2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void TwistHandler(Gesture gesture); | ||
|  | 	public delegate void TwistEndHandler(Gesture gesture); | ||
|  | 	public delegate void PinchInHandler(Gesture gesture); | ||
|  | 	public delegate void PinchOutHandler(Gesture gesture); | ||
|  | 	public delegate void PinchEndHandler(Gesture gesture); | ||
|  | 	public delegate void PinchHandler(Gesture gesture); | ||
|  | 	public delegate void DragStart2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void Drag2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void DragEnd2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void SwipeStart2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void Swipe2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void SwipeEnd2FingersHandler(Gesture gesture); | ||
|  | 	public delegate void EasyTouchIsReadyHandler(); | ||
|  | 
 | ||
|  | 	public delegate void OverUIElementHandler( Gesture gesture); | ||
|  | 	public delegate void UIElementTouchUpHandler( Gesture gesture); | ||
|  | 	#endregion | ||
|  | 	 | ||
|  | 	#region Events | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when The system cancelled tracking for the touch, as when (for example) the user puts the device to her face. | ||
|  | 	/// </summary> | ||
|  | 	public static event TouchCancelHandler On_Cancel; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when the touch count is no longer egal to 2 and different to 0, after the begining of a two fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event Cancel2FingersHandler On_Cancel2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a finger touched the screen. | ||
|  | 	/// </summary> | ||
|  | 	public static event TouchStartHandler On_TouchStart; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs as the touch is active. | ||
|  | 	/// </summary> | ||
|  | 	public static event TouchDownHandler On_TouchDown; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a finger was lifted from the screen. | ||
|  | 	/// </summary> | ||
|  | 	public static event TouchUpHandler On_TouchUp; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a finger was lifted from the screen, and the time elapsed since the beginning of the touch is less than the time required for the detection of a long tap. | ||
|  | 	/// </summary> | ||
|  | 	public static event SimpleTapHandler On_SimpleTap; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when the number of taps is egal to 2 in a short time. | ||
|  | 	/// </summary> | ||
|  | 	public static event DoubleTapHandler On_DoubleTap; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a finger is touching the screen,  but hasn't moved  since the time required for the detection of a long tap. | ||
|  | 	/// </summary> | ||
|  | 	public static event LongTapStartHandler On_LongTapStart; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs as the touch is active after a LongTapStart | ||
|  | 	/// </summary> | ||
|  | 	public static event LongTapHandler On_LongTap; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a finger was lifted from the screen, and the time elapsed since the beginning of the touch is more than the time required for the detection of a long tap. | ||
|  | 	/// </summary> | ||
|  | 	public static event LongTapEndHandler On_LongTapEnd; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a drag start. A drag is a swipe on a pickable object | ||
|  | 	/// </summary> | ||
|  | 	public static event DragStartHandler On_DragStart; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs as the drag is active. | ||
|  | 	/// </summary> | ||
|  | 	public static event DragHandler On_Drag; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a finger that raise the drag event , is lifted from the screen. | ||
|  | 	/// </summary>/ | ||
|  | 	public static event DragEndHandler On_DragEnd; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when swipe start. | ||
|  | 	/// </summary> | ||
|  | 	public static event SwipeStartHandler On_SwipeStart; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs as the  swipe is active. | ||
|  | 	/// </summary> | ||
|  | 	public static event SwipeHandler On_Swipe; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a finger that raise the swipe event , is lifted from the screen. | ||
|  | 	/// </summary> | ||
|  | 	public static event SwipeEndHandler On_SwipeEnd; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_TouchStart but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event TouchStart2FingersHandler On_TouchStart2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_TouchDown but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event TouchDown2FingersHandler On_TouchDown2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_TouchUp but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event TouchUp2FingersHandler On_TouchUp2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_SimpleTap but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event SimpleTap2FingersHandler On_SimpleTap2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_DoubleTap but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event DoubleTap2FingersHandler On_DoubleTap2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_LongTapStart but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event LongTapStart2FingersHandler On_LongTapStart2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_LongTap but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event LongTap2FingersHandler On_LongTap2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_LongTapEnd but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event LongTapEnd2FingersHandler On_LongTapEnd2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when a twist gesture start | ||
|  | 	/// </summary> | ||
|  | 	public static event TwistHandler On_Twist; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs as the twist gesture is active. | ||
|  | 	/// </summary> | ||
|  | 	public static event TwistEndHandler On_TwistEnd; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs as the pinch  gesture is active. | ||
|  | 	/// </summary> | ||
|  | 	public static event PinchHandler On_Pinch; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs as the pinch in gesture is active. | ||
|  | 	/// </summary> | ||
|  | 	public static event PinchInHandler On_PinchIn; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs as the pinch out gesture is active. | ||
|  | 	/// </summary> | ||
|  | 	public static event PinchOutHandler On_PinchOut; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when the 2 fingers that raise the pinch event , are lifted from the screen. | ||
|  | 	/// </summary> | ||
|  | 	public static event PinchEndHandler On_PinchEnd; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_DragStart but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event DragStart2FingersHandler On_DragStart2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_Drag but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event Drag2FingersHandler On_Drag2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_DragEnd2Fingers but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event DragEnd2FingersHandler On_DragEnd2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_SwipeStart but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event SwipeStart2FingersHandler On_SwipeStart2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_Swipe but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event Swipe2FingersHandler On_Swipe2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Like On_SwipeEnd but for a 2 fingers gesture. | ||
|  | 	/// </summary> | ||
|  | 	public static event SwipeEnd2FingersHandler On_SwipeEnd2Fingers; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when  easy touch is ready. | ||
|  | 	/// </summary> | ||
|  | 	public static event EasyTouchIsReadyHandler On_EasyTouchIsReady; | ||
|  | 	/// <summary> | ||
|  | 	/// Occurs when current touch is over user interface element. | ||
|  | 	/// </summary> | ||
|  | 	public static event OverUIElementHandler On_OverUIElement; | ||
|  | 
 | ||
|  | 	public static event UIElementTouchUpHandler On_UIElementTouchUp; | ||
|  | 	#endregion | ||
|  | 
 | ||
|  | 	#region Enumerations | ||
|  | 
 | ||
|  | 	public enum GesturePriority{ Tap, Slips}; | ||
|  | 
 | ||
|  | 	public enum DoubleTapDetection { BySystem, ByTime} | ||
|  | 
 | ||
|  | 	public enum GestureType{ Tap, Drag, Swipe, None, LongTap, Pinch, Twist, Cancel, Acquisition }; | ||
|  | 	/// <summary> | ||
|  | 	/// Represents the different directions for a swipe or drag gesture (Left, Right, Up, Down, Other) | ||
|  | 	///  | ||
|  | 	/// The direction is influenced by the swipe Tolerance parameter Look at SetSwipeTolerance( float tolerance) | ||
|  | 	/// <br><br> | ||
|  | 	/// This enumeration is used on Gesture class | ||
|  | 	/// </summary> | ||
|  | 	public enum SwipeDirection{ None, Left, Right, Up, Down, UpLeft, UpRight, DownLeft, DownRight,Other,All}; | ||
|  | 		 | ||
|  | 	public enum TwoFingerPickMethod{ Finger, Average}; | ||
|  | 	 | ||
|  | 	public enum EvtType{ None,On_TouchStart,On_TouchDown,On_TouchUp,On_SimpleTap,On_DoubleTap,On_LongTapStart,On_LongTap, | ||
|  | 	On_LongTapEnd,On_DragStart,On_Drag,On_DragEnd,On_SwipeStart,On_Swipe,On_SwipeEnd,On_TouchStart2Fingers,On_TouchDown2Fingers,On_TouchUp2Fingers,On_SimpleTap2Fingers, | ||
|  | 	On_DoubleTap2Fingers,On_LongTapStart2Fingers,On_LongTap2Fingers,On_LongTapEnd2Fingers,On_Twist,On_TwistEnd,On_Pinch,On_PinchIn,On_PinchOut,On_PinchEnd,On_DragStart2Fingers, | ||
|  | 		On_Drag2Fingers,On_DragEnd2Fingers,On_SwipeStart2Fingers,On_Swipe2Fingers,On_SwipeEnd2Fingers, On_EasyTouchIsReady ,On_Cancel, On_Cancel2Fingers,On_OverUIElement, On_UIElementTouchUp} | ||
|  | 
 | ||
|  | 	#endregion | ||
|  | 	 | ||
|  | 	#region Public members | ||
|  | 	private static EasyTouch _instance; | ||
|  | 	public static EasyTouch instance{ | ||
|  | 		get{ | ||
|  | 			if( !_instance ){ | ||
|  | 				 | ||
|  | 				// check if an ObjectPoolManager is already available in the scene graph | ||
|  | 				_instance = FindObjectOfType( typeof( EasyTouch ) ) as EasyTouch; | ||
|  | 				 | ||
|  | 				// nope, create a new one | ||
|  | 				if( !_instance ){ | ||
|  | 					GameObject obj = new GameObject( "Easytouch" ); | ||
|  | 					_instance = obj.AddComponent<EasyTouch>(); | ||
|  | 				} | ||
|  | 			} | ||
|  | 			 | ||
|  | 			return _instance; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private Gesture _currentGesture = new Gesture(); | ||
|  | 	public static Gesture current{ | ||
|  | 		get{ | ||
|  | 			return EasyTouch.instance._currentGesture; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private List<Gesture> _currentGestures = new List<Gesture>(); | ||
|  | 
 | ||
|  | 	public bool enable;				// Enables or disables Easy Touch | ||
|  | 	public bool enableRemote;			// Enables or disables Unity remote | ||
|  | 		 | ||
|  | 	// General gesture properties | ||
|  | 	public GesturePriority gesturePriority;  | ||
|  | 	public float StationaryTolerance;//  | ||
|  | 	public float longTapTime ;			// The time required for the detection of a long tap. | ||
|  | 	public float swipeTolerance;		// Determines the accuracy of detecting a drag movement 0 => no precision 1=> high precision. | ||
|  | 	public float minPinchLength;			// The minimum length for a pinch detection. | ||
|  | 	public float minTwistAngle;			// The minimum angle for a twist detection. | ||
|  | 	public DoubleTapDetection doubleTapDetection; | ||
|  | 	public float doubleTapTime; | ||
|  | 	public bool alwaysSendSwipe; | ||
|  | 	//public bool isDpi; | ||
|  | 
 | ||
|  | 	// Two finger gesture | ||
|  | 	public bool enable2FingersGesture; // Enables 2 fingers gesture. | ||
|  | 	public bool enableTwist;			// Enables or disables recognition of the twist | ||
|  | 	public bool enablePinch;			// Enables or disables recognition of the Pinch | ||
|  | 	public bool enable2FingersSwipe; 	// Enables or disables recognition of 2 fingers swipe | ||
|  | 	public TwoFingerPickMethod twoFingerPickMethod; | ||
|  | 
 | ||
|  | 	// Auto selection | ||
|  | 	public List<ECamera> touchCameras;	// The  cameras | ||
|  | 	public bool autoSelect;  							// Enables or disables auto select | ||
|  | 	public LayerMask pickableLayers3D;							// Layer detectable by default | ||
|  | 	public bool enable2D;								// Enables or disables auto select on 2D | ||
|  | 	public LayerMask pickableLayers2D;		 | ||
|  | 	public bool autoUpdatePickedObject; | ||
|  | 
 | ||
|  | 	// Unity UI | ||
|  | 	//public EasyTouchRaycaster uiRaycaster; | ||
|  | 	public bool allowUIDetection; | ||
|  | 	public bool enableUIMode; | ||
|  | 	public bool autoUpdatePickedUI; | ||
|  | 
 | ||
|  | 	// NGUI | ||
|  | 	public bool enabledNGuiMode;	// True = no events are send when touch is hover an NGui panel | ||
|  | 	public LayerMask nGUILayers; | ||
|  | 	public List<Camera> nGUICameras; | ||
|  | 		 | ||
|  | 	// Second Finger | ||
|  | 	public bool enableSimulation; | ||
|  | 	public KeyCode twistKey; | ||
|  | 	public KeyCode swipeKey; | ||
|  | 
 | ||
|  | 	// Inspector | ||
|  | 	public bool showGuiInspector = false; | ||
|  | 	public bool showSelectInspector = false; | ||
|  | 	public bool showGestureInspector = false; | ||
|  | 	public bool showTwoFingerInspector = false; | ||
|  | 	public bool showSecondFingerInspector = false; | ||
|  | 	#endregion | ||
|  | 	 | ||
|  | 	#region Private members	 | ||
|  | 	private EasyTouchInput input = new EasyTouchInput(); | ||
|  | 	private Finger[] fingers=new Finger[100];					// The informations of the touch for finger 1. | ||
|  | 	public Texture secondFingerTexture;							// The texture to display the simulation of the second finger. | ||
|  | 	private TwoFingerGesture twoFinger = new TwoFingerGesture(); | ||
|  | 	private int oldTouchCount=0; | ||
|  | 	private DoubleTap[] singleDoubleTap = new DoubleTap[100]; | ||
|  | 	private Finger[] tmpArray = new Finger[100]; | ||
|  | 	private PickedObject pickedObject = new PickedObject(); | ||
|  | 
 | ||
|  | 	// Unity UI | ||
|  | 	private List<RaycastResult> uiRaycastResultCache= new List<RaycastResult>(); | ||
|  | 	private PointerEventData uiPointerEventData; | ||
|  | 	private EventSystem uiEventSystem; | ||
|  | 
 | ||
|  | 	#endregion | ||
|  | 	 | ||
|  | 	#region Constructor | ||
|  | 	public EasyTouch(){ | ||
|  | 		enable = true;		 | ||
|  | 
 | ||
|  | 		allowUIDetection = true; | ||
|  | 		enableUIMode = true; | ||
|  | 		autoUpdatePickedUI = false; | ||
|  | 
 | ||
|  | 		enabledNGuiMode = false; | ||
|  | 		nGUICameras = new List<Camera>(); | ||
|  | 
 | ||
|  | 		autoSelect = true;  | ||
|  | 		touchCameras = new List<ECamera>(); | ||
|  | 		pickableLayers3D = 1<<0; | ||
|  | 		enable2D = false; | ||
|  | 		pickableLayers2D = 1<<0; | ||
|  | 
 | ||
|  | 		gesturePriority = GesturePriority.Tap; | ||
|  | 		StationaryTolerance = 15; | ||
|  | 		longTapTime =1; | ||
|  | 		doubleTapDetection = DoubleTapDetection.BySystem; | ||
|  | 		doubleTapTime = 0.3f; | ||
|  | 		swipeTolerance = 0.85f; | ||
|  | 		alwaysSendSwipe = false; | ||
|  | 
 | ||
|  | 		enable2FingersGesture=true;  | ||
|  | 		twoFingerPickMethod = TwoFingerPickMethod.Finger; | ||
|  | 		enable2FingersSwipe = true; | ||
|  | 		enablePinch = true; | ||
|  | 		minPinchLength = 0f; | ||
|  | 		enableTwist = true; | ||
|  | 		minTwistAngle = 0f; | ||
|  | 
 | ||
|  | 		enableSimulation = true; | ||
|  | 		twistKey = KeyCode.LeftAlt; | ||
|  | 		swipeKey = KeyCode.LeftControl; | ||
|  | 
 | ||
|  | 		 | ||
|  | 	} | ||
|  | 	#endregion | ||
|  | 	 | ||
|  | 	#region MonoBehaviour Callback | ||
|  | 	void OnEnable(){ | ||
|  | 		if (Application.isPlaying && Application.isEditor){ | ||
|  | 			Init();	 | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	void Awake(){ | ||
|  | 		Init();	 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	void Start(){ | ||
|  | 
 | ||
|  | 		for (int i=0;i<100;i++){ | ||
|  | 			singleDoubleTap[i] = new DoubleTap(); | ||
|  | 		} | ||
|  | 		int index = touchCameras.FindIndex(  | ||
|  | 			delegate(ECamera c){ | ||
|  | 				return c.camera == Camera.main; | ||
|  | 			} | ||
|  | 		); | ||
|  | 		 | ||
|  | 		if (index<0) | ||
|  | 			touchCameras.Add(new ECamera(Camera.main,false)); | ||
|  | 
 | ||
|  | 		// Fire ready event | ||
|  | 		if (On_EasyTouchIsReady!=null){ | ||
|  | 			On_EasyTouchIsReady();	 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Current gesture | ||
|  | 		_currentGestures.Add( new Gesture()); | ||
|  | 	} | ||
|  | 	 | ||
|  | 	void Init(){ | ||
|  | 
 | ||
|  | 		// The texture to display the simulation of the second finger. | ||
|  | 		#if ((!UNITY_ANDROID && !UNITY_IOS &&  !UNITY_TVOS && !UNITY_WINRT && !UNITY_BLACKBERRY) || UNITY_EDITOR) | ||
|  | 			if (secondFingerTexture==null && enableSimulation){ | ||
|  | 				secondFingerTexture =Resources.Load("secondFinger") as Texture; | ||
|  | 			} | ||
|  | 		#endif	 | ||
|  | 	} | ||
|  | 	 | ||
|  | 	// Display the simulation of the second finger | ||
|  | 	#if ((!UNITY_ANDROID && !UNITY_IOS && !UNITY_TVOS && !UNITY_WINRT && !UNITY_BLACKBERRY) || UNITY_EDITOR)  | ||
|  | 	void OnGUI(){ | ||
|  | 		if (enableSimulation && !enableRemote){ | ||
|  | 			Vector2 finger = input.GetSecondFingerPosition(); | ||
|  | 			if (finger!=new Vector2(-1,-1)){		 | ||
|  | 				GUI.DrawTexture( new Rect(finger.x-16,Screen.height-finger.y-16,32,32),secondFingerTexture); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 	#endif | ||
|  | 	 | ||
|  | 	void OnDrawGizmos(){ | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// Non comments. | ||
|  | 	void Update(){ | ||
|  | 	 | ||
|  | 
 | ||
|  | 		if (enable && EasyTouch.instance==this){ | ||
|  | 
 | ||
|  | 			//#if (UNITY_EDITOR ) | ||
|  | 			if (Application.isPlaying && Input.touchCount>0){ | ||
|  | 				enableRemote = true; | ||
|  | 			} | ||
|  | 			 | ||
|  | 			if (Application.isPlaying && Input.touchCount==0){ | ||
|  | 				enableRemote = false; | ||
|  | 			} | ||
|  | 
 | ||
|  | 	 | ||
|  | 			//#endif | ||
|  | 
 | ||
|  | 			int i; | ||
|  | 			 | ||
|  | 			// How many finger do we have ? | ||
|  | 			int count = input.TouchCount(); | ||
|  | 		 | ||
|  | 			// Reset after two finger gesture; | ||
|  | 			if (oldTouchCount==2 && count!=2 && count>0){ | ||
|  | 				CreateGesture2Finger(EvtType.On_Cancel2Fingers,Vector2.zero,Vector2.zero,Vector2.zero,0,SwipeDirection.None,0,Vector2.zero,0,0,0); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			// Get touches		 | ||
|  | 			#if (((UNITY_ANDROID || UNITY_IOS || UNITY_WINRT || UNITY_BLACKBERRY || UNITY_TVOS) && !UNITY_EDITOR)) | ||
|  | 				UpdateTouches(true, count); | ||
|  | 			#else | ||
|  | 				UpdateTouches(false, count); | ||
|  | 			#endif				 | ||
|  | 		 | ||
|  | 			// two fingers gesture | ||
|  | 			twoFinger.oldPickedObject = twoFinger.pickedObject; | ||
|  | 			if (enable2FingersGesture){ | ||
|  | 				if (count==2){ | ||
|  | 					TwoFinger(); | ||
|  | 				} | ||
|  | 			} | ||
|  | 
 | ||
|  | 			// Other fingers gesture | ||
|  | 			for (i=0;i<100;i++){ | ||
|  | 				if (fingers[i]!=null){ | ||
|  | 					OneFinger(i); | ||
|  | 				} | ||
|  | 			} | ||
|  | 
 | ||
|  | 			oldTouchCount = count; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	void LateUpdate(){ | ||
|  | 
 | ||
|  | 		// single gesture | ||
|  | 		if (_currentGestures.Count>1){ | ||
|  | 			_currentGestures.RemoveAt(0);	 | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			_currentGestures[0] = new Gesture(); | ||
|  | 		} | ||
|  | 		_currentGesture = _currentGestures[0]; | ||
|  | 
 | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 		 | ||
|  |   | ||
|  | 	void UpdateTouches(bool realTouch, int touchCount){ | ||
|  | 		  | ||
|  | 		fingers.CopyTo( tmpArray,0); | ||
|  | 		 | ||
|  | 		if (realTouch || enableRemote){ | ||
|  | 			ResetTouches(); | ||
|  | 			for (var i = 0; i < touchCount; ++i) { | ||
|  | 				Touch touch = Input.GetTouch(i); | ||
|  | 				 | ||
|  | 				int t=0; | ||
|  | 				while (t < 100 && fingers[i]==null){	 | ||
|  | 					if (tmpArray[t] != null){ | ||
|  | 						if ( tmpArray[t].fingerIndex == touch.fingerId){								 | ||
|  | 							fingers[i] = tmpArray[t]; | ||
|  | 						} | ||
|  | 					} | ||
|  | 					t++;	 | ||
|  | 				} | ||
|  | 				 | ||
|  | 				if (fingers[i]==null){ | ||
|  | 					fingers[i]= new Finger(); | ||
|  | 					fingers[i].fingerIndex = touch.fingerId; | ||
|  | 					fingers[i].gesture = GestureType.None; | ||
|  | 					fingers[i].phase = TouchPhase.Began; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					fingers[i].phase = touch.phase; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				if ( fingers[i].phase!= TouchPhase.Began){ | ||
|  | 					fingers[i].deltaPosition = touch.position - fingers[i].position; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					fingers[i].deltaPosition = Vector2.zero; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				fingers[i].position = touch.position; | ||
|  | 				//fingers[i].deltaPosition = touch.deltaPosition; | ||
|  | 				fingers[i].tapCount = touch.tapCount; | ||
|  | 				fingers[i].deltaTime = touch.deltaTime; | ||
|  | 				 | ||
|  | 				fingers[i].touchCount = touchCount;		 | ||
|  | 
 | ||
|  | #if UNITY_5_3 | ||
|  | 				fingers[i].altitudeAngle = touch.altitudeAngle; | ||
|  | 				fingers[i].azimuthAngle = touch.azimuthAngle; | ||
|  | 				fingers[i].maximumPossiblePressure = touch.maximumPossiblePressure; | ||
|  | 				fingers[i].pressure = touch.pressure; | ||
|  | 				fingers[i].radius = touch.radius; | ||
|  | 				fingers[i].radiusVariance = touch.radiusVariance; | ||
|  | 				fingers[i].touchType = touch.type; | ||
|  | #endif | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			int i=0; | ||
|  | 			while (i<touchCount){ | ||
|  | 				fingers[i] = input.GetMouseTouch(i,fingers[i]) as Finger; | ||
|  | 				fingers[i].touchCount = touchCount; | ||
|  | 				i++; | ||
|  | 			}			 | ||
|  | 		} | ||
|  | 		 | ||
|  | 	} | ||
|  | 	 | ||
|  | 	void ResetTouches(){ | ||
|  | 		for (int i=0;i<100;i++){ | ||
|  | 			fingers[i] = null; | ||
|  | 		}	 | ||
|  | 	}	 | ||
|  | 	#endregion | ||
|  | 	 | ||
|  | 	#region One finger Private methods | ||
|  | 	private void OneFinger(int fingerIndex){ | ||
|  | 
 | ||
|  | 		// A tap starts ? | ||
|  | 		if ( fingers[fingerIndex].gesture==GestureType.None){ | ||
|  | 
 | ||
|  | 			if (!singleDoubleTap[fingerIndex].inDoubleTap){ | ||
|  | 				singleDoubleTap[fingerIndex].inDoubleTap = true; | ||
|  | 				singleDoubleTap[fingerIndex].time = 0; | ||
|  | 				singleDoubleTap[fingerIndex].count = 1; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			fingers[fingerIndex].startTimeAction = Time.realtimeSinceStartup; | ||
|  | 			fingers[fingerIndex].gesture=GestureType.Acquisition; | ||
|  | 			fingers[fingerIndex].startPosition = fingers[fingerIndex].position; | ||
|  | 			 | ||
|  | 			// do we touch a pickable gameobject ? | ||
|  | 			if (autoSelect){ | ||
|  | 				if (GetPickedGameObject(fingers[fingerIndex])){ | ||
|  | 					fingers[fingerIndex].pickedObject = pickedObject.pickedObj; | ||
|  | 					fingers[fingerIndex].isGuiCamera = pickedObject.isGUI; | ||
|  | 					fingers[fingerIndex].pickedCamera = pickedObject.pickedCamera; | ||
|  | 				} | ||
|  | 			} | ||
|  | 
 | ||
|  | 			// UnityGUI | ||
|  | 			if (allowUIDetection){ | ||
|  | 				fingers[fingerIndex].isOverGui = IsScreenPositionOverUI(  fingers[fingerIndex].position ); | ||
|  | 				fingers[fingerIndex].pickedUIElement = GetFirstUIElementFromCache(); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			// we notify a touch | ||
|  | 			CreateGesture(fingerIndex, EvtType.On_TouchStart,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (singleDoubleTap[fingerIndex].inDoubleTap) singleDoubleTap[fingerIndex].time += Time.deltaTime; | ||
|  | 		 | ||
|  | 		// Calculates the time since the beginning of the action. | ||
|  | 		fingers[fingerIndex].actionTime =  Time.realtimeSinceStartup - fingers[fingerIndex].startTimeAction; | ||
|  | 		 | ||
|  | 		 | ||
|  | 		// touch canceled? | ||
|  | 		if (fingers[fingerIndex].phase == TouchPhase.Canceled){ | ||
|  | 			fingers[fingerIndex].gesture = GestureType.Cancel; | ||
|  | 		} | ||
|  | 		 | ||
|  | 		if (fingers[fingerIndex].phase != TouchPhase.Ended && fingers[fingerIndex].phase != TouchPhase.Canceled){ | ||
|  | 		 | ||
|  | 			// Are we stationary  for a long tap | ||
|  | 			if (fingers[fingerIndex].phase == TouchPhase.Stationary  &&  | ||
|  | 			    fingers[fingerIndex].actionTime >= longTapTime && fingers[fingerIndex].gesture == GestureType.Acquisition){ | ||
|  | 
 | ||
|  | 				fingers[fingerIndex].gesture = GestureType.LongTap;				 | ||
|  | 				CreateGesture(fingerIndex, EvtType.On_LongTapStart,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);	 | ||
|  | 			} | ||
|  | 			 | ||
|  | 			// Let's move us? | ||
|  | 			if (( (fingers[fingerIndex].gesture == GestureType.Acquisition ||fingers[fingerIndex].gesture == GestureType.LongTap) && fingers[fingerIndex].phase == TouchPhase.Moved && gesturePriority == GesturePriority.Slips) | ||
|  | 				|| ((fingers[fingerIndex].gesture == GestureType.Acquisition ||fingers[fingerIndex].gesture == GestureType.LongTap) && (FingerInTolerance(fingers[fingerIndex])==false) && gesturePriority == GesturePriority.Tap )) | ||
|  | 			{ | ||
|  | 
 | ||
|  | 				//  long touch => cancel | ||
|  | 				if (fingers[fingerIndex].gesture == GestureType.LongTap){ | ||
|  | 					fingers[fingerIndex].gesture = GestureType.Cancel; | ||
|  | 					CreateGesture(fingerIndex, EvtType.On_LongTapEnd,fingers[fingerIndex],SwipeDirection.None,0,Vector2.zero); | ||
|  | 					// Init the touch to start | ||
|  | 					fingers[fingerIndex].gesture=GestureType.Acquisition;	 | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					fingers[fingerIndex].oldSwipeType = SwipeDirection.None; | ||
|  | 
 | ||
|  | 					// If an object is selected we drag | ||
|  | 					if (fingers[fingerIndex].pickedObject){ | ||
|  | 						fingers[fingerIndex].gesture = GestureType.Drag; | ||
|  | 						CreateGesture(fingerIndex, EvtType.On_DragStart,fingers[fingerIndex],SwipeDirection.None,0, Vector2.zero); | ||
|  | 
 | ||
|  | 						if (alwaysSendSwipe){ | ||
|  | 							CreateGesture(fingerIndex, EvtType.On_SwipeStart,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero); | ||
|  | 						} | ||
|  | 					} | ||
|  | 					// If not swipe | ||
|  | 					else{ | ||
|  | 						fingers[fingerIndex].gesture = GestureType.Swipe; | ||
|  | 						CreateGesture(fingerIndex, EvtType.On_SwipeStart,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero); | ||
|  | 					} | ||
|  | 					 | ||
|  | 				} | ||
|  | 			} | ||
|  | 			 | ||
|  | 			// Gesture update | ||
|  | 			EvtType message = EvtType.None; | ||
|  | 			 | ||
|  | 			switch (fingers[fingerIndex].gesture){ | ||
|  | 				case GestureType.LongTap: | ||
|  | 					message=EvtType.On_LongTap; | ||
|  | 					break; | ||
|  | 				case GestureType.Drag: | ||
|  | 					message=EvtType.On_Drag; | ||
|  | 					break; | ||
|  | 				case GestureType.Swipe: | ||
|  | 					message=EvtType.On_Swipe; | ||
|  | 					break; | ||
|  | 			} | ||
|  | 			 | ||
|  | 			// Send gesture | ||
|  | 			SwipeDirection currentSwipe = SwipeDirection.None; | ||
|  | 			currentSwipe = GetSwipe(new Vector2(0,0),fingers[fingerIndex].deltaPosition); | ||
|  | 			if (message!=EvtType.None){ | ||
|  | 
 | ||
|  | 				fingers[fingerIndex].oldSwipeType = currentSwipe; | ||
|  | 				CreateGesture(fingerIndex, message,fingers[fingerIndex], currentSwipe ,0,fingers[fingerIndex].deltaPosition); | ||
|  | 
 | ||
|  | 				if (message ==  EvtType.On_Drag && alwaysSendSwipe){ | ||
|  | 					CreateGesture(fingerIndex, EvtType.On_Swipe,fingers[fingerIndex], currentSwipe ,0,fingers[fingerIndex].deltaPosition); | ||
|  | 				} | ||
|  | 			} | ||
|  | 			 | ||
|  | 			// TouchDown | ||
|  | 			CreateGesture(fingerIndex, EvtType.On_TouchDown,fingers[fingerIndex], currentSwipe,0,fingers[fingerIndex].deltaPosition); | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			// End of the touch		 | ||
|  | 			switch (fingers[fingerIndex].gesture){ | ||
|  | 				// tap | ||
|  | 				case GestureType.Acquisition: | ||
|  | 					 | ||
|  | 					if (doubleTapDetection == DoubleTapDetection.BySystem){ | ||
|  | 						if (FingerInTolerance(fingers[fingerIndex])){ | ||
|  | 							if (fingers[fingerIndex].tapCount<2){ | ||
|  | 								CreateGesture( fingerIndex, EvtType.On_SimpleTap,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero); | ||
|  | 							} | ||
|  | 							else{ | ||
|  | 								CreateGesture( fingerIndex, EvtType.On_DoubleTap,fingers[fingerIndex],  SwipeDirection.None,0,Vector2.zero); | ||
|  | 							} | ||
|  | 							 | ||
|  | 						} | ||
|  | 					} | ||
|  | 					else{ | ||
|  | 						if (!singleDoubleTap[fingerIndex].inWait){ | ||
|  | 							singleDoubleTap[fingerIndex].finger = fingers[fingerIndex]; | ||
|  | 							StartCoroutine(SingleOrDouble(fingerIndex) ); | ||
|  | 						} | ||
|  | 						else{ | ||
|  | 							singleDoubleTap[fingerIndex].count++; | ||
|  | 						} | ||
|  | 					} | ||
|  | 	 | ||
|  | 					break; | ||
|  | 				// long tap | ||
|  | 				case GestureType.LongTap: | ||
|  | 					CreateGesture( fingerIndex, EvtType.On_LongTapEnd,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero); | ||
|  | 					break; | ||
|  | 				// drag | ||
|  | 				case GestureType.Drag: | ||
|  | 					CreateGesture(fingerIndex,  EvtType.On_DragEnd,fingers[fingerIndex], GetSwipe(fingers[fingerIndex].startPosition,fingers[fingerIndex].position), (fingers[fingerIndex].startPosition-fingers[fingerIndex].position).magnitude,fingers[fingerIndex].position-fingers[fingerIndex].startPosition); | ||
|  | 					if (alwaysSendSwipe){ | ||
|  | 						CreateGesture( fingerIndex, EvtType.On_SwipeEnd,fingers[fingerIndex], GetSwipe(fingers[fingerIndex].startPosition, fingers[fingerIndex].position), (fingers[fingerIndex].position-fingers[fingerIndex].startPosition).magnitude,fingers[fingerIndex].position-fingers[fingerIndex].startPosition);  | ||
|  | 					} | ||
|  | 					break; | ||
|  | 				// swipe | ||
|  | 				case GestureType.Swipe: | ||
|  | 					CreateGesture( fingerIndex, EvtType.On_SwipeEnd,fingers[fingerIndex], GetSwipe(fingers[fingerIndex].startPosition, fingers[fingerIndex].position), (fingers[fingerIndex].position-fingers[fingerIndex].startPosition).magnitude,fingers[fingerIndex].position-fingers[fingerIndex].startPosition);  | ||
|  | 					break; | ||
|  | 
 | ||
|  | 				// cancel | ||
|  | 				case GestureType.Cancel: | ||
|  | 					CreateGesture(fingerIndex, EvtType.On_Cancel,fingers[fingerIndex],SwipeDirection.None,0,Vector2.zero); | ||
|  | 					break; | ||
|  | 
 | ||
|  | 			} | ||
|  | 			CreateGesture( fingerIndex, EvtType.On_TouchUp,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero); | ||
|  | 			fingers[fingerIndex]=null;		 | ||
|  | 
 | ||
|  | 		} | ||
|  | 	 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	IEnumerator SingleOrDouble(int fingerIndex){ | ||
|  | 		singleDoubleTap[fingerIndex].inWait = true; | ||
|  | 		float time2Wait = doubleTapTime-singleDoubleTap[fingerIndex].finger.actionTime; | ||
|  | 		if (time2Wait<0) time2Wait =0; | ||
|  | 		yield return new WaitForSeconds(time2Wait); | ||
|  | 
 | ||
|  | 
 | ||
|  | 		if (singleDoubleTap[fingerIndex].count <2){ | ||
|  | 			//CreateGesture( fingerIndex, EvtType.On_SimpleTap,singleDoubleTap[fingerIndex].finger, SwipeDirection.None,0,Vector2.zero); | ||
|  | 			CreateGesture( fingerIndex, EvtType.On_SimpleTap,singleDoubleTap[fingerIndex].finger, SwipeDirection.None,0,singleDoubleTap[fingerIndex].finger.deltaPosition); | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			//CreateGesture( fingerIndex, EvtType.On_DoubleTap,singleDoubleTap[fingerIndex].finger, SwipeDirection.None,0,Vector2.zero); | ||
|  | 			CreateGesture( fingerIndex, EvtType.On_DoubleTap,singleDoubleTap[fingerIndex].finger, SwipeDirection.None,0,singleDoubleTap[fingerIndex].finger.deltaPosition); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		//fingers[fingerIndex]=null; | ||
|  | 		singleDoubleTap[fingerIndex].Stop(); | ||
|  | 		StopCoroutine( "SingleOrDouble"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private void CreateGesture(int touchIndex,EvtType message,Finger finger, SwipeDirection swipe, float swipeLength, Vector2 swipeVector){ | ||
|  | 
 | ||
|  | 		bool firingEvent = true; | ||
|  | 
 | ||
|  | 		if (autoUpdatePickedUI && allowUIDetection){ | ||
|  | 			finger.isOverGui = IsScreenPositionOverUI( finger.position ); | ||
|  | 			finger.pickedUIElement = GetFirstUIElementFromCache(); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// NGui | ||
|  | 		if (enabledNGuiMode  && message == EvtType.On_TouchStart){ | ||
|  | 			finger.isOverGui = finger.isOverGui || IsTouchOverNGui(finger.position); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// firing event ? | ||
|  | 		if ((enableUIMode || enabledNGuiMode)){ | ||
|  | 			firingEvent = !finger.isOverGui; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// The new gesture | ||
|  | 		Gesture gesture = finger.GetGesture(); | ||
|  | 
 | ||
|  | 		// Auto update picked object | ||
|  | 		if (autoUpdatePickedObject && autoSelect){ | ||
|  | 			if (message != EvtType.On_Drag && message != EvtType.On_DragEnd && message != EvtType.On_DragStart){ | ||
|  | 				if (GetPickedGameObject(finger)){ | ||
|  | 					gesture.pickedObject = pickedObject.pickedObj; | ||
|  | 					gesture.pickedCamera = pickedObject.pickedCamera; | ||
|  | 					gesture.isGuiCamera = pickedObject.isGUI; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					gesture.pickedObject = null; | ||
|  | 					gesture.pickedCamera = null; | ||
|  | 					gesture.isGuiCamera = false; | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		gesture.swipe = swipe; | ||
|  | 		gesture.swipeLength = swipeLength; | ||
|  | 		gesture.swipeVector = swipeVector; | ||
|  | 
 | ||
|  | 		gesture.deltaPinch = 0; | ||
|  | 		gesture.twistAngle = 0; | ||
|  | 
 | ||
|  | 
 | ||
|  | 		// Firing event | ||
|  | 		if ( firingEvent){ | ||
|  | 			RaiseEvent(message, gesture); | ||
|  | 		} | ||
|  | 		else if (finger.isOverGui){ | ||
|  | 			if (message == EvtType.On_TouchUp){ | ||
|  | 				RaiseEvent(EvtType.On_UIElementTouchUp, gesture); | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				RaiseEvent(EvtType.On_OverUIElement, gesture); | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 	}	 | ||
|  | 	#endregion | ||
|  | 
 | ||
|  | 	#region Two finger private methods | ||
|  | 	private void TwoFinger(){ | ||
|  | 
 | ||
|  | 		bool move=false; | ||
|  | 				 | ||
|  | 		// A touch starts | ||
|  | 		if ( twoFinger.currentGesture==GestureType.None){ | ||
|  | 
 | ||
|  | 			if (!singleDoubleTap[99].inDoubleTap){ | ||
|  | 				singleDoubleTap[99].inDoubleTap = true; | ||
|  | 				singleDoubleTap[99].time = 0; | ||
|  | 				singleDoubleTap[99].count = 1; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			twoFinger.finger0 = GetTwoFinger(-1); | ||
|  | 			twoFinger.finger1 = GetTwoFinger(twoFinger.finger0); | ||
|  | 			 | ||
|  | 			twoFinger.startTimeAction = Time.realtimeSinceStartup; | ||
|  | 			twoFinger.currentGesture=GestureType.Acquisition;			 | ||
|  | 
 | ||
|  | 			fingers[twoFinger.finger0].startPosition = fingers[twoFinger.finger0].position; | ||
|  | 			fingers[twoFinger.finger1].startPosition = fingers[twoFinger.finger1].position; | ||
|  | 
 | ||
|  | 			fingers[twoFinger.finger0].oldPosition = fingers[twoFinger.finger0].position; | ||
|  | 			fingers[twoFinger.finger1].oldPosition = fingers[twoFinger.finger1].position; | ||
|  | 			 | ||
|  | 			 | ||
|  | 			twoFinger.oldFingerDistance = Mathf.Abs( Vector2.Distance(fingers[twoFinger.finger0].position, fingers[twoFinger.finger1].position)); | ||
|  | 			twoFinger.startPosition = new Vector2((fingers[twoFinger.finger0].position.x+fingers[twoFinger.finger1].position.x)/2, (fingers[twoFinger.finger0].position.y+fingers[twoFinger.finger1].position.y)/2); | ||
|  | 			twoFinger.position = twoFinger.startPosition; | ||
|  | 			twoFinger.oldStartPosition = twoFinger.startPosition; | ||
|  | 			twoFinger.deltaPosition = Vector2.zero; | ||
|  | 			twoFinger.startDistance = twoFinger.oldFingerDistance; | ||
|  | 
 | ||
|  | 			// do we touch a pickable gameobject ? | ||
|  | 			if (autoSelect){ | ||
|  | 				if (GetTwoFingerPickedObject()){ | ||
|  | 					twoFinger.pickedObject = pickedObject.pickedObj; | ||
|  | 					twoFinger.pickedCamera = pickedObject.pickedCamera; | ||
|  | 					twoFinger.isGuiCamera = pickedObject.isGUI; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					twoFinger.ClearPickedObjectData(); | ||
|  | 				} | ||
|  | 			} | ||
|  | 
 | ||
|  | 			// UnityGUI | ||
|  | 			if (allowUIDetection){ | ||
|  | 				if (GetTwoFingerPickedUIElement()){ | ||
|  | 					twoFinger.pickedUIElement = pickedObject.pickedObj; | ||
|  | 					twoFinger.isOverGui = true; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					twoFinger.ClearPickedUIData(); | ||
|  | 				} | ||
|  | 			} | ||
|  | 
 | ||
|  | 			// we notify the touch | ||
|  | 			CreateGesture2Finger(EvtType.On_TouchStart2Fingers,twoFinger.startPosition,twoFinger.startPosition,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.oldFingerDistance);				 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (singleDoubleTap[99].inDoubleTap) singleDoubleTap[99].time += Time.deltaTime; | ||
|  | 
 | ||
|  | 		// Calculates the time since the beginning of the action. | ||
|  | 		twoFinger.timeSinceStartAction =  Time.realtimeSinceStartup -twoFinger.startTimeAction; | ||
|  | 		 | ||
|  | 		// Position & deltaPosition | ||
|  | 		twoFinger.position = new  Vector2((fingers[twoFinger.finger0].position.x+fingers[twoFinger.finger1].position.x)/2, (fingers[twoFinger.finger0].position.y+fingers[twoFinger.finger1].position.y)/2); | ||
|  | 		twoFinger.deltaPosition = twoFinger.position - twoFinger.oldStartPosition; | ||
|  | 		twoFinger.fingerDistance = Mathf.Abs(Vector2.Distance(fingers[twoFinger.finger0].position, fingers[twoFinger.finger1].position)); | ||
|  | 		 | ||
|  | 		// Cancel | ||
|  | 		if (fingers[twoFinger.finger0].phase == TouchPhase.Canceled ||fingers[twoFinger.finger1].phase == TouchPhase.Canceled){ | ||
|  | 			twoFinger.currentGesture = GestureType.Cancel; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Let's go | ||
|  | 		if (fingers[twoFinger.finger0].phase != TouchPhase.Ended && fingers[twoFinger.finger1].phase != TouchPhase.Ended && twoFinger.currentGesture != GestureType.Cancel){ | ||
|  | 
 | ||
|  | 
 | ||
|  | 			// Are we stationary ? | ||
|  | 			if (twoFinger.currentGesture == GestureType.Acquisition && twoFinger.timeSinceStartAction >= longTapTime && FingerInTolerance(fingers[twoFinger.finger0]) && FingerInTolerance(fingers[twoFinger.finger1])){	 | ||
|  | 				twoFinger.currentGesture = GestureType.LongTap;				 | ||
|  | 				// we notify the beginning of a longtouch | ||
|  | 				CreateGesture2Finger(EvtType.On_LongTapStart2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);				 | ||
|  | 			}	 | ||
|  | 			 | ||
|  | 			// Let's move us ? | ||
|  | 			if ( ((FingerInTolerance(fingers[twoFinger.finger0])==false || FingerInTolerance(fingers[twoFinger.finger1])==false) && gesturePriority == GesturePriority.Tap )  | ||
|  | 			|| ((fingers[twoFinger.finger0].phase == TouchPhase.Moved || fingers[twoFinger.finger1].phase == TouchPhase.Moved) && gesturePriority == GesturePriority.Slips) ) { | ||
|  | 				move=true; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			// we move | ||
|  | 			if (move && twoFinger.currentGesture != GestureType.Tap){ | ||
|  | 				Vector2 currentDistance = fingers[twoFinger.finger0].position - fingers[twoFinger.finger1].position; | ||
|  | 				Vector2 previousDistance = fingers[twoFinger.finger0].oldPosition - fingers[twoFinger.finger1].oldPosition ; | ||
|  | 				float currentDelta = currentDistance.magnitude - previousDistance.magnitude; | ||
|  | 
 | ||
|  | 
 | ||
|  | 				#region drag & swipe | ||
|  | 				if (enable2FingersSwipe){ | ||
|  | 					float dot = Vector2.Dot(fingers[twoFinger.finger0].deltaPosition.normalized, fingers[twoFinger.finger1].deltaPosition.normalized); | ||
|  | 
 | ||
|  | 					if (dot>0 ){ | ||
|  | 
 | ||
|  | 						if (twoFinger.oldGesture == GestureType.LongTap){ | ||
|  | 							CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,false,twoFinger.fingerDistance); | ||
|  | 							twoFinger.startTimeAction = Time.realtimeSinceStartup; | ||
|  | 						} | ||
|  | 
 | ||
|  | 						if (twoFinger.pickedObject && !twoFinger.dragStart && !alwaysSendSwipe){ | ||
|  | 
 | ||
|  | 							twoFinger.currentGesture = GestureType.Drag; | ||
|  | 
 | ||
|  | 							CreateGesture2Finger(EvtType.On_DragStart2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);	 | ||
|  | 							CreateGesture2Finger(EvtType.On_SwipeStart2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);	 | ||
|  | 							twoFinger.dragStart = true;  | ||
|  | 						} | ||
|  | 						else if (!twoFinger.pickedObject && !twoFinger.swipeStart){ | ||
|  | 
 | ||
|  | 							twoFinger.currentGesture = GestureType.Swipe; | ||
|  | 
 | ||
|  | 							CreateGesture2Finger(EvtType.On_SwipeStart2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance); | ||
|  | 							twoFinger.swipeStart=true; | ||
|  | 						} | ||
|  | 
 | ||
|  | 					}  | ||
|  | 					else{ | ||
|  | 						if (dot<0){ | ||
|  | 							twoFinger.dragStart=false;  | ||
|  | 							twoFinger.swipeStart=false; | ||
|  | 						} | ||
|  | 					} | ||
|  | 
 | ||
|  | 					// | ||
|  | 					if (twoFinger.dragStart){ | ||
|  | 						CreateGesture2Finger(EvtType.On_Drag2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.oldStartPosition,twoFinger.position),0,twoFinger.deltaPosition,0,0,twoFinger.fingerDistance); | ||
|  | 						CreateGesture2Finger(EvtType.On_Swipe2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.oldStartPosition,twoFinger.position),0,twoFinger.deltaPosition,0,0,twoFinger.fingerDistance); | ||
|  | 					} | ||
|  | 					 | ||
|  | 					if (twoFinger.swipeStart){ | ||
|  | 						CreateGesture2Finger(EvtType.On_Swipe2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.oldStartPosition,twoFinger.position),0,twoFinger.deltaPosition,0,0,twoFinger.fingerDistance); | ||
|  | 					} | ||
|  | 
 | ||
|  | 				} | ||
|  | 				#endregion | ||
|  | 
 | ||
|  | 				DetectPinch(currentDelta); | ||
|  | 				DetecTwist( previousDistance, currentDistance,currentDelta); | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				// Long tap update | ||
|  | 				if (twoFinger.currentGesture == GestureType.LongTap){ | ||
|  | 					CreateGesture2Finger(EvtType.On_LongTap2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance); | ||
|  | 				}	 | ||
|  | 			} | ||
|  | 
 | ||
|  | 			CreateGesture2Finger(EvtType.On_TouchDown2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.oldStartPosition,twoFinger.position),0,twoFinger.deltaPosition,0,0,twoFinger.fingerDistance); | ||
|  | 
 | ||
|  | 			fingers[twoFinger.finger0].oldPosition = fingers[twoFinger.finger0].position; | ||
|  | 			fingers[twoFinger.finger1].oldPosition = fingers[twoFinger.finger1].position; | ||
|  | 
 | ||
|  | 			twoFinger.oldFingerDistance = twoFinger.fingerDistance; | ||
|  | 			twoFinger.oldStartPosition = twoFinger.position; | ||
|  | 			twoFinger.oldGesture = twoFinger.currentGesture; | ||
|  | 
 | ||
|  | 		} | ||
|  | 		else{			 | ||
|  | 
 | ||
|  | 			if (twoFinger.currentGesture != GestureType.Acquisition && twoFinger.currentGesture!= GestureType.Tap){ | ||
|  | 				CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,true,twoFinger.fingerDistance); | ||
|  | 				twoFinger.currentGesture = GestureType.None; | ||
|  | 				twoFinger.pickedObject=null; | ||
|  | 				twoFinger.swipeStart = false; | ||
|  | 				twoFinger.dragStart = false; | ||
|  | 
 | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				twoFinger.currentGesture = GestureType.Tap; | ||
|  | 				CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,true,twoFinger.fingerDistance); | ||
|  | 			} | ||
|  | 		}	 | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 	private void DetectPinch(float currentDelta){ | ||
|  | 		#region Pinch | ||
|  | 		if (enablePinch){ | ||
|  | 
 | ||
|  | 			if ((Mathf.Abs(twoFinger.fingerDistance - twoFinger.startDistance)>= minPinchLength && twoFinger.currentGesture != GestureType.Pinch) || twoFinger.currentGesture== GestureType.Pinch ){ | ||
|  | 
 | ||
|  | 				if (currentDelta !=0 && twoFinger.oldGesture == GestureType.LongTap){ | ||
|  | 					CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,false,twoFinger.fingerDistance); | ||
|  | 					twoFinger.startTimeAction = Time.realtimeSinceStartup; | ||
|  | 				} | ||
|  | 				 | ||
|  | 				twoFinger.currentGesture = GestureType.Pinch; | ||
|  | 				 | ||
|  | 				if (currentDelta>0){ | ||
|  | 					CreateGesture2Finger(EvtType.On_PinchOut,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.startPosition,twoFinger.position),0,Vector2.zero,0,Mathf.Abs(twoFinger.fingerDistance-twoFinger.oldFingerDistance),twoFinger.fingerDistance); | ||
|  | 				} | ||
|  | 				 | ||
|  | 				if (currentDelta<0){ | ||
|  | 					CreateGesture2Finger(EvtType.On_PinchIn,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.startPosition,twoFinger.position),0,Vector2.zero,0,Mathf.Abs(twoFinger.fingerDistance-twoFinger.oldFingerDistance),twoFinger.fingerDistance); | ||
|  | 				} | ||
|  | 				 | ||
|  | 				if (currentDelta<0 || currentDelta>0){ | ||
|  | 					CreateGesture2Finger(EvtType.On_Pinch,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.startPosition,twoFinger.position),0,Vector2.zero,0,currentDelta,twoFinger.fingerDistance); | ||
|  | 				} | ||
|  | 
 | ||
|  | 			} | ||
|  | 
 | ||
|  | 			twoFinger.lastPinch = currentDelta>0?currentDelta:twoFinger.lastPinch; | ||
|  | 		} | ||
|  | 		#endregion | ||
|  | 	} | ||
|  | 	 | ||
|  | 	private void DetecTwist(Vector2 previousDistance, Vector2 currentDistance, float currentDelta){ | ||
|  | 		#region Twist | ||
|  | 		if (enableTwist){ | ||
|  | 
 | ||
|  | 			float twistAngle = Vector2.Angle( previousDistance, currentDistance ); | ||
|  | 
 | ||
|  | 			//Debug.Log( twistAngle); | ||
|  | 			if (previousDistance == currentDistance) | ||
|  | 				twistAngle =0; | ||
|  | 
 | ||
|  | 			if ( Mathf.Abs(twistAngle)>=minTwistAngle && (twoFinger.currentGesture != GestureType.Twist ) || twoFinger.currentGesture== GestureType.Twist ){ | ||
|  | 				 | ||
|  | 				if ( twoFinger.oldGesture == GestureType.LongTap){ | ||
|  | 					CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,false,twoFinger.fingerDistance); | ||
|  | 					twoFinger.startTimeAction = Time.realtimeSinceStartup; | ||
|  | 				} | ||
|  | 				 | ||
|  | 				twoFinger.currentGesture = GestureType.Twist; | ||
|  | 				 | ||
|  | 				if (twistAngle!=0){ | ||
|  | 					twistAngle *= Mathf.Sign( Vector3.Cross( previousDistance,  currentDistance).z); | ||
|  | 				} | ||
|  | 				 | ||
|  | 				CreateGesture2Finger(EvtType.On_Twist,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,twistAngle,0,twoFinger.fingerDistance); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			twoFinger.lastTwistAngle = twistAngle!=0?twistAngle:twoFinger.lastTwistAngle; | ||
|  | 		}			 | ||
|  | 		#endregion | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	private void CreateStateEnd2Fingers(GestureType gesture, Vector2 startPosition, Vector2 position, Vector2 deltaPosition,float time, bool realEnd,float fingerDistance,float twist=0, float pinch=0){ | ||
|  | 
 | ||
|  | 
 | ||
|  | 		switch (gesture){ | ||
|  | 			// Tap | ||
|  | 		case GestureType.Tap: | ||
|  | 		case GestureType.Acquisition: | ||
|  | 
 | ||
|  | 			if (doubleTapDetection == DoubleTapDetection.BySystem){ | ||
|  | 
 | ||
|  | 				if (fingers[twoFinger.finger0].tapCount<2 && fingers[twoFinger.finger1].tapCount<2){ | ||
|  | 					CreateGesture2Finger(EvtType.On_SimpleTap2Fingers,startPosition,position,deltaPosition, | ||
|  | 					                     time, SwipeDirection.None,0,Vector2.zero,0,0,fingerDistance);				 | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					CreateGesture2Finger(EvtType.On_DoubleTap2Fingers,startPosition,position,deltaPosition, | ||
|  | 					                     time, SwipeDirection.None,0,Vector2.zero,0,0,fingerDistance); | ||
|  | 				} | ||
|  | 				twoFinger.currentGesture = GestureType.None; | ||
|  | 				twoFinger.pickedObject=null; | ||
|  | 				twoFinger.swipeStart = false; | ||
|  | 				twoFinger.dragStart = false; | ||
|  | 				singleDoubleTap[99].Stop(); | ||
|  | 				StopCoroutine( "SingleOrDouble2Fingers"); | ||
|  | 
 | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				if (!singleDoubleTap[99].inWait){ | ||
|  | 					StartCoroutine("SingleOrDouble2Fingers" ); | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					singleDoubleTap[99].count++; | ||
|  | 				} | ||
|  | 			} | ||
|  | 			break; | ||
|  | 			 | ||
|  | 			// Long tap | ||
|  | 		case GestureType.LongTap: | ||
|  | 			CreateGesture2Finger(EvtType.On_LongTapEnd2Fingers,startPosition,position,deltaPosition, | ||
|  | 			                     time, SwipeDirection.None,0,Vector2.zero,0,0,fingerDistance); | ||
|  | 			break; | ||
|  | 			 | ||
|  | 			// Pinch  | ||
|  | 		case GestureType.Pinch: | ||
|  | 			CreateGesture2Finger(EvtType.On_PinchEnd,startPosition,position,deltaPosition, | ||
|  | 			                     time, SwipeDirection.None,0,Vector2.zero,0,twoFinger.lastPinch,fingerDistance); | ||
|  | 			break; | ||
|  | 			 | ||
|  | 			// twist | ||
|  | 		case GestureType.Twist: | ||
|  | 			CreateGesture2Finger(EvtType.On_TwistEnd,startPosition,position,deltaPosition, | ||
|  | 			                     time, SwipeDirection.None,0,Vector2.zero,twoFinger.lastTwistAngle,0,fingerDistance); | ||
|  | 			break;	 | ||
|  | 		} | ||
|  | 		 | ||
|  | 		if (realEnd){ | ||
|  | 			// Drag | ||
|  | 			if ( twoFinger.dragStart){ | ||
|  | 				CreateGesture2Finger(EvtType.On_DragEnd2Fingers,startPosition,position,deltaPosition, | ||
|  | 				                     time, GetSwipe( startPosition, position),( position-startPosition).magnitude,position-startPosition,0,0,fingerDistance); | ||
|  | 			}; | ||
|  | 			 | ||
|  | 			// Swipe | ||
|  | 			if ( twoFinger.swipeStart){ | ||
|  | 				CreateGesture2Finger(EvtType.On_SwipeEnd2Fingers,startPosition,position,deltaPosition, | ||
|  | 				                     time, GetSwipe( startPosition, position),( position-startPosition).magnitude,position-startPosition,0,0,fingerDistance); | ||
|  | 			} | ||
|  | 			 | ||
|  | 			CreateGesture2Finger(EvtType.On_TouchUp2Fingers,startPosition,position,deltaPosition,time, SwipeDirection.None,0,Vector2.zero,0,0,fingerDistance); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	IEnumerator SingleOrDouble2Fingers(){ | ||
|  | 		singleDoubleTap[99].inWait = true; | ||
|  | 
 | ||
|  | 		yield return new WaitForSeconds(doubleTapTime); | ||
|  | 
 | ||
|  | 		if (singleDoubleTap[99].count <2){ | ||
|  | 
 | ||
|  | 			CreateGesture2Finger(EvtType.On_SimpleTap2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition, | ||
|  | 			                     twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance); | ||
|  | 
 | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			CreateGesture2Finger(EvtType.On_DoubleTap2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition, | ||
|  | 			                     twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		twoFinger.currentGesture = GestureType.None; | ||
|  | 		twoFinger.pickedObject=null; | ||
|  | 		twoFinger.swipeStart = false; | ||
|  | 		twoFinger.dragStart = false; | ||
|  | 		singleDoubleTap[99].Stop(); | ||
|  | 		StopCoroutine( "SingleOrDouble2Fingers"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private void  CreateGesture2Finger(EvtType message,Vector2 startPosition,Vector2 position,Vector2 deltaPosition, | ||
|  | 	                                   float actionTime, SwipeDirection swipe, float swipeLength,Vector2 swipeVector,float twist,float pinch, float twoDistance){ | ||
|  | 
 | ||
|  | 		bool firingEvent = true; | ||
|  | 		Gesture gesture = new Gesture(); | ||
|  | 		gesture.isOverGui = false; | ||
|  | 
 | ||
|  | 		// NGui | ||
|  | 		if (enabledNGuiMode && message == EvtType.On_TouchStart2Fingers){ | ||
|  | 			gesture.isOverGui = gesture.isOverGui || ( IsTouchOverNGui(twoFinger.position) && IsTouchOverNGui(twoFinger.position)); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		gesture.touchCount=2; | ||
|  | 		gesture.fingerIndex=-1; | ||
|  | 		gesture.startPosition = startPosition;	 | ||
|  | 		gesture.position = position; | ||
|  | 		gesture.deltaPosition = deltaPosition; | ||
|  | 		 | ||
|  | 		gesture.actionTime = actionTime; | ||
|  | 		gesture.deltaTime=Time.deltaTime; | ||
|  | 		 | ||
|  | 		gesture.swipe = swipe; | ||
|  | 		gesture.swipeLength = swipeLength; | ||
|  | 		gesture.swipeVector = swipeVector; | ||
|  | 		 | ||
|  | 		gesture.deltaPinch = pinch; | ||
|  | 		gesture.twistAngle = twist; | ||
|  | 		gesture.twoFingerDistance = twoDistance; | ||
|  | 
 | ||
|  | 		gesture.pickedObject = twoFinger.pickedObject; | ||
|  | 		gesture.pickedCamera = twoFinger.pickedCamera; | ||
|  | 		gesture.isGuiCamera= twoFinger.isGuiCamera; | ||
|  | 
 | ||
|  | 		if (autoUpdatePickedObject){ | ||
|  | 			if (message != EvtType.On_Drag && message != EvtType.On_DragEnd && message != EvtType.On_Twist && message != EvtType.On_TwistEnd && message != EvtType.On_Pinch && message != EvtType.On_PinchEnd | ||
|  | 			 && message != EvtType.On_PinchIn && message != EvtType.On_PinchOut){ | ||
|  | 
 | ||
|  | 				if (GetTwoFingerPickedObject()){ | ||
|  | 					gesture.pickedObject = pickedObject.pickedObj; | ||
|  | 					gesture.pickedCamera = pickedObject.pickedCamera; | ||
|  | 					gesture.isGuiCamera= pickedObject.isGUI; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					twoFinger.ClearPickedObjectData(); | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		gesture.pickedUIElement = twoFinger.pickedUIElement; | ||
|  | 		gesture.isOverGui = twoFinger.isOverGui; | ||
|  | 
 | ||
|  | 
 | ||
|  | 		if (allowUIDetection && autoUpdatePickedUI){ | ||
|  | 			if (message != EvtType.On_Drag && message != EvtType.On_DragEnd && message != EvtType.On_Twist && message != EvtType.On_TwistEnd && message != EvtType.On_Pinch && message != EvtType.On_PinchEnd | ||
|  | 			    && message != EvtType.On_PinchIn && message != EvtType.On_PinchOut){ | ||
|  | 				if (message == EvtType.On_SimpleTap2Fingers) | ||
|  | 
 | ||
|  | 				if (GetTwoFingerPickedUIElement()){ | ||
|  | 					gesture.pickedUIElement = pickedObject.pickedObj; | ||
|  | 					gesture.isOverGui = true; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					twoFinger.ClearPickedUIData(); | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 		// Firing event ? | ||
|  | 		if ((enableUIMode || (enabledNGuiMode && allowUIDetection) ) ){ | ||
|  | 			firingEvent = !gesture.isOverGui; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Firing event | ||
|  | 		if ( firingEvent){ | ||
|  | 			RaiseEvent(message, gesture); | ||
|  | 		} | ||
|  | 		else if (gesture.isOverGui){ | ||
|  | 			if (message == EvtType.On_TouchUp2Fingers){ | ||
|  | 				RaiseEvent(EvtType.On_UIElementTouchUp, gesture); | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				RaiseEvent(EvtType.On_OverUIElement, gesture); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private int GetTwoFinger( int index){ | ||
|  | 		 | ||
|  | 		int i=index+1; | ||
|  | 		bool find=false; | ||
|  | 		 | ||
|  | 		while (i<10 && !find){ | ||
|  | 			if (fingers[i]!=null ){ | ||
|  | 				if( i>=index){ | ||
|  | 					find=true; | ||
|  | 				} | ||
|  | 			} | ||
|  | 			i++; | ||
|  | 		} | ||
|  | 		i--; | ||
|  | 		 | ||
|  | 		return i; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private bool GetTwoFingerPickedObject(){ | ||
|  | 
 | ||
|  | 		bool returnValue = false; | ||
|  | 
 | ||
|  | 		if (twoFingerPickMethod == TwoFingerPickMethod.Finger){ | ||
|  | 			if (GetPickedGameObject(fingers[twoFinger.finger0],false)){ | ||
|  | 				GameObject tmp = pickedObject.pickedObj; | ||
|  | 				if (GetPickedGameObject(fingers[twoFinger.finger1],false)){ | ||
|  | 					if (tmp == pickedObject.pickedObj){ | ||
|  | 						returnValue = true; | ||
|  | 					} | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		else{ | ||
|  | 			if (GetPickedGameObject(fingers[twoFinger.finger0],true)){ | ||
|  | 				returnValue = true; | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return returnValue; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private bool GetTwoFingerPickedUIElement(){ | ||
|  | 
 | ||
|  | 		bool returnValue = false; | ||
|  | 
 | ||
|  | 		if (fingers[twoFinger.finger0] == null){ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (twoFingerPickMethod == TwoFingerPickMethod.Finger){ | ||
|  | 			if (IsScreenPositionOverUI( fingers[twoFinger.finger0].position )){ | ||
|  | 				GameObject tmp = GetFirstUIElementFromCache(); | ||
|  | 
 | ||
|  | 				if (IsScreenPositionOverUI( fingers[twoFinger.finger1].position )){ | ||
|  | 					GameObject tmp2 = GetFirstUIElementFromCache(); | ||
|  | 
 | ||
|  | 					if (tmp2 == tmp || tmp2.transform.IsChildOf( tmp.transform) || tmp.transform.IsChildOf( tmp2.transform)){ | ||
|  | 						pickedObject.pickedObj = tmp; | ||
|  | 						pickedObject.isGUI = true; | ||
|  | 						returnValue = true; | ||
|  | 					} | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			if (IsScreenPositionOverUI( twoFinger.position )){ | ||
|  | 				pickedObject.pickedObj = GetFirstUIElementFromCache(); | ||
|  | 				pickedObject.isGUI = true; | ||
|  | 				returnValue = true; | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return returnValue; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	#endregion | ||
|  | 
 | ||
|  | 	#region General private methods | ||
|  | 	private void RaiseEvent(EvtType evnt, Gesture gesture){ | ||
|  | 				 | ||
|  | 		gesture.type = evnt; | ||
|  | 
 | ||
|  | 		switch(evnt){ | ||
|  | 			case EvtType.On_Cancel: | ||
|  | 				if (On_Cancel!=null) | ||
|  | 					On_Cancel( gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_Cancel2Fingers: | ||
|  | 				if (On_Cancel2Fingers!=null) | ||
|  | 					On_Cancel2Fingers( gesture ); | ||
|  | 				break; | ||
|  | 			case EvtType.On_TouchStart: | ||
|  | 				if (On_TouchStart!=null) | ||
|  | 					On_TouchStart( gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_TouchDown: | ||
|  | 				if (On_TouchDown!=null) | ||
|  | 					On_TouchDown( gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_TouchUp: | ||
|  | 				if (On_TouchUp!=null) | ||
|  | 					On_TouchUp( gesture ); | ||
|  | 				break; | ||
|  | 			case EvtType.On_SimpleTap: | ||
|  | 				if (On_SimpleTap!=null) | ||
|  | 					On_SimpleTap( gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_DoubleTap: | ||
|  | 				if (On_DoubleTap!=null) | ||
|  | 					On_DoubleTap(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_LongTapStart: | ||
|  | 				if (On_LongTapStart!=null) | ||
|  | 					On_LongTapStart(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_LongTap: | ||
|  | 				if (On_LongTap!=null) | ||
|  | 					On_LongTap(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_LongTapEnd: | ||
|  | 				if (On_LongTapEnd!=null) | ||
|  | 					On_LongTapEnd(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_DragStart: | ||
|  | 				if (On_DragStart!=null) | ||
|  | 					On_DragStart(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_Drag: | ||
|  | 				if (On_Drag!=null) | ||
|  | 					On_Drag(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_DragEnd: | ||
|  | 				if (On_DragEnd!=null) | ||
|  | 					On_DragEnd(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_SwipeStart: | ||
|  | 				if (On_SwipeStart!=null) | ||
|  | 					On_SwipeStart( gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_Swipe: | ||
|  | 				if (On_Swipe!=null) | ||
|  | 					On_Swipe( gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_SwipeEnd: | ||
|  | 				if (On_SwipeEnd!=null) | ||
|  | 					On_SwipeEnd(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_TouchStart2Fingers: | ||
|  | 				if (On_TouchStart2Fingers!=null) | ||
|  | 					On_TouchStart2Fingers( gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_TouchDown2Fingers: | ||
|  | 				if (On_TouchDown2Fingers!=null) | ||
|  | 					On_TouchDown2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_TouchUp2Fingers: | ||
|  | 				if (On_TouchUp2Fingers!=null) | ||
|  | 					On_TouchUp2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_SimpleTap2Fingers: | ||
|  | 				if (On_SimpleTap2Fingers!=null) | ||
|  | 					On_SimpleTap2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_DoubleTap2Fingers: | ||
|  | 				if (On_DoubleTap2Fingers!=null) | ||
|  | 					On_DoubleTap2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_LongTapStart2Fingers: | ||
|  | 				if (On_LongTapStart2Fingers!=null) | ||
|  | 					On_LongTapStart2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_LongTap2Fingers: | ||
|  | 				if (On_LongTap2Fingers!=null) | ||
|  | 					On_LongTap2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_LongTapEnd2Fingers: | ||
|  | 				if (On_LongTapEnd2Fingers!=null) | ||
|  | 					On_LongTapEnd2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_Twist: | ||
|  | 				if (On_Twist!=null) | ||
|  | 					On_Twist(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_TwistEnd: | ||
|  | 				if (On_TwistEnd!=null) | ||
|  | 					On_TwistEnd(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_Pinch: | ||
|  | 				if (On_Pinch!=null) | ||
|  | 					On_Pinch(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_PinchIn: | ||
|  | 				if (On_PinchIn!=null) | ||
|  | 					On_PinchIn(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_PinchOut: | ||
|  | 				if (On_PinchOut!=null) | ||
|  | 					On_PinchOut(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_PinchEnd: | ||
|  | 				if (On_PinchEnd!=null) | ||
|  | 					On_PinchEnd(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_DragStart2Fingers: | ||
|  | 				if (On_DragStart2Fingers!=null) | ||
|  | 					On_DragStart2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_Drag2Fingers: | ||
|  | 				if (On_Drag2Fingers!=null) | ||
|  | 					On_Drag2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_DragEnd2Fingers: | ||
|  | 				if (On_DragEnd2Fingers!=null) | ||
|  | 					On_DragEnd2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_SwipeStart2Fingers: | ||
|  | 				if (On_SwipeStart2Fingers!=null) | ||
|  | 					On_SwipeStart2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_Swipe2Fingers: | ||
|  | 				if (On_Swipe2Fingers!=null) | ||
|  | 					On_Swipe2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_SwipeEnd2Fingers: | ||
|  | 				if (On_SwipeEnd2Fingers!=null) | ||
|  | 					On_SwipeEnd2Fingers(gesture); | ||
|  | 				break; | ||
|  | 			case EvtType.On_OverUIElement: | ||
|  | 				if (On_OverUIElement!=null){ | ||
|  | 					On_OverUIElement(gesture); | ||
|  | 				} | ||
|  | 				break; | ||
|  | 			case EvtType.On_UIElementTouchUp: | ||
|  | 				if (On_UIElementTouchUp!=null){ | ||
|  | 					On_UIElementTouchUp( gesture); | ||
|  | 				} | ||
|  | 				break; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Direct Acces  | ||
|  | 		int result = _currentGestures.FindIndex( delegate(Gesture obj) { | ||
|  | 			return obj.type == gesture.type && obj.fingerIndex == gesture.fingerIndex; | ||
|  | 		} | ||
|  | 		); | ||
|  | 
 | ||
|  | 		if (result>-1){ | ||
|  | 			_currentGestures[result].touchCount = gesture.touchCount; | ||
|  | 			_currentGestures[result].position = gesture.position; | ||
|  | 			_currentGestures[result].actionTime = gesture.actionTime; | ||
|  | 			_currentGestures[result].pickedCamera = gesture.pickedCamera; | ||
|  | 			_currentGestures[result].pickedObject = gesture.pickedObject; | ||
|  | 			_currentGestures[result].pickedUIElement = gesture.pickedUIElement; | ||
|  | 			_currentGestures[result].isOverGui = gesture.isOverGui; | ||
|  | 			_currentGestures[result].isGuiCamera = gesture.isGuiCamera; | ||
|  | 
 | ||
|  | 			// Update delta from current | ||
|  | 			_currentGestures[result].deltaPinch += gesture.deltaPinch; | ||
|  | 			_currentGestures[result].deltaPosition += gesture.deltaPosition; | ||
|  | 
 | ||
|  | 			_currentGestures[result].deltaTime += gesture.deltaTime; | ||
|  | 			_currentGestures[result].twistAngle += gesture.twistAngle; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (result==-1 ){ | ||
|  | 			_currentGestures.Add( (Gesture)gesture.Clone()); | ||
|  | 			if (_currentGestures.Count>0){ | ||
|  | 				_currentGesture = _currentGestures[0]; | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private bool GetPickedGameObject(Finger finger, bool isTowFinger=false){ | ||
|  | 
 | ||
|  | 		if (finger == null && !isTowFinger){ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		pickedObject.isGUI = false; | ||
|  | 		pickedObject.pickedObj = null; | ||
|  | 		pickedObject.pickedCamera = null; | ||
|  | 		 | ||
|  | 		if (touchCameras.Count>0){ | ||
|  | 			for (int i=0;i<touchCameras.Count;i++){ | ||
|  | 				if (touchCameras[i].camera!=null && touchCameras[i].camera.enabled){ | ||
|  | 
 | ||
|  | 					Vector2 pos=Vector2.zero; | ||
|  | 					if (!isTowFinger){ | ||
|  | 						pos = finger.position; | ||
|  | 					} | ||
|  | 					else{ | ||
|  | 						pos = twoFinger.position; | ||
|  | 					} | ||
|  | 
 | ||
|  | 					 | ||
|  | 					if (GetGameObjectAt( pos, touchCameras[i].camera,touchCameras[i].guiCamera)){ | ||
|  | 							return true; | ||
|  | 						} | ||
|  | 					/* | ||
|  | 			        Ray ray = touchCameras[i].camera.ScreenPointToRay( pos ); | ||
|  | 			        RaycastHit hit; | ||
|  | 
 | ||
|  | 					if (enable2D){ | ||
|  | 
 | ||
|  | 						LayerMask mask2d = pickableLayers2D; | ||
|  | 						RaycastHit2D[] hit2D = new RaycastHit2D[1]; | ||
|  | 						if (Physics2D.GetRayIntersectionNonAlloc( ray,hit2D,float.PositiveInfinity,mask2d)>0){ | ||
|  | 							pickedObject.pickedCamera = touchCameras[i].camera; | ||
|  | 							pickedObject.isGUI = touchCameras[i].guiCamera; | ||
|  | 							pickedObject.pickedObj = hit2D[0].collider.gameObject; | ||
|  | 							return true; | ||
|  | 						} | ||
|  | 					} | ||
|  | 
 | ||
|  | 					LayerMask mask = pickableLayers3D; | ||
|  | 						 | ||
|  | 			        if( Physics.Raycast( ray, out hit,float.MaxValue,mask ) ){ | ||
|  | 						pickedObject.pickedCamera = touchCameras[i].camera; | ||
|  | 						pickedObject.isGUI = touchCameras[i].guiCamera; | ||
|  | 						pickedObject.pickedObj = hit.collider.gameObject; | ||
|  | 			            return true; | ||
|  | 					}*/ | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			Debug.LogWarning("No camera is assigned to EasyTouch");	 | ||
|  | 		} | ||
|  |         return false;      | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private bool GetGameObjectAt(Vector2 position, Camera cam, bool isGuiCam){ | ||
|  | 
 | ||
|  | 		Ray ray = cam.ScreenPointToRay( position ); | ||
|  | 		RaycastHit hit; | ||
|  | 
 | ||
|  | 		if (enable2D){ | ||
|  | 			 | ||
|  | 			LayerMask mask2d = pickableLayers2D; | ||
|  | 			RaycastHit2D[] hit2D = new RaycastHit2D[1]; | ||
|  | 			if (Physics2D.GetRayIntersectionNonAlloc( ray,hit2D,float.PositiveInfinity,mask2d)>0){ | ||
|  | 				pickedObject.pickedCamera = cam; | ||
|  | 				pickedObject.isGUI = isGuiCam; | ||
|  | 				pickedObject.pickedObj = hit2D[0].collider.gameObject; | ||
|  | 				return true; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		 | ||
|  | 		LayerMask mask = pickableLayers3D; | ||
|  | 		 | ||
|  | 		if( Physics.Raycast( ray, out hit,float.MaxValue,mask ) ){ | ||
|  | 			pickedObject.pickedCamera = cam; | ||
|  | 			pickedObject.isGUI =isGuiCam; | ||
|  | 			pickedObject.pickedObj = hit.collider.gameObject; | ||
|  | 			return true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private SwipeDirection GetSwipe(Vector2 start, Vector2 end){ | ||
|  | 		 | ||
|  | 		Vector2 linear; | ||
|  | 		linear = (end - start).normalized; | ||
|  | 
 | ||
|  | 		if ( Vector2.Dot( linear, Vector2.up) >= swipeTolerance) | ||
|  | 			return SwipeDirection.Up; | ||
|  | 
 | ||
|  | 		if ( Vector2.Dot( linear, -Vector2.up) >= swipeTolerance) | ||
|  | 			return SwipeDirection.Down; | ||
|  | 
 | ||
|  | 		if ( Vector2.Dot( linear,  Vector2.right) >= swipeTolerance) | ||
|  | 			return SwipeDirection.Right; | ||
|  | 
 | ||
|  | 		if ( Vector2.Dot( linear,  -Vector2.right) >= swipeTolerance) | ||
|  | 			return SwipeDirection.Left; | ||
|  | 
 | ||
|  | 		if ( Vector2.Dot( linear, new Vector2(0.5f,0.5f).normalized) >= swipeTolerance) | ||
|  | 			return SwipeDirection.UpRight; | ||
|  | 
 | ||
|  | 		if ( Vector2.Dot( linear, new Vector2(0.5f,-0.5f).normalized) >= swipeTolerance) | ||
|  | 			return SwipeDirection.DownRight; | ||
|  | 			 | ||
|  | 		if ( Vector2.Dot( linear, new Vector2(-0.5f,0.5f).normalized) >= swipeTolerance) | ||
|  | 			return SwipeDirection.UpLeft; | ||
|  | 
 | ||
|  | 		if ( Vector2.Dot( linear, new Vector2(-0.5f,-0.5f).normalized) >= swipeTolerance) | ||
|  | 			return SwipeDirection.DownLeft; | ||
|  | 
 | ||
|  | 		return SwipeDirection.Other;			 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private bool FingerInTolerance(Finger finger ){ | ||
|  | 
 | ||
|  | 		if ((finger.position-finger.startPosition).sqrMagnitude <= (StationaryTolerance*StationaryTolerance)){ | ||
|  | 			return true; | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private bool IsTouchOverNGui(Vector2 position, bool isTwoFingers=false){ | ||
|  | 		 | ||
|  | 		bool returnValue = false; | ||
|  | 		 | ||
|  | 		if (enabledNGuiMode){ | ||
|  | 			 | ||
|  | 			LayerMask mask= nGUILayers; | ||
|  | 			RaycastHit hit; | ||
|  | 								 | ||
|  | 			int i=0; | ||
|  | 			while (!returnValue && i<nGUICameras.Count){ | ||
|  | 				Vector2 pos = Vector2.zero; | ||
|  | 				if (!isTwoFingers){ | ||
|  | 					pos = position;//fingers[touchIndex].position; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					pos = twoFinger.position; | ||
|  | 				} | ||
|  | 				Ray ray = nGUICameras[i].ScreenPointToRay( pos ); | ||
|  | 
 | ||
|  | 				returnValue =  Physics.Raycast( ray, out hit,float.MaxValue,mask ); | ||
|  | 				i++; | ||
|  | 			} | ||
|  | 
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return returnValue; | ||
|  | 	 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private Finger GetFinger(int finderId){ | ||
|  | 		int t=0; | ||
|  | 		 | ||
|  | 		Finger fing=null; | ||
|  | 		 | ||
|  | 		while (t < 10 && fing==null){	 | ||
|  | 			if (fingers[t] != null ){ | ||
|  | 				if ( fingers[t].fingerIndex == finderId){				 | ||
|  | 					fing = fingers[t];		 | ||
|  | 				} | ||
|  | 			} | ||
|  | 			t++;	 | ||
|  | 		}	 | ||
|  | 		 | ||
|  | 		return fing; | ||
|  | 	} | ||
|  | 	#endregion | ||
|  | 
 | ||
|  | 	#region Unity UI | ||
|  | 	private bool IsScreenPositionOverUI( Vector2 position){ | ||
|  | 
 | ||
|  | 		uiEventSystem = EventSystem.current; | ||
|  | 		if (uiEventSystem != null){ | ||
|  | 
 | ||
|  | 			uiPointerEventData = new PointerEventData( uiEventSystem); | ||
|  | 			uiPointerEventData.position = position; | ||
|  | 
 | ||
|  | 			uiEventSystem.RaycastAll( uiPointerEventData, uiRaycastResultCache); | ||
|  | 			if (uiRaycastResultCache.Count>0){ | ||
|  | 				return true; | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				return false; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	private GameObject GetFirstUIElementFromCache(){ | ||
|  | 
 | ||
|  | 		if (uiRaycastResultCache.Count>0){ | ||
|  | 			return uiRaycastResultCache[0].gameObject; | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return null; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	                                                | ||
|  | 	private GameObject GetFirstUIElement( Vector2 position){ | ||
|  | 
 | ||
|  | 		if (IsScreenPositionOverUI( position)){ | ||
|  | 			return GetFirstUIElementFromCache(); | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return null; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	#endregion | ||
|  | 
 | ||
|  | 	#region Static Method | ||
|  | 	// Unity UI compatibility | ||
|  | 	public static bool IsFingerOverUIElement( int fingerIndex){ | ||
|  | 		if (EasyTouch.instance!=null){ | ||
|  | 			Finger finger = EasyTouch.instance.GetFinger(fingerIndex); | ||
|  | 			if (finger != null){ | ||
|  | 				return EasyTouch.instance.IsScreenPositionOverUI( finger.position); | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				return false; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	 | ||
|  | 	public static GameObject GetCurrentPickedUIElement( int fingerIndex,bool isTwoFinger){ | ||
|  | 		if (EasyTouch.instance!=null){ | ||
|  | 			Finger finger = EasyTouch.instance.GetFinger(fingerIndex); | ||
|  | 			if (finger != null || isTwoFinger){ | ||
|  | 				Vector2 pos = Vector2.zero; | ||
|  | 				if (!isTwoFinger){ | ||
|  | 					pos = finger.position; | ||
|  | 				} | ||
|  | 				else{ | ||
|  | 					pos = EasyTouch.instance.twoFinger.position; | ||
|  | 				} | ||
|  | 				return EasyTouch.instance.GetFirstUIElement( pos); | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				return null; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return null; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static GameObject GetCurrentPickedObject(int fingerIndex, bool isTwoFinger){ | ||
|  | 
 | ||
|  | 		if (EasyTouch.instance!=null){ | ||
|  | 			Finger finger = EasyTouch.instance.GetFinger(fingerIndex); | ||
|  | 
 | ||
|  | 			if ((finger!=null || isTwoFinger) && EasyTouch.instance.GetPickedGameObject(finger,isTwoFinger)){ | ||
|  | 				return EasyTouch.instance.pickedObject.pickedObj; | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				return null; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return null; | ||
|  | 		} | ||
|  | 		 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static GameObject GetGameObjectAt( Vector2 position, bool isTwoFinger = false){ | ||
|  | 
 | ||
|  | 
 | ||
|  | 		if (EasyTouch.instance!=null){ | ||
|  | 
 | ||
|  | 			if (isTwoFinger) position = EasyTouch.instance.twoFinger.position; | ||
|  | 			if (EasyTouch.instance.touchCameras.Count>0){ | ||
|  | 				for (int i=0;i<EasyTouch.instance.touchCameras.Count;i++){ | ||
|  | 					if (EasyTouch.instance.touchCameras[i].camera!=null && EasyTouch.instance.touchCameras[i].camera.enabled){ | ||
|  | 						if( EasyTouch.instance.GetGameObjectAt( position,EasyTouch.instance.touchCameras[i].camera,EasyTouch.instance.touchCameras[i].guiCamera)){ | ||
|  | 							return EasyTouch.instance.pickedObject.pickedObj; | ||
|  | 						} | ||
|  | 						else{ | ||
|  | 							return null; | ||
|  | 						} | ||
|  | 					} | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	public static int GetTouchCount(){ | ||
|  | 		if (EasyTouch.instance){ | ||
|  | 			return EasyTouch.instance.input.TouchCount(); | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return 0; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void ResetTouch(int fingerIndex){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.GetFinger(fingerIndex).gesture=GestureType.None; | ||
|  | 	} | ||
|  | 	 | ||
|  | 
 | ||
|  | 	public static void SetEnabled( bool enable){ | ||
|  | 		EasyTouch.instance.enable = enable; | ||
|  | 		if (enable){ | ||
|  | 			EasyTouch.instance.ResetTouches();	 | ||
|  | 		} | ||
|  | 	} | ||
|  | 	public static bool GetEnabled(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.enable; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetEnableUIDetection( bool enable){ | ||
|  | 		if (EasyTouch.instance != null){ | ||
|  | 			EasyTouch.instance.allowUIDetection = enable; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	public static bool GetEnableUIDetection(){ | ||
|  | 		if (EasyTouch.instance){ | ||
|  | 			return EasyTouch.instance.allowUIDetection; | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetUICompatibily(bool value){ | ||
|  | 		if (EasyTouch.instance != null){ | ||
|  | 			EasyTouch.instance.enableUIMode = value; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	public static bool GetUIComptability(){ | ||
|  | 		if (EasyTouch.instance != null){ | ||
|  | 			return EasyTouch.instance.enableUIMode; | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	 | ||
|  | 	public static void SetAutoUpdateUI(bool value){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.autoUpdatePickedUI = value; | ||
|  | 	} | ||
|  | 	public static bool GetAutoUpdateUI(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.autoUpdatePickedUI; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 	 | ||
|  | 	public static void SetNGUICompatibility(bool value){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.enabledNGuiMode = value; | ||
|  | 	} | ||
|  | 	public static bool GetNGUICompatibility(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.enabledNGuiMode; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 	 | ||
|  | 
 | ||
|  | 	public static void SetEnableAutoSelect( bool value){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.autoSelect = value; | ||
|  | 	} | ||
|  | 	public static bool GetEnableAutoSelect(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.autoSelect; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetAutoUpdatePickedObject(bool value){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.autoUpdatePickedObject = value; | ||
|  | 	} | ||
|  | 	public static bool GetAutoUpdatePickedObject(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.autoUpdatePickedObject; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void Set3DPickableLayer(LayerMask mask){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.pickableLayers3D = mask;	 | ||
|  | 	} | ||
|  | 	public static LayerMask Get3DPickableLayer(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.pickableLayers3D;	 | ||
|  | 		else | ||
|  | 			return LayerMask.GetMask("Default"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void AddCamera(Camera cam,bool guiCam=false){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.touchCameras.Add(new ECamera(cam,guiCam)); | ||
|  | 	} | ||
|  | 	public static void RemoveCamera( Camera cam){ | ||
|  | 		if (EasyTouch.instance){ | ||
|  | 
 | ||
|  | 			int result = EasyTouch.instance.touchCameras.FindIndex( | ||
|  | 				delegate( ECamera c){ | ||
|  | 				return c.camera == cam; | ||
|  | 			} | ||
|  | 			); | ||
|  | 
 | ||
|  | 			if (result>-1){ | ||
|  | 				EasyTouch.instance.touchCameras[result]=null; | ||
|  | 				EasyTouch.instance.touchCameras.RemoveAt( result); | ||
|  | 
 | ||
|  | 			} | ||
|  | 
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static Camera GetCamera(int index=0){ | ||
|  | 		if (EasyTouch.instance){ | ||
|  | 			if (index< EasyTouch.instance.touchCameras.Count){ | ||
|  | 				return EasyTouch.instance.touchCameras[index].camera;	 | ||
|  | 			} | ||
|  | 			else{ | ||
|  | 				return null;	 | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return null; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetEnable2DCollider(bool value){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.enable2D = value; | ||
|  | 	} | ||
|  | 	public static bool GetEnable2DCollider(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.enable2D; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void Set2DPickableLayer(LayerMask mask){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.pickableLayers2D = mask;	 | ||
|  | 	} | ||
|  | 	public static LayerMask Get2DPickableLayer(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.pickableLayers2D;	 | ||
|  | 		else | ||
|  | 			return LayerMask.GetMask("Default"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	public static void SetGesturePriority( GesturePriority value){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.gesturePriority = value; | ||
|  | 	} | ||
|  | 	public static GesturePriority GetGesturePriority(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.gesturePriority; | ||
|  | 		else | ||
|  | 			return GesturePriority.Tap; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetStationaryTolerance(float tolerance){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.StationaryTolerance = tolerance; | ||
|  | 	} | ||
|  | 	public static float GetStationaryTolerance(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.StationaryTolerance; | ||
|  | 		else | ||
|  | 			return -1; | ||
|  | 	} | ||
|  | 	 | ||
|  | 	public static void SetLongTapTime(float time){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.longTapTime = time; | ||
|  | 	} | ||
|  | 	public static float GetlongTapTime(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.longTapTime; | ||
|  | 		else | ||
|  | 			return -1; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetDoubleTapTime(float time){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.doubleTapTime = time; | ||
|  | 	} | ||
|  | 	public static float GetDoubleTapTime(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.doubleTapTime; | ||
|  | 		else | ||
|  | 			return -1; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetDoubleTapMethod(DoubleTapDetection detection){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.doubleTapDetection = detection; | ||
|  | 	} | ||
|  | 	public static EasyTouch.DoubleTapDetection GetDoubleTapMethod(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.doubleTapDetection; | ||
|  | 		else | ||
|  | 			return EasyTouch.DoubleTapDetection.BySystem; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetSwipeTolerance( float tolerance){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.swipeTolerance = tolerance; | ||
|  | 	} | ||
|  | 	public static float GetSwipeTolerance(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.swipeTolerance; | ||
|  | 		else | ||
|  | 			return -1; | ||
|  | 	} | ||
|  | 	 | ||
|  | 
 | ||
|  | 	public static void SetEnable2FingersGesture( bool enable){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.enable2FingersGesture = enable; | ||
|  | 	} | ||
|  | 	public static bool GetEnable2FingersGesture(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.enable2FingersGesture; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetTwoFingerPickMethod( EasyTouch.TwoFingerPickMethod pickMethod){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.twoFingerPickMethod = pickMethod; | ||
|  | 	} | ||
|  | 	public static EasyTouch.TwoFingerPickMethod GetTwoFingerPickMethod(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.twoFingerPickMethod; | ||
|  | 		else | ||
|  | 			return EasyTouch.TwoFingerPickMethod.Finger; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetEnablePinch( bool enable){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.enablePinch = enable; | ||
|  | 	} | ||
|  | 	public static bool GetEnablePinch(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.enablePinch; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetMinPinchLength(float length){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.minPinchLength=length; | ||
|  | 	} | ||
|  | 	public static float GetMinPinchLength(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.minPinchLength; | ||
|  | 		else | ||
|  | 			return -1; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetEnableTwist( bool enable){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.enableTwist = enable; | ||
|  | 	} | ||
|  | 	public static bool GetEnableTwist(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.enableTwist; | ||
|  | 		else | ||
|  | 			return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static void SetMinTwistAngle(float angle){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			EasyTouch.instance.minTwistAngle = angle; | ||
|  | 	} | ||
|  | 	public static float GetMinTwistAngle(){ | ||
|  | 		if (EasyTouch.instance) | ||
|  | 			return EasyTouch.instance.minTwistAngle; | ||
|  | 		else  | ||
|  | 			return -1; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static bool GetSecondeFingerSimulation(){ | ||
|  | 		 | ||
|  | 		if (EasyTouch.instance != null){ | ||
|  | 			return EasyTouch.instance.enableSimulation; | ||
|  | 		} | ||
|  | 		else{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	public static void SetSecondFingerSimulation(bool value){ | ||
|  | 		if (EasyTouch.instance != null){ | ||
|  | 			EasyTouch.instance.enableSimulation = value; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	#endregion | ||
|  | 	 | ||
|  | } | ||
|  | } |