From 4acc074114d9e8355e4ddb80e8799f32f7a1c7c3 Mon Sep 17 00:00:00 2001 From: Alexi Chepura Date: Tue, 17 Oct 2023 15:34:46 +0300 Subject: [PATCH] quest, not finished --- README.md | 8 +++- examples/android/Cargo.toml | 89 +++++++++++++++++++++++++++++++++++++ src/graphics/vulkan.rs | 5 +++ src/lib.rs | 7 +++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 examples/android/Cargo.toml diff --git a/README.md b/README.md index a0c7eb2..d392e30 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,10 @@ An in-progress crate for adding openxr support to Bevy without forking. ![image](https://github.com/awtterpip/bevy_openxr/assets/50841145/aa01fde4-7915-49b9-b486-ff61ce6d57a9) -To see it in action run the example in `examples` with `cargo run --example xr` +To see it in action run the example in `examples` with `cargo run --example xr`. + +## Quest +Running on quest can be done with https://github.com/rust-mobile/cargo-apk and requires disabling default features. +```sh +cargo apk run --example xr --release --no-default-features +``` diff --git a/examples/android/Cargo.toml b/examples/android/Cargo.toml new file mode 100644 index 0000000..31752d8 --- /dev/null +++ b/examples/android/Cargo.toml @@ -0,0 +1,89 @@ +# [package] +name = "bevy_openxr_android" +version = "0.1.0" +edition = "2021" +description = "Example for building an Android OpenXR app with Bevy" +publish = false +license = "MIT OR Apache-2.0" + +# [lib] +# name = "bevy_mobile_example" +# crate-type = ["staticlib", "cdylib"] + +# [dependencies] +# bevy = { path = "../../" } + +# [package.metadata.android] +# package = "org.bevyengine.example" +# apk_name = "bevyexample" +# assets = "../../assets" +# resources = "../../assets/android-res" +# # This strips debug symbols from the shared libraries, drastically reducing APK size. If you need them, remove the option. +# strip = "strip" +# build_targets = ["aarch64-linux-android", "armv7-linux-androideabi"] + +[package.metadata.android] +package = "com.github.alexichepura.bevyopenxr" +build_targets = ["aarch64-linux-android"] +runtime_libs = "examples/libs" +apk_name = "bevyopenxr" +assets = "assets" +res = "assets/android-res" +icon = "@mipmap/ic_launcher" +label = "Bevy Openxr" + +[package.metadata.android.sdk] +target_sdk_version = 32 + +# [package.metadata.android.application] +# icon = "@mipmap/ic_launcher" +# label = "Bevy Example" + +[dependencies] +anyhow = "1.0.75" +# ash = "0.37.3" +# ash = { version = "0.37", default-features = false, features = ["loaded"] } +bevy = { git = "https://github.com/bevyengine/bevy.git" } +openxr = { git = "https://github.com/Ralith/openxrs", features = ["mint"] } +mint = "0.5.9" + +wgpu = "0.17.1" +wgpu-core = { version = "0.17.1", features = ["vulkan"] } +wgpu-hal = "0.17.2" + +[dev-dependencies] +color-eyre = "0.6.2" + +[profile.release] +lto = "fat" +codegen-units = 1 +panic = "abort" +#debug = true + +[package.metadata.android] +build_targets = ["aarch64-linux-android"] +runtime_libs = "examples/libs" +package = "com.github.alexichepura.bevyopenxr" +apk_name = "bevyopenxr" +assets = "assets" +res = "assets/android-res" +icon = "@mipmap/ic_launcher" +label = "Bevy Openxr" + +[package.metadata.android.application.activity] +theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen" +config_changes = "density|keyboard|keyboardHidden|navigation|orientation|screenLayout|screenSize|uiMode" +launch_mode = "singleTask" +orientation = "landscape" +resizeable_activity = false + +[[package.metadata.android.application.activity.intent_filter]] +actions = ["android.intent.action.MAIN"] +categories = [ + "com.oculus.intent.category.VR", + "android.intent.category.LAUNCHER", +] + +[package.metadata.android.signing.release] +path = "./hotham_examples.keystore" +keystore_password = "chomsky-vigilant-spa" diff --git a/src/graphics/vulkan.rs b/src/graphics/vulkan.rs index 61d1b52..a6c525b 100644 --- a/src/graphics/vulkan.rs +++ b/src/graphics/vulkan.rs @@ -42,6 +42,9 @@ pub fn initialize_xr_graphics( let xr_entry = super::xr_entry(); + #[cfg(target_os = "android")] + xr_entry.initialize_android_loader().unwrap(); + let available_extensions = xr_entry.enumerate_extensions()?; assert!(available_extensions.khr_vulkan_enable2); info!("available xr exts: {:#?}", available_extensions); @@ -102,6 +105,8 @@ pub fn initialize_xr_graphics( let device_extensions = vec![ ash::extensions::khr::Swapchain::name(), ash::extensions::khr::DrawIndirectCount::name(), + #[cfg(target_os = "android")] + ash::extensions::khr::TimelineSemaphore::name(), ]; info!( "creating vulkan instance with these extensions: {:#?}", diff --git a/src/lib.rs b/src/lib.rs index e5ed748..ba3c952 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -201,10 +201,17 @@ impl PluginGroup for DefaultXrPlugins { .add_before::(OpenXrPlugin) .add_after::(OpenXrInput::new(XrControllerType::OculusTouch)) .set(WindowPlugin { + #[cfg(not(target_os = "android"))] primary_window: Some(Window { present_mode: PresentMode::AutoNoVsync, ..default() }), + #[cfg(target_os = "android")] + primary_window: None, + #[cfg(target_os = "android")] + exit_condition: bevy::window::ExitCondition::DontExit, + #[cfg(target_os = "android")] + close_when_requested: true, ..default() }) }