openvr: universe-aware overlays
This commit is contained in:
@@ -5,6 +5,7 @@ use std::sync::Arc;
|
|||||||
use glam::{Affine3A, Vec3, Vec3A, Vec4};
|
use glam::{Affine3A, Vec3, Vec3A, Vec4};
|
||||||
use idmap::IdMap;
|
use idmap::IdMap;
|
||||||
use ovr_overlay::overlay::OverlayManager;
|
use ovr_overlay::overlay::OverlayManager;
|
||||||
|
use ovr_overlay::sys::ETrackingUniverseOrigin;
|
||||||
use vulkano::command_buffer::CommandBufferUsage;
|
use vulkano::command_buffer::CommandBufferUsage;
|
||||||
use vulkano::format::Format;
|
use vulkano::format::Format;
|
||||||
use vulkano::image::view::ImageView;
|
use vulkano::image::view::ImageView;
|
||||||
@@ -141,6 +142,7 @@ impl LinePool {
|
|||||||
|
|
||||||
pub fn update(
|
pub fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
universe: ETrackingUniverseOrigin,
|
||||||
overlay: &mut OverlayManager,
|
overlay: &mut OverlayManager,
|
||||||
app: &mut AppState,
|
app: &mut AppState,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
@@ -152,7 +154,7 @@ impl LinePool {
|
|||||||
data.state.dirty = false;
|
data.state.dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
data.upload_transform(overlay);
|
data.upload_transform(universe.clone(), overlay);
|
||||||
data.upload_color(overlay);
|
data.upload_color(overlay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -219,9 +219,11 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let universe = playspace.get_universe();
|
||||||
|
|
||||||
state.input_state.pre_update();
|
state.input_state.pre_update();
|
||||||
input_source.update(
|
input_source.update(
|
||||||
playspace.get_universe(),
|
universe.clone(),
|
||||||
&mut input_mgr,
|
&mut input_mgr,
|
||||||
&mut system_mgr,
|
&mut system_mgr,
|
||||||
&mut state,
|
&mut state,
|
||||||
@@ -258,7 +260,7 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lines.update(&mut overlay_mgr, &mut state)?;
|
lines.update(universe.clone(), &mut overlay_mgr, &mut state)?;
|
||||||
|
|
||||||
for o in overlays.iter_mut() {
|
for o in overlays.iter_mut() {
|
||||||
o.after_input(&mut overlay_mgr, &mut state)?;
|
o.after_input(&mut overlay_mgr, &mut state)?;
|
||||||
@@ -281,7 +283,7 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
|
|||||||
|
|
||||||
overlays
|
overlays
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
.for_each(|o| o.after_render(&mut overlay_mgr, &state.graphics));
|
.for_each(|o| o.after_render(universe.clone(), &mut overlay_mgr, &state.graphics));
|
||||||
|
|
||||||
// chaperone
|
// chaperone
|
||||||
|
|
||||||
|
|||||||
@@ -79,10 +79,15 @@ impl OverlayData<OpenVrOverlayData> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn after_render(&mut self, overlay: &mut OverlayManager, graphics: &WlxGraphics) {
|
pub(super) fn after_render(
|
||||||
|
&mut self,
|
||||||
|
universe: ETrackingUniverseOrigin,
|
||||||
|
overlay: &mut OverlayManager,
|
||||||
|
graphics: &WlxGraphics,
|
||||||
|
) {
|
||||||
if self.data.visible {
|
if self.data.visible {
|
||||||
if self.state.dirty {
|
if self.state.dirty {
|
||||||
self.upload_transform(overlay);
|
self.upload_transform(universe, overlay);
|
||||||
self.upload_alpha(overlay);
|
self.upload_alpha(overlay);
|
||||||
self.state.dirty = false;
|
self.state.dirty = false;
|
||||||
}
|
}
|
||||||
@@ -185,7 +190,11 @@ impl OverlayData<OpenVrOverlayData> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn upload_transform(&self, overlay: &mut OverlayManager) {
|
pub(super) fn upload_transform(
|
||||||
|
&self,
|
||||||
|
universe: ETrackingUniverseOrigin,
|
||||||
|
overlay: &mut OverlayManager,
|
||||||
|
) {
|
||||||
let Some(handle) = self.data.handle else {
|
let Some(handle) = self.data.handle else {
|
||||||
log::debug!("{}: No overlay handle", self.state.name);
|
log::debug!("{}: No overlay handle", self.state.name);
|
||||||
return;
|
return;
|
||||||
@@ -193,11 +202,7 @@ impl OverlayData<OpenVrOverlayData> {
|
|||||||
|
|
||||||
let transform = Matrix3x4::from_affine(&self.state.transform);
|
let transform = Matrix3x4::from_affine(&self.state.transform);
|
||||||
|
|
||||||
if let Err(e) = overlay.set_transform_absolute(
|
if let Err(e) = overlay.set_transform_absolute(handle, universe, &transform) {
|
||||||
handle,
|
|
||||||
ETrackingUniverseOrigin::TrackingUniverseStanding,
|
|
||||||
&transform,
|
|
||||||
) {
|
|
||||||
log::error!(
|
log::error!(
|
||||||
"{}: Failed to set overlay transform: {}",
|
"{}: Failed to set overlay transform: {}",
|
||||||
self.state.name,
|
self.state.name,
|
||||||
|
|||||||
Reference in New Issue
Block a user