168 lines
5.2 KiB
C#

//pipelinedefine
#define H_URP
using HTraceWSGI.Scripts.Data.Private;
using HTraceWSGI.Scripts.Globals;
using HTraceWSGI.Scripts.Passes.URP;
#if UNITY_EDITOR
using HTraceWSGI.Scripts.PipelinesConfigurator;
#endif
using UnityEngine;
using UnityEngine.Rendering.Universal;
namespace HTraceWSGI.Scripts.Infrastructure.URP
{
[DisallowMultipleRendererFeature(HNames.ASSET_NAME_FULL)]
[ExecuteAlways]
[HelpURL(HNames.HTRACE_WSGI_DOCUMENTATION_LINK)]
public class HTraceWSGIRendererFeature : ScriptableRendererFeature
{
private static HTraceWSGI _hTraceWSGI;
private PrePassURP _prePassURP;
private MotionVectorsPassURP _motionVectorsPass;
private GBufferPassURP _gBufferPass;
private LightClusterPassURP _lightClusterPass;
private DirectionalShadowmapPassURP _shadowmapPassUrp;
private VoxelizationPassURP _voxelizationPassUrp;
private SoftwareTracingPassURP _softwareTracingPassUrp;
private FinalPassURP _finalPassURP;
private bool _initialized = false;
public static void RegisterSettings(HTraceWSGI hTraceWsgi)
{
if (hTraceWsgi != null)
{
_hTraceWSGI = hTraceWsgi;
}
}
public static void UnregisterSettings(HTraceWSGI hTraceWsgi)
{
if (_hTraceWSGI == hTraceWsgi)
{
_hTraceWSGI = null;
}
}
/// <summary>
/// Initializes this feature's resources. This is called every time serialization happens.
/// </summary>
public override void Create()
{
name = HNames.ASSET_NAME_FULL;
Dispose();
// if (HResources.GeneralData == null) //after any serialization it will be null, cause HTrace OnEnable() works after
// return;
_prePassURP = new PrePassURP();
_prePassURP.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
_motionVectorsPass = new MotionVectorsPassURP();
_motionVectorsPass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
_gBufferPass = new GBufferPassURP();
_gBufferPass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
_lightClusterPass = new LightClusterPassURP();
_lightClusterPass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
_shadowmapPassUrp = new DirectionalShadowmapPassURP();
_shadowmapPassUrp.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
_voxelizationPassUrp = new VoxelizationPassURP();
_voxelizationPassUrp.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
_softwareTracingPassUrp = new SoftwareTracingPassURP();
_softwareTracingPassUrp.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
_finalPassURP = new FinalPassURP();
_finalPassURP.renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
#if UNITY_EDITOR
HPipelinesConfigurator.AlwaysIncludedShaders();
#endif
_initialized = true;
}
#if !UNITY_6000_4_OR_NEWER
/// <summary>
/// Called when render targets are allocated and ready to be used.
/// </summary>
/// <param name="renderer"></param>
/// <param name="renderingData"></param>
/// <!--https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@13.1/manual/upgrade-guide-2022-1.html-->
#if UNITY_6000_3_OR_NEWER
[System.Obsolete]
#endif
public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
{
if (_initialized == false)
return;
if (HRendererURP.RenderGraphEnabled == false)
{
_prePassURP.Initialize(renderer);
_motionVectorsPass.Initialize(renderer);
_gBufferPass.Initialize(renderer);
//_shadowmapPassUrp.Initialize(renderer);
_finalPassURP.Initialize(renderer);
}
}
#endif
/// <summary>
/// Injects one or multiple ScriptableRenderPass in the renderer.
/// </summary>
/// <param name="renderer"></param>
/// <param name="renderingData"></param>
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (renderingData.cameraData.cameraType == CameraType.Reflection || renderingData.cameraData.cameraType == CameraType.Preview)
return;
var isActive = _hTraceWSGI != null && _hTraceWSGI.enabled && _hTraceWSGI.gameObject.activeSelf;
if (!isActive)
return;
#if !UNITY_2022_1_OR_NEWER
_prePassURP.Initialize(renderer);
_mainPassURP.Initialize(renderer);
_finalPassURP.Initialize(renderer);
#endif
renderer.EnqueuePass(_prePassURP);
renderer.EnqueuePass(_motionVectorsPass);
renderer.EnqueuePass(_gBufferPass);
renderer.EnqueuePass(_lightClusterPass);
renderer.EnqueuePass(_voxelizationPassUrp);
renderer.EnqueuePass(_shadowmapPassUrp); // It must be after voxelization, because voxelization pass changes VoxelCamera TRS
renderer.EnqueuePass(_softwareTracingPassUrp);
renderer.EnqueuePass(_finalPassURP);
}
protected override void Dispose(bool disposing)
{
_prePassURP?.Dispose();
_motionVectorsPass?.Dispose();
_gBufferPass?.Dispose();
_lightClusterPass?.Dispose();
_shadowmapPassUrp?.Dispose();
_voxelizationPassUrp?.Dispose();
_softwareTracingPassUrp?.Dispose();
_finalPassURP?.Dispose();
_prePassURP = null;
_motionVectorsPass = null;
_gBufferPass = null;
_lightClusterPass = null;
_shadowmapPassUrp = null;
_voxelizationPassUrp = null;
_softwareTracingPassUrp = null;
_finalPassURP = null;
_initialized = false;
}
}
}