diff --git a/com.valvesoftware.openxr.utils/CHANGELOG.md b/com.valvesoftware.openxr.utils/CHANGELOG.md index a845b4b..683f895 100644 --- a/com.valvesoftware.openxr.utils/CHANGELOG.md +++ b/com.valvesoftware.openxr.utils/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [1.0.3] - 2026-02-12 +### Added +- System info sample for checking device is Steam Frame +- Minor fixes/additions to documentation and OpenXR feature validation rules. + ## [1.0.2] - 2026-01-14 ### Fixed - Fixed app permissions preventing gaze-based foveated rendering from being enabled. diff --git a/com.valvesoftware.openxr.utils/Documentation~/index.md b/com.valvesoftware.openxr.utils/Documentation~/index.md index 78b9539..8b3b3d8 100644 --- a/com.valvesoftware.openxr.utils/Documentation~/index.md +++ b/com.valvesoftware.openxr.utils/Documentation~/index.md @@ -44,6 +44,17 @@ git@github.com:ValveSoftware/Unity.git?path=com.valvesoftware.openxr.utils | :--- | :--- | | **Steam Frame Controller** | Interaction profile for Steam Frame controllers. | +## Samples + +| **Name** | **Description** | **Requirements** +| :--- | :--- | :--- | +| **Refresh Rate** | Queries and displays the current display refresh rate. | Valve Utils Refresh Rate OpenXR Feature | +| **System Info** | Queries whether the device is Steam Frame using OpenXR's system info. | Unity 2022.3, Unity OpenXR Plugin v1.9.1 | + +## Limitations + +* Foveated rendering on Steam Frame under Unity 2022.3 may not render correctly when MSAA is enabled. + ## Support For bugs or features requests, open up a new issue if you don't see it addressed in the existing / closed issues. diff --git a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRFoveatedRenderingBuildHooks.cs b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRFoveatedRenderingBuildHooks.cs index da1e222..1520feb 100644 --- a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRFoveatedRenderingBuildHooks.cs +++ b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRFoveatedRenderingBuildHooks.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; -using Unity.XR.Management.AndroidManifest.Editor; using UnityEditor.Build.Reporting; using UnityEditor.XR.OpenXR.Features; -using UnityEngine.XR.OpenXR; namespace Valve.OpenXR.Utils.Editor { diff --git a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRRenderRegionsFeatureBuildHooks.cs b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRRenderRegionsFeatureBuildHooks.cs index 1102c6d..a4bdf68 100644 --- a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRRenderRegionsFeatureBuildHooks.cs +++ b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRRenderRegionsFeatureBuildHooks.cs @@ -3,6 +3,7 @@ using UnityEditor.Build.Reporting; using UnityEditor.XR.OpenXR.Features; using UnityEngine; +using UnityEngine.XR.OpenXR; namespace Valve.OpenXR.Utils.Editor { @@ -16,6 +17,7 @@ internal class ValveOpenXRRenderRegionsFeatureBuildHooks : OpenXRFeatureBuildHoo protected override void OnPreprocessBuildExt(BuildReport report) { + ApplySettingsOverride(); } protected override void OnProcessBootConfigExt(BuildReport report, BootConfigBuilder builder) @@ -43,5 +45,13 @@ protected override void OnPostGenerateGradleAndroidProjectExt(string path) protected override void OnPostprocessBuildExt(BuildReport report) { } + + private void ApplySettingsOverride() + { + var openXrSettings = OpenXRSettings.GetSettingsForBuildTargetGroup(BuildTargetGroup.Android); + var target = EditorUtils.GetFeatureAsset(); + target.ApplySettingsOverride(openXrSettings); + AssetDatabase.SaveAssetIfDirty(openXrSettings); + } } } diff --git a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRRenderRegionsFeatureEditor.cs b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRRenderRegionsFeatureEditor.cs index 879f1fa..fcd3195 100644 --- a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRRenderRegionsFeatureEditor.cs +++ b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRRenderRegionsFeatureEditor.cs @@ -46,14 +46,8 @@ public override void OnInspectorGUI() OpenXRSettings androidOpenXRSettings = OpenXRSettings.GetSettingsForBuildTargetGroup(BuildTargetGroup.Android); var serializedOpenXrSettings = new SerializedObject(androidOpenXRSettings); - - androidOpenXRSettings.symmetricProjection = symmetricProjection.boolValue; -#if UNITY_6000_1_OR_NEWER - androidOpenXRSettings.multiviewRenderRegionsOptimizationMode = (OpenXRSettings.MultiviewRenderRegionsOptimizationMode)multiviewRenderRegionsOptimizationMode.intValue; -#endif + ((ValveOpenXRRenderRegionsFeature)target).ApplySettingsOverride(androidOpenXRSettings); serializedOpenXrSettings.ApplyModifiedProperties(); - - EditorGUIUtility.labelWidth = 0.0f; } } } diff --git a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRSupportBuildHooks.cs b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRSupportBuildHooks.cs index 2e1a0f5..87ce5a0 100644 --- a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRSupportBuildHooks.cs +++ b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRSupportBuildHooks.cs @@ -1,7 +1,9 @@ using System; +using UnityEditor; using UnityEditor.Build.Reporting; using UnityEditor.XR.OpenXR.Features; using UnityEngine; +using UnityEngine.XR.OpenXR; namespace Valve.OpenXR.Utils.Editor { @@ -15,7 +17,11 @@ internal class ValveOpenXRSupportBuildHooks : OpenXRFeatureBuildHooks protected override void OnPostGenerateGradleAndroidProjectExt(string path) {} protected override void OnPostprocessBuildExt(BuildReport report) {} - protected override void OnPreprocessBuildExt(BuildReport report) {} + + protected override void OnPreprocessBuildExt(BuildReport report) + { + ApplySettingsOverride(); + } protected override void OnProcessBootConfigExt(BuildReport report, BootConfigBuilder builder) { @@ -29,5 +35,13 @@ protected override void OnProcessBootConfigExt(BuildReport report, BootConfigBui builder.SetBootConfigValue(kLateLatchingSupported, item.lateLatchingMode ? "1" : "0"); builder.SetBootConfigValue(kLateLatchingDebug, item.lateLatchingDebug ? "1" : "0"); } + + private void ApplySettingsOverride() + { + var openXrSettings = OpenXRSettings.GetSettingsForBuildTargetGroup(BuildTargetGroup.Android); + var target = EditorUtils.GetFeatureAsset(); + target.ApplySettingsOverride(openXrSettings); + AssetDatabase.SaveAssetIfDirty(openXrSettings); + } } } \ No newline at end of file diff --git a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRSupportFeatureEditor.cs b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRSupportFeatureEditor.cs index 1e1efca..b2c1733 100644 --- a/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRSupportFeatureEditor.cs +++ b/com.valvesoftware.openxr.utils/Editor/Features/ValveOpenXRSupportFeatureEditor.cs @@ -31,11 +31,12 @@ public override void OnInspectorGUI() EditorGUILayout.PropertyField(lateLatchingModeProp, s_lateLatchingModeLabel); EditorGUILayout.PropertyField(lateLatchingDebugProp, s_lateLatchingDebugLabel); EditorGUIUtility.labelWidth = 0.0f; + serializedObject.ApplyModifiedProperties(); OpenXRSettings androidOpenXRSettings = OpenXRSettings.GetSettingsForBuildTargetGroup(BuildTargetGroup.Android); var serializedOpenXrSettings = new SerializedObject(androidOpenXRSettings); - androidOpenXRSettings.optimizeBufferDiscards = optimizeBufferDiscardsProp.boolValue; + ((ValveOpenXRSupportFeature)target).ApplySettingsOverride(androidOpenXRSettings); serializedOpenXrSettings.ApplyModifiedProperties(); } } diff --git a/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRFoveatedRenderingFeature.cs b/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRFoveatedRenderingFeature.cs index c85e7b3..1b7a1b8 100644 --- a/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRFoveatedRenderingFeature.cs +++ b/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRFoveatedRenderingFeature.cs @@ -184,9 +184,11 @@ public bool GetFoveationEyeTrackedCenter(ref Vector2 leftEye, ref Vector2 rightE } #if UNITY_EDITOR - protected override void GetValidationChecks(List results, BuildTargetGroup target) + protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) { - results.Add(new ValidationRule(this) + base.GetValidationChecks(rules, targetGroup); + + rules.Add(new ValidationRule(this) { message = "This feature is only supported on Vulkan graphics API.", error = true, @@ -211,14 +213,37 @@ protected override void GetValidationChecks(List r fixItMessage = "Set Vulkan as Graphics API" }); +#if UNITY_2023_2_OR_NEWER + rules.Add(new ValidationRule(this) + { + message = "This feature requires the foveated rendering API set to SRP foveation.", + error = true, + checkPredicate = () => + { + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); + if (settings) + { + return settings.foveatedRenderingApi == OpenXRSettings.BackendFovationApi.SRPFoveation; + } + return true; + }, + fixIt = () => + { + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); + settings.foveatedRenderingApi = OpenXRSettings.BackendFovationApi.SRPFoveation; + }, + fixItAutomatic = true, + fixItMessage = "Set SPR foveation as the foveated rendering API." + }); +#endif #if UNITY_6000_0_OR_NEWER - results.Add(new ValidationRule(this) + rules.Add(new ValidationRule(this) { message = "Unity Foveated Rendering feature must be enabled.", error = true, checkPredicate = () => { - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(target); + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); if (settings == null) return false; @@ -227,7 +252,7 @@ protected override void GetValidationChecks(List r }, fixIt = () => { - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(target); + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); if (settings != null) { var foveationFeature = settings.GetFeature(); diff --git a/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRLeptonValidationFeature.cs b/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRLeptonValidationFeature.cs index 05709c4..db8f680 100644 --- a/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRLeptonValidationFeature.cs +++ b/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRLeptonValidationFeature.cs @@ -1,12 +1,7 @@ -using System; using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using UnityEngine; using UnityEngine.XR.OpenXR.Features; using UnityEngine.XR.OpenXR.Features.MetaQuestSupport; using UnityEngine.XR.OpenXR; -using UnityEngine.XR.OpenXR.NativeTypes; #if UNITY_EDITOR using UnityEditor; using UnityEditor.XR.OpenXR.Features; @@ -37,6 +32,8 @@ public class ValveOpenXRLeptonValidationFeature : OpenXRFeature #if UNITY_EDITOR protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) { + base.GetValidationChecks(rules, targetGroup); + var highestMinAndroidApiLevel = AndroidSdkVersions.AndroidApiLevel30; rules.Add(new ValidationRule(this) { diff --git a/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRRenderRegionsFeature.cs b/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRRenderRegionsFeature.cs index 1097f37..fb1c97c 100644 --- a/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRRenderRegionsFeature.cs +++ b/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRRenderRegionsFeature.cs @@ -1,5 +1,5 @@ - using System; +using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine; using UnityEngine.Rendering; @@ -103,144 +103,146 @@ private bool SettingsUseVulkan() return true; } + internal void ApplySettingsOverride(OpenXRSettings openXrSettings) + { + openXrSettings.symmetricProjection = symmetricProjection; +#if UNITY_6000_1_OR_NEWER + openXrSettings.multiviewRenderRegionsOptimizationMode = multiviewRenderRegionsOptimizationMode; +#endif + } - private ValidationRule[] CreateValidationRules(BuildTargetGroup targetGroup) => - - new ValidationRule[] - { - // OptimizeMultiviewRenderRegions (aka MVPVV) only supported on Unity 6.1 onwards + protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) + { + base.GetValidationChecks(rules, targetGroup); + #if UNITY_6000_1_OR_NEWER - new ValidationRule(this) + rules.Add(new ValidationRule(this) + { + // OptimizeMultiviewRenderRegions (aka MVPVV) only supported on Unity 6.1 onwards + message = "Multiview Render Regions Optimizations Mode requires symmetric projection setting turned on.", + checkPredicate = () => + { + if (multiviewRenderRegionsOptimizationMode != OpenXRSettings.MultiviewRenderRegionsOptimizationMode.None) { - message = "Multiview Render Regions Optimizations Mode requires symmetric projection setting turned on.", - checkPredicate = () => - { - if (multiviewRenderRegionsOptimizationMode != OpenXRSettings.MultiviewRenderRegionsOptimizationMode.None) - { - return symmetricProjection; - } - return true; - }, - error = true, - fixIt = () => - { - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); - var feature = settings.GetFeature(); - feature.symmetricProjection = true; - } - }, + return symmetricProjection; + } + return true; + }, + error = true, + fixIt = () => + { + symmetricProjection = true; + } + }); - new ValidationRule(this) + rules.Add(new ValidationRule(this) + { + message = "Multiview Render Regions Optimizations Mode requires Render Mode set to \"Single Pass Instanced / Multi-view\".", + checkPredicate = () => + { + if (multiviewRenderRegionsOptimizationMode != OpenXRSettings.MultiviewRenderRegionsOptimizationMode.None) { - message = "Multiview Render Regions Optimizations Mode requires Render Mode set to \"Single Pass Instanced / Multi-view\".", - checkPredicate = () => - { - if (multiviewRenderRegionsOptimizationMode != OpenXRSettings.MultiviewRenderRegionsOptimizationMode.None) - { - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); - return (settings.renderMode == OpenXRSettings.RenderMode.SinglePassInstanced); - } - return true; - }, - error = true, - fixIt = () => - { - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); - settings.renderMode = OpenXRSettings.RenderMode.SinglePassInstanced; - } - }, + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); + return (settings.renderMode == OpenXRSettings.RenderMode.SinglePassInstanced); + } + return true; + }, + error = true, + fixIt = () => + { + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); + settings.renderMode = OpenXRSettings.RenderMode.SinglePassInstanced; + } + }); - new ValidationRule(this) + rules.Add(new ValidationRule(this) + { + message = "Multiview Render Regions Optimizations Mode needs the Vulkan Graphics API to be the default Graphics API to work at runtime.", + helpText = "The Multiview Render Regions Optimizations Mode feature only works with the Vulkan Graphics API, which needs to be set as the first Graphics API to be loaded at application startup. Choosing other Graphics API may require to switch to Vulkan and restart the application.", + checkPredicate = () => + { + if (multiviewRenderRegionsOptimizationMode != OpenXRSettings.MultiviewRenderRegionsOptimizationMode.None) { - message = "Multiview Render Regions Optimizations Mode needs the Vulkan Graphics API to be the default Graphics API to work at runtime.", - helpText = "The Multiview Render Regions Optimizations Mode feature only works with the Vulkan Graphics API, which needs to be set as the first Graphics API to be loaded at application startup. Choosing other Graphics API may require to switch to Vulkan and restart the application.", - checkPredicate = () => - { - if (multiviewRenderRegionsOptimizationMode != OpenXRSettings.MultiviewRenderRegionsOptimizationMode.None) - { - var graphicsApis = PlayerSettings.GetGraphicsAPIs(BuildTarget.Android); - return graphicsApis[0] == GraphicsDeviceType.Vulkan; - } - return true; - }, - error = false - }, + var graphicsApis = PlayerSettings.GetGraphicsAPIs(BuildTarget.Android); + return graphicsApis[0] == GraphicsDeviceType.Vulkan; + } + return true; + }, + error = false + }); - new ValidationRule(this) - { - message = "Multiview Render Regions Optimizations - All Passes mode is only supported on Unity 6.2+ versions", - checkPredicate = () => - { + rules.Add(new ValidationRule(this) + { + message = "Multiview Render Regions Optimizations - All Passes mode is only supported on Unity 6.2+ versions", + checkPredicate = () => + { #if !UNITY_6000_2_OR_NEWER - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); - if (settings.multiviewRenderRegionsOptimizationMode == OpenXRSettings.MultiviewRenderRegionsOptimizationMode.AllPasses) - return false; + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); + if (settings.multiviewRenderRegionsOptimizationMode == OpenXRSettings.MultiviewRenderRegionsOptimizationMode.AllPasses) + return false; #endif - return true; - }, - error = true, - fixIt = () => - { - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); - var feature = settings.GetFeature(); - feature.multiviewRenderRegionsOptimizationMode = OpenXRSettings.MultiviewRenderRegionsOptimizationMode.FinalPass; - }, - fixItAutomatic = true, - fixItMessage = "Set Multiview Render Regions Optimization Mode to Final Pass." - }, - + return true; + }, + error = true, + fixIt = () => + { + multiviewRenderRegionsOptimizationMode = OpenXRSettings.MultiviewRenderRegionsOptimizationMode.FinalPass; + }, + fixItAutomatic = true, + fixItMessage = "Set Multiview Render Regions Optimization Mode to Final Pass." + }); #endif #if UNITY_ANDROID - new ValidationRule(this) + rules.Add(new ValidationRule(this) + { + message = "Symmetric Projection is only supported on Vulkan graphics API", + checkPredicate = () => + { + if (symmetricProjection && !SettingsUseVulkan()) { - message = "Symmetric Projection is only supported on Vulkan graphics API", - checkPredicate = () => - { - if (symmetricProjection && !SettingsUseVulkan()) - { - return false; - } - return true; - }, - fixIt = () => - { - PlayerSettings.SetGraphicsAPIs(BuildTarget.Android, new[] { GraphicsDeviceType.Vulkan }); - }, - fixItAutomatic = true, - fixItMessage = "Set Vulkan as Graphics API" - }, + return false; + } + return true; + }, + fixIt = () => + { + PlayerSettings.SetGraphicsAPIs(BuildTarget.Android, new[] { GraphicsDeviceType.Vulkan }); + }, + fixItAutomatic = true, + fixItMessage = "Set Vulkan as Graphics API" + }); - new ValidationRule(this) - { - message = "Symmetric Projection is only supported when using Multi-view", - checkPredicate = () => - { - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); - if (null == settings) - return false; + rules.Add(new ValidationRule(this) + { + message = "Symmetric Projection is only supported when using Multi-view", + checkPredicate = () => + { + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); + if (null == settings) + return false; - if (symmetricProjection && (settings.renderMode != OpenXRSettings.RenderMode.SinglePassInstanced)) - { - return false; - } - return true; - }, - fixIt = () => - { - var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); - if (null != settings) - { - settings.renderMode = OpenXRSettings.RenderMode.SinglePassInstanced; - } - }, - error = true, - fixItAutomatic = true, - fixItMessage = "Set Render Mode to Multi-view" - }, + if (symmetricProjection && (settings.renderMode != OpenXRSettings.RenderMode.SinglePassInstanced)) + { + return false; + } + return true; + }, + fixIt = () => + { + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); + if (null != settings) + { + settings.renderMode = OpenXRSettings.RenderMode.SinglePassInstanced; + } + }, + error = true, + fixItAutomatic = true, + fixItMessage = "Set Render Mode to Multi-view" + }); #endif - }; + } internal class ValveOpenXRRenderRegionsFeatureEditorWindow : EditorWindow { diff --git a/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRSupportFeature.cs b/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRSupportFeature.cs index c9efdf5..d824406 100644 --- a/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRSupportFeature.cs +++ b/com.valvesoftware.openxr.utils/Runtime/Features/ValveOpenXRSupportFeature.cs @@ -1,184 +1,190 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using UnityEngine; -using UnityEngine.XR.OpenXR.Features; -using UnityEngine.XR.OpenXR.Features.MetaQuestSupport; -using UnityEngine.XR.OpenXR; -using UnityEngine.XR.OpenXR.NativeTypes; -#if UNITY_EDITOR -using UnityEditor; -using UnityEditor.XR.OpenXR.Features; -#endif - -namespace Valve.OpenXR.Utils -{ - /// - /// Enables the Valve OpenXR Loader support. - /// -#if UNITY_EDITOR - [OpenXRFeature(UiName = "Valve Utils: Settings for Unity's Rendering", - Desc = "Settings for OpenXR Rendering.", - Company = "Valve Software", - DocumentationLink = "https://github.com/ValveSoftware/Unity/blob/main/com.valvesoftware.openxr.utils/Documentation~/index.md#open-xr-features", - OpenxrExtensionStrings = "", - Version = "0.1.0", - BuildTargetGroups = new[] { BuildTargetGroup.Android }, - FeatureId = featureId - )] -#endif - public class ValveOpenXRSupportFeature : OpenXRFeature - { - public const string featureId = "com.valvesoftware.openxr.utils.support"; - - [SerializeField] - [Tooltip("Optimization that allows 4x MSAA textures to be memoryless on Vulkan")] - internal bool optimizeBufferDiscards; - - [SerializeField] - [Tooltip("Vulkan only")] - internal bool lateLatchingMode; - - [SerializeField] - [Tooltip("Vulkan only")] - internal bool lateLatchingDebug; - - private ulong _xrInstance; - private ulong _xrSession; - - private ulong XrInstance => _xrInstance; - private ulong XrSession => _xrSession; - - private delegate XrResult GetInstanceProcAddrDelegate(ulong instance, string name, ref IntPtr procAddr); - private GetInstanceProcAddrDelegate _getInstanceProcAddr; - - private System.Type[] incompatibleFeatureTypes = { typeof(MetaQuestFeature) }; - - internal static ValveOpenXRSupportFeature Instance - { - get - { - OpenXRSettings settings = OpenXRSettings.ActiveBuildTargetInstance; - var features = new List(); - return settings.GetFeatures(features) > 0 ? features.First() : null; - } - } - - #region "Public OpenXR Support" - - public static bool HasOpenXRInstance() { return Instance.XrInstance != 0; } - public static ulong GetOpenXRInstance() { return Instance.XrInstance; } - public static event InstanceCreated OnInstanceCreated; - public static event InstanceDestroyed OnInstanceDestroyed; - - public static bool HasSession() { return Instance.XrSession != 0; } - public static ulong GetSession() { return Instance.XrSession; } - public static event SessionCreated OnSessionCreated; - public static event SessionDestroyed OnSessionDestroyed; - - public static T GetOpenXrInstanceProc(string procName) - { - var instanceProc = GetOpenXrInstanceProc(procName); - - return instanceProc != IntPtr.Zero ? Marshal.GetDelegateForFunctionPointer(instanceProc) : default; - } - - public static IntPtr GetOpenXrInstanceProc(string procName) - { - return Instance.GetOpenXrInstanceProcInternal(procName); - } - - #endregion - - protected override bool OnInstanceCreate(ulong xrInstance) - { - _xrInstance = xrInstance; - OnInstanceCreated?.Invoke(xrInstance); - return true; - } - - protected override void OnInstanceDestroy(ulong xrInstance) - { - OnInstanceDestroyed?.Invoke(xrInstance); - _xrInstance = 0; - } - - protected override void OnSessionCreate(ulong xrSession) - { - _xrSession = xrSession; - OnSessionCreated?.Invoke(_xrSession); - } - - protected override void OnSessionDestroy(ulong xrSession) - { - OnSessionDestroyed?.Invoke(_xrSession); - _xrSession = 0; - } - - private IntPtr GetOpenXrInstanceProcInternal(string procName) - { - if (_getInstanceProcAddr == null) - { - if (xrGetInstanceProcAddr == IntPtr.Zero) - { - Debug.LogWarning($"Unity's OpenXR GetInstance function accessor is invalid!"); - return IntPtr.Zero; - } - - _getInstanceProcAddr = Marshal.GetDelegateForFunctionPointer(xrGetInstanceProcAddr); - } - - IntPtr procAddr = IntPtr.Zero; - - if (_getInstanceProcAddr != null) - { - XrResult result = _getInstanceProcAddr(_xrInstance, procName, ref procAddr); - - if (result < 0) - { - Debug.LogWarning($"Failed to find OpenXR instance function '{procName}'"); - return IntPtr.Zero; - } - } - - return procAddr; - } - - -#if UNITY_EDITOR - protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) - { - rules.Add(new ValidationRule(this) - { - message = "Late latching is only supported on Vulkan graphics API.", - error = true, - checkPredicate = () => (!lateLatchingMode && !lateLatchingDebug) || EditorUtils.UsesVulkan(BuildTarget.Android), - fixIt = () => - { - PlayerSettings.SetGraphicsAPIs(BuildTarget.Android, new[] { UnityEngine.Rendering.GraphicsDeviceType.Vulkan }); - }, - fixItAutomatic = true, - fixItMessage = "Set Vulkan as Graphics API" - }); - } -#endif - } - - internal enum XrStructureType - { - XR_TYPE_FOVEATION_EYE_TRACKED_STATE_META = 1000200001, - } - - [StructLayout(LayoutKind.Sequential)] - public struct XrVector2f - { - public float X; - public float Y; - }; - - public delegate void InstanceCreated(ulong instance); - public delegate void InstanceDestroyed(ulong instance); - public delegate void SessionCreated(ulong session); - public delegate void SessionDestroyed(ulong session); -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using UnityEngine; +using UnityEngine.XR.OpenXR.Features; +using UnityEngine.XR.OpenXR.Features.MetaQuestSupport; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.NativeTypes; +#if UNITY_EDITOR +using UnityEditor; +using UnityEditor.XR.OpenXR.Features; +#endif + +namespace Valve.OpenXR.Utils +{ + /// + /// Enables the Valve OpenXR Loader support. + /// +#if UNITY_EDITOR + [OpenXRFeature(UiName = "Valve Utils: Settings for Unity's Rendering", + Desc = "Settings for OpenXR Rendering.", + Company = "Valve Software", + DocumentationLink = "https://github.com/ValveSoftware/Unity/blob/main/com.valvesoftware.openxr.utils/Documentation~/index.md#open-xr-features", + OpenxrExtensionStrings = "", + Version = "0.1.0", + BuildTargetGroups = new[] { BuildTargetGroup.Android }, + FeatureId = featureId + )] +#endif + public class ValveOpenXRSupportFeature : OpenXRFeature + { + public const string featureId = "com.valvesoftware.openxr.utils.support"; + + [SerializeField] + [Tooltip("Optimization that allows 4x MSAA textures to be memoryless on Vulkan")] + internal bool optimizeBufferDiscards; + + [SerializeField] + [Tooltip("Vulkan only")] + internal bool lateLatchingMode; + + [SerializeField] + [Tooltip("Vulkan only")] + internal bool lateLatchingDebug; + + private ulong _xrInstance; + private ulong _xrSession; + + private ulong XrInstance => _xrInstance; + private ulong XrSession => _xrSession; + + private delegate XrResult GetInstanceProcAddrDelegate(ulong instance, string name, ref IntPtr procAddr); + private GetInstanceProcAddrDelegate _getInstanceProcAddr; + + private System.Type[] incompatibleFeatureTypes = { typeof(MetaQuestFeature) }; + + internal static ValveOpenXRSupportFeature Instance + { + get + { + OpenXRSettings settings = OpenXRSettings.ActiveBuildTargetInstance; + var features = new List(); + return settings.GetFeatures(features) > 0 ? features.First() : null; + } + } + + #region "Public OpenXR Support" + + public static bool HasOpenXRInstance() { return Instance.XrInstance != 0; } + public static ulong GetOpenXRInstance() { return Instance.XrInstance; } + public static event InstanceCreated OnInstanceCreated; + public static event InstanceDestroyed OnInstanceDestroyed; + + public static bool HasSession() { return Instance.XrSession != 0; } + public static ulong GetSession() { return Instance.XrSession; } + public static event SessionCreated OnSessionCreated; + public static event SessionDestroyed OnSessionDestroyed; + + public static T GetOpenXrInstanceProc(string procName) + { + var instanceProc = GetOpenXrInstanceProc(procName); + + return instanceProc != IntPtr.Zero ? Marshal.GetDelegateForFunctionPointer(instanceProc) : default; + } + + public static IntPtr GetOpenXrInstanceProc(string procName) + { + return Instance.GetOpenXrInstanceProcInternal(procName); + } + + #endregion + + protected override bool OnInstanceCreate(ulong xrInstance) + { + _xrInstance = xrInstance; + OnInstanceCreated?.Invoke(xrInstance); + return true; + } + + protected override void OnInstanceDestroy(ulong xrInstance) + { + OnInstanceDestroyed?.Invoke(xrInstance); + _xrInstance = 0; + } + + protected override void OnSessionCreate(ulong xrSession) + { + _xrSession = xrSession; + OnSessionCreated?.Invoke(_xrSession); + } + + protected override void OnSessionDestroy(ulong xrSession) + { + OnSessionDestroyed?.Invoke(_xrSession); + _xrSession = 0; + } + + private IntPtr GetOpenXrInstanceProcInternal(string procName) + { + if (_getInstanceProcAddr == null) + { + if (xrGetInstanceProcAddr == IntPtr.Zero) + { + Debug.LogWarning($"Unity's OpenXR GetInstance function accessor is invalid!"); + return IntPtr.Zero; + } + + _getInstanceProcAddr = Marshal.GetDelegateForFunctionPointer(xrGetInstanceProcAddr); + } + + IntPtr procAddr = IntPtr.Zero; + + if (_getInstanceProcAddr != null) + { + XrResult result = _getInstanceProcAddr(_xrInstance, procName, ref procAddr); + + if (result < 0) + { + Debug.LogWarning($"Failed to find OpenXR instance function '{procName}'"); + return IntPtr.Zero; + } + } + + return procAddr; + } + + +#if UNITY_EDITOR + + internal void ApplySettingsOverride(OpenXRSettings openXrSettings) + { + openXrSettings.optimizeBufferDiscards = optimizeBufferDiscards; + } + + protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) + { + rules.Add(new ValidationRule(this) + { + message = "Late latching is only supported on Vulkan graphics API.", + error = true, + checkPredicate = () => (!lateLatchingMode && !lateLatchingDebug) || EditorUtils.UsesVulkan(BuildTarget.Android), + fixIt = () => + { + PlayerSettings.SetGraphicsAPIs(BuildTarget.Android, new[] { UnityEngine.Rendering.GraphicsDeviceType.Vulkan }); + }, + fixItAutomatic = true, + fixItMessage = "Set Vulkan as Graphics API" + }); + } +#endif + } + + internal enum XrStructureType + { + XR_TYPE_FOVEATION_EYE_TRACKED_STATE_META = 1000200001, + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrVector2f + { + public float X; + public float Y; + }; + + public delegate void InstanceCreated(ulong instance); + public delegate void InstanceDestroyed(ulong instance); + public delegate void SessionCreated(ulong session); + public delegate void SessionDestroyed(ulong session); +} diff --git a/com.valvesoftware.openxr.utils/Runtime/Valve.OpenXR.Utils.asmdef b/com.valvesoftware.openxr.utils/Runtime/Valve.OpenXR.Utils.asmdef index 6a660b9..ec16d5f 100644 --- a/com.valvesoftware.openxr.utils/Runtime/Valve.OpenXR.Utils.asmdef +++ b/com.valvesoftware.openxr.utils/Runtime/Valve.OpenXR.Utils.asmdef @@ -1,34 +1,39 @@ -{ - "name": "Valve.OpenXR.Utils", - "rootNamespace": "", - "references": [ - "Unity.XR.OpenXR", - "Unity.InputSystem", - "Unity.XR.OpenXR.Features.MetaQuestSupport" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [ - { - "name": "com.unity.xr.openxr", - "expression": "1.9.0", - "define": "UNITY_OPENXR_1_9_0" - }, - { - "name": "Unity", - "expression": "6000.0.0", - "define": "USE_XR_DISPLAY_FOVEATION_API" - }, - { - "name": "Unity", - "expression": "[2022.2,6000.0.0)", - "define": "USE_LEGACY_BOOT_CONFIG" - } - ], - "noEngineReferences": false +{ + "name": "Valve.OpenXR.Utils", + "rootNamespace": "", + "references": [ + "Unity.XR.OpenXR", + "Unity.InputSystem", + "Unity.XR.OpenXR.Features.MetaQuestSupport" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.xr.openxr", + "expression": "1.9.0", + "define": "UNITY_OPENXR_1_9_0" + }, + { + "name": "com.unity.xr.openxr", + "expression": "1.5.3", + "define": "UNITY_OPENXR_1_5_3" + }, + { + "name": "Unity", + "expression": "6000.0.0", + "define": "USE_XR_DISPLAY_FOVEATION_API" + }, + { + "name": "Unity", + "expression": "[2022.2,6000.0.0)", + "define": "USE_LEGACY_BOOT_CONFIG" + } + ], + "noEngineReferences": false } \ No newline at end of file diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo.meta new file mode 100644 index 0000000..c9e35c5 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b30c301a3e8b551459afeb8ca98798c7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/README.md b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/README.md new file mode 100644 index 0000000..07c1e47 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/README.md @@ -0,0 +1,9 @@ +# System Info Sample + +This sample demonstrates how to request the headset name from OpenXR and verify the app is running on Steam Frame. + +## Usage + +* Import sample from the Package Manager +* Enable the OpenXR feature in ProjectSettings -> OpenXR (Valve Utils: System Info Sample) +* See the SystemInfoExample scene and SteamFrameCheckSimple script for more details. diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/README.md.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/README.md.meta new file mode 100644 index 0000000..3aaadbe --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 208f7ec4e6ff7e1408676caa2c8e1d69 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes.meta new file mode 100644 index 0000000..71e479d --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 02e2875f9fbef05448a564b116658db6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes/SystemInfoExample.unity b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes/SystemInfoExample.unity new file mode 100644 index 0000000..6da2863 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes/SystemInfoExample.unity @@ -0,0 +1,1831 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 2100000, guid: a2294966a3496b64bb53aecaaf29eb8f, type: 2} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &48142790 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 48142791} + - component: {fileID: 48142794} + - component: {fileID: 48142793} + - component: {fileID: 48142792} + m_Layer: 0 + m_Name: Back Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &48142791 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48142790} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0.70710677, z: 0.70710677, w: 0} + m_LocalPosition: {x: 0, y: 0.5, z: 3.5} + m_LocalScale: {x: 3, y: 0.05, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1278933305} + m_LocalEulerAnglesHint: {x: -90, y: 90, z: 90} +--- !u!65 &48142792 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48142790} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &48142793 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48142790} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &48142794 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48142790} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &83273604 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 83273605} + m_Layer: 0 + m_Name: CheckmarkStates + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &83273605 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 83273604} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 423886535} + - {fileID: 904846746} + - {fileID: 944053464} + m_Father: {fileID: 1449709195} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &423886534 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 423886535} + - component: {fileID: 423886537} + - component: {fileID: 423886536} + m_Layer: 0 + m_Name: Unknown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &423886535 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423886534} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 83273605} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -97.50001, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &423886536 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423886534} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 2100000, guid: e3265ab4bf004d28a9537516768c1c75, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: c53c1530f23d0ca40b6dd3704f90b27b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &423886537 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 423886534} + m_CullTransparentMesh: 1 +--- !u!1 &588475809 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 588475810} + m_Layer: 0 + m_Name: Camera Offset + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &588475810 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588475809} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.1176, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1981365428} + m_Father: {fileID: 1609452151} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &589018149 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 589018150} + m_Layer: 0 + m_Name: HeadsetCheckSimple + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &589018150 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589018149} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.1097, y: 1.24929, z: 3.475} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &613266701 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 613266702} + - component: {fileID: 613266705} + - component: {fileID: 613266704} + - component: {fileID: 613266703} + m_Layer: 0 + m_Name: Ground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &613266702 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 613266701} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.5, z: 1.5} + m_LocalScale: {x: 3, y: 0.05, z: 4} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1278933305} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &613266703 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 613266701} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &613266704 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 613266701} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &613266705 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 613266701} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &866492117 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 866492118} + - component: {fileID: 866492121} + - component: {fileID: 866492120} + - component: {fileID: 866492119} + m_Layer: 0 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &866492118 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 866492117} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1338222086} + m_Father: {fileID: 2122847252} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 300, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &866492119 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 866492117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.GraphicRaycaster + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &866492120 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 866492117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.CanvasScaler + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &866492121 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 866492117} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 0 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &877268222 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 877268223} + - component: {fileID: 877268226} + - component: {fileID: 877268225} + - component: {fileID: 877268224} + m_Layer: 0 + m_Name: Left Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &877268223 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877268222} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: -1.5, y: 0.5, z: 1.5} + m_LocalScale: {x: 2, y: 0.05, z: 4} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1278933305} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!65 &877268224 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877268222} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &877268225 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877268222} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &877268226 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877268222} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &904846745 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 904846746} + - component: {fileID: 904846748} + - component: {fileID: 904846747} + m_Layer: 0 + m_Name: Yes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &904846746 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904846745} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 83273605} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -97.50001, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &904846747 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904846745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 2100000, guid: e3265ab4bf004d28a9537516768c1c75, type: 3} + m_Color: {r: 0, g: 1, b: 0.26161647, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 0394812c1255f9841bc62c1d431407f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &904846748 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904846745} + m_CullTransparentMesh: 1 +--- !u!1 &944053463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 944053464} + - component: {fileID: 944053466} + - component: {fileID: 944053465} + m_Layer: 0 + m_Name: No + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &944053464 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 944053463} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 83273605} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -97.50001, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &944053465 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 944053463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 2100000, guid: e3265ab4bf004d28a9537516768c1c75, type: 3} + m_Color: {r: 1, g: 0.026519261, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 429d013bf9bc6154abdc550badf59e91, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &944053466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 944053463} + m_CullTransparentMesh: 1 +--- !u!1 &1110656103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1110656104} + - component: {fileID: 1110656107} + - component: {fileID: 1110656106} + - component: {fileID: 1110656105} + m_Layer: 0 + m_Name: Right Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &1110656104 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110656103} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 1.5, y: 0.5, z: 1.5} + m_LocalScale: {x: 2, y: 0.05, z: 4} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1278933305} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!65 &1110656105 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110656103} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1110656106 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110656103} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1110656107 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1110656103} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1235526238 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1235526239} + - component: {fileID: 1235526240} + - component: {fileID: 1235526241} + m_Layer: 0 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1235526239 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1235526238} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1449709195} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 15, y: -15} + m_SizeDelta: {x: 30, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1235526240 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1235526238} + m_CullTransparentMesh: 1 +--- !u!114 &1235526241 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1235526238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.4716981, g: 0.4716981, b: 0.4716981, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1278933304 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1278933305} + m_Layer: 0 + m_Name: Environment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1278933305 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278933304} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 613266702} + - {fileID: 1110656104} + - {fileID: 877268223} + - {fileID: 48142791} + - {fileID: 2031574506} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1338222085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1338222086} + - component: {fileID: 1338222088} + - component: {fileID: 1338222087} + m_Layer: 0 + m_Name: MainPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1338222086 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1338222085} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1449709195} + m_Father: {fileID: 866492118} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1338222087 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1338222085} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.9372549} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1338222088 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1338222085} + m_CullTransparentMesh: 1 +--- !u!1 &1449709193 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1449709195} + - component: {fileID: 1449709194} + m_Layer: 0 + m_Name: Toggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1449709194 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1449709193} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Toggle + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 1235526241} + toggleTransition: 1 + graphic: {fileID: 0} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!224 &1449709195 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1449709193} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1235526239} + - {fileID: 1901400940} + - {fileID: 83273605} + m_Father: {fileID: 1338222086} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 225, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1609452148 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1609452151} + - component: {fileID: 1609452150} + - component: {fileID: 1609452149} + m_Layer: 0 + m_Name: XR Origin (VR) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1609452149 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1609452148} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 017c5e3933235514c9520e1dace2a4b2, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Inputs.InputActionManager + m_ActionAssets: + - {fileID: -944628639613478452, guid: c348712bda248c246b8c49b3db54643f, type: 3} +--- !u!114 &1609452150 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1609452148} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e0cb9aa70a22847b5925ee5f067c10a9, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.CoreUtils::Unity.XR.CoreUtils.XROrigin + m_Camera: {fileID: 1981365432} + m_OriginBaseGameObject: {fileID: 1609452148} + m_CameraFloorOffsetObject: {fileID: 588475809} + m_RequestedTrackingOriginMode: 0 + m_CameraYOffset: 1.1176 +--- !u!4 &1609452151 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1609452148} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.5987, z: 0.4069} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 588475810} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1901400939 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1901400940} + - component: {fileID: 1901400942} + - component: {fileID: 1901400941} + m_Layer: 0 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1901400940 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1901400939} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1449709195} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15, y: -0.5} + m_SizeDelta: {x: -40, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1901400941 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1901400939} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Is Steam Frame? +--- !u!222 &1901400942 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1901400939} + m_CullTransparentMesh: 1 +--- !u!1 &1981365427 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1981365428} + - component: {fileID: 1981365432} + - component: {fileID: 1981365431} + - component: {fileID: 1981365430} + - component: {fileID: 1981365429} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1981365428 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981365427} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.336} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 588475810} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1981365429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981365427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!114 &1981365430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981365427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2fadf230d1919748a9aa21d40f74619, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.XR.TrackedPoseDriver + m_TrackingType: 0 + m_UpdateType: 0 + m_IgnoreTrackingState: 0 + m_PositionInput: + m_UseReference: 0 + m_Action: + m_Name: Position + m_Type: 0 + m_ExpectedControlType: Vector3 + m_Id: fd26b093-ee40-45a1-bc6f-a74712ef2bb6 + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 686f9d92-cdd3-4c23-83cf-870f4ed41899 + m_Path: /centerEyePosition + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position + m_Flags: 0 + - m_Name: + m_Id: 8273fcdb-70fa-4f5a-b0a1-90eed0f1482d + m_Path: /devicePosition + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_RotationInput: + m_UseReference: 0 + m_Action: + m_Name: Rotation + m_Type: 0 + m_ExpectedControlType: Quaternion + m_Id: d2662bb4-e953-490f-a8c0-1f8c0e5af3da + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 5641c0f9-2ec8-40bc-8dcb-c8e0cc789089 + m_Path: /centerEyeRotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation + m_Flags: 0 + - m_Name: + m_Id: fbb2edd2-e20d-42c4-9f31-aab63502b901 + m_Path: /deviceRotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_TrackingStateInput: + m_UseReference: 0 + m_Action: + m_Name: Tracking State + m_Type: 0 + m_ExpectedControlType: Integer + m_Id: 479df8de-6f57-4be8-9c72-ed4657f0255f + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: af6bda2b-e1a9-4261-90cf-f0f89c979731 + m_Path: /trackingState + m_Interactions: + m_Processors: + m_Groups: + m_Action: Tracking State + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_PositionAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: c254c082-f1e5-4e90-bc47-4cc9e5dde146 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_RotationAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: cc05427e-eeb7-482d-a0da-a9684a430699 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 +--- !u!81 &1981365431 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981365427} + m_Enabled: 1 +--- !u!20 &1981365432 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981365427} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.01 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &2031574505 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2031574506} + - component: {fileID: 2031574509} + - component: {fileID: 2031574508} + - component: {fileID: 2031574507} + m_Layer: 0 + m_Name: Front Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &2031574506 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2031574505} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0.70710677, z: 0.70710677, w: 0} + m_LocalPosition: {x: 0, y: 0.5, z: -0.5} + m_LocalScale: {x: 3, y: 0.05, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1278933305} + m_LocalEulerAnglesHint: {x: -90, y: 90, z: 90} +--- !u!65 &2031574507 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2031574505} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &2031574508 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2031574505} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &2031574509 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2031574505} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2122847250 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2122847252} + - component: {fileID: 2122847251} + m_Layer: 0 + m_Name: 'HeadsetCheckUI ' + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2122847251 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2122847250} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 427e93331a51cd04d9bedd4418ac0e3f, type: 3} + m_Name: + m_EditorClassIdentifier: SystemInfoExample::FrameCheck + _states: + - {fileID: 423886534} + - {fileID: 904846745} + - {fileID: 944053463} +--- !u!4 &2122847252 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2122847250} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.5, z: 1.5} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 866492118} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1609452151} + - {fileID: 1278933305} + - {fileID: 589018150} + - {fileID: 2122847252} diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes/SystemInfoExample.unity.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes/SystemInfoExample.unity.meta new file mode 100644 index 0000000..873390e --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scenes/SystemInfoExample.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c0f2b840826d186499da92cf3746aef9 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts.meta new file mode 100644 index 0000000..41fd6ad --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 396994d8721992d4e997d4c934b29d96 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheck.cs b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheck.cs new file mode 100644 index 0000000..ea44d5d --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheck.cs @@ -0,0 +1,43 @@ +using UnityEngine; +using Valve.OpenXR.Utils; + +public class SteamFrameCheck : MonoBehaviour +{ + enum CheckState { Unknown, Yes, No } + + [SerializeField] + private GameObject[] _states; + + private bool _firstTime = true; + + private void Awake() + { + SetToggleState(CheckState.Unknown); + } + + private void Update() + { + if (_firstTime) + { + if (SystemInfoFeature.IsInitialized()) + { + bool isRunningOnFrame = SystemInfoFeature.IsRunnginOnSteamFrame(); + SetToggleState(isRunningOnFrame ? CheckState.Yes : CheckState.No); + _firstTime = false; + } + } + } + + private void SetToggleState(CheckState state) + { + var stateIndex = (int)state; + + if (stateIndex < _states.Length) + { + for (int i = 0; i < _states.Length; i++) + { + _states[i].gameObject.SetActive(i == stateIndex); + } + } + } +} diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheck.cs.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheck.cs.meta new file mode 100644 index 0000000..3718e68 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheck.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 427e93331a51cd04d9bedd4418ac0e3f \ No newline at end of file diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheckSimple.cs b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheckSimple.cs new file mode 100644 index 0000000..acdd501 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheckSimple.cs @@ -0,0 +1,23 @@ +using System.Collections; +using UnityEngine; +using Valve.OpenXR.Utils; + +public class SteamFrameCheckSimple : MonoBehaviour +{ + private IEnumerator Start() + { + bool done = false; + + while (!done) + { + if (SystemInfoFeature.IsInitialized()) + { + bool isRunningOnFrame = SystemInfoFeature.IsRunnginOnSteamFrame(); + Debug.Log($"Is running on Steam Frame? {(isRunningOnFrame?"y":"n")}"); + done = true; + } + + yield return null; + } + } +} diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheckSimple.cs.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheckSimple.cs.meta new file mode 100644 index 0000000..25df8f7 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SteamFrameCheckSimple.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 83cdcc9730a145f4c98cceb85f27b1d9 diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoExample.asmdef b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoExample.asmdef new file mode 100644 index 0000000..966644e --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoExample.asmdef @@ -0,0 +1,17 @@ +{ + "name": "SystemInfoExample", + "rootNamespace": "", + "references": [ + "GUID:4920cda478a7ad9418e70a29fd7c1eae", + "GUID:4847341ff46394e83bb78fbd0652937e" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoExample.asmdef.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoExample.asmdef.meta new file mode 100644 index 0000000..884b154 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoExample.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 723953874d47e0b42ba0a0b2eecdc3b7 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoFeature.cs b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoFeature.cs new file mode 100644 index 0000000..c209839 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoFeature.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using UnityEngine; +#if UNITY_EDITOR +using UnityEditor; +#endif +using UnityEngine.XR.OpenXR.Features; +using UnityEngine.XR.OpenXR; + +namespace Valve.OpenXR.Utils +{ + #if UNITY_EDITOR + [UnityEditor.XR.OpenXR.Features.OpenXRFeature(UiName = "Valve Utils: System Info Sample", + Desc = "Support for querying the system info.", + Company = "Valve Software", + DocumentationLink = "https://github.com/ValveSoftware/Unity/blob/main/com.valvesoftware.openxr.utils/Documentation~/index.md#open-xr-features", + Version = "0.1.0", + BuildTargetGroups = new[] { BuildTargetGroup.Standalone, BuildTargetGroup.Android }, + OpenxrExtensionStrings = "", + FeatureId = featureId)] + #endif + public class SystemInfoFeature : OpenXRFeature + { + public const string featureId = "com.valvesoftware.openxr.utils.sysinfo"; + + private ulong _xrInstance; + private ulong _xrSystemId; + private PFN_xrGetSystemProperties _xrGetSystemProperties; + + private static SystemInfoFeature Instance => OpenXRSettings.ActiveBuildTargetInstance.GetFeature(); + + protected override bool OnInstanceCreate(ulong xrInstance) + { + _xrInstance = xrInstance; + _xrGetSystemProperties = ValveOpenXRSupportFeature.GetOpenXrInstanceProc("xrGetSystemProperties"); + return base.OnInstanceCreate(xrInstance); + } + + protected override void OnSystemChange(ulong xrSystem) + { + _xrSystemId = xrSystem; + base.OnSystemChange(xrSystem); + } + +#if UNITY_EDITOR + protected override void OnEnabledChange() + { + if (enabled) + { + var supportFeature = OpenXRSettings.ActiveBuildTargetInstance.GetFeature(); + supportFeature.enabled = true; + } + } + + protected override void GetValidationChecks(List results, BuildTargetGroup target) + { + results.Add(new ValidationRule(this) + { + message = "Valve Utils rendering feature must be enabled.", + error = true, + checkPredicate = () => + { + var supportFeature = OpenXRSettings.ActiveBuildTargetInstance.GetFeature(); + return supportFeature.enabled; + }, + fixIt = () => + { + var supportFeature = OpenXRSettings.ActiveBuildTargetInstance.GetFeature(); + supportFeature.enabled = true; + }, + fixItAutomatic = true, + fixItMessage = "Enable Valve Utils rendering feature" + }); + } +#endif + + public static bool IsInitialized() + { + return Instance.IsInitializedInternal(); + } + + public static bool IsRunnginOnSteamFrame() + { + string steamVRFamilyKey = "SteamVR/OpenXR"; + string steamVRDriverKey = "cv"; + + return Instance.DoesHeadsetMatch(steamVRFamilyKey, steamVRDriverKey); + } + + public static string GetHeadsetName() + { + return Instance.GetHeadsetNameFromOpenXR(); + } + + private string GetHeadsetNameFromOpenXR() + { + string systemName = null; + + if (_xrInstance != 0 && _xrSystemId != 0 && _xrGetSystemProperties != null) + { + XrSystemProperties properties = new XrSystemProperties + { + type = XrStructureType.XR_TYPE_SYSTEM_PROPERTIES + }; + + _xrGetSystemProperties(_xrInstance, _xrSystemId, ref properties); + + systemName = properties.systemName; + } + + return systemName; + } + + private bool DoesHeadsetMatch(string familyKey, string driverKey) + { + string headsetName = GetHeadsetName(); + + Debug.Log($"DoesHeadsetMatch - {headsetName}"); + + if (!string.IsNullOrEmpty(headsetName)) + { + string pattern = @"^(?[^:]+)\s*:\s*(?.+)$"; + Match match = Regex.Match(headsetName, pattern); + + if (match.Success) + { + string family = match.Groups["family"].Value.Trim(); + string driver = match.Groups["driver"].Value.Trim(); + + return family.Equals(familyKey, StringComparison.OrdinalIgnoreCase) && + driver.Equals(driverKey, StringComparison.OrdinalIgnoreCase); + } + } + + return false; + } + + private bool IsInitializedInternal() + { + return enabled && _xrInstance != 0 && _xrSystemId != 0 && _xrGetSystemProperties != null; + } + + #region OpenXR Structures + + public enum XrStructureType : uint + { + XR_TYPE_SYSTEM_PROPERTIES = 5, + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSystemProperties + + { + private const int XR_MAX_SYSTEM_NAME_SIZE = 256; + public XrStructureType type; + public IntPtr next; + public ulong systemId; // XrSystemId + public uint vendorId; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = XR_MAX_SYSTEM_NAME_SIZE)] + public string systemName; + public XrSystemGraphicsProperties graphicsProperties; + public XrSystemTrackingProperties trackingProperties; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSystemGraphicsProperties + { + public uint maxSwapchainImageHeight; + public uint maxSwapchainImageWidth; + public uint maxLayerCount; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct XrSystemTrackingProperties + { + public uint orientationTracking; + public uint positionTracking; + }; + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int PFN_xrGetSystemProperties(ulong instance, ulong systemId, ref XrSystemProperties properties); + + #endregion + } +} \ No newline at end of file diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoFeature.cs.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoFeature.cs.meta new file mode 100644 index 0000000..55024a4 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/Scripts/SystemInfoFeature.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 92d72486042652b4394a9029d7523d89 \ No newline at end of file diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI.meta new file mode 100644 index 0000000..431b4d7 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 664c85acf07cee04f82f468e9e6e3f3d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/checkmark.png b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/checkmark.png new file mode 100644 index 0000000..734a0a2 Binary files /dev/null and b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/checkmark.png differ diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/checkmark.png.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/checkmark.png.meta new file mode 100644 index 0000000..376c4e5 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/checkmark.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: 0394812c1255f9841bc62c1d431407f8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 16 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/question_mark.png b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/question_mark.png new file mode 100644 index 0000000..9b46c16 Binary files /dev/null and b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/question_mark.png differ diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/question_mark.png.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/question_mark.png.meta new file mode 100644 index 0000000..67b4fcc --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/question_mark.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: c53c1530f23d0ca40b6dd3704f90b27b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 16 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/red_x.png b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/red_x.png new file mode 100644 index 0000000..39bbf98 Binary files /dev/null and b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/red_x.png differ diff --git a/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/red_x.png.meta b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/red_x.png.meta new file mode 100644 index 0000000..bb6d4a7 --- /dev/null +++ b/com.valvesoftware.openxr.utils/Samples~/SystemInfo/UI/red_x.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: 429d013bf9bc6154abdc550badf59e91 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 16 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.valvesoftware.openxr.utils/package.json b/com.valvesoftware.openxr.utils/package.json index b4ec618..3f273d3 100644 --- a/com.valvesoftware.openxr.utils/package.json +++ b/com.valvesoftware.openxr.utils/package.json @@ -1,7 +1,7 @@ { "name": "com.valvesoftware.openxr.utils", "displayName": "Valve OpenXR Utilities", - "version": "1.0.2", + "version": "1.0.3", "description": "The Valve OpenXR Utilities package provides support for OpenXR projects and their access to Unity's OpenXR functionality.", "dependencies": { "com.unity.xr.openxr": "1.10.0", @@ -24,6 +24,11 @@ "displayName": "Refresh Rate", "description": "Demonstrates how to request an OpenXR instance procedure and query the current refresh rate.", "path": "Samples~/RefreshRate" + }, + { + "displayName": "System Info", + "description": "Demonstrates how to request the headset name from OpenXR and verify the app is running on Steam Frame.", + "path": "Samples~/SystemInfo" } ] } \ No newline at end of file