using System; namespace UnityEngine.Rendering.Universal { /// /// Specifies the execution timing for a ScriptableRenderPass2D within the 2D renderer pipeline. /// This enum allows you to control when a custom render pass is injected relative to key stages /// of the 2D rendering process, such as normals, shadows, lights, sprites, and post-processing. /// public enum RenderPassEvent2D { /// /// Executes a ScriptableRenderPass2D before rendering any other passes in the pipeline. /// Camera matrices and stereo rendering are not set up at this point. /// Use this to draw to custom input textures used later in the pipeline, for example, LUT textures. /// BeforeRendering = 0, /// /// Executes a ScriptableRenderPass2D before rendering normals. /// You can target sorting layers when using this event. /// BeforeRenderingNormals = 100, /// /// Executes a ScriptableRenderPass2D after rendering normals. /// You can target sorting layers when using this event. /// AfterRenderingNormals = 200, /// /// Executes a ScriptableRenderPass2D before rendering shadows. /// You can target sorting layers when using this event. /// BeforeRenderingShadows = 300, /// /// Executes a ScriptableRenderPass2D after rendering shadows. /// You can target sorting layers when using this event. /// AfterRenderingShadows = 400, /// /// Executes a ScriptableRenderPass2D before rendering lights. /// You can target sorting layers when using this event. /// BeforeRenderingLights = 500, /// /// Executes a ScriptableRenderPass2D after rendering lights. /// You can target sorting layers when using this event. /// AfterRenderingLights = 600, /// /// Executes a ScriptableRenderPass2D before rendering sprites. /// You can target sorting layers when using this event. /// BeforeRenderingSprites = 700, /// /// Executes a ScriptableRenderPass2D after rendering sprites. /// You can target sorting layers when using this event. /// AfterRenderingSprites = 800, /// /// Executes a ScriptableRenderPass2D before rendering post-processing. /// BeforeRenderingPostProcessing = 900, /// /// Executes a ScriptableRenderPass2D after rendering post-processing. /// AfterRenderingPostProcessing = 1000, /// /// Executes a ScriptableRenderPass2D after all rendering is complete. /// AfterRendering = 1100, } internal static class RenderPassEvents2DEnumValues { // We cache the values in this array at construction time to avoid runtime allocations, which we would cause if we accessed valuesInternal directly. public static int[] values; #if UNITY_EDITOR [RuntimeInitializeOnLoadMethod()] static void ResetStaticsOnLoad() { } #endif static RenderPassEvents2DEnumValues() { Array valuesInternal = Enum.GetValues(typeof(RenderPassEvent2D)); values = new int[valuesInternal.Length]; int index = 0; foreach (int value in valuesInternal) { values[index] = value; index++; } } } /// /// ScriptableRenderPass2D implements a logical rendering pass with which you can extend the 2D renderer. /// public abstract class ScriptableRenderPass2D : ScriptableRenderPass { /// /// The event that occurs when the render pass executes with the 2d renderer. /// public RenderPassEvent2D renderPassEvent2D { get; set; } /// /// The sorting layer that the render pass executes on the 2d renderer. /// public int renderPassSortingLayerID { get; set; } static internal int GetRenderPassEventRange(RenderPassEvent2D renderPassEvent2D) { int numEvents = RenderPassEvents2DEnumValues.values.Length; int currentIndex = 0; // Find the index of the renderPassEvent in the values array. for (int i = 0; i < numEvents; ++i) { if (RenderPassEvents2DEnumValues.values[currentIndex] == (int)renderPassEvent2D) break; currentIndex++; } if (currentIndex >= numEvents) { Debug.LogError("GetRenderPassEventRange: invalid renderPassEvent2D value cannot be found in the RenderPassEvent2D enumeration"); return 0; } if (currentIndex + 1 >= numEvents) return 50; // If this was the enum's last event, add 50 as the range. int nextValue = RenderPassEvents2DEnumValues.values[currentIndex + 1]; return nextValue - (int)renderPassEvent2D; } static internal bool IsSortingLayerEvent(RenderPassEvent2D renderPassEvent) { return renderPassEvent >= RenderPassEvent2D.BeforeRenderingNormals && renderPassEvent <= RenderPassEvent2D.AfterRenderingSprites; } } static internal class ScriptableRenderPass2DExtension { static internal void GetInjectionPoint2D(this ScriptableRenderPass renderPass, out RenderPassEvent2D rpEvent, out int rpLayer) { ScriptableRenderPass2D renderPass2D = renderPass as ScriptableRenderPass2D; if (renderPass2D == null) { rpLayer = int.MinValue; if (renderPass.renderPassEvent <= RenderPassEvent.BeforeRenderingTransparents) rpEvent = RenderPassEvent2D.BeforeRendering; else if (renderPass.renderPassEvent <= RenderPassEvent.BeforeRenderingPostProcessing) rpEvent = RenderPassEvent2D.BeforeRenderingPostProcessing; else if (renderPass.renderPassEvent <= RenderPassEvent.AfterRenderingPostProcessing) rpEvent = RenderPassEvent2D.AfterRenderingPostProcessing; else rpEvent = RenderPassEvent2D.AfterRendering; } else { rpEvent = renderPass2D.renderPassEvent2D; rpLayer = renderPass2D.renderPassSortingLayerID; } } } }