using System; using System.Collections.Generic; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; using UnityEngine.Rendering; namespace Assets.ThoMagic.Renderer { public class FrameRenderer { [RuntimeInitializeOnLoadMethod] public static void Initialize() { #if UNITY_EDITOR AssemblyReloadEvents.beforeAssemblyReload += AssemblyReloadEvents_beforeAssemblyReload; #endif RendererPool.RemoveDestroyedCameras(); RendererPool.Initialize(); Camera.onPreCull -= RenderCamera; Camera.onPreCull += RenderCamera; RenderPipelineManager.beginContextRendering -= OnBeginContextRendering; RenderPipelineManager.beginContextRendering += OnBeginContextRendering; } private static void AssemblyReloadEvents_beforeAssemblyReload() { RendererPool.Destroy(); } private static void OnBeginContextRendering( ScriptableRenderContext context, List cameras) { RendererPool.BuildBuffers(); RendererPool.RemoveDestroyedCameras(); foreach(var camera in cameras) { if (!CameraIsSupported(camera)) { RendererPool.RemoveCamera(camera.GetHashCode()); } else { CameraRenderer cameraRenderer = RendererPool.GetCamera(RendererPool.RegisterCamera(camera)); try { cameraRenderer.Render(); } catch (Exception ex) { Debug.LogException(ex); } } } } private static void RenderCamera(Camera camera) { if (camera == null) throw new NullReferenceException(nameof(camera)); if (!CameraIsSupported(camera)) { RendererPool.RemoveCamera(camera.GetHashCode()); } else { RendererPool.BuildBuffers(); RendererPool.RemoveDestroyedCameras(); int cameraId = RendererPool.RegisterCamera(camera); try { RendererPool.GetCamera(cameraId)?.Render(); } catch (Exception ex) { Debug.LogException(ex); } } } private static bool CameraIsSupported(Camera camera) { IInstanceRenderSettings instanceRenderSettings; return (Application.isPlaying || camera.cameraType != CameraType.Preview) && (!camera.TryGetComponent(out instanceRenderSettings) || instanceRenderSettings.Settings.Supported); } } }