// %BANNER_BEGIN% // --------------------------------------------------------------------- // %COPYRIGHT_BEGIN% // Copyright (c) 2022-2023 Magic Leap, Inc. All Rights Reserved. // Use of this file is governed by the Magic Leap 2 Software License Agreement, located here: https://www.magicleap.com/software-license-agreement-ml2 // Terms and conditions applicable to third-party materials accompanying this distribution may also be found in the top-level NOTICE file appearing herein. // %COPYRIGHT_END% // --------------------------------------------------------------------- // %BANNER_END% using UnityEngine; using UnityEngine.Rendering.Universal; using UnityEngine.Rendering; using System; namespace MagicLeap { public class MLSpectatorPreview : IDisposable { #region Private classes private class PreviewRenderPass : ScriptableRenderPass { public RenderTexture preview { get; set; } = null; public PreviewRenderPass(RenderTexture preview) { this.preview = preview; } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { if (preview == null) return; var renderer = renderingData.cameraData.renderer; var colorTarget = renderer.cameraColorTargetHandle.rt; CommandBuffer cmd = CommandBufferPool.Get(); cmd.Blit(preview, colorTarget); context.ExecuteCommandBuffer(cmd); cmd.Clear(); CommandBufferPool.Release(cmd); } } #endregion #region Private variables private Camera mainCam = null; private UniversalAdditionalCameraData cameraData = null; private PreviewRenderPass previewPass = null; #endregion #region Constructor / Destructor public MLSpectatorPreview(RenderTexture preview) { mainCam = Camera.main; cameraData = mainCam.GetUniversalAdditionalCameraData(); previewPass = new PreviewRenderPass(preview); previewPass.renderPassEvent = RenderPassEvent.AfterRendering; RenderPipelineManager.beginCameraRendering += RenderPreview; } ~MLSpectatorPreview() { Dispose(); } #endregion #region Public methods public void SetPreview(RenderTexture preview) { previewPass.preview = preview; } public void Dispose() { if (previewPass == null) return; RenderPipelineManager.beginCameraRendering -= RenderPreview; previewPass.preview = null; previewPass = null; } #endregion #region Private methods private void RenderPreview(ScriptableRenderContext context, Camera camera) { if (previewPass == null || camera != mainCam) return; cameraData.scriptableRenderer.EnqueuePass(previewPass); } #endregion } }