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_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">
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>),
|
||||||
|
|||||||
Reference in New Issue
Block a user