adjust mouse for stereo
This commit is contained in:
@@ -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">
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>),
|
||||
|
||||
Reference in New Issue
Block a user