// Copyright HTC Corporation All Rights Reserved. using UnityEditor; using UnityEngine.XR.OpenXR; using UnityEngine.XR.OpenXR.Features; using UnityEngine; using System; using System.Runtime.InteropServices; #if UNITY_EDITOR using UnityEditor.XR.OpenXR.Features; #endif namespace VIVE.OpenXR.CompositionLayer { #if UNITY_EDITOR [OpenXRFeature(UiName = "VIVE XR Composition Layer (Extra Settings) (Beta)", Desc = "Enable this feature to use the Composition Layer Extra Settings.", Company = "HTC", DocumentationLink = "..\\Documentation", OpenxrExtensionStrings = kOpenxrExtensionStrings, Version = "1.0.0", BuildTargetGroups = new[] { BuildTargetGroup.Android }, FeatureId = featureId )] #endif public class ViveCompositionLayerExtraSettings : OpenXRFeature { const string LOG_TAG = "VIVE.OpenXR.ViveCompositionLayer.ExtraSettings"; static void DEBUG(string msg) { Debug.Log(LOG_TAG + " " + msg); } static void WARNING(string msg) { Debug.LogWarning(LOG_TAG + " " + msg); } static void ERROR(string msg) { Debug.LogError(LOG_TAG + " " + msg); } /// /// Settings Editor Enable Sharpening or Not. /// public bool SettingsEditorEnableSharpening = false; /// /// Support Sharpening or Not. /// public bool supportSharpening = false; /// /// Settings Editor Sharpening Mode /// public XrSharpeningModeHTC SettingsEditorSharpeningMode = XrSharpeningModeHTC.FAST; /// /// Settings Editor Sharpening Levell /// [Range(0.0f, 1.0f)] public float SettingsEditorSharpeningLevel = 1.0f; /// /// The feature id string. This is used to give the feature a well known id for reference. /// public const string featureId = "vive.openxr.feature.compositionlayer.extrasettings"; /// /// OpenXR specification. /// public const string kOpenxrExtensionStrings = "XR_HTC_composition_layer_extra_settings"; #region OpenXR Life Cycle private bool m_XrInstanceCreated = false; /// /// The XR instance is created or not. /// public bool XrInstanceCreated { get { return m_XrInstanceCreated; } } private XrInstance m_XrInstance = 0; protected override bool OnInstanceCreate(ulong xrInstance) { foreach (string kOpenxrExtensionString in kOpenxrExtensionStrings.Split(' ')) { if (!OpenXRRuntime.IsExtensionEnabled(kOpenxrExtensionString)) { WARNING("OnInstanceCreate() " + kOpenxrExtensionString + " is NOT enabled."); } } m_XrInstanceCreated = true; m_XrInstance = xrInstance; DEBUG("OnInstanceCreate() " + m_XrInstance); return true; } protected override void OnInstanceDestroy(ulong xrInstance) { m_XrInstanceCreated = false; DEBUG("OnInstanceDestroy() " + m_XrInstance); } private XrSystemId m_XrSystemId = 0; protected override void OnSystemChange(ulong xrSystem) { m_XrSystemId = xrSystem; DEBUG("OnSystemChange() " + m_XrSystemId); } private bool m_XrSessionCreated = false; /// /// The XR session is created or not. /// public bool XrSessionCreated { get { return m_XrSessionCreated; } } private XrSession m_XrSession = 0; protected override void OnSessionCreate(ulong xrSession) { m_XrSession = xrSession; m_XrSessionCreated = true; DEBUG("OnSessionCreate() " + m_XrSession); } private bool m_XrSessionEnding = false; /// /// The XR session is ending or not. /// public bool XrSessionEnding { get { return m_XrSessionEnding; } } protected override void OnSessionBegin(ulong xrSession) { m_XrSessionEnding = false; DEBUG("OnSessionBegin() " + m_XrSession); //enable Sharpening if (OpenXRRuntime.IsExtensionEnabled("XR_HTC_composition_layer_extra_settings")) { ViveCompositionLayer_UpdateSystemProperties(m_XrInstance, m_XrSystemId); supportSharpening = ViveCompositionLayer_IsSupportSharpening(); if (supportSharpening && SettingsEditorEnableSharpening) { EnableSharpening(SettingsEditorSharpeningMode, SettingsEditorSharpeningLevel); } } } protected override void OnSessionEnd(ulong xrSession) { m_XrSessionEnding = true; DEBUG("OnSessionEnd() " + m_XrSession); } protected override void OnSessionDestroy(ulong xrSession) { m_XrSessionCreated = false; DEBUG("OnSessionDestroy() " + xrSession); } #endregion #region Wrapper Functions private const string ExtLib = "viveopenxr"; [DllImportAttribute(ExtLib, EntryPoint = "viveCompositionLayer_UpdateSystemProperties")] private static extern int VIVEOpenXR_ViveCompositionLayer_UpdateSystemProperties(XrInstance instance, XrSystemId system_id); private int ViveCompositionLayer_UpdateSystemProperties(XrInstance instance, XrSystemId system_id) { return VIVEOpenXR_ViveCompositionLayer_UpdateSystemProperties(instance, system_id); } [DllImportAttribute(ExtLib, EntryPoint = "viveCompositionLayer_IsSupportSharpening")] private static extern bool VIVEOpenXR_ViveCompositionLayer_IsSupportSharpening(); private bool ViveCompositionLayer_IsSupportSharpening() { return VIVEOpenXR_ViveCompositionLayer_IsSupportSharpening(); } [DllImportAttribute(ExtLib, EntryPoint = "viveCompositionLayer_enableSharpening")] private static extern int VIVEOpenXR_ViveCompositionLayer_enableSharpening(XrSharpeningModeHTC sharpeningMode, float sharpeningLevel); /// /// Enable the sharpening setting applying to the projection layer. /// /// The sharpening mode in . /// The sharpening level in float [0, 1]. /// True for success. public bool EnableSharpening(XrSharpeningModeHTC sharpeningMode, float sharpeningLevel) { return (VIVEOpenXR_ViveCompositionLayer_enableSharpening(sharpeningMode, sharpeningLevel) == 0); } [DllImportAttribute(ExtLib, EntryPoint = "viveCompositionLayer_disableSharpening")] private static extern int VIVEOpenXR_ViveCompositionLayer_DisableSharpening(); /// /// Disable the sharpening setting on the projection layer. /// /// True for success public bool DisableSharpening() { return (VIVEOpenXR_ViveCompositionLayer_DisableSharpening() == 0); } #endregion } }