adjust mouse for stereo

This commit is contained in:
galister
2026-01-14 14:24:14 +09:00
parent c7ebb7492e
commit 9d43068271
6 changed files with 92 additions and 15 deletions

View File

@@ -85,8 +85,9 @@
<PosButton id="stereo_topbottom" src="edit/3d_topbottom.svg" tooltip="EDIT_MODE.STEREO_3D_MODE.SPLIT_TOP_BOTTOM" press="::EditModeSetStereo topbottom" /> <PosButton id="stereo_topbottom" src="edit/3d_topbottom.svg" tooltip="EDIT_MODE.STEREO_3D_MODE.SPLIT_TOP_BOTTOM" press="::EditModeSetStereo topbottom" />
<PosButton id="stereo_bottomtop" src="edit/3d_bottomtop.svg" tooltip="EDIT_MODE.STEREO_3D_MODE.SPLIT_BOTTOM_TOP" press="::EditModeSetStereo bottomtop" /> <PosButton id="stereo_bottomtop" src="edit/3d_bottomtop.svg" tooltip="EDIT_MODE.STEREO_3D_MODE.SPLIT_BOTTOM_TOP" press="::EditModeSetStereo bottomtop" />
</div> </div>
<div justify_content="center" align_items="center"> <div justify_content="center" align_items="center" flex_direction="row" gap="16">
<CheckBox id="stereo_full_frame_box" translation="EDIT_MODE.STEREO_3D_MODE.FULL_FRAME" tooltip_side="top" /> <CheckBox id="stereo_full_frame_box" translation="EDIT_MODE.STEREO_3D_MODE.FULL_FRAME" tooltip_side="top" />
<CheckBox id="stereo_adjust_mouse_box" translation="EDIT_MODE.STEREO_3D_MODE.ADJUST_MOUSE" tooltip_side="top" />
</div> </div>
</div> </div>
<div id="tab_mouse" display="none" height="100" flex_direction="column"> <div id="tab_mouse" display="none" height="100" flex_direction="column">

View File

@@ -47,6 +47,7 @@
"GLOBAL": "Always visible", "GLOBAL": "Always visible",
"RESIZE_PRESS_AND_DRAG": "Resize (press & drag)", "RESIZE_PRESS_AND_DRAG": "Resize (press & drag)",
"STEREO_3D_MODE": { "STEREO_3D_MODE": {
"ADJUST_MOUSE": "Adjust mouse",
"SPLIT_BOTTOM_TOP": "BOTTOM→TOP", "SPLIT_BOTTOM_TOP": "BOTTOM→TOP",
"SPLIT_LEFT_RIGHT": "LEFT→RIGHT", "SPLIT_LEFT_RIGHT": "LEFT→RIGHT",
"SPLIT_RIGHT_LEFT": "RIGHT→LEFT", "SPLIT_RIGHT_LEFT": "RIGHT→LEFT",

View File

@@ -437,6 +437,11 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result<EditModeWrapPanel> {
"stereo_full_frame_box", "stereo_full_frame_box",
cb_assign_stereo_full_frame, cb_assign_stereo_full_frame,
)?; )?;
set_up_checkbox(
&mut panel,
"stereo_adjust_mouse_box",
cb_assign_stereo_adjust_mouse,
)?;
set_up_slider(&mut panel, "lerp_slider", cb_assign_lerp)?; set_up_slider(&mut panel, "lerp_slider", cb_assign_lerp)?;
set_up_slider(&mut panel, "alpha_slider", cb_assign_alpha)?; set_up_slider(&mut panel, "alpha_slider", cb_assign_alpha)?;
set_up_slider(&mut panel, "curve_slider", cb_assign_curve)?; set_up_slider(&mut panel, "curve_slider", cb_assign_curve)?;
@@ -546,6 +551,16 @@ fn reset_panel(
c.set_checked(&mut common, full_frame); c.set_checked(&mut common, full_frame);
} }
if let Some(adjust_mouse) = attrib_value!(
owc.backend.get_attrib(BackendAttrib::StereoAdjustMouse),
BackendAttribValue::StereoAdjustMouse
) {
let c = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("stereo_adjust_mouse_box")?;
c.set_checked(&mut common, adjust_mouse);
}
panel.layout.process_alterables(alterables)?; panel.layout.process_alterables(alterables)?;
Ok(()) Ok(())
@@ -596,6 +611,16 @@ fn cb_assign_stereo_full_frame(
owc.backend.set_attrib(_app, attrib); owc.backend.set_attrib(_app, attrib);
} }
fn cb_assign_stereo_adjust_mouse(
_app: &mut AppState,
owc: &mut OverlayWindowConfig,
adjust_mouse: bool,
) {
owc.dirty = true;
let attrib = BackendAttribValue::StereoAdjustMouse(adjust_mouse);
owc.backend.set_attrib(_app, attrib);
}
fn set_up_slider( fn set_up_slider(
panel: &mut EditModeWrapPanel, panel: &mut EditModeWrapPanel,
id: &str, id: &str,

View File

@@ -58,6 +58,7 @@ pub struct ScreenBackend {
interaction_transform: Option<Affine2>, interaction_transform: Option<Affine2>,
stereo: Option<StereoMode>, stereo: Option<StereoMode>,
stereo_full_frame: bool, stereo_full_frame: bool,
stereo_adjust_mouse: bool,
pub(super) logical_pos: Vec2, pub(super) logical_pos: Vec2,
pub(super) logical_size: Vec2, pub(super) logical_size: Vec2,
pub(super) mouse_transform_original: Transform, pub(super) mouse_transform_original: Transform,
@@ -87,6 +88,7 @@ impl ScreenBackend {
None None
}, },
stereo_full_frame: false, stereo_full_frame: false,
stereo_adjust_mouse: false,
logical_pos: Vec2::ZERO, logical_pos: Vec2::ZERO,
logical_size: Vec2::ZERO, logical_size: Vec2::ZERO,
mouse_transform_original: Transform::Undefined, mouse_transform_original: Transform::Undefined,
@@ -96,9 +98,19 @@ impl ScreenBackend {
} }
pub(super) fn apply_mouse_transform_with_override(&mut self, override_transform: Transform) { pub(super) fn apply_mouse_transform_with_override(&mut self, override_transform: Transform) {
let size = self.logical_size; let mut size = self.logical_size;
let pos = self.logical_pos; let pos = self.logical_pos;
if self.stereo_adjust_mouse
&& let Some(stereo) = self.stereo.as_ref()
{
match stereo {
StereoMode::LeftRight | StereoMode::RightLeft => size.x *= 0.5,
StereoMode::TopBottom | StereoMode::BottomTop => size.y *= 0.5,
_ => {}
}
}
let transform = match override_transform { let transform = match override_transform {
Transform::Undefined => self.mouse_transform_original, Transform::Undefined => self.mouse_transform_original,
other => other, other => other,
@@ -351,6 +363,9 @@ impl OverlayBackend for ScreenBackend {
BackendAttrib::StereoFullFrame => { BackendAttrib::StereoFullFrame => {
Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame)) Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame))
} }
BackendAttrib::StereoAdjustMouse => Some(BackendAttribValue::StereoAdjustMouse(
self.stereo_adjust_mouse,
)),
_ => None, _ => None,
} }
} }
@@ -370,7 +385,27 @@ impl OverlayBackend for ScreenBackend {
} }
BackendAttribValue::MouseTransform(new) => { BackendAttribValue::MouseTransform(new) => {
self.mouse_transform_override = new; self.mouse_transform_override = new;
let frame_transform = match new { let frame_transform = mouse_transform_to_transform(new);
self.apply_mouse_transform_with_override(frame_transform);
true
}
BackendAttribValue::StereoFullFrame(new) => {
self.stereo_full_frame = new;
true
}
BackendAttribValue::StereoAdjustMouse(new) => {
self.stereo_adjust_mouse = new;
let frame_transform = mouse_transform_to_transform(self.mouse_transform_override);
self.apply_mouse_transform_with_override(frame_transform);
true
}
_ => false,
}
}
}
fn mouse_transform_to_transform(mouse_transform: MouseTransform) -> Transform {
match mouse_transform {
MouseTransform::Default => Transform::Undefined, MouseTransform::Default => Transform::Undefined,
MouseTransform::Normal => Transform::Normal, MouseTransform::Normal => Transform::Normal,
MouseTransform::Rotated90 => Transform::Rotated90, MouseTransform::Rotated90 => Transform::Rotated90,
@@ -380,15 +415,5 @@ impl OverlayBackend for ScreenBackend {
MouseTransform::Flipped90 => Transform::Flipped90, MouseTransform::Flipped90 => Transform::Flipped90,
MouseTransform::Flipped180 => Transform::Flipped180, MouseTransform::Flipped180 => Transform::Flipped180,
MouseTransform::Flipped270 => Transform::Flipped270, MouseTransform::Flipped270 => Transform::Flipped270,
};
self.apply_mouse_transform_with_override(frame_transform);
true
}
BackendAttribValue::StereoFullFrame(new) => {
self.stereo_full_frame = new;
true
}
_ => false,
}
} }
} }

View File

@@ -110,6 +110,7 @@ pub struct WvrWindowBackend {
mouse: Option<MouseMeta>, mouse: Option<MouseMeta>,
stereo: Option<StereoMode>, stereo: Option<StereoMode>,
stereo_full_frame: bool, stereo_full_frame: bool,
stereo_adjust_mouse: bool,
cur_image: Option<Arc<ImageView>>, cur_image: Option<Arc<ImageView>>,
panel: GuiPanel<WindowHandle>, panel: GuiPanel<WindowHandle>,
inner_extent: [u32; 2], inner_extent: [u32; 2],
@@ -209,6 +210,7 @@ impl WvrWindowBackend {
None None
}, },
stereo_full_frame: false, stereo_full_frame: false,
stereo_adjust_mouse: false,
cur_image: None, cur_image: None,
inner_extent: [0, 0], inner_extent: [0, 0],
panel, panel,
@@ -221,11 +223,21 @@ impl WvrWindowBackend {
fn apply_extent(&mut self, app: &mut AppState, meta: &FrameMeta) -> anyhow::Result<()> { fn apply_extent(&mut self, app: &mut AppState, meta: &FrameMeta) -> anyhow::Result<()> {
self.interaction_transform = Some(ui_transform(meta.extent)); self.interaction_transform = Some(ui_transform(meta.extent));
let scale = vec2( let mut scale = vec2(
((meta.extent[0] + BORDER_SIZE * 2) as f32) / (meta.extent[0] as f32), ((meta.extent[0] + BORDER_SIZE * 2) as f32) / (meta.extent[0] as f32),
((meta.extent[1] + BORDER_SIZE * 2 + BAR_SIZE) as f32) / (meta.extent[1] as f32), ((meta.extent[1] + BORDER_SIZE * 2 + BAR_SIZE) as f32) / (meta.extent[1] as f32),
); );
if self.stereo_adjust_mouse
&& let Some(stereo) = self.stereo
{
match stereo {
StereoMode::LeftRight | StereoMode::RightLeft => scale.x *= 0.5,
StereoMode::TopBottom | StereoMode::BottomTop => scale.y *= 0.5,
_ => {}
}
}
let translation = vec2( let translation = vec2(
-(BORDER_SIZE as f32) / (meta.extent[0] as f32), -(BORDER_SIZE as f32) / (meta.extent[0] as f32),
-((BORDER_SIZE + BAR_SIZE) as f32) / (meta.extent[1] as f32), -((BORDER_SIZE + BAR_SIZE) as f32) / (meta.extent[1] as f32),
@@ -577,10 +589,13 @@ impl OverlayBackend for WvrWindowBackend {
BackendAttrib::StereoFullFrame => { BackendAttrib::StereoFullFrame => {
Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame)) Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame))
} }
BackendAttrib::StereoAdjustMouse => Some(BackendAttribValue::StereoAdjustMouse(
self.stereo_adjust_mouse,
)),
_ => None, _ => None,
} }
} }
fn set_attrib(&mut self, _app: &mut AppState, value: BackendAttribValue) -> bool { fn set_attrib(&mut self, app: &mut AppState, value: BackendAttribValue) -> bool {
match value { match value {
BackendAttribValue::Stereo(new) => { BackendAttribValue::Stereo(new) => {
if let Some(stereo) = self.stereo.as_mut() { if let Some(stereo) = self.stereo.as_mut() {
@@ -598,6 +613,14 @@ impl OverlayBackend for WvrWindowBackend {
self.stereo_full_frame = new; self.stereo_full_frame = new;
true true
} }
BackendAttribValue::StereoAdjustMouse(new) => {
self.stereo_adjust_mouse = new;
if let Some(meta) = self.meta.take() {
let _ = self.apply_extent(app, &meta);
self.meta = Some(meta);
}
true
}
_ => false, _ => false,
} }
} }

View File

@@ -23,6 +23,7 @@ pub enum ToastDisplayMethod {
pub enum BackendAttrib { pub enum BackendAttrib {
Stereo, Stereo,
StereoFullFrame, StereoFullFrame,
StereoAdjustMouse,
MouseTransform, MouseTransform,
Icon, Icon,
} }
@@ -31,6 +32,7 @@ pub enum BackendAttrib {
pub enum BackendAttribValue { pub enum BackendAttribValue {
Stereo(StereoMode), Stereo(StereoMode),
StereoFullFrame(bool), StereoFullFrame(bool),
StereoAdjustMouse(bool),
MouseTransform(MouseTransform), MouseTransform(MouseTransform),
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
Icon(Arc<str>), Icon(Arc<str>),