pub mod box_widget;
pub mod line_probe;
pub mod sphere;
pub use box_widget::BoxWidget;
pub use line_probe::LineProbeWidget;
pub use sphere::SphereWidget;
use crate::renderer::RenderCamera;
#[derive(Clone, Debug)]
pub struct WidgetContext {
pub camera: RenderCamera,
pub viewport_size: glam::Vec2,
pub cursor_viewport: glam::Vec2,
pub drag_started: bool,
pub dragging: bool,
pub released: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum WidgetResult {
None,
Updated,
}
pub(super) fn handle_world_radius(
pos: glam::Vec3,
camera: &RenderCamera,
viewport_height: f32,
target_px: f32,
) -> f32 {
let eye = glam::Vec3::from(camera.eye_position);
let dist = (pos - eye).length().max(0.001);
let world_per_px = 2.0 * (camera.fov * 0.5).tan() * dist / viewport_height.max(1.0);
world_per_px * target_px
}
pub(super) fn ctx_ray(ctx: &WidgetContext) -> (glam::Vec3, glam::Vec3) {
let vp = ctx.camera.projection * ctx.camera.view;
crate::interaction::picking::screen_to_ray(ctx.cursor_viewport, ctx.viewport_size, vp.inverse())
}
pub(super) fn ray_point_dist(
ray_origin: glam::Vec3,
ray_dir: glam::Vec3,
point: glam::Vec3,
) -> f32 {
let t = (point - ray_origin).dot(ray_dir).max(0.0);
(ray_origin + ray_dir * t - point).length()
}