VR4Medical/ICI/Library/PackageCache/com.unity.xr.openxr@3903c1059bcf/Runtime/Features/OpenXRFeatureAttribute.cs
2025-07-29 13:45:50 +03:00

130 lines
5.1 KiB
C#

using System;
using UnityEngine.XR.OpenXR;
using UnityEngine.XR.OpenXR.Features;
#if UNITY_EDITOR || PACKAGE_DOCS_GENERATION
namespace UnityEditor.XR.OpenXR.Features
{
public class FeatureCategory
{
public const string Default = "";
public const string Feature = "Feature";
public const string Interaction = "Interaction";
}
[AttributeUsage(AttributeTargets.Class)]
public class OpenXRFeatureAttribute : Attribute
{
internal class CopyFieldAttribute : Attribute
{
public string FieldName;
public CopyFieldAttribute(string fieldName)
{
FieldName = fieldName;
}
}
/// <summary>
/// Feature name to show in the feature configuration UI.
/// </summary>
[CopyField(nameof(OpenXRFeature.nameUi))] public string UiName;
/// <summary>
/// Hide this feature from the UI.
/// </summary>
public bool Hidden;
/// <summary>
/// Feature description to show in the UI.
/// </summary>
public string Desc;
/// <summary>
/// OpenXR runtime extension strings that need to be enabled to use this extension.
/// If these extensions can't be enabled, a message will be logged, but execution will continue.
/// Can contain multiple extensions separated by spaces.
/// </summary>
[CopyField(nameof(OpenXRFeature.openxrExtensionStrings))] public string OpenxrExtensionStrings;
/// <summary>
/// Company that created the feature, shown in the feature configuration UI.
/// </summary>
[CopyField(nameof(OpenXRFeature.company))] public string Company;
/// <summary>
/// Link to the feature documentation. The help button in the UI opens this link in a web browser.
/// </summary>
public string DocumentationLink;
/// <summary>
/// Feature version.
/// </summary>
[CopyField(nameof(OpenXRFeature.version))] public string Version;
/// <summary>
/// BuildTargets in this list use a custom runtime loader (that is, openxr_loader.dll).
/// Only one feature per platform can have a custom runtime loader.
/// Unity will skip copying the default loader to the build and use this feature's loader instead on these platforms.
/// Loader must be placed alongside the OpenXRFeature script or in a subfolder of it.
/// </summary>
public BuildTarget[] CustomRuntimeLoaderBuildTargets;
/// <summary>
/// BuildTargetsGroups that this feature supports. The feature will only be shown or included on these platforms.
/// </summary>
public BuildTargetGroup[] BuildTargetGroups;
/// <summary>
/// Feature category.
/// </summary>
public string Category = "";
/// <summary>
/// True if this feature is required, false otherwise.
/// Required features will cause the loader to fail to initialize if they fail to initialize or start.
/// </summary>
[CopyField(nameof(OpenXRFeature.required))] public bool Required = false;
/// <summary>
/// Determines the order in which the feature will be called in both the GetInstanceProcAddr hook list and
/// when events such as OnInstanceCreate are called. Higher priority features will hook after lower priority features and
/// be called first in the event list.
/// </summary>
[CopyField(nameof(OpenXRFeature.priority))] public int Priority = 0;
/// <summary>
/// A well known string id for this feature. It is recommended that that id be in reverse DNS naming format (com.foo.bar.feature).
/// </summary>
[CopyField(nameof(OpenXRFeature.featureIdInternal))] public string FeatureId = "";
internal static readonly System.Text.RegularExpressions.Regex k_PackageVersionRegex = new System.Text.RegularExpressions.Regex(@"(\d*\.\d*)\..*");
/// <summary>
/// This method returns the OpenXR internal documentation link. This is necessary because the documentation link was made public in the
/// Costants class which prevents it from being alterned in anything but a major revision. This method will patch up the documentation links
/// as needed as long as they are internal openxr documentation links.
/// </summary>
internal string InternalDocumentationLink
{
get
{
if (string.IsNullOrEmpty(DocumentationLink))
return DocumentationLink;
// Update the version if needed
if (DocumentationLink.StartsWith(Constants.k_DocumentationManualURL))
{
var version = PackageManager.PackageInfo.FindForAssembly(typeof(OpenXRFeatureAttribute).Assembly)?.version;
var majorminor = k_PackageVersionRegex.Match(version).Groups[1].Value;
DocumentationLink = DocumentationLink.Replace("1.0", majorminor);
}
return DocumentationLink;
}
}
}
}
#endif