diff --git a/src/graphics/vulkan.rs b/src/graphics/vulkan.rs index ac0948d..f4ca0f0 100644 --- a/src/graphics/vulkan.rs +++ b/src/graphics/vulkan.rs @@ -356,7 +356,7 @@ pub fn start_xr_session( }); let swapchain_format = surface .as_ref() - .map(|surface| surface.get_capabilities(&wgpu_adapter).formats[0]) + .map(|surface| surface.get_capabilities(wgpu_adapter).formats[0]) .unwrap_or(wgpu::TextureFormat::Rgba8UnormSrgb); let resolution = uvec2( @@ -387,6 +387,7 @@ pub fn start_xr_session( let buffers = images .into_iter() .map(|color_image| { + info!("image map swapchain"); let color_image = vk::Image::from_raw(color_image); let wgpu_hal_texture = unsafe { ::Device::texture_from_raw( @@ -449,6 +450,7 @@ pub fn start_xr_session( .into(), XrInput::new(xr_instance, &session.into_any_graphics())?, Vec::default().into(), + // Feels wrong to return a FrameState here, we probably should just wait for the next frame xr::FrameState { predicted_display_time: xr::Time::from_nanos(1), predicted_display_period: xr::Duration::from_nanos(1), diff --git a/src/lib.rs b/src/lib.rs index 80382aa..83b09f1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -154,20 +154,20 @@ impl Plugin for OpenXrPlugin { .after(RenderSet::ExtractCommands), // .in_set(RenderSet::Prepare), ); - render_app.add_systems( - Render, - ( - locate_views, - xr_input::xr_camera::xr_camera_head_sync, - sync_simple_transforms, - propagate_transforms, - update_cam_views, - ) - .chain() - .run_if(xr_only()) - // .run_if(xr_render_only()) - .in_set(RenderSet::Prepare), - ); + // render_app.add_systems( + // Render, + // ( + // locate_views, + // xr_input::xr_camera::xr_camera_head_sync_render, + // // sync_simple_transforms, + // // propagate_transforms, + // // update_cam_views, + // ) + // .chain() + // .run_if(xr_only()) + // // .run_if(xr_render_only()) + // .in_set(RenderSet::Prepare), + // ); render_app.add_systems( Render, xr_end_frame @@ -187,6 +187,8 @@ impl Plugin for OpenXrPlugin { } } +// Confirmed Working +// Not Working Actually, the cam doesn't render with the new pose for some reason fn update_cam_views(mut query: Query<(&mut ExtractedView, &GlobalTransform)>) { for (mut view, transform) in &mut query { view.transform = *transform; @@ -199,7 +201,6 @@ fn xr_skip_frame( environment_blend_mode: Res, ) { let swapchain: &Swapchain = &xr_swapchain; - // swapchain.begin().unwrap(); match swapchain { Swapchain::Vulkan(swap) => { swap.stream @@ -344,10 +345,14 @@ pub fn xr_wait_frame( return; } }; - frame_state.predicted_display_time = xr::Time::from_nanos( + info!( + "Post Wait Time: {}", frame_state.predicted_display_time.as_nanos() - + frame_state.predicted_display_period.as_nanos(), ); + // frame_state.predicted_display_time = xr::Time::from_nanos( + // frame_state.predicted_display_time.as_nanos() + // + frame_state.predicted_display_period.as_nanos(), + // ); info!("Post Frame Wait"); **should_render = frame_state.should_render; **waited = true; @@ -406,6 +411,10 @@ pub fn xr_end_frame( } { let _span = info_span!("xr_end_frame").entered(); + info!( + "End Frame Time: {}", + xr_frame_state.predicted_display_time.as_nanos() + ); let result = swapchain.end( xr_frame_state.predicted_display_time, &views, diff --git a/src/resource_macros.rs b/src/resource_macros.rs index 735ec50..bb83a63 100644 --- a/src/resource_macros.rs +++ b/src/resource_macros.rs @@ -32,6 +32,35 @@ macro_rules! xr_resource_wrapper { }; } +#[macro_export] +macro_rules! xr_resource_wrapper_no_extract { + ($wrapper_type:ident, $xr_type:ty) => { + #[derive( + Clone, Copy, bevy::prelude::Resource, bevy::prelude::Deref, bevy::prelude::DerefMut, + )] + pub struct $wrapper_type($xr_type); + + impl $wrapper_type { + pub fn new(value: $xr_type) -> Self { + Self(value) + } + } + + // impl std::ops::Deref for $wrapper_type { + // type Target = $xr_type; + // + // fn deref(&self) -> &Self::Target { + // &self.0 + // } + // } + + impl From<$xr_type> for $wrapper_type { + fn from(value: $xr_type) -> Self { + Self::new(value) + } + } + }; +} #[macro_export] macro_rules! xr_arc_resource_wrapper { ($wrapper_type:ident, $xr_type:ty) => { diff --git a/src/resources.rs b/src/resources.rs index da72cf6..2854abc 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -4,10 +4,10 @@ use std::sync::Mutex; use crate::input::XrInput; // use crate::passthrough::XrPassthroughLayer; -use crate::resource_macros::*; use crate::xr_init::XrStatus; +use crate::{resource_macros::*, xr_resource_wrapper_no_extract}; use bevy::prelude::*; -use bevy::render::extract_resource::ExtractResourcePlugin; +use bevy::render::extract_resource::{ExtractResource, ExtractResourcePlugin}; use openxr as xr; xr_resource_wrapper!(XrInstance, xr::Instance); @@ -15,12 +15,24 @@ xr_resource_wrapper!(XrSession, xr::Session); xr_resource_wrapper!(XrEnvironmentBlendMode, xr::EnvironmentBlendMode); xr_resource_wrapper!(XrResolution, UVec2); xr_resource_wrapper!(XrFormat, wgpu::TextureFormat); -xr_resource_wrapper!(XrFrameState, xr::FrameState); +xr_resource_wrapper_no_extract!(XrFrameState, xr::FrameState); xr_resource_wrapper!(XrViews, Vec); xr_arc_resource_wrapper!(XrSessionRunning, AtomicBool); xr_arc_resource_wrapper!(XrSwapchain, Swapchain); xr_no_clone_resource_wrapper!(XrFrameWaiter, xr::FrameWaiter); +impl ExtractResource for XrFrameState { + type Source = Self; + + fn extract_resource(source: &Self::Source) -> Self { + let mut state = *source; + state.predicted_display_time = xr::Time::from_nanos( + state.predicted_display_time.as_nanos() + state.predicted_display_period.as_nanos(), + ); + state + } +} + pub(crate) struct VulkanOXrSessionSetupInfo { pub(crate) device_ptr: *const c_void, pub(crate) physical_device_ptr: *const c_void, diff --git a/src/xr_input/mod.rs b/src/xr_input/mod.rs index ac2e13b..ee88e4d 100644 --- a/src/xr_input/mod.rs +++ b/src/xr_input/mod.rs @@ -36,7 +36,7 @@ use self::trackers::{ adopt_open_xr_trackers, update_open_xr_controllers, OpenXRLeftEye, OpenXRRightEye, OpenXRTrackingRoot, }; -use self::xr_camera::{XrCameraType, TransformExtract}; +use self::xr_camera::{GlobalTransformExtract, TransformExtract, XrCameraType}; #[derive(Copy, Clone)] pub struct OpenXrInput { @@ -87,6 +87,7 @@ impl Plugin for OpenXrInput { app.add_plugins(ExtractComponentPlugin::::default()); app.add_plugins(ExtractComponentPlugin::::default()); app.add_plugins(ExtractComponentPlugin::::default()); + app.add_plugins(ExtractComponentPlugin::::default()); } } diff --git a/src/xr_input/xr_camera.rs b/src/xr_input/xr_camera.rs index 912b3ec..50d38ed 100644 --- a/src/xr_input/xr_camera.rs +++ b/src/xr_input/xr_camera.rs @@ -7,7 +7,7 @@ use bevy::prelude::*; use bevy::render::camera::{CameraProjection, CameraRenderGraph, RenderTarget}; use bevy::render::extract_component::ExtractComponent; use bevy::render::primitives::Frustum; -use bevy::render::view::{ColorGrading, VisibleEntities}; +use bevy::render::view::{ColorGrading, ExtractedView, VisibleEntities}; use openxr::Fovf; #[derive(Bundle)] @@ -79,6 +79,7 @@ impl ExtractComponent for GlobalTransformExtract { Some(*item) } } + #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] pub enum Eye { Left = 0, @@ -271,7 +272,7 @@ impl CameraProjection for XRProjection { } pub fn xr_camera_head_sync( - views: ResMut, + views: Res, mut query: Query<(&mut Transform, &XrCameraType, &mut XRProjection)>, ) { //TODO calculate HMD position @@ -290,3 +291,25 @@ pub fn xr_camera_head_sync( transform.translation = view.pose.position.to_vec3(); } } +pub fn xr_camera_head_sync_render( + views: Res, + mut query: Query<(&mut ExtractedView, &XrCameraType)>, +) { + //TODO calculate HMD position + for (mut transform, camera_type) in query.iter_mut() { + // let mut t = Transform::IDENTITY; + // let view_idx = match camera_type { + // XrCameraType::Xr(eye) => *eye as usize, + // // I don't belive we need a flatscrenn cam, that's just a cam without this component + // XrCameraType::Flatscreen => continue, + // }; + // let view = match views.get(view_idx) { + // Some(views) => views, + // None => continue, + // }; + // t.rotation = view.pose.orientation.to_quat(); + // t.translation = view.pose.position.to_vec3(); + info!("cam update"); + transform.transform = GlobalTransform::IDENTITY; + } +}