Aspect ratio scaling for transform editor

Feels like there _must_ be a simpler way to do this math
This commit is contained in:
Bradlee Speice 2025-02-23 21:56:31 -05:00
parent 38f383a0b2
commit 2dfdea361e
2 changed files with 16 additions and 4 deletions

View File

@ -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)
});
}
}

View File

@ -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| {