Merge pull request #71 from Schmarni-Dev/disabling-pipelined-rendering

allow disabling of pipelined rendering
This commit is contained in:
Schmarni
2024-02-22 21:50:09 +01:00
committed by GitHub
4 changed files with 44 additions and 21 deletions

View File

@@ -5,7 +5,6 @@ use bevy_oxr::graphics::extensions::XrExtensions;
use bevy_oxr::graphics::XrAppInfo; use bevy_oxr::graphics::XrAppInfo;
use bevy_oxr::passthrough::{PausePassthrough, ResumePassthrough, XrPassthroughState}; use bevy_oxr::passthrough::{PausePassthrough, ResumePassthrough, XrPassthroughState};
use bevy_oxr::xr_init::xr_only; 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::common::HandInputDebugRenderer;
use bevy_oxr::xr_input::hands::HandBone; use bevy_oxr::xr_input::hands::HandBone;
use bevy_oxr::xr_input::prototype_locomotion::{proto_locomotion, PrototypeLocomotionConfig}; use bevy_oxr::xr_input::prototype_locomotion::{proto_locomotion, PrototypeLocomotionConfig};
@@ -17,7 +16,7 @@ use bevy_oxr::DefaultXrPlugins;
#[bevy_main] #[bevy_main]
fn main() { fn main() {
let mut xr_extensions = XrExtensions::default(); let mut xr_extensions = XrExtensions::default();
// xr_extensions.enable_fb_passthrough(); xr_extensions.enable_fb_passthrough();
xr_extensions.enable_hand_tracking(); xr_extensions.enable_hand_tracking();
App::new() App::new()
.add_plugins(DefaultXrPlugins { .add_plugins(DefaultXrPlugins {
@@ -25,13 +24,14 @@ fn main() {
app_info: XrAppInfo { app_info: XrAppInfo {
name: "Bevy OXR Android Example".into(), name: "Bevy OXR Android Example".into(),
}, },
prefered_blend_mode: bevy_oxr::graphics::XrPreferdBlendMode::Opaque, enable_pipelined_rendering: false,
..Default::default()
}) })
// .add_plugins(OpenXrDebugRenderer) // .add_plugins(OpenXrDebugRenderer)
.add_plugins(LogDiagnosticsPlugin::default()) .add_plugins(LogDiagnosticsPlugin::default())
.add_plugins(FrameTimeDiagnosticsPlugin) .add_plugins(FrameTimeDiagnosticsPlugin)
.add_plugins(HandInputDebugRenderer) .add_plugins(HandInputDebugRenderer)
// .add_plugins(bevy_oxr::passthrough::EnablePassthroughStartup) .add_plugins(bevy_oxr::passthrough::EnablePassthroughStartup)
.add_systems(Startup, setup) .add_systems(Startup, setup)
.add_systems( .add_systems(
Update, Update,

View File

@@ -76,10 +76,10 @@ pub fn main() {
//lets get the xr defaults added //lets get the xr defaults added
.add_plugins(DefaultXrPlugins { .add_plugins(DefaultXrPlugins {
reqeusted_extensions: xr_extensions, reqeusted_extensions: xr_extensions,
prefered_blend_mode: XrPreferdBlendMode::Opaque,
app_info: XrAppInfo { app_info: XrAppInfo {
name: "Bevy OXR Demo".into(), name: "Bevy OXR Demo".into(),
}, },
..Default::default()
}) })
//lets add the debug renderer for the controllers //lets add the debug renderer for the controllers
.add_plugins(OpenXrDebugRenderer) .add_plugins(OpenXrDebugRenderer)

View File

@@ -46,11 +46,11 @@ pub const LEFT_XR_TEXTURE_HANDLE: ManualTextureViewHandle = ManualTextureViewHan
pub const RIGHT_XR_TEXTURE_HANDLE: ManualTextureViewHandle = ManualTextureViewHandle(3383858418); pub const RIGHT_XR_TEXTURE_HANDLE: ManualTextureViewHandle = ManualTextureViewHandle(3383858418);
/// Adds OpenXR support to an App /// Adds OpenXR support to an App
#[derive(Default)]
pub struct OpenXrPlugin { pub struct OpenXrPlugin {
reqeusted_extensions: XrExtensions, pub reqeusted_extensions: XrExtensions,
prefered_blend_mode: XrPreferdBlendMode, pub prefered_blend_mode: XrPreferdBlendMode,
app_info: XrAppInfo, pub app_info: XrAppInfo,
pub enable_pipelined_rendering: bool,
} }
impl Plugin for OpenXrPlugin { impl Plugin for OpenXrPlugin {
@@ -114,6 +114,9 @@ impl Plugin for OpenXrPlugin {
app.add_plugins(RenderPlugin::default()); app.add_plugins(RenderPlugin::default());
app.insert_resource(XrStatus::Disabled); app.insert_resource(XrStatus::Disabled);
} }
if self.enable_pipelined_rendering {
app.insert_resource(DoPipelinedRendering);
}
app.add_systems(XrPostCleanup, clean_resources); app.add_systems(XrPostCleanup, clean_resources);
app.add_systems(XrPostCleanup, || info!("Main World Post Cleanup!")); app.add_systems(XrPostCleanup, || info!("Main World Post Cleanup!"));
app.add_systems( app.add_systems(
@@ -166,6 +169,9 @@ impl Plugin for OpenXrPlugin {
} }
} }
#[derive(Resource)]
struct DoPipelinedRendering;
fn clean_resources_render(mut cmds: &mut World) { fn clean_resources_render(mut cmds: &mut World) {
// let session = cmds.remove_resource::<XrSession>().unwrap(); // let session = cmds.remove_resource::<XrSession>().unwrap();
cmds.remove_resource::<XrSession>(); cmds.remove_resource::<XrSession>();
@@ -221,16 +227,26 @@ fn xr_skip_frame(
} }
} }
#[derive(Default)]
pub struct DefaultXrPlugins { pub struct DefaultXrPlugins {
pub reqeusted_extensions: XrExtensions, pub reqeusted_extensions: XrExtensions,
pub prefered_blend_mode: XrPreferdBlendMode, pub prefered_blend_mode: XrPreferdBlendMode,
pub app_info: XrAppInfo, pub app_info: XrAppInfo,
pub enable_pipelined_rendering: bool,
}
impl Default for DefaultXrPlugins {
fn default() -> Self {
Self {
reqeusted_extensions: default(),
prefered_blend_mode: default(),
app_info: default(),
enable_pipelined_rendering: true,
}
}
} }
impl PluginGroup for DefaultXrPlugins { impl PluginGroup for DefaultXrPlugins {
fn build(self) -> PluginGroupBuilder { fn build(self) -> PluginGroupBuilder {
DefaultPlugins let plugins = DefaultPlugins
.build() .build()
.set(TaskPoolPlugin { .set(TaskPoolPlugin {
task_pool_options: TaskPoolOptions { task_pool_options: TaskPoolOptions {
@@ -243,12 +259,12 @@ impl PluginGroup for DefaultXrPlugins {
..default() ..default()
}, },
}) })
// .disable::<PipelinedRenderingPlugin>()
.disable::<RenderPlugin>() .disable::<RenderPlugin>()
.add_before::<RenderPlugin, _>(OpenXrPlugin { .add_before::<RenderPlugin, _>(OpenXrPlugin {
prefered_blend_mode: self.prefered_blend_mode, prefered_blend_mode: self.prefered_blend_mode,
reqeusted_extensions: self.reqeusted_extensions, reqeusted_extensions: self.reqeusted_extensions,
app_info: self.app_info.clone(), app_info: self.app_info.clone(),
enable_pipelined_rendering: self.enable_pipelined_rendering,
}) })
.add_after::<OpenXrPlugin, _>(XrInitPlugin) .add_after::<OpenXrPlugin, _>(XrInitPlugin)
.add(XrInputPlugin) .add(XrInputPlugin)
@@ -276,7 +292,12 @@ impl PluginGroup for DefaultXrPlugins {
#[cfg(target_os = "android")] #[cfg(target_os = "android")]
close_when_requested: true, close_when_requested: true,
..default() ..default()
}) });
if !self.enable_pipelined_rendering {
plugins.disable::<PipelinedRenderingPlugin>()
} else {
plugins
}
} }
} }
@@ -369,11 +390,13 @@ pub fn xr_wait_frame(
} }
}; };
let should_render = world.get_resource::<XrFrameState>().unwrap().should_render; let should_render = world.get_resource::<XrFrameState>().unwrap().should_render;
let mut frame_state = world.resource_mut::<XrFrameState>(); if world.contains_resource::<DoPipelinedRendering>() {
frame_state.predicted_display_time = xr::Time::from_nanos( let mut frame_state = world.resource_mut::<XrFrameState>();
frame_state.predicted_display_time.as_nanos() frame_state.predicted_display_time = xr::Time::from_nanos(
+ frame_state.predicted_display_period.as_nanos(), frame_state.predicted_display_time.as_nanos()
); + frame_state.predicted_display_period.as_nanos(),
);
}
**world.get_resource_mut::<XrShouldRender>().unwrap() = should_render; **world.get_resource_mut::<XrShouldRender>().unwrap() = should_render;
**world.get_resource_mut::<XrHasWaited>().unwrap() = true; **world.get_resource_mut::<XrHasWaited>().unwrap() = true;
} }

View File

@@ -176,9 +176,9 @@ pub fn update_hand_bones(
}; };
let left_hand_data = hand_ref.get_poses(Hand::Left); let left_hand_data = hand_ref.get_poses(Hand::Left);
let right_hand_data = hand_ref.get_poses(Hand::Right); let right_hand_data = hand_ref.get_poses(Hand::Right);
if left_hand_data.is_none() || right_hand_data.is_none() { // if left_hand_data.is_none() || right_hand_data.is_none() {
error!("something is very wrong for hand_tracking!! doesn't have data for both hands!"); // error!("something is very wrong for hand_tracking!! doesn't have data for both hands!");
} // }
bones bones
.par_iter_mut() .par_iter_mut()