copper3d 3.3.3 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/Utils/segmentation/DrawToolCore.js +20 -3
  2. package/dist/Utils/segmentation/DrawToolCore.js.map +1 -1
  3. package/dist/Utils/segmentation/NrrdTools.js +4 -0
  4. package/dist/Utils/segmentation/NrrdTools.js.map +1 -1
  5. package/dist/Utils/segmentation/RenderingUtils.d.ts +9 -3
  6. package/dist/Utils/segmentation/RenderingUtils.js +35 -15
  7. package/dist/Utils/segmentation/RenderingUtils.js.map +1 -1
  8. package/dist/Utils/segmentation/core/MarchingSquares.d.ts +72 -0
  9. package/dist/Utils/segmentation/core/MarchingSquares.js +169 -0
  10. package/dist/Utils/segmentation/core/MarchingSquares.js.map +1 -0
  11. package/dist/Utils/segmentation/core/index.d.ts +2 -0
  12. package/dist/Utils/segmentation/core/index.js +1 -0
  13. package/dist/Utils/segmentation/core/index.js.map +1 -1
  14. package/dist/Utils/segmentation/eventRouter/EventRouter.d.ts +9 -0
  15. package/dist/Utils/segmentation/eventRouter/EventRouter.js +36 -8
  16. package/dist/Utils/segmentation/eventRouter/EventRouter.js.map +1 -1
  17. package/dist/Utils/segmentation/tools/DrawingTool.d.ts +35 -10
  18. package/dist/Utils/segmentation/tools/DrawingTool.js +247 -36
  19. package/dist/Utils/segmentation/tools/DrawingTool.js.map +1 -1
  20. package/dist/Utils/segmentation/tools/SphereBrushTool.d.ts +83 -6
  21. package/dist/Utils/segmentation/tools/SphereBrushTool.js +283 -68
  22. package/dist/Utils/segmentation/tools/SphereBrushTool.js.map +1 -1
  23. package/dist/Utils/segmentation/tools/ToolHost.d.ts +1 -1
  24. package/dist/bundle.esm.js +794 -131
  25. package/dist/bundle.umd.js +794 -131
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/types/Utils/segmentation/RenderingUtils.d.ts +9 -3
  29. package/dist/types/Utils/segmentation/core/MarchingSquares.d.ts +72 -0
  30. package/dist/types/Utils/segmentation/core/index.d.ts +2 -0
  31. package/dist/types/Utils/segmentation/eventRouter/EventRouter.d.ts +9 -0
  32. package/dist/types/Utils/segmentation/tools/DrawingTool.d.ts +35 -10
  33. package/dist/types/Utils/segmentation/tools/SphereBrushTool.d.ts +83 -6
  34. package/dist/types/Utils/segmentation/tools/ToolHost.d.ts +1 -1
  35. package/dist/types/index.d.ts +1 -1
  36. package/package.json +1 -1
@@ -4,6 +4,10 @@
4
4
  * Extracted from DrawToolCore.paintOnCanvas() closure (Phase 3).
5
5
  * Handles left-click drawing operations: pencil stroke + fill, brush strokes,
6
6
  * eraser, and undo snapshot capture/push.
7
+ *
8
+ * Phase B: Brush mode now writes voxels directly during mousemove and
9
+ * re-renders via marching squares, eliminating the visual "snap" between
10
+ * the smooth canvas stroke and the voxel-based post-release render.
7
11
  */
8
12
  import { BaseTool } from "./BaseTool";
9
13
  import { switchEraserSize } from "../../utils";
@@ -22,6 +26,8 @@ export class DrawingTool extends BaseTool {
22
26
  this.preDrawSlice = null;
23
27
  this.preDrawAxis = "z";
24
28
  this.preDrawSliceIndex = 0;
29
+ /** Previous voxel-space position for Bresenham interpolation (brush mode) */
30
+ this.prevVoxel = null;
25
31
  this.callbacks = callbacks;
26
32
  }
27
33
  /** Whether a draw operation is currently active */
@@ -41,6 +47,7 @@ export class DrawingTool extends BaseTool {
41
47
  this.isPainting = false;
42
48
  this.drawingLines = [];
43
49
  this.clearArcFn = clearArcFn;
50
+ this.prevVoxel = null;
44
51
  }
45
52
  /**
46
53
  * Called on left-click pointerdown in draw mode.
@@ -68,6 +75,22 @@ export class DrawingTool extends BaseTool {
68
75
  this.ctx.nrrd_states.interaction.drawStartPos.y = e.offsetY;
69
76
  // Capture pre-draw slice snapshot for undo
70
77
  this.capturePreDrawSnapshot();
78
+ // Brush mode: initialize voxel tracking and write first dot
79
+ if (!this.ctx.gui_states.mode.pencil && !this.ctx.gui_states.mode.eraser) {
80
+ const voxel = this.canvasToVoxel3D(e.offsetX, e.offsetY);
81
+ this.prevVoxel = voxel;
82
+ try {
83
+ const vol = this.callbacks.getVolumeForLayer(this.ctx.gui_states.layerChannel.layer);
84
+ const channel = this.ctx.gui_states.layerChannel.activeChannel || 1;
85
+ const axis = this.ctx.protectedData.axis;
86
+ const { rH, rV } = this.getVoxelBrushRadius();
87
+ this.paintVoxelEllipse(vol, voxel, rH, rV, channel, axis);
88
+ this.refreshLayerFromVolume();
89
+ }
90
+ catch (_a) {
91
+ // Volume not ready
92
+ }
93
+ }
71
94
  }
72
95
  /**
73
96
  * Called on pointermove during an active drawing operation.
@@ -81,10 +104,16 @@ export class DrawingTool extends BaseTool {
81
104
  this.ctx.nrrd_states.flags.stepClear = 1;
82
105
  (_a = this.clearArcFn) === null || _a === void 0 ? void 0 : _a.call(this, e.offsetX, e.offsetY, this.ctx.gui_states.drawing.brushAndEraserSize);
83
106
  }
84
- else {
107
+ else if (this.ctx.gui_states.mode.pencil) {
108
+ // Pencil mode: accumulate points and draw visual lines on canvas
85
109
  this.drawingLines.push({ x: e.offsetX, y: e.offsetY });
86
110
  this.paintOnCanvasLayer(e.offsetX, e.offsetY);
87
111
  }
112
+ else {
113
+ // Brush mode: write voxels directly + re-render via marching squares
114
+ this.drawingLines.push({ x: e.offsetX, y: e.offsetY });
115
+ this.paintBrushVoxelMove(e.offsetX, e.offsetY);
116
+ }
88
117
  }
89
118
  }
90
119
  /**
@@ -97,11 +126,9 @@ export class DrawingTool extends BaseTool {
97
126
  ctx.closePath();
98
127
  if (!this.ctx.gui_states.mode.eraser) {
99
128
  if (this.ctx.gui_states.mode.pencil) {
100
- // Clear only the current layer canvas (NOT master)
129
+ // Pencil mode: fill polygon then bake to voxels
101
130
  canvas.width = canvas.width;
102
- // Redraw previous layer data from volume
103
131
  this.redrawPreviousImageToLayerCtx(ctx);
104
- // Draw new pencil strokes on current layer canvas
105
132
  ctx.beginPath();
106
133
  ctx.moveTo(this.drawingLines[0].x, this.drawingLines[0].y);
107
134
  for (let i = 1; i < this.drawingLines.length; i++) {
@@ -111,12 +138,26 @@ export class DrawingTool extends BaseTool {
111
138
  ctx.lineWidth = 1;
112
139
  ctx.fillStyle = this.ctx.gui_states.drawing.fillColor;
113
140
  ctx.fill();
114
- // Composite ALL layers to master (not just current layer)
115
141
  this.callbacks.compositeAllLayers();
142
+ // Pencil still needs canvas→voxel bake
143
+ this.callbacks.syncLayerSliceData(this.ctx.nrrd_states.view.currentSliceIndex, this.ctx.gui_states.layerChannel.layer);
144
+ // Re-render from voxels to eliminate pencil snap
145
+ this.refreshLayerFromVolume();
146
+ }
147
+ else {
148
+ // Brush mode: voxels already written during mousemove
149
+ // Just re-render final state and composite
150
+ this.refreshLayerFromVolume();
116
151
  }
117
152
  }
118
- this.callbacks.syncLayerSliceData(this.ctx.nrrd_states.view.currentSliceIndex, this.ctx.gui_states.layerChannel.layer);
153
+ else {
154
+ // Eraser mode: still needs canvas→voxel bake
155
+ this.callbacks.syncLayerSliceData(this.ctx.nrrd_states.view.currentSliceIndex, this.ctx.gui_states.layerChannel.layer);
156
+ // Re-render from voxels for eraser too
157
+ this.refreshLayerFromVolume();
158
+ }
119
159
  this.isPainting = false;
160
+ this.prevVoxel = null;
120
161
  // Push undo delta
121
162
  this.pushUndoDelta();
122
163
  }
@@ -127,6 +168,7 @@ export class DrawingTool extends BaseTool {
127
168
  */
128
169
  onPointerLeave() {
129
170
  this.isPainting = false;
171
+ this.prevVoxel = null;
130
172
  if (!this.leftClicked)
131
173
  return false;
132
174
  this.leftClicked = false;
@@ -137,11 +179,6 @@ export class DrawingTool extends BaseTool {
137
179
  /**
138
180
  * Create a self-managing mouseover/mouseout/mousemove handler
139
181
  * that tracks brush hover position for the preview circle.
140
- *
141
- * The returned function should be registered on drawingCanvas for
142
- * "mouseover" and "mouseout" events. It adds/removes a "mousemove"
143
- * listener on itself to keep mouseOverX/Y up-to-date while the
144
- * cursor is inside the canvas.
145
182
  */
146
183
  createBrushTrackingHandler() {
147
184
  const handler = (e) => {
@@ -165,8 +202,6 @@ export class DrawingTool extends BaseTool {
165
202
  }
166
203
  /**
167
204
  * Render brush circle preview on the drawing context.
168
- * Called from the start() render loop when in draw mode and not
169
- * actively painting. Skipped in pencil/eraser mode.
170
205
  */
171
206
  renderBrushPreview(ctx, width, height) {
172
207
  if (this.ctx.gui_states.mode.pencil ||
@@ -181,6 +216,195 @@ export class DrawingTool extends BaseTool {
181
216
  ctx.strokeStyle = this.ctx.gui_states.drawing.brushColor;
182
217
  ctx.stroke();
183
218
  }
219
+ // ── Brush mode: direct voxel write ────────────────────────────
220
+ /**
221
+ * Convert display (zoomed) coordinates to 3D voxel coordinates.
222
+ * Same logic as SphereBrushTool.canvasToVoxelCenter.
223
+ */
224
+ canvasToVoxel3D(displayX, displayY) {
225
+ const nrrd = this.ctx.nrrd_states;
226
+ const axis = this.ctx.protectedData.axis;
227
+ const cw = nrrd.view.changedWidth;
228
+ const ch = nrrd.view.changedHeight;
229
+ const sliceIndex = nrrd.view.currentSliceIndex;
230
+ switch (axis) {
231
+ case 'z':
232
+ return {
233
+ x: displayX * nrrd.image.nrrd_x_pixel / cw,
234
+ y: displayY * nrrd.image.nrrd_y_pixel / ch,
235
+ z: sliceIndex,
236
+ };
237
+ case 'y':
238
+ return {
239
+ x: displayX * nrrd.image.nrrd_x_pixel / cw,
240
+ y: sliceIndex,
241
+ z: (ch - displayY) * nrrd.image.nrrd_z_pixel / ch,
242
+ };
243
+ case 'x':
244
+ return {
245
+ x: sliceIndex,
246
+ y: displayY * nrrd.image.nrrd_y_pixel / ch,
247
+ z: displayX * nrrd.image.nrrd_z_pixel / cw,
248
+ };
249
+ }
250
+ }
251
+ /**
252
+ * Get voxel-space brush radius for visible axes.
253
+ * Converts display-pixel brush size to voxel units.
254
+ */
255
+ getVoxelBrushRadius() {
256
+ const nrrd = this.ctx.nrrd_states;
257
+ const axis = this.ctx.protectedData.axis;
258
+ const cw = nrrd.view.changedWidth;
259
+ const ch = nrrd.view.changedHeight;
260
+ const displayRadius = this.ctx.gui_states.drawing.brushAndEraserSize / 2;
261
+ switch (axis) {
262
+ case 'z':
263
+ return {
264
+ rH: displayRadius * nrrd.image.nrrd_x_pixel / cw,
265
+ rV: displayRadius * nrrd.image.nrrd_y_pixel / ch,
266
+ };
267
+ case 'y':
268
+ return {
269
+ rH: displayRadius * nrrd.image.nrrd_x_pixel / cw,
270
+ rV: displayRadius * nrrd.image.nrrd_z_pixel / ch,
271
+ };
272
+ case 'x':
273
+ return {
274
+ rH: displayRadius * nrrd.image.nrrd_z_pixel / cw,
275
+ rV: displayRadius * nrrd.image.nrrd_y_pixel / ch,
276
+ };
277
+ }
278
+ }
279
+ /**
280
+ * Paint a 2D ellipse of voxels on the current slice.
281
+ * Only the two visible axes are iterated; the slice-direction axis is fixed.
282
+ */
283
+ paintVoxelEllipse(vol, center, rH, rV, label, axis) {
284
+ const dims = vol.getDimensions();
285
+ switch (axis) {
286
+ case 'z': {
287
+ const minX = Math.max(0, Math.floor(center.x - rH));
288
+ const maxX = Math.min(dims.width - 1, Math.ceil(center.x + rH));
289
+ const minY = Math.max(0, Math.floor(center.y - rV));
290
+ const maxY = Math.min(dims.height - 1, Math.ceil(center.y + rV));
291
+ const z = Math.round(center.z);
292
+ for (let y = minY; y <= maxY; y++) {
293
+ for (let x = minX; x <= maxX; x++) {
294
+ const dx = rH > 0 ? (x - center.x) / rH : 0;
295
+ const dy = rV > 0 ? (y - center.y) / rV : 0;
296
+ if (dx * dx + dy * dy <= 1.0) {
297
+ vol.setVoxel(x, y, z, label);
298
+ }
299
+ }
300
+ }
301
+ break;
302
+ }
303
+ case 'y': {
304
+ const minX = Math.max(0, Math.floor(center.x - rH));
305
+ const maxX = Math.min(dims.width - 1, Math.ceil(center.x + rH));
306
+ const minZ = Math.max(0, Math.floor(center.z - rV));
307
+ const maxZ = Math.min(dims.depth - 1, Math.ceil(center.z + rV));
308
+ const y = Math.round(center.y);
309
+ for (let z = minZ; z <= maxZ; z++) {
310
+ for (let x = minX; x <= maxX; x++) {
311
+ const dx = rH > 0 ? (x - center.x) / rH : 0;
312
+ const dz = rV > 0 ? (z - center.z) / rV : 0;
313
+ if (dx * dx + dz * dz <= 1.0) {
314
+ vol.setVoxel(x, y, z, label);
315
+ }
316
+ }
317
+ }
318
+ break;
319
+ }
320
+ case 'x': {
321
+ const minZ = Math.max(0, Math.floor(center.z - rH));
322
+ const maxZ = Math.min(dims.depth - 1, Math.ceil(center.z + rH));
323
+ const minY = Math.max(0, Math.floor(center.y - rV));
324
+ const maxY = Math.min(dims.height - 1, Math.ceil(center.y + rV));
325
+ const x = Math.round(center.x);
326
+ for (let yy = minY; yy <= maxY; yy++) {
327
+ for (let zz = minZ; zz <= maxZ; zz++) {
328
+ const dz = rH > 0 ? (zz - center.z) / rH : 0;
329
+ const dy = rV > 0 ? (yy - center.y) / rV : 0;
330
+ if (dz * dz + dy * dy <= 1.0) {
331
+ vol.setVoxel(x, yy, zz, label);
332
+ }
333
+ }
334
+ }
335
+ break;
336
+ }
337
+ }
338
+ }
339
+ /**
340
+ * Brush mode mousemove: write voxels along stroke segment, then re-render.
341
+ * Uses linear interpolation between prev and current positions to ensure
342
+ * no gaps when the mouse moves fast.
343
+ */
344
+ paintBrushVoxelMove(displayX, displayY) {
345
+ try {
346
+ const vol = this.callbacks.getVolumeForLayer(this.ctx.gui_states.layerChannel.layer);
347
+ const channel = this.ctx.gui_states.layerChannel.activeChannel || 1;
348
+ const axis = this.ctx.protectedData.axis;
349
+ const { rH, rV } = this.getVoxelBrushRadius();
350
+ const current = this.canvasToVoxel3D(displayX, displayY);
351
+ if (this.prevVoxel) {
352
+ // Interpolate from prev to current to fill gaps
353
+ const prev = this.prevVoxel;
354
+ let steps;
355
+ switch (axis) {
356
+ case 'z':
357
+ steps = Math.max(Math.abs(current.x - prev.x), Math.abs(current.y - prev.y));
358
+ break;
359
+ case 'y':
360
+ steps = Math.max(Math.abs(current.x - prev.x), Math.abs(current.z - prev.z));
361
+ break;
362
+ case 'x':
363
+ steps = Math.max(Math.abs(current.z - prev.z), Math.abs(current.y - prev.y));
364
+ break;
365
+ }
366
+ steps = Math.max(1, Math.ceil(steps));
367
+ for (let i = 0; i <= steps; i++) {
368
+ const t = steps === 0 ? 0 : i / steps;
369
+ const pt = {
370
+ x: prev.x + (current.x - prev.x) * t,
371
+ y: prev.y + (current.y - prev.y) * t,
372
+ z: prev.z + (current.z - prev.z) * t,
373
+ };
374
+ this.paintVoxelEllipse(vol, pt, rH, rV, channel, axis);
375
+ }
376
+ }
377
+ else {
378
+ this.paintVoxelEllipse(vol, current, rH, rV, channel, axis);
379
+ }
380
+ this.prevVoxel = current;
381
+ // Re-render the layer canvas from volume (marching squares)
382
+ this.refreshLayerFromVolume();
383
+ }
384
+ catch (_a) {
385
+ // Volume not ready — fall back to canvas drawing
386
+ this.paintOnCanvasLayer(displayX, displayY);
387
+ }
388
+ }
389
+ /**
390
+ * Re-render the active layer's canvas from MaskVolume via marching squares,
391
+ * then composite all layers to master.
392
+ */
393
+ refreshLayerFromVolume() {
394
+ const layer = this.ctx.gui_states.layerChannel.layer;
395
+ const target = this.ctx.protectedData.layerTargets.get(layer);
396
+ if (!target)
397
+ return;
398
+ const { ctx, canvas } = target;
399
+ canvas.width = canvas.width; // clear
400
+ const axis = this.ctx.protectedData.axis;
401
+ const buffer = this.callbacks.getOrCreateSliceBuffer(axis);
402
+ if (buffer) {
403
+ this.callbacks.renderSliceToCanvas(layer, axis, this.ctx.nrrd_states.view.currentSliceIndex, buffer, ctx, this.ctx.nrrd_states.view.changedWidth, this.ctx.nrrd_states.view.changedHeight);
404
+ }
405
+ this.callbacks.compositeAllLayers();
406
+ this.ctx.protectedData.mainPreSlices.mesh.material.map.needsUpdate = true;
407
+ }
184
408
  // ── Private helpers ────────────────────────────────────────
185
409
  /** Capture pre-draw slice snapshot for undo */
186
410
  capturePreDrawSnapshot() {
@@ -217,27 +441,18 @@ export class DrawingTool extends BaseTool {
217
441
  }
218
442
  /**
219
443
  * Redraws persisted layer data onto ctx before new pencil fill.
220
- * Extracted from DrawToolCore.
444
+ * Delegates to the host's vector renderSliceToCanvas for consistency.
221
445
  */
222
446
  redrawPreviousImageToLayerCtx(ctx) {
223
- var _a;
224
- const tempPreImg = (_a = this.callbacks.filterDrawedImage(this.ctx.protectedData.axis, this.ctx.nrrd_states.view.currentSliceIndex)) === null || _a === void 0 ? void 0 : _a.image;
225
- this.ctx.protectedData.canvases.emptyCanvas.width =
226
- this.ctx.protectedData.canvases.emptyCanvas.width;
227
- this.ctx.protectedData.ctxes.emptyCtx.putImageData(tempPreImg, 0, 0);
228
- ctx.imageSmoothingEnabled = false;
229
- // Coronal (axis='y') Z-flip: same as renderSliceToCanvas.
230
- if (this.ctx.protectedData.axis === 'y') {
231
- ctx.save();
232
- ctx.scale(1, -1);
233
- ctx.translate(0, -this.ctx.nrrd_states.view.changedHeight);
234
- }
235
- ctx.drawImage(this.ctx.protectedData.canvases.emptyCanvas, 0, 0, this.ctx.nrrd_states.view.changedWidth, this.ctx.nrrd_states.view.changedHeight);
236
- if (this.ctx.protectedData.axis === 'y') {
237
- ctx.restore();
238
- }
447
+ const axis = this.ctx.protectedData.axis;
448
+ const W = this.ctx.nrrd_states.view.changedWidth;
449
+ const H = this.ctx.nrrd_states.view.changedHeight;
450
+ const buffer = this.callbacks.getOrCreateSliceBuffer(axis);
451
+ if (!buffer)
452
+ return;
453
+ this.callbacks.renderSliceToCanvas(this.ctx.gui_states.layerChannel.layer, axis, this.ctx.nrrd_states.view.currentSliceIndex, buffer, ctx, W, H);
239
454
  }
240
- /** Draw a line segment on a layer canvas */
455
+ /** Draw a line segment on a layer canvas (pencil mode only) */
241
456
  drawLinesOnLayer(ctx, x, y) {
242
457
  ctx.beginPath();
243
458
  ctx.moveTo(this.ctx.nrrd_states.interaction.drawStartPos.x, this.ctx.nrrd_states.interaction.drawStartPos.y);
@@ -253,17 +468,13 @@ export class DrawingTool extends BaseTool {
253
468
  ctx.stroke();
254
469
  ctx.closePath();
255
470
  }
256
- /** Paint a segment on the current layer canvas and composite to master */
471
+ /** Paint a segment on the current layer canvas and composite to master (pencil mode) */
257
472
  paintOnCanvasLayer(x, y) {
258
473
  const { ctx } = this.callbacks.setCurrentLayer();
259
- // Draw only on the current layer canvas (not master directly)
260
474
  this.drawLinesOnLayer(ctx, x, y);
261
- // Composite all layers to master to preserve other layers' data
262
475
  this.callbacks.compositeAllLayers();
263
- // Reset drawing start position to current position
264
476
  this.ctx.nrrd_states.interaction.drawStartPos.x = x;
265
477
  this.ctx.nrrd_states.interaction.drawStartPos.y = y;
266
- // Flag the map as needing updating
267
478
  this.ctx.protectedData.mainPreSlices.mesh.material.map.needsUpdate = true;
268
479
  }
269
480
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DrawingTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/DrawingTool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DrawingTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/DrawingTool.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,11 @@ import type { ToolContext } from "./BaseTool";
19
19
  import type { SphereBrushHostDeps } from "./ToolHost";
20
20
  export declare class SphereBrushTool extends BaseTool {
21
21
  private callbacks;
22
- /** Recorded sphere center in canvas mm-space */
22
+ /**
23
+ * Recorded sphere center in display (zoomed) coordinates.
24
+ * Used for both preview redraw and voxel calculation — the voxel conversion
25
+ * uses `changedWidth/Height` as the display scale, so no mm detour is needed.
26
+ */
23
27
  private centerX;
24
28
  private centerY;
25
29
  private centerSlice;
@@ -27,18 +31,42 @@ export declare class SphereBrushTool extends BaseTool {
27
31
  private active;
28
32
  /** Current operation mode for the active placement */
29
33
  private mode;
30
- /** Cumulative "before" snapshots for drag-erase undo (z-index → slice data) */
34
+ /** Cumulative "before" snapshots for drag undo (z-index → slice data) — used by both brush and eraser drag */
31
35
  private dragBeforeSnapshots;
32
- /** Whether a drag-erase has actually moved (vs. simple click-release) */
36
+ /** Whether a drag has actually moved (vs. simple click-release) */
33
37
  private dragMoved;
38
+ /**
39
+ * Latest cursor position in display (zoomed) coords. Used by the wheel
40
+ * handler to redraw the preview at the cursor, not the original mousedown
41
+ * point, during mid-drag radius changes.
42
+ */
43
+ private lastDisplayX;
44
+ private lastDisplayY;
45
+ private lastSliceIndex;
46
+ /**
47
+ * All sphere centers written during the current stroke. The wheel handler
48
+ * retroactively re-renders the entire stroke at the new radius by restoring
49
+ * `dragBeforeSnapshots` and replaying every entry here.
50
+ */
51
+ private strokeCenters;
34
52
  constructor(ctx: ToolContext, callbacks: SphereBrushHostDeps);
35
53
  setCallbacks(callbacks: SphereBrushHostDeps): void;
36
54
  /**
37
- * Convert canvas mm-space coordinates to 3D voxel coordinates.
55
+ * Convert display (zoomed) coordinates to 3D voxel coordinates.
56
+ *
57
+ * Uses `changedWidth/Height` as the display scale directly (instead of
58
+ * going through mm via `/sizeFactor`). This keeps the write pixel-exact
59
+ * with the preview circle, which is drawn on a `changedWidth x changedHeight`
60
+ * sized sphere canvas — avoiding floating-point drift at high zoom levels.
38
61
  */
39
62
  private canvasToVoxelCenter;
40
63
  /**
41
64
  * Convert mm radius to per-axis voxel radii.
65
+ *
66
+ * For the two axes visible in the current view, scale via
67
+ * `changedWidth/Height` so the rendered ellipsoid cross-section matches
68
+ * the preview pixel radius exactly. The third (slice-direction) axis is
69
+ * not visible, so it uses the plain mm-based ratio.
42
70
  */
43
71
  private getVoxelRadii;
44
72
  /**
@@ -83,11 +111,41 @@ export declare class SphereBrushTool extends BaseTool {
83
111
  */
84
112
  configSphereBrushWheel(): (e: WheelEvent) => void;
85
113
  /**
86
- * Handle pointer-down in sphereBrush mode (direct click, no Shift needed).
114
+ * Retroactively re-render the current stroke at the current radius.
115
+ *
116
+ * Step 1: walk every recorded stroke center and expand
117
+ * `dragBeforeSnapshots` to cover the new (larger) bounding box. Slices
118
+ * newly included here are still pristine because the original stroke
119
+ * never touched them.
120
+ * Step 2: restore every snapshotted slice from its pristine backup.
121
+ * Step 3: replay every stroke center at the new radius.
122
+ *
123
+ * Step 3 produces the same final state as if the user had used the new
124
+ * radius from the start. Undo still captures the full stroke as one group
125
+ * at pointerup.
126
+ */
127
+ private replayStrokeWithCurrentRadius;
128
+ /**
129
+ * Handle pointer-down in sphereBrush mode (3D Slicer-style).
130
+ *
131
+ * Captures pristine snapshots at the mousedown location but does NOT
132
+ * write any voxels yet — the user may wheel-adjust the radius before
133
+ * dragging. The first sphere is written either by the first pointermove
134
+ * or by pointerup (single-click fallback).
87
135
  */
88
136
  onSphereBrushClick(e: MouseEvent): void;
89
137
  /**
90
- * Handle pointer-up in sphereBrush mode — write sphere to volume.
138
+ * Handle pointer-move in sphereBrush mode — drag to continuously paint.
139
+ *
140
+ * Mirrors sphereEraser drag: writes a new sphere at each move position,
141
+ * extends the cumulative before-snapshot to cover any newly-touched Z
142
+ * slices, and repaints the preview. Never notifies the backend; pointerup
143
+ * does that once for the whole stroke.
144
+ */
145
+ onSphereBrushMove(e: MouseEvent): void;
146
+ /**
147
+ * Handle pointer-up in sphereBrush mode — finalize stroke + push undo group
148
+ * + single batched backend notify for all Z slices touched during the drag.
91
149
  */
92
150
  onSphereBrushPointerUp(): void;
93
151
  /**
@@ -104,6 +162,12 @@ export declare class SphereBrushTool extends BaseTool {
104
162
  * Works for both click-release and drag-release.
105
163
  */
106
164
  onSphereEraserPointerUp(): void;
165
+ /**
166
+ * Clear per-stroke state after pointerup or cancel. Kept as a helper so
167
+ * brush/eraser pointerup and cancelActivePlacement all reset the same set
168
+ * of fields — if a new drag-state field is added, only one place to update.
169
+ */
170
+ private finalizeStrokeState;
107
171
  /**
108
172
  * Expand cumulative "before" snapshots to cover z range [minZ, maxZ].
109
173
  * Only captures slices not yet in the map (preserves original state).
@@ -120,8 +184,21 @@ export declare class SphereBrushTool extends BaseTool {
120
184
  * @param changedDeltas - If provided, fire onMaskChanged for ALL changed
121
185
  * slices (not just the current view slice) so the backend receives the
122
186
  * full 3D sphere data for NII/GLTF export.
187
+ * @param notifyBackend - When false, only refresh the local canvas and skip
188
+ * the onMaskChanged callback. Used during drag to avoid per-frame HTTP;
189
+ * pointerup then calls with `true` to send a single batched update.
123
190
  */
124
191
  private refreshDisplay;
125
192
  /** Whether a sphere placement is currently in progress */
126
193
  get isActive(): boolean;
194
+ /**
195
+ * Defensively cancel any in-progress sphere placement and clear the preview.
196
+ *
197
+ * Called when crosshair mode is entered so any lingering sphere preview
198
+ * (e.g. red dashed eraser outline) is wiped immediately. In normal flow
199
+ * `leftButtonDown === true` blocks crosshair toggle, so this shouldn't
200
+ * fire mid-stroke — but if it ever does, we drop the drag snapshot
201
+ * rather than committing a partial undo entry.
202
+ */
203
+ cancelActivePlacement(): void;
127
204
  }