From 2dfdea361e06ecb9bb2929a42829d8f213e91c8f Mon Sep 17 00:00:00 2001 From: Bradlee Speice Date: Sun, 23 Feb 2025 21:56:31 -0500 Subject: [PATCH] Aspect ratio scaling for transform editor Feels like there _must_ be a simpler way to do this math --- crates/flare/examples/transform_editor.rs | 4 +--- crates/flare/src/transform_editor.rs | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/crates/flare/examples/transform_editor.rs b/crates/flare/examples/transform_editor.rs index 65f8da9..65cd0a2 100644 --- a/crates/flare/examples/transform_editor.rs +++ b/crates/flare/examples/transform_editor.rs @@ -33,9 +33,7 @@ impl eframe::App for TransformEditorApp { }); egui::CentralPanel::default().show(ctx, |ui| { - egui::Frame::canvas(ui.style()).show(ui, |ui| { - self.transform_editor.ui(ui) - }) + self.transform_editor.ui(ui) }); } } diff --git a/crates/flare/src/transform_editor.rs b/crates/flare/src/transform_editor.rs index bad915c..2a9c59d 100644 --- a/crates/flare/src/transform_editor.rs +++ b/crates/flare/src/transform_editor.rs @@ -43,7 +43,21 @@ impl TransformEditor { pub fn ui(&mut self, ui: &mut egui::Ui) -> egui::Response { let (response, painter) = ui.allocate_painter(ui.available_size(), Sense::hover()); - let transform_area = Rect::from_min_max(egui::pos2(-2.0, -2.0), egui::pos2(2.0, 2.0)); + let interact_rect = response.interact_rect; + + // Aspect-ratio scaling; minimum dimension will be [-2.0, 2.0] + let interact_max_dim = interact_rect.width().max(interact_rect.height()); + let interact_min_dim = interact_rect.width().min(interact_rect.height()); + let interact_max_is_width = interact_max_dim == interact_rect.width(); + let ifs_scale = interact_max_dim / interact_min_dim * 4.0; + + let ifs_min = if interact_max_is_width { + egui::pos2(-ifs_scale / 2.0, -2.0) + } else { + egui::pos2(-2.0, -ifs_scale / 2.0) + }; + + let transform_area = Rect::from_min_max(ifs_min, ifs_min * -1.0); let to_screen = emath::RectTransform::from_to(transform_area, response.interact_rect); self.transforms.iter().map(|coef| {