|
|
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Text.RegularExpressions;
- using System.Threading;
- using UnityEditor;
- using UnityEngine;
- using UnityEngine.Networking;
-
- namespace Assets.Oculus.VR.Editor
- {
- public class OVRPlatformTool : EditorWindow
- {
- public enum TargetPlatform
- {
- Rift,
- OculusGoGearVR,
- Quest,
- None,
- };
-
- const string urlPlatformUtil =
- "https://www.oculus.com/download_app/?id=1076686279105243";
-
- static private Process ovrPlatUtilProcess;
- Vector2 commandMenuScroll;
- Vector2 debugLogScroll;
-
- static public string log;
-
- private static bool activeProcess = false;
- private static bool ranSelfUpdate = false;
- private static int retryCount = 0;
- private static string appToken;
-
- private const float buttonPadding = 5.0f;
-
- private bool showOptionalCommands = false;
- private bool show2DCommands = false;
- private bool showExpansionFileCommands = false;
- private bool showRedistCommands = false;
-
- private const float INDENT_SPACING = 15f;
- private const float SINGLE_LINE_SPACING = 18f;
- private const float ASSET_CONFIG_BACKGROUND_PADDING = 10f;
- private const float DEFAULT_LABEL_WIDTH = 180f;
- private const int MAX_DOWNLOAD_RETRY_COUNT = 2;
-
- private static GUIStyle boldFoldoutStyle;
-
- string[] platformOptions = new string[]
- {
- "Oculus Rift",
- "Oculus Go | Gear VR",
- "Oculus Quest"
- };
-
- string[] gamepadOptions = new string[]
- {
- "Off",
- "Twinstick",
- "Right D Pad",
- "Left D Pad"
- };
-
- [MenuItem("Oculus/Tools/Oculus Platform Tool")]
- static void Init()
- {
- OVRPlatformTool.log = string.Empty;
- // Get existing open window or if none, make a new one:
- EditorWindow.GetWindow(typeof(OVRPlatformTool));
-
- // Populate initial target platform value based on OVRDeviceSelector
- #if UNITY_ANDROID
- if (OVRDeviceSelector.isTargetDeviceQuest)
- {
- OVRPlatformToolSettings.TargetPlatform = TargetPlatform.Quest;
- }
- else
- {
- OVRPlatformToolSettings.TargetPlatform = TargetPlatform.OculusGoGearVR;
- }
- #else
- OVRPlatformToolSettings.TargetPlatform = TargetPlatform.Rift;
- #endif
- EditorUtility.SetDirty(OVRPlatformToolSettings.Instance);
-
- // Load redist packages by calling list-redists in the CLI
- string dataPath = Application.dataPath;
- var thread = new Thread(delegate () {
- retryCount = 0;
- LoadRedistPackages(dataPath);
- });
- thread.Start();
-
- OVRPlugin.SendEvent("oculus_platform_tool", "show_window");
- }
-
- void OnGUI()
- {
- if (boldFoldoutStyle == null)
- {
- boldFoldoutStyle = new GUIStyle(EditorStyles.foldout);
- boldFoldoutStyle.fontStyle = FontStyle.Bold;
- }
-
- EditorGUIUtility.labelWidth = DEFAULT_LABEL_WIDTH;
-
- GUILayout.Label("OVR Platform Tool", EditorStyles.boldLabel);
- this.titleContent.text = "OVR Platform Tool";
-
- GUIContent TargetPlatformLabel = new GUIContent("Target Oculus Platform");
- OVRPlatformToolSettings.TargetPlatform = (TargetPlatform)MakePopup(TargetPlatformLabel, (int)OVRPlatformToolSettings.TargetPlatform, platformOptions);
- SetOVRProjectConfig(OVRPlatformToolSettings.TargetPlatform);
- SetDirtyOnGUIChange();
-
- commandMenuScroll = EditorGUILayout.BeginScrollView(commandMenuScroll, GUILayout.Height(Screen.height / 2));
- {
- // Add the UI Form
- EditorGUI.BeginChangeCheck();
- GUILayout.Space(15.0f);
-
- // App ID
- GUIContent AppIDLabel = new GUIContent("Oculus Application ID [?]: ",
- "This AppID will be used when uploading the build.");
- OVRPlatformToolSettings.AppID = MakeTextBox(AppIDLabel, OVRPlatformToolSettings.AppID);
-
- // App Token
- GUIContent AppTokenLabel = new GUIContent("Oculus App Token [?]: ",
- "You can get your app token from your app's Oculus API Dashboard.");
- appToken = MakePasswordBox(AppTokenLabel, appToken);
-
- // Release Channel
- GUIContent ReleaseChannelLabel = new GUIContent("Release Channel [?]: ",
- "Specify the releaes channel of the new build, you can reassign to other channels after upload.");
- OVRPlatformToolSettings.ReleaseChannel = MakeTextBox(ReleaseChannelLabel, OVRPlatformToolSettings.ReleaseChannel);
-
- // Releaes Note
- GUIContent ReleaseNoteLabel = new GUIContent("Release Note: ");
- OVRPlatformToolSettings.ReleaseNote = MakeTextBox(ReleaseNoteLabel, OVRPlatformToolSettings.ReleaseNote);
-
- // Platform specific fields
- if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Rift)
- {
- GUIContent BuildDirLabel = new GUIContent("Rift Build Directory [?]: ",
- "The full path to the directory containing your Rift build files.");
- OVRPlatformToolSettings.RiftBuildDirectory = MakeFileDirectoryField(BuildDirLabel, OVRPlatformToolSettings.RiftBuildDirectory,
- "Choose Rifle Build Directory");
-
- GUIContent BuildVersionLabel = new GUIContent("Build Version [?]: ",
- "The version number shown to users.");
- OVRPlatformToolSettings.RiftBuildVersion = MakeTextBox(BuildVersionLabel, OVRPlatformToolSettings.RiftBuildVersion);
-
- GUIContent LaunchFileLabel = new GUIContent("Launch File Path [?]: ",
- "The full path to the executable that launches your app.");
- OVRPlatformToolSettings.RiftLaunchFile = MakeFileDirectoryField(LaunchFileLabel, OVRPlatformToolSettings.RiftLaunchFile,
- "Choose Launch File", true, "exe");
- }
- else
- {
- GUIContent ApkPathLabel = new GUIContent("Build APK File Path [?]: ",
- "The full path to the APK file.");
- OVRPlatformToolSettings.ApkBuildPath = MakeFileDirectoryField(ApkPathLabel, OVRPlatformToolSettings.ApkBuildPath,
- "Choose APK File", true, "apk");
-
- if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.OculusGoGearVR)
- {
- // Go and Gear VR specific fields
- }
- else if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Quest)
- {
- // Quest specific fields
- }
- }
-
- showOptionalCommands = EditorGUILayout.Foldout(showOptionalCommands, "Optional Commands", boldFoldoutStyle);
- if (showOptionalCommands)
- {
- IncrementIndent();
-
- if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Rift)
- {
- // Launch Parameters
- GUIContent LaunchParamLabel = new GUIContent("Launch Parameters [?]: ",
- "Specifies any arguments passed to the launcher.");
- OVRPlatformToolSettings.RiftLaunchParams = MakeTextBox(LaunchParamLabel, OVRPlatformToolSettings.RiftLaunchParams);
-
- GUIContent FirewallExceptionLabel = new GUIContent("Firewall Exception [?]: ",
- "Specifies if a Windows Firewall exception is required.");
- OVRPlatformToolSettings.RiftFirewallException = MakeToggleBox(FirewallExceptionLabel, OVRPlatformToolSettings.RiftFirewallException);
-
- GUIContent GamepadEmulationLabel = new GUIContent("Gamepad Emulation [?]: ",
- "Specifies the type of gamepad emulation used by the Oculus Touch controllers.");
- OVRPlatformToolSettings.RiftGamepadEmulation = (OVRPlatformToolSettings.GamepadType)MakePopup(GamepadEmulationLabel, (int)OVRPlatformToolSettings.RiftGamepadEmulation, gamepadOptions);
-
- show2DCommands = EditorGUILayout.Foldout(show2DCommands, "2D", boldFoldoutStyle);
- if (show2DCommands)
- {
- IncrementIndent();
-
- // 2D Launch File
- GUIContent LaunchFile2DLabel = new GUIContent("2D Launch File [?]: ",
- "The full path to the executable that launches your app in 2D mode.");
- OVRPlatformToolSettings.Rift2DLaunchFile = MakeFileDirectoryField(LaunchFile2DLabel, OVRPlatformToolSettings.Rift2DLaunchFile,
- "Choose 2D Launch File", true, "exe");
-
- // 2D Launch Parameters
- GUIContent LaunchParam2DLabel = new GUIContent("2D Launch Parameters [?]: ",
- "Specifies any arguments passed to the launcher in 2D mode.");
- OVRPlatformToolSettings.Rift2DLaunchParams = MakeTextBox(LaunchParam2DLabel, OVRPlatformToolSettings.Rift2DLaunchParams);
-
- DecrementIndent();
- }
-
- showRedistCommands = EditorGUILayout.Foldout(showRedistCommands, "Redistributable Packages", boldFoldoutStyle);
- if (showRedistCommands)
- {
- IncrementIndent();
-
- for (int i = 0; i < OVRPlatformToolSettings.RiftRedistPackages.Count; i++)
- {
- GUIContent RedistPackageLabel = new GUIContent(OVRPlatformToolSettings.RiftRedistPackages[i].name);
- OVRPlatformToolSettings.RiftRedistPackages[i].include = MakeToggleBox(RedistPackageLabel, OVRPlatformToolSettings.RiftRedistPackages[i].include);
- }
-
- DecrementIndent();
- }
-
- showExpansionFileCommands = EditorGUILayout.Foldout(showExpansionFileCommands, "Expansion Files", boldFoldoutStyle);
- if (showExpansionFileCommands)
- {
- IncrementIndent();
-
- // Language Pack Directory
- GUIContent LanguagePackLabel = new GUIContent("Language Pack Directory [?]: ",
- "The full path to the directory containing the language packs");
- OVRPlatformToolSettings.LanguagePackDirectory = MakeFileDirectoryField(LanguagePackLabel, OVRPlatformToolSettings.LanguagePackDirectory,
- "Choose Language Pack Directory");
- }
- }
- else
- {
- if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.OculusGoGearVR)
- {
- // Go and Gear VR specific optional fields
- }
- else if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Quest)
- {
- // Quest specific optional fields
- }
-
- showExpansionFileCommands = EditorGUILayout.Foldout(showExpansionFileCommands, "Expansion Files", boldFoldoutStyle);
- if (showExpansionFileCommands)
- {
- IncrementIndent();
-
- // OBB File Path
- GUIContent ObbPathLabel = new GUIContent("OBB File Path [?]: ",
- "The full path to the OBB file.");
- OVRPlatformToolSettings.ObbFilePath = MakeFileDirectoryField(ObbPathLabel, OVRPlatformToolSettings.ObbFilePath,
- "Choose OBB File", true, "obb");
- }
- }
-
- if (showExpansionFileCommands)
- {
- // Assets Directory
- GUIContent AssetsDirLabel = new GUIContent("Assets Directory [?]: ",
- "The full path to the directory with DLCs for this build.");
- string assetsDirectory = MakeFileDirectoryField(AssetsDirLabel, OVRPlatformToolSettings.AssetsDirectory,
- "Choose Assets Directory");
-
- if (assetsDirectory != OVRPlatformToolSettings.AssetsDirectory)
- {
- OVRPlatformToolSettings.AssetsDirectory = assetsDirectory;
- OVRPlatformToolSettings.AssetConfigs.Clear();
- if (!string.IsNullOrEmpty(OVRPlatformToolSettings.AssetsDirectory))
- {
- DirectoryInfo dirInfo = new DirectoryInfo(OVRPlatformToolSettings.AssetsDirectory);
- FileInfo[] assetFiles = dirInfo.GetFiles();
- foreach (FileInfo f in assetFiles)
- {
- OVRPlatformToolSettings.AssetConfigs.Add(new AssetConfig(f.Name));
- }
- }
- EditorUtility.SetDirty(OVRPlatformToolSettings.Instance);
- }
-
- // Display bordered asset configuration list
- GUILayout.Space(3f);
- Rect rect = GUILayoutUtility.GetRect(0, GetAssetConfigElementHeight() + (ASSET_CONFIG_BACKGROUND_PADDING * 2),
- GUILayout.ExpandWidth(true));
- rect.x += (EditorGUI.indentLevel * INDENT_SPACING + 5);
- rect.width -= (EditorGUI.indentLevel * INDENT_SPACING + 10);
- DrawAssetConfigList(rect);
-
- DecrementIndent();
- }
-
- EditorGUI.indentLevel--;
- }
-
- if (EditorGUI.EndChangeCheck())
- {
- EditorUtility.SetDirty(OVRPlatformToolSettings.Instance);
- }
- }
- EditorGUILayout.EndScrollView();
-
- GUILayout.Space(SINGLE_LINE_SPACING);
-
- GUILayout.FlexibleSpace();
-
- // Run OVR Lint Option
- EditorGUIUtility.labelWidth = DEFAULT_LABEL_WIDTH;
- GUIContent RunOvrLintLabel = new GUIContent("Run OVR Lint (Recommended) [?]: ",
- "Run OVR Lint tool to ensure project is optimized for performance and meets Oculus packaging requirement for publishing.");
- OVRPlatformToolSettings.RunOvrLint = MakeToggleBox(RunOvrLintLabel, OVRPlatformToolSettings.RunOvrLint);
-
- // Add an Upload button
- GUI.enabled = !activeProcess;
- GUIContent btnTxt = new GUIContent("Upload");
- var rt = GUILayoutUtility.GetRect(btnTxt, GUI.skin.button, GUILayout.ExpandWidth(false));
- var btnYPos = rt.center.y;
- rt.center = new Vector2(EditorGUIUtility.currentViewWidth / 2 - rt.width / 2 - buttonPadding, btnYPos);
- if (GUI.Button(rt, btnTxt, GUI.skin.button))
- {
- OVRPlugin.SendEvent("oculus_platform_tool", "upload");
- OVRPlatformTool.log = string.Empty;
- OnUpload(OVRPlatformToolSettings.TargetPlatform);
- }
-
- // Add a cancel button
- GUI.enabled = activeProcess;
- btnTxt = new GUIContent("Cancel");
- rt = GUILayoutUtility.GetRect(btnTxt, GUI.skin.button, GUILayout.ExpandWidth(false));
- rt.center = new Vector2(EditorGUIUtility.currentViewWidth / 2 + rt.width / 2 + buttonPadding, btnYPos);
- if (GUI.Button(rt, btnTxt, GUI.skin.button))
- {
- if (EditorUtility.DisplayDialog("Cancel Upload Process", "Are you sure you want to cancel the upload process?", "Yes", "No"))
- {
- if (ovrPlatUtilProcess != null)
- {
- ovrPlatUtilProcess.Kill();
- OVRPlatformTool.log += "Upload process was canceled\n";
- }
- }
- }
-
- GUI.enabled = true;
- GUILayout.FlexibleSpace();
-
- GUILayout.Space(SINGLE_LINE_SPACING);
-
- debugLogScroll = EditorGUILayout.BeginScrollView(debugLogScroll);
- GUIStyle logBoxStyle = new GUIStyle();
- logBoxStyle.margin.left = 5;
- logBoxStyle.wordWrap = true;
- logBoxStyle.normal.textColor = logBoxStyle.focused.textColor = EditorStyles.label.normal.textColor;
- EditorGUILayout.SelectableLabel(OVRPlatformTool.log, logBoxStyle, GUILayout.Height(position.height - 30));
- EditorGUILayout.EndScrollView();
- }
-
- private void SetOVRProjectConfig(TargetPlatform targetPlatform)
- {
- #if UNITY_ANDROID
-
- var targetDeviceTypes = new List<OVRProjectConfig.DeviceType>();
-
- if (targetPlatform == TargetPlatform.Quest && !OVRDeviceSelector.isTargetDeviceQuest)
- {
- targetDeviceTypes.Add(OVRProjectConfig.DeviceType.Quest);
- }
- else if (targetPlatform == TargetPlatform.OculusGoGearVR && !OVRDeviceSelector.isTargetDeviceGearVrOrGo)
- {
- targetDeviceTypes.Add(OVRProjectConfig.DeviceType.GearVrOrGo);
- }
-
- if (targetDeviceTypes.Count != 0)
- {
- OVRProjectConfig projectConfig = OVRProjectConfig.GetProjectConfig();
- projectConfig.targetDeviceTypes = targetDeviceTypes;
- OVRProjectConfig.CommitProjectConfig(projectConfig);
- }
- #endif
- }
-
- private void IncrementIndent()
- {
- EditorGUI.indentLevel++;
- EditorGUIUtility.labelWidth = DEFAULT_LABEL_WIDTH - (EditorGUI.indentLevel * INDENT_SPACING);
- }
-
- private void DecrementIndent()
- {
- EditorGUI.indentLevel--;
- EditorGUIUtility.labelWidth = DEFAULT_LABEL_WIDTH - (EditorGUI.indentLevel * INDENT_SPACING);
- }
-
- private void OnUpload(TargetPlatform targetPlatform)
- {
- OVRPlatformTool.log = string.Empty;
- SetDirtyOnGUIChange();
- var lintCount = 0;
- if (OVRPlatformToolSettings.RunOvrLint)
- {
- lintCount = OVRLint.RunCheck();
- }
- if (lintCount != 0)
- {
- OVRPlatformTool.log += lintCount.ToString() + " lint suggestions are found. \n" +
- "Please run Oculus\\Tools\\OVR Performance Lint Tool to review and fix lint errors. \n" +
- "You can uncheck Run OVR Lint to bypass lint errors. \n";
- OVRPlugin.SendEvent("oculus_platform_tool_lint", lintCount.ToString());
- }
- else
- {
- // Continue uploading process
- ExecuteCommand(targetPlatform);
- }
- }
-
- static void ExecuteCommand(TargetPlatform targetPlatform)
- {
- string dataPath = Application.dataPath;
-
- // If we already have a copy of the platform util, check if it needs to be updated
- if (!ranSelfUpdate && File.Exists(dataPath + "/Oculus/VR/Editor/Tools/ovr-platform-util.exe"))
- {
- ranSelfUpdate = true;
- activeProcess = true;
- var updateThread = new Thread(delegate () {
- retryCount = 0;
- CheckForUpdate(dataPath);
- });
- updateThread.Start();
- }
-
- string uploadCommand;
- if (genUploadCommand(targetPlatform, out uploadCommand))
- {
- var thread = new Thread(delegate ()
- {
- // Wait for update process to finish before starting upload process
- while (activeProcess)
- {
- Thread.Sleep(100);
- }
- retryCount = 0;
- Command(targetPlatform, dataPath, uploadCommand);
- });
- thread.Start();
- }
- else
- {
- UnityEngine.Debug.LogError("Failed to generated upload command.");
- }
- }
-
- private static string CheckForPlatformUtil(string dataPath)
- {
- string toolDataPath = dataPath + "/Oculus/VR/Editor/Tools";
- if (!Directory.Exists(toolDataPath))
- {
- Directory.CreateDirectory(toolDataPath);
- }
-
- string platformUtil = toolDataPath + "/ovr-platform-util.exe";
- if (!System.IO.File.Exists(platformUtil))
- {
- OVRPlugin.SendEvent("oculus_platform_tool", "provision_util");
- EditorCoroutine downloadCoroutine = EditorCoroutine.Start(ProvisionPlatformUtil(platformUtil));
- while (!downloadCoroutine.GetCompleted()) { }
- }
-
- return platformUtil;
- }
-
- private static void InitializePlatformUtilProcess(string path, string args)
- {
- ovrPlatUtilProcess = new Process();
- var processInfo = new ProcessStartInfo(path, args);
-
- processInfo.CreateNoWindow = true;
- processInfo.UseShellExecute = false;
- processInfo.RedirectStandardError = true;
- processInfo.RedirectStandardOutput = true;
-
- ovrPlatUtilProcess.StartInfo = processInfo;
- ovrPlatUtilProcess.EnableRaisingEvents = true;
- }
-
- static void CheckForUpdate(string dataPath)
- {
- string platformUtilPath = CheckForPlatformUtil(dataPath);
- InitializePlatformUtilProcess(platformUtilPath, "self-update");
-
- OVRPlatformTool.log += "Checking for update...\n";
-
- ovrPlatUtilProcess.Exited += new EventHandler(
- (s, e) =>
- {
- if (File.Exists(dataPath + ".ovr-platform-util.exe"))
- {
- OVRPlatformTool.log += "Cleaning up...\n";
- while (File.Exists(dataPath + ".ovr-platform-util.exe")) { }
- OVRPlatformTool.log += "Finished updating platform utility.\n";
- }
- activeProcess = false;
- }
- );
-
- ovrPlatUtilProcess.OutputDataReceived += new DataReceivedEventHandler(
- (s, e) =>
- {
- if (e.Data != null && e.Data.Length != 0 && !e.Data.Contains("\u001b"))
- {
- OVRPlatformTool.log += e.Data + "\n";
- }
- }
- );
-
- try
- {
- ovrPlatUtilProcess.Start();
- ovrPlatUtilProcess.BeginOutputReadLine();
- }
- catch
- {
- if (ThrowPlatformUtilStartupError(platformUtilPath))
- {
- CheckForUpdate(dataPath);
- }
- }
- }
-
- static void LoadRedistPackages(string dataPath)
- {
- // Check / Download the platform util and call list-redists on it
- activeProcess = true;
- string platformUtilPath = CheckForPlatformUtil(dataPath);
- InitializePlatformUtilProcess(platformUtilPath, "list-redists");
-
- OVRPlatformTool.log += "Loading redistributable packages...\n";
-
- List<RedistPackage> redistPacks = new List<RedistPackage>();
-
- ovrPlatUtilProcess.Exited += new EventHandler(
- (s, e) =>
- {
- activeProcess = false;
- }
- );
-
- ovrPlatUtilProcess.OutputDataReceived += new DataReceivedEventHandler(
- (s, e) =>
- {
- if (e.Data != null && e.Data.Length != 0 && !e.Data.Contains("\u001b") && !e.Data.Contains("ID"))
- {
- // Get the name / ID pair from the CLI and create a redist package instance
- string[] terms = e.Data.Split('|');
- if (terms.Length == 2)
- {
- RedistPackage redistPack = new RedistPackage(terms[1], terms[0]);
- redistPacks.Add(redistPack);
- }
- }
- }
- );
-
- try
- {
- ovrPlatUtilProcess.Start();
- ovrPlatUtilProcess.BeginOutputReadLine();
-
- ovrPlatUtilProcess.WaitForExit();
-
- if (redistPacks.Count != OVRPlatformToolSettings.RiftRedistPackages.Count)
- {
- OVRPlatformTool.log += "Successfully updated redistributable packages.\n";
- OVRPlatformToolSettings.RiftRedistPackages = redistPacks;
- }
- else
- {
- OVRPlatformTool.log += "Redistributable packages up to date.\n";
- }
- }
- catch
- {
- if (ThrowPlatformUtilStartupError(platformUtilPath))
- {
- LoadRedistPackages(dataPath);
- }
- }
- }
-
- static void Command(TargetPlatform targetPlatform, string dataPath, string uploadCommand)
- {
- string platformUtilPath = CheckForPlatformUtil(dataPath);
-
- activeProcess = true;
- InitializePlatformUtilProcess(platformUtilPath, uploadCommand);
-
- ovrPlatUtilProcess.Exited += new EventHandler(
- (s, e) =>
- {
- activeProcess = false;
- }
- );
-
- ovrPlatUtilProcess.OutputDataReceived += new DataReceivedEventHandler(
- (s, e) =>
- {
- if (e.Data != null && e.Data.Length != 0 && !e.Data.Contains("\u001b"))
- {
- OVRPlatformTool.log += e.Data + "\n";
- }
- }
- );
- ovrPlatUtilProcess.ErrorDataReceived += new DataReceivedEventHandler(
- (s, e) =>
- {
- OVRPlatformTool.log += e.Data + "\n";
- }
- );
-
- try
- {
- ovrPlatUtilProcess.Start();
- ovrPlatUtilProcess.BeginOutputReadLine();
- ovrPlatUtilProcess.BeginErrorReadLine();
- }
- catch
- {
- if (ThrowPlatformUtilStartupError(platformUtilPath))
- {
- Command(targetPlatform, dataPath, uploadCommand);
- }
- }
- }
-
- private static bool genUploadCommand(TargetPlatform targetPlatform, out string command)
- {
- bool success = true;
- command = "";
-
- switch (targetPlatform)
- {
- case TargetPlatform.Rift:
- command = "upload-rift-build";
- break;
- case TargetPlatform.OculusGoGearVR:
- command = "upload-mobile-build";
- break;
- case TargetPlatform.Quest:
- command = "upload-quest-build";
- break;
- default:
- OVRPlatformTool.log += "ERROR: Invalid target platform selected";
- success = false;
- break;
- }
-
- // Add App ID
- ValidateTextField(AppIDFieldValidator, OVRPlatformToolSettings.AppID, "App ID", ref success);
- command += " --app-id \"" + OVRPlatformToolSettings.AppID + "\"";
-
- // Add App Token
- ValidateTextField(GenericFieldValidator, appToken, "App Token", ref success);
- command += " --app-secret \"" + appToken + "\"";
-
- // Add Platform specific fields
- if (targetPlatform == TargetPlatform.Rift)
- {
- // Add Rift Build Directory
- ValidateTextField(DirectoryValidator, OVRPlatformToolSettings.RiftBuildDirectory, "Rift Build Directory", ref success);
- command += " --build-dir \"" + OVRPlatformToolSettings.RiftBuildDirectory + "\"";
-
- // Add Rift Launch File
- ValidateTextField(FileValidator, OVRPlatformToolSettings.RiftLaunchFile, "Rift Launch File Path", ref success);
- command += " --launch-file \"" + OVRPlatformToolSettings.RiftLaunchFile + "\"";
-
- // Add Rift Build Version
- ValidateTextField(GenericFieldValidator, OVRPlatformToolSettings.RiftBuildVersion, "Build Version", ref success);
- command += " --version \"" + OVRPlatformToolSettings.RiftBuildVersion + "\"";
-
- // Add Rift Launch Parameters
- if (!string.IsNullOrEmpty(OVRPlatformToolSettings.RiftLaunchParams))
- {
- ValidateTextField(LaunchParameterValidator, OVRPlatformToolSettings.RiftLaunchParams, "Launch Parameters", ref success);
- command += " --launch_params \"" + OVRPlatformToolSettings.RiftLaunchParams + "\"";
- }
-
- // Add 2D Launch File
- if (!string.IsNullOrEmpty(OVRPlatformToolSettings.Rift2DLaunchFile))
- {
- ValidateTextField(FileValidator, OVRPlatformToolSettings.Rift2DLaunchFile, "2D Launch File", ref success);
- command += " --launch_file_2d \"" + OVRPlatformToolSettings.Rift2DLaunchFile + "\"";
-
- if (!string.IsNullOrEmpty(OVRPlatformToolSettings.Rift2DLaunchParams))
- {
- ValidateTextField(LaunchParameterValidator, OVRPlatformToolSettings.Rift2DLaunchParams, "2D Launch Parameters", ref success);
- command += " --launch_params_2d \"" + OVRPlatformToolSettings.Rift2DLaunchParams + "\"";
- }
- }
-
- // Add Firewall Exception
- if (OVRPlatformToolSettings.RiftFirewallException)
- {
- command += " --firewall_exceptions true";
- }
-
- // Add Redistributable Packages
- List<string> redistCommandIds = new List<string>();
- for (int i = 0; i < OVRPlatformToolSettings.RiftRedistPackages.Count; i++)
- {
- if (OVRPlatformToolSettings.RiftRedistPackages[i].include)
- {
- redistCommandIds.Add(OVRPlatformToolSettings.RiftRedistPackages[i].id);
- }
- }
- if (redistCommandIds.Count > 0)
- {
- command += " --redistributables \"" + string.Join(",", redistCommandIds.ToArray()) + "\"";
- }
-
- // Add Gamepad Emulation
- if (OVRPlatformToolSettings.RiftGamepadEmulation > OVRPlatformToolSettings.GamepadType.OFF &&
- OVRPlatformToolSettings.RiftGamepadEmulation <= OVRPlatformToolSettings.GamepadType.LEFT_D_PAD)
- {
- command += " --gamepad-emulation ";
- switch (OVRPlatformToolSettings.RiftGamepadEmulation)
- {
- case OVRPlatformToolSettings.GamepadType.TWINSTICK: command += "TWINSTICK"; break;
- case OVRPlatformToolSettings.GamepadType.RIGHT_D_PAD: command += "RIGHT_D_PAD"; break;
- case OVRPlatformToolSettings.GamepadType.LEFT_D_PAD: command += "LEFT_D_PAD"; break;
- default: command += "OFF"; break;
- }
- }
-
- // Add Rift Language Pack Directory
- if (!string.IsNullOrEmpty(OVRPlatformToolSettings.LanguagePackDirectory))
- {
- ValidateTextField(DirectoryValidator, OVRPlatformToolSettings.LanguagePackDirectory, "Language Pack Directory", ref success);
- command += " --language_packs_dir \"" + OVRPlatformToolSettings.LanguagePackDirectory + "\"";
- }
- }
- else
- {
- // Add APK Build Path
- ValidateTextField(FileValidator, OVRPlatformToolSettings.ApkBuildPath, "APK Build Path", ref success);
- command += " --apk \"" + OVRPlatformToolSettings.ApkBuildPath + "\"";
-
- // Add OBB File Path
- if (!string.IsNullOrEmpty(OVRPlatformToolSettings.ObbFilePath))
- {
- ValidateTextField(FileValidator, OVRPlatformToolSettings.ObbFilePath, "OBB File Path", ref success);
- command += " --obb \"" + OVRPlatformToolSettings.ObbFilePath + "\"";
- }
-
- if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.OculusGoGearVR)
- {
- // Go and Gear VR specific commands
- }
- else if (OVRPlatformToolSettings.TargetPlatform == TargetPlatform.Quest)
- {
- // Quest specific commands
- }
- }
-
- // Add Assets Directory
- if (!string.IsNullOrEmpty(OVRPlatformToolSettings.AssetsDirectory))
- {
- ValidateTextField(DirectoryValidator, OVRPlatformToolSettings.AssetsDirectory, "Assets Directory", ref success);
- command += " --assets-dir \"" + OVRPlatformToolSettings.AssetsDirectory + "\"";
-
- // Add Asset Configurations
- if (OVRPlatformToolSettings.AssetConfigs.Count > 0)
- {
- List<string> assetConfigs = new List<string>();
- for (int i = 0; i < OVRPlatformToolSettings.AssetConfigs.Count; i++)
- {
- List<string> configParameters = new List<string>();
- AssetConfig config = OVRPlatformToolSettings.AssetConfigs[i];
-
- if (config.required)
- {
- configParameters.Add("\\\"required\\\":true");
- }
- if (config.type > AssetConfig.AssetType.DEFAULT)
- {
- string typeCommand = "\\\"type\\\":";
- switch (config.type)
- {
- case AssetConfig.AssetType.LANGUAGE_PACK:
- configParameters.Add(typeCommand + "\\\"LANGUAGE_PACK\\\"");
- break;
- case AssetConfig.AssetType.STORE:
- configParameters.Add(typeCommand + "\\\"STORE\\\"");
- break;
- default:
- configParameters.Add(typeCommand + "\\\"DEFAULT\\\"");
- break;
- }
- }
- if (!string.IsNullOrEmpty(config.sku))
- {
- configParameters.Add("\\\"sku\\\":\\\"" + config.sku + "\\\"");
- }
-
- if (configParameters.Count > 0)
- {
- string configString = "\\\"" + config.name + "\\\":{" + string.Join(",", configParameters.ToArray()) + "}";
- assetConfigs.Add(configString);
- }
- }
-
- if (assetConfigs.Count > 0)
- {
- command += " --asset_files_config {" + string.Join(",", assetConfigs.ToArray()) + "}";
- }
- }
- }
-
- // Add Release Channel
- ValidateTextField(GenericFieldValidator, OVRPlatformToolSettings.ReleaseChannel, "Release Channel", ref success);
- command += " --channel \"" + OVRPlatformToolSettings.ReleaseChannel + "\"";
-
- // Add Notes
- if (!string.IsNullOrEmpty(OVRPlatformToolSettings.ReleaseNote))
- {
- string sanatizedReleaseNote = OVRPlatformToolSettings.ReleaseNote;
- sanatizedReleaseNote = sanatizedReleaseNote.Replace("\"", "\"\"");
- command += " --notes \"" + sanatizedReleaseNote + "\"";
- }
-
- return success;
- }
-
- // Private delegate for text field validation functions
- private delegate TSuccess FieldValidatorDelegate<in TText, TError, out TSuccess>(TText text, ref TError error);
-
- // Validate the text using a given field validator function. An error message will be printed if validation fails. Success will ONLY be modified to false if validation fails.
- static void ValidateTextField(FieldValidatorDelegate<string, string, bool> fieldValidator, string fieldText, string fieldName, ref bool success)
- {
- string error = "";
- if (!fieldValidator(fieldText, ref error))
- {
- OVRPlatformTool.log += "ERROR: Please verify that the " + fieldName + " is correct. ";
- OVRPlatformTool.log += string.IsNullOrEmpty(error) ? "\n" : error + "\n";
- success = false;
- }
- }
-
- // Checks if the text is null or empty
- static bool GenericFieldValidator(string fieldText, ref string error)
- {
- if (string.IsNullOrEmpty(fieldText))
- {
- error = "The field is empty.";
- return false;
- }
- return true;
- }
-
- // Checks if the App ID contains only numbers
- static bool AppIDFieldValidator(string fieldText, ref string error)
- {
- if (string.IsNullOrEmpty(fieldText))
- {
- error = "The field is empty.";
- return false;
- }
- else if (!Regex.IsMatch(OVRPlatformToolSettings.AppID, "^[0-9]+$"))
- {
- error = "The field contains invalid characters.";
- return false;
- }
- return true;
- }
-
- // Check that the directory exists
- static bool DirectoryValidator(string path, ref string error)
- {
- if (!Directory.Exists(path))
- {
- error = "The directory does not exist.";
- return false;
- }
- return true;
- }
-
- // Check that the file exists
- static bool FileValidator(string path, ref string error)
- {
- if (!File.Exists(path))
- {
- error = "The file does not exist.";
- return false;
- }
- return true;
- }
-
- // Check if the launch parameter string contains illegal characters
- static bool LaunchParameterValidator(string fieldText, ref string error)
- {
- if (fieldText.Contains("\""))
- {
- error = "The field contains illegal characters.";
- return false;
- }
- return true;
- }
-
- void OnInspectorUpdate()
- {
- Repaint();
- }
-
- private static bool ThrowPlatformUtilStartupError(string utilPath)
- {
- if (retryCount < MAX_DOWNLOAD_RETRY_COUNT)
- {
- retryCount++;
- OVRPlatformTool.log += "There was a problem starting Oculus Platform Util. Restarting provision process...\n";
- File.Delete(utilPath);
- return true;
- }
- else
- {
- OVRPlatformTool.log += "OVR Platform Tool had a problem with downloading a valid executable after several trys. Please reopen the tool to try again.\n";
- return false;
- }
- }
-
- private string MakeTextBox(GUIContent label, string variable)
- {
- string result = string.Empty;
-
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false));
- result = EditorGUILayout.TextField(variable);
- EditorGUILayout.EndHorizontal();
-
- return result;
- }
-
- private string MakePasswordBox(GUIContent label, string variable)
- {
- string result = string.Empty;
-
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false));
- result = EditorGUILayout.PasswordField(variable);
- EditorGUILayout.EndHorizontal();
-
- return result;
- }
-
- private bool MakeToggleBox(GUIContent label, bool variable)
- {
- bool result = false;
-
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false));
- result = EditorGUILayout.Toggle(variable);
- EditorGUILayout.EndHorizontal();
-
- return result;
- }
-
- private int MakePopup(GUIContent label, int variable, string[] options)
- {
- int result = 0;
-
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false));
- result = EditorGUILayout.Popup(variable, options);
- EditorGUILayout.EndHorizontal();
-
- return result;
- }
-
- private string MakeFileDirectoryField(GUIContent label, string variable, string title, bool isFile = false, string extension = "")
- {
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.LabelField(label, GUILayout.ExpandWidth(false));
-
- Rect rect = GUILayoutUtility.GetRect(0, SINGLE_LINE_SPACING, GUILayout.ExpandWidth(true));
- EditorGUI.SelectableLabel(rect, variable);
-
- // Create X button if there is a valid path in the field
- string result = variable;
- if (!string.IsNullOrEmpty(variable))
- {
- Color defaultColor = GUI.backgroundColor;
- GUI.backgroundColor = new Color(.9f, 0.5f, 0.5f);
- rect = GUILayoutUtility.GetRect(SINGLE_LINE_SPACING, SINGLE_LINE_SPACING, GUILayout.ExpandWidth(false));
- if (GUI.Button(rect, "X"))
- {
- result = string.Empty;
- }
- GUI.backgroundColor = defaultColor;
- }
-
- // Create the Choose button to initiate the file explorer
- rect = GUILayoutUtility.GetRect(75f, SINGLE_LINE_SPACING, GUILayout.ExpandWidth(false));
- if (GUI.Button(rect, "Choose ..."))
- {
- string newPath = string.Empty;
- string path = string.IsNullOrEmpty(variable) ? Application.dataPath : variable;
- if (isFile)
- {
- newPath = EditorUtility.OpenFilePanel(title, path, extension);
- }
- else
- {
- newPath = EditorUtility.OpenFolderPanel(title, path, string.Empty);
- }
- if (newPath.Length > 0)
- {
- result = newPath;
- }
- }
- GUILayout.Space(5f);
- EditorGUILayout.EndHorizontal();
-
- // If the path has changed, deselect the selectable field so that it can update.
- if (result != variable)
- {
- GUIUtility.hotControl = 0;
- GUIUtility.keyboardControl = 0;
- }
-
- return result;
- }
-
- private static void SetDirtyOnGUIChange()
- {
- if (GUI.changed)
- {
- EditorUtility.SetDirty(OVRPlatformToolSettings.Instance);
- GUI.changed = false;
- }
- }
-
- private static IEnumerator ProvisionPlatformUtil(string dataPath)
- {
- UnityEngine.Debug.Log("Started Provisioning Oculus Platform Util");
- #if UNITY_2018_3_OR_NEWER
- var webRequest = new UnityWebRequest(urlPlatformUtil, UnityWebRequest.kHttpVerbGET);
- string path = dataPath;
- webRequest.downloadHandler = new DownloadHandlerFile(path);
- // WWW request timeout in seconds
- webRequest.timeout = 60;
- UnityWebRequestAsyncOperation webOp = webRequest.SendWebRequest();
- while (!webOp.isDone) { }
- if (webRequest.isNetworkError || webRequest.isHttpError)
- {
- var networkErrorMsg = "Failed to provision Oculus Platform Util\n";
- UnityEngine.Debug.LogError(networkErrorMsg);
- OVRPlatformTool.log += networkErrorMsg;
- }
- else
- {
- OVRPlatformTool.log += "Completed Provisioning Oculus Platform Util\n";
- }
- SetDirtyOnGUIChange();
- yield return webOp;
- #else
- using (WWW www = new WWW(urlPlatformUtil))
- {
- float timer = 0;
- float timeOut = 60;
- yield return www;
- while (!www.isDone && timer < timeOut)
- {
- timer += Time.deltaTime;
- if (www.error != null)
- {
- UnityEngine.Debug.Log("Download error: " + www.error);
- break;
- }
- OVRPlatformTool.log = string.Format("Downloading.. {0:P1}", www.progress);
- SetDirtyOnGUIChange();
- yield return new WaitForSeconds(1f);
- }
- if (www.isDone)
- {
- System.IO.File.WriteAllBytes(dataPath, www.bytes);
- OVRPlatformTool.log = "Completed Provisioning Oculus Platform Util\n";
- SetDirtyOnGUIChange();
- }
- }
- #endif
- }
-
- private static void DrawAssetConfigList(Rect rect)
- {
- DrawAssetConfigHeader(rect);
- DrawAssetConfigBackground(rect);
- DrawAssetConfigElement(rect);
- }
-
- private static void DrawAssetConfigElement(Rect rect)
- {
- Rect elementRect = new Rect(rect.x, rect.y + SINGLE_LINE_SPACING + ASSET_CONFIG_BACKGROUND_PADDING / 2,
- rect.width, SINGLE_LINE_SPACING);
- if (OVRPlatformToolSettings.AssetConfigs.Count > 0)
- {
- for (int i = 0; i < OVRPlatformToolSettings.AssetConfigs.Count; i++)
- {
- AssetConfig config = OVRPlatformToolSettings.AssetConfigs[i];
- GUIContent fieldLabel;
-
- config.SetFoldoutState(EditorGUI.Foldout(elementRect, config.GetFoldoutState(), config.name, boldFoldoutStyle));
- if (config.GetFoldoutState())
- {
- Rect attributeRect = new Rect(elementRect.x + INDENT_SPACING, elementRect.y + SINGLE_LINE_SPACING,
- elementRect.width - INDENT_SPACING - 3f, SINGLE_LINE_SPACING);
- // Extra asset config params are disabled for now until CLI supports them
- #if !DISABLE_EXTRA_ASSET_CONFIG
- fieldLabel = new GUIContent("Required Asset [?]", "Whether or not this asset file is required for the app to run.");
- config.required = EditorGUI.Toggle(attributeRect, fieldLabel, config.required);
-
- attributeRect.y += SINGLE_LINE_SPACING;
- fieldLabel = new GUIContent("Asset Type [?]", "The asset file type.");
- config.type = (AssetConfig.AssetType)EditorGUI.EnumPopup(attributeRect, fieldLabel, config.type);
-
- attributeRect.y += SINGLE_LINE_SPACING;
- #endif
- fieldLabel = new GUIContent("Asset SKU [?]", "The Oculus store SKU for this asset file.");
- config.sku = EditorGUI.TextField(attributeRect, fieldLabel, config.sku);
-
- elementRect.y = attributeRect.y;
- }
- elementRect.y += SINGLE_LINE_SPACING;
- }
- }
- else
- {
- EditorGUI.LabelField(elementRect, "No asset files found. Choose a valid assets directory.");
- }
- }
-
- private static float GetAssetConfigElementHeight()
- {
- float totalHeight = 0f;
- if (OVRPlatformToolSettings.AssetConfigs.Count > 0)
- {
- for (int i = 0; i < OVRPlatformToolSettings.AssetConfigs.Count; i++)
- {
- AssetConfig config = OVRPlatformToolSettings.AssetConfigs[i];
- #if !DISABLE_EXTRA_ASSET_CONFIG
- totalHeight += config.GetFoldoutState() ? SINGLE_LINE_SPACING * 4 : SINGLE_LINE_SPACING;
- #else
- totalHeight += config.GetFoldoutState() ? SINGLE_LINE_SPACING * 2 : SINGLE_LINE_SPACING;
- #endif
- }
- }
- else
- {
- totalHeight += SINGLE_LINE_SPACING;
- }
- return totalHeight + ASSET_CONFIG_BACKGROUND_PADDING;
- }
-
- private static void DrawAssetConfigHeader(Rect rect)
- {
- Rect headerRect = new Rect(rect.x, rect.y, rect.width, SINGLE_LINE_SPACING);
- EditorGUI.DrawRect(headerRect, EditorGUIUtility.isProSkin ? new Color(0.37f, 0.37f, 0.37f) : new Color(0.55f, 0.55f, 0.55f));
- EditorGUI.LabelField(rect, "Asset File Configuration");
- }
-
- private static void DrawAssetConfigBackground(Rect rect)
- {
- Rect backgroundRect = new Rect(rect.x, rect.y + SINGLE_LINE_SPACING, rect.width, GetAssetConfigElementHeight());
- EditorGUI.DrawRect(backgroundRect, EditorGUIUtility.isProSkin ? new Color(0.3f, 0.3f, 0.3f) : new Color(0.63f, 0.63f, 0.63f));
- }
-
- class GUIHelper
- {
- public delegate void Worker();
-
- static void InOut(Worker begin, Worker body, Worker end)
- {
- try
- {
- begin();
- body();
- }
- finally
- {
- end();
- }
- }
-
- public static void HInset(int pixels, Worker worker)
- {
- InOut(
- () => {
- GUILayout.BeginHorizontal();
- GUILayout.Space(pixels);
- GUILayout.BeginVertical();
- },
- worker,
- () => {
- GUILayout.EndVertical();
- GUILayout.EndHorizontal();
- }
- );
- }
-
- public delegate T ControlWorker<T>();
- public static T MakeControlWithLabel<T>(GUIContent label, ControlWorker<T> worker)
- {
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.LabelField(label);
-
- var result = worker();
-
- EditorGUILayout.EndHorizontal();
- return result;
- }
- }
-
- public class EditorCoroutine
- {
- public static EditorCoroutine Start(IEnumerator routine)
- {
- EditorCoroutine coroutine = new EditorCoroutine(routine);
- coroutine.Start();
- return coroutine;
- }
-
- readonly IEnumerator routine;
- bool completed;
- EditorCoroutine(IEnumerator _routine)
- {
- routine = _routine;
- completed = false;
- }
-
- void Start()
- {
- EditorApplication.update += Update;
- }
- public void Stop()
- {
- EditorApplication.update -= Update;
- completed = true;
- }
-
- public bool GetCompleted()
- {
- return completed;
- }
-
- void Update()
- {
- if (!routine.MoveNext())
- {
- Stop();
- }
- }
- }
- }
- }
|