You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

140 lines
5.1 KiB

using System;
using System.IO;
using UnityEngine.Serialization;
using Unity.IO.LowLevel.Unsafe;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace UnityEngine.Rendering
{
// A StreamableAsset is an asset that is converted to a Streaming Asset for builds.
// assetGUID is used in editor to handle the asset and streamableAssetPath is updated at build time and is used at runtime.
[Serializable]
[Scripting.APIUpdating.MovedFrom(false, "UnityEngine.Rendering", "Unity.RenderPipelines.Core.Runtime", "ProbeVolumeBakingSet.StreamableAsset")]
class ProbeVolumeStreamableAsset
{
[Serializable]
[Scripting.APIUpdating.MovedFrom(false, "UnityEngine.Rendering", "Unity.RenderPipelines.Core.Runtime", "ProbeVolumeBakingSet.StreamableAsset.StreamableCellDesc")]
public struct StreamableCellDesc
{
public int offset; // Offset of the cell within the file.
public int elementCount; // Number of elements in the cell (can be data chunks, bricks, debug info, etc)
}
[SerializeField] [FormerlySerializedAs("assetGUID")] string m_AssetGUID = ""; // In the editor, allows us to load the asset through the AssetDatabase.
[SerializeField] [FormerlySerializedAs("streamableAssetPath")]string m_StreamableAssetPath = ""; // At runtime, path of the asset within the StreamingAssets data folder.
[SerializeField] [FormerlySerializedAs("elementSize")]int m_ElementSize; // Size of an element. Can be a data chunk, a brick, etc.
[SerializeField] [FormerlySerializedAs("streamableCellDescs")] SerializedDictionary<int, StreamableCellDesc> m_StreamableCellDescs = new SerializedDictionary<int, StreamableCellDesc>();
[SerializeField] TextAsset m_Asset;
public string assetGUID { get => m_AssetGUID; }
public TextAsset asset { get => m_Asset; }
public int elementSize { get => m_ElementSize; }
public SerializedDictionary<int, StreamableCellDesc> streamableCellDescs { get => m_StreamableCellDescs; }
string m_FinalAssetPath;
FileHandle m_AssetFileHandle;
public ProbeVolumeStreamableAsset(string apvStreamingAssetsPath, SerializedDictionary<int, StreamableCellDesc> cellDescs, int elementSize, string bakingSetGUID, string assetGUID)
{
m_AssetGUID = assetGUID;
m_StreamableCellDescs = cellDescs;
m_ElementSize = elementSize;
m_StreamableAssetPath = Path.Combine(Path.Combine(apvStreamingAssetsPath, bakingSetGUID), m_AssetGUID + ".bytes");
}
internal void RefreshAssetPath()
{
#if UNITY_EDITOR
m_FinalAssetPath = AssetDatabase.GUIDToAssetPath(m_AssetGUID);
#else
m_FinalAssetPath = Path.Combine(Application.streamingAssetsPath, m_StreamableAssetPath);
#endif
}
public string GetAssetPath()
{
// Avoid GCAlloc every frame this is called.
if (string.IsNullOrEmpty(m_FinalAssetPath))
RefreshAssetPath();
return m_FinalAssetPath;
}
unsafe public bool FileExists()
{
#if UNITY_EDITOR
if (File.Exists(GetAssetPath()))
return true;
// File may not exist if it was moved, refresh path in this case
RefreshAssetPath();
return File.Exists(GetAssetPath());
#else
// When not using streaming assets, this reference should always be valid.
if (m_Asset != null)
return true;
FileInfoResult result;
AsyncReadManager.GetFileInfo(GetAssetPath(), &result).JobHandle.Complete();
return result.FileState == FileState.Exists;
#endif
}
#if UNITY_EDITOR
public void RenameAsset(string newName)
{
AssetDatabase.RenameAsset(AssetDatabase.GUIDToAssetPath(m_AssetGUID), newName);
m_FinalAssetPath = "";
}
public void UpdateAssetReference(bool useStreamingAsset)
{
m_Asset = useStreamingAsset ? null : AssetDatabase.LoadAssetAtPath<TextAsset>(GetAssetPath());
}
#endif
public long GetFileSize()
{
return new FileInfo(GetAssetPath()).Length;
}
public bool IsOpen()
{
return m_AssetFileHandle.IsValid();
}
public FileHandle OpenFile()
{
if (m_AssetFileHandle.IsValid())
return m_AssetFileHandle;
m_AssetFileHandle = AsyncReadManager.OpenFileAsync(GetAssetPath());
return m_AssetFileHandle;
}
public void CloseFile()
{
if (m_AssetFileHandle.IsValid() && m_AssetFileHandle.JobHandle.IsCompleted)
m_AssetFileHandle.Close();
m_AssetFileHandle = default(FileHandle);
}
public bool IsValid()
{
return !string.IsNullOrEmpty(m_AssetGUID);
}
public void Dispose()
{
if (m_AssetFileHandle.IsValid())
{
m_AssetFileHandle.Close().Complete();
m_AssetFileHandle = default(FileHandle);
}
}
}
}