93 lines
3.0 KiB
C#
93 lines
3.0 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
|
|
{
|
|
[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);
|
|
}
|
|
}
|
|
}
|