From 80c90d884a9a4ea2a43e3ba665daacd412d3955c Mon Sep 17 00:00:00 2001 From: max Date: Mon, 3 Jul 2023 23:35:29 +0200 Subject: [PATCH] ulong and grid list wrapper test - wrapped lists in serialized dicts do work, maybe wrap anything. - note: maybe convert long fields to string fields to support ulong? --- Editor/ScenePartitionEditorWindow.cs | 14 +++++----- Editor/ScenePartitionSO.cs | 40 ++++++++++++++-------------- Editor/ScenePartitionSOEditor.cs | 12 ++++----- Editor/ScenePartitionUtils.cs | 17 +++++++----- Runtime/SceneGrid.cs | 26 ++++++++++++++---- Runtime/ScenePartition.cs | 10 +++---- Runtime/SerializedStructures.cs | 12 ++++++--- 7 files changed, 79 insertions(+), 52 deletions(-) diff --git a/Editor/ScenePartitionEditorWindow.cs b/Editor/ScenePartitionEditorWindow.cs index 632e020..4f28860 100644 --- a/Editor/ScenePartitionEditorWindow.cs +++ b/Editor/ScenePartitionEditorWindow.cs @@ -47,9 +47,9 @@ private void DrawSceneDataCache() { EditorGUILayout.LabelField($"scenePartitions"); - foreach (KeyValuePair scenePartition in sceneData.Value.ScenePartitions) + foreach (KeyValuePair scenePartition in sceneData.Value.ScenePartitions) { - EditorGUILayout.LongField(scenePartition.Key); + EditorGUILayout.LongField((long)scenePartition.Key); } } @@ -59,9 +59,9 @@ private void DrawSceneDataCache() { EditorGUILayout.LabelField($"loadedScenePartitions"); - foreach (KeyValuePair scenePartition in sceneData.Value.LoadedScenePartitions) + foreach (KeyValuePair scenePartition in sceneData.Value.LoadedScenePartitions) { - EditorGUILayout.LongField(scenePartition.Value.id); + EditorGUILayout.LongField((long)scenePartition.Value.id); } } @@ -69,15 +69,15 @@ private void DrawSceneDataCache() { EditorGUILayout.LabelField($"generatedSceneGrid"); - foreach (KeyValuePair> item in sceneData.Value.SceneGrid.Grid) + foreach (KeyValuePair item in sceneData.Value.SceneGrid.Grid) { EditorGUILayout.IntField("gridId", item.Key); EditorGUI.indentLevel++; - foreach (long id in item.Value) + foreach (ulong id in item.Value.list) { - EditorGUILayout.LongField(id); + EditorGUILayout.LongField((long)id); } EditorGUI.indentLevel--; diff --git a/Editor/ScenePartitionSO.cs b/Editor/ScenePartitionSO.cs index 9881983..2a9626f 100644 --- a/Editor/ScenePartitionSO.cs +++ b/Editor/ScenePartitionSO.cs @@ -15,7 +15,7 @@ public class ScenePartitionSO : ScriptableObject public SceneAsset SceneAsset { get; private set; } = null; public string SceneName => SceneAsset == null ? name : SceneAsset.name; - public List alwaysLoadIds = new List { 0, 1, 2, 3, 4 }; + public List alwaysLoadIds = new List { 0, 1, 2, 3, 4 }; public ScenePartitionData Data { @@ -53,7 +53,7 @@ public void CreateScene() public void LoadAll() { CreateScenePartitions(); - SortedSet ids = new SortedSet(Data.ScenePartitions.Keys); + SortedSet ids = new SortedSet(Data.ScenePartitions.Keys); LoadScenePartitions(ids); } @@ -63,7 +63,7 @@ public void LoadAll() public void Reload() { if (!Data.HasLoadedPartitions) return; - LoadScenePartitions(new SortedSet(Data.LoadedScenePartitions.Keys)); + LoadScenePartitions(new SortedSet(Data.LoadedScenePartitions.Keys)); } private void CreateScenePartitions() @@ -80,7 +80,7 @@ private void CreateScenePartitions() } } - private void LoadScenePartitions(SortedSet partitionIds) + private void LoadScenePartitions(SortedSet partitionIds) { if (!Data.HasCreatedPartitions) return; @@ -91,14 +91,14 @@ private void LoadScenePartitions(SortedSet partitionIds) Data.LoadedScenePartitions.Clear(); // Add always load ids. - SortedSet baseIds = GetAlwaysLoadIds(); + SortedSet baseIds = GetAlwaysLoadIds(); foreach (var id in baseIds) { partitionIds.Add(id); } // Create scene data. - foreach (long id in partitionIds) + foreach (ulong id in partitionIds) { ScenePartition p = Data.ScenePartitions[id]; sceneData.AddRange(File.ReadAllLines(p.filePath)); @@ -178,7 +178,7 @@ private void DeleteLoadedPartitions() { if (!Data.HasLoadedPartitions) return; - foreach (KeyValuePair scenePartition in Data.LoadedScenePartitions) + foreach (KeyValuePair scenePartition in Data.LoadedScenePartitions) { if (!File.Exists(scenePartition.Value.filePath)) continue; @@ -186,14 +186,14 @@ private void DeleteLoadedPartitions() } } - public void LoadPartitions(long[] ids) + public void LoadPartitions(ulong[] ids) { - SortedSet partitionIds = new SortedSet(); + SortedSet partitionIds = new SortedSet(); for (int i = 0; i < ids.Length; i++) { - SortedSet connections = ScenePartitionUtils.FindDeeplyLinkedObjects(Data.ScenePartitions, ids[i]); - foreach (long c in connections) + SortedSet connections = ScenePartitionUtils.FindDeeplyLinkedObjects(Data.ScenePartitions, ids[i]); + foreach (ulong c in connections) { partitionIds.Add(c); } @@ -202,14 +202,14 @@ public void LoadPartitions(long[] ids) LoadScenePartitions(partitionIds); } - private SortedSet GetAlwaysLoadIds() + private SortedSet GetAlwaysLoadIds() { - SortedSet partitionIds = new SortedSet(); + SortedSet partitionIds = new SortedSet(); - foreach (long id in alwaysLoadIds) + foreach (ulong id in alwaysLoadIds) { - SortedSet connections = ScenePartitionUtils.FindDeeplyLinkedObjects(Data.ScenePartitions, id); - foreach (long c in connections) + SortedSet connections = ScenePartitionUtils.FindDeeplyLinkedObjects(Data.ScenePartitions, id); + foreach (ulong c in connections) { partitionIds.Add(c); } @@ -281,11 +281,11 @@ public void GenerateSceneGridData() if (ids[i].targetPrefabId == 0) // 0 = no prefab. { - Data.SceneGrid.Insert((long)ids[i].targetObjectId, rootGameObjects[i].transform.position); + Data.SceneGrid.Insert(ids[i].targetObjectId, rootGameObjects[i].transform.position); } else { - Data.SceneGrid.Insert((long)ids[i].targetPrefabId, rootGameObjects[i].transform.position); + Data.SceneGrid.Insert(ids[i].targetPrefabId, rootGameObjects[i].transform.position); } } @@ -294,9 +294,9 @@ public void GenerateSceneGridData() public void LoadCell(int gridId) { - if (Data.SceneGrid.Grid.TryGetValue(gridId, out List ids)) + if (Data.SceneGrid.Grid.TryGetValue(gridId, out GridList ids)) { - LoadPartitions(ids.ToArray()); + LoadPartitions(ids.list.ToArray()); } } diff --git a/Editor/ScenePartitionSOEditor.cs b/Editor/ScenePartitionSOEditor.cs index b69446a..8b369e0 100644 --- a/Editor/ScenePartitionSOEditor.cs +++ b/Editor/ScenePartitionSOEditor.cs @@ -7,7 +7,7 @@ namespace VertexColor.ScenePartition.Editor [CustomEditor(typeof(ScenePartitionSO))] public class ScenePartitionSOEditor : UnityEditor.Editor { - private long id = 0; + private ulong id = 0; private int gridId = 0; public override void OnInspectorGUI() @@ -60,11 +60,11 @@ public override void OnInspectorGUI() EditorGUILayout.Space(); - id = EditorGUILayout.LongField("id", id); + id = (ulong)EditorGUILayout.LongField("id", (long)id); if (GUILayout.Button("Load Section")) { - scenePartitionSO.LoadPartitions(new long[1] { (long)id }); + scenePartitionSO.LoadPartitions(new ulong[1] { id }); } if (GUILayout.Button("GenerateSceneGrid")) @@ -83,15 +83,15 @@ public override void OnInspectorGUI() { EditorGUILayout.LabelField($"generatedSceneGrid"); - foreach (KeyValuePair> item in scenePartitionSO.Data.SceneGrid.Grid) + foreach (KeyValuePair item in scenePartitionSO.Data.SceneGrid.Grid) { EditorGUILayout.LongField("gridId", item.Key); EditorGUI.indentLevel++; - foreach (long id in item.Value) + foreach (ulong id in item.Value.list) { - EditorGUILayout.LongField(id); + EditorGUILayout.LongField((long)id); } EditorGUI.indentLevel--; diff --git a/Editor/ScenePartitionUtils.cs b/Editor/ScenePartitionUtils.cs index 56b6cfe..e075c76 100644 --- a/Editor/ScenePartitionUtils.cs +++ b/Editor/ScenePartitionUtils.cs @@ -9,7 +9,7 @@ public static class ScenePartitionUtils { public static string GetDataPath(ScenePartitionSO scenePartitionSO) { - string dataPath = Path.Combine(Application.dataPath, $"../Data/Scenes/{scenePartitionSO.name}"); + string dataPath = Path.Combine(Application.dataPath, GetRelativeFilePath(scenePartitionSO)); if (!Directory.Exists(dataPath)) { @@ -19,6 +19,11 @@ public static string GetDataPath(ScenePartitionSO scenePartitionSO) return dataPath; } + public static string GetRelativeFilePath(ScenePartitionSO scenePartitionSO) + { + return $"../Data/ScenePartition/{scenePartitionSO.name}"; + } + public static string GetScenePath(ScenePartitionSO scenePartitionSO) { string scenePath = AssetDatabase.GetAssetOrScenePath(scenePartitionSO.SceneAsset); @@ -26,26 +31,26 @@ public static string GetScenePath(ScenePartitionSO scenePartitionSO) return scenePath; } - public static SortedSet FindDeeplyLinkedObjects(SortedList scenePartitions, long partitionId) + public static SortedSet FindDeeplyLinkedObjects(SortedList scenePartitions, ulong partitionId) { - SortedSet linkedObjects = new SortedSet(); + SortedSet linkedObjects = new SortedSet(); FindDeeplyLinkedObjectsRecursive(scenePartitions, partitionId, linkedObjects); return linkedObjects; } - private static void FindDeeplyLinkedObjectsRecursive(SortedList scenePartitions, long partitionId, SortedSet linkedObjects) + private static void FindDeeplyLinkedObjectsRecursive(SortedList scenePartitions, ulong partitionId, SortedSet linkedObjects) { if (linkedObjects.Contains(partitionId)) return; if (!scenePartitions.TryGetValue(partitionId, out ScenePartition partition)) return; linkedObjects.Add(partitionId); - foreach (long reference in partition.references) + foreach (ulong reference in partition.references) { FindDeeplyLinkedObjectsRecursive(scenePartitions, reference, linkedObjects); if (scenePartitions.TryGetValue(reference, out ScenePartition referencedPartition)) { - foreach (long subReference in referencedPartition.references) + foreach (ulong subReference in referencedPartition.references) { FindDeeplyLinkedObjectsRecursive(scenePartitions, subReference, linkedObjects); } diff --git a/Runtime/SceneGrid.cs b/Runtime/SceneGrid.cs index fa6fe51..9393646 100644 --- a/Runtime/SceneGrid.cs +++ b/Runtime/SceneGrid.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using UnityEngine; namespace VertexColor.ScenePartition @@ -14,16 +13,18 @@ public class SceneGrid public SceneGridDictionary Grid => grid; - public void Insert(long scenePartitionId, Vector3 point) + public void Insert(ulong scenePartitionId, Vector3 point) { int gridId = CalculateGridPosition(point, cellSize); - if (grid.TryGetValue(gridId, out List ids)) + if (grid.TryGetValue(gridId, out GridList ids)) { - ids.Add(scenePartitionId); + ids.list.Add(scenePartitionId); } else { - grid.Add(gridId, new List { scenePartitionId }); + var l = new GridList(); + l.list.Add(scenePartitionId); + grid.Add(gridId, l); } } @@ -64,5 +65,20 @@ public static (long, long) LongToLongPair(long value) return (x, y); } + + public static ulong ULongPairToULong(ulong x, ulong y) + { + // Combine x and y components into a single ulong + return (x << 32) | (uint)y; + } + + public static (ulong, ulong) ULongToULongPair(ulong value) + { + // Extract x and y components from the combined ulong + ulong x = value >> 32; + ulong y = (uint)value; + + return (x, y); + } } } diff --git a/Runtime/ScenePartition.cs b/Runtime/ScenePartition.cs index e2ec904..4c6f3d8 100644 --- a/Runtime/ScenePartition.cs +++ b/Runtime/ScenePartition.cs @@ -24,9 +24,9 @@ public int Compare(ScenePartition x, ScenePartition y) [System.Serializable] public class ScenePartition { - public long id = 0; - //public long classId = 0; - public string filePath = null; + public ulong id = 0; + //public ulong classId = 0; + public string filePath = null; // TODO: Only store relative path. //public string[] data = null; public LongSortedSet references = new LongSortedSet(); @@ -45,7 +45,7 @@ public ScenePartition(string filePath) Match match = Regex.Match(data[0], pattern); if (!match.Success) return; - if (!long.TryParse(match.Groups[1].Value, out id)) return; + if (!ulong.TryParse(match.Groups[1].Value, out id)) return; } //{ // Get class id. @@ -68,7 +68,7 @@ public ScenePartition(string filePath) if (!match.Success) continue; - if (long.TryParse(match.Groups[1].Value, out long fileNumber)) + if (ulong.TryParse(match.Groups[1].Value, out ulong fileNumber)) { if (fileNumber == 0) continue; // 0 == nothing. diff --git a/Runtime/SerializedStructures.cs b/Runtime/SerializedStructures.cs index 8780138..8397377 100644 --- a/Runtime/SerializedStructures.cs +++ b/Runtime/SerializedStructures.cs @@ -3,11 +3,17 @@ namespace VertexColor.ScenePartition { [System.Serializable] - public class ScenePartitionSortedList : SerializableSortedList { } + public class ScenePartitionSortedList : SerializableSortedList { } [System.Serializable] - public class LongSortedSet : SerializableSortedSet { } + public class LongSortedSet : SerializableSortedSet { } [System.Serializable] - public class SceneGridDictionary : SerializableDictionary> { } + public class SceneGridDictionary : SerializableDictionary { } + + [System.Serializable] + public class GridList + { + public List list = new List(); + } } \ No newline at end of file