//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; } } /// /// Initializes this feature's resources. This is called every time serialization happens. /// 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 /// /// Called when render targets are allocated and ready to be used. /// /// /// /// #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 /// /// Injects one or multiple ScriptableRenderPass in the renderer. /// /// /// 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; } } }