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_bottomtop" src="edit/3d_bottomtop.svg" tooltip="EDIT_MODE.STEREO_3D_MODE.SPLIT_BOTTOM_TOP" press="::EditModeSetStereo bottomtop" />
</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_adjust_mouse_box" translation="EDIT_MODE.STEREO_3D_MODE.ADJUST_MOUSE" tooltip_side="top" />
</div>
</div>
<div id="tab_mouse" display="none" height="100" flex_direction="column">

View File

@@ -47,6 +47,7 @@
"GLOBAL": "Always visible",
"RESIZE_PRESS_AND_DRAG": "Resize (press & drag)",
"STEREO_3D_MODE": {
"ADJUST_MOUSE": "Adjust mouse",
"SPLIT_BOTTOM_TOP": "BOTTOM→TOP",
"SPLIT_LEFT_RIGHT": "LEFT→RIGHT",
"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",
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, "alpha_slider", cb_assign_alpha)?;
set_up_slider(&mut panel, "curve_slider", cb_assign_curve)?;
@@ -546,6 +551,16 @@ fn reset_panel(
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)?;
Ok(())
@@ -596,6 +611,16 @@ fn cb_assign_stereo_full_frame(
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(
panel: &mut EditModeWrapPanel,
id: &str,

View File

@@ -58,6 +58,7 @@ pub struct ScreenBackend {
interaction_transform: Option<Affine2>,
stereo: Option<StereoMode>,
stereo_full_frame: bool,
stereo_adjust_mouse: bool,
pub(super) logical_pos: Vec2,
pub(super) logical_size: Vec2,
pub(super) mouse_transform_original: Transform,
@@ -87,6 +88,7 @@ impl ScreenBackend {
None
},
stereo_full_frame: false,
stereo_adjust_mouse: false,
logical_pos: Vec2::ZERO,
logical_size: Vec2::ZERO,
mouse_transform_original: Transform::Undefined,
@@ -96,9 +98,19 @@ impl ScreenBackend {
}
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;
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 {
Transform::Undefined => self.mouse_transform_original,
other => other,
@@ -351,6 +363,9 @@ impl OverlayBackend for ScreenBackend {
BackendAttrib::StereoFullFrame => {
Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame))
}
BackendAttrib::StereoAdjustMouse => Some(BackendAttribValue::StereoAdjustMouse(
self.stereo_adjust_mouse,
)),
_ => None,
}
}
@@ -370,17 +385,7 @@ impl OverlayBackend for ScreenBackend {
}
BackendAttribValue::MouseTransform(new) => {
self.mouse_transform_override = new;
let frame_transform = match new {
MouseTransform::Default => Transform::Undefined,
MouseTransform::Normal => Transform::Normal,
MouseTransform::Rotated90 => Transform::Rotated90,
MouseTransform::Rotated180 => Transform::Rotated180,
MouseTransform::Rotated270 => Transform::Rotated270,
MouseTransform::Flipped => Transform::Flipped,
MouseTransform::Flipped90 => Transform::Flipped90,
MouseTransform::Flipped180 => Transform::Flipped180,
MouseTransform::Flipped270 => Transform::Flipped270,
};
let frame_transform = mouse_transform_to_transform(new);
self.apply_mouse_transform_with_override(frame_transform);
true
}
@@ -388,7 +393,27 @@ impl OverlayBackend for ScreenBackend {
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::Normal => Transform::Normal,
MouseTransform::Rotated90 => Transform::Rotated90,
MouseTransform::Rotated180 => Transform::Rotated180,
MouseTransform::Rotated270 => Transform::Rotated270,
MouseTransform::Flipped => Transform::Flipped,
MouseTransform::Flipped90 => Transform::Flipped90,
MouseTransform::Flipped180 => Transform::Flipped180,
MouseTransform::Flipped270 => Transform::Flipped270,
}
}

View File

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

View File

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