2021년 4학년 1학기 기업연계프로젝트2 컴퓨터소프트웨어공학과 <원광투어팀> 팀장 : 송유진 팀원 : 김나영, 이경희, 한유진
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
3.4 KiB

5 years ago
  1. //========= Copyright 2016-2020, HTC Corporation. All rights reserved. ===========
  2. using HTC.UnityPlugin.Utility;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.EventSystems;
  6. using UnityEngine.UI;
  7. namespace HTC.UnityPlugin.Pointer3D
  8. {
  9. [DisallowMultipleComponent]
  10. public class CanvasRaycastMethod : BaseRaycastMethod
  11. {
  12. private static readonly IndexedSet<ICanvasRaycastTarget> canvases = new IndexedSet<ICanvasRaycastTarget>();
  13. public static bool AddTarget(ICanvasRaycastTarget obj) { return obj == null ? false : canvases.AddUnique(obj); }
  14. public static bool RemoveTarget(ICanvasRaycastTarget obj) { return obj == null ? false : canvases.Remove(obj); }
  15. public override void Raycast(Ray ray, float distance, List<RaycastResult> raycastResults)
  16. {
  17. var tempCanvases = ListPool<ICanvasRaycastTarget>.Get();
  18. tempCanvases.AddRange(canvases);
  19. for (int i = tempCanvases.Count - 1; i >= 0; --i)
  20. {
  21. var target = tempCanvases[i];
  22. if (target == null || !target.enabled) { continue; }
  23. Raycast(target.canvas, target.ignoreReversedGraphics, ray, distance, raycaster, raycastResults);
  24. }
  25. ListPool<ICanvasRaycastTarget>.Release(tempCanvases);
  26. }
  27. public static void Raycast(Canvas canvas, bool ignoreReversedGraphics, Ray ray, float distance, Pointer3DRaycaster raycaster, List<RaycastResult> raycastResults)
  28. {
  29. if (canvas == null) { return; }
  30. var eventCamera = raycaster.eventCamera;
  31. var screenCenterPoint = Pointer3DInputModule.ScreenCenterPoint;
  32. var graphics = GraphicRegistry.GetGraphicsForCanvas(canvas);
  33. // Pointer3DRaycaster should set tje eventCamera to correct position
  34. for (int i = 0; i < graphics.Count; ++i)
  35. {
  36. var graphic = graphics[i];
  37. // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn
  38. if (graphic.depth == -1 || !graphic.raycastTarget) { continue; }
  39. if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, screenCenterPoint, eventCamera)) { continue; }
  40. if (ignoreReversedGraphics && Vector3.Dot(ray.direction, graphic.transform.forward) <= 0f) { continue; }
  41. if (!graphic.Raycast(screenCenterPoint, eventCamera)) { continue; }
  42. //var dist = Vector3.Dot(transForward, trans.position - ray.origin) / Vector3.Dot(transForward, ray.direction);
  43. float dist;
  44. new Plane(graphic.transform.forward, graphic.transform.position).Raycast(ray, out dist);
  45. if (dist > distance) { continue; }
  46. raycastResults.Add(new RaycastResult
  47. {
  48. gameObject = graphic.gameObject,
  49. module = raycaster,
  50. distance = dist,
  51. worldPosition = ray.GetPoint(dist),
  52. worldNormal = -graphic.transform.forward,
  53. screenPosition = screenCenterPoint,
  54. index = raycastResults.Count,
  55. depth = graphic.depth,
  56. sortingLayer = canvas.sortingLayerID,
  57. sortingOrder = canvas.sortingOrder
  58. });
  59. }
  60. }
  61. }
  62. }