// Copyright HTC Corporation All Rights Reserved. using UnityEditor; using UnityEngine.XR.OpenXR.Features; using UnityEngine; using System.Text; #if UNITY_EDITOR using UnityEditor.XR.OpenXR.Features; #endif namespace VIVE.OpenXR.Interaction { #if UNITY_EDITOR [OpenXRFeature(UiName = "VIVE XR - Interaction Group", Category = "Interactions", BuildTargetGroups = new[] { BuildTargetGroup.Android, BuildTargetGroup.Standalone }, Company = "HTC", Desc = "VIVE interaction profiles management.", OpenxrExtensionStrings = kOpenxrExtensionString, Version = "2.5.0", FeatureId = featureId)] #endif public class ViveInteractions : OpenXRFeature { #region Log const string LOG_TAG = "VIVE.OpenXR.Interaction.ViveInteractions "; static StringBuilder m_sb = null; static StringBuilder sb { get { if (m_sb == null) { m_sb = new StringBuilder(); } return m_sb; } } static void DEBUG(StringBuilder msg) { Debug.LogFormat("{0} {1}", LOG_TAG, msg); } static void WARNING(StringBuilder msg) { Debug.LogWarningFormat("{0} {1}", LOG_TAG, msg); } static void ERROR(StringBuilder msg) { Debug.LogErrorFormat("{0} {1}", LOG_TAG, msg); } #endregion public const string kOpenxrExtensionString = ""; /// /// The feature id string. This is used to give the feature a well known id for reference. /// public const string featureId = "vive.openxr.feature.interactions"; #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) { m_XrInstance = xrInstance; m_XrInstanceCreated = true; sb.Clear().Append("OnInstanceCreate() ").Append(m_XrInstance); DEBUG(sb); return true; } /// /// Called when xrDestroyInstance is done. /// /// The instance to destroy. protected override void OnInstanceDestroy(ulong xrInstance) { sb.Clear().Append("OnInstanceDestroy() ").Append(xrInstance).Append(", current: ").Append(m_XrInstance); DEBUG(sb); if (m_XrInstance == xrInstance) { m_XrInstanceCreated = false; m_XrInstance = 0; } } #pragma warning disable private bool m_XrSessionCreated = false; #pragma warning enable 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("OnSessionCreate() ").Append(m_XrSession); DEBUG(sb); } protected override void OnSessionEnd(ulong xrSession) { sb.Clear().Append("OnSessionEnd() ").Append(xrSession).Append(", current: ").Append(m_XrSession); DEBUG(sb); } /// /// Called when xrDestroySession is done. /// /// The session ID to destroy. protected override void OnSessionDestroy(ulong xrSession) { sb.Clear().Append("OnSessionDestroy() ").Append(xrSession).Append(", current: ").Append(m_XrSession); DEBUG(sb); if (m_XrSession == xrSession) { m_XrSessionCreated = false; m_XrSession = 0; } } 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("OnSystemChange() " + m_XrSystemId); DEBUG(sb); } #endregion [SerializeField] internal bool m_ViveHandInteraction = false; /// /// Checks if using XR_HTC_hand_interaction or not. /// /// True for using. public bool UseViveHandInteraction() { return m_ViveHandInteraction; } [SerializeField] internal bool m_ViveWristTracker = false; /// /// Checks if using VIVE Wrist Tracker or not. /// /// True for using. public bool UseViveWristTracker() { return m_ViveWristTracker; } [SerializeField] internal bool m_ViveXRTracker = false; /// /// Checks if using VIVE Ultimate Tracker or not. /// /// True for using. public bool UseViveXrTracker() { return m_ViveXRTracker; } [SerializeField] internal bool m_KHRHandInteraction = false; /// /// Checks if using XR_EXT_hand_interaction or not. /// /// True for using. public bool UseKhrHandInteraction() { return m_KHRHandInteraction; } } }