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.
 
 
 
 

161 lines
5.0 KiB

using System;
using System.Collections;
using System.Collections.Generic;
namespace UnityEngine.Rendering.HighDefinition
{
[Serializable]
class CustomPostProcessVolumeComponentList : ISerializationCallbackReceiver
{
[SerializeField] private CustomPostProcessInjectionPoint m_InjectionPoint;
public CustomPostProcessInjectionPoint injectionPoint => m_InjectionPoint;
[SerializeField] private List<string> m_CustomPostProcessTypesAsString;
private List<Type> m_CustomPostProcessTypes;
public CustomPostProcessVolumeComponentList(CustomPostProcessInjectionPoint injectionPoint)
{
m_CustomPostProcessTypes = new();
m_CustomPostProcessTypesAsString = new();
m_InjectionPoint = injectionPoint;
}
public IEnumerator<Type> GetEnumerator()
{
if (m_CustomPostProcessTypes == null)
SyncCustomPostProcessTypes();
return m_CustomPostProcessTypes.GetEnumerator();
}
public int Count
{
get
{
if (m_CustomPostProcessTypes == null)
SyncCustomPostProcessTypes();
return m_CustomPostProcessTypes.Count;
}
}
public Type this[int index]
{
get
{
if (m_CustomPostProcessTypes == null)
SyncCustomPostProcessTypes();
return m_CustomPostProcessTypes[index];
}
set
{
if (m_CustomPostProcessTypes == null)
SyncCustomPostProcessTypes();
m_CustomPostProcessTypes[index] = value;
}
}
private void SyncCustomPostProcessTypes()
{
if (m_CustomPostProcessTypes == null)
m_CustomPostProcessTypes = new();
else
m_CustomPostProcessTypes.Clear();
for (int i = 0; i < m_CustomPostProcessTypesAsString.Count; ++i)
{
//UUM-60204: Script can have been deleted by user. We cannot assum the type can still exists.
Type type = null;
try { type = Type.GetType(m_CustomPostProcessTypesAsString[i]); }
catch(Exception) { }
if (type == null || !typeof(CustomPostProcessVolumeComponent).IsAssignableFrom(type))
{
m_CustomPostProcessTypesAsString.RemoveAt(i--);
continue;
}
m_CustomPostProcessTypes.Add(type);
}
}
public void OnAfterDeserialize()
{
SyncCustomPostProcessTypes();
}
public void OnBeforeSerialize()
{
}
public bool Contains(string typeString) => m_CustomPostProcessTypesAsString.Contains(typeString);
public bool Contains<T>() where T : CustomPostProcessVolumeComponent => m_CustomPostProcessTypesAsString.Contains(typeof(T).AssemblyQualifiedName);
public bool Add(string typeString)
{
if (string.IsNullOrEmpty(typeString))
throw new ArgumentNullException(nameof(typeString));
if (!Contains(typeString))
{
var type = Type.GetType(typeString);
if (typeof(CustomPostProcessVolumeComponent).IsAssignableFrom(type))
{
m_CustomPostProcessTypesAsString.Add(typeString);
SyncCustomPostProcessTypes();
return true;
}
}
return false;
}
public bool Add<T>() where T : CustomPostProcessVolumeComponent => Add(typeof(T).AssemblyQualifiedName);
public bool AddRange(List<string> typesString)
{
if (typesString == null)
throw new ArgumentNullException(nameof(typesString));
bool changed = false;
foreach (var typeString in typesString)
{
if (!Contains(typeString))
{
var type = Type.GetType(typeString);
if (typeof(CustomPostProcessVolumeComponent).IsAssignableFrom(type))
{
m_CustomPostProcessTypesAsString.Add(typeString);
changed = true;
}
}
}
if (changed)
SyncCustomPostProcessTypes();
return changed;
}
public bool Remove(string typeString)
{
if (string.IsNullOrEmpty(typeString))
throw new ArgumentNullException(nameof(typeString));
if (!Contains(typeString))
return false;
if (m_CustomPostProcessTypesAsString.Remove(typeString))
{
SyncCustomPostProcessTypes();
return true;
}
return false;
}
public bool Remove<T>() where T : CustomPostProcessVolumeComponent => Remove(typeof(T).AssemblyQualifiedName);
}
}