RectExtensions.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace O3DWB
  5. {
  6. public static class RectExtensions
  7. {
  8. #region Extension Methods
  9. public static List<Ray2D> GetEdgeRays(this Rect rectangle)
  10. {
  11. List<Vector2> cornerPoints = rectangle.GetCornerPoints();
  12. return new List<Ray2D>
  13. {
  14. new Ray2D(cornerPoints[0], cornerPoints[1] - cornerPoints[0]),
  15. new Ray2D(cornerPoints[1], cornerPoints[2] - cornerPoints[1]),
  16. new Ray2D(cornerPoints[2], cornerPoints[3] - cornerPoints[2]),
  17. new Ray2D(cornerPoints[0], cornerPoints[0] - cornerPoints[3])
  18. };
  19. }
  20. public static List<Vector2> GetCornerPoints(this Rect rectangle)
  21. {
  22. // Return the points in the following format: bottom left, bottom right, top right, top left.
  23. return new List<Vector2>
  24. {
  25. new Vector2(rectangle.xMin, rectangle.yMin),
  26. new Vector2(rectangle.xMax, rectangle.yMin),
  27. new Vector2(rectangle.xMax, rectangle.yMax),
  28. new Vector2(rectangle.xMin, rectangle.yMax)
  29. };
  30. }
  31. public static List<Vector2> GetCenterAndCornerPoints(this Rect rectangle)
  32. {
  33. // Return the points in the following format: center, bottom left, bottom right, top right, top left.
  34. var points = new List<Vector2>();
  35. points.Add(rectangle.center);
  36. points.AddRange(rectangle.GetCornerPoints());
  37. return points;
  38. }
  39. public static List<Vector3> GetWorldCornerPointsInFrontOfCamera(this Rect rectangle, Camera camera, float distanceFromCamNearPlane)
  40. {
  41. List<Vector2> cornerPoints = rectangle.GetCornerPoints();
  42. return Vector2Extensions.GetWorldPointsInFrontOfCamera(cornerPoints, camera, distanceFromCamNearPlane);
  43. }
  44. public static Vector3 GetWorldCenterPointInFrontOfCamera(this Rect rectangle, Camera camera, float distanceFromCamNearPlane)
  45. {
  46. return rectangle.center.GetWorldPointInFrontOfCamera(camera, distanceFromCamNearPlane);
  47. }
  48. public static bool ContainsRectangle(this Rect rectangle, Rect queryRectangle)
  49. {
  50. return rectangle.ContainsAllPoints(queryRectangle.GetCornerPoints());
  51. }
  52. public static bool ContainsAllPoints(this Rect rectangle, List<Vector2> points)
  53. {
  54. foreach (Vector2 point in points)
  55. {
  56. if (!rectangle.Contains(point, true)) return false;
  57. }
  58. return true;
  59. }
  60. public static bool ContainsAnyPoint(this Rect rectangle, List<Vector2> points)
  61. {
  62. foreach (Vector2 point in points)
  63. {
  64. if (rectangle.Contains(point, true)) return true;
  65. }
  66. return false;
  67. }
  68. public static bool FullyContainsOrientedBoxCenterAndCornerPointsInScreenSpace(this Rect rectangle, OrientedBox orientedBox, Camera camera)
  69. {
  70. List<Vector2> boxCenterAndCornerScreenPoints = orientedBox.GetScreenCenterAndCornerPoints(camera);
  71. return rectangle.ContainsAllPoints(boxCenterAndCornerScreenPoints);
  72. }
  73. #endregion
  74. }
  75. }
  76. #endif