@@ -82,6 +82,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">
|
||||||
|
<CheckBox id="stereo_full_frame_box" translation="EDIT_MODE.STEREO_3D_MODE.FULL_FRAME" tooltip_side="top" />
|
||||||
|
</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">
|
||||||
<div padding_left="8" padding_right="8" gap="8" justify_content="center" align_items="center">
|
<div padding_left="8" padding_right="8" gap="8" justify_content="center" align_items="center">
|
||||||
|
|||||||
@@ -54,7 +54,8 @@
|
|||||||
"SPLIT_LEFT_RIGHT": "LINKS→RECHTS",
|
"SPLIT_LEFT_RIGHT": "LINKS→RECHTS",
|
||||||
"SPLIT_RIGHT_LEFT": "RECHTS→LINKS",
|
"SPLIT_RIGHT_LEFT": "RECHTS→LINKS",
|
||||||
"SPLIT_TOP_BOTTOM": "OBEN→UNTEN",
|
"SPLIT_TOP_BOTTOM": "OBEN→UNTEN",
|
||||||
"SPLIT_BOTTOM_TOP": "UNTEN→OBEN"
|
"SPLIT_BOTTOM_TOP": "UNTEN→OBEN",
|
||||||
|
"FULL_FRAME": "Voll 3D"
|
||||||
},
|
},
|
||||||
"STEREO_3D_MODE_": {},
|
"STEREO_3D_MODE_": {},
|
||||||
"ALIGN_TO_HMD": "An HMD ausrichten",
|
"ALIGN_TO_HMD": "An HMD ausrichten",
|
||||||
|
|||||||
@@ -44,7 +44,8 @@
|
|||||||
"SPLIT_LEFT_RIGHT": "LEFT→RIGHT",
|
"SPLIT_LEFT_RIGHT": "LEFT→RIGHT",
|
||||||
"SPLIT_RIGHT_LEFT": "RIGHT→LEFT",
|
"SPLIT_RIGHT_LEFT": "RIGHT→LEFT",
|
||||||
"SPLIT_TOP_BOTTOM": "TOP→BOTTOM",
|
"SPLIT_TOP_BOTTOM": "TOP→BOTTOM",
|
||||||
"TITLE": "3D Stereo Mode"
|
"TITLE": "3D Stereo Mode",
|
||||||
|
"FULL_FRAME": "Full 3D"
|
||||||
},
|
},
|
||||||
"MOUSE": {
|
"MOUSE": {
|
||||||
"TITLE": "Mouse fixes",
|
"TITLE": "Mouse fixes",
|
||||||
|
|||||||
@@ -54,7 +54,8 @@
|
|||||||
"SPLIT_LEFT_RIGHT": "IZQ→DER",
|
"SPLIT_LEFT_RIGHT": "IZQ→DER",
|
||||||
"SPLIT_RIGHT_LEFT": "DERECHA→IZQUIERDA",
|
"SPLIT_RIGHT_LEFT": "DERECHA→IZQUIERDA",
|
||||||
"SPLIT_TOP_BOTTOM": "ARRIBA→ABAJO",
|
"SPLIT_TOP_BOTTOM": "ARRIBA→ABAJO",
|
||||||
"SPLIT_BOTTOM_TOP": "ABAJO→ARRIBA"
|
"SPLIT_BOTTOM_TOP": "ABAJO→ARRIBA",
|
||||||
|
"FULL_FRAME": "3D completo"
|
||||||
},
|
},
|
||||||
"STEREO_3D_MODE_": {},
|
"STEREO_3D_MODE_": {},
|
||||||
"ALIGN_TO_HMD": "Alinear al HMD",
|
"ALIGN_TO_HMD": "Alinear al HMD",
|
||||||
|
|||||||
@@ -44,7 +44,8 @@
|
|||||||
"SPLIT_LEFT_RIGHT": "SINISTRA→DESTRA",
|
"SPLIT_LEFT_RIGHT": "SINISTRA→DESTRA",
|
||||||
"SPLIT_RIGHT_LEFT": "DESTRA→SINISTRA",
|
"SPLIT_RIGHT_LEFT": "DESTRA→SINISTRA",
|
||||||
"SPLIT_TOP_BOTTOM": "TOP→BOTTOM",
|
"SPLIT_TOP_BOTTOM": "TOP→BOTTOM",
|
||||||
"TITLE": "Modalità Stereo 3D"
|
"TITLE": "Modalità Stereo 3D",
|
||||||
|
"FULL_FRAME": "3D Completo"
|
||||||
},
|
},
|
||||||
"MOUSE": {
|
"MOUSE": {
|
||||||
"TITLE": "Correzioni del mouse",
|
"TITLE": "Correzioni del mouse",
|
||||||
|
|||||||
@@ -53,7 +53,8 @@
|
|||||||
"SPLIT_LEFT_RIGHT": "左→右",
|
"SPLIT_LEFT_RIGHT": "左→右",
|
||||||
"SPLIT_RIGHT_LEFT": "右→左",
|
"SPLIT_RIGHT_LEFT": "右→左",
|
||||||
"SPLIT_TOP_BOTTOM": "上→下",
|
"SPLIT_TOP_BOTTOM": "上→下",
|
||||||
"SPLIT_BOTTOM_TOP": "下→上"
|
"SPLIT_BOTTOM_TOP": "下→上",
|
||||||
|
"FULL_FRAME": "フル3D"
|
||||||
},
|
},
|
||||||
"ALIGN_TO_HMD": "常にHMDの方を向く",
|
"ALIGN_TO_HMD": "常にHMDの方を向く",
|
||||||
"MOUSE": {
|
"MOUSE": {
|
||||||
|
|||||||
@@ -53,7 +53,8 @@
|
|||||||
"SPLIT_LEFT_RIGHT": "LEWO→PRAWO",
|
"SPLIT_LEFT_RIGHT": "LEWO→PRAWO",
|
||||||
"SPLIT_RIGHT_LEFT": "PRAWO→LEWO",
|
"SPLIT_RIGHT_LEFT": "PRAWO→LEWO",
|
||||||
"SPLIT_TOP_BOTTOM": "GÓRA→DÓŁ",
|
"SPLIT_TOP_BOTTOM": "GÓRA→DÓŁ",
|
||||||
"TITLE": "Tryb stereoskopowy 3D"
|
"TITLE": "Tryb stereoskopowy 3D",
|
||||||
|
"FULL_FRAME": "Pełny 3D"
|
||||||
},
|
},
|
||||||
"ALIGN_TO_HMD": "Dopasuj do HMD",
|
"ALIGN_TO_HMD": "Dopasuj do HMD",
|
||||||
"MOUSE": {
|
"MOUSE": {
|
||||||
|
|||||||
@@ -355,6 +355,24 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result<EditModeWrapPanel> {
|
|||||||
Ok(EventResult::Consumed)
|
Ok(EventResult::Consumed)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
"::EditModeSetStereoFullFrame" => {
|
||||||
|
let full_frame = args.next().unwrap().parse::<bool>().unwrap();
|
||||||
|
Box::new(move |common, data, app, state| {
|
||||||
|
if !test_button(data) || !test_duration(&button, app) {
|
||||||
|
return Ok(EventResult::Pass);
|
||||||
|
}
|
||||||
|
|
||||||
|
let sel = OverlaySelector::Id(*state.id.borrow());
|
||||||
|
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify(
|
||||||
|
sel,
|
||||||
|
Box::new(move |_app, owc| {
|
||||||
|
let attrib = BackendAttribValue::StereoFullFrame(full_frame);
|
||||||
|
owc.backend.set_attrib(_app, attrib);
|
||||||
|
}),
|
||||||
|
)));
|
||||||
|
Ok(EventResult::Consumed)
|
||||||
|
})
|
||||||
|
}
|
||||||
"::EditModeSetMouse" => {
|
"::EditModeSetMouse" => {
|
||||||
let key = args.next().unwrap().to_owned();
|
let key = args.next().unwrap().to_owned();
|
||||||
Box::new(move |common, data, app, state| {
|
Box::new(move |common, data, app, state| {
|
||||||
@@ -412,6 +430,11 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result<EditModeWrapPanel> {
|
|||||||
|
|
||||||
set_up_checkbox(&mut panel, "additive_box", cb_assign_additive)?;
|
set_up_checkbox(&mut panel, "additive_box", cb_assign_additive)?;
|
||||||
set_up_checkbox(&mut panel, "align_box", cb_assign_align)?;
|
set_up_checkbox(&mut panel, "align_box", cb_assign_align)?;
|
||||||
|
set_up_checkbox(
|
||||||
|
&mut panel,
|
||||||
|
"stereo_full_frame_box",
|
||||||
|
cb_assign_stereo_full_frame,
|
||||||
|
)?;
|
||||||
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)?;
|
||||||
@@ -499,6 +522,16 @@ fn reset_panel(
|
|||||||
.set_tab_visible(&mut common, "mouse", false);
|
.set_tab_visible(&mut common, "mouse", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(full_frame) = attrib_value!(
|
||||||
|
owc.backend.get_attrib(BackendAttrib::StereoFullFrame),
|
||||||
|
BackendAttribValue::StereoFullFrame
|
||||||
|
) {
|
||||||
|
let c = panel
|
||||||
|
.parser_state
|
||||||
|
.fetch_component_as::<ComponentCheckbox>("stereo_full_frame_box")?;
|
||||||
|
c.set_checked(&mut common, full_frame);
|
||||||
|
}
|
||||||
|
|
||||||
panel.layout.process_alterables(alterables)?;
|
panel.layout.process_alterables(alterables)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -535,6 +568,16 @@ const fn cb_assign_align(_app: &mut AppState, owc: &mut OverlayWindowConfig, ali
|
|||||||
active_state.positioning = active_state.positioning.with_align(align);
|
active_state.positioning = active_state.positioning.with_align(align);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn cb_assign_stereo_full_frame(
|
||||||
|
_app: &mut AppState,
|
||||||
|
owc: &mut OverlayWindowConfig,
|
||||||
|
full_frame: bool,
|
||||||
|
) {
|
||||||
|
owc.dirty = true;
|
||||||
|
let attrib = BackendAttribValue::StereoFullFrame(full_frame);
|
||||||
|
owc.backend.set_attrib(_app, attrib);
|
||||||
|
}
|
||||||
|
|
||||||
fn set_up_slider(
|
fn set_up_slider(
|
||||||
panel: &mut EditModeWrapPanel,
|
panel: &mut EditModeWrapPanel,
|
||||||
id: &str,
|
id: &str,
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ pub struct ScreenBackend {
|
|||||||
mouse_transform: Affine2,
|
mouse_transform: Affine2,
|
||||||
interaction_transform: Option<Affine2>,
|
interaction_transform: Option<Affine2>,
|
||||||
stereo: Option<StereoMode>,
|
stereo: Option<StereoMode>,
|
||||||
|
stereo_full_frame: 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,
|
||||||
@@ -85,6 +86,7 @@ impl ScreenBackend {
|
|||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
|
stereo_full_frame: 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,
|
||||||
@@ -208,7 +210,22 @@ impl OverlayBackend for ScreenBackend {
|
|||||||
|
|
||||||
if let Some(frame) = self.capture.receive() {
|
if let Some(frame) = self.capture.receive() {
|
||||||
let stereo = self.stereo.unwrap_or(StereoMode::None);
|
let stereo = self.stereo.unwrap_or(StereoMode::None);
|
||||||
let meta = frame.get_frame_meta(&app.session.config, stereo);
|
let mut meta = frame.get_frame_meta(&app.session.config, stereo);
|
||||||
|
|
||||||
|
if let Some(stereo) = self.stereo {
|
||||||
|
// Apply stereo full frame logic
|
||||||
|
if self.stereo_full_frame {
|
||||||
|
match stereo {
|
||||||
|
StereoMode::LeftRight | StereoMode::RightLeft => {
|
||||||
|
meta.extent[0] /= 2;
|
||||||
|
}
|
||||||
|
StereoMode::TopBottom | StereoMode::BottomTop => {
|
||||||
|
meta.extent[1] /= 2;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(pipeline) = self.pipeline.as_mut() {
|
if let Some(pipeline) = self.pipeline.as_mut() {
|
||||||
if self.meta.is_some_and(|old| old.extent != meta.extent) {
|
if self.meta.is_some_and(|old| old.extent != meta.extent) {
|
||||||
@@ -331,6 +348,9 @@ impl OverlayBackend for ScreenBackend {
|
|||||||
BackendAttrib::MouseTransform => Some(BackendAttribValue::MouseTransform(
|
BackendAttrib::MouseTransform => Some(BackendAttribValue::MouseTransform(
|
||||||
self.mouse_transform_override,
|
self.mouse_transform_override,
|
||||||
)),
|
)),
|
||||||
|
BackendAttrib::StereoFullFrame => {
|
||||||
|
Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame))
|
||||||
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -364,6 +384,10 @@ impl OverlayBackend for ScreenBackend {
|
|||||||
self.apply_mouse_transform_with_override(frame_transform);
|
self.apply_mouse_transform_with_override(frame_transform);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
BackendAttribValue::StereoFullFrame(new) => {
|
||||||
|
self.stereo_full_frame = new;
|
||||||
|
true
|
||||||
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -382,7 +382,11 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const SAVED_ATTRIBS: [BackendAttrib; 2] = [BackendAttrib::Stereo, BackendAttrib::MouseTransform];
|
const SAVED_ATTRIBS: [BackendAttrib; 3] = [
|
||||||
|
BackendAttrib::Stereo,
|
||||||
|
BackendAttrib::StereoFullFrame,
|
||||||
|
BackendAttrib::MouseTransform,
|
||||||
|
];
|
||||||
|
|
||||||
impl<T> OverlayWindowManager<T> {
|
impl<T> OverlayWindowManager<T> {
|
||||||
pub fn pop_dropped(&mut self) -> Option<OverlayWindowData<T>> {
|
pub fn pop_dropped(&mut self) -> Option<OverlayWindowData<T>> {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ pub enum ToastDisplayMethod {
|
|||||||
#[derive(Debug, Clone, Copy, IntegerId, PartialEq)]
|
#[derive(Debug, Clone, Copy, IntegerId, PartialEq)]
|
||||||
pub enum BackendAttrib {
|
pub enum BackendAttrib {
|
||||||
Stereo,
|
Stereo,
|
||||||
|
StereoFullFrame,
|
||||||
MouseTransform,
|
MouseTransform,
|
||||||
Icon,
|
Icon,
|
||||||
}
|
}
|
||||||
@@ -29,6 +30,7 @@ pub enum BackendAttrib {
|
|||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
pub enum BackendAttribValue {
|
pub enum BackendAttribValue {
|
||||||
Stereo(StereoMode),
|
Stereo(StereoMode),
|
||||||
|
StereoFullFrame(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