Files
art_test_main/Assets/Plugins/Easy performant outline/Scripts/RTHandleUtility.cs

59 lines
2.0 KiB
C#
Raw Normal View History

2025-11-03 11:25:01 +08:00
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.Rendering;
namespace EPOOutline.Utility
{
public static class RTHandleUtility
{
private static MethodInfo setTextureInfo;
private static object[] parameter = new object[1];
#if !UNITY_6000_0_OR_NEWER
private static Dictionary<RTHandle, Action<RenderTargetIdentifier>> setTextureDelegates =
new Dictionary<RTHandle, Action<RenderTargetIdentifier>>();
internal static void RemoveDelegates(RTHandle handle)
{
setTextureDelegates.Remove(handle);
}
#endif
public static void SetTexture(this RTHandle handle, Texture texture)
{
if (setTextureInfo == null)
{
setTextureInfo = typeof(RTHandle).GetMethod("SetTexture",
BindingFlags.Default | BindingFlags.Instance | BindingFlags.NonPublic, null,
new Type[] { typeof(Texture) }, null);
}
parameter[0] = texture;
setTextureInfo.Invoke(handle, parameter);
}
public static void SetRenderTargetIdentifier(this RTHandle handle, RenderTargetIdentifier identifier)
{
#if UNITY_6000_0_OR_NEWER
RTHandleStaticHelpers.SetRTHandleUserManagedWrapper(ref handle, identifier);
#else
if (!setTextureDelegates.TryGetValue(handle, out Action<RenderTargetIdentifier> delegateToCall))
{
var function = typeof(RTHandle).GetMethod("SetTexture",
BindingFlags.Instance | BindingFlags.NonPublic,
null, CallingConventions.Standard, new Type[] { typeof(RenderTargetIdentifier) }, null);
delegateToCall =
(Action<RenderTargetIdentifier>)function.CreateDelegate(typeof(Action<RenderTargetIdentifier>),
handle);
setTextureDelegates.Add(handle, delegateToCall);
}
delegateToCall(identifier);
#endif
}
}
}