private static void SetUpAppRemoting(BuildTargetGroup targetGroup) { Debug.Log($"Setting up app remoting for {targetGroup}"); const string AppRemotingPlugin = "Microsoft.MixedReality.OpenXR.Remoting.AppRemotingPlugin"; Type appRemotingFeature = typeof(AppRemoting).Assembly.GetType(AppRemotingPlugin); if (appRemotingFeature == null) { Debug.LogError($"Could not find {AppRemotingPlugin}. Has this class been removed or renamed?"); return; } FeatureHelpers.RefreshFeatures(targetGroup); OpenXRFeature feature = OpenXRSettings.ActiveBuildTargetInstance.GetFeature(appRemotingFeature); if (feature == null) { Debug.LogError($"Could not load {AppRemotingPlugin} as an OpenXR feature. Has this class been removed or renamed?"); return; } feature.enabled = true; XRGeneralSettings settings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(targetGroup); if (settings != null) { settings.InitManagerOnStart = false; } }
private static void Install() { EditorApplication.update -= Install; // Automatically enable the feature FeatureHelpers.RefreshFeatures(BuildTargetGroup.Standalone); var feature = OpenXRSettings.Instance.GetFeature <InterceptCreateSessionFeature>(); if (feature != null) { feature.enabled = true; } // Find this script in the asset database var source = AssetDatabase .FindAssets(Path.GetFileNameWithoutExtension(k_SamplePath)) .Select(AssetDatabase.GUIDToAssetPath) .FirstOrDefault(r => r.Contains(k_SamplePath)); // Self destruct if (!string.IsNullOrEmpty(source)) { AssetDatabase.DeleteAsset(source); } }
static MeshingFeatureInstaller() { // Automatically enable the feature FeatureHelpers.RefreshFeatures(BuildTargetGroup.Standalone); var feature = OpenXRSettings.Instance.GetFeature <MeshingTeapotFeature>(); if (feature != null) { feature.enabled = true; } // Find the subsystem manifest to figure out where the sample was installed var source = AssetDatabase .FindAssets(Path.GetFileNameWithoutExtension(k_MeshingFeaturePath)) .Select(AssetDatabase.GUIDToAssetPath) .FirstOrDefault(r => r.Contains(k_MeshingFeaturePath)); if (string.IsNullOrEmpty(source)) { Debug.LogError(k_ErrorMessage); return; } // Extract the `UnitySubsystemsManifest.json` from the path source = Path.GetDirectoryName(source); // Target path is 'Assets/<sample folder name>` var target = Path.Combine("Assets", Path.GetFileNameWithoutExtension(source)); // Attempt to move the entire folder var moveResult = AssetDatabase.MoveAsset(source, target); if (!string.IsNullOrWhiteSpace(moveResult)) { Debug.LogError(moveResult); return; } Debug.Log($"Moved '{source}' to '{target}"); if (EditorUtility.DisplayDialog("Warning", k_DialogText, "Yes", "No")) { // Restart editor. var editorApplicationType = typeof(EditorApplication); var requestCloseAndRelaunchWithCurrentArgumentsMethod = editorApplicationType.GetMethod("RequestCloseAndRelaunchWithCurrentArguments", BindingFlags.NonPublic | BindingFlags.Static); if (requestCloseAndRelaunchWithCurrentArgumentsMethod == null) { throw new MissingMethodException(editorApplicationType.FullName, "RequestCloseAndRelaunchWithCurrentArguments"); } requestCloseAndRelaunchWithCurrentArgumentsMethod.Invoke(null, null); } // Self destruct AssetDatabase.DeleteAsset(Path.Combine(Path.GetDirectoryName(source), "Editor")); }
public void GetFeatureByUnknownFeatureIdReturnsNull() { var feature = FeatureHelpers.GetFeatureWithIdForActiveBuildTarget("some.unknown.feature.id"); Assert.IsNull(feature); feature = FeatureHelpers.GetFeatureWithIdForActiveBuildTarget(""); Assert.IsNull(feature); feature = FeatureHelpers.GetFeatureWithIdForActiveBuildTarget(null); Assert.IsNull(feature); }
public void GetFeaturesWithIdsReturnsFeatures() { var featureIds = new string[] { MockRuntime.featureId, EyeGazeInteraction.featureId }; var features = FeatureHelpers.GetFeaturesWithIdsForActiveBuildTarget(featureIds); Assert.IsNotNull(features); Assert.IsTrue(features.Length == 2); var expectedTypes = new Type[] { typeof(MockRuntime), typeof(EyeGazeInteraction) }; foreach (var feature in features) { Assert.IsTrue(Array.IndexOf(expectedTypes, feature.GetType()) > -1); } }
static void BuildSamples() { string resultDir = Path.Combine("..", "OpenXR Samples"); string projSamplesDir = "Assets/Sample"; PlayerSettings.colorSpace = ColorSpace.Linear; FeatureHelpers.RefreshFeatures(EditorUserBuildSettings.selectedBuildTargetGroup); foreach (var setup in buildTargetSetup) { var sampleName = new DirectoryInfo(projSamplesDir).GetDirectories()[0].Name; if (setup.sampleRegex != null && !setup.sampleRegex.Match(sampleName).Success) { continue; } if (EditorUserBuildSettings.activeBuildTarget != setup.buildTarget) { continue; } string outputDir = Path.Combine(resultDir, setup.buildTarget.ToString()); string identifier = "com.openxr." + sampleName + "." + setup.outputPostfix; PlayerSettings.SetApplicationIdentifier(setup.targetGroup, identifier); PlayerSettings.productName = "OpenXR " + sampleName + " " + setup.outputPostfix; Console.WriteLine("=========== Setting up player settings (changing graphics apis)"); string outputFile = Path.Combine(outputDir, PlayerSettings.productName + GetBuildFileExt(setup.buildTarget)); setup.setupPlayerSettings(outputFile, identifier); BuildPlayerOptions buildOptions = new BuildPlayerOptions { scenes = Directory.GetFiles(projSamplesDir, "*.unity", SearchOption.AllDirectories), target = setup.buildTarget, targetGroup = setup.targetGroup, locationPathName = outputFile, }; Console.WriteLine($"=========== Building {sampleName} {setup.buildTarget}_{setup.outputPostfix}"); var report = BuildPipeline.BuildPlayer(buildOptions); Console.WriteLine($"=========== Build Result {sampleName} {setup.buildTarget}_{setup.outputPostfix} {report.summary.result}"); if (report.summary.result == BuildResult.Failed) { EditorApplication.Exit(1); } } }
void OnGUI() { InitStyles(); var debuggerFeatureInfo = FeatureHelpers.GetFeatureWithIdForActiveBuildTarget("com.unity.openxr.features.runtimedebugger"); if (!debuggerFeatureInfo.enabled) { EditorGUILayout.BeginVertical(); EditorGUILayout.Space(); EditorGUILayout.LabelField("OpenXR Runtime Debugger must be enabled for this build target.", Styles.s_Wrap); EditorGUILayout.Space(); if (GUILayout.Button("Enable Runtime Debugger")) { debuggerFeatureInfo.enabled = true; } EditorGUILayout.EndVertical(); return; } PlayerConnectionGUILayout.ConnectionTargetSelectionDropdown(state); GUILayout.BeginHorizontal(); if (GUILayout.Button("Refresh")) { DebuggerState.SetDoneCallback(() => { if (treeViewState == null) { treeViewState = new TreeViewState(); } treeView = new DebuggerTreeView(treeViewState); var debugger = OpenXRSettings.ActiveBuildTargetInstance.GetFeature <RuntimeDebuggerOpenXRFeature>(); if (debugger != null) { _lastRefreshStats = $"Last payload size: {DebuggerState._lastPayloadSize} ({((100.0f * DebuggerState._lastPayloadSize / debugger.cacheSize)):F2}% cache full) Number of Frames: {DebuggerState._frameCount}"; } else { _lastRefreshStats = $"Last payload size: {DebuggerState._lastPayloadSize} Number of Frames: {DebuggerState._frameCount}"; } }); _lastRefreshStats = "Refreshing ..."; if (EditorApplication.isPlaying) { var debugger = OpenXRSettings.Instance.GetFeature <RuntimeDebuggerOpenXRFeature>(); if (debugger.enabled) { debugger.RecvMsg(new MessageEventArgs()); } } else { EditorConnection.instance.Send(RuntimeDebuggerOpenXRFeature.kEditorToPlayerRequestDebuggerOutput, new byte[] { byte.MinValue }); } } if (GUILayout.Button("Clear")) { Clear(); } if (GUILayout.Button(EditorGUIUtility.IconContent("d_SaveAs"))) { string path = EditorUtility.SaveFilePanel("Save OpenXR Dump", "", state.connectionName, "openxrdump"); if (path.Length != 0) { DebuggerState.SaveToFile(path); } } if (GUILayout.Button(EditorGUIUtility.IconContent("d_FolderOpened Icon"))) { string path = EditorUtility.OpenFilePanelWithFilters("Load OpenXR Dump", "", new [] { "OpenXR Dump", "openxrdump" }); if (path.Length != 0) { Clear(); DebuggerState.SetDoneCallback(() => { if (treeViewState == null) { treeViewState = new TreeViewState(); } treeView = new DebuggerTreeView(treeViewState); _lastRefreshStats = $"Last payload size: {DebuggerState._lastPayloadSize} Number of Frames: {DebuggerState._frameCount}"; }); DebuggerState.LoadFromFile(path); } } GUILayout.EndHorizontal(); GUILayout.Label($"Connections: {EditorConnection.instance.ConnectedPlayers.Count}"); GUILayout.Label(_lastRefreshStats); scrollpos = GUILayout.BeginScrollView(scrollpos); if (treeView != null) { var treeRect = GUILayoutUtility.GetRect(position.width, treeView.totalHeight); treeView.OnGUI(treeRect); } GUILayout.EndScrollView(); }
private void ApplySelectedConfiguration(MixedRealityProjectConfiguration selectedMRConfiguration) { bool remoting = false; BuildTargetGroup targetGroup; switch (selectedMRConfiguration) { case MixedRealityProjectConfiguration.RunNativelyOnHL2: targetGroup = BuildTargetGroup.WSA; EditorUserBuildSettings.SwitchActiveBuildTargetAsync(BuildTargetGroup.WSA, BuildTarget.WSAPlayer); EditorUserBuildSettings.wsaBuildAndRunDeployTarget = WSABuildAndRunDeployTarget.DevicePortal; EditorUserBuildSettings.wsaArchitecture = "ARM64"; break; case MixedRealityProjectConfiguration.RunNativelyOnPCVR: targetGroup = BuildTargetGroup.Standalone; EditorUserBuildSettings.SwitchActiveBuildTargetAsync(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64); break; case MixedRealityProjectConfiguration.RunRemotelyOnUWP: remoting = true; targetGroup = BuildTargetGroup.WSA; EditorUserBuildSettings.SwitchActiveBuildTargetAsync(BuildTargetGroup.WSA, BuildTarget.WSAPlayer); EditorUserBuildSettings.wsaBuildAndRunDeployTarget = WSABuildAndRunDeployTarget.LocalMachine; EditorUserBuildSettings.wsaArchitecture = "Intel64"; // Player Capabilities UnityEditor.PlayerSettings.WSA.SetCapability(UnityEditor.PlayerSettings.WSACapability.InternetClient, true); UnityEditor.PlayerSettings.WSA.SetCapability(UnityEditor.PlayerSettings.WSACapability.InternetClientServer, true); UnityEditor.PlayerSettings.WSA.SetCapability(UnityEditor.PlayerSettings.WSACapability.PrivateNetworkClientServer, true); break; case MixedRealityProjectConfiguration.RunRemotelyOnWin32: remoting = true; targetGroup = BuildTargetGroup.Standalone; EditorUserBuildSettings.SwitchActiveBuildTargetAsync(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64); break; default: return; } const string AppRemotingPlugin = "Microsoft.MixedReality.OpenXR.Remoting.AppRemotingPlugin"; Type appRemotingFeature = typeof(AppRemoting).Assembly.GetType(AppRemotingPlugin); if (appRemotingFeature == null) { Debug.LogError($"Could not find {AppRemotingPlugin}. Has this class been removed or renamed?"); return; } FeatureHelpers.RefreshFeatures(targetGroup); OpenXRFeature feature = OpenXRSettings.ActiveBuildTargetInstance.GetFeature(appRemotingFeature); if (feature == null) { Debug.LogError($"Could not load {AppRemotingPlugin} as an OpenXR feature. Has this class been removed or renamed?"); return; } feature.enabled = remoting; XRGeneralSettings settings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(targetGroup); if (settings != null) { settings.InitManagerOnStart = !remoting; } Debug.Log($"Set up complete for {selectedMRConfiguration}"); }
public void GetFeatureByFeatureId() { var feature = FeatureHelpers.GetFeatureWithIdForActiveBuildTarget(MockRuntime.featureId); Assert.IsNotNull(feature); }
static void BuildSamples() { string resultDir = GetResultDir(); Console.WriteLine("Result Dir: " + resultDir); var sampleName = "Unknown Sample"; var projSamplesDir = new DirectoryInfo("Assets/Sample"); if (projSamplesDir.Exists) { // Use the directory name in the samples directory, if it exists sampleName = projSamplesDir.GetDirectories()[0].Name; } else { // Otherwise use the current folder as the project name projSamplesDir = new DirectoryInfo("Assets"); sampleName = new DirectoryInfo(".").Name; } PlayerSettings.colorSpace = ColorSpace.Linear; FeatureHelpers.RefreshFeatures(EditorUserBuildSettings.selectedBuildTargetGroup); foreach (var setup in buildTargetSetup) { if (setup.sampleRegex != null && !setup.sampleRegex.Match(sampleName).Success) { continue; } if (EditorUserBuildSettings.activeBuildTarget != setup.buildTarget) { continue; } string outputDir = Path.Combine(resultDir, setup.buildTarget.ToString()); string identifier = "com.openxr." + sampleName + "." + setup.outputPostfix; PlayerSettings.SetApplicationIdentifier(setup.targetGroup, identifier); PlayerSettings.productName = "OpenXR " + sampleName + " " + setup.outputPostfix; Console.WriteLine("=========== Setting up player settings (changing graphics apis)"); string outputFile = Path.Combine(outputDir, PlayerSettings.productName + GetBuildFileExt(setup.buildTarget)); setup.setupPlayerSettings(outputFile, identifier); // Get the list of scenes set in build settings in the project var scenes = EditorBuildSettings.scenes.Where(s => s.enabled).Select(s => s.path).ToArray(); // If there aren't any, just build all of the scenes found in the sample if (scenes.Length == 0) { scenes = Directory.GetFiles(projSamplesDir.FullName, "*.unity", SearchOption.AllDirectories); } BuildPlayerOptions buildOptions = new BuildPlayerOptions { scenes = scenes, target = setup.buildTarget, targetGroup = setup.targetGroup, locationPathName = outputFile, }; Console.WriteLine($"=========== Building {sampleName} {setup.buildTarget}_{setup.outputPostfix}"); var report = BuildPipeline.BuildPlayer(buildOptions); Console.WriteLine($"=========== Build Result {sampleName} {setup.buildTarget}_{setup.outputPostfix} {report.summary.result}"); if (report.summary.result == BuildResult.Failed) { EditorApplication.Exit(1); } } }
protected override void CreateXRSettingsInstance() { FeatureHelpers.RefreshFeatures(EditorUserBuildSettings.selectedBuildTargetGroup); xrSettings = OpenXRSettings.ActiveBuildTargetInstance; }