13using System.Collections.Generic;
19 [Header(
" Interaction Setup")]
20 [Tooltip(
"The current Leap Data Provider for the scene.")]
23 [Tooltip(
"An optional alternate detector for pinching on the left hand.")]
28 [Tooltip(
"An optional alternate detector for pinching on the right hand.")]
33 [Tooltip(
"How many hands and pointers the Input Module should allocate for.")]
35 int NumberOfPointers = 2;
38 [Header(
" Pointer Setup")]
39 [Tooltip(
"The sprite used to represent your pointers during projective interaction.")]
42 [Tooltip(
"The material to be instantiated for your pointers during projective interaction.")]
45 [Tooltip(
"The color of the pointer when it is hovering over blank canvas.")]
48 [Tooltip(
"The color of the pointer when it is hovering over any other UI element.")]
51 [Tooltip(
"The color of the pointer when it is triggering a UI element.")]
54 [Tooltip(
"The color of the pointer when it is triggering blank canvas.")]
59 [Header(
" Advanced Options")]
60 [Tooltip(
"Whether or not to show Advanced Options in the Inspector.")]
62 [Tooltip(
"The distance from the base of a UI element that tactile interaction is triggered.")]
65 [Tooltip(
"The sound that is played when the pointer transitions from canvas to element.")]
68 [Tooltip(
"The sound that is played when the pointer transitions from canvas to element.")]
71 [Tooltip(
"The sound that is played when the pointer triggers a UI element.")]
74 [Tooltip(
"The sound that is played when the pointer triggers a UI element.")]
77 [Tooltip(
"The sound that is played when the pointer triggers blank canvas.")]
80 [Tooltip(
"The sound that is played when the pointer triggers blank canvas.")]
83 [Tooltip(
"The sound that is played while the pointer is dragging an object.")]
91 [Header(
" Event Setup")]
92 [Tooltip(
"The event that is triggered upon clicking on a non-canvas UI element.")]
95 [Tooltip(
"The event that is triggered upon lifting up from a non-canvas UI element (Not 1:1 with onClickDown!)")]
98 [Tooltip(
"The event that is triggered upon hovering over a non-canvas UI element.")]
101 [Tooltip(
"The event that is triggered while holding down a non-canvas UI element.")]
105 [Tooltip(
"Whether or not to show unsupported Experimental Options in the Inspector.")]
120 [Tooltip(
"The interaction mode that the Input Module will be restricted to.")]
123 [Tooltip(
"The distance from the base of a UI element that interaction switches from Projective-Pointer based to Touch based.")]
126 [Tooltip(
"The size of the pointer in world coordinates with respect to the distance between the cursor and the camera.")]
129 [Tooltip(
"The size of the pointer in world coordinates with respect to the distance between the thumb and forefinger.")]
132 [Tooltip(
"When not using a PinchDetector, the distance in mm that the tip of the thumb and forefinger should be to activate selection during projective interaction.")]
135 [Tooltip(
"Create a pointer for each finger.")]
138 [Tooltip(
"Render the pointer onto the enviroment.")]
141 [Tooltip(
"The event that is triggered while pinching to a point in the environment.")]
144 [Tooltip(
"Render a smaller pointer inside of the main pointer.")]
147 [Tooltip(
"The Opacity of the Inner Pointer relative to the Primary Pointer.")]
150 [Tooltip(
"Trigger a Hover Event when switching between UI elements.")]
153 [Tooltip(
"If the ScrollView still doesn't work even after disabling RaycastTarget on the intermediate layers.")]
156 [Tooltip(
"Draw the raycast for projective interaction.")]
159 [Tooltip(
"Retract compressible widgets when not using Tactile Interaction.")]
162 [Tooltip(
"Retransform the Interaction Pointer to allow the Module to work in a non-stationary reference frame.")]
168 private PointerEventData[] PointEvents;
169 private pointerStates[] pointerState;
170 private Transform[] Pointers;
171 private Transform[] InnerPointers;
172 private LineRenderer[] PointerLines;
175 private GameObject[] currentOverGo;
178 private pointerStates[] PrevState;
179 private Vector2[] PrevScreenPosition;
180 private Vector2[] DragBeginPosition;
181 private bool[] PrevTriggeringInteraction;
182 private bool PrevTouchingMode;
183 private GameObject[] prevOverGo;
184 private float[] timeEnteredCanvas;
187 private Canvas[] canvases;
188 private Quaternion CurrentRotation;
189 private AudioSource SoundPlayer;
190 private GameObject[] currentGo;
191 private GameObject[] currentGoing;
192 private Vector3 OldCameraPos = Vector3.zero;
193 private Quaternion OldCameraRot = Quaternion.identity;
195 private bool forceProjective =
false;
196 private bool forceTactile =
false;
199 private Queue<Vector3> DebugSphereQueue;
201 enum pointerStates :
int {
219 Debug.LogError(
"Cannot use LeapImageRetriever if there is no LeapProvider!");
225 canvases = Resources.FindObjectsOfTypeAll<Canvas>();
230 forceTactile =
false;
231 forceProjective =
true;
235 forceProjective =
false;
240 NumberOfPointers = 10;
242 Pointers =
new Transform[NumberOfPointers];
243 InnerPointers =
new Transform[NumberOfPointers];
244 PointerLines =
new LineRenderer[NumberOfPointers];
245 for (
int index = 0; index < Pointers.Length; index++) {
247 GameObject pointer =
new GameObject(
"Pointer " + index);
248 SpriteRenderer renderer = pointer.AddComponent<SpriteRenderer>();
249 renderer.sortingOrder = 1000;
256 PointerLines[index] = pointer.AddComponent<LineRenderer>();
258 PointerLines[index].material.color =
new Color(0f, 0f, 0f, 0f);
259#if UNITY_5_5_OR_NEWER
260#if UNITY_5_6_OR_NEWER
261 PointerLines[index].positionCount = 2;
263 PointerLines[index].numPositions = 2;
265 PointerLines[index].startWidth = 0.001f;
266 PointerLines[index].endWidth = 0.001f;
268 PointerLines[index].SetVertexCount(2);
269 PointerLines[index].SetWidth(0.001f, 0.001f);
273 Pointers[index] = pointer.GetComponent<Transform>();
274 Pointers[index].parent = transform;
275 pointer.SetActive(
false);
279 GameObject innerPointer =
new GameObject(
"Pointer " + index);
280 renderer = innerPointer.AddComponent<SpriteRenderer>();
281 renderer.sortingOrder = 1000;
288 InnerPointers[index] = innerPointer.GetComponent<Transform>();
289 InnerPointers[index].parent = transform;
290 innerPointer.SetActive(
false);
296 SoundPlayer = this.gameObject.AddComponent<AudioSource>();
299 PointEvents =
new PointerEventData[NumberOfPointers];
300 pointerState =
new pointerStates[NumberOfPointers];
301 currentOverGo =
new GameObject[NumberOfPointers];
302 prevOverGo =
new GameObject[NumberOfPointers];
303 currentGo =
new GameObject[NumberOfPointers];
304 currentGoing =
new GameObject[NumberOfPointers];
305 PrevTriggeringInteraction =
new bool[NumberOfPointers];
306 PrevScreenPosition =
new Vector2[NumberOfPointers];
307 DragBeginPosition =
new Vector2[NumberOfPointers];
308 PrevState =
new pointerStates[NumberOfPointers];
309 timeEnteredCanvas =
new float[NumberOfPointers];
312 if (Camera.main !=
null) {
313 CurrentRotation = Camera.main.transform.rotation;
315 Debug.LogAssertion(
"Tag your Main Camera with 'MainCamera' for the UI Module");
320 DebugSphereQueue =
new Queue<Vector3>();
326 if (Camera.main !=
null) {
327 Quaternion HeadYaw = Quaternion.Euler(0f, OldCameraRot.eulerAngles.y, 0f);
328 CurrentRotation = Quaternion.Slerp(CurrentRotation, HeadYaw, 0.1f);
338 OldCameraPos = Camera.main.transform.position;
339 OldCameraRot = Camera.main.transform.rotation;
344 SendUpdateEventToSelectedObject();
347 for (
int whichPointer = 0; whichPointer < NumberOfPointers; whichPointer++) {
351 whichHand = whichPointer <= 4 ? 0 : 1;
352 whichFinger = whichPointer <= 4 ? whichPointer : whichPointer - 5;
355 if (Pointers[whichPointer].gameObject.activeInHierarchy ==
true) {
356 Pointers[whichPointer].gameObject.SetActive(
false);
358 InnerPointers[whichPointer].gameObject.SetActive(
false);
364 whichHand = whichPointer;
368 if (Pointers[whichPointer].gameObject.activeInHierarchy ==
true) {
369 Pointers[whichPointer].gameObject.SetActive(
false);
371 InnerPointers[whichPointer].gameObject.SetActive(
false);
379 Vector3 ProjectionOrigin = Vector3.zero;
380 if (Camera.main !=
null) {
383 ProjectionOrigin = OldCameraPos + CurrentRotation *
new Vector3(0.15f, -0.2f, 0f);
386 ProjectionOrigin = OldCameraPos + CurrentRotation *
new Vector3(-0.15f, -0.2f, 0f);
393 DebugSphereQueue.Enqueue(ProjectionOrigin);
394 Debug.DrawRay(ProjectionOrigin, CurrentRotation * Vector3.forward * 5f);
398 bool TipRaycast =
false;
400 TipRaycast = GetLookPointerEventData(whichPointer, whichHand, whichFinger, ProjectionOrigin, CurrentRotation * Vector3.forward,
true);
401 PrevState[whichPointer] = pointerState[whichPointer];
402 UpdatePointer(whichPointer, PointEvents[whichPointer], PointEvents[whichPointer].pointerCurrentRaycast.gameObject);
403 ProcessState(whichPointer, whichHand, whichFinger, TipRaycast);
408 TipRaycast = GetLookPointerEventData(whichPointer, whichHand, whichFinger, ProjectionOrigin, CurrentRotation * Vector3.forward,
false);
410 PrevState[whichPointer] = pointerState[whichPointer];
412 UpdatePointer(whichPointer, PointEvents[whichPointer], PointEvents[whichPointer].pointerCurrentRaycast.gameObject);
414 PointEvents[whichPointer].pointerCurrentRaycast =
new RaycastResult();
416 ProcessState(whichPointer, whichHand, whichFinger, TipRaycast);
420 if ((
EnvironmentPointer) && (pointerState[whichPointer] == pointerStates.OffCanvas)) {
422 RaycastHit EnvironmentSpot;
423 Physics.Raycast(ProjectionOrigin, (IndexMetacarpal - ProjectionOrigin).normalized, out EnvironmentSpot);
424 Pointers[whichPointer].position = EnvironmentSpot.point + (EnvironmentSpot.normal * 0.01f);
425 Pointers[whichPointer].rotation = Quaternion.LookRotation(EnvironmentSpot.normal);
427 InnerPointers[whichPointer].position = EnvironmentSpot.point + (EnvironmentSpot.normal * 0.01f);
428 InnerPointers[whichPointer].rotation = Quaternion.LookRotation(EnvironmentSpot.normal);
430 evaluatePointerSize(whichPointer);
437 PrevScreenPosition[whichPointer] = PointEvents[whichPointer].position;
440 PointerLines[whichPointer].SetPosition(0, Camera.main.transform.position);
441 PointerLines[whichPointer].SetPosition(1, Pointers[whichPointer].position);
445 ProcessStateEvents(whichPointer);
446 if ((PointEvents[whichPointer] !=
null)) {
448 GameObject Hoverer = ExecuteEvents.GetEventHandler<IPointerClickHandler>(PointEvents[whichPointer].pointerCurrentRaycast.gameObject);
449 if ((Hoverer !=
null)) {
451 if (comp ==
null) { comp = Hoverer.GetComponentInParent<
ILeapWidget>(); }
460 if (PointEvents[whichPointer].pointerCurrentRaycast.gameObject !=
null && pointerState[whichPointer] != pointerStates.OffCanvas) {
461 prevOverGo[whichPointer] = currentOverGo[whichPointer];
462 currentOverGo[whichPointer] = PointEvents[whichPointer].pointerCurrentRaycast.gameObject;
465 base.HandlePointerExitAndEnter(PointEvents[whichPointer], currentOverGo[whichPointer]);
468 if (!PrevTriggeringInteraction[whichPointer] &&
isTriggeringInteraction(whichPointer, whichHand, whichFinger)) {
469 PrevTriggeringInteraction[whichPointer] =
true;
471 if ((Time.time - timeEnteredCanvas[whichPointer] >= Time.deltaTime)) {
473 if (base.eventSystem.currentSelectedGameObject) {
474 base.eventSystem.SetSelectedGameObject(
null);
478 PointEvents[whichPointer].pressPosition = PointEvents[whichPointer].position;
479 PointEvents[whichPointer].pointerPressRaycast = PointEvents[whichPointer].pointerCurrentRaycast;
480 PointEvents[whichPointer].pointerPress =
null;
481 PointEvents[whichPointer].useDragThreshold =
true;
484 if (currentOverGo[whichPointer] !=
null) {
485 currentGo[whichPointer] = currentOverGo[whichPointer];
488 GameObject newPressed = ExecuteEvents.ExecuteHierarchy(currentGo[whichPointer], PointEvents[whichPointer], ExecuteEvents.pointerDownHandler);
491 if (newPressed ==
null) {
492 newPressed = ExecuteEvents.ExecuteHierarchy(currentGo[whichPointer], PointEvents[whichPointer], ExecuteEvents.pointerClickHandler);
493 if (newPressed !=
null) {
494 currentGo[whichPointer] = newPressed;
497 currentGo[whichPointer] = newPressed;
504 if (newPressed !=
null) {
505 PointEvents[whichPointer].pointerPress = newPressed;
506 currentGo[whichPointer] = newPressed;
509 if (ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentGo[whichPointer])) {
510 base.eventSystem.SetSelectedGameObject(currentGo[whichPointer]);
515 PointEvents[whichPointer].pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(currentGo[whichPointer]);
518 if (PointEvents[whichPointer].pointerDrag) {
519 IDragHandler Dragger = PointEvents[whichPointer].pointerDrag.GetComponent<IDragHandler>();
520 if (Dragger !=
null) {
521 if (Dragger is EventTrigger && PointEvents[whichPointer].pointerDrag.transform.parent) {
522 PointEvents[whichPointer].pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(PointEvents[whichPointer].pointerDrag.transform.parent.gameObject);
523 if (PointEvents[whichPointer].pointerDrag !=
null) {
524 Dragger = PointEvents[whichPointer].pointerDrag.GetComponent<IDragHandler>();
525 if ((Dragger !=
null) && !(Dragger is EventTrigger)) {
526 currentGoing[whichPointer] = PointEvents[whichPointer].pointerDrag;
527 DragBeginPosition[whichPointer] = PointEvents[whichPointer].position;
528 if (currentGo[whichPointer] && currentGo[whichPointer] == currentGoing[whichPointer]) {
529 ExecuteEvents.Execute(PointEvents[whichPointer].pointerDrag, PointEvents[whichPointer], ExecuteEvents.beginDragHandler);
530 PointEvents[whichPointer].dragging =
true;
535 currentGoing[whichPointer] = PointEvents[whichPointer].pointerDrag;
536 DragBeginPosition[whichPointer] = PointEvents[whichPointer].position;
537 if (currentGo[whichPointer] && currentGo[whichPointer] == currentGoing[whichPointer]) {
538 ExecuteEvents.Execute(PointEvents[whichPointer].pointerDrag, PointEvents[whichPointer], ExecuteEvents.beginDragHandler);
539 PointEvents[whichPointer].dragging =
true;
551 if (!PointEvents[whichPointer].dragging && currentGoing[whichPointer] && Vector2.Distance(PointEvents[whichPointer].position, DragBeginPosition[whichPointer]) * 100f > EventSystem.current.pixelDragThreshold) {
552 IDragHandler Dragger = PointEvents[whichPointer].pointerDrag.GetComponent<IDragHandler>();
553 if (Dragger !=
null && Dragger is ScrollRect) {
554 if (currentGo[whichPointer] && !(currentGo[whichPointer].GetComponent<ScrollRect>())) {
555 ExecuteEvents.Execute(PointEvents[whichPointer].pointerDrag, PointEvents[whichPointer], ExecuteEvents.beginDragHandler);
556 PointEvents[whichPointer].dragging =
true;
558 ExecuteEvents.Execute(currentGo[whichPointer], PointEvents[whichPointer], ExecuteEvents.pointerUpHandler);
559 PointEvents[whichPointer].rawPointerPress =
null;
560 PointEvents[whichPointer].pointerPress =
null;
561 currentGo[whichPointer] =
null;
568 if (PrevTriggeringInteraction[whichPointer] && ((!
isTriggeringInteraction(whichPointer, whichHand, whichFinger)) || (pointerState[whichPointer] == pointerStates.OffCanvas))) {
569 PrevTriggeringInteraction[whichPointer] =
false;
571 if (currentGoing[whichPointer]) {
572 ExecuteEvents.Execute(currentGoing[whichPointer], PointEvents[whichPointer], ExecuteEvents.endDragHandler);
573 if ((currentGo[whichPointer]) && (currentGoing[whichPointer] == currentGo[whichPointer])) {
574 ExecuteEvents.Execute(currentGoing[whichPointer], PointEvents[whichPointer], ExecuteEvents.pointerUpHandler);
577 if (currentOverGo[whichPointer] !=
null) {
578 ExecuteEvents.ExecuteHierarchy(currentOverGo[whichPointer], PointEvents[whichPointer], ExecuteEvents.dropHandler);
580 PointEvents[whichPointer].pointerDrag =
null;
581 PointEvents[whichPointer].dragging =
false;
582 currentGoing[whichPointer] =
null;
585 if (currentGo[whichPointer]) {
586 ExecuteEvents.Execute(currentGo[whichPointer], PointEvents[whichPointer], ExecuteEvents.pointerUpHandler);
587 ExecuteEvents.Execute(currentGo[whichPointer], PointEvents[whichPointer], ExecuteEvents.pointerClickHandler);
588 PointEvents[whichPointer].rawPointerPress =
null;
589 PointEvents[whichPointer].pointerPress =
null;
590 currentGo[whichPointer] =
null;
591 currentGoing[whichPointer] =
null;
596 if (PointEvents[whichPointer].pointerDrag !=
null && PointEvents[whichPointer].dragging) {
597 ExecuteEvents.Execute(PointEvents[whichPointer].pointerDrag, PointEvents[whichPointer], ExecuteEvents.dragHandler);
601 updatePointerColor(whichPointer, whichHand, whichFinger);
607 if (PrevTouchingMode) {
608 for (
int i = 0; i < canvases.Length; i++) {
609 canvases[i].BroadcastMessage(
"Expand", SendMessageOptions.DontRequireReceiver);
612 for (
int i = 0; i < canvases.Length; i++) {
613 canvases[i].BroadcastMessage(
"Retract", SendMessageOptions.DontRequireReceiver);
620 Camera.main.transform.position = OldCameraPos;
621 Camera.main.transform.rotation = OldCameraRot;
626 private bool GetLookPointerEventData(
int whichPointer,
int whichHand,
int whichFinger, Vector3 Origin, Vector3
Direction,
bool forceTipRaycast) {
629 bool TipRaycast =
false;
632 if (PointEvents[whichPointer] ==
null) {
633 PointEvents[whichPointer] =
new PointerEventData(base.eventSystem);
635 PointEvents[whichPointer].Reset();
639 PointEvents[whichPointer].button = PointerEventData.InputButton.Left;
642 Vector3 IndexFingerPosition;
664 for (
int i = 1; i < 3; i++) {
667 if (fingerDistance > farthest && fingerExtension > 0.5f) {
668 farthest = fingerDistance;
678 Camera.main.transform.position = Origin;
684 DebugSphereQueue.Enqueue(Camera.main.transform.position);
690 PointEvents[whichPointer].position =
Vector2.Lerp(PrevScreenPosition[whichPointer], Camera.main.WorldToScreenPoint(IndexFingerPosition), 1.0f);
691 PointEvents[whichPointer].delta = (PointEvents[whichPointer].position - PrevScreenPosition[whichPointer]) * -10f;
692 PointEvents[whichPointer].scrollDelta =
Vector2.zero;
695 base.eventSystem.RaycastAll(PointEvents[whichPointer], m_RaycastResultCache);
699 PointEvents[whichPointer].pointerCurrentRaycast =
new RaycastResult();
700 for (
int i = 0; i < m_RaycastResultCache.Count; i++) {
701 if (m_RaycastResultCache[i].gameObject.GetComponent<Scrollbar>() !=
null) {
702 PointEvents[whichPointer].pointerCurrentRaycast = m_RaycastResultCache[i];
703 }
else if (PointEvents[whichPointer].pointerCurrentRaycast.gameObject ==
null && m_RaycastResultCache[i].gameObject.GetComponent<ScrollRect>() !=
null) {
704 PointEvents[whichPointer].pointerCurrentRaycast = m_RaycastResultCache[i];
707 if (PointEvents[whichPointer].pointerCurrentRaycast.gameObject ==
null) {
708 PointEvents[whichPointer].pointerCurrentRaycast = FindFirstRaycast(m_RaycastResultCache);
711 PointEvents[whichPointer].pointerCurrentRaycast = FindFirstRaycast(m_RaycastResultCache);
715 m_RaycastResultCache.Clear();
721 private void ProcessState(
int whichPointer,
int whichHand,
int whichFinger,
bool forceTipRaycast) {
722 if ((PointEvents[whichPointer].pointerCurrentRaycast.gameObject !=
null)) {
725 if (ExecuteEvents.GetEventHandler<IPointerClickHandler>(PointEvents[whichPointer].pointerCurrentRaycast.gameObject)) {
726 pointerState[whichPointer] = pointerStates.TouchingElement;
728 pointerState[whichPointer] = pointerStates.TouchingCanvas;
731 pointerState[whichPointer] = pointerStates.NearCanvas;
733 }
else if (!forceTipRaycast) {
734 if (ExecuteEvents.GetEventHandler<IPointerClickHandler>(PointEvents[whichPointer].pointerCurrentRaycast.gameObject)) {
736 pointerState[whichPointer] = pointerStates.PinchingToElement;
738 pointerState[whichPointer] = pointerStates.OnElement;
742 pointerState[whichPointer] = pointerStates.PinchingToCanvas;
744 pointerState[whichPointer] = pointerStates.OnCanvas;
748 pointerState[whichPointer] = pointerStates.OffCanvas;
751 pointerState[whichPointer] = pointerStates.OffCanvas;
757 private void ProcessStateEvents(
int whichPointer) {
759 if ((PrevState[whichPointer] != pointerStates.OffCanvas) && (pointerState[whichPointer] != pointerStates.OffCanvas)) {
760 if (currentOverGo[whichPointer] != prevOverGo[whichPointer]) {
763 onHover.Invoke(Pointers[whichPointer].transform.position);
769 if (PrevState[whichPointer] == pointerStates.OnCanvas) {
770 if (pointerState[whichPointer] == pointerStates.OnElement) {
774 onHover.Invoke(Pointers[whichPointer].transform.position);
776 }
else if (pointerState[whichPointer] == pointerStates.PinchingToCanvas) {
780 }
else if (PrevState[whichPointer] == pointerStates.PinchingToCanvas) {
781 if (pointerState[whichPointer] == pointerStates.OnCanvas) {
785 }
else if (PrevState[whichPointer] == pointerStates.OnElement) {
786 if (pointerState[whichPointer] == pointerStates.OnCanvas) {
789 }
else if (pointerState[whichPointer] == pointerStates.PinchingToElement) {
792 onClickDown.Invoke(Pointers[whichPointer].transform.position);
794 }
else if (PrevState[whichPointer] == pointerStates.PinchingToElement) {
795 if (pointerState[whichPointer] == pointerStates.PinchingToCanvas) {
798 }
else if (pointerState[whichPointer] == pointerStates.OnElement || pointerState[whichPointer] == pointerStates.OnCanvas) {
801 onClickUp.Invoke(Pointers[whichPointer].transform.position);
803 }
else if (PrevState[whichPointer] == pointerStates.NearCanvas) {
804 if (pointerState[whichPointer] == pointerStates.TouchingElement) {
807 onClickDown.Invoke(Pointers[whichPointer].transform.position);
809 if (pointerState[whichPointer] == pointerStates.TouchingCanvas) {
813 }
else if (PrevState[whichPointer] == pointerStates.TouchingCanvas) {
814 if (pointerState[whichPointer] == pointerStates.NearCanvas) {
818 }
else if (PrevState[whichPointer] == pointerStates.TouchingElement) {
819 if (pointerState[whichPointer] == pointerStates.NearCanvas) {
822 onClickUp.Invoke(Pointers[whichPointer].transform.position);
824 }
else if (PrevState[whichPointer] == pointerStates.OffCanvas) {
825 if (pointerState[whichPointer] != pointerStates.OffCanvas) {
827 timeEnteredCanvas[whichPointer] = Time.time;
833 private void UpdatePointer(
int whichPointer, PointerEventData pointData, GameObject UIComponent) {
835 Pointers[whichPointer].gameObject.SetActive(
true);
836 if (
InnerPointer) { InnerPointers[whichPointer].gameObject.SetActive(
true); }
838 if (currentOverGo[whichPointer] !=
null) {
839 Pointers[whichPointer].gameObject.SetActive(
true);
840 if (
InnerPointer) { InnerPointers[whichPointer].gameObject.SetActive(
true); }
841 if (PointEvents[whichPointer].pointerCurrentRaycast.gameObject !=
null) {
842 RectTransform draggingPlane = PointEvents[whichPointer].pointerCurrentRaycast.gameObject.GetComponent<RectTransform>();
844 if (RectTransformUtility.ScreenPointToWorldPointInRectangle(draggingPlane, pointData.position, pointData.enterEventCamera, out globalLookPos)) {
846 GameObject Hoverer = ExecuteEvents.GetEventHandler<IPointerEnterHandler>(UIComponent);
848 Vector3 ComponentInPlane = Hoverer.transform.InverseTransformPoint(globalLookPos);
849 ComponentInPlane =
new Vector3(ComponentInPlane.x, ComponentInPlane.y, 0f);
850 Pointers[whichPointer].position = Hoverer.transform.TransformPoint(ComponentInPlane);
852 Pointers[whichPointer].position = globalLookPos;
855 float pointerAngle = Mathf.Rad2Deg * (Mathf.Atan2(pointData.delta.x, pointData.delta.y));
856 Pointers[whichPointer].rotation = draggingPlane.rotation *
Quaternion.Euler(0f, 0f, -pointerAngle);
858 InnerPointers[whichPointer].position = globalLookPos;
859 InnerPointers[whichPointer].rotation = draggingPlane.rotation *
Quaternion.Euler(0f, 0f, -pointerAngle);
861 evaluatePointerSize(whichPointer);
868 void evaluatePointerSize(
int whichPointer) {
870 float PointDistance = 1f;
871 if (Camera.main !=
null) {
872 PointDistance = (Pointers[whichPointer].position - Camera.main.transform.position).magnitude;
880 if (whichPointer == 0) {
882 }
else if (whichPointer == 1) {
888 Pointers[whichPointer].localScale = Pointerscale *
new Vector3(1f, 1f , 1f);
918 return (-Pointers[whichPointer].InverseTransformPoint(TipPosition).z * Pointers[whichPointer].lossyScale.z) -
TactilePadding;
925 return (-UIElement.InverseTransformPoint(TipPosition).z * UIElement.lossyScale.z) -
TactilePadding;
931 for (
int i = 0; i < pointerState.Length; i++) {
932 if (pointerState[i] == pointerStates.NearCanvas || pointerState[i] == pointerStates.TouchingCanvas || pointerState[i] == pointerStates.TouchingElement) {
941 return (pointerState[whichPointer] == pointerStates.NearCanvas || pointerState[whichPointer] == pointerStates.TouchingCanvas || pointerState[whichPointer] == pointerStates.TouchingElement);
945 void updatePointerColor(
int whichPointer,
int whichHand,
int whichFinger) {
948 switch (pointerState[whichPointer]) {
949 case pointerStates.OnCanvas:
953 case pointerStates.OnElement:
957 case pointerStates.PinchingToCanvas:
961 case pointerStates.PinchingToElement:
965 case pointerStates.NearCanvas:
969 case pointerStates.TouchingElement:
973 case pointerStates.TouchingCanvas:
977 case pointerStates.OffCanvas:
996 SpriteRenderer
PointerSprite = Pointers[whichPointer].GetComponent<SpriteRenderer>();
998 if (color.r == 0f && color.g == 0f && color.b == 0f) {
999 PointerSprite.material.color =
Color.Lerp(oldColor,
new Color(oldColor.r, oldColor.g, oldColor.b, color.a), lerpalpha);
1000 PointerSprite.color =
Color.Lerp(oldColor,
new Color(oldColor.r, oldColor.g, oldColor.b, color.a), lerpalpha);
1001 }
else if (color.a == 1f) {
1002 PointerSprite.material.color =
Color.Lerp(oldColor,
new Color(color.r, color.g, color.b, oldColor.a), lerpalpha);
1010 SpriteRenderer InnerPointerSprite = InnerPointers[whichPointer].GetComponent<SpriteRenderer>();
1011 oldColor = InnerPointerSprite.color;
1012 if (color.r == 0f && color.g == 0f && color.b == 0f) {
1015 }
else if (color.a == 1f) {
1025 private bool SendUpdateEventToSelectedObject() {
1026 if (base.eventSystem.currentSelectedGameObject ==
null)
1029 BaseEventData data = GetBaseEventData();
1030 ExecuteEvents.Execute(base.eventSystem.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler);
1034 void OnDrawGizmos() {
1036 while (DebugSphereQueue !=
null && DebugSphereQueue.Count > 0) {
1037 Gizmos.DrawSphere(DebugSphereQueue.Dequeue(), 0.1f);
The Bone class represents a tracked bone.
BoneType
Enumerates the type of bones.
List< Hand > Hands
The list of Hand objects detected in this frame, given in arbitrary order. The list can be empty if n...
Provides Frame object data to the Unity application by firing events as soon as Frame data is availab...
abstract Frame CurrentFrame
The current frame for this update cycle, in world space.
The LeapServiceProvider provides tracked Leap Hand data and images from the device via the Leap servi...
A basic utility class to aid in creating pinch based actions. Once linked with a HandModelBase,...