From a2bfb7cff2a58e37a996d1a17ef45d9a79b1d9fe Mon Sep 17 00:00:00 2001 From: ygz-bd Date: Wed, 23 Oct 2024 14:49:34 +0100 Subject: [PATCH] Enable XR Preview Mode for PICO OS Supported features in the immersive preview mode - Passthrough - Hand tracking Notes: - Multi-window is only available for internal apps on PICO OS, therefore launching adjacent windows is not possible currently. - Passthrough splash screen is not supported on PICO OS --- .github/workflows/android_builds.yml | 1 + platform/android/java/build.gradle | 16 +++- platform/android/java/editor/build.gradle | 14 +++ .../org/godotengine/editor/BaseGodotEditor.kt | 5 ++ .../editor/src/picoos/AndroidManifest.xml | 83 ++++++++++++++++++ .../editor/src/picoos/assets/vr_splash.png | Bin 0 -> 14766 bytes .../org/godotengine/editor/GodotEditor.kt | 82 +++++++++++++++++ .../org/godotengine/editor/GodotXRGame.kt | 59 +++++++++++++ .../godotengine/godot/utils/DeviceUtils.kt | 9 +- 9 files changed, 266 insertions(+), 3 deletions(-) create mode 100644 platform/android/java/editor/src/picoos/AndroidManifest.xml create mode 100644 platform/android/java/editor/src/picoos/assets/vr_splash.png create mode 100644 platform/android/java/editor/src/picoos/java/org/godotengine/editor/GodotEditor.kt create mode 100644 platform/android/java/editor/src/picoos/java/org/godotengine/editor/GodotXRGame.kt diff --git a/.github/workflows/android_builds.yml b/.github/workflows/android_builds.yml index 7ff5502137..9aec852d3d 100644 --- a/.github/workflows/android_builds.yml +++ b/.github/workflows/android_builds.yml @@ -87,6 +87,7 @@ jobs: cd platform/android/java ./gradlew generateGodotEditor ./gradlew generateGodotHorizonOSEditor + ./gradlew generateGodotPicoOSEditor cd ../../.. ls -l bin/android_editor_builds/ diff --git a/platform/android/java/build.gradle b/platform/android/java/build.gradle index 9184e8c5d5..3dd8bbed88 100644 --- a/platform/android/java/build.gradle +++ b/platform/android/java/build.gradle @@ -25,7 +25,7 @@ allprojects { ext { supportedAbis = ["arm32", "arm64", "x86_32", "x86_64"] supportedFlavors = ["editor", "template"] - supportedAndroidDistributions = ["android", "horizonos"] + supportedAndroidDistributions = ["android", "horizonos", "picoos"] supportedFlavorsBuildTypes = [ "editor": ["dev", "debug", "release"], "template": ["dev", "debug", "release"] @@ -96,7 +96,7 @@ def templateExcludedBuildTask() { * Generates the build tasks for the given flavor * @param flavor Must be one of the supported flavors ('template' / 'editor') * @param edition Must be one of the supported editions ('standard' / 'mono') - * @param androidDistro Must be one of the supported Android distributions ('android' / 'horizonos') + * @param androidDistro Must be one of the supported Android distributions ('android' / 'horizonos' / 'picoos') */ def generateBuildTasks(String flavor = "template", String edition = "standard", String androidDistro = "android") { if (!supportedFlavors.contains(flavor)) { @@ -237,6 +237,18 @@ task generateGodotHorizonOSEditor { dependsOn = generateBuildTasks("editor", "standard", "horizonos") } +/** + * Generate the Godot Editor binaries for PicoOS devices. + * + * Note: Unless the 'generateNativeLibs` argument is specified, the Godot 'tools' shared libraries + * must have been generated (via scons) prior to running this gradle task. + * The task will only build the binaries for which the shared libraries is available. + */ +task generateGodotPicoOSEditor { + gradle.startParameter.excludedTaskNames += templateExcludedBuildTask() + dependsOn = generateBuildTasks("editor", "standard", "picoos") +} + /** * Master task used to coordinate the tasks defined above to generate the set of Godot templates. */ diff --git a/platform/android/java/editor/build.gradle b/platform/android/java/editor/build.gradle index 45222ca3b0..dbc2061791 100644 --- a/platform/android/java/editor/build.gradle +++ b/platform/android/java/editor/build.gradle @@ -163,6 +163,18 @@ android { minSdkVersion 23 targetSdkVersion 32 } + picoos { + dimension "android_distribution" + missingDimensionStrategy 'products', 'editor' + ndk { + //noinspection ChromeOsAbiSupport + abiFilters "arm64-v8a" + } + applicationIdSuffix ".pico" + versionNameSuffix "-pico" + minSdkVersion 29 + targetSdkVersion 32 + } } } @@ -177,4 +189,6 @@ dependencies { // Meta dependencies horizonosImplementation "org.godotengine:godot-openxr-vendors-meta:3.0.0-stable" + // Pico dependencies + picoosImplementation "org.godotengine:godot-openxr-vendors-pico:3.0.1-stable" } diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt index 7b6d1f6bd1..72bd0b995d 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt @@ -53,6 +53,7 @@ import org.godotengine.godot.error.Error import org.godotengine.godot.utils.PermissionsUtil import org.godotengine.godot.utils.ProcessPhoenix import org.godotengine.godot.utils.isHorizonOSDevice +import org.godotengine.godot.utils.isPicoOSDevice import org.godotengine.godot.utils.isNativeXRDevice import java.util.* import kotlin.math.min @@ -521,6 +522,10 @@ abstract class BaseGodotEditor : GodotActivity() { return isHorizonOSDevice() } + if (featureTag == "picoos") { + return isPicoOSDevice() + } + return false } } diff --git a/platform/android/java/editor/src/picoos/AndroidManifest.xml b/platform/android/java/editor/src/picoos/AndroidManifest.xml new file mode 100644 index 0000000000..13ab40f90f --- /dev/null +++ b/platform/android/java/editor/src/picoos/AndroidManifest.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/android/java/editor/src/picoos/assets/vr_splash.png b/platform/android/java/editor/src/picoos/assets/vr_splash.png new file mode 100644 index 0000000000000000000000000000000000000000..7bddd4325a8e2f425a42715770971a7a855b4803 GIT binary patch literal 14766 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: EditorWindowInfo { + var hasEditor = false + var xrModeOn = false + + var i = 0 + while (i < args.size) { + when (args[i++]) { + EDITOR_ARG, EDITOR_ARG_SHORT, EDITOR_PROJECT_MANAGER_ARG, EDITOR_PROJECT_MANAGER_ARG_SHORT -> hasEditor = true + XR_MODE_ARG -> { + val argValue = args[i++] + xrModeOn = xrModeOn || ("on" == argValue) + } + } + } + + return if (hasEditor) { + EDITOR_MAIN_INFO + } else { + val openxrEnabled = GodotLib.getGlobal("xr/openxr/enabled").toBoolean() + if (openxrEnabled && isNativeXRDevice()) { + XR_RUN_GAME_INFO + } else { + RUN_GAME_INFO + } + } + } + + override fun getEditorWindowInfoForInstanceId(instanceId: Int): EditorWindowInfo? { + return when (instanceId) { + XR_RUN_GAME_INFO.windowId -> XR_RUN_GAME_INFO + else -> super.getEditorWindowInfoForInstanceId(instanceId) + } + } +} diff --git a/platform/android/java/editor/src/picoos/java/org/godotengine/editor/GodotXRGame.kt b/platform/android/java/editor/src/picoos/java/org/godotengine/editor/GodotXRGame.kt new file mode 100644 index 0000000000..2107a82d74 --- /dev/null +++ b/platform/android/java/editor/src/picoos/java/org/godotengine/editor/GodotXRGame.kt @@ -0,0 +1,59 @@ +/*************************************************************************/ +/* GodotXRGame.kt */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +package org.godotengine.editor + +import org.godotengine.godot.GodotLib +import org.godotengine.godot.xr.XRMode + +/** + * Provide support for running XR apps / games from the editor window. + */ +open class GodotXRGame: GodotGame() { + + override fun overrideOrientationRequest() = true + + override fun updateCommandLineParams(args: List) { + val updatedArgs = ArrayList() + if (!args.contains(XRMode.OPENXR.cmdLineArg)) { + updatedArgs.add(XRMode.OPENXR.cmdLineArg) + } + if (!args.contains(XR_MODE_ARG)) { + updatedArgs.add(XR_MODE_ARG) + updatedArgs.add("on") + } + updatedArgs.addAll(args) + + super.updateCommandLineParams(updatedArgs) + } + + override fun getEditorWindowInfo() = XR_RUN_GAME_INFO + +} diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/DeviceUtils.kt b/platform/android/java/lib/src/org/godotengine/godot/utils/DeviceUtils.kt index dff57581fa..7b99cce216 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/DeviceUtils.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/utils/DeviceUtils.kt @@ -44,9 +44,16 @@ fun isHorizonOSDevice(): Boolean { return "Oculus".equals(Build.BRAND, true) } +/** + * Returns true if running on PICO OS. + */ +fun isPicoOSDevice(): Boolean { + return ("Pico".equals(Build.BRAND, true)) +} + /** * Returns true if running on a native Android XR device. */ fun isNativeXRDevice(): Boolean { - return isHorizonOSDevice() + return isHorizonOSDevice() || isPicoOSDevice() }