// Copyright HTC Corporation All Rights Reserved. using UnityEngine.XR.OpenXR; using UnityEngine.XR.OpenXR.Features; using UnityEngine; using System.Text; #if UNITY_EDITOR using UnityEditor; using UnityEditor.XR.OpenXR.Features; #endif namespace VIVE.OpenXR { #if UNITY_EDITOR [OpenXRFeature(UiName = "VIVE XR Path Enumeration", BuildTargetGroups = new[] { BuildTargetGroup.Android }, Company = "HTC", Desc = "The extension provides more flexibility for the user paths and input/output source paths related to an interaction profile. Developers can use this extension to obtain the path that the user has decided on.", DocumentationLink = "..\\Documentation", Version = "1.0.6", OpenxrExtensionStrings = kOpenxrExtensionString, FeatureId = featureId)] #endif public class VivePathEnumeration : OpenXRFeature { const string LOG_TAG = "VIVE.OpenXR.VivePathEnumeration "; StringBuilder m_sb = null; StringBuilder sb { get { if (m_sb == null) { m_sb = new StringBuilder(); } return m_sb; } } void DEBUG(StringBuilder msg) { Debug.Log(msg); } void WARNING(StringBuilder msg) { Debug.LogWarning(msg); } /// /// OpenXR specification 12.1. XR_HTC_path_enumeration. /// public const string kOpenxrExtensionString = "XR_HTC_path_enumeration"; /// /// The feature id string. This is used to give the feature a well known id for reference. /// public const string featureId = "vive.wave.openxr.feature.pathenumeration"; #region OpenXR Life Cycle #pragma warning disable private bool m_XrInstanceCreated = false; #pragma warning enable private XrInstance m_XrInstance = 0; /// /// Called when xrCreateInstance is done. /// /// The created instance. /// True for valid XrInstance protected override bool OnInstanceCreate(ulong xrInstance) { if (!OpenXRRuntime.IsExtensionEnabled(kOpenxrExtensionString)) { sb.Clear().Append(LOG_TAG).Append("OnInstanceCreate() ").Append(kOpenxrExtensionString).Append(" is NOT enabled."); WARNING(sb); return false; } m_XrInstanceCreated = true; m_XrInstance = xrInstance; sb.Clear().Append(LOG_TAG).Append("OnInstanceCreate() ").Append(m_XrInstance); DEBUG(sb); return base.OnInstanceCreate(xrInstance); } /// /// Called when xrDestroyInstance is done. /// /// The instance to destroy. protected override void OnInstanceDestroy(ulong xrInstance) { if (m_XrInstance == xrInstance) { m_XrInstanceCreated = false; m_XrInstance = 0; } sb.Clear().Append(LOG_TAG).Append("OnInstanceDestroy() ").Append(xrInstance); DEBUG(sb); } private XrSystemId m_XrSystemId = 0; /// /// Called when the XrSystemId retrieved by xrGetSystem is changed. /// /// The system id. protected override void OnSystemChange(ulong xrSystem) { m_XrSystemId = xrSystem; sb.Clear().Append(LOG_TAG).Append("OnSystemChange() ").Append(m_XrSystemId); DEBUG(sb); } private bool m_XrSessionCreated = false; private XrSession m_XrSession = 0; /// /// Called when xrCreateSession is done. /// /// The created session ID. protected override void OnSessionCreate(ulong xrSession) { m_XrSession = xrSession; m_XrSessionCreated = true; sb.Clear().Append(LOG_TAG).Append("OnSessionCreate() ").Append(m_XrSession); DEBUG(sb); } /// /// Called when xrDestroySession is done. /// /// The session ID to destroy. protected override void OnSessionDestroy(ulong xrSession) { sb.Clear().Append(LOG_TAG).Append("OnSessionDestroy() ").Append(xrSession); DEBUG(sb); m_XrSession = 0; m_XrSessionCreated = false; } #endregion } }