ThomagicRenderer/Runtime/Scripts/FrameRenderer.cs

96 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Scripting;
[assembly: AlwaysLinkAssembly]
namespace Assets.ThoMagic.Renderer
{
public class FrameRenderer
{
#if UNITY_EDITOR
[InitializeOnLoadMethod]
#endif
[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<Camera> 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);
}
}
}