EllipseObjectInteractionShape.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System;
  4. using System.Collections.Generic;
  5. namespace O3DWB
  6. {
  7. [Serializable]
  8. public class EllipseObjectInteractionShape : ObjectInteraction2DShape
  9. {
  10. #region Private Variables
  11. [SerializeField]
  12. private EllipseShapeRenderSettings _renderSettings;
  13. #endregion
  14. #region Public Properties
  15. public EllipseShapeRenderSettings RenderSettings
  16. {
  17. get
  18. {
  19. if (_renderSettings == null) _renderSettings = Octave3DWorldBuilder.ActiveInstance.CreateScriptableObject<EllipseShapeRenderSettings>();
  20. return _renderSettings;
  21. }
  22. }
  23. public Ellipse2D Ellipse { get { return new Ellipse2D(EnclosingRect); } }
  24. #endregion
  25. #region Public Methods
  26. public override void RenderGizmos()
  27. {
  28. Ellipse2D ellipse = Ellipse;
  29. GizmosEx.Render2DFilledEllipse(ellipse, _renderSettings.FillColor);
  30. GizmosEx.Render2DEllipseBorderLines(ellipse, _renderSettings.BorderLineColor);
  31. }
  32. public override List<GameObject> GetOverlappedGameObjects(bool allowPartialOverlap)
  33. {
  34. if (allowPartialOverlap) return GetOverlappedGameObjectsForPartialOverlap(GetGameObjectsOverlappedByEnclosingRect(true), SceneViewCamera.Camera);
  35. else return GetOverlappedGameObjectsForFullOverlap(GetGameObjectsOverlappedByEnclosingRect(false), SceneViewCamera.Camera);
  36. }
  37. #endregion
  38. #region Private Methods
  39. private List<GameObject> GetOverlappedGameObjectsForPartialOverlap(List<GameObject> objectsOveralppedByEnclosingRect, Camera camera)
  40. {
  41. Ellipse2D ellipse = Ellipse;
  42. List<GameObject> overlappedGameObjects = new List<GameObject>(objectsOveralppedByEnclosingRect.Count);
  43. foreach (GameObject gameObject in objectsOveralppedByEnclosingRect)
  44. {
  45. if (ellipse.OverlapsRectangle(gameObject.GetScreenRectangle(camera))) overlappedGameObjects.Add(gameObject);
  46. }
  47. return overlappedGameObjects;
  48. }
  49. private List<GameObject> GetOverlappedGameObjectsForFullOverlap(List<GameObject> objectsOveralppedByEnclosingRect, Camera camera)
  50. {
  51. Ellipse2D ellipse = Ellipse;
  52. List<GameObject> overlappedGameObjects = new List<GameObject>(objectsOveralppedByEnclosingRect.Count);
  53. foreach (GameObject gameObject in objectsOveralppedByEnclosingRect)
  54. {
  55. OrientedBox worldOrientedBox = gameObject.gameObject.GetWorldOrientedBox();
  56. if(worldOrientedBox.IsValid() && ellipse.FullyContainsOrientedBoxCenterAndCornerPointsInScreenSpace(worldOrientedBox, camera)) overlappedGameObjects.Add(gameObject);
  57. }
  58. return overlappedGameObjects;
  59. }
  60. #endregion
  61. }
  62. }
  63. #endif