From 006e2c1da3a831118cf23b0f3b41888e5bbfd198 Mon Sep 17 00:00:00 2001 From: Schmarni Date: Tue, 25 Jun 2024 19:24:45 +0200 Subject: [PATCH] add missing overlay plugin file Signed-off-by: Schmarni --- .../src/openxr/features/overlay.rs | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 crates/bevy_openxr/src/openxr/features/overlay.rs diff --git a/crates/bevy_openxr/src/openxr/features/overlay.rs b/crates/bevy_openxr/src/openxr/features/overlay.rs new file mode 100644 index 0000000..20e0d7e --- /dev/null +++ b/crates/bevy_openxr/src/openxr/features/overlay.rs @@ -0,0 +1,95 @@ +use std::{mem, ptr}; + +use bevy::prelude::*; +use openxr::sys; + +use crate::{ + next_chain::{OxrNextChainStructBase, OxrNextChainStructProvider}, + openxr::exts::OxrEnabledExtensions, + session::{OxrSessionCreateNextChain, OxrSessionCreateNextProvider}, +}; + +pub struct OxrOverlayPlugin; + +impl Plugin for OxrOverlayPlugin { + fn build(&self, app: &mut bevy::prelude::App) { + app.add_event::(); + app.init_resource::(); + app.add_systems(First, add_overlay_info_to_chain); + } +} + +#[derive(Resource)] +pub struct OxrOverlaySettings { + pub session_layer_placement: u32, + pub flags: openxr::OverlaySessionCreateFlagsEXTX, +} + +impl Default for OxrOverlaySettings { + fn default() -> Self { + OxrOverlaySettings { + session_layer_placement: 0, + flags: openxr::OverlaySessionCreateFlagsEXTX::EMPTY, + } + } +} + +fn add_overlay_info_to_chain( + mut chain: NonSendMut, + exts: Res, + settings: Res, +) { + if exts.other.contains(&"XR_EXTX_overlay\0".to_string()) { + chain.push(OxrSessionCreateInfoOverlay::new( + settings.flags, + settings.session_layer_placement, + )); + } +} + +#[derive(Event, Clone, Copy, Debug)] +pub enum OxrOverlaySessionEvent { + MainSessionVisibilityChanged { + visible: bool, + flags: openxr::OverlayMainSessionFlagsEXTX, + }, +} + +pub struct OxrSessionCreateInfoOverlay { + inner: sys::SessionCreateInfoOverlayEXTX, +} +impl OxrSessionCreateInfoOverlay { + pub const fn new( + flags: openxr::OverlaySessionCreateFlagsEXTX, + session_layers_placement: u32, + ) -> Self { + Self { + inner: sys::SessionCreateInfoOverlayEXTX { + ty: sys::SessionCreateInfoOverlayEXTX::TYPE, + next: ptr::null(), + create_flags: flags, + session_layers_placement, + }, + } + } +} +impl Default for OxrSessionCreateInfoOverlay { + fn default() -> Self { + Self::new(openxr::OverlaySessionCreateFlagsEXTX::EMPTY, 0) + } +} + +impl OxrNextChainStructProvider for OxrSessionCreateInfoOverlay { + fn header(&self) -> &OxrNextChainStructBase { + unsafe { mem::transmute(&self.inner) } + } + + fn set_next(&mut self, next: &OxrNextChainStructBase) { + self.inner.next = next as *const _ as *const _; + } + fn clear_next(&mut self) { + self.inner.next = ptr::null(); + } +} + +impl OxrSessionCreateNextProvider for OxrSessionCreateInfoOverlay {}