private void PreformGraphics(PvrBasePoint pointer, List <Graphic> results) { Vector2 screenPos = eventCamera.WorldToScreenPoint(pointer.ray.GetPoint(pointer.maxPointDistance)); var graphics = GraphicRegistry.GetGraphicsForCanvas(canvas); for (int i = 0; i < graphics.Count; i++) { Graphic g = graphics[i]; Debug.Log(g.gameObject.name); if (g.depth == -1 || !g.raycastTarget) { continue; } if (!RectTransformUtility.RectangleContainsScreenPoint(g.rectTransform, screenPos, eventCamera)) { continue; } if (g.Raycast(screenPos, eventCamera)) { sortedGraphics.Add(g); // Debug.Log(g.gameObject.name); } sortedGraphics.Sort((g1, g2) => g1.depth.CompareTo(g.depth)); foreach (var s in sortedGraphics) { results.Add(s); } sortedGraphics.Clear(); } }
public override void Raycast(PointerEventData eventData, List <RaycastResult> resultAppendList) { if (canvas == null || eventCamera == null) { return; } PvrBasePoint pointer = PvrLaserPointer.pointer; float hitDistance = float.MinValue; if (blockingObjects != BlockingObjects.None) { float dist = eventCamera.farClipPlane - eventCamera.nearClipPlane; if (blockingObjects == BlockingObjects.ThreeD || blockingObjects == BlockingObjects.All) { RaycastHit hit; if (Physics.Raycast(pointer.ray, out hit, dist, blockingMask)) { hitDistance = hit.distance; } } } raycastResults.Clear(); PreformGraphics(pointer, raycastResults); pointer.isHit = false; for (int i = 0; i < raycastResults.Count; i++) { GameObject go = raycastResults[0].gameObject; Plane plane = new Plane(go.transform.forward, go.transform.position); float enter = 0.0f; if (plane.Raycast(pointer.ray, out enter)) { pointer.isHit = true; pointer.SetEndPoint(pointer.ray.GetPoint(enter)); } } }