using System.Collections.Generic; using UnityEngine.EventSystems; namespace UnityEngine.XR.Interaction.Toolkit.UI { struct TouchModel { internal struct ImplementationData { /// /// This tracks the current GUI targets being hovered over. /// /// public List hoverTargets { get; set; } /// /// Tracks the current enter/exit target being hovered over at any given moment. /// /// public GameObject pointerTarget { get; set; } /// /// Used to cache whether or not the current mouse button is being dragged. /// /// public bool isDragging { get; set; } /// /// Used to cache the last time this button was pressed. /// /// public float pressedTime { get; set; } /// /// The position on the screen that this button was last pressed. /// In the same scale as , and caches the same value as . /// /// public Vector2 pressedPosition { get; set; } /// /// The Raycast data from the time it was pressed. /// /// public RaycastResult pressedRaycast { get; set; } /// /// The last GameObject pressed on that can handle press or click events. /// /// public GameObject pressedGameObject { get; set; } /// /// The last GameObject pressed on regardless of whether it can handle events or not. /// /// public GameObject pressedGameObjectRaw { get; set; } /// /// The GameObject currently being dragged if any. /// /// public GameObject draggedGameObject { get; set; } /// /// Resets this object to it's default, unused state. /// public void Reset() { isDragging = false; pressedTime = 0f; pressedPosition = Vector2.zero; pressedRaycast = new RaycastResult(); pressedGameObject = pressedGameObjectRaw = draggedGameObject = null; if (hoverTargets == null) hoverTargets = new List(); else hoverTargets.Clear(); } } public int pointerId { get; } public TouchPhase selectPhase { get => m_SelectPhase; set { if (m_SelectPhase != value) { if (value == TouchPhase.Began) selectDelta |= ButtonDeltaState.Pressed; if (value == TouchPhase.Ended || value == TouchPhase.Canceled) selectDelta |= ButtonDeltaState.Released; m_SelectPhase = value; changedThisFrame = true; } } } public ButtonDeltaState selectDelta { get; private set; } public bool changedThisFrame { get; private set; } /// /// The pixel-space position of the touch object. /// public Vector2 position { get => m_Position; set { if (m_Position != value) { deltaPosition = value - m_Position; m_Position = value; changedThisFrame = true; } } } /// /// The pixel-space change in since the last call to . /// public Vector2 deltaPosition { get; private set; } TouchPhase m_SelectPhase; Vector2 m_Position; ImplementationData m_ImplementationData; public TouchModel(int pointerId) { this.pointerId = pointerId; m_Position = deltaPosition = Vector2.zero; m_SelectPhase = TouchPhase.Canceled; changedThisFrame = false; selectDelta = ButtonDeltaState.NoChange; m_ImplementationData = new ImplementationData(); m_ImplementationData.Reset(); } public void Reset() { m_Position = deltaPosition = Vector2.zero; changedThisFrame = false; selectDelta = ButtonDeltaState.NoChange; m_ImplementationData.Reset(); } public void OnFrameFinished() { deltaPosition = Vector2.zero; selectDelta = ButtonDeltaState.NoChange; changedThisFrame = false; } public void CopyTo(PointerEventData eventData) { eventData.pointerId = pointerId; eventData.position = position; eventData.delta = ((selectDelta & ButtonDeltaState.Pressed) != 0) ? Vector2.zero : deltaPosition; eventData.pointerEnter = m_ImplementationData.pointerTarget; eventData.dragging = m_ImplementationData.isDragging; eventData.clickTime = m_ImplementationData.pressedTime; eventData.pressPosition = m_ImplementationData.pressedPosition; eventData.pointerPressRaycast = m_ImplementationData.pressedRaycast; eventData.pointerPress = m_ImplementationData.pressedGameObject; eventData.rawPointerPress = m_ImplementationData.pressedGameObjectRaw; eventData.pointerDrag = m_ImplementationData.draggedGameObject; eventData.hovered.Clear(); eventData.hovered.AddRange(m_ImplementationData.hoverTargets); } public void CopyFrom(PointerEventData eventData) { m_ImplementationData.pointerTarget = eventData.pointerEnter; m_ImplementationData.isDragging = eventData.dragging; m_ImplementationData.pressedTime = eventData.clickTime; m_ImplementationData.pressedPosition = eventData.pressPosition; m_ImplementationData.pressedRaycast = eventData.pointerPressRaycast; m_ImplementationData.pressedGameObject = eventData.pointerPress; m_ImplementationData.pressedGameObjectRaw = eventData.rawPointerPress; m_ImplementationData.draggedGameObject = eventData.pointerDrag; m_ImplementationData.hoverTargets.Clear(); m_ImplementationData.hoverTargets.AddRange(eventData.hovered); } } }