@oh-just-another/renderer-canvas 0.59.0 → 0.61.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 +108 -0
- package/README.md +10 -7
- package/dist/.tsbuildinfo +1 -1
- package/dist/canvas-target.d.ts +6 -1
- package/dist/canvas-target.d.ts.map +1 -1
- package/dist/canvas-target.js +12 -2
- package/dist/canvas-target.js.map +1 -1
- package/dist/constants.d.ts +49 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +49 -0
- package/dist/constants.js.map +1 -1
- package/dist/hi-dpi.d.ts +10 -0
- package/dist/hi-dpi.d.ts.map +1 -1
- package/dist/hi-dpi.js +12 -1
- package/dist/hi-dpi.js.map +1 -1
- package/dist/image-source.d.ts +11 -0
- package/dist/image-source.d.ts.map +1 -1
- package/dist/image-source.js +20 -0
- package/dist/image-source.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/layered-canvas.d.ts +7 -1
- package/dist/layered-canvas.d.ts.map +1 -1
- package/dist/layered-canvas.js +6 -3
- package/dist/layered-canvas.js.map +1 -1
- package/dist/layered-surface.d.ts +16 -0
- package/dist/layered-surface.d.ts.map +1 -1
- package/dist/layered-surface.js +59 -14
- package/dist/layered-surface.js.map +1 -1
- package/dist/recording-target.d.ts +56 -13
- package/dist/recording-target.d.ts.map +1 -1
- package/dist/recording-target.js +229 -38
- package/dist/recording-target.js.map +1 -1
- package/dist/render-worker.js +19 -7
- package/dist/render-worker.js.map +1 -1
- package/dist/replay-codec.d.ts +56 -0
- package/dist/replay-codec.d.ts.map +1 -0
- package/dist/replay-codec.js +543 -0
- package/dist/replay-codec.js.map +1 -0
- package/dist/tile-compositor.d.ts +52 -1
- package/dist/tile-compositor.d.ts.map +1 -1
- package/dist/tile-compositor.js +82 -5
- package/dist/tile-compositor.js.map +1 -1
- package/dist/webgl2-curve.d.ts +12 -2
- package/dist/webgl2-curve.d.ts.map +1 -1
- package/dist/webgl2-curve.js +168 -40
- package/dist/webgl2-curve.js.map +1 -1
- package/dist/webgl2-ellipse.d.ts +1 -29
- package/dist/webgl2-ellipse.d.ts.map +1 -1
- package/dist/webgl2-ellipse.js +35 -22
- package/dist/webgl2-ellipse.js.map +1 -1
- package/dist/webgl2-msdf-text.d.ts +15 -2
- package/dist/webgl2-msdf-text.d.ts.map +1 -1
- package/dist/webgl2-msdf-text.js +101 -9
- package/dist/webgl2-msdf-text.js.map +1 -1
- package/dist/webgl2-rect-batch.d.ts +81 -0
- package/dist/webgl2-rect-batch.d.ts.map +1 -0
- package/dist/webgl2-rect-batch.js +201 -0
- package/dist/webgl2-rect-batch.js.map +1 -0
- package/dist/webgl2-stroke.d.ts +14 -35
- package/dist/webgl2-stroke.d.ts.map +1 -1
- package/dist/webgl2-stroke.js +27 -30
- package/dist/webgl2-stroke.js.map +1 -1
- package/dist/webgl2-target.d.ts +95 -13
- package/dist/webgl2-target.d.ts.map +1 -1
- package/dist/webgl2-target.js +423 -230
- package/dist/webgl2-target.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-codec.js","sourceRoot":"","sources":["../src/replay-codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type TileCache } from "@oh-just-another/renderer-core";
|
|
2
2
|
import type { Bounds, ElementId } from "@oh-just-another/types";
|
|
3
|
-
import { type Scene } from "@oh-just-another/scene";
|
|
3
|
+
import { type SpatialGrid, type Scene, type Element } from "@oh-just-another/scene";
|
|
4
4
|
import type { Canvas2DTarget } from "./canvas-target.js";
|
|
5
5
|
/**
|
|
6
6
|
* Main-thread Canvas2D tile compositor.
|
|
@@ -39,6 +39,57 @@ export interface RenderViaTilesOptions {
|
|
|
39
39
|
readonly changedElements?: ReadonlyMap<ElementId, ChangedElementRecord>;
|
|
40
40
|
/** Current zoom (used to pick the cache bucket). */
|
|
41
41
|
readonly zoomBucket: number;
|
|
42
|
+
/**
|
|
43
|
+
* Optional spatial index over the scene's current element world-AABBs,
|
|
44
|
+
* keyed by element id. When supplied, per-tile element selection queries
|
|
45
|
+
* the index (`query(tileBounds)`) instead of scanning every shape in
|
|
46
|
+
* every layer — O(shapes + Σtiles·candidates) vs O(tiles×shapes). The
|
|
47
|
+
* index must hold the same bounds `getElementWorldBounds` returns for the
|
|
48
|
+
* current frame (a stale index rasterises wrong tiles). Omit it to fall
|
|
49
|
+
* back to the full scan, which is always correct — callers without a
|
|
50
|
+
* persistent index pay nothing and behave exactly as before.
|
|
51
|
+
*/
|
|
52
|
+
readonly index?: SpatialGrid;
|
|
53
|
+
/**
|
|
54
|
+
* Elements to omit from tile rasterisation (e.g. the stroke-eraser preview
|
|
55
|
+
* hides touched originals while their fragments draw on the overlay). Tiles
|
|
56
|
+
* are baked WITH the set applied; when the set changes between frames the
|
|
57
|
+
* compositor invalidates every tile the entering/leaving elements touch, so
|
|
58
|
+
* the cache never shows a stale hidden/unhidden shape. Keep the set small —
|
|
59
|
+
* each membership change re-rasterises the affected tiles.
|
|
60
|
+
*/
|
|
61
|
+
readonly hideElements?: ReadonlySet<ElementId>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Precomputed draw-order lookup used by the indexed tile-query path.
|
|
65
|
+
*
|
|
66
|
+
* The spatial index returns candidate ids in arbitrary order, but tiles
|
|
67
|
+
* must rasterise shapes in global z-order (layer order, then in-layer
|
|
68
|
+
* order) or overlapping fills composite wrong. Building this once per
|
|
69
|
+
* frame — a single O(shapes) walk over the ordered layers — lets each
|
|
70
|
+
* tile map its (few) candidate ids back to elements and re-sort them by
|
|
71
|
+
* draw order without re-walking the whole scene per tile.
|
|
72
|
+
*/
|
|
73
|
+
interface DrawOrderIndex {
|
|
74
|
+
/** Element id → element reference (visible layers only). */
|
|
75
|
+
readonly byId: ReadonlyMap<ElementId, Element>;
|
|
76
|
+
/** Element id → global draw-order rank (ascending = drawn first). */
|
|
77
|
+
readonly order: ReadonlyMap<ElementId, number>;
|
|
42
78
|
}
|
|
79
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
80
|
+
export declare const buildDrawOrderIndex: (scene: Scene) => DrawOrderIndex;
|
|
43
81
|
export declare const renderViaTiles: (scene: Scene, mainTarget: Canvas2DTarget, options: RenderViaTilesOptions) => void;
|
|
82
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
83
|
+
export declare const elementsIntersectingTile: (scene: Scene, tileBounds: Bounds) => readonly Element[];
|
|
84
|
+
/**
|
|
85
|
+
* Index-backed equivalent of {@link elementsIntersectingTile}. Queries the
|
|
86
|
+
* spatial index for candidate ids overlapping the tile, filters them
|
|
87
|
+
* against the precise world-AABB (same predicate the full scan uses), then
|
|
88
|
+
* restores global draw order via `drawOrder.order`. Returns the identical
|
|
89
|
+
* set and ordering as the full scan for a correctly-populated index — only
|
|
90
|
+
* the work is O(candidates) instead of O(shapes).
|
|
91
|
+
*/
|
|
92
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
93
|
+
export declare const elementsIntersectingTileIndexed: (index: SpatialGrid, drawOrder: DrawOrderIndex, tileBounds: Bounds) => readonly Element[];
|
|
94
|
+
export {};
|
|
44
95
|
//# sourceMappingURL=tile-compositor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-compositor.d.ts","sourceRoot":"","sources":["../src/tile-compositor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAIL,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"tile-compositor.d.ts","sourceRoot":"","sources":["../src/tile-compositor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,oBAAoB;IACnC,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3C;;;;;;;;OAQG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACxE,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CAChD;AAiBD;;;;;;;;;GASG;AACH,UAAU,cAAc;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;CAChD;AAED,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,GAAI,OAAO,KAAK,KAAG,cAYlD,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,KAAK,EACZ,YAAY,cAAc,EAC1B,SAAS,qBAAqB,KAC7B,IAgEF,CAAC;AAmEF,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,GAAI,OAAO,KAAK,EAAE,YAAY,MAAM,KAAG,SAAS,OAAO,EAU3F,CAAC;AAEF;;;;;;;GAOG;AACH,sEAAsE;AACtE,eAAO,MAAM,+BAA+B,GAC1C,OAAO,WAAW,EAClB,WAAW,cAAc,EACzB,YAAY,MAAM,KACjB,SAAS,OAAO,EAUlB,CAAC"}
|
package/dist/tile-compositor.js
CHANGED
|
@@ -2,8 +2,59 @@ import { TILE_SIZE, } from "@oh-just-another/renderer-core";
|
|
|
2
2
|
import { getElementsInLayer, getElementWorldBounds, getLayersInOrder, } from "@oh-just-another/scene";
|
|
3
3
|
import { createOffscreenCanvas2DTarget } from "./offscreen.js";
|
|
4
4
|
import { getElementRenderer } from "@oh-just-another/renderer-core";
|
|
5
|
+
/**
|
|
6
|
+
* Last hide-set a given cache was baked with — keyed by the cache instance so
|
|
7
|
+
* the stateless `renderViaTiles` can detect set changes across frames without
|
|
8
|
+
* growing its public API. WeakMap: dropping the cache drops the record.
|
|
9
|
+
*/
|
|
10
|
+
const lastHideByCache = new WeakMap();
|
|
11
|
+
const EMPTY_HIDE = new Set();
|
|
12
|
+
const setsEqual = (a, b) => {
|
|
13
|
+
if (a.size !== b.size)
|
|
14
|
+
return false;
|
|
15
|
+
for (const id of a)
|
|
16
|
+
if (!b.has(id))
|
|
17
|
+
return false;
|
|
18
|
+
return true;
|
|
19
|
+
};
|
|
20
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
21
|
+
export const buildDrawOrderIndex = (scene) => {
|
|
22
|
+
const byId = new Map();
|
|
23
|
+
const order = new Map();
|
|
24
|
+
let rank = 0;
|
|
25
|
+
for (const layer of getLayersInOrder(scene)) {
|
|
26
|
+
if (!layer.visible)
|
|
27
|
+
continue;
|
|
28
|
+
for (const shape of getElementsInLayer(scene, layer.id)) {
|
|
29
|
+
byId.set(shape.id, shape);
|
|
30
|
+
order.set(shape.id, rank++);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { byId, order };
|
|
34
|
+
};
|
|
5
35
|
export const renderViaTiles = (scene, mainTarget, options) => {
|
|
6
|
-
const { viewport, cache, changedElements, zoomBucket } = options;
|
|
36
|
+
const { viewport, cache, changedElements, zoomBucket, index } = options;
|
|
37
|
+
const hide = options.hideElements && options.hideElements.size > 0 ? options.hideElements : EMPTY_HIDE;
|
|
38
|
+
// Build the draw-order lookup once per frame when an index is supplied;
|
|
39
|
+
// each fresh tile reuses it instead of re-walking the scene.
|
|
40
|
+
const drawOrder = index ? buildDrawOrderIndex(scene) : null;
|
|
41
|
+
// 0) Hide-set diff: tiles are baked with `hideElements` applied, so any
|
|
42
|
+
// element entering or leaving the set makes the tiles it touches stale.
|
|
43
|
+
// Invalidate by the element's current world bbox (a removed element's
|
|
44
|
+
// tiles are already handled by `changedElements`).
|
|
45
|
+
const lastHide = lastHideByCache.get(cache) ?? EMPTY_HIDE;
|
|
46
|
+
if (!setsEqual(hide, lastHide)) {
|
|
47
|
+
const affected = new Set([...hide, ...lastHide]);
|
|
48
|
+
for (const id of affected) {
|
|
49
|
+
if (hide.has(id) && lastHide.has(id))
|
|
50
|
+
continue; // still hidden — tiles stay valid
|
|
51
|
+
const el = scene.elements.get(id);
|
|
52
|
+
if (!el)
|
|
53
|
+
continue;
|
|
54
|
+
cache.invalidateRect(getElementWorldBounds(el));
|
|
55
|
+
}
|
|
56
|
+
lastHideByCache.set(cache, new Set(hide));
|
|
57
|
+
}
|
|
7
58
|
// 1) Invalidate cached tiles per patch (covers add / remove / move).
|
|
8
59
|
if (changedElements) {
|
|
9
60
|
for (const [id, record] of changedElements) {
|
|
@@ -25,7 +76,7 @@ export const renderViaTiles = (scene, mainTarget, options) => {
|
|
|
25
76
|
const key = { col, row, zoom: zoomBucket };
|
|
26
77
|
let entry = cache.get(key);
|
|
27
78
|
if (!entry) {
|
|
28
|
-
const fresh = rasteriseTile(scene, col, row, zoomBucket);
|
|
79
|
+
const fresh = rasteriseTile(scene, col, row, zoomBucket, index, drawOrder, hide);
|
|
29
80
|
if (!fresh)
|
|
30
81
|
continue;
|
|
31
82
|
cache.set(fresh);
|
|
@@ -42,7 +93,7 @@ export const renderViaTiles = (scene, mainTarget, options) => {
|
|
|
42
93
|
* sized at `TILE_SIZE * zoomBucket` device pixels per side. Returns
|
|
43
94
|
* `null` when the tile contains no shapes.
|
|
44
95
|
*/
|
|
45
|
-
const rasteriseTile = (scene, col, row, zoomBucket) => {
|
|
96
|
+
const rasteriseTile = (scene, col, row, zoomBucket, index, drawOrder, hide) => {
|
|
46
97
|
if (typeof OffscreenCanvas === "undefined")
|
|
47
98
|
return null;
|
|
48
99
|
const worldX = col * TILE_SIZE;
|
|
@@ -53,7 +104,10 @@ const rasteriseTile = (scene, col, row, zoomBucket) => {
|
|
|
53
104
|
width: TILE_SIZE,
|
|
54
105
|
height: TILE_SIZE,
|
|
55
106
|
};
|
|
56
|
-
const
|
|
107
|
+
const visible = index && drawOrder
|
|
108
|
+
? elementsIntersectingTileIndexed(index, drawOrder, worldBounds)
|
|
109
|
+
: elementsIntersectingTile(scene, worldBounds);
|
|
110
|
+
const shapes = hide.size > 0 ? visible.filter((sh) => !hide.has(sh.id)) : visible;
|
|
57
111
|
if (shapes.length === 0)
|
|
58
112
|
return null;
|
|
59
113
|
// Bitmap size — `TILE_SIZE * zoomBucket` device pixels so the tile
|
|
@@ -90,7 +144,8 @@ const rasteriseTile = (scene, col, row, zoomBucket) => {
|
|
|
90
144
|
elements: shapes.map((s) => s.id),
|
|
91
145
|
};
|
|
92
146
|
};
|
|
93
|
-
|
|
147
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
148
|
+
export const elementsIntersectingTile = (scene, tileBounds) => {
|
|
94
149
|
const out = [];
|
|
95
150
|
for (const layer of getLayersInOrder(scene)) {
|
|
96
151
|
if (!layer.visible)
|
|
@@ -103,5 +158,27 @@ const elementsIntersectingTile = (scene, tileBounds) => {
|
|
|
103
158
|
}
|
|
104
159
|
return out;
|
|
105
160
|
};
|
|
161
|
+
/**
|
|
162
|
+
* Index-backed equivalent of {@link elementsIntersectingTile}. Queries the
|
|
163
|
+
* spatial index for candidate ids overlapping the tile, filters them
|
|
164
|
+
* against the precise world-AABB (same predicate the full scan uses), then
|
|
165
|
+
* restores global draw order via `drawOrder.order`. Returns the identical
|
|
166
|
+
* set and ordering as the full scan for a correctly-populated index — only
|
|
167
|
+
* the work is O(candidates) instead of O(shapes).
|
|
168
|
+
*/
|
|
169
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
170
|
+
export const elementsIntersectingTileIndexed = (index, drawOrder, tileBounds) => {
|
|
171
|
+
const hits = [];
|
|
172
|
+
for (const id of index.query(tileBounds)) {
|
|
173
|
+
const shape = drawOrder.byId.get(id);
|
|
174
|
+
if (!shape)
|
|
175
|
+
continue; // hidden layer or not in the current scene
|
|
176
|
+
if (!intersects(getElementWorldBounds(shape), tileBounds))
|
|
177
|
+
continue;
|
|
178
|
+
hits.push({ shape, order: drawOrder.order.get(id) ?? 0 });
|
|
179
|
+
}
|
|
180
|
+
hits.sort((a, b) => a.order - b.order);
|
|
181
|
+
return hits.map((h) => h.shape);
|
|
182
|
+
};
|
|
106
183
|
const intersects = (a, b) => a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;
|
|
107
184
|
//# sourceMappingURL=tile-compositor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-compositor.js","sourceRoot":"","sources":["../src/tile-compositor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAIV,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"tile-compositor.js","sourceRoot":"","sources":["../src/tile-compositor.ts"],"names":[],"mappings":"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"}
|
package/dist/webgl2-curve.d.ts
CHANGED
|
@@ -26,11 +26,10 @@ export declare class LoopBlinnCurvePipeline {
|
|
|
26
26
|
private readonly program;
|
|
27
27
|
private readonly vbo;
|
|
28
28
|
private readonly uvBuf;
|
|
29
|
+
private readonly vao;
|
|
29
30
|
private readonly uTransform;
|
|
30
31
|
private readonly uColor;
|
|
31
32
|
private readonly uOpacity;
|
|
32
|
-
private readonly aPos;
|
|
33
|
-
private readonly aUVW;
|
|
34
33
|
constructor(gl: WebGL2RenderingContext);
|
|
35
34
|
/**
|
|
36
35
|
* Triangulate every segment in `curves`, batch the triangles into one
|
|
@@ -43,4 +42,15 @@ export declare class LoopBlinnCurvePipeline {
|
|
|
43
42
|
}): void;
|
|
44
43
|
dispose(): void;
|
|
45
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Cached triangulation lookup. Returns per-entry packed buffers —
|
|
47
|
+
* valid until the entry is evicted, which can't happen before the
|
|
48
|
+
* caller's synchronous `bufferData` upload.
|
|
49
|
+
*
|
|
50
|
+
* Exported for tests only — not part of the package's public API.
|
|
51
|
+
*/
|
|
52
|
+
export declare const triangulateCached: (curves: readonly CurveSegment[]) => {
|
|
53
|
+
positions: Float32Array;
|
|
54
|
+
uvs: Float32Array;
|
|
55
|
+
};
|
|
46
56
|
//# sourceMappingURL=webgl2-curve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl2-curve.d.ts","sourceRoot":"","sources":["../src/webgl2-curve.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"webgl2-curve.d.ts","sourceRoot":"","sources":["../src/webgl2-curve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;CACnC;AAED,qBAAa,sBAAsB;IASrB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAR/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;gBAE1B,EAAE,EAAE,sBAAsB;IA0BvD;;;;OAIG;IACH,IAAI,CACF,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACxC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAC7C,IAAI;IAwBP,OAAO,IAAI,IAAI;CAMhB;AAyID;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,SAAS,YAAY,EAAE,KAC9B;IAAE,SAAS,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAoB9C,CAAC"}
|
package/dist/webgl2-curve.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CurveTriangleBatch } from "@oh-just-another/curve-mesh";
|
|
2
|
+
import { WEBGL2_CURVE_TRIANGULATION_CACHE_CAP } from "./constants.js";
|
|
2
3
|
import { compileShader, glReq, linkProgram } from "./webgl-helpers.js";
|
|
3
4
|
export class LoopBlinnCurvePipeline {
|
|
4
5
|
gl;
|
|
5
6
|
program;
|
|
6
7
|
vbo;
|
|
7
8
|
uvBuf;
|
|
9
|
+
vao;
|
|
8
10
|
uTransform;
|
|
9
11
|
uColor;
|
|
10
12
|
uOpacity;
|
|
11
|
-
aPos;
|
|
12
|
-
aUVW;
|
|
13
13
|
constructor(gl) {
|
|
14
14
|
this.gl = gl;
|
|
15
15
|
const vert = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SRC, "Loop-Blinn");
|
|
@@ -17,11 +17,24 @@ export class LoopBlinnCurvePipeline {
|
|
|
17
17
|
this.program = linkProgram(gl, vert, frag, "Loop-Blinn");
|
|
18
18
|
this.vbo = glReq(gl.createBuffer());
|
|
19
19
|
this.uvBuf = glReq(gl.createBuffer());
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
const aPos = gl.getAttribLocation(this.program, "aPos");
|
|
21
|
+
const aUVW = gl.getAttribLocation(this.program, "aUVW");
|
|
22
22
|
this.uTransform = gl.getUniformLocation(this.program, "uTransform");
|
|
23
23
|
this.uColor = gl.getUniformLocation(this.program, "uColor");
|
|
24
24
|
this.uOpacity = gl.getUniformLocation(this.program, "uOpacity");
|
|
25
|
+
// Record the two-stream layout (positions VBO + uvw VBO, both
|
|
26
|
+
// persistent) into a VAO once — per draw the pipeline binds the VAO
|
|
27
|
+
// and re-uploads with `bufferData`, which targets the ARRAY_BUFFER
|
|
28
|
+
// binding point, not the VAO, so the recorded pointers stay valid.
|
|
29
|
+
this.vao = glReq(gl.createVertexArray());
|
|
30
|
+
gl.bindVertexArray(this.vao);
|
|
31
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
|
|
32
|
+
gl.enableVertexAttribArray(aPos);
|
|
33
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);
|
|
34
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuf);
|
|
35
|
+
gl.enableVertexAttribArray(aUVW);
|
|
36
|
+
gl.vertexAttribPointer(aUVW, 3, gl.FLOAT, false, 0, 0);
|
|
37
|
+
gl.bindVertexArray(null);
|
|
25
38
|
}
|
|
26
39
|
/**
|
|
27
40
|
* Triangulate every segment in `curves`, batch the triangles into one
|
|
@@ -31,62 +44,177 @@ export class LoopBlinnCurvePipeline {
|
|
|
31
44
|
draw(curves, color, opacity, transform, surfaceSize) {
|
|
32
45
|
if (curves.length === 0 || opacity <= 0)
|
|
33
46
|
return;
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
if (seg.kind === "q") {
|
|
37
|
-
const [p0, p1, p2] = seg.points;
|
|
38
|
-
if (!p0 || !p1 || !p2)
|
|
39
|
-
continue;
|
|
40
|
-
const tri = quadraticToTriangle(p0, p1, p2);
|
|
41
|
-
if (tri)
|
|
42
|
-
triangles.push(tri);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
const [p0, p1, p2, p3] = seg.points;
|
|
46
|
-
if (!p0 || !p1 || !p2 || !p3)
|
|
47
|
-
continue;
|
|
48
|
-
for (const tri of cubicToTriangles(p0, p1, p2, p3))
|
|
49
|
-
triangles.push(tri);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
if (triangles.length === 0)
|
|
47
|
+
const { positions, uvs } = triangulateCached(curves);
|
|
48
|
+
if (positions.length === 0)
|
|
53
49
|
return;
|
|
54
|
-
const { positions, uvs } = packCurveTriangles(triangles);
|
|
55
50
|
const gl = this.gl;
|
|
56
51
|
gl.useProgram(this.program);
|
|
52
|
+
gl.bindVertexArray(this.vao);
|
|
57
53
|
gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
|
|
58
54
|
gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);
|
|
59
|
-
gl.enableVertexAttribArray(this.aPos);
|
|
60
|
-
gl.vertexAttribPointer(this.aPos, 2, gl.FLOAT, false, 0, 0);
|
|
61
55
|
gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuf);
|
|
62
56
|
gl.bufferData(gl.ARRAY_BUFFER, uvs, gl.DYNAMIC_DRAW);
|
|
63
|
-
gl.enableVertexAttribArray(this.aUVW);
|
|
64
|
-
gl.vertexAttribPointer(this.aUVW, 3, gl.FLOAT, false, 0, 0);
|
|
65
57
|
gl.uniformMatrix3fv(this.uTransform, false, affineToClipMat3(transform, surfaceSize.width, surfaceSize.height));
|
|
66
58
|
gl.uniform3f(this.uColor, color[0], color[1], color[2]);
|
|
67
59
|
gl.uniform1f(this.uOpacity, opacity);
|
|
68
60
|
gl.drawArrays(gl.TRIANGLES, 0, positions.length / 2);
|
|
61
|
+
// Reset to the default VAO so this pipeline's attribute state can't
|
|
62
|
+
// leak into other pipelines (matches the rect-batch discipline).
|
|
63
|
+
gl.bindVertexArray(null);
|
|
69
64
|
}
|
|
70
65
|
dispose() {
|
|
66
|
+
this.gl.deleteVertexArray(this.vao);
|
|
71
67
|
this.gl.deleteBuffer(this.vbo);
|
|
72
68
|
this.gl.deleteBuffer(this.uvBuf);
|
|
73
69
|
this.gl.deleteProgram(this.program);
|
|
74
70
|
}
|
|
75
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Module-level scratch for `affineToClipMat3` — same reuse pattern as
|
|
74
|
+
* the earcut / stroke / `applyMat` scratch buffers in webgl2-target.
|
|
75
|
+
* Consumed synchronously by `uniformMatrix3fv` (which copies the values
|
|
76
|
+
* into GL state), so one shared buffer avoids a Float32Array allocation
|
|
77
|
+
* per curve draw.
|
|
78
|
+
*/
|
|
79
|
+
const scratchClipMat3 = new Float32Array(9);
|
|
76
80
|
const affineToClipMat3 = (t, w, h) => {
|
|
77
81
|
const sx = 2 / w;
|
|
78
82
|
const sy = -2 / h;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
scratchClipMat3[0] = t.a * sx;
|
|
84
|
+
scratchClipMat3[1] = t.b * sy;
|
|
85
|
+
scratchClipMat3[2] = 0;
|
|
86
|
+
scratchClipMat3[3] = t.c * sx;
|
|
87
|
+
scratchClipMat3[4] = t.d * sy;
|
|
88
|
+
scratchClipMat3[5] = 0;
|
|
89
|
+
scratchClipMat3[6] = t.e * sx - 1;
|
|
90
|
+
scratchClipMat3[7] = t.f * sy + 1;
|
|
91
|
+
scratchClipMat3[8] = 1;
|
|
92
|
+
return scratchClipMat3;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Content-keyed LRU cache of Loop-Blinn triangulations, shared by all
|
|
96
|
+
* `LoopBlinnCurvePipeline` instances (the data is GL-independent).
|
|
97
|
+
*
|
|
98
|
+
* Renderers emit paths in element-local coordinates and `draw()` gets
|
|
99
|
+
* the view transform separately (applied in the vertex shader), so:
|
|
100
|
+
* - identical geometry (every same-size rounded rect) shares one entry;
|
|
101
|
+
* - pan / zoom / drag never invalidate an entry;
|
|
102
|
+
* - no scale bucket is needed — triangulation is scale-independent
|
|
103
|
+
* (fixed cubic subdivision count, no screen-space adaptivity).
|
|
104
|
+
*
|
|
105
|
+
* The `curves` array is rebuilt by `WebGL2Target` on every
|
|
106
|
+
* `beginPath()`, so there is no stable object identity to key a WeakMap
|
|
107
|
+
* on; instead the key is the flat list of segment kinds +
|
|
108
|
+
* control-point coordinates, addressed by a 32-bit FNV-1a hash with a
|
|
109
|
+
* full float comparison on hit (hash collisions fall back to
|
|
110
|
+
* recompute + replace). `Map` insertion order gives LRU: hits re-insert
|
|
111
|
+
* at the tail, overflow evicts the head.
|
|
112
|
+
*/
|
|
113
|
+
const curveMeshCache = new Map();
|
|
114
|
+
/** Scratch for building the flat key without per-draw allocation. */
|
|
115
|
+
let scratchKey = new Float64Array(64);
|
|
116
|
+
const ensureKeyCapacity = (n) => {
|
|
117
|
+
if (scratchKey.length >= n)
|
|
118
|
+
return;
|
|
119
|
+
let cap = scratchKey.length;
|
|
120
|
+
while (cap < n)
|
|
121
|
+
cap *= 2;
|
|
122
|
+
scratchKey = new Float64Array(cap);
|
|
123
|
+
};
|
|
124
|
+
/** Views over one float64 for hashing its bit pattern. */
|
|
125
|
+
const hashFloatBuf = new Float64Array(1);
|
|
126
|
+
const hashFloatBits = new Uint32Array(hashFloatBuf.buffer);
|
|
127
|
+
/** Shared zero-allocation triangulation sink (see `CurveTriangleBatch`). */
|
|
128
|
+
const sharedBatch = new CurveTriangleBatch();
|
|
129
|
+
/**
|
|
130
|
+
* Flatten `curves` into `scratchKey` (kind marker + control points per
|
|
131
|
+
* segment) and return the used length.
|
|
132
|
+
*/
|
|
133
|
+
const buildKey = (curves) => {
|
|
134
|
+
// Worst case per segment: 1 kind marker + 4 points × 2 coords.
|
|
135
|
+
ensureKeyCapacity(curves.length * 9);
|
|
136
|
+
const key = scratchKey;
|
|
137
|
+
let off = 0;
|
|
138
|
+
for (const seg of curves) {
|
|
139
|
+
key[off++] = seg.kind === "q" ? 1 : 2;
|
|
140
|
+
for (const p of seg.points) {
|
|
141
|
+
key[off++] = p.x;
|
|
142
|
+
key[off++] = p.y;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return off;
|
|
146
|
+
};
|
|
147
|
+
/** FNV-1a over the bit patterns of `key[0..len)`. */
|
|
148
|
+
const hashKey = (key, len) => {
|
|
149
|
+
let h = 0x811c9dc5;
|
|
150
|
+
for (let i = 0; i < len; i++) {
|
|
151
|
+
hashFloatBuf[0] = key[i] ?? 0;
|
|
152
|
+
h = Math.imul(h ^ (hashFloatBits[0] ?? 0), 0x01000193);
|
|
153
|
+
h = Math.imul(h ^ (hashFloatBits[1] ?? 0), 0x01000193);
|
|
154
|
+
}
|
|
155
|
+
return h >>> 0;
|
|
156
|
+
};
|
|
157
|
+
const keysEqual = (a, b, len) => {
|
|
158
|
+
if (a.length !== len)
|
|
159
|
+
return false;
|
|
160
|
+
for (let i = 0; i < len; i++) {
|
|
161
|
+
if (a[i] !== b[i])
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
return true;
|
|
165
|
+
};
|
|
166
|
+
/** Triangulate `curves` through the shared batch into a fresh entry. */
|
|
167
|
+
const triangulate = (curves, keyLen) => {
|
|
168
|
+
sharedBatch.reset();
|
|
169
|
+
for (const seg of curves) {
|
|
170
|
+
if (seg.kind === "q") {
|
|
171
|
+
const [p0, p1, p2] = seg.points;
|
|
172
|
+
if (!p0 || !p1 || !p2)
|
|
173
|
+
continue;
|
|
174
|
+
sharedBatch.addQuadratic(p0, p1, p2);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
const [p0, p1, p2, p3] = seg.points;
|
|
178
|
+
if (!p0 || !p1 || !p2 || !p3)
|
|
179
|
+
continue;
|
|
180
|
+
sharedBatch.addCubic(p0, p1, p2, p3);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
key: scratchKey.slice(0, keyLen),
|
|
185
|
+
// Copy out of the shared batch — entries outlive the next batch use.
|
|
186
|
+
positions: new Float32Array(sharedBatch.positions),
|
|
187
|
+
uvs: new Float32Array(sharedBatch.uvs),
|
|
188
|
+
};
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* Cached triangulation lookup. Returns per-entry packed buffers —
|
|
192
|
+
* valid until the entry is evicted, which can't happen before the
|
|
193
|
+
* caller's synchronous `bufferData` upload.
|
|
194
|
+
*
|
|
195
|
+
* Exported for tests only — not part of the package's public API.
|
|
196
|
+
*/
|
|
197
|
+
export const triangulateCached = (curves) => {
|
|
198
|
+
const keyLen = buildKey(curves);
|
|
199
|
+
const hash = hashKey(scratchKey, keyLen);
|
|
200
|
+
const cached = curveMeshCache.get(hash);
|
|
201
|
+
if (cached && keysEqual(cached.key, scratchKey, keyLen)) {
|
|
202
|
+
// Touch — re-insert at the tail so LRU eviction picks colder entries.
|
|
203
|
+
curveMeshCache.delete(hash);
|
|
204
|
+
curveMeshCache.set(hash, cached);
|
|
205
|
+
return cached;
|
|
206
|
+
}
|
|
207
|
+
// Miss or hash collision — recompute and (re)place the slot.
|
|
208
|
+
const entry = triangulate(curves, keyLen);
|
|
209
|
+
curveMeshCache.delete(hash);
|
|
210
|
+
curveMeshCache.set(hash, entry);
|
|
211
|
+
while (curveMeshCache.size > WEBGL2_CURVE_TRIANGULATION_CACHE_CAP) {
|
|
212
|
+
const oldest = curveMeshCache.keys().next().value;
|
|
213
|
+
if (oldest === undefined)
|
|
214
|
+
break;
|
|
215
|
+
curveMeshCache.delete(oldest);
|
|
216
|
+
}
|
|
217
|
+
return entry;
|
|
90
218
|
};
|
|
91
219
|
/**
|
|
92
220
|
* Vertex shader passes through the Loop-Blinn (u, v, w) coordinates as
|
package/dist/webgl2-curve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl2-curve.js","sourceRoot":"","sources":["../src/webgl2-curve.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"webgl2-curve.js","sourceRoot":"","sources":["../src/webgl2-curve.ts"],"names":[],"mappings":"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"}
|
package/dist/webgl2-ellipse.d.ts
CHANGED
|
@@ -1,37 +1,9 @@
|
|
|
1
1
|
import type { Transform } from "@oh-just-another/types";
|
|
2
|
-
/**
|
|
3
|
-
* Fragment-shader SDF ellipse pipeline for `WebGL2Target`. Renders an
|
|
4
|
-
* ellipse as a single textured quad (4 vertices, 2 triangles)
|
|
5
|
-
* regardless of radius — the fragment shader does an inside/outside
|
|
6
|
-
* test against the unit circle in normalised local coordinates.
|
|
7
|
-
*
|
|
8
|
-
* Vertex layout (static, interleaved):
|
|
9
|
-
* aPos aLocal
|
|
10
|
-
* 0,0 -1,-1
|
|
11
|
-
* 1,0 1,-1
|
|
12
|
-
* 0,1 -1, 1
|
|
13
|
-
* 1,1 1, 1
|
|
14
|
-
*
|
|
15
|
-
* `uTransform` maps `aPos` (unit square [0,1]²) through:
|
|
16
|
-
* 1. scale to ellipse bbox (2*rx, 2*ry)
|
|
17
|
-
* 2. translate to (cx-rx, cy-ry)
|
|
18
|
-
* 3. apply caller's world→screen affine
|
|
19
|
-
* 4. pixel→clip-space (NDC)
|
|
20
|
-
*
|
|
21
|
-
* The fragment shader gets `vLocal` interpolated across the quad:
|
|
22
|
-
* inside the ellipse → dot(vLocal, vLocal) < 1
|
|
23
|
-
* on the boundary → dot(vLocal, vLocal) = 1
|
|
24
|
-
* outside → dot(vLocal, vLocal) > 1
|
|
25
|
-
*
|
|
26
|
-
* `smoothstep(1+fwidth, 1-fwidth, r²)` gives sub-pixel AA at the
|
|
27
|
-
* boundary independent of zoom.
|
|
28
|
-
*/
|
|
29
2
|
export declare class EllipsePipeline {
|
|
30
3
|
private readonly gl;
|
|
31
4
|
private readonly program;
|
|
32
5
|
private readonly vbo;
|
|
33
|
-
private readonly
|
|
34
|
-
private readonly aLocal;
|
|
6
|
+
private readonly vao;
|
|
35
7
|
private readonly uTransform;
|
|
36
8
|
private readonly uColor;
|
|
37
9
|
private readonly uOpacity;
|