Merge remote-tracking branch 'origin/main' into next-dash-interface

[skip ci]
This commit is contained in:
Aleksander
2025-12-23 17:01:16 +01:00
parent 848674c143
commit 9a606dbce5
63 changed files with 2457 additions and 309 deletions

View File

@@ -11,7 +11,6 @@ use std::{
};
use wgui::gfx::{
WGfx,
cmd::WGfxClearMode,
pass::WGfxPass,
pipeline::{WGfxPipeline, WPipelineCreateInfo},
@@ -49,8 +48,6 @@ static COLORS: [[f32; 6]; 5] = {
pub(super) struct LinePool {
lines: IdMap<usize, LineContainer>,
pipeline: Arc<WGfxPipeline<Vert2Uv>>,
pass: WGfxPass<Vert2Uv>,
buf_color: Subbuffer<[f32]>,
}
impl LinePool {
@@ -61,13 +58,22 @@ impl LinePool {
WPipelineCreateInfo::new(app.gfx.surface_format),
)?;
Ok(Self {
lines: IdMap::new(),
pipeline,
})
}
pub(super) fn allocate(&mut self, xr: &XrState, app: &AppState) -> anyhow::Result<usize> {
let id = LINE_AUTO_INCREMENT.fetch_add(1, Ordering::Relaxed);
let buf_color = app
.gfx
.empty_buffer(BufferUsage::TRANSFER_DST | BufferUsage::UNIFORM_BUFFER, 6)?;
let set0 = pipeline.buffer(0, buf_color.clone())?;
let set0 = self.pipeline.buffer(0, buf_color.clone())?;
let pass = pipeline.create_pass(
let pass = self.pipeline.create_pass(
[1.0, 1.0],
app.gfx_extras.quad_verts.clone(),
0..4,
@@ -76,22 +82,13 @@ impl LinePool {
&Default::default(),
)?;
Ok(Self {
lines: IdMap::new(),
pipeline,
pass,
buf_color,
})
}
pub(super) fn allocate(&mut self, xr: &XrState, gfx: Arc<WGfx>) -> anyhow::Result<usize> {
let id = LINE_AUTO_INCREMENT.fetch_add(1, Ordering::Relaxed);
let srd = create_swapchain(xr, gfx, [1, 1, 1], SwapchainOpts::new())?;
let srd = create_swapchain(xr, app.gfx.clone(), [1, 1, 1], SwapchainOpts::new())?;
self.lines.insert(
id,
LineContainer {
swapchain: srd,
buf_color,
pass,
maybe_line: None,
},
);
@@ -165,13 +162,13 @@ impl LinePool {
.next()
.unwrap();
self.buf_color.write()?[0..6].copy_from_slice(&COLORS[inner.color]);
line.buf_color.write()?[0..6].copy_from_slice(&COLORS[inner.color]);
let mut cmd_buffer = app
.gfx
.create_gfx_command_buffer(CommandBufferUsage::OneTimeSubmit)?;
cmd_buffer.begin_rendering(tgt, WGfxClearMode::DontCare)?;
cmd_buffer.run_ref(&self.pass)?;
cmd_buffer.run_ref(&line.pass)?;
cmd_buffer.end_rendering()?;
futures.execute(cmd_buffer.queue.clone(), cmd_buffer.build()?)?;
@@ -217,5 +214,7 @@ pub(super) struct Line {
struct LineContainer {
swapchain: WlxSwapchain,
buf_color: Subbuffer<[f32]>,
pass: WGfxPass<Vert2Uv>,
maybe_line: Option<Line>,
}

View File

@@ -149,8 +149,8 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
};
let pointer_lines = [
lines.allocate(&xr_state, app.gfx.clone())?,
lines.allocate(&xr_state, app.gfx.clone())?,
lines.allocate(&xr_state, &mut app)?,
lines.allocate(&xr_state, &mut app)?,
];
let watch_id = overlays.lookup(WATCH_NAME).unwrap(); // want panic
@@ -238,6 +238,7 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
if !session_running {
std::thread::sleep(Duration::from_millis(100));
log::trace!("session not running: continue");
continue 'main_loop;
}
@@ -387,10 +388,12 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
for o in overlays.values_mut() {
o.data.cur_visible = false;
let Some(alpha) = o.config.active_state.as_ref().map(|x| x.alpha) else {
log::trace!("{}: hidden, skip render", o.config.name);
continue;
};
if !o.data.init {
log::trace!("{}: init", o.config.name);
o.init(&mut app)?;
o.data.init = true;
}
@@ -400,8 +403,10 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
ShouldRender::Can => (o.data.last_alpha - alpha).abs() > f32::EPSILON,
ShouldRender::Unable => false, //try show old image if exists
};
log::trace!("{}: should_render returned: {should_render}", o.config.name);
if should_render {
log::trace!("{}: render new frame", o.config.name);
let meta = o.config.backend.frame_meta().unwrap(); // want panic
let wsi = o.ensure_swapchain_acquire(&app, &xr_state, meta.extent)?;
let tgt = RenderTarget { views: wsi.views };
@@ -410,7 +415,10 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
o.data.last_alpha = alpha;
futures.execute_results(rdr.end()?)?;
} else if o.data.swapchain.is_none() {
log::trace!("{}: not showing due to missing swapchain", o.config.name);
continue;
} else {
log::trace!("{}: showing stale frame", o.config.name);
}
o.data.cur_visible = true;
}

View File

@@ -1,4 +1,4 @@
use glam::{Affine3A, Quat, Vec3A};
use glam::{Affine3A, Quat, Vec3A, vec3a};
use libmonado::{Monado, Pose, ReferenceSpaceType};
use crate::{
@@ -60,10 +60,10 @@ impl PlayspaceMover {
pub fn update(
&mut self,
overlays: &mut OverlayWindowManager<OpenXrOverlayData>,
state: &AppState,
app: &AppState,
monado: &mut Monado,
) {
for pointer in &state.input_state.pointers {
for pointer in &app.input_state.pointers {
if pointer.now.space_reset {
if !pointer.before.space_reset {
log::info!("Space reset");
@@ -74,7 +74,7 @@ impl PlayspaceMover {
}
if let Some(mut data) = self.rotate.take() {
let pointer = &state.input_state.pointers[data.hand];
let pointer = &app.input_state.pointers[data.hand];
if !pointer.now.space_rotate {
self.last_transform = data.pose;
log::info!("End space rotate");
@@ -82,10 +82,10 @@ impl PlayspaceMover {
}
let new_hand =
Quat::from_affine3(&(data.pose * state.input_state.pointers[data.hand].raw_pose));
Quat::from_affine3(&(data.pose * app.input_state.pointers[data.hand].raw_pose));
let dq = new_hand * data.hand_pose.conjugate();
let mut space_transform = if state.session.config.space_rotate_unlocked {
let mut space_transform = if app.session.config.space_rotate_unlocked {
Affine3A::from_quat(dq)
} else {
let rel_y = f32::atan2(
@@ -95,8 +95,8 @@ impl PlayspaceMover {
Affine3A::from_rotation_y(rel_y)
};
let offset = (space_transform.transform_vector3a(state.input_state.hmd.translation)
- state.input_state.hmd.translation)
let offset = (space_transform.transform_vector3a(app.input_state.hmd.translation)
- app.input_state.hmd.translation)
* -1.0;
space_transform.translation = offset;
@@ -107,7 +107,7 @@ impl PlayspaceMover {
apply_offset(data.pose, monado);
self.rotate = Some(data);
} else {
for (i, pointer) in state.input_state.pointers.iter().enumerate() {
for (i, pointer) in app.input_state.pointers.iter().enumerate() {
if pointer.now.space_rotate {
let hand_pose = Quat::from_affine3(&(self.last_transform * pointer.raw_pose));
self.rotate = Some(MoverData {
@@ -123,7 +123,7 @@ impl PlayspaceMover {
}
if let Some(mut data) = self.drag.take() {
let pointer = &state.input_state.pointers[data.hand];
let pointer = &app.input_state.pointers[data.hand];
if !pointer.now.space_drag {
self.last_transform = data.pose;
log::info!("End space drag");
@@ -132,9 +132,13 @@ impl PlayspaceMover {
let new_hand = data
.pose
.transform_point3a(state.input_state.pointers[data.hand].raw_pose.translation);
let relative_pos =
(new_hand - data.hand_pose) * state.session.config.space_drag_multiplier;
.transform_point3a(app.input_state.pointers[data.hand].raw_pose.translation);
let relative_pos = if app.session.config.space_drag_unlocked {
new_hand - data.hand_pose
} else {
vec3a(0., new_hand.y - data.hand_pose.y, 0.)
} * app.session.config.space_drag_multiplier;
if relative_pos.length_squared() > 1000.0 {
log::warn!("Space drag too fast, ignoring");
@@ -159,7 +163,7 @@ impl PlayspaceMover {
apply_offset(data.pose, monado);
self.drag = Some(data);
} else {
for (i, pointer) in state.input_state.pointers.iter().enumerate() {
for (i, pointer) in app.input_state.pointers.iter().enumerate() {
if pointer.now.space_drag {
let hand_pos = self
.last_transform
@@ -234,7 +238,7 @@ impl PlayspaceMover {
let y1 = input.pointers[0].raw_pose.translation.y;
let y2 = input.pointers[1].raw_pose.translation.y;
let delta = y1.min(y2) - 0.03;
let delta = y1.min(y2) - 0.05;
pose.position.y += delta;