fix: honor GRIDUNIT X/Y spacing and LIMITS option in grid display

The viewport grid ignored the configured spacing and forced square grids: compute_grid_step hardcoded a 1.0 base, a single shared step drove both line families (including the tangent derivative used for gap measurement), and the display always clipped to LIMITS despite the beyond-Limits option.

Grid spacing now scales per-axis from GRIDUNIT via compute_grid_steps (adaptive 5x growth, fixed passthrough), GridParams carries step_x/step_y, snap tolerances follow the visible steps, and the LIMITS clip is skipped when beyond-Limits is set. Also fixes a per-axis overflow fallback that returned the X base for Y. Spacing state (X/Y, adaptive, beyond-Limits) is stored on the app and persisted to UserSettings at defaults; dialog wiring follows separately.
This commit is contained in:
Karim Jerbi committed 2026-09-17 13:52:37 +01:00
1 parent bb29b987c2
commit 05f462f294
7 files changed
+246 -73

No files matched your search

+19 -6
View File
@@ -443,18 +443,31 @@ impl OpenCADStudio {
);
axes = (ux.as_vec3(), uy.as_vec3(), uz.as_vec3());
}
// BUG FIX: the display step used to ignore GRIDUNIT entirely
// (hardcoded 1.0 base). It now resizes from the DSettings
// grid spacing, and honors "Display grid beyond Limits".
let (step_x, step_y) = crate::ui::overlay::compute_grid_steps(
self.grid_spacing_x,
self.grid_spacing_y,
cam.distance,
cam.fov_y,
bounds,
self.grid_adaptive,
);
let limits = if self.grid_beyond_limits {
None
} else {
tab.scene.grid_limits_for_viewport(handle)
};
crate::ui::overlay::GridParams {
view_rot: cam.view_proj_rte(bounds),
eye: cam.eye(),
bounds,
step: crate::ui::overlay::compute_grid_step(
cam.distance,
cam.fov_y,
bounds,
),
step_x,
step_y,
origin,
axes,
limits: tab.scene.grid_limits_for_viewport(handle),
limits,
}
})
.collect();