void UpdateHoverSelect(ref TrackedDeviceModel model) { List <GameObject> hoverTargets = model.implementationData.hoverTargets; for (int i = hoverTargets.Count - 1; i >= 0; --i) { GameObject obj = hoverTargets[i]; if (ExecuteEvents.CanHandleEvent <ISelectHandler>(obj) || ExecuteEvents.CanHandleEvent <IPointerClickHandler>(obj)) { if (m_CurrentHoverSelectTarget != obj) { m_CurrentHoverSelectTarget = obj; m_HoverInitialTime = Time.time; } model.select = (Time.time - m_HoverInitialTime) > m_HoverTimeToSelect; return; } } //Nothing targeted if (m_CurrentHoverSelectTarget != null) { model.select = false; } m_HoverInitialTime = Time.time; m_CurrentHoverSelectTarget = null; }
public bool TryGetHitInfo(ref Vector3 position, ref Vector3 normal, ref int positionInLine, ref bool isValidTarget) { TrackedDeviceModel model = GetTrackedDeviceModel(); RaycastResult lastRaycastResult = model.implementationData.lastFrameRaycast; if (lastRaycastResult.isValid) { position = lastRaycastResult.worldPosition; normal = lastRaycastResult.worldNormal; positionInLine = 1; isValidTarget = true; return(true); } return(false); }
public bool GetTrackedDeviceModel(XRUIPointer pointer, out TrackedDeviceModel model) { EnsureInitialized(); for (int i = 0; i < m_RegisteredPointers.Count; i++) { if (m_RegisteredPointers[i].pointer == pointer) { model = m_RegisteredPointers[i].model; return(true); } } model = new TrackedDeviceModel(-1); return(false); }
public void UpdateModel(ref TrackedDeviceModel model) { if (m_Controller == null) { return; } model.position = m_Controller.transform.position; model.orientation = m_Controller.transform.rotation; model.select = m_Controller.uiPressInteractionState.active; if (m_HoverToSelect) { UpdateHoverSelect(ref model); } }
/// <summary>Retrieves the UI Model for a selected Interactable.</summary> /// <param name="interactable">The Interactable you want the model for.</param> /// <param name="model">The returned model that reflects the UI state of the interactable.</param> /// <returns>True if the model was able to retrieved, false otherwise.</returns> public bool GetTrackedDeviceModel(IUIInteractable interactable, out TrackedDeviceModel model) { EnsureInitialized(); for (int i = 0; i < m_RegisteredInteractables.Count; i++) { if (m_RegisteredInteractables[i].interactable == interactable) { model = m_RegisteredInteractables[i].model; return(true); } } model = new TrackedDeviceModel(-1); return(false); }
internal void ProcessTrackedDevice(ref TrackedDeviceModel deviceState, bool force = false) { if (!deviceState.changedThisFrame && !force) { return; } var eventData = GetOrCreateCachedTrackedDeviceEvent(); eventData.Reset(); deviceState.CopyTo(eventData); eventData.button = PointerEventData.InputButton.Left; eventData.pointerCurrentRaycast = PerformRaycast(eventData); // Get associated camera, or main-tagged camera, or camera from raycast, and if *nothing* exists, then abort processing this frame. Camera camera = uiCamera ?? Camera.main ?? eventData.pointerCurrentRaycast.module?.eventCamera ?? null; if (camera != null) { var screenPosition = Vector2.zero; if (eventData.pointerCurrentRaycast.isValid) { screenPosition = camera.WorldToScreenPoint(eventData.pointerCurrentRaycast.worldPosition); } else { Vector3 endPosition = eventData.rayPoints.Count > 0 ? eventData.rayPoints[eventData.rayPoints.Count - 1] : Vector3.zero; screenPosition = camera.WorldToScreenPoint(endPosition); eventData.position = screenPosition; } var thisFrameDelta = screenPosition - eventData.position; eventData.position = screenPosition; eventData.delta = thisFrameDelta; ProcessMouseButton(deviceState.selectDelta, eventData); ProcessMouseMovement(eventData); ProcessMouseButtonDrag(eventData, trackedDeviceDragThresholdMultiplier); deviceState.CopyFrom(eventData); } deviceState.OnFrameFinished(); }
internal void ProcessTrackedDevice(ref TrackedDeviceModel deviceState) { if (!deviceState.changedThisFrame) { return; } var eventData = GetOrCreateCachedTrackedDeviceEvent(); eventData.Reset(); deviceState.CopyTo(eventData); eventData.button = PointerEventData.InputButton.Left; eventData.pointerCurrentRaycast = PerformRaycast(eventData); Camera mainCamera = uiCamera ?? Camera.main; var screenPosition = Vector2.zero; if (eventData.pointerCurrentRaycast.isValid) { screenPosition = mainCamera.WorldToScreenPoint(eventData.pointerCurrentRaycast.worldPosition); } else { Ray ray = eventData.ray; Vector3 endPosition = ray.origin + (ray.direction.normalized * eventData.maxDistance); screenPosition = mainCamera.WorldToScreenPoint(endPosition); eventData.position = screenPosition; } var thisFrameDelta = screenPosition - eventData.position; eventData.position = screenPosition; eventData.delta = thisFrameDelta; ProcessMouseButton(deviceState.selectDelta, eventData); ProcessMouseMovement(eventData); ProcessMouseButtonDrag(eventData, trackedDeviceDragThresholdMultiplier); deviceState.CopyFrom(eventData); deviceState.OnFrameFinished(); }
public RegisteredInteractor(IUIInteractor interactor, int deviceIndex) { this.interactor = interactor; model = new TrackedDeviceModel(deviceIndex); }
public RegisteredPointer(XRUIPointer pointer, int deviceIndex) { this.pointer = pointer; model = new TrackedDeviceModel(deviceIndex); }
public RegisteredInteractable(IUIInteractable interactable, int deviceIndex) { this.interactable = interactable; model = new TrackedDeviceModel(deviceIndex); }