Add dynamic input for grip-based geometry editing (#1138)

This commit is contained in:
MarcelP102 authored and GitHub committed 2026-09-10 18:23:28 +03:00
1 parent 5ffbf598a9
commit d47e3234d8
9 files changed
+378 -39

No files matched your search

+20 -1
View File
@@ -365,13 +365,32 @@ impl crate::entities::traits::Grippable for Arc {
point: glam::DVec3,
) -> Option<f64> {
use crate::scene::model::object::GripMenuAction as A;
if !matches!(action, A::Lengthen) || self.radius <= 1.0e-9 {
if self.radius <= 1.0e-9 {
return None;
}
let (x, y, _) = crate::scene::view::transform::wcs_point_to_ocs(
(point.x, point.y, point.z),
(self.normal.x, self.normal.y, self.normal.z),
);
if matches!(action, A::Radius) && grip_id == 3 {
let radius = ((x - self.center.x).powi(2) + (y - self.center.y).powi(2)).sqrt();
return (radius > 1.0e-9).then_some(radius);
}
if matches!(action, A::ArcLength) && grip_id == 3 {
let sweep = (self.end_angle - self.start_angle).rem_euclid(TAU);
let middle_angle = self.start_angle + sweep * 0.5;
let middle_x = self.center.x + self.radius * middle_angle.cos();
let middle_y = self.center.y + self.radius * middle_angle.sin();
let tangent_x = -middle_angle.sin();
let tangent_y = middle_angle.cos();
let delta = (x - middle_x) * tangent_x + (y - middle_y) * tangent_y;
let length = self.radius * sweep + delta;
return (length > 1.0e-9 && length < self.radius * TAU - 1.0e-9)
.then_some(length);
}
if !matches!(action, A::Lengthen) {
return None;
}
let cursor_angle = (y - self.center.y).atan2(x - self.center.x);
let current_sweep = (self.end_angle - self.start_angle).rem_euclid(TAU);
let desired_sweep = match grip_id {