namespace Fusion.Addons.InterestManagement { using System.Collections.Generic; using UnityEngine; /// /// Contains helper methods related to interest box. /// public static class InterestBoxUtility { // PUBLIC METHODS /// /// Converts box to Fusion interest cell coordinate system. /// public static void GetCells(Vector3 position, Quaternion rotation, Vector3 size, bool isAxisAligned, HashSet cells) { if (isAxisAligned == false) { Vector2 coneSize = new Vector2(size.x, size.y); float coneLength = size.z; position -= rotation * Vector3.forward * coneLength * 0.5f; InterestConeUtility.GetCells(position, rotation, coneLength, coneSize, coneSize, coneSize, coneSize, cells); return; } var gridSize = Simulation.AreaOfInterest.GetGridSize(); int gridSizeX = gridSize.Item1; int gridSizeY = gridSize.Item2; int gridSizeZ = gridSize.Item3; int gridSizeXY = gridSizeX * gridSizeY; int gridHalfX = gridSizeX / 2; int gridHalfY = gridSizeY / 2; int gridHalfZ = gridSizeZ / 2; int cellSize = Simulation.AreaOfInterest.GetCellSize(); float cellInv = 1.0f / cellSize; if (size.x > 0.0f && size.y > 0.0f && size.z > 0.0f) { size *= 0.5f; GetCellCoordinates(position - size, out int minX, out int minY, out int minZ); GetCellCoordinates(position + size, out int maxX, out int maxY, out int maxZ); for (int z = minZ * gridSizeXY; z <= maxZ * gridSizeXY; z += gridSizeXY) { for (int y = minY * gridSizeX; y <= maxY * gridSizeX; y += gridSizeX) { for (int x = minX; x <= maxX; ++x) { int cell = z + y + x + 1; cells.Add(cell); } } } } else { GetCellCoordinates(position, out int x, out int y, out int z); int cell = z * gridSizeXY + y * gridSizeX + x + 1; cells.Add(cell); } return; void GetCellCoordinates(Vector3 targetPosition, out int x, out int y, out int z) { x = gridHalfX + (int)(targetPosition.x * cellInv); y = gridHalfY + (int)(targetPosition.y * cellInv); z = gridHalfZ + (int)(targetPosition.z * cellInv); if (targetPosition.x < 0.0f) { x -= 1; } if (targetPosition.y < 0.0f) { y -= 1; } if (targetPosition.z < 0.0f) { z -= 1; } if (x < 0) { x = 0; } else if (x >= gridSizeX) { x = gridSizeX - 1; } if (y < 0) { y = 0; } else if (y >= gridSizeY) { y = gridSizeY - 1; } if (z < 0) { z = 0; } else if (z >= gridSizeZ) { z = gridSizeZ - 1; } } } /// /// Draws interest box gizmo. /// public static void DrawGizmo(Vector3 position, Quaternion rotation, Vector3 size, bool isAxisAligned, Color color, bool drawIcon = true) { Color gizmoColor = Gizmos.color; Gizmos.color = color; if (drawIcon == true) { Gizmos.DrawIcon(position, "d_ViewToolOrbit On@2x"); } if (isAxisAligned == true) { if (size.x > 0.0f && size.y > 0.0f && size.z > 0.0f) { Gizmos.DrawWireCube(position, size); } } else { Vector2 coneSize = new Vector2(size.x, size.y); float coneLength = size.z; position -= rotation * Vector3.forward * coneLength * 0.5f; InterestConeUtility.DrawGizmo(position, rotation, coneLength, coneSize, coneSize, coneSize, coneSize, color, false); } Gizmos.color = gizmoColor; } } }