コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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"));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
    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);
            }
        }
    }
コード例 #7
0
        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();
        }
コード例 #8
0
        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}");
        }
コード例 #9
0
        public void GetFeatureByFeatureId()
        {
            var feature = FeatureHelpers.GetFeatureWithIdForActiveBuildTarget(MockRuntime.featureId);

            Assert.IsNotNull(feature);
        }
コード例 #10
0
    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);
            }
        }
    }
コード例 #11
0
 protected override void CreateXRSettingsInstance()
 {
     FeatureHelpers.RefreshFeatures(EditorUserBuildSettings.selectedBuildTargetGroup);
     xrSettings = OpenXRSettings.ActiveBuildTargetInstance;
 }