65 lines
2.3 KiB
C#
65 lines
2.3 KiB
C#
#if UNITY_EDITOR
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
using UnityEditor;
|
|
|
|
namespace UnityEngine.Rendering
|
|
{
|
|
static partial class RenderPipelineGraphicsSettingsStripper
|
|
{
|
|
static class Fetcher
|
|
{
|
|
static readonly Type k_InterfaceType = typeof(IRenderPipelineGraphicsSettingsStripper<>);
|
|
|
|
public static Dictionary<Type, List<IStripper>> ComputeStrippersMap()
|
|
{
|
|
var validStrippers = new Dictionary<Type, List<IStripper>>();
|
|
|
|
foreach (var (stripperType, settingsType) in GetStrippersFromAssemblies())
|
|
{
|
|
var stripperInstance = Activator.CreateInstance(stripperType) as IStripper;
|
|
if (stripperInstance is not { active: true })
|
|
continue;
|
|
|
|
if (!validStrippers.TryGetValue(settingsType, out var instances))
|
|
{
|
|
instances = new List<IStripper>();
|
|
validStrippers[settingsType] = instances;
|
|
}
|
|
|
|
instances.Add(stripperInstance);
|
|
}
|
|
|
|
return validStrippers;
|
|
}
|
|
|
|
private static IEnumerable<(Type, Type)> GetStrippersFromAssemblies()
|
|
{
|
|
foreach (var stripperType in TypeCache.GetTypesDerivedFrom(typeof(IRenderPipelineGraphicsSettingsStripper<>)))
|
|
{
|
|
if (stripperType.IsAbstract)
|
|
continue;
|
|
|
|
// The ctor is private?
|
|
if (stripperType.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, Type.EmptyTypes,
|
|
null) == null)
|
|
{
|
|
Debug.LogWarning($"{stripperType} has no public constructor, it will not be used to strip {nameof(IRenderPipelineGraphicsSettings)}.");
|
|
continue;
|
|
}
|
|
|
|
foreach (var i in stripperType.GetInterfaces())
|
|
{
|
|
if (i.IsGenericType && i.GetGenericTypeDefinition() == k_InterfaceType)
|
|
{
|
|
yield return (stripperType, i.GetGenericArguments()[0]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|