git.lucas.co / cce-designer
graphic design tool
git clone https://git.lucas.co/cce-designer.git

commit596a103b9f9e83dfc768aed5ce7e69bfb37f7595
parentaabd044655
authorLucas Galante <lsgalante12@gmail.com>
date2026-09-29 22:02
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");