revival/game/Assets/Scripts/Rendering/CameraRenderer.cs

158 lines
4.4 KiB
C#
Raw Permalink Normal View History

2021-04-26 00:44:43 +02:00
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEditor;
using UnityEngine;
using UnityEngine.Profiling;
using UnityEngine.Rendering;
public partial class CameraRenderer
{
private const string BUFFER_NAME = "Render Camera";
#if UNITY_EDITOR
private string SampleName { get; set; }
#else
const string SampleName = BUFFER_NAME;
#endif
private static ShaderTagId _unlitShaderTagId = new ShaderTagId("SRPDefaultUnlit");
private static ShaderTagId[] _legacyShaderTagIds =
{
new ShaderTagId("Always"),
new ShaderTagId("ForwardBase"),
new ShaderTagId("PrepassBase"),
new ShaderTagId("Vertex"),
new ShaderTagId("VertexLMRGBM"),
new ShaderTagId("VertexLM"),
};
private ScriptableRenderContext _context;
private Camera _camera;
private CullingResults _cullingResults;
private readonly CommandBuffer _buffer = new CommandBuffer()
{
name = BUFFER_NAME
};
public void Render(ScriptableRenderContext context, Camera camera)
{
_context = context;
_camera = camera;
PrepareBuffer();
PrepareForSceneWindow();
if (!Cull()) return;
Setup();
DrawVisibleGeometry();
DrawUnsupportedShaders();
DrawGizmos();
SubmitEvent();
}
partial void PrepareBuffer();
partial void PrepareForSceneWindow();
partial void DrawUnsupportedShaders();
partial void DrawGizmos();
private void DrawVisibleGeometry()
{
var sortingSettings = new SortingSettings(_camera)
{
criteria = SortingCriteria.CommonOpaque
};
var drawingSettings = new DrawingSettings(_unlitShaderTagId, sortingSettings);
var filteringSettings = new FilteringSettings(RenderQueueRange.opaque);
_context.DrawRenderers(_cullingResults, ref drawingSettings, ref filteringSettings);
_context.DrawSkybox(_camera);
sortingSettings.criteria = SortingCriteria.CommonTransparent;
drawingSettings.sortingSettings = sortingSettings;
filteringSettings.renderQueueRange = RenderQueueRange.transparent;
_context.DrawRenderers(_cullingResults, ref drawingSettings, ref filteringSettings);
}
private bool Cull()
{
if (_camera.TryGetCullingParameters(out var p))
{
_cullingResults = _context.Cull(ref p);
return true;
}
return false;
}
private void Setup()
{
_context.SetupCameraProperties(_camera);
CameraClearFlags flags = _camera.clearFlags;
_buffer.ClearRenderTarget(
flags <= CameraClearFlags.Depth,
flags == CameraClearFlags.Color,
flags == CameraClearFlags.Color ? _camera.backgroundColor.linear : Color.clear);
_buffer.BeginSample(SampleName);
ExecuteBuffer();
}
private void ExecuteBuffer()
{
_context.ExecuteCommandBuffer(_buffer);
_buffer.Clear();
}
private void SubmitEvent()
{
_buffer.EndSample(SampleName);
ExecuteBuffer();
_context.Submit();
}
}
#region Editor
#if UNITY_EDITOR
public partial class CameraRenderer
{
partial void DrawUnsupportedShaders()
{
var drawingSettings = new DrawingSettings(_legacyShaderTagIds[0], new SortingSettings(_camera));
var filteringSettings = FilteringSettings.defaultValue;
_context.DrawRenderers(_cullingResults, ref drawingSettings, ref filteringSettings);
for (int i = 1; i < _legacyShaderTagIds.Length; i++) {
drawingSettings.SetShaderPassName(i, _legacyShaderTagIds[i]);
}
}
partial void DrawGizmos()
{
if (Handles.ShouldRenderGizmos())
{
_context.DrawGizmos(_camera,GizmoSubset.PreImageEffects);
_context.DrawGizmos(_camera,GizmoSubset.PostImageEffects);
}
}
partial void PrepareBuffer()
{
Profiler.BeginSample("Editor Only");
_buffer.name = SampleName = _camera.name;
Profiler.EndSample();
}
partial void PrepareForSceneWindow()
{
if (_camera.cameraType == CameraType.SceneView)
{
ScriptableRenderContext.EmitWorldGeometryForSceneView(_camera);
}
}
}
#endif
#endregion