diff --git a/Cargo.toml b/Cargo.toml index 77fb63a..847c1b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,14 +15,15 @@ force-link = ["openxr/linked"] members = ["examples/android", "examples/demo"] [dependencies] -anyhow = "1.0.75" +# anyhow = "1.0.75" ash = "0.37.3" -bevy = "0.12" +bevy = "0.13" futures-lite = "2.0.1" mint = "0.5.9" -wgpu = "0.17.1" -wgpu-core = { version = "0.17.1", features = ["vulkan"] } -wgpu-hal = "0.17.1" +wgpu = "0.19" +wgpu-core = { version = "0.19", features = ["vulkan"] } +wgpu-hal = "0.19" +eyre = "0.6.11" [target.'cfg(windows)'.dependencies] openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features = [ @@ -45,9 +46,9 @@ ndk-context = "0.1" jni = "0.20" [dev-dependencies] -bevy = "0.12" -color-eyre = "0.6.2" +bevy = "0.13" bevy_rapier3d = { git = "https://github.com/devil-ira/bevy_rapier", branch = "bevy-0.12" } +color-eyre = "0.6.2" [[example]] name = "xr" @@ -57,4 +58,4 @@ path = "examples/xr.rs" debug = true [patch.crates-io] -ndk = { git = "https://github.com/Schmarni-Dev/ndk.git", branch = "070" } +# ndk = { git = "https://github.com/Schmarni-Dev/ndk.git", branch = "070" } diff --git a/examples/android/Cargo.toml b/examples/android/Cargo.toml index bea6cb3..cafa8c2 100644 --- a/examples/android/Cargo.toml +++ b/examples/android/Cargo.toml @@ -13,13 +13,13 @@ crate-type = ["rlib", "cdylib"] [dependencies] bevy_oxr.path = "../.." -bevy = "0.12" +bevy = "0.13" openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features = ["mint"] } -[profile.release] -lto = "fat" -codegen-units = 1 -panic = "abort" +# [profile.release] +# lto = "fat" +# codegen-units = 1 +# panic = "abort" # This metadata is used by `cargo-apk` - `xbuild` uses the `manifest.yaml` instead. [package.metadata.android] diff --git a/examples/android/manifest.yaml b/examples/android/manifest.yaml index 7622de3..6cf500f 100644 --- a/examples/android/manifest.yaml +++ b/examples/android/manifest.yaml @@ -12,6 +12,8 @@ android: required: true - name: "com.oculus.experimental.enabled" required: true + uses_permission: + - name: "com.oculus.permission.HAND_TRACKING" application: label: "Bevy Openxr Android" theme: "@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen" diff --git a/examples/android/src/lib.rs b/examples/android/src/lib.rs index efb835a..9b1c664 100644 --- a/examples/android/src/lib.rs +++ b/examples/android/src/lib.rs @@ -3,10 +3,11 @@ use bevy::prelude::*; use bevy::transform::components::Transform; use bevy_oxr::graphics::extensions::XrExtensions; use bevy_oxr::graphics::XrAppInfo; -use bevy_oxr::graphics::XrPreferdBlendMode::AlphaBlend; -use bevy_oxr::passthrough::{passthrough_layer_pause, passthrough_layer_resume}; -use bevy_oxr::xr_init::XrRenderData; +use bevy_oxr::passthrough::{PausePassthrough, ResumePassthrough, XrPassthroughState}; +use bevy_oxr::xr_init::xr_only; use bevy_oxr::xr_input::debug_gizmos::OpenXrDebugRenderer; +use bevy_oxr::xr_input::hands::common::HandInputDebugRenderer; +use bevy_oxr::xr_input::hands::HandBone; use bevy_oxr::xr_input::prototype_locomotion::{proto_locomotion, PrototypeLocomotionConfig}; use bevy_oxr::xr_input::trackers::{ OpenXRController, OpenXRLeftController, OpenXRRightController, OpenXRTracker, @@ -16,7 +17,8 @@ use bevy_oxr::DefaultXrPlugins; #[bevy_main] fn main() { let mut xr_extensions = XrExtensions::default(); - xr_extensions.enable_fb_passthrough(); + // xr_extensions.enable_fb_passthrough(); + xr_extensions.enable_hand_tracking(); App::new() .add_plugins(DefaultXrPlugins { reqeusted_extensions: xr_extensions, @@ -25,16 +27,28 @@ fn main() { }, prefered_blend_mode: bevy_oxr::graphics::XrPreferdBlendMode::Opaque, }) - .add_plugins(OpenXrDebugRenderer) + // .add_plugins(OpenXrDebugRenderer) .add_plugins(LogDiagnosticsPlugin::default()) .add_plugins(FrameTimeDiagnosticsPlugin) + .add_plugins(HandInputDebugRenderer) + // .add_plugins(bevy_oxr::passthrough::EnablePassthroughStartup) .add_systems(Startup, setup) - .add_systems(Update, (proto_locomotion, toggle_passthrough)) + .add_systems( + Update, + (proto_locomotion, toggle_passthrough).run_if(xr_only()), + ) + .add_systems(Update, debug_hand_render.run_if(xr_only())) .add_systems(Startup, spawn_controllers_example) .insert_resource(PrototypeLocomotionConfig::default()) .run(); } +fn debug_hand_render(query: Query<&GlobalTransform, With>, mut gizmos: Gizmos) { + for transform in &query { + gizmos.sphere(transform.translation(), Quat::IDENTITY, 0.01, Color::RED); + } +} + /// set up a simple 3D scene fn setup( mut commands: Commands, @@ -43,21 +57,21 @@ fn setup( ) { // plane commands.spawn(PbrBundle { - mesh: meshes.add(shape::Plane::from_size(5.0).into()), - material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()), + mesh: meshes.add(Plane3d::new(Vec3::Y)), + material: materials.add(StandardMaterial::from(Color::rgb(0.3, 0.5, 0.3))), ..default() }); // cube commands.spawn(PbrBundle { - mesh: meshes.add(Mesh::from(shape::Cube { size: 0.1 })), - material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), + mesh: meshes.add(Cuboid::from_size(Vec3::splat(0.1)).mesh()), + material: materials.add(StandardMaterial::from(Color::rgb(0.8, 0.7, 0.6))), transform: Transform::from_xyz(0.0, 0.5, 0.0), ..default() }); // cube commands.spawn(PbrBundle { - mesh: meshes.add(Mesh::from(shape::Cube { size: 0.1 })), - material: materials.add(Color::rgb(0.8, 0.0, 0.0).into()), + mesh: meshes.add(Mesh::from(Cuboid::from_size(Vec3::splat(0.1)))), + material: materials.add(StandardMaterial::from(Color::rgb(0.8, 0.0, 0.0))), transform: Transform::from_xyz(0.0, 0.5, 1.0), ..default() }); @@ -90,15 +104,22 @@ fn spawn_controllers_example(mut commands: Commands) { )); } -// Does this work? Not getting logs -fn toggle_passthrough(keys: Res>, mut xr_data: ResMut) { +// TODO: make this a vr button +fn toggle_passthrough( + keys: Res>, + passthrough_state: Res, + mut resume: EventWriter, + mut pause: EventWriter, +) { if keys.just_pressed(KeyCode::Space) { - if xr_data.xr_passthrough_active { - passthrough_layer_pause(xr_data); - bevy::log::info!("Passthrough paused"); - } else { - passthrough_layer_resume(xr_data); - bevy::log::info!("Passthrough resumed"); + match *passthrough_state { + XrPassthroughState::Unsupported => {} + XrPassthroughState::Running => { + pause.send_default(); + } + XrPassthroughState::Paused => { + resume.send_default(); + } } } } diff --git a/examples/demo/Cargo.toml b/examples/demo/Cargo.toml index 14e39de..00df137 100644 --- a/examples/demo/Cargo.toml +++ b/examples/demo/Cargo.toml @@ -9,9 +9,10 @@ crate-type = ["rlib", "cdylib"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bevy = "0.12" +bevy = "0.13" bevy_oxr.path = "../../" -bevy_rapier3d = { git = "https://github.com/devil-ira/bevy_rapier", branch = "bevy-0.12" } +# bevy_rapier3d = { git = "https://github.com/devil-ira/bevy_rapier", branch = "bevy-0.12" } +bevy_rapier3d = "0.25" color-eyre = "0.6.2" diff --git a/examples/demo/manifest.yaml b/examples/demo/manifest.yaml index 730187a..d4085c4 100644 --- a/examples/demo/manifest.yaml +++ b/examples/demo/manifest.yaml @@ -3,26 +3,29 @@ android: - "runtime_libs" manifest: package: "org.bevyengine.demo_openxr_android" - # Are features and permissions fliped? uses_feature: - name: "android.hardware.vr.headtracking" required: true - name: "oculus.software.handtracking" - required: false - # - name: "com.oculus.feature.PASSTHROUGH" - # required: true + required: true + - name: "com.oculus.feature.PASSTHROUGH" + required: true + - name: "com.oculus.experimental.enabled" + required: true uses_permission: - name: "com.oculus.permission.HAND_TRACKING" application: label: "Bevy Openxr Android" theme: "@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen" meta_data: + - name: "com.oculus.intent.category.VR" + value: "vr_only" - name: "com.samsung.android.vr.application.mode" value: "vr_only" - name: "com.oculus.supportedDevices" - value: "quest|quest2|quest3" + value: "quest|quest2|quest3|questpro" activities: - - config_changes: "density|keyboard|keyboardHidden|navigation|orientation|screenLayout|screenSize|uiMode" + - config_changes: "density|keyboard|keyboardHidden|navigation|orientation|screenLayout|screenSize|uiMode|screenLayout" launch_mode: "singleTask" orientation: "landscape" intent_filters: @@ -31,5 +34,6 @@ android: categories: - "com.oculus.intent.category.VR" - "android.intent.category.LAUNCHER" + - "org.khronos.openxr.intent.category.IMMERSIVE_HMD" sdk: target_sdk_version: 32 diff --git a/examples/demo/src/lib.rs b/examples/demo/src/lib.rs index 22529c7..8ddaf28 100644 --- a/examples/demo/src/lib.rs +++ b/examples/demo/src/lib.rs @@ -3,8 +3,9 @@ use std::{f32::consts::PI, ops::Mul, time::Duration}; use bevy::{ diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}, ecs::schedule::ScheduleLabel, - input::{keyboard::KeyCode, Input}, + input::{keyboard::KeyCode, ButtonInput}, log::info, + math::primitives::{Capsule3d, Cuboid}, prelude::{ bevy_main, default, shape, App, Assets, Color, Commands, Component, Entity, Event, EventReader, EventWriter, FixedUpdate, Gizmos, GlobalTransform, IntoSystemConfigs, @@ -12,6 +13,7 @@ use bevy::{ Schedule, SpatialBundle, StandardMaterial, Startup, Transform, Update, Vec3, Vec3Swizzles, With, Without, World, }, + render::mesh::Meshable, time::{Fixed, Time, Timer, TimerMode}, transform::TransformSystem, }; @@ -19,11 +21,11 @@ use bevy_oxr::{ graphics::{extensions::XrExtensions, XrAppInfo, XrPreferdBlendMode}, input::XrInput, resources::{XrFrameState, XrInstance, XrSession}, - xr_init::{xr_only, XrEnableRequest, XrEnableStatus}, + xr_init::{xr_only, XrStatus}, xr_input::{ actions::XrActionSets, debug_gizmos::OpenXrDebugRenderer, - hands::common::{HandInputDebugRenderer, HandResource, HandsResource, OpenXrHandInput}, + hands::common::{HandInputDebugRenderer, HandResource, HandsResource}, hands::HandBone, interactions::{ draw_interaction_gizmos, draw_socket_gizmos, interactions, socket_interactions, @@ -41,19 +43,18 @@ use bevy_oxr::{ DefaultXrPlugins, }; -fn input_stuff( - keys: Res>, - status: Res, - mut request: EventWriter, -) { - if keys.just_pressed(KeyCode::Space) { - match status.into_inner() { - XrEnableStatus::Enabled => request.send(XrEnableRequest::TryDisable), - XrEnableStatus::Disabled => request.send(XrEnableRequest::TryEnable), - XrEnableStatus::Waiting => (), - } - } -} +// fn input_stuff( +// keys: Res>, +// status: Res, +// mut request: EventWriter, +// ) { +// if keys.just_pressed(KeyCode::Space) { +// match status.into_inner() { +// XrEnableStatus::Enabled => request.send(XrEnableRequest::TryDisable), +// XrEnableStatus::Disabled => request.send(XrEnableRequest::TryEnable), +// } +// } +// } mod setup; use crate::setup::setup_scene; @@ -66,8 +67,9 @@ pub fn main() { info!("Running bevy_openxr demo"); let mut app = App::new(); let mut xr_extensions = XrExtensions::default(); + xr_extensions.enable_fb_passthrough(); - app.add_systems(Update, input_stuff) + app //lets get the usual diagnostic stuff added .add_plugins(LogDiagnosticsPlugin::default()) .add_plugins(FrameTimeDiagnosticsPlugin) @@ -120,7 +122,7 @@ pub fn main() { //test capsule .add_systems(Startup, spawn_capsule) //physics hands - .add_plugins(OpenXrHandInput) + // .add_plugins(OpenXrHandInput) .add_plugins(HandInputDebugRenderer) .add_systems(Startup, spawn_physics_hands) .add_systems( @@ -226,12 +228,8 @@ fn spawn_capsule( ) { commands.spawn(( PbrBundle { - mesh: meshes.add(Mesh::from(shape::Capsule { - radius: 0.033, - depth: 0.115, - ..default() - })), - material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), + mesh: meshes.add(Capsule3d::new(0.033, 0.115).mesh()), + material: materials.add(StandardMaterial::from(Color::rgb(0.8, 0.7, 0.6))), transform: Transform::from_xyz(0.0, 2.0, 0.0), ..default() }, @@ -376,7 +374,7 @@ fn update_physics_hands( &Hand, &mut Velocity, )>, - hand_query: Query<(&Transform, &HandBone, &Hand, Without)>, + hand_query: Query<(&Transform, &HandBone, &Hand), Without>, time: Res