using System; using UnityEngine.Serialization; using UnityEngine.SceneManagement; using System.Collections.Generic; namespace UnityEngine.Experimental.Rendering { [PreferBinarySerialization] internal class ProbeVolumeAsset : ScriptableObject { [Serializable] internal enum AssetVersion { First, AddProbeVolumesAtlasEncodingModes, PV2, ChunkBasedIndex, Max, Current = Max - 1 } [SerializeField] protected internal int m_Version = (int)AssetVersion.Current; [SerializeField] public int Version { get => m_Version; } [SerializeField] internal List cells = new List(); [SerializeField] internal Vector3Int maxCellPosition; [SerializeField] internal Vector3Int minCellPosition; [SerializeField] internal Bounds globalBounds; [SerializeField] internal ProbeVolumeSHBands bands; [SerializeField] string m_AssetFullPath = "UNINITIALIZED!"; // Profile info [SerializeField] internal int cellSizeInBricks; [SerializeField] internal float minDistanceBetweenProbes; [SerializeField] internal int simplificationLevels; internal int maxSubdivision => simplificationLevels + 1; // we add one for the top subdiv level which is the same size as a cell internal float minBrickSize => Mathf.Max(0.01f, minDistanceBetweenProbes * 3.0f); internal bool CompatibleWith(ProbeVolumeAsset otherAsset) { return (maxSubdivision == otherAsset.maxSubdivision) && (minBrickSize == otherAsset.minBrickSize) && (cellSizeInBricks == otherAsset.cellSizeInBricks); } public string GetSerializedFullPath() { return m_AssetFullPath; } #if UNITY_EDITOR internal static string GetFileName(Scene scene) { string assetName = "ProbeVolumeData"; String scenePath = scene.path; String sceneDir = System.IO.Path.GetDirectoryName(scenePath); String sceneName = System.IO.Path.GetFileNameWithoutExtension(scenePath); String assetPath = System.IO.Path.Combine(sceneDir, sceneName); if (!UnityEditor.AssetDatabase.IsValidFolder(assetPath)) UnityEditor.AssetDatabase.CreateFolder(sceneDir, sceneName); String assetFileName = UnityEditor.AssetDatabase.GenerateUniqueAssetPath(assetName + ".asset"); assetFileName = System.IO.Path.Combine(assetPath, assetFileName); return assetFileName; } public static ProbeVolumeAsset CreateAsset(Scene scene) { ProbeVolumeAsset asset = ScriptableObject.CreateInstance(); string assetFileName = GetFileName(scene); UnityEditor.AssetDatabase.CreateAsset(asset, assetFileName); asset.m_AssetFullPath = assetFileName; return asset; } internal void StoreProfileData(ProbeReferenceVolumeProfile profile) { cellSizeInBricks = profile.cellSizeInBricks; simplificationLevels = profile.simplificationLevels; minDistanceBetweenProbes = profile.minDistanceBetweenProbes; } #endif } #if UNITY_EDITOR [UnityEditor.CustomEditor(typeof(ProbeVolumeAsset))] class ProbeVolumeAssetEditor : UnityEditor.Editor { public override void OnInspectorGUI() {} } #endif }