using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; namespace EscapeRoomEngine.Portal.Runtime { public class RenderPortals : ScriptableRendererFeature { private class PortalRenderPass : ScriptableRenderPass { private RenderStateBlock _renderStateBlock; private readonly Settings _settings; public PortalRenderPass(Settings settings) { _settings = settings; renderPassEvent = RenderPassEvent.AfterRenderingOpaques; _renderStateBlock = new RenderStateBlock(RenderStateMask.Nothing); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { var sortingCriteria = renderingData.cameraData.defaultOpaqueSortFlags; var drawingSettings = CreateDrawingSettings( new List { new("SRPDefaultUnlit"), new("UniversalForward"), new("UniversalForwardOnly") }, ref renderingData, sortingCriteria); // set stencil to portal var filteringSettings = new FilteringSettings(RenderQueueRange.opaque, _settings.layer); drawingSettings.overrideMaterial = _settings.material; context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref filteringSettings, ref _renderStateBlock); } } private PortalRenderPass _portalPass; [Serializable] public class Settings { public LayerMask layer; public Material material; } public Settings settings = new(); public override void Create() { _portalPass = new PortalRenderPass(settings); } // Here you can inject one or multiple render passes in the renderer. // This method is called when setting up the renderer once per-camera. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { renderer.EnqueuePass(_portalPass); } } }