protected virtual List <RaycastResult> CheckRaycasts(VRTK4_UIPointer pointer)
        {
            RaycastResult raycastResult = new RaycastResult();

            raycastResult.worldPosition = pointer.GetOriginPosition();
            raycastResult.worldNormal   = pointer.GetOriginForward();

            pointer.pointerEventData.pointerCurrentRaycast = raycastResult;
            VRTK4_UIGraphicRaycaster.CurrentPointer        = pointer;
            VRTK4_3DGraphicRaycaster.CurrentPointer        = pointer;
            raycasts.Clear();
            eventSystem.RaycastAll(pointer.pointerEventData, raycasts);
            raycasts.Sort(ComparisonInversedDistance);
            if (raycasts.Count > 0)
            {
                var toUse             = raycasts[0];
                var lastKnownPosition = pointer.pointerEventData.position;
                pointer.pointerEventData.position = toUse.screenPosition;
                pointer.pointerEventData.delta    = pointer.pointerEventData.position - lastKnownPosition;
                pointer.pointerEventData.pointerCurrentRaycast = toUse;
            }

            VRTK4_UIGraphicRaycaster.CurrentPointer = null;
            VRTK4_3DGraphicRaycaster.CurrentPointer = null;
            return(raycasts);
        }
Пример #2
0
        /// <summary>
        /// Enables to raycast event from any point towards any VRTK4_Canvas (even when outside the view)
        /// </summary>
        /// <param name="eventData"> currentEventData (can get cleared in consequent stages) </param>
        /// <param name="resultAppendList"> actual hits on UI elements under canvases</param>
        public override void Raycast(PointerEventData eventData, List <RaycastResult> resultAppendList)
        {
            if (CanvasToUse == null || eventCamera == null || !eventCamera.enabled)
            {
                return;
            }

            Ray ray;

            if (CurrentPointer != null)
            {
                ray = new Ray(CurrentPointer.GetOriginPosition(), CurrentPointer.GetOriginForward());
            }
            else
            {
                ray = new Ray(eventData.pointerCurrentRaycast.worldPosition,
                              eventData.pointerCurrentRaycast.worldNormal);
            }

            s_RaycastResults.Clear();
            Raycast(CanvasToUse, eventCamera, eventData, ray, ref s_RaycastResults);
            AppendToListAllCurrentRaycasts(ref resultAppendList, ref s_RaycastResults);
            s_RaycastResults.Clear();
        }