use egui::{epaint::Vertex, Mesh, PointerButton, Pos2, Rgba, Ui};
use transform_gizmo::math::Transform;
pub use transform_gizmo::*;
pub mod prelude;
pub trait GizmoExt {
fn interact(&mut self, ui: &Ui, targets: &[Transform])
-> Option<(GizmoResult, Vec<Transform>)>;
}
impl GizmoExt for Gizmo {
fn interact(
&mut self,
ui: &Ui,
targets: &[Transform],
) -> Option<(GizmoResult, Vec<Transform>)> {
let config = self.config();
let egui_viewport = egui::Rect {
min: Pos2::new(config.viewport.min.x, config.viewport.min.y),
max: Pos2::new(config.viewport.max.x, config.viewport.max.y),
};
let cursor_pos = ui
.input(|input| input.pointer.hover_pos())
.unwrap_or_default();
let mut viewport = self.config().viewport;
if !viewport.is_finite() {
viewport = ui.clip_rect();
}
self.update_config(GizmoConfig {
viewport,
pixels_per_point: ui.ctx().pixels_per_point(),
..*self.config()
});
let gizmo_result = self.update(
GizmoInteraction {
cursor_pos: (cursor_pos.x, cursor_pos.y),
drag_started: ui
.input(|input| input.pointer.button_pressed(PointerButton::Primary)),
dragging: ui.input(|input| input.pointer.button_down(PointerButton::Primary)),
},
targets,
);
let draw_data = self.draw();
ui.painter().with_clip_rect(egui_viewport).add(Mesh {
indices: draw_data.indices,
vertices: draw_data
.vertices
.into_iter()
.zip(draw_data.colors)
.map(|(pos, [r, g, b, a])| Vertex {
pos: pos.into(),
uv: Pos2::default(),
color: Rgba::from_rgba_premultiplied(r, g, b, a).into(),
})
.collect(),
..Default::default()
});
gizmo_result
}
}