From a0099bc4a78aeb197f3b1ed33846ba804a21f82d Mon Sep 17 00:00:00 2001 From: awtterpip Date: Sun, 2 Jun 2024 05:23:02 -0500 Subject: [PATCH] working pipelined rendering --- .../src/openxr/features/handtracking.rs | 15 +++++++++++++-- crates/bevy_openxr/src/openxr/init.rs | 19 +++++++------------ crates/bevy_openxr/src/openxr/mod.rs | 4 ++-- crates/bevy_openxr/src/openxr/resources.rs | 15 ++------------- 4 files changed, 24 insertions(+), 29 deletions(-) diff --git a/crates/bevy_openxr/src/openxr/features/handtracking.rs b/crates/bevy_openxr/src/openxr/features/handtracking.rs index 9566276..0e92576 100644 --- a/crates/bevy_openxr/src/openxr/features/handtracking.rs +++ b/crates/bevy_openxr/src/openxr/features/handtracking.rs @@ -6,6 +6,7 @@ use bevy_xr::{ }; use openxr::SpaceLocationFlags; +use crate::resources::Pipelined; use crate::{ init::OxrTrackingRoot, reference_space::{OxrPrimaryReferenceSpace, OxrReferenceSpace}, @@ -139,12 +140,22 @@ fn locate_hands( &OxrHandBoneEntities, )>, mut bone_query: Query<(&HandBone, &mut HandBoneRadius, &mut Transform)>, + pipelined: Option>, ) { for (tracker, ref_space, hand_entities) in &tracker_query { let ref_space = ref_space.map(|v| &v.0).unwrap_or(&default_ref_space.0); // relate_hand_joints also provides velocities - let joints = match ref_space.locate_hand_joints(tracker, frame_state.predicted_display_time) - { + let joints = match ref_space.locate_hand_joints( + tracker, + if pipelined.is_some() { + openxr::Time::from_nanos( + frame_state.predicted_display_time.as_nanos() + + frame_state.predicted_display_period.as_nanos(), + ) + } else { + frame_state.predicted_display_time + }, + ) { Ok(Some(v)) => v, Ok(None) => continue, Err(openxr::sys::Result::ERROR_EXTENSION_NOT_PRESENT) => { diff --git a/crates/bevy_openxr/src/openxr/init.rs b/crates/bevy_openxr/src/openxr/init.rs index 2822e4f..d1da5bd 100644 --- a/crates/bevy_openxr/src/openxr/init.rs +++ b/crates/bevy_openxr/src/openxr/init.rs @@ -31,7 +31,7 @@ use crate::resources::*; use crate::types::*; pub fn session_started(started: Option>) -> bool { - started.is_some_and(|started| started.get()) + started.is_some_and(|started| started.0) } pub fn should_render(frame_state: Option>) -> bool { @@ -109,6 +109,7 @@ impl Plugin for OxrInitPlugin { }, ExtractResourcePlugin::::default(), ExtractResourcePlugin::::default(), + ExtractResourcePlugin::::default(), )) .init_schedule(OxrLast) .init_schedule(OxrSessionCreated) @@ -180,13 +181,7 @@ impl Plugin for OxrInitPlugin { } }; - let session_started = OxrSessionStarted::default(); - - app.insert_resource(session_started.clone()); - - let render_app = app.sub_app_mut(RenderApp); - - render_app.insert_resource(session_started); + app.insert_resource(OxrSessionStarted(false)); } } @@ -489,18 +484,18 @@ pub fn create_xr_session(world: &mut World) { } } -pub fn begin_xr_session(session: Res, session_started: Res) { +pub fn begin_xr_session(session: Res, mut session_started: ResMut) { let _span = info_span!("xr_begin_session"); session .begin(openxr::ViewConfigurationType::PRIMARY_STEREO) .expect("Failed to begin session"); - session_started.set(true); + session_started.0 = true; } -pub fn end_xr_session(session: Res, session_started: Res) { +pub fn end_xr_session(session: Res, mut session_started: ResMut) { let _span = info_span!("xr_end_session"); session.end().expect("Failed to end session"); - session_started.set(false); + session_started.0 = false; } /// This is used solely to transport resources from the main world to the render world. diff --git a/crates/bevy_openxr/src/openxr/mod.rs b/crates/bevy_openxr/src/openxr/mod.rs index b4428e2..11fe352 100644 --- a/crates/bevy_openxr/src/openxr/mod.rs +++ b/crates/bevy_openxr/src/openxr/mod.rs @@ -1,7 +1,7 @@ // use actions::XrActionPlugin; use bevy::{ app::{PluginGroup, PluginGroupBuilder}, - render::{pipelined_rendering::PipelinedRenderingPlugin, RenderPlugin}, + render::RenderPlugin, utils::default, window::{PresentMode, Window, WindowPlugin}, }; @@ -34,7 +34,7 @@ pub fn add_xr_plugins(plugins: G) -> PluginGroupBuilder { plugins .build() .disable::() - .disable::() + // .disable::() .add_before::(XrSessionPlugin) .add_before::(OxrInitPlugin::default()) .add(OxrReferenceSpacePlugin::default()) diff --git a/crates/bevy_openxr/src/openxr/resources.rs b/crates/bevy_openxr/src/openxr/resources.rs index 14ae487..4f15594 100644 --- a/crates/bevy_openxr/src/openxr/resources.rs +++ b/crates/bevy_openxr/src/openxr/resources.rs @@ -1,4 +1,3 @@ -use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use bevy::prelude::*; @@ -440,18 +439,8 @@ pub struct SessionConfigInfo { pub graphics_info: SessionCreateInfo, } -#[derive(Resource, Clone, Default)] -pub struct OxrSessionStarted(Arc); - -impl OxrSessionStarted { - pub fn set(&self, val: bool) { - self.0.store(val, Ordering::SeqCst); - } - - pub fn get(&self) -> bool { - self.0.load(Ordering::SeqCst) - } -} +#[derive(ExtractResource, Resource, Clone, Default)] +pub struct OxrSessionStarted(pub bool); /// The frame state returned from [FrameWaiter::wait_frame](openxr::FrameWaiter::wait) #[derive(Clone, Deref, DerefMut, Resource, ExtractResource)]