Files
BABA_YAGA/Packages/app.rive.rive-unity/Runtime/Components/Public/RenderPipelines/URP/RenderPass.cs
2026-05-19 17:39:03 +07:00

121 lines
3.9 KiB
C#

#if RIVE_USING_URP
using UnityEngine;
using UnityEngine.Rendering;
#if UNITY_2023_1_OR_NEWER
using UnityEngine.Rendering.RenderGraphModule;
#endif
using UnityEngine.Rendering.Universal;
namespace Rive.Components.URP
{
internal class RenderPass : ScriptableRenderPass
{
private IRenderer m_riveRenderer;
private ProfilingSampler m_profilingSampler;
private const string m_bufferName = "Rive Render Pass";
internal RenderPass()
{
// Default constructor for object pooling
}
public RenderPass(Renderer riveRenderer, RenderPassEvent passEvent, string profilerMarkerName)
{
if (riveRenderer == null)
throw new System.ArgumentNullException(nameof(riveRenderer));
this.Init(riveRenderer, passEvent, profilerMarkerName);
}
internal void Init(IRenderer riveRenderer, RenderPassEvent passEvent, string profilerMarkerName)
{
m_riveRenderer = riveRenderer;
renderPassEvent = passEvent;
m_profilingSampler = new ProfilingSampler(profilerMarkerName);
}
#if UNITY_2023_1_OR_NEWER
private class PassData
{
internal Renderer riveRenderer;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
if (m_riveRenderer == null) return;
Renderer renderer = m_riveRenderer as Renderer;
if (renderer == null) return;
// Since we're not using most of the RenderGraph features, we can use AddUnsafePass instead of AddRasterRenderPass.
// In this mode, we're required to handle/set up graphics state, which we already do in c++.
// By using AddUnsafePass, we avoid the overhead of having to call SetRenderAttachment as required by AddRasterRenderPass.
// More info: https://docs.unity.cn/Packages/com.unity.render-pipelines.core@17.0/api/UnityEngine.Rendering.RenderGraphModule.RenderGraph.html#UnityEngine_Rendering_RenderGraphModule_RenderGraph_AddUnsafePass__1_System_String___0__
using (var builder = renderGraph.AddUnsafePass<PassData>("Rive Render Pass", out var passData))
{
passData.riveRenderer = renderer;
// Prevent render graph from culling this pass
builder.AllowPassCulling(false);
builder.SetRenderFunc((PassData data, UnsafeGraphContext context) =>
{
((Renderer)data.riveRenderer).AddToCommandBuffer(context.cmd);
});
}
}
#endif
// Unity 6.4 / URP 17.4 no longer exposes the compatibility Execute override on
// ScriptableRenderPass, so we only compile this path on older versions.
// On supported older versions, we keep it so that Rive rendering still works without RenderGraph when in Compatibility mode.
#if UNITY_2023_1_OR_NEWER && !UNITY_6000_4_OR_NEWER
[System.Obsolete]
#endif
#if !UNITY_6000_4_OR_NEWER
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
if (m_riveRenderer == null)
{
return;
}
CommandBuffer cmd = CommandBufferPool.Get(m_bufferName);
using (new ProfilingScope(cmd, m_profilingSampler))
{
m_riveRenderer.AddToCommandBuffer(cmd);
}
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
#endif
public IRenderer GetRenderer()
{
return m_riveRenderer;
}
public void UpdateRenderer(IRenderer renderer)
{
m_riveRenderer = renderer;
}
public void UpdateRenderPassEvent(RenderPassEvent passEvent)
{
renderPassEvent = passEvent;
}
}
}
#endif