//pipelinedefine #define H_URP using System; using HTraceSSGI.Scripts.Data.Private; using HTraceSSGI.Scripts.Data.Public; using HTraceSSGI.Scripts.Globals; using UnityEngine; using UnityEngine.Rendering; #if UNITY_EDITOR using UnityEditor; #endif namespace HTraceSSGI.Scripts.Infrastructure.URP { [ExecuteAlways] public class HAmbientOverrideVolume: MonoBehaviour { private Volume _volumeComponent; #if UNITY_6000_0_OR_NEWER private ProbeVolumesOptions _probeVolumesOptionsOverrideComponent; #endif private static HAmbientOverrideVolume s_instance; public static HAmbientOverrideVolume Instance { get { if (s_instance == null) { s_instance = FindObjectOfType(); if (s_instance == null) { GameObject singletonObject = new GameObject($"HTrace AmbientOverride"); s_instance = singletonObject.AddComponent(); if (Application.isPlaying) DontDestroyOnLoad(singletonObject); } } return s_instance; } } public void SetActiveVolume(bool isActive) { _volumeComponent.enabled = isActive; #if UNITY_6000_0_OR_NEWER _probeVolumesOptionsOverrideComponent.active = isActive; #endif } private void Awake() { InitializeSingleton(); SetupVolumeURP(); } private void InitializeSingleton() { if (s_instance == null) { s_instance = this; if (Application.isPlaying) DontDestroyOnLoad(gameObject); } else if (s_instance != this) { if (Application.isPlaying) Destroy(gameObject); else DestroyImmediate(gameObject); } } #if UNITY_EDITOR private void OnValidate() { HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; if (!EditorApplication.isPlayingOrWillChangePlaymode) SetupVolumeURP(); gameObject.hideFlags = HideFlags.HideAndDontSave; if (s_instance != null && profile != null && profile.DebugSettings != null) s_instance.gameObject.hideFlags = profile.DebugSettings.ShowBowels ? HideFlags.None : HideFlags.HideAndDontSave; } #endif private void OnDestroy() { if (s_instance == this) { s_instance = null; } } private void SetupVolumeURP() { #if UNITY_6000_0_OR_NEWER CreateSSGIOverrideComponent(); ApplySSGIOverrideComponentSettings(); ChangeObjectWithSerialization_ONLYEDITOR(); #endif } #if UNITY_6000_0_OR_NEWER private void CreateSSGIOverrideComponent() { HTraceSSGIProfile profile = HTraceSSGISettings.ActiveProfile; if (profile != null && profile != null && profile.DebugSettings != null) gameObject.hideFlags = profile.DebugSettings.ShowBowels ? HideFlags.None : HideFlags.HideAndDontSave; _volumeComponent = gameObject.GetComponent(); if (_volumeComponent == null) { _volumeComponent = gameObject.AddComponent(); _volumeComponent.enabled = false; } if (_volumeComponent.sharedProfile == null) { //We can't crate it in runtime, because after build it will break. //it will call only in editor, but if someone changes it in runtime, we will override. _volumeComponent.sharedProfile = Resources.Load($"{HNames.ASSET_NAME}/HTraceSSGI Volume Profile URP"); } if (_probeVolumesOptionsOverrideComponent == null) _volumeComponent.sharedProfile.TryGet(out _probeVolumesOptionsOverrideComponent); } private void ApplySSGIOverrideComponentSettings() { _volumeComponent.weight = 1; _volumeComponent.priority = 100; #if UNITY_EDITOR _volumeComponent.runInEditMode = true; #endif if (_probeVolumesOptionsOverrideComponent != null) { _probeVolumesOptionsOverrideComponent.normalBias.overrideState = true; _probeVolumesOptionsOverrideComponent.viewBias.overrideState = true; _probeVolumesOptionsOverrideComponent.samplingNoise.overrideState = true; } } private void ChangeObjectWithSerialization_ONLYEDITOR() { #if UNITY_EDITOR if (_probeVolumesOptionsOverrideComponent == null) return; SerializedObject probeVolumesOptionsObject = new SerializedObject(_probeVolumesOptionsOverrideComponent); var normalBias = probeVolumesOptionsObject.FindProperty("normalBias"); var m_OverrideState_normalBias = normalBias.FindPropertyRelative("m_OverrideState"); var m_Value_normalBias = normalBias.FindPropertyRelative("m_Value"); m_OverrideState_normalBias.boolValue = true; m_Value_normalBias.floatValue = 0.0f; var viewBias = probeVolumesOptionsObject.FindProperty("viewBias"); var m_OverrideState_viewBias = viewBias.FindPropertyRelative("m_OverrideState"); var m_Value_viewBias = viewBias.FindPropertyRelative("m_Value"); m_OverrideState_viewBias.boolValue = true; m_Value_viewBias.floatValue = 0.0f; var samplingNoise = probeVolumesOptionsObject.FindProperty("samplingNoise"); var m_OverrideState_samplingNoise = samplingNoise.FindPropertyRelative("m_OverrideState"); var m_Value_samplingNoise = samplingNoise.FindPropertyRelative("m_Value"); m_OverrideState_samplingNoise.boolValue = true; m_Value_samplingNoise.floatValue = 0.0f; probeVolumesOptionsObject.ApplyModifiedProperties(); #endif } #endif } }