using UnityEditor; using UnityEngine; namespace VertexColor.ScenePartition.Editor { [InitializeOnLoad] public class ScenePartitionSceneViewEditor : UnityEditor.Editor { private const int cellSize = 10; static ScenePartitionSceneViewEditor() { SceneView.duringSceneGui += HandleDuringSceneGui; } private static void HandleDuringSceneGui(SceneView sceneView) { if (Event.current.modifiers != EventModifiers.Control) return; Vector3 gridPosition = CalculateGridPosition(Event.current.mousePosition); int gridId = SceneGrid.CalculateGridPosition(gridPosition, 10); int x = Mathf.FloorToInt(gridPosition.x / cellSize); int z = Mathf.FloorToInt(gridPosition.z / cellSize); Vector3 cellOrign = new Vector3(x * cellSize, 0, z * cellSize); Vector3[] lines = new Vector3[] { new Vector3(0, 0, 0) + cellOrign, new Vector3(0, 0, cellSize) + cellOrign, // Left Bottom -> Left Top new Vector3(cellSize, 0, 0) + cellOrign, new Vector3(cellSize, 0, cellSize) + cellOrign, // Right Bottom -> Right Top new Vector3(0, 0, 0) + cellOrign, new Vector3(cellSize, 0, 0) + cellOrign, // Left Bottom -> Right Bottom new Vector3(0, 0, cellSize) + cellOrign, new Vector3(cellSize, 0, cellSize) + cellOrign, // Left Top -> Right Top }; Handles.DrawDottedLines(lines, 10.0f); Handles.Label(cellOrign + new Vector3(cellSize * 0.5f, 0, cellSize * 0.5f), new GUIContent($"{gridId}")); if (Event.current.button == 1 && Event.current.type == EventType.MouseDown) { GenericMenu menu = new GenericMenu(); menu.AddItem(new GUIContent($"Load {gridId}"), false, Load, gridId); menu.ShowAsContext(); Event.current.Use(); } SceneView.RepaintAll(); } private static Vector3 CalculateGridPosition(Vector2 mousePosition) { if (Event.current == null) return Vector3.zero; Ray ray = HandleUtility.GUIPointToWorldRay(mousePosition); Plane plane = new Plane(Vector3.up, Vector3.zero); // Horizontal plane at y = 0 if (!plane.Raycast(ray, out float distance)) return Vector3.zero; Vector3 intersectionPoint = ray.GetPoint(distance); return intersectionPoint; } private static void Load(object gridId) { if (gridId == null) return; if (gridId is not int gridPos) return; } } }