using System;
using Rive.Utils;
namespace Rive
{
///
/// Represents a file asset within a specific Rive file.
///
public abstract class EmbeddedAssetReference
{
internal struct InitializationData
{
public EmbeddedAssetType AssetType { get; }
public uint Id { get; }
public string Name { get; }
public uint InBandBytesSize { get; }
public OutOfBandAsset OutOfBandAsset { get; }
public uint IndexInRiveFile { get; }
public InitializationData(EmbeddedAssetType assetType, uint id, string name, uint inBandBytesSize, uint indexInRiveFile, OutOfBandAsset outOfBandAsset)
{
AssetType = assetType;
Id = id;
Name = name;
InBandBytesSize = inBandBytesSize;
OutOfBandAsset = outOfBandAsset;
IndexInRiveFile = indexInRiveFile;
}
public static InitializationData FromEmbeddedAssetData(EmbeddedAssetData embeddedAssetData, uint index)
{
return new InitializationData(embeddedAssetData.AssetType, embeddedAssetData.Id, embeddedAssetData.Name, embeddedAssetData.InBandBytesSize, index, embeddedAssetData.OutOfBandAsset);
}
}
public class WarningCodes
{
public const string FILE_NOT_LOADED = "RIVE_FILE_NOT_YET_LOADED";
public const string FILE_RELEASED = "RIVE_FILE_RELEASED";
public const string NULL_OOB_ASSET = "NULL_OOB_ASSET";
}
private EmbeddedAssetType m_assetType = EmbeddedAssetType.Unknown;
private uint m_Id;
private string m_Name;
private uint m_EmbeddededBytesSize;
///
/// The index of the embedded asset in the Rive file.
///
private uint m_Index;
private WeakReference loadedFileReference;
private OutOfBandAsset m_OutOfBandAssetToLoad;
///
/// The type of the embedded asset.
///
public EmbeddedAssetType AssetType { get { return m_assetType; } }
///
/// The unique identifier of the embedded asset.
///
public uint Id { get { return m_Id; } }
///
/// The name of the embedded asset.
///
public string Name { get { return m_Name; } }
///
/// The size of the bytes embedded in the asset. If the asset is only referenced (not embedded), this will be 0.
///
public uint EmbeddededBytesSize { get { return m_EmbeddededBytesSize; } }
///
/// The out of band asset that will be loaded when the asset is needed.
///
[Obsolete("Use OutOfBandAsset instead.")]
public OutOfBandAsset OutOfBandAssetToLoad { get { return m_OutOfBandAssetToLoad; } }
///
/// The index of the embedded/referenced asset in the Rive file.
///
[Obsolete]
public uint IndexInRiveFile { get { return m_Index; } }
///
/// The index of the embedded/referenced asset in the Rive file.
///
internal uint Index { get { return m_Index; } }
public OutOfBandAsset OutOfBandAsset { get { return m_OutOfBandAssetToLoad; } }
[Obsolete]
public EmbeddedAssetReference(EmbeddedAssetData embeddedAssetData, uint index)
{
m_assetType = embeddedAssetData.AssetType;
m_Id = embeddedAssetData.Id;
m_Name = embeddedAssetData.Name;
m_EmbeddededBytesSize = embeddedAssetData.InBandBytesSize;
m_Index = index;
m_OutOfBandAssetToLoad = embeddedAssetData.OutOfBandAsset;
}
[Obsolete]
public EmbeddedAssetReference(EmbeddedAssetType assetType, uint id, string name, uint embeddededBytesSize, uint indexInRiveFile, OutOfBandAsset outOfBandAsset)
{
m_assetType = assetType;
m_Id = id;
m_Name = name;
m_EmbeddededBytesSize = embeddededBytesSize;
m_Index = indexInRiveFile;
m_OutOfBandAssetToLoad = outOfBandAsset;
}
internal EmbeddedAssetReference(InitializationData initializationData)
{
m_assetType = initializationData.AssetType;
m_Id = initializationData.Id;
m_Name = initializationData.Name;
m_EmbeddededBytesSize = initializationData.InBandBytesSize;
m_Index = initializationData.IndexInRiveFile;
m_OutOfBandAssetToLoad = initializationData.OutOfBandAsset;
}
///
/// Sets the loaded file reference for this embedded asset, so we can update the asset reference later.
///
///
internal void SetRiveFileReference(File file)
{
loadedFileReference = new WeakReference(file);
}
protected void UpdateEmbeddedAssetReferenceInFile(OutOfBandAsset outOfBandAsset)
{
if (outOfBandAsset == null)
{
DebugLogger.Instance.LogWarning($"{WarningCodes.NULL_OOB_ASSET}: Tried to update embedded asset reference in file, but the out of band asset is null.");
return;
}
if (loadedFileReference == null)
{
DebugLogger.Instance.LogWarning($"{WarningCodes.FILE_NOT_LOADED}: Tried to update embedded asset reference in file, but the file has not been loaded yet.");
return;
}
if (loadedFileReference.TryGetTarget(out Rive.File file))
{
file.UpdateEmbeddedAssetReference(m_Index, outOfBandAsset);
m_OutOfBandAssetToLoad = outOfBandAsset;
}
else
{
loadedFileReference = null;
DebugLogger.Instance.LogWarning($"{WarningCodes.FILE_RELEASED}: Tried to update embedded asset reference in file, but the file has already been released.");
}
}
///
/// Checks if the embedded asset reference has a file reference set.
///
///
internal bool HasFileReference()
{
return loadedFileReference != null && loadedFileReference.TryGetTarget(out Rive.File file);
}
///
/// Empties the embedded asset reference value in the Rive file. This is used if the asset at this index had embedded bytes.
///
internal void ClearEmbeddedAssetReference()
{
if (loadedFileReference == null)
{
DebugLogger.Instance.LogWarning($"{WarningCodes.FILE_NOT_LOADED}: Tried to clear embedded asset reference in file, but the file has not been loaded yet.");
return;
}
if (loadedFileReference.TryGetTarget(out Rive.File file))
{
NativeFileInterface.clearAssignedAssetReferenceValue(file.NativeFile, m_Index);
}
else
{
loadedFileReference = null;
DebugLogger.Instance.LogWarning($"{WarningCodes.FILE_RELEASED}: Tried to clear embedded asset reference in file, but the file has already been released.");
}
}
}
}