Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        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();
        }
Esempio n. 7
0
        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();
        }
Esempio n. 8
0
 public RegisteredInteractor(IUIInteractor interactor, int deviceIndex)
 {
     this.interactor = interactor;
     model           = new TrackedDeviceModel(deviceIndex);
 }
Esempio n. 9
0
 public RegisteredPointer(XRUIPointer pointer, int deviceIndex)
 {
     this.pointer = pointer;
     model        = new TrackedDeviceModel(deviceIndex);
 }
Esempio n. 10
0
 public RegisteredInteractable(IUIInteractable interactable, int deviceIndex)
 {
     this.interactable = interactable;
     model             = new TrackedDeviceModel(deviceIndex);
 }