ObjectPlacementPathOverlappedStackDetection.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace O3DWB
  5. {
  6. public static class ObjectPlacementPathOverlappedStackDetection
  7. {
  8. #region Public Static Functions
  9. public static List<ObjectPlacementBoxStack> GetOverlappedStacksInSegment(int segmentIndex, List<ObjectPlacementBoxStackSegment> pathSegments)
  10. {
  11. var overlappedStacks = new List<ObjectPlacementBoxStack>(pathSegments.Count * 10);
  12. ObjectPlacementBoxStackSegment possiblyOverlappedSegment = pathSegments[segmentIndex];
  13. for (int possiblyOverlappingSegmentIndex = segmentIndex - 1; possiblyOverlappingSegmentIndex >= 0; --possiblyOverlappingSegmentIndex)
  14. {
  15. ObjectPlacementBoxStackSegment possiblyOverlappingSegment = pathSegments[possiblyOverlappingSegmentIndex];
  16. if (possiblyOverlappingSegment.ExtensionVectorIntersects(possiblyOverlappedSegment) ||
  17. possiblyOverlappingSegment.ExtensionVectorOverlaps(possiblyOverlappedSegment))
  18. {
  19. for (int possiblyOverlappedStackIndex = 0; possiblyOverlappedStackIndex < possiblyOverlappedSegment.NumberOfStacks; ++possiblyOverlappedStackIndex)
  20. {
  21. ObjectPlacementBoxStack possiblyOverlappedStack = possiblyOverlappedSegment.GetStackByIndex(possiblyOverlappedStackIndex);
  22. for (int possiblyOverlappingStackIndex = 0; possiblyOverlappingStackIndex < possiblyOverlappingSegment.NumberOfStacks; ++possiblyOverlappingStackIndex)
  23. {
  24. ObjectPlacementBoxStack possiblyOverlappingStack = possiblyOverlappingSegment.GetStackByIndex(possiblyOverlappingStackIndex);
  25. if (IsStackOverlappedBy(possiblyOverlappedStack, possiblyOverlappingStack)) overlappedStacks.Add(possiblyOverlappedStack);
  26. }
  27. }
  28. }
  29. }
  30. return overlappedStacks;
  31. }
  32. #endregion
  33. #region Private Static Functions
  34. private static bool IsStackOverlappedBy(ObjectPlacementBoxStack possiblyOveralppedStack, ObjectPlacementBoxStack possiblyOverlappingStack)
  35. {
  36. bool stacksAreAligned = possiblyOveralppedStack.UpAxis.IsAlignedWith(possiblyOverlappingStack.UpAxis);
  37. if (!stacksAreAligned) return false;
  38. Plane stackBasePlane = possiblyOveralppedStack.GetBasePlane();
  39. Vector3 basePositionVector = stackBasePlane.ProjectPoint(possiblyOverlappingStack.BasePosition) - stackBasePlane.ProjectPoint(possiblyOveralppedStack.BasePosition);
  40. if (basePositionVector.magnitude < 1e-3f) return true;
  41. return false;
  42. }
  43. #endregion
  44. }
  45. }
  46. #endif