@oh-just-another/state 0.58.0 → 0.60.0
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.
- package/CHANGELOG.md +158 -0
- package/README.md +78 -27
- package/dist/.tsbuildinfo +1 -1
- package/dist/actions/actionArrange.d.ts +13 -0
- package/dist/actions/actionArrange.d.ts.map +1 -0
- package/dist/actions/actionArrange.js +130 -0
- package/dist/actions/actionArrange.js.map +1 -0
- package/dist/actions/actionClipboard.d.ts +2 -0
- package/dist/actions/actionClipboard.d.ts.map +1 -1
- package/dist/actions/actionClipboard.js +32 -1
- package/dist/actions/actionClipboard.js.map +1 -1
- package/dist/actions/actionKeyboard.d.ts.map +1 -1
- package/dist/actions/actionKeyboard.js +77 -9
- package/dist/actions/actionKeyboard.js.map +1 -1
- package/dist/actions/actionMode.d.ts +4 -0
- package/dist/actions/actionMode.d.ts.map +1 -1
- package/dist/actions/actionMode.js +54 -0
- package/dist/actions/actionMode.js.map +1 -1
- package/dist/actions/actionSelection.d.ts.map +1 -1
- package/dist/actions/actionSelection.js +1 -0
- package/dist/actions/actionSelection.js.map +1 -1
- package/dist/actions/actionText.d.ts +5 -0
- package/dist/actions/actionText.d.ts.map +1 -0
- package/dist/actions/actionText.js +37 -0
- package/dist/actions/actionText.js.map +1 -0
- package/dist/actions/actionView.d.ts +6 -0
- package/dist/actions/actionView.d.ts.map +1 -1
- package/dist/actions/actionView.js +20 -2
- package/dist/actions/actionView.js.map +1 -1
- package/dist/actions/actionZoom.d.ts.map +1 -1
- package/dist/actions/actionZoom.js +5 -0
- package/dist/actions/actionZoom.js.map +1 -1
- package/dist/actions/index.d.ts +6 -4
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +6 -4
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/registry.d.ts.map +1 -1
- package/dist/actions/registry.js +17 -0
- package/dist/actions/registry.js.map +1 -1
- package/dist/actions/types.d.ts +10 -1
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js.map +1 -1
- package/dist/auto-layout-scheduler.d.ts +1 -3
- package/dist/auto-layout-scheduler.d.ts.map +1 -1
- package/dist/auto-layout-scheduler.js +1 -2
- package/dist/auto-layout-scheduler.js.map +1 -1
- package/dist/built-in-handlers.d.ts.map +1 -1
- package/dist/built-in-handlers.js +14 -1
- package/dist/built-in-handlers.js.map +1 -1
- package/dist/clipboard.d.ts +0 -14
- package/dist/clipboard.d.ts.map +1 -1
- package/dist/clipboard.js +1 -1
- package/dist/clipboard.js.map +1 -1
- package/dist/constants.d.ts +208 -41
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +210 -25
- package/dist/constants.js.map +1 -1
- package/dist/dom-events.d.ts +8 -2
- package/dist/dom-events.d.ts.map +1 -1
- package/dist/dom-events.js +12 -0
- package/dist/dom-events.js.map +1 -1
- package/dist/editor/animation-scene.d.ts +36 -0
- package/dist/editor/animation-scene.d.ts.map +1 -0
- package/dist/editor/animation-scene.js +194 -0
- package/dist/editor/animation-scene.js.map +1 -0
- package/dist/editor/animation.d.ts +43 -0
- package/dist/editor/animation.d.ts.map +1 -0
- package/dist/editor/animation.js +80 -0
- package/dist/editor/animation.js.map +1 -0
- package/dist/editor/applies/arrange.d.ts +46 -0
- package/dist/editor/applies/arrange.d.ts.map +1 -0
- package/dist/editor/applies/arrange.js +162 -0
- package/dist/editor/applies/arrange.js.map +1 -0
- package/dist/editor/applies/create.d.ts +0 -6
- package/dist/editor/applies/create.d.ts.map +1 -1
- package/dist/editor/applies/create.js +1 -1
- package/dist/editor/applies/create.js.map +1 -1
- package/dist/editor/applies/edge.d.ts +8 -1
- package/dist/editor/applies/edge.d.ts.map +1 -1
- package/dist/editor/applies/edge.js +31 -1
- package/dist/editor/applies/edge.js.map +1 -1
- package/dist/editor/applies/link-move.d.ts +0 -8
- package/dist/editor/applies/link-move.d.ts.map +1 -1
- package/dist/editor/applies/link-move.js +1 -1
- package/dist/editor/applies/link-move.js.map +1 -1
- package/dist/editor/applies/move.d.ts +6 -0
- package/dist/editor/applies/move.d.ts.map +1 -1
- package/dist/editor/applies/move.js +6 -0
- package/dist/editor/applies/move.js.map +1 -1
- package/dist/editor/applies/resize.d.ts +26 -5
- package/dist/editor/applies/resize.d.ts.map +1 -1
- package/dist/editor/applies/resize.js +91 -13
- package/dist/editor/applies/resize.js.map +1 -1
- package/dist/editor/caret-blink.d.ts +18 -0
- package/dist/editor/caret-blink.d.ts.map +1 -0
- package/dist/editor/caret-blink.js +42 -0
- package/dist/editor/caret-blink.js.map +1 -0
- package/dist/editor/container-ops.d.ts.map +1 -1
- package/dist/editor/container-ops.js +2 -2
- package/dist/editor/container-ops.js.map +1 -1
- package/dist/editor/dirty-rect.d.ts +23 -0
- package/dist/editor/dirty-rect.d.ts.map +1 -0
- package/dist/editor/dirty-rect.js +115 -0
- package/dist/editor/dirty-rect.js.map +1 -0
- package/dist/editor/gif-playback.d.ts +45 -0
- package/dist/editor/gif-playback.d.ts.map +1 -0
- package/dist/editor/gif-playback.js +125 -0
- package/dist/editor/gif-playback.js.map +1 -0
- package/dist/editor/hit-test.d.ts +3 -3
- package/dist/editor/hit-test.d.ts.map +1 -1
- package/dist/editor/hit-test.js +40 -15
- package/dist/editor/hit-test.js.map +1 -1
- package/dist/editor/interaction-state.d.ts +184 -0
- package/dist/editor/interaction-state.d.ts.map +1 -0
- package/dist/editor/interaction-state.js +139 -0
- package/dist/editor/interaction-state.js.map +1 -0
- package/dist/editor/link-handle-drag.d.ts +152 -0
- package/dist/editor/link-handle-drag.d.ts.map +1 -0
- package/dist/editor/link-handle-drag.js +300 -0
- package/dist/editor/link-handle-drag.js.map +1 -0
- package/dist/editor/long-press.d.ts.map +1 -1
- package/dist/editor/long-press.js +2 -2
- package/dist/editor/long-press.js.map +1 -1
- package/dist/editor/pinch.d.ts.map +1 -1
- package/dist/editor/pinch.js +6 -6
- package/dist/editor/pinch.js.map +1 -1
- package/dist/editor/pointer-binding.d.ts +9 -11
- package/dist/editor/pointer-binding.d.ts.map +1 -1
- package/dist/editor/pointer-binding.js +1191 -890
- package/dist/editor/pointer-binding.js.map +1 -1
- package/dist/editor/public/arrange-group.d.ts +3 -9
- package/dist/editor/public/arrange-group.d.ts.map +1 -1
- package/dist/editor/public/arrange-group.js +4 -6
- package/dist/editor/public/arrange-group.js.map +1 -1
- package/dist/editor/public/brush.d.ts +31 -12
- package/dist/editor/public/brush.d.ts.map +1 -1
- package/dist/editor/public/brush.js +66 -17
- package/dist/editor/public/brush.js.map +1 -1
- package/dist/editor/public/clipboard.d.ts +2 -4
- package/dist/editor/public/clipboard.d.ts.map +1 -1
- package/dist/editor/public/clipboard.js +2 -4
- package/dist/editor/public/clipboard.js.map +1 -1
- package/dist/editor/public/cursor.d.ts +29 -0
- package/dist/editor/public/cursor.d.ts.map +1 -0
- package/dist/editor/public/cursor.js +146 -0
- package/dist/editor/public/cursor.js.map +1 -0
- package/dist/editor/public/eraser.d.ts +55 -0
- package/dist/editor/public/eraser.d.ts.map +1 -0
- package/dist/editor/public/eraser.js +65 -0
- package/dist/editor/public/eraser.js.map +1 -0
- package/dist/editor/public/frame-name.d.ts +20 -0
- package/dist/editor/public/frame-name.d.ts.map +1 -0
- package/dist/editor/public/frame-name.js +54 -0
- package/dist/editor/public/frame-name.js.map +1 -0
- package/dist/editor/public/image-insert.d.ts +1 -1
- package/dist/editor/public/image-insert.d.ts.map +1 -1
- package/dist/editor/public/laser.d.ts +38 -0
- package/dist/editor/public/laser.d.ts.map +1 -0
- package/dist/editor/public/laser.js +42 -0
- package/dist/editor/public/laser.js.map +1 -0
- package/dist/editor/public/layers.d.ts.map +1 -1
- package/dist/editor/public/layers.js +2 -2
- package/dist/editor/public/layers.js.map +1 -1
- package/dist/editor/public/link.d.ts +11 -2
- package/dist/editor/public/link.d.ts.map +1 -1
- package/dist/editor/public/link.js +70 -2
- package/dist/editor/public/link.js.map +1 -1
- package/dist/editor/public/placement.d.ts +60 -2
- package/dist/editor/public/placement.d.ts.map +1 -1
- package/dist/editor/public/placement.js +193 -2
- package/dist/editor/public/placement.js.map +1 -1
- package/dist/editor/public/selection-ops.d.ts +35 -1
- package/dist/editor/public/selection-ops.d.ts.map +1 -1
- package/dist/editor/public/selection-ops.js +97 -2
- package/dist/editor/public/selection-ops.js.map +1 -1
- package/dist/editor/public/stroke-eraser-coverage.d.ts +37 -0
- package/dist/editor/public/stroke-eraser-coverage.d.ts.map +1 -0
- package/dist/editor/public/stroke-eraser-coverage.js +168 -0
- package/dist/editor/public/stroke-eraser-coverage.js.map +1 -0
- package/dist/editor/public/stroke-eraser.d.ts +50 -0
- package/dist/editor/public/stroke-eraser.d.ts.map +1 -0
- package/dist/editor/public/stroke-eraser.js +176 -0
- package/dist/editor/public/stroke-eraser.js.map +1 -0
- package/dist/editor/public/stroke-smoothing.d.ts +21 -0
- package/dist/editor/public/stroke-smoothing.d.ts.map +1 -0
- package/dist/editor/public/stroke-smoothing.js +37 -0
- package/dist/editor/public/stroke-smoothing.js.map +1 -0
- package/dist/editor/public/text-edit.d.ts +1 -10
- package/dist/editor/public/text-edit.d.ts.map +1 -1
- package/dist/editor/public/text-edit.js +2 -16
- package/dist/editor/public/text-edit.js.map +1 -1
- package/dist/editor/public/tool-ops.d.ts +130 -0
- package/dist/editor/public/tool-ops.d.ts.map +1 -0
- package/dist/editor/public/tool-ops.js +392 -0
- package/dist/editor/public/tool-ops.js.map +1 -0
- package/dist/editor/public/z-order.d.ts +1 -12
- package/dist/editor/public/z-order.d.ts.map +1 -1
- package/dist/editor/public/z-order.js +5 -5
- package/dist/editor/public/z-order.js.map +1 -1
- package/dist/editor/public/zoom-pan.d.ts +15 -4
- package/dist/editor/public/zoom-pan.d.ts.map +1 -1
- package/dist/editor/public/zoom-pan.js +39 -7
- package/dist/editor/public/zoom-pan.js.map +1 -1
- package/dist/editor/render-orchestrator.d.ts +177 -5
- package/dist/editor/render-orchestrator.d.ts.map +1 -1
- package/dist/editor/render-orchestrator.js +519 -358
- package/dist/editor/render-orchestrator.js.map +1 -1
- package/dist/editor/resize-helpers.d.ts +21 -5
- package/dist/editor/resize-helpers.d.ts.map +1 -1
- package/dist/editor/resize-helpers.js +59 -19
- package/dist/editor/resize-helpers.js.map +1 -1
- package/dist/editor/text-edit.d.ts +136 -0
- package/dist/editor/text-edit.d.ts.map +1 -0
- package/dist/editor/text-edit.js +328 -0
- package/dist/editor/text-edit.js.map +1 -0
- package/dist/editor/viewport-helpers.d.ts.map +1 -1
- package/dist/editor/viewport-helpers.js +3 -3
- package/dist/editor/viewport-helpers.js.map +1 -1
- package/dist/editor-events.d.ts +1 -1
- package/dist/editor-events.d.ts.map +1 -1
- package/dist/editor.d.ts +603 -346
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +1843 -1630
- package/dist/editor.js.map +1 -1
- package/dist/file-drop.d.ts.map +1 -1
- package/dist/file-drop.js +1 -2
- package/dist/file-drop.js.map +1 -1
- package/dist/frame-helpers.d.ts.map +1 -1
- package/dist/frame-helpers.js +5 -5
- package/dist/frame-helpers.js.map +1 -1
- package/dist/group-helpers.d.ts.map +1 -1
- package/dist/group-helpers.js +4 -4
- package/dist/group-helpers.js.map +1 -1
- package/dist/handle.d.ts +59 -6
- package/dist/handle.d.ts.map +1 -1
- package/dist/handle.js +99 -7
- package/dist/handle.js.map +1 -1
- package/dist/hotkeys-binding.d.ts +26 -0
- package/dist/hotkeys-binding.d.ts.map +1 -0
- package/dist/hotkeys-binding.js +35 -0
- package/dist/hotkeys-binding.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/link-selection.d.ts +3 -5
- package/dist/link-selection.d.ts.map +1 -1
- package/dist/link-selection.js +3 -12
- package/dist/link-selection.js.map +1 -1
- package/dist/machine.d.ts +27 -1
- package/dist/machine.d.ts.map +1 -1
- package/dist/machine.js +38 -0
- package/dist/machine.js.map +1 -1
- package/dist/modes.d.ts +15 -1
- package/dist/modes.d.ts.map +1 -1
- package/dist/modes.js.map +1 -1
- package/dist/overlay.d.ts +92 -6
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +582 -125
- package/dist/overlay.js.map +1 -1
- package/dist/search.d.ts +37 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +45 -0
- package/dist/search.js.map +1 -0
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +2 -10
- package/dist/selection.js.map +1 -1
- package/dist/util.d.ts +8 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +17 -0
- package/dist/util.js.map +1 -0
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-ops.js","sourceRoot":"","sources":["../../../src/editor/public/selection-ops.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selection-ops.js","sourceRoot":"","sources":["../../../src/editor/public/selection-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { BrushElement, BrushPoint } from "@oh-just-another/scene";
|
|
2
|
+
import type { Vec2 } from "@oh-just-another/types";
|
|
3
|
+
/**
|
|
4
|
+
* A covered (erased) span along a brush polyline, in ARC-LENGTH units:
|
|
5
|
+
* `[start, end]` with `start <= end`, both in `[0, total]`. Working in arc length
|
|
6
|
+
* (not vertex index) is what makes the stroke-eraser resolution-independent — a
|
|
7
|
+
* big disc grazing a sparsely-sampled stroke still removes the span it covers.
|
|
8
|
+
*/
|
|
9
|
+
export type Interval = readonly [number, number];
|
|
10
|
+
/** Arc-length parametrisation of a brush polyline (lengths in world units). */
|
|
11
|
+
export interface BrushArc {
|
|
12
|
+
readonly pts: readonly BrushPoint[];
|
|
13
|
+
readonly position: Vec2;
|
|
14
|
+
/** `cum[i]` = arc length from point 0 to point i; `cum[n-1]` = `total`. */
|
|
15
|
+
readonly cum: readonly number[];
|
|
16
|
+
readonly total: number;
|
|
17
|
+
}
|
|
18
|
+
/** Precompute the arc-length parametrisation of `brush` (O(points)). */
|
|
19
|
+
export declare const brushArc: (brush: BrushElement) => BrushArc;
|
|
20
|
+
/** Local (position-relative) brush point at arc length `L`, clamped to `[0,total]`. */
|
|
21
|
+
export declare const localPointAtArc: (arc: BrushArc, L: number) => BrushPoint;
|
|
22
|
+
/**
|
|
23
|
+
* Arc-length spans of `arc` covered by the eraser SEGMENT `a → b` at `radius` —
|
|
24
|
+
* i.e. where the brush polyline lies within `radius` of the swept disc. Samples
|
|
25
|
+
* each brush segment whose bounding box (grown by `radius`) meets the eraser
|
|
26
|
+
* segment's, at {@link ERASE_COVERAGE_SAMPLE_FRACTION} × radius spacing, and pins
|
|
27
|
+
* each span's endpoints to the ring by bisection. Returns merged intervals (may
|
|
28
|
+
* be empty). A single-point brush yields `[[0,0]]` when the point is within reach.
|
|
29
|
+
*/
|
|
30
|
+
export declare const coveredArcAgainstSegment: (arc: BrushArc, a: Vec2, b: Vec2, radius: number) => Interval[];
|
|
31
|
+
/** Merge overlapping / touching intervals into a sorted, disjoint set. */
|
|
32
|
+
export declare const mergeIntervals: (intervals: readonly Interval[]) => Interval[];
|
|
33
|
+
/** Total covered arc length across `intervals` (assumed disjoint). */
|
|
34
|
+
export declare const coveredLength: (intervals: readonly Interval[]) => number;
|
|
35
|
+
/** The KEPT arc spans: `[0, total]` minus the covered `intervals`. */
|
|
36
|
+
export declare const complementIntervals: (covered: readonly Interval[], total: number) => Interval[];
|
|
37
|
+
//# sourceMappingURL=stroke-eraser-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stroke-eraser-coverage.d.ts","sourceRoot":"","sources":["../../../src/editor/public/stroke-eraser-coverage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAOnD;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAIjD,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,SAAS,UAAU,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wEAAwE;AACxE,eAAO,MAAM,QAAQ,GAAI,OAAO,YAAY,KAAG,QAY9C,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,eAAe,GAAI,KAAK,QAAQ,EAAE,GAAG,MAAM,KAAG,UAuB1D,CAAC;AAgCF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GACnC,KAAK,QAAQ,EACb,GAAG,IAAI,EACP,GAAG,IAAI,EACP,QAAQ,MAAM,KACb,QAAQ,EAsDV,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,cAAc,GAAI,WAAW,SAAS,QAAQ,EAAE,KAAG,QAAQ,EAavE,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,aAAa,GAAI,WAAW,SAAS,QAAQ,EAAE,KAAG,MACV,CAAC;AAEtD,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,GAAI,SAAS,SAAS,QAAQ,EAAE,EAAE,OAAO,MAAM,KAAG,QAAQ,EAUzF,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { hitTest } from "@oh-just-another/math";
|
|
2
|
+
import { req } from "../../util.js";
|
|
3
|
+
import { ERASE_COVERAGE_SAMPLE_FRACTION, ERASE_COVERAGE_MIN_SAMPLE_STEP, ERASE_BOUNDARY_BISECT_ITERS, } from "../../constants.js";
|
|
4
|
+
const EPS = 1e-6;
|
|
5
|
+
/** Precompute the arc-length parametrisation of `brush` (O(points)). */
|
|
6
|
+
export const brushArc = (brush) => {
|
|
7
|
+
const pts = brush.points;
|
|
8
|
+
const n = pts.length;
|
|
9
|
+
const cum = new Array(Math.max(1, n)).fill(0);
|
|
10
|
+
let acc = 0;
|
|
11
|
+
for (let i = 1; i < n; i++) {
|
|
12
|
+
const a = req(pts[i - 1]);
|
|
13
|
+
const b = req(pts[i]);
|
|
14
|
+
acc += Math.hypot(b.x - a.x, b.y - a.y);
|
|
15
|
+
cum[i] = acc;
|
|
16
|
+
}
|
|
17
|
+
return { pts, position: brush.position, cum, total: acc };
|
|
18
|
+
};
|
|
19
|
+
/** Local (position-relative) brush point at arc length `L`, clamped to `[0,total]`. */
|
|
20
|
+
export const localPointAtArc = (arc, L) => {
|
|
21
|
+
const { pts, cum, total } = arc;
|
|
22
|
+
const n = pts.length;
|
|
23
|
+
if (n === 0)
|
|
24
|
+
return { x: 0, y: 0, width: 0 };
|
|
25
|
+
if (n === 1 || L <= 0)
|
|
26
|
+
return { ...req(pts[0]) };
|
|
27
|
+
if (L >= total)
|
|
28
|
+
return { ...req(pts[n - 1]) };
|
|
29
|
+
// Binary-search the segment [lo, lo+1] whose arc span contains L.
|
|
30
|
+
let lo = 0;
|
|
31
|
+
let hi = n - 1;
|
|
32
|
+
while (hi - lo > 1) {
|
|
33
|
+
const mid = (lo + hi) >> 1;
|
|
34
|
+
if (req(cum[mid]) <= L)
|
|
35
|
+
lo = mid;
|
|
36
|
+
else
|
|
37
|
+
hi = mid;
|
|
38
|
+
}
|
|
39
|
+
const a = req(pts[lo]);
|
|
40
|
+
const b = req(pts[lo + 1]);
|
|
41
|
+
const segLen = req(cum[lo + 1]) - req(cum[lo]);
|
|
42
|
+
const t = segLen > 0 ? (L - req(cum[lo])) / segLen : 0;
|
|
43
|
+
return {
|
|
44
|
+
x: a.x + (b.x - a.x) * t,
|
|
45
|
+
y: a.y + (b.y - a.y) * t,
|
|
46
|
+
width: a.width + (b.width - a.width) * t,
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
const worldDistSqAtArc = (arc, L, a, b) => {
|
|
50
|
+
const p = localPointAtArc(arc, L);
|
|
51
|
+
return hitTest.distanceToSegmentSq({ x: arc.position.x + p.x, y: arc.position.y + p.y }, a, b);
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Refine a covered-span endpoint by bisecting between an UNCOVERED arc position
|
|
55
|
+
* (`loL`) and a COVERED one (`hiL`) until it lands on the eraser ring (distance =
|
|
56
|
+
* radius). Returns the covered-side estimate, so the surviving fragment stops
|
|
57
|
+
* exactly at the ring rather than at the nearest sample. See
|
|
58
|
+
* {@link ERASE_BOUNDARY_BISECT_ITERS}.
|
|
59
|
+
*/
|
|
60
|
+
const bisectBoundary = (arc, loL, hiL, a, b, radiusSq) => {
|
|
61
|
+
let lo = loL;
|
|
62
|
+
let hi = hiL;
|
|
63
|
+
for (let i = 0; i < ERASE_BOUNDARY_BISECT_ITERS; i++) {
|
|
64
|
+
const mid = (lo + hi) / 2;
|
|
65
|
+
if (worldDistSqAtArc(arc, mid, a, b) <= radiusSq)
|
|
66
|
+
hi = mid;
|
|
67
|
+
else
|
|
68
|
+
lo = mid;
|
|
69
|
+
}
|
|
70
|
+
return hi;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Arc-length spans of `arc` covered by the eraser SEGMENT `a → b` at `radius` —
|
|
74
|
+
* i.e. where the brush polyline lies within `radius` of the swept disc. Samples
|
|
75
|
+
* each brush segment whose bounding box (grown by `radius`) meets the eraser
|
|
76
|
+
* segment's, at {@link ERASE_COVERAGE_SAMPLE_FRACTION} × radius spacing, and pins
|
|
77
|
+
* each span's endpoints to the ring by bisection. Returns merged intervals (may
|
|
78
|
+
* be empty). A single-point brush yields `[[0,0]]` when the point is within reach.
|
|
79
|
+
*/
|
|
80
|
+
export const coveredArcAgainstSegment = (arc, a, b, radius) => {
|
|
81
|
+
const { pts, cum, total } = arc;
|
|
82
|
+
const n = pts.length;
|
|
83
|
+
if (n === 0)
|
|
84
|
+
return [];
|
|
85
|
+
const radiusSq = radius * radius;
|
|
86
|
+
if (total === 0) {
|
|
87
|
+
const p = req(pts[0]);
|
|
88
|
+
const d = hitTest.distanceToSegmentSq({ x: arc.position.x + p.x, y: arc.position.y + p.y }, a, b);
|
|
89
|
+
return d <= radiusSq ? [[0, 0]] : [];
|
|
90
|
+
}
|
|
91
|
+
const exMinX = Math.min(a.x, b.x) - radius;
|
|
92
|
+
const exMaxX = Math.max(a.x, b.x) + radius;
|
|
93
|
+
const exMinY = Math.min(a.y, b.y) - radius;
|
|
94
|
+
const exMaxY = Math.max(a.y, b.y) + radius;
|
|
95
|
+
const px = arc.position.x;
|
|
96
|
+
const py = arc.position.y;
|
|
97
|
+
const step = Math.max(ERASE_COVERAGE_MIN_SAMPLE_STEP, radius * ERASE_COVERAGE_SAMPLE_FRACTION);
|
|
98
|
+
const raw = [];
|
|
99
|
+
for (let i = 0; i < n - 1; i++) {
|
|
100
|
+
const p0 = req(pts[i]);
|
|
101
|
+
const p1 = req(pts[i + 1]);
|
|
102
|
+
// Reject segments whose (radius-grown) bbox misses the eraser segment's.
|
|
103
|
+
if (Math.max(p0.x, p1.x) + px < exMinX ||
|
|
104
|
+
Math.min(p0.x, p1.x) + px > exMaxX ||
|
|
105
|
+
Math.max(p0.y, p1.y) + py < exMinY ||
|
|
106
|
+
Math.min(p0.y, p1.y) + py > exMaxY) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const segStart = req(cum[i]);
|
|
110
|
+
const segLen = req(cum[i + 1]) - segStart;
|
|
111
|
+
if (segLen <= 0)
|
|
112
|
+
continue;
|
|
113
|
+
const steps = Math.max(1, Math.ceil(segLen / step));
|
|
114
|
+
let runStart = -1;
|
|
115
|
+
let prevL = segStart;
|
|
116
|
+
for (let k = 0; k <= steps; k++) {
|
|
117
|
+
const L = k === steps ? segStart + segLen : segStart + (segLen * k) / steps;
|
|
118
|
+
const cov = worldDistSqAtArc(arc, L, a, b) <= radiusSq;
|
|
119
|
+
if (cov && runStart < 0) {
|
|
120
|
+
runStart = k === 0 ? L : bisectBoundary(arc, prevL, L, a, b, radiusSq);
|
|
121
|
+
}
|
|
122
|
+
else if (!cov && runStart >= 0) {
|
|
123
|
+
raw.push([runStart, bisectBoundary(arc, L, prevL, a, b, radiusSq)]);
|
|
124
|
+
runStart = -1;
|
|
125
|
+
}
|
|
126
|
+
prevL = L;
|
|
127
|
+
}
|
|
128
|
+
if (runStart >= 0)
|
|
129
|
+
raw.push([runStart, segStart + segLen]);
|
|
130
|
+
}
|
|
131
|
+
return mergeIntervals(raw);
|
|
132
|
+
};
|
|
133
|
+
/** Merge overlapping / touching intervals into a sorted, disjoint set. */
|
|
134
|
+
export const mergeIntervals = (intervals) => {
|
|
135
|
+
if (intervals.length <= 1)
|
|
136
|
+
return intervals.map((iv) => [iv[0], iv[1]]);
|
|
137
|
+
const sorted = [...intervals].sort((p, q) => p[0] - q[0]);
|
|
138
|
+
const out = [];
|
|
139
|
+
for (const [s, e] of sorted) {
|
|
140
|
+
const last = out[out.length - 1];
|
|
141
|
+
if (last && s <= last[1] + EPS) {
|
|
142
|
+
if (e > last[1])
|
|
143
|
+
last[1] = e;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
out.push([s, e]);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return out;
|
|
150
|
+
};
|
|
151
|
+
/** Total covered arc length across `intervals` (assumed disjoint). */
|
|
152
|
+
export const coveredLength = (intervals) => intervals.reduce((sum, [s, e]) => sum + (e - s), 0);
|
|
153
|
+
/** The KEPT arc spans: `[0, total]` minus the covered `intervals`. */
|
|
154
|
+
export const complementIntervals = (covered, total) => {
|
|
155
|
+
const merged = mergeIntervals(covered);
|
|
156
|
+
const kept = [];
|
|
157
|
+
let cursor = 0;
|
|
158
|
+
for (const [s, e] of merged) {
|
|
159
|
+
if (s > cursor + EPS)
|
|
160
|
+
kept.push([cursor, s]);
|
|
161
|
+
if (e > cursor)
|
|
162
|
+
cursor = e;
|
|
163
|
+
}
|
|
164
|
+
if (total > cursor + EPS)
|
|
165
|
+
kept.push([cursor, total]);
|
|
166
|
+
return kept;
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=stroke-eraser-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stroke-eraser-coverage.js","sourceRoot":"","sources":["../../../src/editor/public/stroke-eraser-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type BrushElement, type Scene, type Patch } from "@oh-just-another/scene";
|
|
2
|
+
import { type ElementId, type Vec2 } from "@oh-just-another/types";
|
|
3
|
+
import { type Interval } from "./stroke-eraser-coverage.js";
|
|
4
|
+
/**
|
|
5
|
+
* Grow a brush's accumulated covered spans by the eraser segment `a → b` (world)
|
|
6
|
+
* at `radius` and return the merged result. INCREMENTAL: the live gesture calls
|
|
7
|
+
* this once per pointer move with only the new segment, so a drag costs
|
|
8
|
+
* O(points) per move instead of re-scanning the whole path each frame. `radius`
|
|
9
|
+
* is the visible cursor ring in world units. Pure — returns a new interval list.
|
|
10
|
+
*/
|
|
11
|
+
export declare const markErasedIntervals: (brush: BrushElement, existing: readonly Interval[], a: Vec2, b: Vec2, radius: number) => Interval[];
|
|
12
|
+
/**
|
|
13
|
+
* STROKE-ERASER core (pure). Cut a single brush against an eraser path: the arc
|
|
14
|
+
* spans of the brush polyline within `radius` of the path are removed and the
|
|
15
|
+
* survivors split into fragment {@link BrushElement}s (endpoints on the ring).
|
|
16
|
+
* When nothing is covered, `erasedAny` is `false` and `fragments` is `[brush]`
|
|
17
|
+
* unchanged so the caller can skip the swap. One-shot (scans the whole path) —
|
|
18
|
+
* the live gesture uses the incremental {@link markErasedIntervals} instead.
|
|
19
|
+
*/
|
|
20
|
+
export declare const computeEraseBrushStroke: (brush: BrushElement, eraserPathWorld: readonly Vec2[], radius: number, makeId: () => ElementId) => {
|
|
21
|
+
fragments: BrushElement[];
|
|
22
|
+
erasedAny: boolean;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Commit the accumulated stroke-erase: `erased` maps each touched brush id to the
|
|
26
|
+
* covered arc-length spans built incrementally by {@link markErasedIntervals}.
|
|
27
|
+
* Each such brush is replaced with its fragments (remove original + add fragments)
|
|
28
|
+
* and any link bound to it is detached (drop the binding — don't re-bind to a
|
|
29
|
+
* fragment). Returns the next scene + patches for ONE history batch, or `null`
|
|
30
|
+
* when nothing is cut.
|
|
31
|
+
*/
|
|
32
|
+
export declare const computeEraseFromMasks: (scene: Scene, erased: ReadonlyMap<ElementId, readonly Interval[]>, makeId: () => ElementId) => {
|
|
33
|
+
readonly scene: Scene;
|
|
34
|
+
readonly patches: Patch[];
|
|
35
|
+
readonly removedIds: ElementId[];
|
|
36
|
+
readonly addedIds: ElementId[];
|
|
37
|
+
} | null;
|
|
38
|
+
/**
|
|
39
|
+
* Live-preview counterpart of {@link computeEraseFromMasks}: the cut fragments for
|
|
40
|
+
* every brush with covered spans so far, WITHOUT mutating the scene or consuming
|
|
41
|
+
* real ids. `fragments` are drawn on the overlay and `hidden` (the touched
|
|
42
|
+
* originals) suppressed in the main pass, so the user sees the cut before
|
|
43
|
+
* releasing. Fragment ids are deterministic per frame (never enter history).
|
|
44
|
+
* `null` when nothing is cut yet.
|
|
45
|
+
*/
|
|
46
|
+
export declare const computeStrokeErasePreviewFromMasks: (scene: Scene, erased: ReadonlyMap<ElementId, readonly Interval[]>) => {
|
|
47
|
+
fragments: BrushElement[];
|
|
48
|
+
hidden: Set<ElementId>;
|
|
49
|
+
} | null;
|
|
50
|
+
//# sourceMappingURL=stroke-eraser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stroke-eraser.d.ts","sourceRoot":"","sources":["../../../src/editor/public/stroke-eraser.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,YAAY,EAEjB,KAAK,KAAK,EACV,KAAK,KAAK,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,IAAI,EACV,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,6BAA6B,CAAC;AA+DrC;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,YAAY,EACnB,UAAU,SAAS,QAAQ,EAAE,EAC7B,GAAG,IAAI,EACP,GAAG,IAAI,EACP,QAAQ,MAAM,KACb,QAAQ,EAIV,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,YAAY,EACnB,iBAAiB,SAAS,IAAI,EAAE,EAChC,QAAQ,MAAM,EACd,QAAQ,MAAM,SAAS,KACtB;IAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAajD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,KAAK,EACZ,QAAQ,WAAW,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC,EACnD,QAAQ,MAAM,SAAS,KACtB;IACD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;CAChC,GAAG,IAkCH,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kCAAkC,GAC7C,OAAO,KAAK,EACZ,QAAQ,WAAW,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC,KAClD;IAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;CAAE,GAAG,IAgB1D,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { req } from "../../util.js";
|
|
2
|
+
import { addElement, removeElement, removeLink, orderBetween, isBrush, endpointElementId, } from "@oh-just-another/scene";
|
|
3
|
+
import { elementId as castElementId, } from "@oh-just-another/types";
|
|
4
|
+
import { ERASE_FRAGMENT_MIN_ARC } from "../../constants.js";
|
|
5
|
+
import { brushArc, coveredArcAgainstSegment, complementIntervals, mergeIntervals, localPointAtArc, } from "./stroke-eraser-coverage.js";
|
|
6
|
+
const EPS = 1e-6;
|
|
7
|
+
/**
|
|
8
|
+
* Rebuild a brush's surviving pieces from the COVERED arc-length spans the eraser
|
|
9
|
+
* removed. The kept spans (complement of `covered`) each become a fresh fragment
|
|
10
|
+
* {@link BrushElement}: the span endpoints — already pinned to the eraser ring by
|
|
11
|
+
* {@link coveredArcAgainstSegment}'s bisection — are the fragment's first/last
|
|
12
|
+
* points, with the original vertices strictly inside the span in between. Points
|
|
13
|
+
* are re-localised to the fragment's first world position, per-point widths kept,
|
|
14
|
+
* fractional `order`s around the original's slot, never `closed`.
|
|
15
|
+
*
|
|
16
|
+
* Cutting by ARC LENGTH (not vertex index) is what makes the eraser remove the
|
|
17
|
+
* geometry it visibly covers regardless of how densely the stroke was sampled — a
|
|
18
|
+
* big disc grazing a sparse line no longer slips between two far-apart vertices. A
|
|
19
|
+
* kept span shorter than {@link ERASE_FRAGMENT_MIN_ARC} is dropped (litter).
|
|
20
|
+
*/
|
|
21
|
+
const buildFragmentsFromCoverage = (brush, covered, makeId) => {
|
|
22
|
+
const arc = brushArc(brush);
|
|
23
|
+
if (arc.total === 0)
|
|
24
|
+
return []; // a single-point brush leaves nothing once cut
|
|
25
|
+
const kept = complementIntervals(covered, arc.total);
|
|
26
|
+
const fragments = [];
|
|
27
|
+
let prevOrder = brush.order;
|
|
28
|
+
let idx = 0;
|
|
29
|
+
for (const [L0, L1] of kept) {
|
|
30
|
+
if (L1 - L0 < ERASE_FRAGMENT_MIN_ARC)
|
|
31
|
+
continue; // drop stray nubs
|
|
32
|
+
const runPts = [localPointAtArc(arc, L0)];
|
|
33
|
+
for (let i = 0; i < arc.pts.length; i++) {
|
|
34
|
+
const c = req(arc.cum[i]);
|
|
35
|
+
if (c > L0 + EPS && c < L1 - EPS)
|
|
36
|
+
runPts.push({ ...req(arc.pts[i]) });
|
|
37
|
+
}
|
|
38
|
+
runPts.push(localPointAtArc(arc, L1));
|
|
39
|
+
if (runPts.length < 2)
|
|
40
|
+
continue;
|
|
41
|
+
const anchor = req(runPts[0]);
|
|
42
|
+
const worldFirst = { x: brush.position.x + anchor.x, y: brush.position.y + anchor.y };
|
|
43
|
+
const localPoints = runPts.map((p) => ({
|
|
44
|
+
x: p.x - anchor.x,
|
|
45
|
+
y: p.y - anchor.y,
|
|
46
|
+
width: p.width,
|
|
47
|
+
}));
|
|
48
|
+
const order = idx === 0 ? brush.order : orderBetween(prevOrder, null);
|
|
49
|
+
prevOrder = order;
|
|
50
|
+
idx++;
|
|
51
|
+
fragments.push({
|
|
52
|
+
id: makeId(),
|
|
53
|
+
layerId: brush.layerId,
|
|
54
|
+
type: "brush",
|
|
55
|
+
position: worldFirst,
|
|
56
|
+
rotation: 0,
|
|
57
|
+
scale: { x: 1, y: 1 },
|
|
58
|
+
order,
|
|
59
|
+
style: brush.style,
|
|
60
|
+
points: localPoints,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return fragments;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Grow a brush's accumulated covered spans by the eraser segment `a → b` (world)
|
|
67
|
+
* at `radius` and return the merged result. INCREMENTAL: the live gesture calls
|
|
68
|
+
* this once per pointer move with only the new segment, so a drag costs
|
|
69
|
+
* O(points) per move instead of re-scanning the whole path each frame. `radius`
|
|
70
|
+
* is the visible cursor ring in world units. Pure — returns a new interval list.
|
|
71
|
+
*/
|
|
72
|
+
export const markErasedIntervals = (brush, existing, a, b, radius) => {
|
|
73
|
+
const add = coveredArcAgainstSegment(brushArc(brush), a, b, radius);
|
|
74
|
+
if (add.length === 0)
|
|
75
|
+
return existing.length > 0 ? mergeIntervals(existing) : [];
|
|
76
|
+
return mergeIntervals([...existing, ...add]);
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* STROKE-ERASER core (pure). Cut a single brush against an eraser path: the arc
|
|
80
|
+
* spans of the brush polyline within `radius` of the path are removed and the
|
|
81
|
+
* survivors split into fragment {@link BrushElement}s (endpoints on the ring).
|
|
82
|
+
* When nothing is covered, `erasedAny` is `false` and `fragments` is `[brush]`
|
|
83
|
+
* unchanged so the caller can skip the swap. One-shot (scans the whole path) —
|
|
84
|
+
* the live gesture uses the incremental {@link markErasedIntervals} instead.
|
|
85
|
+
*/
|
|
86
|
+
export const computeEraseBrushStroke = (brush, eraserPathWorld, radius, makeId) => {
|
|
87
|
+
if (eraserPathWorld.length === 0)
|
|
88
|
+
return { fragments: [brush], erasedAny: false };
|
|
89
|
+
const arc = brushArc(brush);
|
|
90
|
+
let covered = [];
|
|
91
|
+
const segs = Math.max(1, eraserPathWorld.length - 1);
|
|
92
|
+
for (let i = 0; i < segs; i++) {
|
|
93
|
+
const a = req(eraserPathWorld[i]);
|
|
94
|
+
const b = req(eraserPathWorld[Math.min(i + 1, eraserPathWorld.length - 1)]);
|
|
95
|
+
const add = coveredArcAgainstSegment(arc, a, b, radius);
|
|
96
|
+
if (add.length > 0)
|
|
97
|
+
covered = mergeIntervals([...covered, ...add]);
|
|
98
|
+
}
|
|
99
|
+
if (covered.length === 0)
|
|
100
|
+
return { fragments: [brush], erasedAny: false };
|
|
101
|
+
return { fragments: buildFragmentsFromCoverage(brush, covered, makeId), erasedAny: true };
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Commit the accumulated stroke-erase: `erased` maps each touched brush id to the
|
|
105
|
+
* covered arc-length spans built incrementally by {@link markErasedIntervals}.
|
|
106
|
+
* Each such brush is replaced with its fragments (remove original + add fragments)
|
|
107
|
+
* and any link bound to it is detached (drop the binding — don't re-bind to a
|
|
108
|
+
* fragment). Returns the next scene + patches for ONE history batch, or `null`
|
|
109
|
+
* when nothing is cut.
|
|
110
|
+
*/
|
|
111
|
+
export const computeEraseFromMasks = (scene, erased, makeId) => {
|
|
112
|
+
let s = scene;
|
|
113
|
+
const patches = [];
|
|
114
|
+
const removedIds = [];
|
|
115
|
+
const addedIds = [];
|
|
116
|
+
const droppedLinks = new Set();
|
|
117
|
+
for (const [brushId, covered] of erased) {
|
|
118
|
+
if (covered.length === 0)
|
|
119
|
+
continue;
|
|
120
|
+
const el = scene.elements.get(brushId);
|
|
121
|
+
if (el === undefined || !isBrush(el))
|
|
122
|
+
continue;
|
|
123
|
+
const fragments = buildFragmentsFromCoverage(el, covered, makeId);
|
|
124
|
+
// Detach links bound to this brush before removing it.
|
|
125
|
+
for (const edge of [...s.links.values()]) {
|
|
126
|
+
if (droppedLinks.has(edge.id))
|
|
127
|
+
continue;
|
|
128
|
+
if (endpointElementId(edge.from) === el.id || endpointElementId(edge.to) === el.id) {
|
|
129
|
+
const r = removeLink(s, edge.id);
|
|
130
|
+
s = r.scene;
|
|
131
|
+
patches.push(r.patch);
|
|
132
|
+
droppedLinks.add(edge.id);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const removed = removeElement(s, el.id);
|
|
136
|
+
s = removed.scene;
|
|
137
|
+
patches.push(removed.patch);
|
|
138
|
+
removedIds.push(el.id);
|
|
139
|
+
for (const frag of fragments) {
|
|
140
|
+
const added = addElement(s, frag);
|
|
141
|
+
s = added.scene;
|
|
142
|
+
patches.push(added.patch);
|
|
143
|
+
addedIds.push(frag.id);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (patches.length === 0)
|
|
147
|
+
return null;
|
|
148
|
+
return { scene: s, patches, removedIds, addedIds };
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Live-preview counterpart of {@link computeEraseFromMasks}: the cut fragments for
|
|
152
|
+
* every brush with covered spans so far, WITHOUT mutating the scene or consuming
|
|
153
|
+
* real ids. `fragments` are drawn on the overlay and `hidden` (the touched
|
|
154
|
+
* originals) suppressed in the main pass, so the user sees the cut before
|
|
155
|
+
* releasing. Fragment ids are deterministic per frame (never enter history).
|
|
156
|
+
* `null` when nothing is cut yet.
|
|
157
|
+
*/
|
|
158
|
+
export const computeStrokeErasePreviewFromMasks = (scene, erased) => {
|
|
159
|
+
const fragments = [];
|
|
160
|
+
const hidden = new Set();
|
|
161
|
+
for (const [brushId, covered] of erased) {
|
|
162
|
+
if (covered.length === 0)
|
|
163
|
+
continue;
|
|
164
|
+
const el = scene.elements.get(brushId);
|
|
165
|
+
if (el === undefined || !isBrush(el))
|
|
166
|
+
continue;
|
|
167
|
+
let n = 0;
|
|
168
|
+
const parts = buildFragmentsFromCoverage(el, covered, () => castElementId(`stroke-erase-preview-${el.id}-${n++}`));
|
|
169
|
+
hidden.add(el.id);
|
|
170
|
+
fragments.push(...parts);
|
|
171
|
+
}
|
|
172
|
+
if (hidden.size === 0)
|
|
173
|
+
return null;
|
|
174
|
+
return { fragments, hidden };
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=stroke-eraser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stroke-eraser.js","sourceRoot":"","sources":["../../../src/editor/public/stroke-eraser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Vec2 } from "@oh-just-another/types";
|
|
2
|
+
/** Any point that carries at least a world position. */
|
|
3
|
+
export interface SmoothablePoint {
|
|
4
|
+
readonly x: number;
|
|
5
|
+
readonly y: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Resample a sparse polyline into a smooth, dense point list by fitting a
|
|
9
|
+
* Catmull-Rom spline through the captured points (reusing `catmullRomBeziers`
|
|
10
|
+
* from `@oh-just-another/scene` — one spline implementation for the whole repo)
|
|
11
|
+
* and sampling `perSegment` sub-points per span.
|
|
12
|
+
*
|
|
13
|
+
* Freehand input (laser trail, brush stroke) is captured sparsely — one point
|
|
14
|
+
* per pointer-move — so the raw polyline is angular. The `blend` callback
|
|
15
|
+
* rebuilds each resampled point from its span endpoints and the interpolation
|
|
16
|
+
* parameter `u`, so per-point payload beyond position (timestamp for the laser,
|
|
17
|
+
* width for the brush) is carried across smoothly. Fewer than three points
|
|
18
|
+
* can't form a curve, so they pass through unchanged.
|
|
19
|
+
*/
|
|
20
|
+
export declare const smoothStrokePoints: <P extends SmoothablePoint>(points: readonly P[], perSegment: number, blend: (a: P, b: P, pos: Vec2, u: number) => P) => P[];
|
|
21
|
+
//# sourceMappingURL=stroke-smoothing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stroke-smoothing.d.ts","sourceRoot":"","sources":["../../../src/editor/public/stroke-smoothing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAIxD,wDAAwD;AACxD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,eAAe,EAC1D,QAAQ,SAAS,CAAC,EAAE,EACpB,YAAY,MAAM,EAClB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,KAC7C,CAAC,EAkBH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { req } from "@oh-just-another/types";
|
|
2
|
+
import { bezier } from "@oh-just-another/math";
|
|
3
|
+
import { catmullRomBeziers } from "@oh-just-another/scene";
|
|
4
|
+
/**
|
|
5
|
+
* Resample a sparse polyline into a smooth, dense point list by fitting a
|
|
6
|
+
* Catmull-Rom spline through the captured points (reusing `catmullRomBeziers`
|
|
7
|
+
* from `@oh-just-another/scene` — one spline implementation for the whole repo)
|
|
8
|
+
* and sampling `perSegment` sub-points per span.
|
|
9
|
+
*
|
|
10
|
+
* Freehand input (laser trail, brush stroke) is captured sparsely — one point
|
|
11
|
+
* per pointer-move — so the raw polyline is angular. The `blend` callback
|
|
12
|
+
* rebuilds each resampled point from its span endpoints and the interpolation
|
|
13
|
+
* parameter `u`, so per-point payload beyond position (timestamp for the laser,
|
|
14
|
+
* width for the brush) is carried across smoothly. Fewer than three points
|
|
15
|
+
* can't form a curve, so they pass through unchanged.
|
|
16
|
+
*/
|
|
17
|
+
export const smoothStrokePoints = (points, perSegment, blend) => {
|
|
18
|
+
if (points.length < 3)
|
|
19
|
+
return points;
|
|
20
|
+
const segments = catmullRomBeziers(points.map((p) => ({ x: p.x, y: p.y })));
|
|
21
|
+
const first = req(points[0]);
|
|
22
|
+
const out = [first];
|
|
23
|
+
let prev = { x: first.x, y: first.y };
|
|
24
|
+
for (let i = 0; i < segments.length; i++) {
|
|
25
|
+
const seg = req(segments[i]);
|
|
26
|
+
const a = req(points[i]);
|
|
27
|
+
const b = req(points[i + 1]);
|
|
28
|
+
for (let j = 1; j <= perSegment; j++) {
|
|
29
|
+
const u = j / perSegment;
|
|
30
|
+
const p = bezier.cubicAt(prev, seg.c1, seg.c2, seg.to, u);
|
|
31
|
+
out.push(blend(a, b, p, u));
|
|
32
|
+
}
|
|
33
|
+
prev = seg.to;
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=stroke-smoothing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stroke-smoothing.js","sourceRoot":"","sources":["../../../src/editor/public/stroke-smoothing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAa,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQ3D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAAoB,EACpB,UAAkB,EAClB,KAA8C,EACzC,EAAE;IACP,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAa,CAAC;IAC5C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,IAAI,GAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;YACzB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import { type Scene
|
|
1
|
+
import { type Scene } from "@oh-just-another/scene";
|
|
2
2
|
import type { LayerId, ElementId } from "@oh-just-another/types";
|
|
3
3
|
/**
|
|
4
4
|
* Precondition check for `beginTextEdit`. Returns `true` when the
|
|
5
5
|
* shape exists, is a text shape, and lives on an unlocked layer.
|
|
6
6
|
*/
|
|
7
7
|
export declare const canBeginTextEdit: (scene: Scene, id: ElementId, isLayerLocked: (id: LayerId) => boolean) => boolean;
|
|
8
|
-
/**
|
|
9
|
-
* Compute the patch for replacing a text shape's body. Returns `null`
|
|
10
|
-
* when the shape disappeared or the text didn't actually change (the
|
|
11
|
-
* caller still clears `_editingTextElement` and notifies on null).
|
|
12
|
-
*/
|
|
13
|
-
export declare const computeCommitTextEdit: (scene: Scene, id: ElementId, next: string) => {
|
|
14
|
-
readonly scene: Scene;
|
|
15
|
-
readonly patch: Patch;
|
|
16
|
-
} | null;
|
|
17
8
|
//# sourceMappingURL=text-edit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-edit.d.ts","sourceRoot":"","sources":["../../../src/editor/public/text-edit.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"text-edit.d.ts","sourceRoot":"","sources":["../../../src/editor/public/text-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,KAAK,EACZ,IAAI,SAAS,EACb,eAAe,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,KACtC,OAKF,CAAC"}
|