SW 중심대학 OSS GIT 서버 박건태, 이승준, 고기완, 이준호 새로운 배포
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.

136 lines
4.2 KiB

4 years ago
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine.XR.ARSubsystems;
  4. namespace UnityEngine.XR.ARFoundation
  5. {
  6. /// <summary>
  7. /// Generates a mesh for an <see cref="ARPlane"/>.
  8. /// </summary>
  9. /// <remarks>
  10. /// If this <c>GameObject</c> has a <c>MeshFilter</c> and/or <c>MeshCollider</c>,
  11. /// this component will generate a mesh from the underlying <c>BoundedPlane</c>.
  12. ///
  13. /// It will also update a <c>LineRenderer</c> with the boundary points, if present.
  14. /// </remarks>
  15. [RequireComponent(typeof(ARPlane))]
  16. [HelpURL("https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@3.0/api/UnityEngine.XR.ARFoundation.ARPlaneMeshVisualizer.html")]
  17. public sealed class ARPlaneMeshVisualizer : MonoBehaviour
  18. {
  19. /// <summary>
  20. /// Get the <c>Mesh</c> that this visualizer creates and manages.
  21. /// </summary>
  22. public Mesh mesh { get; private set; }
  23. void OnBoundaryChanged(ARPlaneBoundaryChangedEventArgs eventArgs)
  24. {
  25. var boundary = m_Plane.boundary;
  26. if (!ARPlaneMeshGenerators.GenerateMesh(mesh, new Pose(transform.localPosition, transform.localRotation), boundary))
  27. return;
  28. var lineRenderer = GetComponent<LineRenderer>();
  29. if (lineRenderer != null)
  30. {
  31. lineRenderer.positionCount = boundary.Length;
  32. for (int i = 0; i < boundary.Length; ++i)
  33. {
  34. var point2 = boundary[i];
  35. lineRenderer.SetPosition(i, new Vector3(point2.x, 0, point2.y));
  36. }
  37. }
  38. var meshFilter = GetComponent<MeshFilter>();
  39. if (meshFilter != null)
  40. meshFilter.sharedMesh = mesh;
  41. var meshCollider = GetComponent<MeshCollider>();
  42. if (meshCollider != null)
  43. meshCollider.sharedMesh = mesh;
  44. }
  45. void DisableComponents()
  46. {
  47. enabled = false;
  48. var meshCollider = GetComponent<MeshCollider>();
  49. if (meshCollider != null)
  50. meshCollider.enabled = false;
  51. UpdateVisibility();
  52. }
  53. void SetVisible(bool visible)
  54. {
  55. var meshRenderer = GetComponent<MeshRenderer>();
  56. if (meshRenderer != null)
  57. meshRenderer.enabled = visible;
  58. var lineRenderer = GetComponent<LineRenderer>();
  59. if (lineRenderer != null)
  60. lineRenderer.enabled = visible;
  61. }
  62. void UpdateVisibility()
  63. {
  64. var visible = enabled &&
  65. (m_Plane.trackingState != TrackingState.None) &&
  66. (ARSession.state > ARSessionState.Ready) &&
  67. (m_Plane.subsumedBy == null);
  68. SetVisible(visible);
  69. }
  70. void Awake()
  71. {
  72. mesh = new Mesh();
  73. m_Plane = GetComponent<ARPlane>();
  74. }
  75. void OnEnable()
  76. {
  77. m_Plane.boundaryChanged += OnBoundaryChanged;
  78. UpdateVisibility();
  79. OnBoundaryChanged(default(ARPlaneBoundaryChangedEventArgs));
  80. }
  81. void OnDisable()
  82. {
  83. m_Plane.boundaryChanged -= OnBoundaryChanged;
  84. UpdateVisibility();
  85. }
  86. void Update()
  87. {
  88. if (transform.hasChanged)
  89. {
  90. var lineRenderer = GetComponent<LineRenderer>();
  91. if (lineRenderer != null)
  92. {
  93. if (!m_InitialLineWidthMultiplier.HasValue)
  94. m_InitialLineWidthMultiplier = lineRenderer.widthMultiplier;
  95. lineRenderer.widthMultiplier = m_InitialLineWidthMultiplier.Value * transform.lossyScale.x;
  96. }
  97. else
  98. {
  99. m_InitialLineWidthMultiplier = null;
  100. }
  101. transform.hasChanged = false;
  102. }
  103. if (m_Plane.subsumedBy != null)
  104. {
  105. DisableComponents();
  106. }
  107. else
  108. {
  109. UpdateVisibility();
  110. }
  111. }
  112. float? m_InitialLineWidthMultiplier;
  113. ARPlane m_Plane;
  114. }
  115. }