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); }
/// <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(); }