using UnityEngine.Rendering; using UnityEngine.SceneManagement; using System.IO; using System; using System.Collections.Generic; #if UNITY_EDITOR using UnityEditor; #endif namespace UnityEngine.Experimental.Rendering { // TMP to be moved to ProbeReferenceVolume when we define the concept, here it is just to make stuff compile enum ProbeVolumeState { Default = 0, Invalid = 999 } [ExecuteAlways] [AddComponentMenu("")] // Hide. internal class ProbeVolumePerSceneData : MonoBehaviour, ISerializationCallbackReceiver { [System.Serializable] struct SerializableAssetItem { [SerializeField] public ProbeVolumeState state; [SerializeField] public ProbeVolumeAsset asset; } internal Dictionary assets = new Dictionary(); [SerializeField] List serializedAssets; ProbeVolumeState m_CurrentState = ProbeVolumeState.Default; ProbeVolumeState m_PreviousState = ProbeVolumeState.Invalid; /// /// OnAfterDeserialize implementation. /// public void OnAfterDeserialize() { if (serializedAssets == null) return; assets = new Dictionary(); foreach (var assetItem in serializedAssets) { assets.Add(assetItem.state, assetItem.asset); } } /// /// OnBeforeSerialize implementation. /// public void OnBeforeSerialize() { if (assets == null || serializedAssets == null) return; serializedAssets.Clear(); foreach (var k in assets.Keys) { SerializableAssetItem item; item.state = k; item.asset = assets[k]; serializedAssets.Add(item); } } internal void StoreAssetForState(ProbeVolumeState state, ProbeVolumeAsset asset) { assets[state] = asset; } internal void InvalidateAllAssets() { foreach (var asset in assets.Values) { if (asset != null) ProbeReferenceVolume.instance.AddPendingAssetRemoval(asset); } assets.Clear(); } internal ProbeVolumeAsset GetCurrentStateAsset() { if (assets.ContainsKey(m_CurrentState)) return assets[m_CurrentState]; else return null; } internal void QueueAssetLoading() { var refVol = ProbeReferenceVolume.instance; if (assets.ContainsKey(m_CurrentState) && assets[m_CurrentState] != null) { refVol.AddPendingAssetLoading(assets[m_CurrentState]); #if UNITY_EDITOR if (refVol.sceneData != null) { refVol.dilationValidtyThreshold = refVol.sceneData.GetBakeSettingsForScene(gameObject.scene).dilationSettings.dilationValidityThreshold; } #endif m_PreviousState = m_CurrentState; } } internal void QueueAssetRemoval() { if (assets.ContainsKey(m_CurrentState) && assets[m_CurrentState] != null) ProbeReferenceVolume.instance.AddPendingAssetRemoval(assets[m_CurrentState]); } void OnEnable() { QueueAssetLoading(); } void OnDisable() { QueueAssetRemoval(); } void OnDestroy() { QueueAssetRemoval(); } void Update() { // Query state from ProbeReferenceVolume.instance. // This is temporary here until we implement a state system. m_CurrentState = ProbeVolumeState.Default; if (m_PreviousState != m_CurrentState) { if (assets.ContainsKey(m_PreviousState) && assets[m_PreviousState] != null) ProbeReferenceVolume.instance.AddPendingAssetRemoval(assets[m_PreviousState]); QueueAssetLoading(); } } } }