|
// SDK Description|SDK_Base|002
|
|
namespace VRTK
|
|
{
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
using System;
|
|
using System.Linq;
|
|
|
|
/// <summary>
|
|
/// Describes a class that represents an SDK. Only allowed on classes that inherit from SDK_Base.
|
|
/// </summary>
|
|
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
|
|
public sealed class SDK_DescriptionAttribute : Attribute
|
|
{
|
|
/// <summary>
|
|
/// The pretty name of the SDK. Uniquely identifies the SDK.
|
|
/// </summary>
|
|
public readonly string prettyName;
|
|
/// <summary>
|
|
/// The scripting define symbol needed for the SDK. Needs to be the same as `SDK_ScriptingDefineSymbolPredicateAttribute.symbol` to add and remove the scripting define symbol automatically using VRTK_SDKManager.
|
|
/// </summary>
|
|
public readonly string symbol;
|
|
/// <summary>
|
|
/// The name of the VR Device to load.
|
|
/// </summary>
|
|
public readonly string vrDeviceName;
|
|
/// <summary>
|
|
/// The index of this attribute, in case there are multiple on the same target.
|
|
/// </summary>
|
|
public readonly int index;
|
|
|
|
#if UNITY_EDITOR
|
|
/// <summary>
|
|
/// The build target group this SDK is for.
|
|
/// </summary>
|
|
public BuildTargetGroup buildTargetGroup;
|
|
#endif
|
|
|
|
/// <summary>
|
|
/// Whether this description describes a fallback SDK.
|
|
/// </summary>
|
|
public bool describesFallbackSDK
|
|
{
|
|
get
|
|
{
|
|
return prettyName == "Fallback";
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new attribute.
|
|
/// </summary>
|
|
/// <param name="prettyName">The pretty name of the SDK. Uniquely identifies the SDK. `null` and `string.Empty` aren't allowed.</param>
|
|
/// <param name="symbol">The scripting define symbol needed for the SDK. Needs to be the same as `SDK_ScriptingDefineSymbolPredicateAttribute.symbol` to add and remove the scripting define symbol automatically using VRTK_SDKManager. `null` and `string.Empty` are allowed.</param>
|
|
/// <param name="vrDeviceName">The name of the VR Device to load. Set to `null` or `string.Empty` if no VR Device is needed.</param>
|
|
/// <param name="buildTargetGroupName">The name of a constant of `BuildTargetGroup`. `BuildTargetGroup.Unknown`, `null` and `string.Empty` are not allowed.</param>
|
|
/// <param name="index">The index of this attribute, in case there are multiple on the same target.</param>
|
|
public SDK_DescriptionAttribute(string prettyName, string symbol, string vrDeviceName, string buildTargetGroupName, int index = 0)
|
|
{
|
|
if (prettyName == null)
|
|
{
|
|
VRTK_Logger.Fatal(new ArgumentNullException("prettyName"));
|
|
return;
|
|
}
|
|
if (prettyName == string.Empty)
|
|
{
|
|
VRTK_Logger.Fatal(new ArgumentOutOfRangeException("prettyName", prettyName, "An empty string isn't allowed."));
|
|
return;
|
|
}
|
|
|
|
this.prettyName = prettyName;
|
|
this.symbol = symbol;
|
|
this.vrDeviceName = string.IsNullOrEmpty(vrDeviceName) ? "None" : vrDeviceName;
|
|
this.index = index;
|
|
|
|
if (string.IsNullOrEmpty(buildTargetGroupName))
|
|
{
|
|
buildTargetGroupName = "Unknown";
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
Type buildTargetGroupType = typeof(BuildTargetGroup);
|
|
try
|
|
{
|
|
buildTargetGroup = (BuildTargetGroup)Enum.Parse(buildTargetGroupType, buildTargetGroupName);
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
VRTK_Logger.Fatal(new ArgumentOutOfRangeException(string.Format("'{0}' isn't a valid constant name of '{1}'.", buildTargetGroupName, buildTargetGroupType.Name), exception));
|
|
return;
|
|
}
|
|
|
|
if (buildTargetGroup == BuildTargetGroup.Unknown && !describesFallbackSDK)
|
|
{
|
|
VRTK_Logger.Fatal(new ArgumentOutOfRangeException("buildTargetGroupName", buildTargetGroupName, string.Format("'{0}' isn't allowed.", buildTargetGroupName)));
|
|
return;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new attribute by copying from another attribute on a given type.
|
|
/// </summary>
|
|
/// <param name="typeToCopyExistingDescriptionFrom">The type to copy the existing SDK_DescriptionAttribute from. `null` is not allowed.</param>
|
|
/// <param name="index">The index of the description to copy from the the existing SDK_DescriptionAttribute.</param>
|
|
public SDK_DescriptionAttribute(Type typeToCopyExistingDescriptionFrom, int index = 0)
|
|
{
|
|
if (typeToCopyExistingDescriptionFrom == null)
|
|
{
|
|
VRTK_Logger.Fatal(new ArgumentNullException("typeToCopyExistingDescriptionFrom"));
|
|
return;
|
|
}
|
|
|
|
Type descriptionType = typeof(SDK_DescriptionAttribute);
|
|
SDK_DescriptionAttribute[] descriptions = GetDescriptions(typeToCopyExistingDescriptionFrom);
|
|
if (descriptions.Length == 0)
|
|
{
|
|
VRTK_Logger.Fatal(new ArgumentOutOfRangeException("typeToCopyExistingDescriptionFrom", typeToCopyExistingDescriptionFrom, string.Format("'{0}' doesn't specify any SDK descriptions via '{1}' to copy.", typeToCopyExistingDescriptionFrom.Name, descriptionType.Name)));
|
|
return;
|
|
}
|
|
|
|
if (descriptions.Length <= index)
|
|
{
|
|
VRTK_Logger.Fatal(new ArgumentOutOfRangeException("index", index, string.Format("'{0}' has no '{1}' at that index.", typeToCopyExistingDescriptionFrom.Name, descriptionType.Name)));
|
|
return;
|
|
}
|
|
|
|
SDK_DescriptionAttribute description = descriptions[index];
|
|
prettyName = description.prettyName;
|
|
symbol = description.symbol;
|
|
vrDeviceName = description.vrDeviceName;
|
|
this.index = index;
|
|
#if UNITY_EDITOR
|
|
buildTargetGroup = description.buildTargetGroup;
|
|
#endif
|
|
}
|
|
|
|
public static SDK_DescriptionAttribute[] GetDescriptions(Type type)
|
|
{
|
|
return VRTK_SharedMethods.GetTypeCustomAttributes(type, typeof(SDK_DescriptionAttribute), false)
|
|
.Cast<SDK_DescriptionAttribute>()
|
|
.OrderBy(attribute => attribute.index)
|
|
.ToArray();
|
|
}
|
|
}
|
|
}
|