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