XZVisibleGridCellRangeCalculator.cs 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace O3DWB
  5. {
  6. public class XZVisibleGridCellRangeCalculator
  7. {
  8. #region Public Methods
  9. public XZVisibleGridCellRange Calculate(XZGrid grid, CameraViewVolume cameraViewVolume)
  10. {
  11. List<Vector3> gridPlaneIntersectionPoints = GetGridPlaneIntersectionPointsWithVolumeRays(grid, cameraViewVolume);
  12. return CalculateVisibleCellRangeFromGridPlaneIntersectionPoints(grid, gridPlaneIntersectionPoints);
  13. }
  14. #endregion
  15. #region Private Methods
  16. private List<Vector3> GetGridPlaneIntersectionPointsWithVolumeRays(XZGrid grid, CameraViewVolume cameraViewVolume)
  17. {
  18. Plane gridPlane = grid.Plane;
  19. Ray3D[] volumeRays = cameraViewVolume.WorldSpaceVolumeEdgeRays;
  20. float t;
  21. var intersectionPoints = new List<Vector3>();
  22. foreach(Ray3D ray in volumeRays)
  23. {
  24. if (ray.IntersectsPlane(gridPlane, out t)) intersectionPoints.Add(ray.Origin + ray.Direction * t);
  25. }
  26. return intersectionPoints;
  27. }
  28. private XZVisibleGridCellRange CalculateVisibleCellRangeFromGridPlaneIntersectionPoints(XZGrid grid, List<Vector3> gridPlaneIntersectionPoints)
  29. {
  30. if (gridPlaneIntersectionPoints.Count == 0) new XZVisibleGridCellRange();
  31. List<XZGridCell> gridCellsFromIntersectionPoints = grid.GetCellsFromPoints(gridPlaneIntersectionPoints);
  32. return CalculateVisibleCellRangeFromGridCells(grid, gridCellsFromIntersectionPoints);
  33. }
  34. private XZVisibleGridCellRange CalculateVisibleCellRangeFromGridCells(XZGrid grid, List<XZGridCell> gridCells)
  35. {
  36. int minCellIndexX = int.MaxValue;
  37. int maxCellIndexX = int.MinValue;
  38. int minCellIndexZ = int.MaxValue;
  39. int maxCellIndexZ = int.MinValue;
  40. foreach(XZGridCell cell in gridCells)
  41. {
  42. if (cell.XIndex < minCellIndexX) minCellIndexX = cell.XIndex;
  43. if (cell.XIndex > maxCellIndexX) maxCellIndexX = cell.XIndex;
  44. if (cell.ZIndex < minCellIndexZ) minCellIndexZ = cell.ZIndex;
  45. if (cell.ZIndex > maxCellIndexZ) maxCellIndexZ = cell.ZIndex;
  46. }
  47. XZGridDimensionSettings gridDimensionSettings = grid.DimensionSettings;
  48. if(gridDimensionSettings.DimensionType == XZGridDimensionType.Finite)
  49. {
  50. XZGridFiniteDimensionSettings gridFiniteDimensionSettings = grid.DimensionSettings.FiniteDimensionSettings;
  51. if (minCellIndexX < gridFiniteDimensionSettings.XAxisCellIndexRange.Min) minCellIndexX = gridFiniteDimensionSettings.XAxisCellIndexRange.Min;
  52. if (maxCellIndexX > gridFiniteDimensionSettings.XAxisCellIndexRange.Max) maxCellIndexX = gridFiniteDimensionSettings.XAxisCellIndexRange.Max;
  53. if (minCellIndexZ < gridFiniteDimensionSettings.ZAxisCellIndexRange.Min) minCellIndexZ = gridFiniteDimensionSettings.ZAxisCellIndexRange.Min;
  54. if (maxCellIndexZ > gridFiniteDimensionSettings.ZAxisCellIndexRange.Max) maxCellIndexZ = gridFiniteDimensionSettings.ZAxisCellIndexRange.Max;
  55. if (minCellIndexX > maxCellIndexX) minCellIndexX = maxCellIndexX;
  56. if (minCellIndexZ > maxCellIndexZ) minCellIndexZ = maxCellIndexZ;
  57. }
  58. var visibleCellRange = new XZVisibleGridCellRange();
  59. visibleCellRange.XAxisVisibleCellRange.Min = minCellIndexX;
  60. visibleCellRange.XAxisVisibleCellRange.Max = maxCellIndexX;
  61. visibleCellRange.ZAxisVisibleCellRange.Min = minCellIndexZ;
  62. visibleCellRange.ZAxisVisibleCellRange.Max = maxCellIndexZ;
  63. return visibleCellRange;
  64. }
  65. #endregion
  66. }
  67. }
  68. #endif