This commit is contained in:
Schmarni
2024-01-14 00:15:14 +01:00
parent aae751bdab
commit cbf9485bb7
11 changed files with 224 additions and 164 deletions

View File

@@ -50,7 +50,6 @@ fn input_stuff(
match status.into_inner() { match status.into_inner() {
XrEnableStatus::Enabled => request.send(XrEnableRequest::TryDisable), XrEnableStatus::Enabled => request.send(XrEnableRequest::TryDisable),
XrEnableStatus::Disabled => request.send(XrEnableRequest::TryEnable), XrEnableStatus::Disabled => request.send(XrEnableRequest::TryEnable),
XrEnableStatus::Waiting => (),
} }
} }
} }

View File

@@ -172,8 +172,7 @@ fn pull_to_ground(
let (globe_pos, globe) = globe.single(); let (globe_pos, globe) = globe.single();
// Get player position (position of playground + position within playground) // Get player position (position of playground + position within playground)
let v = views.lock().unwrap(); let Some(view) = views.first() else { return };
let Some(view) = v.get(0) else { return };
let mut hmd_translation = view.pose.position.to_vec3(); let mut hmd_translation = view.pose.position.to_vec3();
hmd_translation.y = 0.0; hmd_translation.y = 0.0;
let local = root.translation; let local = root.translation;

View File

@@ -167,8 +167,6 @@ fn prototype_interaction_input(
>, >,
action_sets: Res<XrActionSets>, action_sets: Res<XrActionSets>,
) { ) {
//lock frame
let frame_state = *frame_state.lock().unwrap();
//get controller //get controller
let controller = oculus_controller.get_ref(&session, &frame_state, &xr_input, &action_sets); let controller = oculus_controller.get_ref(&session, &frame_state, &xr_input, &action_sets);
//get controller triggers //get controller triggers

View File

@@ -1,14 +1,19 @@
pub mod extensions; pub mod extensions;
mod vulkan; mod vulkan;
use bevy::render::renderer::{RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue}; use bevy::ecs::query::With;
use bevy::window::RawHandleWrapper; use bevy::ecs::system::{Query, SystemState};
use bevy::ecs::world::World;
use bevy::render::renderer::{
RenderAdapter, RenderAdapterInfo, RenderDevice, RenderInstance, RenderQueue,
};
use bevy::window::{PrimaryWindow, RawHandleWrapper};
use wgpu::Instance; use wgpu::Instance;
use crate::input::XrInput; use crate::input::XrInput;
use crate::resources::{ use crate::resources::{
XrEnvironmentBlendMode, XrFormat, XrFrameState, XrInstance, XrResolution, XrSession, OXrSessionSetupInfo, XrEnvironmentBlendMode, XrFormat, XrFrameState, XrFrameWaiter, XrInstance,
XrSessionRunning, XrSwapchain, XrViews, XrFrameWaiter, XrResolution, XrSession, XrSessionRunning, XrSwapchain, XrViews,
}; };
use openxr as xr; use openxr as xr;
@@ -39,20 +44,15 @@ impl Default for XrAppInfo {
} }
} }
pub fn initialize_xr_graphics( pub fn start_xr_session(
window: Option<RawHandleWrapper>, window: Option<RawHandleWrapper>,
reqeusted_extensions: XrExtensions, session_setup_data: &OXrSessionSetupInfo,
prefered_blend_mode: XrPreferdBlendMode, xr_instance: &XrInstance,
app_info: XrAppInfo, render_device: &RenderDevice,
render_adapter: &RenderAdapter,
wgpu_instance: &Instance,
) -> eyre::Result<( ) -> eyre::Result<(
RenderDevice,
RenderQueue,
RenderAdapterInfo,
RenderAdapter,
Instance,
XrInstance,
XrSession, XrSession,
XrEnvironmentBlendMode,
XrResolution, XrResolution,
XrFormat, XrFormat,
XrSessionRunning, XrSessionRunning,
@@ -62,8 +62,107 @@ pub fn initialize_xr_graphics(
XrViews, XrViews,
XrFrameState, XrFrameState,
)> { )> {
// vulkan::initialize_xr_graphics(window, reqeusted_extensions, prefered_blend_mode, app_info) vulkan::start_xr_session(
todo!() window,
session_setup_data,
xr_instance,
render_device,
render_adapter,
wgpu_instance,
)
}
pub fn initialize_xr_instance(
window: Option<RawHandleWrapper>,
reqeusted_extensions: XrExtensions,
prefered_blend_mode: XrPreferdBlendMode,
app_info: XrAppInfo,
) -> eyre::Result<(
XrInstance,
OXrSessionSetupInfo,
XrEnvironmentBlendMode,
RenderDevice,
RenderQueue,
RenderAdapterInfo,
RenderAdapter,
Instance,
)> {
vulkan::initialize_xr_instance(window, reqeusted_extensions, prefered_blend_mode, app_info)
}
pub fn try_full_init(
world: &mut World,
reqeusted_extensions: XrExtensions,
prefered_blend_mode: XrPreferdBlendMode,
app_info: XrAppInfo,
) -> eyre::Result<(
RenderDevice,
RenderQueue,
RenderAdapterInfo,
RenderAdapter,
RenderInstance,
)> {
let mut system_state: SystemState<Query<&RawHandleWrapper, With<PrimaryWindow>>> =
SystemState::new(world);
let primary_window = system_state.get(&world).get_single().ok().cloned();
let (
xr_instance,
setup_info,
blend_mode,
render_device,
render_queue,
render_adapter_info,
render_adapter,
wgpu_instance,
) = initialize_xr_instance(
primary_window.clone(),
reqeusted_extensions,
prefered_blend_mode,
app_info,
)?;
world.insert_resource(xr_instance);
world.insert_non_send_resource(setup_info);
// TODO: move BlendMode the session init?
world.insert_resource(blend_mode);
let setup_info = world
.get_non_send_resource::<OXrSessionSetupInfo>()
.unwrap();
let xr_instance = world.get_resource::<XrInstance>().unwrap();
let (
xr_session,
xr_resolution,
xr_format,
xr_session_running,
xr_frame_waiter,
xr_swapchain,
xr_input,
xr_views,
xr_frame_state,
) = start_xr_session(
primary_window,
setup_info,
xr_instance,
&render_device,
&render_adapter,
&wgpu_instance,
)?;
world.insert_resource(xr_session);
world.insert_resource(xr_resolution);
world.insert_resource(xr_format);
world.insert_resource(xr_session_running);
world.insert_resource(xr_frame_waiter);
world.insert_resource(xr_swapchain);
world.insert_resource(xr_input);
world.insert_resource(xr_views);
world.insert_resource(xr_frame_state);
Ok((
render_device,
render_queue,
render_adapter_info,
render_adapter,
RenderInstance(wgpu_instance.into()),
))
} }
pub fn xr_entry() -> eyre::Result<xr::Entry> { pub fn xr_entry() -> eyre::Result<xr::Entry> {

View File

@@ -306,7 +306,7 @@ pub fn initialize_xr_instance(
)) ))
} }
pub fn initialize_xr_graphics( pub fn start_xr_session(
window: Option<RawHandleWrapper>, window: Option<RawHandleWrapper>,
ptrs: &OXrSessionSetupInfo, ptrs: &OXrSessionSetupInfo,
xr_instance: &XrInstance, xr_instance: &XrInstance,
@@ -314,7 +314,6 @@ pub fn initialize_xr_graphics(
render_adapter: &RenderAdapter, render_adapter: &RenderAdapter,
wgpu_instance: &Instance, wgpu_instance: &Instance,
) -> eyre::Result<( ) -> eyre::Result<(
XrInstance,
XrSession, XrSession,
XrResolution, XrResolution,
XrFormat, XrFormat,
@@ -436,7 +435,6 @@ pub fn initialize_xr_graphics(
.collect(); .collect();
Ok(( Ok((
xr_instance.clone().into(),
session.clone().into_any_graphics().into(), session.clone().into_any_graphics().into(),
resolution.into(), resolution.into(),
swapchain_format.into(), swapchain_format.into(),

View File

@@ -1,10 +1,10 @@
use std::sync::Arc; use std::sync::Arc;
use bevy::prelude::*; use bevy::{prelude::*, render::extract_resource::ExtractResource};
use openxr as xr; use openxr as xr;
use xr::{FrameState, FrameWaiter, ViewConfigurationType}; use xr::{FrameState, FrameWaiter, ViewConfigurationType};
#[derive(Clone, Resource)] #[derive(Clone, Resource, ExtractResource)]
pub struct XrInput { pub struct XrInput {
//pub action_set: xr::ActionSet, //pub action_set: xr::ActionSet,
//pub hand_pose: xr::Action<xr::Posef>, //pub hand_pose: xr::Action<xr::Posef>,

View File

@@ -15,11 +15,13 @@ use bevy::app::{AppExit, PluginGroupBuilder};
use bevy::ecs::system::SystemState; use bevy::ecs::system::SystemState;
use bevy::prelude::*; use bevy::prelude::*;
use bevy::render::camera::{ManualTextureView, ManualTextureViewHandle, ManualTextureViews}; use bevy::render::camera::{ManualTextureView, ManualTextureViewHandle, ManualTextureViews};
use bevy::render::extract_resource::ExtractResourcePlugin;
use bevy::render::pipelined_rendering::PipelinedRenderingPlugin; use bevy::render::pipelined_rendering::PipelinedRenderingPlugin;
use bevy::render::renderer::{render_system, RenderInstance}; use bevy::render::renderer::{render_system, RenderInstance};
use bevy::render::settings::RenderCreation; use bevy::render::settings::RenderCreation;
use bevy::render::{Render, RenderApp, RenderPlugin, RenderSet}; use bevy::render::{Render, RenderApp, RenderPlugin, RenderSet};
use bevy::window::{PresentMode, PrimaryWindow, RawHandleWrapper}; use bevy::window::{PresentMode, PrimaryWindow, RawHandleWrapper};
use eyre::anyhow;
use graphics::extensions::XrExtensions; use graphics::extensions::XrExtensions;
use graphics::{XrAppInfo, XrPreferdBlendMode}; use graphics::{XrAppInfo, XrPreferdBlendMode};
use input::XrInput; use input::XrInput;
@@ -57,7 +59,6 @@ pub struct FutureXrResources(
XrResolution, XrResolution,
XrFormat, XrFormat,
XrSessionRunning, XrSessionRunning,
// XrFrameWaiter,
XrSwapchain, XrSwapchain,
XrInput, XrInput,
XrViews, XrViews,
@@ -66,68 +67,20 @@ pub struct FutureXrResources(
>, >,
>, >,
); );
// fn mr_test(mut commands: Commands, passthrough_layer: Option<Res<XrPassthroughLayer>>) {
// commands.insert_resource(ClearColor(Color::rgba(0.0, 0.0, 0.0, 0.0)));
// }
impl Plugin for OpenXrPlugin { impl Plugin for OpenXrPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
let mut system_state: SystemState<Query<&RawHandleWrapper, With<PrimaryWindow>>> =
SystemState::new(&mut app.world);
let primary_window = system_state.get(&app.world).get_single().ok().cloned();
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
match graphics::initialize_xr_graphics( match graphics::try_full_init(
primary_window.clone(), &mut app.world,
self.reqeusted_extensions.clone(), self.reqeusted_extensions.clone(),
self.prefered_blend_mode, self.prefered_blend_mode,
self.app_info.clone(), self.app_info.clone(),
) { ) {
Ok(( Ok((device, queue, adapter_info, render_adapter, instance)) => {
device,
queue,
adapter_info,
render_adapter,
instance,
xr_instance,
session,
blend_mode,
resolution,
format,
session_running,
frame_waiter,
swapchain,
input,
views,
frame_state,
)) => {
// std::thread::sleep(Duration::from_secs(5));
debug!("Configured wgpu adapter Limits: {:#?}", device.limits()); debug!("Configured wgpu adapter Limits: {:#?}", device.limits());
debug!("Configured wgpu adapter Features: {:#?}", device.features()); debug!("Configured wgpu adapter Features: {:#?}", device.features());
app.insert_resource(xr_instance.clone()); warn!("Starting in Xr");
app.insert_resource(session.clone());
app.insert_resource(blend_mode.clone());
app.insert_resource(resolution.clone());
app.insert_resource(format.clone());
app.insert_resource(session_running.clone());
app.insert_resource(frame_waiter);
app.insert_resource(swapchain.clone());
app.insert_resource(input.clone());
app.insert_resource(views.clone());
app.insert_resource(frame_state.clone());
let xr_data = XrRenderData {
xr_instance,
xr_session: session,
xr_blend_mode: blend_mode,
xr_resolution: resolution,
xr_format: format,
xr_session_running: session_running,
xr_swapchain: swapchain,
xr_input: input,
xr_views: views,
xr_frame_state: frame_state,
};
app.insert_resource(xr_data);
app.insert_resource(ActionSets(vec![])); app.insert_resource(ActionSets(vec![]));
app.add_plugins(RenderPlugin { app.add_plugins(RenderPlugin {
render_creation: RenderCreation::Manual( render_creation: RenderCreation::Manual(
@@ -135,14 +88,16 @@ impl Plugin for OpenXrPlugin {
queue, queue,
adapter_info, adapter_info,
render_adapter, render_adapter,
RenderInstance(Arc::new(instance)), instance,
), ),
}); });
app.add_plugins(ExtractResourcePlugin::<XrEnableStatus>::default());
app.insert_resource(XrEnableStatus::Enabled); app.insert_resource(XrEnableStatus::Enabled);
} }
Err(err) => { Err(err) => {
warn!("OpenXR Failed to initialize: {}", err); warn!("OpenXR Failed to initialize: {}", err);
app.add_plugins(RenderPlugin::default()); app.add_plugins(RenderPlugin::default());
app.add_plugins(ExtractResourcePlugin::<XrEnableStatus>::default());
app.insert_resource(XrEnableStatus::Disabled); app.insert_resource(XrEnableStatus::Disabled);
} }
} }
@@ -154,58 +109,48 @@ impl Plugin for OpenXrPlugin {
} }
} }
fn ready(&self, app: &App) -> bool {
app.world
.get_resource::<XrEnableStatus>()
.map(|frr| *frr != XrEnableStatus::Waiting)
.unwrap_or(true)
}
fn finish(&self, app: &mut App) { fn finish(&self, app: &mut App) {
// TODO: Split this up into the indevidual resources // TODO: Split this up into the indevidual resources
if let Some(data) = app.world.get_resource::<XrRenderData>().cloned() { if app.world.get_resource::<XrEnableStatus>() == Some(&XrEnableStatus::Enabled) {
let hands = data.xr_instance.exts().ext_hand_tracking.is_some() warn!("finished xr init");
&& data let xr_instance = app
.xr_instance .world
.get_resource::<XrInstance>()
.expect("should exist");
let xr_session = app.world.get_resource::<XrSession>().expect("should exist");
let hands = xr_instance.exts().ext_hand_tracking.is_some()
&& xr_instance
.supports_hand_tracking( .supports_hand_tracking(
data.xr_instance xr_instance
.system(FormFactor::HEAD_MOUNTED_DISPLAY) .system(FormFactor::HEAD_MOUNTED_DISPLAY)
.unwrap(), .unwrap(),
) )
.is_ok_and(|v| v); .is_ok_and(|v| v);
if hands { if hands {
app.insert_resource(HandTrackingData::new(&data.xr_session).unwrap()); app.insert_resource(HandTrackingData::new(xr_session).unwrap());
} else { } else {
app.insert_resource(DisableHandTracking::Both); app.insert_resource(DisableHandTracking::Both);
} }
// let passthrough = data.xr_instance.exts().fb_passthrough.is_some() let xr_swapchain = app
// && supports_passthrough( .world
// &data.xr_instance, .get_resource::<XrSwapchain>()
// data.xr_instance .expect("should exist");
// .system(FormFactor::HEAD_MOUNTED_DISPLAY) let xr_resolution = app
// .unwrap(), .world
// ) .get_resource::<XrResolution>()
// .is_ok_and(|v| v); .expect("should exist");
// if passthrough { let xr_format = app.world.get_resource::<XrFormat>().expect("should exist");
// info!("Passthrough!");
// let (pl, p) = start_passthrough(&data);
// app.insert_resource(pl);
// app.insert_resource(p);
// // if !app.world.contains_resource::<ClearColor>() {
// // info!("ClearColor!");
// // }
// }
let (left, right) = data.xr_swapchain.get_render_views(); let (left, right) = xr_swapchain.get_render_views();
let left = ManualTextureView { let left = ManualTextureView {
texture_view: left.into(), texture_view: left.into(),
size: *data.xr_resolution, size: **xr_resolution,
format: *data.xr_format, format: **xr_format,
}; };
let right = ManualTextureView { let right = ManualTextureView {
texture_view: right.into(), texture_view: right.into(),
size: *data.xr_resolution, size: **xr_resolution,
format: *data.xr_format, format: **xr_format,
}; };
app.add_systems(PreUpdate, xr_begin_frame.run_if(xr_only())); app.add_systems(PreUpdate, xr_begin_frame.run_if(xr_only()));
let mut manual_texture_views = app.world.resource_mut::<ManualTextureViews>(); let mut manual_texture_views = app.world.resource_mut::<ManualTextureViews>();
@@ -213,19 +158,6 @@ impl Plugin for OpenXrPlugin {
manual_texture_views.insert(RIGHT_XR_TEXTURE_HANDLE, right); manual_texture_views.insert(RIGHT_XR_TEXTURE_HANDLE, right);
drop(manual_texture_views); drop(manual_texture_views);
let render_app = app.sub_app_mut(RenderApp); let render_app = app.sub_app_mut(RenderApp);
render_app.insert_resource(data.xr_instance.clone());
render_app.insert_resource(data.xr_session.clone());
render_app.insert_resource(data.xr_blend_mode.clone());
render_app.insert_resource(data.xr_resolution.clone());
render_app.insert_resource(data.xr_format.clone());
render_app.insert_resource(data.xr_session_running.clone());
// render_app.insert_resource(data.xr_frame_waiter.clone());
render_app.insert_resource(data.xr_swapchain.clone());
render_app.insert_resource(data.xr_input.clone());
render_app.insert_resource(data.xr_views.clone());
render_app.insert_resource(data.xr_frame_state.clone());
render_app.insert_resource(XrEnableStatus::Enabled);
render_app.add_systems( render_app.add_systems(
Render, Render,
( (
@@ -262,6 +194,8 @@ impl PluginGroup for DefaultXrPlugins {
.add_before::<OpenXrPlugin, _>(RenderRestartPlugin) .add_before::<OpenXrPlugin, _>(RenderRestartPlugin)
.add(HandEmulationPlugin) .add(HandEmulationPlugin)
.add(HandTrackingPlugin) .add(HandTrackingPlugin)
.add(XrResourcePlugin)
// .add(xr_init::RenderRestartPlugin)
.set(WindowPlugin { .set(WindowPlugin {
#[cfg(not(target_os = "android"))] #[cfg(not(target_os = "android"))]
primary_window: Some(Window { primary_window: Some(Window {
@@ -302,7 +236,6 @@ pub fn xr_begin_frame(
// find quit messages! // find quit messages!
info!("entered XR state {:?}", e.state()); info!("entered XR state {:?}", e.state());
match e.state() { match e.state() {
// xr_frame_waiter: frame_waiter,
xr::SessionState::READY => { xr::SessionState::READY => {
session.begin(VIEW_TYPE).unwrap(); session.begin(VIEW_TYPE).unwrap();
session_running.store(true, std::sync::atomic::Ordering::Relaxed); session_running.store(true, std::sync::atomic::Ordering::Relaxed);
@@ -310,7 +243,6 @@ pub fn xr_begin_frame(
xr::SessionState::STOPPING => { xr::SessionState::STOPPING => {
session.end().unwrap(); session.end().unwrap();
session_running.store(false, std::sync::atomic::Ordering::Relaxed); session_running.store(false, std::sync::atomic::Ordering::Relaxed);
app_exit.send(AppExit);
} }
xr::SessionState::EXITING | xr::SessionState::LOSS_PENDING => { xr::SessionState::EXITING | xr::SessionState::LOSS_PENDING => {
app_exit.send(AppExit); app_exit.send(AppExit);
@@ -384,14 +316,20 @@ pub fn post_frame(
} }
pub fn end_frame( pub fn end_frame(
xr_frame_state: Res<XrFrameState>, xr_frame_state: Option<Res<XrFrameState>>,
views: Res<XrViews>, views: Option<Res<XrViews>>,
input: Res<XrInput>, input: Option<Res<XrInput>>,
swapchain: Res<XrSwapchain>, swapchain: Option<Res<XrSwapchain>>,
resolution: Res<XrResolution>, resolution: Option<Res<XrResolution>>,
environment_blend_mode: Res<XrEnvironmentBlendMode>, environment_blend_mode: Option<Res<XrEnvironmentBlendMode>>,
// passthrough_layer: Option<Res<XrPassthroughLayer>>, // passthrough_layer: Option<Res<XrPassthroughLayer>>,
) { ) {
let xr_frame_state = xr_frame_state.unwrap();
let views = views.unwrap();
let input = input.unwrap();
let swapchain = swapchain.unwrap();
let resolution = resolution.unwrap();
let environment_blend_mode = environment_blend_mode.unwrap();
{ {
let _span = info_span!("xr_release_image").entered(); let _span = info_span!("xr_release_image").entered();
swapchain.release_image().unwrap(); swapchain.release_image().unwrap();

View File

@@ -1,7 +1,13 @@
#[macro_export] #[macro_export]
macro_rules! xr_resource_wrapper { macro_rules! xr_resource_wrapper {
($wrapper_type:ident, $xr_type:ty) => { ($wrapper_type:ident, $xr_type:ty) => {
#[derive(Clone, bevy::prelude::Resource, bevy::prelude::Deref, bevy::prelude::DerefMut)] #[derive(
Clone,
bevy::prelude::Resource,
bevy::prelude::Deref,
bevy::prelude::DerefMut,
bevy::render::extract_resource::ExtractResource,
)]
pub struct $wrapper_type($xr_type); pub struct $wrapper_type($xr_type);
impl $wrapper_type { impl $wrapper_type {
@@ -29,7 +35,13 @@ macro_rules! xr_resource_wrapper {
#[macro_export] #[macro_export]
macro_rules! xr_arc_resource_wrapper { macro_rules! xr_arc_resource_wrapper {
($wrapper_type:ident, $xr_type:ty) => { ($wrapper_type:ident, $xr_type:ty) => {
#[derive(Clone, bevy::prelude::Resource, bevy::prelude::Deref, bevy::prelude::DerefMut)] #[derive(
Clone,
bevy::prelude::Resource,
bevy::prelude::Deref,
bevy::prelude::DerefMut,
bevy::render::extract_resource::ExtractResource,
)]
pub struct $wrapper_type(std::sync::Arc<$xr_type>); pub struct $wrapper_type(std::sync::Arc<$xr_type>);
impl $wrapper_type { impl $wrapper_type {

View File

@@ -2,11 +2,13 @@ use std::ffi::c_void;
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use std::sync::Mutex; use std::sync::Mutex;
use crate::input::XrInput;
// use crate::passthrough::XrPassthroughLayer; // use crate::passthrough::XrPassthroughLayer;
use crate::resource_macros::*; use crate::resource_macros::*;
use crate::xr_init::XrEnableStatus;
use bevy::prelude::*; use bevy::prelude::*;
use bevy::render::extract_resource::ExtractResourcePlugin;
use openxr as xr; use openxr as xr;
use xr::ViewConfigurationView;
xr_resource_wrapper!(XrInstance, xr::Instance); xr_resource_wrapper!(XrInstance, xr::Instance);
xr_resource_wrapper!(XrSession, xr::Session<xr::AnyGraphics>); xr_resource_wrapper!(XrSession, xr::Session<xr::AnyGraphics>);
@@ -32,6 +34,20 @@ pub(crate) enum OXrSessionSetupInfo {
Vulkan(VulkanOXrSessionSetupInfo), Vulkan(VulkanOXrSessionSetupInfo),
} }
pub struct XrResourcePlugin;
impl Plugin for XrResourcePlugin {
fn build(&self, app: &mut App) {
app.add_plugins(ExtractResourcePlugin::<XrResolution>::default());
app.add_plugins(ExtractResourcePlugin::<XrFormat>::default());
app.add_plugins(ExtractResourcePlugin::<XrSwapchain>::default());
app.add_plugins(ExtractResourcePlugin::<XrFrameState>::default());
app.add_plugins(ExtractResourcePlugin::<XrViews>::default());
app.add_plugins(ExtractResourcePlugin::<XrInput>::default());
app.add_plugins(ExtractResourcePlugin::<XrEnvironmentBlendMode>::default());
}
}
pub enum Swapchain { pub enum Swapchain {
Vulkan(SwapchainInner<xr::Vulkan>), Vulkan(SwapchainInner<xr::Vulkan>),
} }
@@ -153,7 +169,7 @@ impl<G: xr::Graphics> SwapchainInner<G> {
}, },
}; };
let swapchain = self.handle.lock().unwrap(); let swapchain = self.handle.lock().unwrap();
if views.len() == 0 { if views.is_empty() {
warn!("views are len of 0"); warn!("views are len of 0");
return Ok(()); return Ok(());
} }

View File

@@ -11,16 +11,17 @@ use bevy::{
renderer::{self, RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue}, renderer::{self, RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue},
settings::WgpuSettings, settings::WgpuSettings,
}, },
window::{RawHandleWrapper, PrimaryWindow}, window::{PrimaryWindow, RawHandleWrapper},
}; };
use wgpu::Instance; use wgpu::Instance;
use crate::{ use crate::{
graphics,
input::XrInput, input::XrInput,
resources::{ resources::{
XrEnvironmentBlendMode, XrFormat, XrFrameState, XrInstance, XrResolution, XrSession, XrEnvironmentBlendMode, XrFormat, XrFrameState, XrInstance, XrResolution, XrSession,
XrSessionRunning, XrSwapchain, XrViews, XrSessionRunning, XrSwapchain, XrViews,
}, graphics, },
}; };
#[derive(Resource, Clone)] #[derive(Resource, Clone)]
@@ -52,14 +53,13 @@ pub enum XrEnableRequest {
TryEnable, TryEnable,
TryDisable, TryDisable,
} }
#[derive(Resource, Event, Copy, Clone, PartialEq, Eq)] #[derive(Resource, Event, Copy, Clone, PartialEq, Eq, Reflect, ExtractResource)]
pub enum XrEnableStatus { pub enum XrEnableStatus {
Enabled, Enabled,
Disabled, Disabled,
Waiting,
} }
#[derive(Resource, Event, Copy, Clone, PartialEq, Eq, Debug)] #[derive(Resource, Event, Copy, Clone, PartialEq, Eq, Debug, ExtractResource)]
pub enum XrNextEnabledState { pub enum XrNextEnabledState {
Enabled, Enabled,
Disabled, Disabled,
@@ -67,29 +67,33 @@ pub enum XrNextEnabledState {
pub struct RenderRestartPlugin; pub struct RenderRestartPlugin;
#[derive(Resource)]
pub struct ForceMain;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrPreSetup; pub struct XrPreSetup;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrSetup; pub struct XrSetup;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrPrePostSetup; pub struct XrPrePostSetup;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrPostSetup; pub struct XrPostSetup;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrPreCleanup; pub struct XrPreCleanup;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrCleanup; pub struct XrCleanup;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrPostCleanup; pub struct XrPostCleanup;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrPreRenderUpdate; pub struct XrPreRenderUpdate;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrRenderUpdate; pub struct XrRenderUpdate;
#[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)] #[derive(Debug, ScheduleLabel, Clone, Copy, Hash, PartialEq, Eq)]
pub struct XrPostRenderUpdate; pub struct XrPostRenderUpdate;
@@ -99,9 +103,9 @@ pub fn xr_only() -> impl FnMut(Option<Res<'_, XrEnableStatus>>) -> bool {
impl Plugin for RenderRestartPlugin { impl Plugin for RenderRestartPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
info!("build RenderRestartPlugin");
add_schedules(app); add_schedules(app);
app.add_plugins(ExtractResourcePlugin::<XrRenderData>::default()) app.add_plugins(ExtractResourcePlugin::<XrRenderData>::default())
.insert_resource(ForceMain)
.add_event::<XrEnableRequest>() .add_event::<XrEnableRequest>()
.add_event::<XrEnableStatus>() .add_event::<XrEnableStatus>()
.add_systems(PostStartup, setup_xr.run_if(xr_only())) .add_systems(PostStartup, setup_xr.run_if(xr_only()))
@@ -174,13 +178,9 @@ pub fn update_xr_stuff(world: &mut World) {
world.run_schedule(XrPostRenderUpdate); world.run_schedule(XrPostRenderUpdate);
} }
fn setup_xr_graphics() { fn setup_xr_graphics() {}
} fn enable_xr() {}
fn enable_xr(
) {}
// fn handle_xr_enable_requests( // fn handle_xr_enable_requests(
// primary_window: Query<&RawHandleWrapper, With<PrimaryWindow>>, // primary_window: Query<&RawHandleWrapper, With<PrimaryWindow>>,
@@ -301,10 +301,10 @@ fn decide_next_xr_state(
info!("Xr Already Disabled! ignoring request"); info!("Xr Already Disabled! ignoring request");
return; return;
} }
(_, Some(XrEnableStatus::Waiting)) => { // (_, Some(XrEnableStatus::Waiting)) => {
info!("Already Handling Request! ignoring request"); // info!("Already Handling Request! ignoring request");
return; // return;
} // }
_ => {} _ => {}
} }
let r = match request { let r = match request {

View File

@@ -1,3 +1,4 @@
use bevy::hierarchy::Parent;
use bevy::log::{debug, info}; use bevy::log::{debug, info};
use bevy::prelude::{ use bevy::prelude::{
Added, BuildChildren, Commands, Component, Entity, Query, Res, Transform, Vec3, With, Without, Added, BuildChildren, Commands, Component, Entity, Query, Res, Transform, Vec3, With, Without,
@@ -30,17 +31,17 @@ pub struct OpenXRController;
pub struct AimPose(pub Transform); pub struct AimPose(pub Transform);
pub fn adopt_open_xr_trackers( pub fn adopt_open_xr_trackers(
query: Query<Entity, Added<OpenXRTracker>>, query: Query<Entity, (With<OpenXRTracker>, Without<Parent>)>,
mut commands: Commands, mut commands: Commands,
tracking_root_query: Query<(Entity, With<OpenXRTrackingRoot>)>, tracking_root_query: Query<Entity, With<OpenXRTrackingRoot>>,
) { ) {
let root = tracking_root_query.get_single(); let root = tracking_root_query.get_single();
match root { match root {
Ok(thing) => { Ok(root) => {
// info!("root is"); // info!("root is");
for tracker in query.iter() { for tracker in query.iter() {
info!("we got a new tracker"); info!("we got a new tracker");
commands.entity(thing.0).add_child(tracker); commands.entity(root).add_child(tracker);
} }
} }
Err(_) => info!("root isnt spawned yet?"), Err(_) => info!("root isnt spawned yet?"),