Compare commits

..

2 Commits

Author SHA1 Message Date
max
41df190afb Updated ScenePartitionViewEditor
- Grid is now drawn based on the cell size of the current active open scene
- Added function to get ScenePartitionSO of current active scene
2023-07-04 23:36:01 +02:00
max
cf3198b0b7 Updated ScenePartitionEditorWindow
- Added clear button here instead of in ScenePartitionSOEditor
- Added editor util for horizontal line
- Exposed scene grid cell size value
2023-07-04 23:34:54 +02:00
7 changed files with 121 additions and 25 deletions

20
Editor/EditorGUIUtils.cs Normal file
View File

@ -0,0 +1,20 @@
using UnityEditor;
using UnityEngine;
namespace VertexColor.ScenePartition.Editor
{
public static class EditorGUIUtils
{
public static readonly Color horizontalLineColor = Color.white;
public static void HorizontalLine(Color color)
{
Color prev = GUI.color;
GUI.color = color;
EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
GUI.color = prev;
}
public static void HorizontalLine() => HorizontalLine(horizontalLineColor);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: befa2e31a4a6ae04696dcd5b72554ea4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -19,11 +19,23 @@ public static void ShowExample()
private void OnGUI() private void OnGUI()
{ {
if (GUILayout.Button("Save")) EditorGUILayout.LabelField("Cache", EditorStyles.boldLabel);
using (new EditorGUILayout.HorizontalScope())
{ {
ScenePartitionSS.Save(); if (GUILayout.Button("Save", EditorStyles.miniButtonLeft))
{
ScenePartitionSS.Save();
}
if (GUILayout.Button("Clear", EditorStyles.miniButtonRight))
{
ScenePartitionSS.Save();
}
} }
EditorGUIUtils.HorizontalLine();
DrawSceneDataCache(); DrawSceneDataCache();
} }

View File

@ -83,6 +83,8 @@ public override void OnInspectorGUI()
{ {
EditorGUILayout.LabelField($"generatedSceneGrid"); EditorGUILayout.LabelField($"generatedSceneGrid");
scenePartitionSO.Data.SceneGrid.cellSize = EditorGUILayout.IntSlider("cellSize", scenePartitionSO.Data.SceneGrid.cellSize, 10, 1000);
foreach (KeyValuePair<int, GridList> item in scenePartitionSO.Data.SceneGrid.Grid) foreach (KeyValuePair<int, GridList> item in scenePartitionSO.Data.SceneGrid.Grid)
{ {
EditorGUILayout.LongField("gridId", item.Key); EditorGUILayout.LongField("gridId", item.Key);
@ -97,12 +99,6 @@ public override void OnInspectorGUI()
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }
} }
if (GUILayout.Button("ClearCache"))
{
scenePartitionSO.ClearCache();
ScenePartitionSS.instance.SceneDataCache.Clear();
}
} }
} }
} }

View File

@ -6,7 +6,7 @@ namespace VertexColor.ScenePartition.Editor
[InitializeOnLoad] [InitializeOnLoad]
public class ScenePartitionSceneViewEditor : UnityEditor.Editor public class ScenePartitionSceneViewEditor : UnityEditor.Editor
{ {
private const int cellSize = 10; private static ScenePartitionSO scenePartitionSO = null;
static ScenePartitionSceneViewEditor() static ScenePartitionSceneViewEditor()
{ {
@ -16,24 +16,50 @@ static ScenePartitionSceneViewEditor()
private static void HandleDuringSceneGui(SceneView sceneView) private static void HandleDuringSceneGui(SceneView sceneView)
{ {
if (Event.current.modifiers != EventModifiers.Control) return; 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); Vector3 gridPosition = CalculateGridPosition(Event.current.mousePosition);
int gridId = SceneGrid.CalculateGridPosition(gridPosition, 10); int gridId = SceneGrid.CalculateGridPosition(gridPosition, cellSize);
int x = Mathf.FloorToInt(gridPosition.x / cellSize); { // Draw Cells.
int z = Mathf.FloorToInt(gridPosition.z / cellSize); foreach (int id in scenePartitionSO.Data.SceneGrid.Grid.Keys)
{
(int x, int y) = SceneGrid.IntToIntPair(id);
Vector3 cellOrign = new Vector3(x * cellSize, 0, z * cellSize); Vector3 cellOrign = new Vector3(x * cellSize, 0, y * cellSize);
Vector3[] lines = new Vector3[] { Vector3[] lines = new Vector3[] {
new Vector3(0, 0, 0) + cellOrign, new Vector3(0, 0, cellSize) + cellOrign, // Left Bottom -> Left Top 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(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, 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 new Vector3(0, 0, cellSize) + cellOrign, new Vector3(cellSize, 0, cellSize) + cellOrign, // Left Top -> Right Top
}; };
Handles.DrawDottedLines(lines, 10.0f); Handles.DrawLines(lines);
Handles.Label(cellOrign + new Vector3(cellSize * 0.5f, 0, cellSize * 0.5f), new GUIContent($"{gridId}")); }
}
if (!scenePartitionSO.Data.SceneGrid.Grid.ContainsKey(gridId)) return;
{ // Draw Selection.
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
};
Color c = Handles.color;
Handles.color = Color.yellow;
Handles.DrawLines(lines);
Handles.color = c;
}
// Context menu to load.
if (Event.current.button == 1 && Event.current.type == EventType.MouseDown) if (Event.current.button == 1 && Event.current.type == EventType.MouseDown)
{ {
GenericMenu menu = new GenericMenu(); GenericMenu menu = new GenericMenu();
@ -62,10 +88,11 @@ private static Vector3 CalculateGridPosition(Vector2 mousePosition)
private static void Load(object gridId) private static void Load(object gridId)
{ {
if (scenePartitionSO == null) return;
if (gridId == null) return; if (gridId == null) return;
if (gridId is not int gridPos) return; if (gridId is not int cellId) return;
scenePartitionSO.LoadCell(cellId);
} }
} }
} }

View File

@ -57,5 +57,35 @@ private static void FindDeeplyLinkedObjectsRecursive(SortedList<ulong, ScenePart
} }
} }
} }
public static bool TryGetScenePartitionSOForActiveScene(out ScenePartitionSO scenePartitionSO)
{
scenePartitionSO = null;
UnityEngine.SceneManagement.Scene activeScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
if (activeScene == null) return false;
string filter = $"t:{nameof(ScenePartitionSO)}";
string[] assets = AssetDatabase.FindAssets(filter);
if (assets == null || assets.Length <= 0) return false;
for (int i = 0; i < assets.Length; i++)
{
string path = AssetDatabase.GUIDToAssetPath(assets[i]);
ScenePartitionSO scenePartition = AssetDatabase.LoadAssetAtPath<ScenePartitionSO>(path);
if (scenePartition == null) continue;
if (scenePartition.SceneName == activeScene.name)
{
scenePartitionSO = scenePartition;
return true;
}
}
return false;
}
} }
} }

View File

@ -6,7 +6,7 @@ namespace VertexColor.ScenePartition
public class SceneGrid public class SceneGrid
{ {
[SerializeField] [SerializeField]
private int cellSize = 10; public int cellSize = 10;
[SerializeField] [SerializeField]
private SceneGridDictionary grid = new SceneGridDictionary(); private SceneGridDictionary grid = new SceneGridDictionary();