#if PICO_OPENXR_SDK using System; using System.Collections.Generic; using Unity.XR.PXR; using UnityEditor; using UnityEngine; using UnityEngine.XR.OpenXR; using UnityEngine.XR.OpenXR.Features; namespace Unity.XR.OpenXR.Features.PICOSupport { public abstract class OpenXRFeatureBase : OpenXRFeature { protected static ulong xrInstance = 0ul; protected static ulong xrSession = 0ul; protected override bool OnInstanceCreate(ulong instance) { xrInstance = instance; xrSession = 0ul; InstanceCreate(instance); return true; } protected override void OnSessionCreate(ulong xrSessionId) { xrSession = xrSessionId; base.OnSessionCreate(xrSessionId); SessionCreate(xrSessionId); } public bool isExtensionEnabled(string extensionUrl) { string[] exts = extensionUrl.Split(' '); if (exts.Length > 0) { foreach (var _ext in exts) { if (!string.IsNullOrEmpty(_ext) && !OpenXRRuntime.IsExtensionEnabled(_ext)) { PLog.e("OpenXRFeatureBase", _ext + " is not enabled"); return false; } } } else { if (!string.IsNullOrEmpty(extensionUrl) && !OpenXRRuntime.IsExtensionEnabled(extensionUrl)) { PLog.e("OpenXRFeatureBase", extensionUrl + " is not enabled"); return false; } } return true; } public virtual void InstanceCreate(ulong instance) {} public virtual void SessionCreate(ulong xrSessionId) {} public abstract string GetExtensionString(); #if UNITY_EDITOR protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) { var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); rules.Add(new ValidationRule(this) { message = "No PICO OpenXR Features selected.", checkPredicate = () => { if (null == settings) return false; foreach (var feature in settings.GetFeatures()) { if (feature is OpenXRExtensions) { return feature.enabled; } } return false; }, fixIt = () => { if (null == settings) return ; var openXRExtensions = settings.GetFeature(); if (openXRExtensions != null) { openXRExtensions.enabled = true; } }, error = true }); } #endif } } #endif