You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.1 KiB
104 lines
3.1 KiB
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
using UnityEngine;
|
|
|
|
using SysRegex = System.Text.RegularExpressions.Regex;
|
|
|
|
namespace UnityEditor.VFX
|
|
{
|
|
internal class VFXSystemNames
|
|
{
|
|
private static readonly string DefaultSystemName = "System";
|
|
private static readonly string IndexPattern = @" (\(([0-9])*\))$";
|
|
|
|
private readonly Dictionary<VFXData, string> m_SystemNamesCache = new();
|
|
|
|
public static string GetSystemName(VFXModel model)
|
|
{
|
|
switch (model)
|
|
{
|
|
case VFXDataSpawner data:
|
|
return data.owners.First().label;
|
|
case VFXData data:
|
|
return data.title;
|
|
case VFXContext { contextType: VFXContextType.Spawner } context:
|
|
return context.label;
|
|
case VFXContext context when context.GetData() is {} data:
|
|
return data.title;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static void SetSystemName(VFXModel model, string name)
|
|
{
|
|
switch (model)
|
|
{
|
|
case VFXData data:
|
|
data.title = name;
|
|
break;
|
|
case VFXContext { contextType: VFXContextType.Spawner } context:
|
|
context.label = name;
|
|
break;
|
|
case VFXContext context when context.GetData() is {} data:
|
|
data.title = name;
|
|
break;
|
|
}
|
|
}
|
|
|
|
public string GetUniqueSystemName(VFXData system)
|
|
{
|
|
if (m_SystemNamesCache.TryGetValue(system, out var systemName))
|
|
{
|
|
return systemName;
|
|
}
|
|
|
|
return GenerateUniqueName(system);
|
|
}
|
|
|
|
public void Sync(VFXGraph graph)
|
|
{
|
|
var models = new HashSet<ScriptableObject>();
|
|
graph.CollectDependencies(models, false);
|
|
|
|
var systems = models
|
|
.OfType<VFXContext>()
|
|
.Select(x => x.GetData())
|
|
.Distinct()
|
|
.Where(x => x != null);
|
|
|
|
m_SystemNamesCache.Clear();
|
|
foreach (var system in systems)
|
|
{
|
|
GenerateUniqueName(system);
|
|
}
|
|
}
|
|
|
|
private static string GetSystemUnindexedName(string name)
|
|
{
|
|
return string.IsNullOrEmpty(name)
|
|
? name
|
|
: SysRegex.Replace(name, IndexPattern, ""); // Remove any number in the system name
|
|
}
|
|
|
|
private string GenerateUniqueName(VFXData system)
|
|
{
|
|
var wishedName = GetSystemUnindexedName(GetSystemName(system));
|
|
if (string.IsNullOrEmpty(wishedName))
|
|
{
|
|
wishedName = DefaultSystemName;
|
|
}
|
|
|
|
var index = 1;
|
|
var systemName = wishedName;
|
|
while (m_SystemNamesCache.Values.Contains(systemName))
|
|
{
|
|
systemName = $"{wishedName} ({index++})";
|
|
}
|
|
|
|
m_SystemNamesCache[system] = systemName;
|
|
return systemName;
|
|
}
|
|
}
|
|
}
|