168 lines
5.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|