graphic design tool
git clone https://git.lucas.co/cce-designer.git
fix: Point Marker Size reads in world units, as Group Marker Size does
The palette row was a spin in thousandths, so one radius read as two
numbers and a value typed in world units landed on the spin's floor.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
CLAUDE.md | 9 ++++++---
src/dialog.rs | 8 ++++++--
src/main.rs | 7 ++++++-
3 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
index 8988c98..8402d87 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -2451,7 +2451,10 @@ that (percent by 5, `State::wire_opacity` — the wires' own, apart from the
polygons' Opacity; until 2026-09-25 it was the Wire Color's ALPHA, and
`StoredRenderSettings` moves an old alpha, from state.kdl's `#rrggbbaa` or
a project's four-component array, into it on load), a
-**Point Marker Size** slider (the palette row's 0.005–0.1, no suffix since
+**Point Marker Size** slider (0.005–0.1 world units, the palette row's
+since 2026-09-29 — until then that row was a spin in THOUSANDTHS, so the
+two marker sizes read as different numbers for one radius, and 0.025
+typed into it landed on the spin's floor; no suffix since
the World Unit names the units), a **Group
Marker Size** slider (0–0.2 world units by 0.005), and the
polygon **Opacity** as a
@@ -2934,8 +2937,8 @@ selection stays where it was:
params pane's pickers), a path-tracer restart and a synchronous file
write, per pointer event, for six values the graph never reads — which
is what made the dialog's sliders drag behind the pointer while the
- menu's did not. The spin rows (Grid Thickness, Origin Size, Point
- Marker Size, Camera Pivot Size) land the same way, their whole number
+ menu's did not. The spin rows (Grid Thickness, Origin Size, Camera
+ Pivot Size) land the same way, their whole number
over the row's unit, each re-baking only the guide mesh that reads it;
`a_dialog_slider_drag_lands_without_re_evaluating_the_graph` pins all
of it. The **zoom row**
diff --git a/src/dialog.rs b/src/dialog.rs
index 94bb144..664a5bc 100644
--- a/src/dialog.rs
+++ b/src/dialog.rs
@@ -1324,7 +1324,11 @@ pub const SETTINGS: &[Setting] = &[
// The pull arrows' length over the true displacement; 1 is the vector
// as it is.
Setting::field("Pull Arrow Scale", "pull_arrow_scale", Ctl::Slider { min: 0.25, max: 10.0, dec: 2 }),
- Setting::field("Point Marker Size", "point_marker_size", Ctl::Spin { min: 5.0, max: 100.0, unit: 1000.0 }),
+ // In world units, as Group Marker Size is, and as the viewport menu's
+ // slider always read it: until 2026-09-29 this row was a spin in
+ // THOUSANDTHS (5..100), so the two sizes read as different numbers for
+ // one radius, and 0.025 typed here landed on the spin's floor.
+ Setting::field("Point Marker Size", "point_marker_size", Ctl::Slider { min: 0.005, max: 0.1, dec: 3 }),
Setting::field("Point Marker Color", "point_marker_color", Ctl::Color),
Setting::field("Grid Color", "grid_color", Ctl::Color),
Setting::field("Grid Thickness", "grid_thickness", Ctl::Spin { min: 2.0, max: 200.0, unit: 1000.0 }),
@@ -1932,7 +1936,6 @@ impl State {
match key {
"grid_thickness" => self.grid_thickness = v,
"origin_size" => self.origin_size = v,
- "point_marker_size" => self.point_marker_size = v,
_ => {}
}
}
@@ -1944,6 +1947,7 @@ impl State {
"geo_opacity" => self.geo_opacity = v,
"wire_opacity" => self.wire_opacity = v,
"group_marker_size" => self.group_marker_size = v,
+ "point_marker_size" => self.point_marker_size = v,
"pull_arrow_scale" => {
self.pull_arrow_scale = v;
self.rebuild_pull_arrow_verts();
diff --git a/src/main.rs b/src/main.rs
index 0b25e21..dd6205b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -13476,8 +13476,13 @@ mod tests {
state.land_dialog_slider(&setting_row_id("Origin Size"), 25.0);
assert!((state.origin_size - 2.5).abs() < 1e-6, "{}", state.origin_size);
assert!(state.pending_origin.is_some(), "the origin re-baked");
- state.land_dialog_slider(&setting_row_id("Point Marker Size"), 50.0);
+ // Point Marker Size reads in world units, as Group Marker Size does
+ // — one radius, one number in both rows.
+ state.land_dialog_slider(&setting_row_id("Point Marker Size"), 0.05);
assert!((state.point_marker_size - 0.05).abs() < 1e-6, "{}", state.point_marker_size);
+ state.land_dialog_slider(&setting_row_id("Group Marker Size"), 0.05);
+ assert!((state.group_marker_size - state.point_marker_size).abs() < 1e-6);
+ assert_eq!(state.settings_row_value("Point Marker Size"), state.settings_row_value("Group Marker Size"));
state.land_dialog_slider(&setting_row_id("Camera Pivot Size"), 20.0);
assert!((state.camera_pivot_size - 2.0).abs() < 1e-6, "{}", state.camera_pivot_size);
assert!(state.pending_pivot.is_some(), "the pivot re-baked");