forked from 1b-agent/opencadstudio-upstream
feat: Grid snap adaptive spacing + Polar tracking improvements
Grid snap (F9):
• snap spacing now tracks the visible grid zoom level — computed via
compute_grid_step() (same adaptive pow-of-5 logic as draw_grid),
updated on every ViewportMove so zooming in/out keeps snap aligned
with the grid lines on screen
Polar tracking (F10):
• configurable angle increment stored in polar_increment_deg (default 45°)
• right-click the POLAR pill to cycle through 15 → 30 → 45 → 90°
• pill label shows current angle ("POLAR 45°")
• visual guide line: while drawing with polar on, a dashed cyan line is
drawn from last_point along the snapped direction across the viewport
• SetPolarAngle message + handler; all polar_constrain() calls use the
stored increment instead of the hardcoded 45°
ROADMAP updated: Grid snap and Polar tracking marked ✅.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
b3dcbe6eb9
commit
4c1c13cab6
6 files changed
+165
-21
No files matched your search
@@ -146,6 +146,40 @@ pub struct GridParams {
|
||||
pub plane: GridPlane,
|
||||
}
|
||||
|
||||
/// Compute the adaptive grid step size (world units) that the grid renderer
|
||||
/// would use for a given view-projection matrix and viewport bounds.
|
||||
///
|
||||
/// Returns the smallest power-of-5 multiple of 1.0 that places grid lines at
|
||||
/// least `MIN_GRID_PX` pixels apart. This matches exactly what `draw_grid`
|
||||
/// renders, so callers can sync snap spacing to the visible grid.
|
||||
pub fn compute_grid_step(vp: Mat4, bounds: iced::Rectangle) -> f32 {
|
||||
use glam::Vec3;
|
||||
let w2s = |world: Vec3| {
|
||||
let ndc = vp.project_point3(world);
|
||||
glam::Vec2::new(
|
||||
(ndc.x + 1.0) * 0.5 * bounds.width,
|
||||
(1.0 - ndc.y) * 0.5 * bounds.height,
|
||||
)
|
||||
};
|
||||
let o = w2s(Vec3::ZERO);
|
||||
let a1 = w2s(Vec3::X);
|
||||
let a2 = w2s(Vec3::Y);
|
||||
let d1 = (a1 - o).length();
|
||||
let d2 = (a2 - o).length();
|
||||
let px_per_unit = d1.max(d2);
|
||||
if px_per_unit < 1e-6 {
|
||||
return 1.0;
|
||||
}
|
||||
let mut s = 1.0_f32;
|
||||
while s * px_per_unit < MIN_GRID_PX {
|
||||
s *= 5.0;
|
||||
if s > 1e9 {
|
||||
return 1.0;
|
||||
}
|
||||
}
|
||||
s
|
||||
}
|
||||
|
||||
/// Parameters for the screen-space UCS icon drawn in the viewport corner.
|
||||
pub struct UcsIconParams {
|
||||
/// View-projection matrix used to project world axis directions to screen.
|
||||
|
||||
Reference in new issue
Block a user