|
|
|
|
|
using System;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.EventSystems;
|
|
|
|
|
|
using UnityEngine.Serialization;
|
|
|
|
|
|
[AddComponentMenu("Event/TUIO Input Module")]
|
|
|
|
|
|
public class TUIOInputModule : PointerInputModule
|
|
|
|
|
|
{
|
|
|
|
|
|
protected TUIOInputModule()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override bool IsModuleSupported()
|
|
|
|
|
|
{
|
|
|
|
|
|
return TUIOManager.Instance.IsReady();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override bool ShouldActivateModule()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!base.ShouldActivateModule())
|
|
|
|
|
|
return false;
|
|
|
|
|
|
return TUIOManager.Instance.touches.Count > 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void Process()
|
|
|
|
|
|
{
|
|
|
|
|
|
ProcessTUIOEvents();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OnApplicationFocus(bool hasFocus)
|
|
|
|
|
|
{
|
|
|
|
|
|
_hasFocus = hasFocus;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void Update()
|
|
|
|
|
|
{
|
|
|
|
|
|
//return;
|
|
|
|
|
|
if (_hasFocus)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
UpdateModule();
|
|
|
|
|
|
Process();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool ProcessTUIOEvents()
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (int key in TUIOManager.Instance.touches.Keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Touch touch = TUIOManager.Instance.touches[key];
|
|
|
|
|
|
|
|
|
|
|
|
if (touch.type == TouchType.Indirect)
|
|
|
|
|
|
{
|
|
|
|
|
|
print("touch.type == TouchType.Indirect");
|
|
|
|
|
|
//continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool released;
|
|
|
|
|
|
bool pressed;
|
|
|
|
|
|
var pointer = GetTouchPointerEventData(touch, out pressed, out released);
|
|
|
|
|
|
if(released)
|
|
|
|
|
|
{
|
|
|
|
|
|
// print("remove 2, " + touch.fingerId);
|
|
|
|
|
|
}
|
|
|
|
|
|
ProcessTouchPress(pointer, pressed, released);
|
|
|
|
|
|
|
|
|
|
|
|
if (!released)
|
|
|
|
|
|
{
|
|
|
|
|
|
ProcessMove(pointer);
|
|
|
|
|
|
ProcessDrag(pointer);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
RemovePointerData(pointer);
|
|
|
|
|
|
}
|
|
|
|
|
|
return TUIOManager.Instance.touches.Count > 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected void ProcessTouchPress(PointerEventData pointerEvent, bool pressed, bool released)
|
|
|
|
|
|
{
|
|
|
|
|
|
var currentOverGo = pointerEvent.pointerCurrentRaycast.gameObject;
|
|
|
|
|
|
|
|
|
|
|
|
// PointerDown notification
|
|
|
|
|
|
if (pressed)
|
|
|
|
|
|
{
|
|
|
|
|
|
pointerEvent.eligibleForClick = true;
|
|
|
|
|
|
pointerEvent.delta = Vector2.zero;
|
|
|
|
|
|
pointerEvent.dragging = false;
|
|
|
|
|
|
pointerEvent.useDragThreshold = true;
|
|
|
|
|
|
pointerEvent.pressPosition = pointerEvent.position;
|
|
|
|
|
|
pointerEvent.pointerPressRaycast = pointerEvent.pointerCurrentRaycast;
|
|
|
|
|
|
|
|
|
|
|
|
DeselectIfSelectionChanged(currentOverGo, pointerEvent);
|
|
|
|
|
|
|
|
|
|
|
|
if (pointerEvent.pointerEnter != currentOverGo)
|
|
|
|
|
|
{
|
|
|
|
|
|
// send a pointer enter to the touched element if it isn't the one to select...
|
|
|
|
|
|
HandlePointerExitAndEnter(pointerEvent, currentOverGo);
|
|
|
|
|
|
pointerEvent.pointerEnter = currentOverGo;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// search for the control that will receive the press
|
|
|
|
|
|
// if we can't find a press handler set the press
|
|
|
|
|
|
// handler to be what would receive a click.
|
|
|
|
|
|
var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.pointerDownHandler);
|
|
|
|
|
|
|
|
|
|
|
|
// didnt find a press handler... search for a click handler
|
|
|
|
|
|
if (newPressed == null)
|
|
|
|
|
|
newPressed = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
|
|
|
|
|
|
|
|
|
|
|
|
// Debug.Log("Pressed: " + newPressed);
|
|
|
|
|
|
|
|
|
|
|
|
float time = Time.unscaledTime;
|
|
|
|
|
|
|
|
|
|
|
|
if (newPressed == pointerEvent.lastPress)
|
|
|
|
|
|
{
|
|
|
|
|
|
var diffTime = time - pointerEvent.clickTime;
|
|
|
|
|
|
if (diffTime < 0.3f)
|
|
|
|
|
|
++pointerEvent.clickCount;
|
|
|
|
|
|
else
|
|
|
|
|
|
pointerEvent.clickCount = 1;
|
|
|
|
|
|
|
|
|
|
|
|
pointerEvent.clickTime = time;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
pointerEvent.clickCount = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pointerEvent.pointerPress = newPressed;
|
|
|
|
|
|
pointerEvent.rawPointerPress = currentOverGo;
|
|
|
|
|
|
|
|
|
|
|
|
pointerEvent.clickTime = time;
|
|
|
|
|
|
|
|
|
|
|
|
// Save the drag handler as well
|
|
|
|
|
|
pointerEvent.pointerDrag = ExecuteEvents.GetEventHandler<IDragHandler>(currentOverGo);
|
|
|
|
|
|
|
|
|
|
|
|
if (pointerEvent.pointerDrag != null)
|
|
|
|
|
|
ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.initializePotentialDrag);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// PointerUp notification
|
|
|
|
|
|
if (released)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Debug.Log("Executing pressup on: " + pointer.pointerPress);
|
|
|
|
|
|
ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerUpHandler);
|
|
|
|
|
|
|
|
|
|
|
|
// Debug.Log("KeyCode: " + pointer.eventData.keyCode);
|
|
|
|
|
|
|
|
|
|
|
|
// see if we mouse up on the same element that we clicked on...
|
|
|
|
|
|
var pointerUpHandler = ExecuteEvents.GetEventHandler<IPointerClickHandler>(currentOverGo);
|
|
|
|
|
|
|
|
|
|
|
|
// PointerClick and Drop events
|
|
|
|
|
|
if (pointerEvent.pointerPress == pointerUpHandler && pointerEvent.eligibleForClick)
|
|
|
|
|
|
{
|
|
|
|
|
|
ExecuteEvents.Execute(pointerEvent.pointerPress, pointerEvent, ExecuteEvents.pointerClickHandler);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
|
|
|
|
|
|
{
|
|
|
|
|
|
ExecuteEvents.ExecuteHierarchy(currentOverGo, pointerEvent, ExecuteEvents.dropHandler);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pointerEvent.eligibleForClick = false;
|
|
|
|
|
|
pointerEvent.pointerPress = null;
|
|
|
|
|
|
pointerEvent.rawPointerPress = null;
|
|
|
|
|
|
|
|
|
|
|
|
if (pointerEvent.pointerDrag != null && pointerEvent.dragging)
|
|
|
|
|
|
ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler);
|
|
|
|
|
|
|
|
|
|
|
|
pointerEvent.dragging = false;
|
|
|
|
|
|
pointerEvent.pointerDrag = null;
|
|
|
|
|
|
|
|
|
|
|
|
if (pointerEvent.pointerDrag != null)
|
|
|
|
|
|
ExecuteEvents.Execute(pointerEvent.pointerDrag, pointerEvent, ExecuteEvents.endDragHandler);
|
|
|
|
|
|
|
|
|
|
|
|
pointerEvent.pointerDrag = null;
|
|
|
|
|
|
|
|
|
|
|
|
// send exit events as we need to simulate this on touch up on touch device
|
|
|
|
|
|
ExecuteEvents.ExecuteHierarchy(pointerEvent.pointerEnter, pointerEvent, ExecuteEvents.pointerExitHandler);
|
|
|
|
|
|
pointerEvent.pointerEnter = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool _hasFocus;
|
|
|
|
|
|
}
|