diff --git a/Editor/EditorGUIUtils.cs b/Editor/EditorGUIUtils.cs index ea8734b..2992c0b 100644 --- a/Editor/EditorGUIUtils.cs +++ b/Editor/EditorGUIUtils.cs @@ -16,5 +16,18 @@ public static void HorizontalLine(Color color) } public static void HorizontalLine() => HorizontalLine(horizontalLineColor); + + public class FoldoutHeaderScope : System.IDisposable + { + public FoldoutHeaderScope(string label, ref bool foldout) + { + foldout = EditorGUILayout.BeginFoldoutHeaderGroup(foldout, label); + } + + public void Dispose() + { + EditorGUILayout.EndFoldoutHeaderGroup(); + } + } } } \ No newline at end of file diff --git a/Editor/ScenePartitionEditorWindow.cs b/Editor/ScenePartitionEditorWindow.cs index 96f3685..c22de0a 100644 --- a/Editor/ScenePartitionEditorWindow.cs +++ b/Editor/ScenePartitionEditorWindow.cs @@ -9,8 +9,9 @@ public class ScenePartitionEditorWindow : EditorWindow private const int cellSize = 10; private Vector2 scrollPos = Vector2.zero; + private bool foldoutGroupEnabled = false; - [MenuItem("Max/ScenePartitionWindow")] + [MenuItem("Window/ScenePartition")] public static void ShowExample() { ScenePartitionEditorWindow window = GetWindow(); @@ -41,58 +42,63 @@ private void OnGUI() private void DrawSceneDataCache() { - using (EditorGUILayout.ScrollViewScope scope = new EditorGUILayout.ScrollViewScope(scrollPos)) + using (EditorGUIUtils.FoldoutHeaderScope foldoutGroup = new EditorGUIUtils.FoldoutHeaderScope("SceneDataCache", ref foldoutGroupEnabled)) { - scrollPos = scope.scrollPosition; + if (!foldoutGroupEnabled) return; - using (new EditorGUI.DisabledGroupScope(true)) + using (EditorGUILayout.ScrollViewScope scope = new EditorGUILayout.ScrollViewScope(scrollPos)) { - ScenePartitionSS scenePartitionSS = ScenePartitionSS.instance; + scrollPos = scope.scrollPosition; - foreach (KeyValuePair sceneData in scenePartitionSS.SceneDataCache) + using (new EditorGUI.DisabledGroupScope(true)) { - if (sceneData.Key == null || sceneData.Value == null) continue; + ScenePartitionSS scenePartitionSS = ScenePartitionSS.instance; - EditorGUILayout.LabelField($"{sceneData.Key.name}"); - - if (sceneData.Value.HasCreatedPartitions) + foreach (KeyValuePair sceneData in scenePartitionSS.SceneDataCache) { - EditorGUILayout.LabelField($"scenePartitions"); + if (sceneData.Key == null || sceneData.Value == null) continue; - foreach (KeyValuePair scenePartition in sceneData.Value.ScenePartitions) + EditorGUILayout.LabelField($"{sceneData.Key.name}"); + + if (sceneData.Value.HasCreatedPartitions) { - EditorGUILayout.LongField((long)scenePartition.Key); - } - } + EditorGUILayout.LabelField($"scenePartitions"); - EditorGUILayout.Space(); - - if (sceneData.Value.HasLoadedPartitions) - { - EditorGUILayout.LabelField($"loadedScenePartitions"); - - foreach (KeyValuePair scenePartition in sceneData.Value.LoadedScenePartitions) - { - EditorGUILayout.LongField((long)scenePartition.Value.id); - } - } - - if (sceneData.Value.SceneGrid != null) - { - EditorGUILayout.LabelField($"generatedSceneGrid"); - - foreach (KeyValuePair item in sceneData.Value.SceneGrid.Grid) - { - EditorGUILayout.IntField("gridId", item.Key); - - EditorGUI.indentLevel++; - - foreach (ulong id in item.Value.list) + foreach (KeyValuePair scenePartition in sceneData.Value.ScenePartitions) { - EditorGUILayout.LongField((long)id); + EditorGUILayout.LongField((long)scenePartition.Key); } + } - EditorGUI.indentLevel--; + EditorGUILayout.Space(); + + if (sceneData.Value.HasLoadedPartitions) + { + EditorGUILayout.LabelField($"loadedScenePartitions"); + + foreach (KeyValuePair scenePartition in sceneData.Value.LoadedScenePartitions) + { + EditorGUILayout.LongField((long)scenePartition.Value.id); + } + } + + if (sceneData.Value.SceneGrid != null) + { + EditorGUILayout.LabelField($"generatedSceneGrid"); + + foreach (KeyValuePair item in sceneData.Value.SceneGrid.Grid) + { + EditorGUILayout.IntField("gridId", item.Key); + + EditorGUI.indentLevel++; + + foreach (ulong id in item.Value.list) + { + EditorGUILayout.LongField((long)id); + } + + EditorGUI.indentLevel--; + } } } } diff --git a/Editor/ScenePartitionSO.cs b/Editor/ScenePartitionSO.cs index 2a9626f..94c585f 100644 --- a/Editor/ScenePartitionSO.cs +++ b/Editor/ScenePartitionSO.cs @@ -281,11 +281,11 @@ public void GenerateSceneGridData() if (ids[i].targetPrefabId == 0) // 0 = no prefab. { - Data.SceneGrid.Insert(ids[i].targetObjectId, rootGameObjects[i].transform.position); + Data.SceneGrid.Insert(ids[i].targetObjectId, rootGameObjects[i].transform.position, ScenePartitionSceneViewEditor.cellSize); } else { - Data.SceneGrid.Insert(ids[i].targetPrefabId, rootGameObjects[i].transform.position); + Data.SceneGrid.Insert(ids[i].targetPrefabId, rootGameObjects[i].transform.position, ScenePartitionSceneViewEditor.cellSize); } } diff --git a/Editor/ScenePartitionSOEditor.cs b/Editor/ScenePartitionSOEditor.cs index da15203..e188553 100644 --- a/Editor/ScenePartitionSOEditor.cs +++ b/Editor/ScenePartitionSOEditor.cs @@ -9,6 +9,7 @@ public class ScenePartitionSOEditor : UnityEditor.Editor { private ulong id = 0; private int gridId = 0; + private bool foldoutGroupEnabled = false; public override void OnInspectorGUI() { @@ -20,7 +21,7 @@ public override void OnInspectorGUI() //EditorGUILayout.PropertyField(sceneAssetProperty); serializedObject.ApplyModifiedProperties(); - EditorGUILayout.Space(); + EditorGUIUtils.HorizontalLine(); if (scenePartitionSO.SceneAsset == null) { @@ -31,72 +32,88 @@ public override void OnInspectorGUI() } else { - if (GUILayout.Button("Load All")) - { - scenePartitionSO.LoadAll(); - } - - if (GUILayout.Button("Reload")) - { - scenePartitionSO.Reload(); - } - - if (GUILayout.Button("Save")) - { - scenePartitionSO.Save(); - } - - if (GUILayout.Button("Unload")) - { - scenePartitionSO.Unload(); - } - - EditorGUILayout.Space(); - if (GUILayout.Button("Open Scene Data Folder")) { EditorUtility.RevealInFinder(ScenePartitionUtils.GetDataPath(scenePartitionSO)); } - EditorGUILayout.Space(); + EditorGUIUtils.HorizontalLine(); - id = (ulong)EditorGUILayout.LongField("id", (long)id); - - if (GUILayout.Button("Load Section")) + using (new EditorGUILayout.HorizontalScope()) { - scenePartitionSO.LoadPartitions(new ulong[1] { id }); + if (GUILayout.Button("Load All", EditorStyles.miniButtonLeft)) + { + scenePartitionSO.LoadAll(); + } + + if (GUILayout.Button("Unload", EditorStyles.miniButtonRight)) + { + scenePartitionSO.Unload(); + } } + using (new EditorGUILayout.HorizontalScope()) + { + if (GUILayout.Button("Save", EditorStyles.miniButtonLeft)) + { + scenePartitionSO.Save(); + } + + if (GUILayout.Button(new GUIContent("Reload", "Discard changes and reload"), EditorStyles.miniButtonRight)) + { + scenePartitionSO.Reload(); + } + } + + EditorGUIUtils.HorizontalLine(); + + using (new EditorGUILayout.HorizontalScope()) + { + id = (ulong)EditorGUILayout.LongField("id", (long)id); + + if (GUILayout.Button("Load Id")) + { + scenePartitionSO.LoadPartitions(new ulong[1] { id }); + } + } + + EditorGUIUtils.HorizontalLine(); + + ScenePartitionSceneViewEditor.cellSize = EditorGUILayout.IntSlider("cellSize", ScenePartitionSceneViewEditor.cellSize, 10, 1000); + if (GUILayout.Button("GenerateSceneGrid")) { scenePartitionSO.GenerateSceneGridData(); } - gridId = EditorGUILayout.IntField("gridId", gridId); - - if (GUILayout.Button("LoadSceneGrid")) - { - scenePartitionSO.LoadCell(gridId); - } - if (scenePartitionSO.Data.SceneGrid != null) { - EditorGUILayout.LabelField($"generatedSceneGrid"); + gridId = EditorGUILayout.IntField("gridId", gridId); - scenePartitionSO.Data.SceneGrid.cellSize = EditorGUILayout.IntSlider("cellSize", scenePartitionSO.Data.SceneGrid.cellSize, 10, 1000); - - foreach (KeyValuePair item in scenePartitionSO.Data.SceneGrid.Grid) + if (GUILayout.Button("LoadSceneGrid")) { - EditorGUILayout.LongField("gridId", item.Key); + scenePartitionSO.LoadCell(gridId); + } - EditorGUI.indentLevel++; + using (EditorGUIUtils.FoldoutHeaderScope foldoutGroup = new EditorGUIUtils.FoldoutHeaderScope("gridData", ref foldoutGroupEnabled)) + { + if (!foldoutGroupEnabled) return; - foreach (ulong id in item.Value.list) + EditorGUILayout.LabelField($"generatedSceneGrid"); + + foreach (KeyValuePair item in scenePartitionSO.Data.SceneGrid.Grid) { - EditorGUILayout.LongField((long)id); - } + EditorGUILayout.LongField("gridId", item.Key); - EditorGUI.indentLevel--; + EditorGUI.indentLevel++; + + foreach (ulong id in item.Value.list) + { + EditorGUILayout.LongField((long)id); + } + + EditorGUI.indentLevel--; + } } } } diff --git a/Editor/ScenePartitionSceneViewEditor.cs b/Editor/ScenePartitionSceneViewEditor.cs index 86b4a6e..f0b06a2 100644 --- a/Editor/ScenePartitionSceneViewEditor.cs +++ b/Editor/ScenePartitionSceneViewEditor.cs @@ -6,6 +6,8 @@ namespace VertexColor.ScenePartition.Editor [InitializeOnLoad] public class ScenePartitionSceneViewEditor : UnityEditor.Editor { + public static int cellSize = 100; + private static ScenePartitionSO scenePartitionSO = null; static ScenePartitionSceneViewEditor() @@ -18,7 +20,6 @@ private static void HandleDuringSceneGui(SceneView sceneView) if (Event.current.modifiers != EventModifiers.Control) return; if (!ScenePartitionUtils.TryGetScenePartitionSOForActiveScene(out scenePartitionSO)) return; - int cellSize = scenePartitionSO.Data.SceneGrid.cellSize; Vector3 gridPosition = CalculateGridPosition(Event.current.mousePosition); int gridId = SceneGrid.CalculateGridPosition(gridPosition, cellSize); diff --git a/Runtime/SceneGrid.cs b/Runtime/SceneGrid.cs index d035475..5fcd694 100644 --- a/Runtime/SceneGrid.cs +++ b/Runtime/SceneGrid.cs @@ -5,15 +5,12 @@ namespace VertexColor.ScenePartition [System.Serializable] public class SceneGrid { - [SerializeField] - public int cellSize = 10; - [SerializeField] private SceneGridDictionary grid = new SceneGridDictionary(); public SceneGridDictionary Grid => grid; - public void Insert(ulong scenePartitionId, Vector3 point) + public void Insert(ulong scenePartitionId, Vector3 point, int cellSize) { int gridId = CalculateGridPosition(point, cellSize); if (grid.TryGetValue(gridId, out GridList ids))