private void Raycast(Canvas canvas, Camera eventCamera, Ray ray, List <VRGraphic> results) { var hitDistance = GetHitDistance(ray); var canvasGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); for (int i = 0; i < canvasGraphics.Count; ++i) { var graphic = canvasGraphics[i]; if (graphic.depth == -1 || !graphic.raycastTarget) { continue; } var graphicTransform = graphic.transform; Vector3 graphicFormward = graphicTransform.forward; float distance = (Vector3.Dot(graphicFormward, graphicTransform.position - ray.origin) / Vector3.Dot(graphicFormward, ray.direction)); if (distance < 0) { continue; } if ((distance - UI_CONTROL_OFFSET) > hitDistance) { continue; } Vector3 position = ray.GetPoint(distance); Vector2 pointerPosition = eventCamera.WorldToScreenPoint(position); if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, pointerPosition, eventCamera)) { continue; } if (graphic.Raycast(pointerPosition, eventCamera)) { var vrGraphic = new VRGraphic(); vrGraphic.graphic = graphic; vrGraphic.position = position; vrGraphic.distance = distance; vrGraphic.pointerPosition = pointerPosition; s_SortedGraphics.Add(vrGraphic); } } s_SortedGraphics.Sort((g1, g2) => g2.graphic.depth.CompareTo(g1.graphic.depth)); for (int i = 0; i < s_SortedGraphics.Count; ++i) { results.Add(s_SortedGraphics[i]); } s_SortedGraphics.Clear(); }
private void Raycast(Canvas canvas, Camera eventCamera, Ray ray, List<VRGraphic> results) { var hitDistance = GetHitDistance(ray); var canvasGraphics = GraphicRegistry.GetGraphicsForCanvas(canvas); for (int i = 0; i < canvasGraphics.Count; ++i) { var graphic = canvasGraphics[i]; if (graphic.depth == -1 || !graphic.raycastTarget) { continue; } var graphicTransform = graphic.transform; Vector3 graphicFormward = graphicTransform.forward; float distance = (Vector3.Dot(graphicFormward, graphicTransform.position - ray.origin) / Vector3.Dot(graphicFormward, ray.direction)); if (distance < 0) { continue; } if ((distance - UI_CONTROL_OFFSET) > hitDistance) { continue; } Vector3 position = ray.GetPoint(distance); Vector2 pointerPosition = eventCamera.WorldToScreenPoint(position); if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, pointerPosition, eventCamera)) { continue; } if (graphic.Raycast(pointerPosition, eventCamera)) { var vrGraphic = new VRGraphic(); vrGraphic.graphic = graphic; vrGraphic.position = position; vrGraphic.distance = distance; vrGraphic.pointerPosition = pointerPosition; s_SortedGraphics.Add(vrGraphic); } } s_SortedGraphics.Sort((g1, g2) => g2.graphic.depth.CompareTo(g1.graphic.depth)); for (int i = 0; i < s_SortedGraphics.Count; ++i) { results.Add(s_SortedGraphics[i]); } s_SortedGraphics.Clear(); }