ObjectPlacementBlockSubdivisionApplyOperation.cs 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace O3DWB
  5. {
  6. public class ObjectPlacementBlockSubdivisionApplyOperation
  7. {
  8. #region Public Methods
  9. public void ApplySubdivisionToEntireBlock(List<ObjectPlacementBoxStackSegment> allBlockSegments, ObjectPlacementBlockSubdivisionSettings subdivisionSettings)
  10. {
  11. // No subdivision required?
  12. if (!subdivisionSettings.SubdivideAlongGrowDirection && !subdivisionSettings.SubdivideAlongExtensionRight && !subdivisionSettings.SubdivideAlongExtensionLook) return;
  13. // Note: The following code assumes the segments' stacks extend along the extension plane right axis
  14. // and the segments themselves are arranged along the plane's look axis.
  15. for (int segmentIndex = 0; segmentIndex < allBlockSegments.Count; ++segmentIndex)
  16. {
  17. int numberOfTraversedSegments = segmentIndex + 1;
  18. ObjectPlacementBoxStackSegment segment = allBlockSegments[segmentIndex];
  19. segment.ClearHideFlagInAllStacks(ObjectPlacementBoxHideFlags.BlockApplySubdivisions);
  20. // If we must subdivide along the extension look axis, we may need to hide the entire segment based
  21. // on the number of segments we have traversed so far.
  22. if (subdivisionSettings.SubdivideAlongExtensionLook)
  23. {
  24. // First calculate the remainder of how many pairs of <subidvision, gap> we have traversed
  25. int subdivisionGapPairSize = subdivisionSettings.SubdivisionGapSizeAlongExtensionLook + subdivisionSettings.SubdivisionSizeAlongExtensionLook;
  26. int remainder = numberOfTraversedSegments % subdivisionGapPairSize;
  27. // If the remainder is 0 it means we are at the end of a pair and the end of a pair is always a gap. So we activate
  28. // the hide flags. We also activate the hide flags if the remainder is bigger than the subdivision size. In that case
  29. // it means we reside somewhere inside the gap.
  30. if (remainder == 0 || remainder > subdivisionSettings.SubdivisionSizeAlongExtensionLook) segment.SetHideFlagInAllStacks(ObjectPlacementBoxHideFlags.BlockApplySubdivisions);
  31. }
  32. for (int stackIndex = 0; stackIndex < segment.NumberOfStacks; ++stackIndex)
  33. {
  34. int numberOfTraversedStacks = stackIndex + 1;
  35. ObjectPlacementBoxStack stack = segment.GetStackByIndex(stackIndex);
  36. if (subdivisionSettings.SubdivideAlongExtensionRight)
  37. {
  38. int subdivisionGapPairSize = subdivisionSettings.SubdivisionGapSizeAlongExtensionRight + subdivisionSettings.SubdivisionSizeAlongExtensionRight;
  39. int remainder = numberOfTraversedStacks % subdivisionGapPairSize;
  40. if (remainder == 0 || remainder > subdivisionSettings.SubdivisionSizeAlongExtensionRight) stack.SetHideFlagForAllBoxes(ObjectPlacementBoxHideFlags.BlockApplySubdivisions);
  41. }
  42. for (int boxIndex = 0; boxIndex < stack.NumberOfBoxes; ++boxIndex)
  43. {
  44. int numberOfTraversedBoxes = boxIndex + 1;
  45. if (subdivisionSettings.SubdivideAlongGrowDirection)
  46. {
  47. int subdivisionGapPairSize = subdivisionSettings.SubdivisionGapSizeAlongGrowDirection + subdivisionSettings.SubdivisionSizeAlongGrowDirection;
  48. int remainder = numberOfTraversedBoxes % subdivisionGapPairSize;
  49. if (remainder == 0 || remainder > subdivisionSettings.SubdivisionSizeAlongGrowDirection) stack.GetBoxByIndex(boxIndex).SetHideFlag(ObjectPlacementBoxHideFlags.BlockApplySubdivisions);
  50. }
  51. }
  52. }
  53. }
  54. }
  55. #endregion
  56. }
  57. }
  58. #endif