diff --git a/DisguiseUnityRenderStream/Editor/DisguiseRenderStreamBuild.cs b/DisguiseUnityRenderStream/Editor/DisguiseRenderStreamBuild.cs index 44ec1aa..e766572 100644 --- a/DisguiseUnityRenderStream/Editor/DisguiseRenderStreamBuild.cs +++ b/DisguiseUnityRenderStream/Editor/DisguiseRenderStreamBuild.cs @@ -143,7 +143,7 @@ public void OnPostprocessBuild(BuildReport report) }; Debug.Log($"Processing scene {scene.name} {indexMessage}"); - AddSceneToSchema(schema, sceneIndex, managedName); + AddSceneToSchema(schema, sceneIndex, managedName, settings.exposePresenter); } var pathToBuiltProject = report.summary.outputPath; @@ -154,8 +154,10 @@ public void OnPostprocessBuild(BuildReport report) } } - static void AddSceneToSchema(ManagedSchema schema, int sceneIndex, string name) + static void AddSceneToSchema(ManagedSchema schema, int sceneIndex, string name, bool exposePresenter) { + var isNewSceneSchema = schema.scenes[sceneIndex] == null; + var channels = new HashSet(schema.channels); channels.UnionWith(Camera.allCameras.Select(camera => camera.name)); schema.channels = channels.ToArray(); @@ -169,6 +171,11 @@ static void AddSceneToSchema(ManagedSchema schema, int sceneIndex, string name) var parameters = currentScene.parameters .Concat(Object.FindObjectsByType(FindObjectsSortMode.InstanceID) .SelectMany(p => p.exposedParameters())); + + if (exposePresenter && isNewSceneSchema) + { + parameters = DisguisePresenter.GetManagedRemoteParameters().Concat(parameters); + } currentScene.parameters = parameters.ToArray(); } diff --git a/DisguiseUnityRenderStream/Resources/DisguisePresenter.prefab b/DisguiseUnityRenderStream/Resources/DisguisePresenter.prefab new file mode 100644 index 0000000..856ec84 --- /dev/null +++ b/DisguiseUnityRenderStream/Resources/DisguisePresenter.prefab @@ -0,0 +1,190 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &360651681370543317 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 360651681370543319} + - component: {fileID: 360651681370543318} + m_Layer: 0 + m_Name: Output Presenter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &360651681370543319 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360651681370543317} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 360651681440703413} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &360651681370543318 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360651681370543317} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a76b687eeb2f3eb4ab0f3cdb0e21cb99, type: 3} + m_Name: + m_EditorClassIdentifier: + m_source: {fileID: 0} + m_sourceColorSpace: -1 + m_strategy: 5 + m_autoFlipY: 1 + m_clearScreen: 1 + m_mode: 0 +--- !u!1 &360651681440703410 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 360651681440703413} + - component: {fileID: 360651681440703412} + - component: {fileID: 360651681440703411} + m_Layer: 0 + m_Name: DisguisePresenter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &360651681440703413 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360651681440703410} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 360651681370543319} + - {fileID: 360651682882557475} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &360651681440703412 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360651681440703410} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2c135780edf6e674ca031a94a2e3b4ee, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Mode: 1 + m_Index: 0 + m_OutputResizeStrategy: 2 + m_InputResizeStrategy: 4 + m_OutputPresenter: {fileID: 360651681370543318} + m_InputPresenter: {fileID: 360651682882557474} +--- !u!114 &360651681440703411 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360651681440703410} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: af5276befa899474cb1ba07f3cd321ba, type: 3} + m_Name: + m_EditorClassIdentifier: + exposedObject: {fileID: 360651681440703412} + prefix: unity-screen-presenter + fields: + - exposed: 0 + fieldName: Script + groupName: + - exposed: 1 + fieldName: Mode + groupName: Local Screen Presenter + - exposed: 1 + fieldName: Index + groupName: Local Screen Presenter + - exposed: 0 + fieldName: Output Presenter + groupName: + - exposed: 0 + fieldName: Input Presenter + groupName: + - exposed: 1 + fieldName: Output Resize Strategy + groupName: Local Screen Presenter + - exposed: 1 + fieldName: Input Resize Strategy + groupName: Local Screen Presenter +--- !u!1 &360651682882557473 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 360651682882557475} + - component: {fileID: 360651682882557474} + m_Layer: 0 + m_Name: Input Presenter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &360651682882557475 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360651682882557473} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 360651681440703413} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &360651682882557474 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 360651682882557473} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e11750ce543afca48962fc383425bc33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_source: {fileID: 0} + m_sourceColorSpace: -1 + m_strategy: 6 + m_autoFlipY: 1 + m_clearScreen: 1 diff --git a/DisguiseUnityRenderStream/Runtime/DisguisePresenter.cs b/DisguiseUnityRenderStream/Runtime/DisguisePresenter.cs new file mode 100644 index 0000000..090aa88 --- /dev/null +++ b/DisguiseUnityRenderStream/Runtime/DisguisePresenter.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.Assertions; + +namespace Disguise.RenderStream +{ + class DisguisePresenter : MonoBehaviour + { + public enum PresenterMode + { + Off, + Output, + Input + } + + public enum PresenterResizeStrategies + { + ActualSize, + Stretch, + Fill, + Fit, + Clamp + } + + public PresenterMode Mode + { + get => m_Mode; + set => m_Mode = value; + } + + public int Index + { + get => m_Index; + set => m_Index = value; + } + + public PresenterResizeStrategies OutputResizeStrategy + { + get => m_OutputResizeStrategy; + set => m_OutputResizeStrategy = value; + } + + public PresenterResizeStrategies InputResizeStrategy + { + get => m_InputResizeStrategy; + set => m_InputResizeStrategy = value; + } + + public CameraCapturePresenter OutputPresenter + { + get => m_OutputPresenter; + set => m_OutputPresenter = value; + } + + public Presenter InputPresenter + { + get => m_InputPresenter; + set => m_InputPresenter = value; + } + + [SerializeField] + PresenterMode m_Mode = PresenterMode.Output; + + [SerializeField] + int m_Index; + + [SerializeField] + PresenterResizeStrategies m_OutputResizeStrategy = PresenterResizeStrategies.Fill; + + [SerializeField] + PresenterResizeStrategies m_InputResizeStrategy = PresenterResizeStrategies.Clamp; + + [SerializeField] + CameraCapturePresenter m_OutputPresenter; + + [SerializeField] + Presenter m_InputPresenter; + + CameraCapture[] m_Outputs = {}; + RenderTexture[] m_Inputs = {}; + + static BlitStrategy.Strategy PresenterStrategyToBlitStrategy(PresenterResizeStrategies strategy) => strategy switch + { + PresenterResizeStrategies.ActualSize => BlitStrategy.Strategy.NoResize, + PresenterResizeStrategies.Stretch => BlitStrategy.Strategy.Stretch, + PresenterResizeStrategies.Fill => BlitStrategy.Strategy.Fill, + PresenterResizeStrategies.Fit => BlitStrategy.Strategy.Letterbox, + PresenterResizeStrategies.Clamp => BlitStrategy.Strategy.Clamp, + _ => throw new ArgumentOutOfRangeException() + }; + + public static GameObject LoadPrefab() + { + return Resources.Load("DisguisePresenter"); + } + +#if UNITY_EDITOR + public static List GetManagedRemoteParameters() + { + var prefab = LoadPrefab(); + var parameters = prefab.GetComponent(); + var managedParameters = parameters.exposedParameters(); + + // Discard the name of the GameObject, keep only the field ex: + // "DisguisePresenter Mode" => "Mode" + foreach (var parameter in managedParameters) + { + parameter.displayName = parameter.displayName.Substring(parameter.displayName.IndexOf(" ") + 1); + } + + return managedParameters; + } +#endif + + void OnEnable() + { + DisguiseRenderStream.SceneLoaded += RefreshInput; + DisguiseRenderStream.StreamsChanged += RefreshOutput; + } + + void OnDisable() + { + DisguiseRenderStream.SceneLoaded -= RefreshInput; + DisguiseRenderStream.StreamsChanged -= RefreshOutput; + } + + void Update() + { + Assert.IsNotNull(m_OutputPresenter); + Assert.IsNotNull(m_InputPresenter); + + if (Mode == PresenterMode.Off) + { + m_OutputPresenter.enabled = m_InputPresenter.enabled = false; + return; + } + + m_OutputPresenter.enabled = Mode == PresenterMode.Output; + m_InputPresenter.enabled = Mode == PresenterMode.Input; + + m_OutputPresenter.strategy = PresenterStrategyToBlitStrategy(m_OutputResizeStrategy); + m_InputPresenter.strategy = PresenterStrategyToBlitStrategy(m_InputResizeStrategy); + + if (Mode == PresenterMode.Output) + AssignOutput(); + else if (Mode == PresenterMode.Input) + AssignInput(); + else + throw new ArgumentOutOfRangeException(); + } + + void RefreshOutput() + { + m_Outputs = FindObjectsByType( + FindObjectsSortMode.InstanceID).Select( + x => x.GetComponent()).ToArray(); + } + + void RefreshInput() + { + if (DisguiseRenderStream.Instance is { InputTextures: { } inputTextures }) + { + m_Inputs = inputTextures.ToArray(); + } + } + + void AssignOutput() + { + m_OutputPresenter.cameraCapture = ClampIndex(Index, m_Outputs, out var clampedIndex) + ? m_Outputs[clampedIndex] + : null; + } + + void AssignInput() + { + m_InputPresenter.source = ClampIndex(Index, m_Inputs, out var clampedIndex) + ? m_Inputs[clampedIndex] + : null; + } + + bool ClampIndex(int index, IList list, out int clampedIndex) + { + if (list.Count == 0) + { + clampedIndex = 0; + return false; + } + + clampedIndex = Mathf.Clamp(index, 0, list.Count - 1); + return true; + } + } +} diff --git a/DisguiseUnityRenderStream/Runtime/DisguiseRenderStream.cs b/DisguiseUnityRenderStream/Runtime/DisguiseRenderStream.cs index 9968b66..226cbd4 100644 --- a/DisguiseUnityRenderStream/Runtime/DisguiseRenderStream.cs +++ b/DisguiseUnityRenderStream/Runtime/DisguiseRenderStream.cs @@ -87,6 +87,11 @@ protected DisguiseRenderStream(ManagedSchema schema) void OnSceneLoaded(Scene loadedScene, LoadSceneMode mode) { + if (DisguiseRenderStreamSettings.GetOrCreateSettings().exposePresenter) + { + GameObject.Instantiate(DisguisePresenter.LoadPrefab()); + } + CreateStreams(); int sceneIndex = 0; DisguiseRenderStreamSettings settings = DisguiseRenderStreamSettings.GetOrCreateSettings(); @@ -164,6 +169,8 @@ void OnSceneLoaded(Scene loadedScene, LoadSceneMode mode) else fields.numerical.Add(field); } + + SceneLoaded?.Invoke(); } protected void CreateStreams() @@ -248,6 +255,8 @@ protected void CreateStreams() LatestFrameData = new FrameData(); Awaiting = false; + + StreamsChanged?.Invoke(); } protected void ProcessFrameData(in FrameData receivedFrameData) @@ -501,8 +510,27 @@ static Camera GetChannelCamera(string channel) } public static DisguiseRenderStream Instance { get; private set; } + + public static Action SceneLoaded { get; set; } = delegate { }; + + public static Action StreamsChanged { get; set; } = delegate { }; public StreamDescription[] Streams { get; private set; } = { }; + + public IEnumerable InputTextures + { + get + { + if (LatestFrameData.scene > m_SceneFields.Length) + return null; + + var images = m_SceneFields[LatestFrameData.scene].images; + if (images == null) + return null; + + return images.Select(x => x.GetValue() as RenderTexture); + } + } public bool Awaiting { get; private set; } diff --git a/DisguiseUnityRenderStream/Runtime/DisguiseRenderStreamSettings.cs b/DisguiseUnityRenderStream/Runtime/DisguiseRenderStreamSettings.cs index cd22b98..8ece07f 100644 --- a/DisguiseUnityRenderStream/Runtime/DisguiseRenderStreamSettings.cs +++ b/DisguiseUnityRenderStream/Runtime/DisguiseRenderStreamSettings.cs @@ -7,12 +7,26 @@ class DisguiseRenderStreamSettings : ScriptableObject { public enum SceneControl { + /// + /// Restricts the disguise software's control of scenes and instead merges all channels and remote parameters into a single scene. + /// Manual, + + /// + /// Allows scenes to be controlled from inside the disguise software; channels are merged into a single list (duplicates removed) and remote parameters are per-scene. + /// Selection } [SerializeField] - public SceneControl sceneControl; + public SceneControl sceneControl = SceneControl.Manual; + + /// + /// When true, the Unity window will be able to display streams or live textures to the local screen. + /// The generated schema will include remote parameters to select the texture to display and how to resize it to fit the screen. + /// + [SerializeField] + public bool exposePresenter = true; static DisguiseRenderStreamSettings s_CachedSettings; @@ -36,7 +50,6 @@ public static DisguiseRenderStreamSettings GetOrCreateSettings() { Debug.Log("Using default DisguiseRenderStreamSettings"); s_CachedSettings = ScriptableObject.CreateInstance(); - s_CachedSettings.sceneControl = SceneControl.Manual; #if UNITY_EDITOR if (!Directory.Exists("Assets/Resources")) Directory.CreateDirectory("Assets/Resources"); diff --git a/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/BlitStrategy.cs b/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/BlitStrategy.cs index b95b70f..cea0a25 100644 --- a/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/BlitStrategy.cs +++ b/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/BlitStrategy.cs @@ -92,7 +92,13 @@ public enum Strategy /// The source is scaled while conserving the aspect ratio to fill the destination. /// It can overflow but won't leave black bars on the sides. /// - Fill + Fill, + + /// + /// Behaves like if it fits inside the destination. + /// Otherwise behaves like . + /// + Clamp } /// @@ -115,6 +121,8 @@ public static ScaleBias DoStrategy(Strategy strategy, Vector2 srcSize, Vector2 d return Letterbox(srcSize, dstSize); case Strategy.Fill: return Fill(srcSize, dstSize); + case Strategy.Clamp: + return Clamp(srcSize, dstSize); default: throw new NotImplementedException(); } @@ -170,6 +178,14 @@ static ScaleBias Fill(Vector2 srcSize, Vector2 dstSize) else return FitHeight(srcSize, dstSize); } + + static ScaleBias Clamp(Vector2 srcSize, Vector2 dstSize) + { + if (srcSize.x > dstSize.x || srcSize.y > dstSize.y) + return Letterbox(srcSize, dstSize); + else + return NoResize(srcSize, dstSize); + } static float AspectRatio(Vector2 size) { diff --git a/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/CameraCapturePresenter.cs b/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/CameraCapturePresenter.cs index abd4fea..a52a10d 100644 --- a/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/CameraCapturePresenter.cs +++ b/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/CameraCapturePresenter.cs @@ -41,17 +41,37 @@ public enum Mode CameraCapture m_cameraCapture; + public CameraCapture cameraCapture + { + get => m_cameraCapture; + set + { + m_cameraCapture = value; + Assign(m_cameraCapture); + } + } + protected override void OnEnable() { base.OnEnable(); - m_cameraCapture = GetComponent(); + if (m_cameraCapture == null) + m_cameraCapture = GetComponent(); } - - protected override void Update() + + void Update() { - base.Update(); + Assign(m_cameraCapture); + } + void Assign(CameraCapture capture) + { + if (capture == null) + { + source = null; + return; + } + if (m_cameraCapture.description.m_autoFlipY && autoFlipY) { autoFlipY = false; @@ -70,12 +90,12 @@ protected override void Update() switch (m_mode) { case Mode.Color: - source = m_cameraCapture.cameraTexture; + source = capture.cameraTexture; break; case Mode.Depth: - Assert.IsTrue(m_cameraCapture.description.m_copyDepth); - source = m_cameraCapture.depthTexture; + Assert.IsTrue(capture.description.m_copyDepth); + source = capture.depthTexture; break; default: diff --git a/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/DepthCopy.cs b/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/DepthCopy.cs index b419f14..6b755e1 100644 --- a/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/DepthCopy.cs +++ b/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/DepthCopy.cs @@ -72,7 +72,7 @@ public void Execute(ScriptableRenderContext context, RenderTexture depthOutput, ValidatePipeline(); - CommandBuffer cmd = CommandBufferPool.Get(k_profilerTag); + var cmd = CommandBufferPool.Get(k_profilerTag); IssueCommands(cmd, depthOutput, mode); context.ExecuteCommandBuffer(cmd); diff --git a/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/Presenter.cs b/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/Presenter.cs index e7fac4e..617c2e8 100644 --- a/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/Presenter.cs +++ b/DisguiseUnityRenderStream/Runtime/PipelineAbstraction/Presenter.cs @@ -71,7 +71,7 @@ public enum SourceColorSpace bool m_autoFlipY = true; [SerializeField] - bool m_clearScreen; + bool m_clearScreen = true; Backend m_backEnd; @@ -99,7 +99,7 @@ public bool autoFlipY public RenderTexture source { get => m_source; - protected set => m_source = value; + set => m_source = value; } /// @@ -126,6 +126,15 @@ public bool clearScreen public Vector2 sourceSize => new Vector2(m_source.width, m_source.height); public Vector2 targetSize => new Vector2(Screen.width, Screen.height); + + Backend CreateBackend() + { +#if UNITY_EDITOR + return m_backEnd = new EditorBackend(this); +#else + return m_backEnd = new PlayerBackend(this); +#endif + } /// /// Can override to setup . @@ -136,25 +145,20 @@ protected virtual void OnEnable() Debug.LogWarning($"{nameof(Presenter)} only supports SDR output, but HDR Display Output is allowed in the Project Settings."); #endif -#if UNITY_EDITOR - m_backEnd = new EditorBackend(this); -#else - m_backEnd = new PlayerBackend(this); -#endif + RenderPipelineManager.beginContextRendering += OnBeginContextRendering; + + if (m_backEnd == null) + m_backEnd = CreateBackend(); m_backEnd.Enable(); } protected virtual void OnDisable() { + RenderPipelineManager.beginContextRendering -= OnBeginContextRendering; + m_backEnd.Disable(); } - - protected virtual void Update() - { - if (m_clearScreen) - ClearScreen(); - } /// /// Get the destination UV transformations to pass to the API. @@ -206,19 +210,39 @@ void IssueCommands(CommandBuffer cmd) BlitExtended.Instance.BlitQuad(cmd, m_source, GetColorSpaceConversion(), srcScaleBias, dstScaleBias); } - void ClearScreen() + void ClearScreen(ScriptableRenderContext context) { - CommandBuffer cmd = CommandBufferPool.Get(k_profilerClearTag); + var cmd = CommandBufferPool.Get(k_profilerClearTag); const RenderTexture mainDisplay = default; CoreUtils.SetRenderTarget(cmd, mainDisplay); cmd.ClearRenderTarget(true, true, Color.black); - Graphics.ExecuteCommandBuffer(cmd); + context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } + void OnBeginContextRendering(ScriptableRenderContext context, List cameras) + { + if (!IsValidContext(context, cameras)) + return; + + if (clearScreen) + ClearScreen(context); + } + + static bool IsValidContext(ScriptableRenderContext context, List cameras) + { + foreach (var cam in cameras) + { + if (cam.cameraType != CameraType.Game) + return false; + } + + return true; + } + abstract class Backend { protected readonly Presenter m_presenter; @@ -268,7 +292,7 @@ IEnumerator FrameLoop() if (!ShouldRun) continue; - CommandBuffer cmd = CommandBufferPool.Get(k_profilerTag); + var cmd = CommandBufferPool.Get(k_profilerTag); m_presenter.IssueCommands(cmd); Graphics.ExecuteCommandBuffer(cmd); @@ -299,16 +323,15 @@ public override void Disable() RenderPipelineManager.endContextRendering -= OnEndContextRendering; } - void OnEndContextRendering(ScriptableRenderContext context, List _) + void OnEndContextRendering(ScriptableRenderContext context, List cameras) { if (!ShouldRun) return; - // Check that we're in the correct context (ex not rendering probes) - if (RenderTexture.active != null) + if (!IsValidContext(context, cameras)) return; - CommandBuffer cmd = CommandBufferPool.Get(k_profilerTag); + var cmd = CommandBufferPool.Get(k_profilerTag); m_presenter.IssueCommands(cmd); context.ExecuteCommandBuffer(cmd);