ScenePartition/Editor/ScenePartitionUtils.cs
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

91 lines
3.2 KiB
C#

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace VertexColor.ScenePartition.Editor
{
public static class ScenePartitionUtils
{
public static string GetDataPath(ScenePartitionSO scenePartitionSO)
{
string dataPath = Path.Combine(Application.dataPath, GetRelativeFilePath(scenePartitionSO));
if (!Directory.Exists(dataPath))
{
Directory.CreateDirectory(dataPath);
}
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);
return scenePath;
}
public static SortedSet<ulong> FindDeeplyLinkedObjects(SortedList<ulong, ScenePartition> scenePartitions, ulong partitionId)
{
SortedSet<ulong> linkedObjects = new SortedSet<ulong>();
FindDeeplyLinkedObjectsRecursive(scenePartitions, partitionId, linkedObjects);
return linkedObjects;
}
private static void FindDeeplyLinkedObjectsRecursive(SortedList<ulong, ScenePartition> scenePartitions, ulong partitionId, SortedSet<ulong> linkedObjects)
{
if (linkedObjects.Contains(partitionId)) return;
if (!scenePartitions.TryGetValue(partitionId, out ScenePartition partition)) return;
linkedObjects.Add(partitionId);
foreach (ulong reference in partition.references)
{
FindDeeplyLinkedObjectsRecursive(scenePartitions, reference, linkedObjects);
if (scenePartitions.TryGetValue(reference, out ScenePartition referencedPartition))
{
foreach (ulong subReference in referencedPartition.references)
{
FindDeeplyLinkedObjectsRecursive(scenePartitions, subReference, linkedObjects);
}
}
}
}
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;
}
}
}