@flighthq/scene2d-wgpu 0.3.0-next.906.07cea63 → 0.3.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/dist/contract.d.ts +8 -6
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +8 -6
- package/dist/contract.js.map +1 -1
- package/dist/enableWgpuColorAdjustmentGuards.js +2 -2
- package/dist/enableWgpuColorAdjustmentGuards.js.map +1 -1
- package/dist/enableWgpuStrokePathTessellation.d.ts +3 -0
- package/dist/enableWgpuStrokePathTessellation.d.ts.map +1 -0
- package/dist/enableWgpuStrokePathTessellation.js +8 -0
- package/dist/enableWgpuStrokePathTessellation.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/wgpuBitmapText.d.ts.map +1 -1
- package/dist/wgpuBitmapText.js +20 -16
- package/dist/wgpuBitmapText.js.map +1 -1
- package/dist/wgpuCache.d.ts.map +1 -1
- package/dist/wgpuCache.js +19 -16
- package/dist/wgpuCache.js.map +1 -1
- package/dist/wgpuClipContours.js +3 -3
- package/dist/wgpuClipContours.js.map +1 -1
- package/dist/wgpuClipRectangle.js +3 -3
- package/dist/wgpuClipRectangle.js.map +1 -1
- package/dist/wgpuColorAdjustmentMaterialFeature.d.ts.map +1 -1
- package/dist/wgpuColorAdjustmentMaterialFeature.js +156 -67
- package/dist/wgpuColorAdjustmentMaterialFeature.js.map +1 -1
- package/dist/wgpuMeshShapeRenderer.d.ts +4 -0
- package/dist/wgpuMeshShapeRenderer.d.ts.map +1 -0
- package/dist/wgpuMeshShapeRenderer.js +92 -0
- package/dist/wgpuMeshShapeRenderer.js.map +1 -0
- package/dist/wgpuNode2D.js +2 -2
- package/dist/wgpuNode2D.js.map +1 -1
- package/dist/wgpuParticleEmitter2D.d.ts.map +1 -1
- package/dist/wgpuParticleEmitter2D.js +26 -10
- package/dist/wgpuParticleEmitter2D.js.map +1 -1
- package/dist/wgpuQuadBatch.d.ts +1 -1
- package/dist/wgpuQuadBatch.d.ts.map +1 -1
- package/dist/wgpuQuadBatch.js +18 -13
- package/dist/wgpuQuadBatch.js.map +1 -1
- package/dist/wgpuQuadBatchWriter.d.ts +12 -0
- package/dist/wgpuQuadBatchWriter.d.ts.map +1 -0
- package/dist/{wgpuSpriteBatch.js → wgpuQuadBatchWriter.js} +97 -72
- package/dist/wgpuQuadBatchWriter.js.map +1 -0
- package/dist/wgpuRasterShapeRenderer.d.ts +4 -0
- package/dist/wgpuRasterShapeRenderer.d.ts.map +1 -0
- package/dist/wgpuRasterShapeRenderer.js +110 -0
- package/dist/wgpuRasterShapeRenderer.js.map +1 -0
- package/dist/wgpuRichText.d.ts.map +1 -1
- package/dist/wgpuRichText.js +7 -4
- package/dist/wgpuRichText.js.map +1 -1
- package/dist/wgpuScale9Shape.d.ts +1 -3
- package/dist/wgpuScale9Shape.d.ts.map +1 -1
- package/dist/wgpuScale9Shape.js +36 -33
- package/dist/wgpuScale9Shape.js.map +1 -1
- package/dist/wgpuShape.d.ts +2 -1
- package/dist/wgpuShape.d.ts.map +1 -1
- package/dist/wgpuShape.js +19 -153
- package/dist/wgpuShape.js.map +1 -1
- package/dist/wgpuShapeData.d.ts +6 -0
- package/dist/wgpuShapeData.d.ts.map +1 -0
- package/dist/wgpuShapeData.js +81 -0
- package/dist/wgpuShapeData.js.map +1 -0
- package/dist/wgpuShapeMesh.d.ts +2 -1
- package/dist/wgpuShapeMesh.d.ts.map +1 -1
- package/dist/wgpuShapeMesh.js +74 -62
- package/dist/wgpuShapeMesh.js.map +1 -1
- package/dist/wgpuShapeRasterizer.d.ts +4 -0
- package/dist/wgpuShapeRasterizer.d.ts.map +1 -0
- package/dist/wgpuShapeRasterizer.js +11 -0
- package/dist/wgpuShapeRasterizer.js.map +1 -0
- package/dist/wgpuSprite.d.ts +3 -2
- package/dist/wgpuSprite.d.ts.map +1 -1
- package/dist/wgpuSprite.js +67 -25
- package/dist/wgpuSprite.js.map +1 -1
- package/dist/wgpuStandardMaterial.d.ts +1 -1
- package/dist/wgpuStandardMaterial.js +3 -3
- package/dist/wgpuStandardMaterial.js.map +1 -1
- package/dist/wgpuTextLabel.d.ts.map +1 -1
- package/dist/wgpuTextLabel.js +15 -12
- package/dist/wgpuTextLabel.js.map +1 -1
- package/dist/wgpuTilemap.d.ts.map +1 -1
- package/dist/wgpuTilemap.js +19 -18
- package/dist/wgpuTilemap.js.map +1 -1
- package/package.json +22 -18
- package/src/enableWgpuColorAdjustmentGuards.test.ts +4 -4
- package/src/enableWgpuStrokePathTessellation.test.ts +23 -0
- package/src/wgpuBitmapText.test.ts +2 -2
- package/src/wgpuCache.test.ts +14 -11
- package/src/wgpuColorAdjustmentMaterialFeature.test.ts +52 -46
- package/src/wgpuMeshShapeRenderer.test.ts +167 -0
- package/src/wgpuParticleEmitter2D.test.ts +16 -7
- package/src/wgpuQuadBatch.test.ts +3 -3
- package/src/{wgpuSpriteBatch.test.ts → wgpuQuadBatchWriter.test.ts} +79 -70
- package/src/wgpuRasterShapeRenderer.test.ts +156 -0
- package/src/wgpuScale9Shape.test.ts +0 -13
- package/src/wgpuShape.test.ts +169 -15
- package/src/wgpuShapeData.test.ts +97 -0
- package/src/wgpuShapeMesh.test.ts +170 -15
- package/src/wgpuShapeRasterizer.test.ts +36 -0
- package/src/wgpuSprite.test.ts +45 -10
- package/src/wgpuStandardMaterial.test.ts +3 -3
- package/src/wgpuTextLabel.test.ts +7 -7
- package/src/wgpuTilemap.test.ts +4 -4
- package/src/wgpuVelocity.test.ts +3 -3
- package/dist/wgpuBitmap.d.ts +0 -4
- package/dist/wgpuBitmap.d.ts.map +0 -1
- package/dist/wgpuBitmap.js +0 -84
- package/dist/wgpuBitmap.js.map +0 -1
- package/dist/wgpuRenderTargetNode2D.d.ts +0 -11
- package/dist/wgpuRenderTargetNode2D.d.ts.map +0 -1
- package/dist/wgpuRenderTargetNode2D.js +0 -100
- package/dist/wgpuRenderTargetNode2D.js.map +0 -1
- package/dist/wgpuSpriteBatch.d.ts +0 -12
- package/dist/wgpuSpriteBatch.d.ts.map +0 -1
- package/dist/wgpuSpriteBatch.js.map +0 -1
- package/dist/wgpuSpriteRenderer.d.ts +0 -3
- package/dist/wgpuSpriteRenderer.d.ts.map +0 -1
- package/dist/wgpuSpriteRenderer.js +0 -55
- package/dist/wgpuSpriteRenderer.js.map +0 -1
- package/dist/wgpuVideo.d.ts +0 -6
- package/dist/wgpuVideo.d.ts.map +0 -1
- package/dist/wgpuVideo.js +0 -63
- package/dist/wgpuVideo.js.map +0 -1
- package/src/wgpuBitmap.test.ts +0 -40
- package/src/wgpuRenderTargetNode2D.test.ts +0 -267
- package/src/wgpuSpriteRenderer.test.ts +0 -63
- package/src/wgpuVideo.test.ts +0 -59
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { invalidateImageResource } from '@flighthq/image/contract';
|
|
2
|
+
import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node/contract';
|
|
3
|
+
import { bindWgpuImageResourceTexture, resolveWgpuMaterialRenderer } from '@flighthq/render-wgpu/contract';
|
|
4
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
5
|
+
import { BatchFormat, RenderRegistry, ShapeKind } from '@flighthq/types/contract';
|
|
6
|
+
import { ensureWgpuQuadBatchResources, packWgpuQuadBatchMaterialInstance, prepareWgpuQuadBatchWrite, recordWgpuQuadBatchColorScaleBias, } from './wgpuQuadBatchWriter';
|
|
7
|
+
import { acquireWgpuShapeRasterSurface, createWgpuShapeData, destroyWgpuShapeData, getWgpuShapeData, } from './wgpuShapeData';
|
|
8
|
+
import { getWgpuShapeRasterizer } from './wgpuShapeRasterizer';
|
|
9
|
+
// Replays the shape's whole command stream into an offscreen 2D canvas and draws the result as one
|
|
10
|
+
// textured quad. Every command in the stream is replayed, not just the ones the mesh path could not
|
|
11
|
+
// express, which is why a state that can rasterize at all needs the full canvas command vocabulary
|
|
12
|
+
// registered rather than some subset of it. Mirrors scene2d-gl/glRasterShapeRenderer.
|
|
13
|
+
export function drawWgpuRasterShape(state, renderProxy) {
|
|
14
|
+
const runtime = getWgpuRenderStateRuntime(state);
|
|
15
|
+
if (runtime.renderPass === null)
|
|
16
|
+
return;
|
|
17
|
+
const source = renderProxy.source;
|
|
18
|
+
const { commands } = source.data;
|
|
19
|
+
if (commands.length === 0 || renderProxy.rendererData === null)
|
|
20
|
+
return;
|
|
21
|
+
const rasterizer = getWgpuShapeRasterizer(state);
|
|
22
|
+
if (rasterizer === null) {
|
|
23
|
+
runtime.registryMiss?.(RenderRegistry.ShapeRasterizer, ShapeKind);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const material = renderProxy.material;
|
|
27
|
+
const materialRenderer = resolveWgpuMaterialRenderer(state, material);
|
|
28
|
+
if (materialRenderer === null)
|
|
29
|
+
return;
|
|
30
|
+
const shapeData = getWgpuShapeData(renderProxy.rendererData);
|
|
31
|
+
if (shapeData === null)
|
|
32
|
+
return;
|
|
33
|
+
const bounds = getNodeLocalBoundsRectangle(source);
|
|
34
|
+
const w = Math.ceil(bounds.width);
|
|
35
|
+
const h = Math.ceil(bounds.height);
|
|
36
|
+
if (w <= 0 || h <= 0)
|
|
37
|
+
return;
|
|
38
|
+
// Sized in device pixels with the replay pre-scaled to match, exactly as the text renderers treat
|
|
39
|
+
// their offscreen canvases. The quad stays in local units and samples the whole texture, so a denser
|
|
40
|
+
// raster is only sharper — no geometry moves with it.
|
|
41
|
+
const version = getNodeLocalContentRevision(source);
|
|
42
|
+
const pixelRatio = state.pixelRatio;
|
|
43
|
+
const surface = acquireWgpuShapeRasterSurface(shapeData);
|
|
44
|
+
if (version !== shapeData.lastContentId ||
|
|
45
|
+
w !== shapeData.lastW ||
|
|
46
|
+
h !== shapeData.lastH ||
|
|
47
|
+
pixelRatio !== shapeData.lastPixelRatio) {
|
|
48
|
+
// Reassigning either canvas dimension resets its 2D context even when the value is unchanged.
|
|
49
|
+
// Animated shapes invalidate their commands every frame, so resize only when their bounds change.
|
|
50
|
+
const pw = Math.ceil(w * pixelRatio);
|
|
51
|
+
const ph = Math.ceil(h * pixelRatio);
|
|
52
|
+
if (surface.canvas.width !== pw)
|
|
53
|
+
surface.canvas.width = pw;
|
|
54
|
+
if (surface.canvas.height !== ph)
|
|
55
|
+
surface.canvas.height = ph;
|
|
56
|
+
const ctx = surface.ctx;
|
|
57
|
+
ctx.setTransform(pixelRatio, 0, 0, pixelRatio, -bounds.x * pixelRatio, -bounds.y * pixelRatio);
|
|
58
|
+
ctx.clearRect(bounds.x, bounds.y, w, h);
|
|
59
|
+
rasterizer(ctx, commands, state);
|
|
60
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
61
|
+
// Re-read the canvas dimensions and bump the resource version so the batch's version-aware cache
|
|
62
|
+
// re-uploads (recreating the GPU texture, which covers a size change too).
|
|
63
|
+
invalidateImageResource(surface.image);
|
|
64
|
+
shapeData.lastContentId = version;
|
|
65
|
+
shapeData.lastPixelRatio = pixelRatio;
|
|
66
|
+
shapeData.lastW = w;
|
|
67
|
+
shapeData.lastH = h;
|
|
68
|
+
}
|
|
69
|
+
ensureWgpuQuadBatchResources(state);
|
|
70
|
+
const t = renderProxy.transform2D;
|
|
71
|
+
const tx = t.tx + t.a * bounds.x + t.c * bounds.y;
|
|
72
|
+
const ty = t.ty + t.b * bounds.x + t.d * bounds.y;
|
|
73
|
+
const textureEntry = bindWgpuImageResourceTexture(state, surface.image, false, true);
|
|
74
|
+
if (textureEntry === null)
|
|
75
|
+
return;
|
|
76
|
+
const startCount = runtime.quadBatchWriterCount;
|
|
77
|
+
const base = prepareWgpuQuadBatchWrite(state, textureEntry, null, renderProxy.blendMode, material, materialRenderer, 1);
|
|
78
|
+
const d = runtime.quadBatchWriterInstanceData;
|
|
79
|
+
d[base] = t.a;
|
|
80
|
+
d[base + 1] = t.b;
|
|
81
|
+
d[base + 2] = t.c;
|
|
82
|
+
d[base + 3] = t.d;
|
|
83
|
+
d[base + 4] = tx;
|
|
84
|
+
d[base + 5] = ty;
|
|
85
|
+
d[base + 6] = w;
|
|
86
|
+
d[base + 7] = h;
|
|
87
|
+
d[base + 8] = 0;
|
|
88
|
+
d[base + 9] = 0;
|
|
89
|
+
d[base + 10] = 1;
|
|
90
|
+
d[base + 11] = 1;
|
|
91
|
+
d[base + 12] = renderProxy.alpha;
|
|
92
|
+
packWgpuQuadBatchMaterialInstance(state, renderProxy.materialData, startCount);
|
|
93
|
+
recordWgpuQuadBatchColorScaleBias(state, renderProxy.colorMatrix ?? renderProxy.colorScaleBias, startCount);
|
|
94
|
+
runtime.quadBatchWriterCount++;
|
|
95
|
+
}
|
|
96
|
+
// The canvas-only shape strategy: every shape rasterizes through the registered rasterizer, and this
|
|
97
|
+
// module never references the tessellator — so registering this renderer instead of
|
|
98
|
+
// defaultWgpuShapeRenderer leaves @flighthq/path's tessellatePath and shape's region resolvers out of
|
|
99
|
+
// the bundle.
|
|
100
|
+
//
|
|
101
|
+
// Choosing it means the full canvas command vocabulary must be registered on this state, unconditionally:
|
|
102
|
+
// every shape replays its whole command stream. Pick it for exact 2D-canvas fidelity, or to avoid
|
|
103
|
+
// shipping a tessellator at all; pick defaultWgpuMeshShapeRenderer for the opposite trade.
|
|
104
|
+
export const defaultWgpuRasterShapeRenderer = {
|
|
105
|
+
format: BatchFormat.Quad,
|
|
106
|
+
createData: createWgpuShapeData,
|
|
107
|
+
destroyData: destroyWgpuShapeData,
|
|
108
|
+
submit: drawWgpuRasterShape,
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=wgpuRasterShapeRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuRasterShapeRenderer.js","sourceRoot":"","sources":["../src/wgpuRasterShapeRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAElF,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,mGAAmG;AACnG,oGAAoG;AACpG,mGAAmG;AACnG,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,KAAsB,EAAE,WAA0B;IACpF,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO;IAExC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAe,CAAC;IAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO;IAEvE,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,YAAY,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;IACtC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtE,IAAI,gBAAgB,KAAK,IAAI;QAAE,OAAO;IAEtC,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC7D,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO;IAC/B,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IAE7B,kGAAkG;IAClG,qGAAqG;IACrG,sDAAsD;IACtD,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,MAAM,OAAO,GAAG,6BAA6B,CAAC,SAAS,CAAC,CAAC;IACzD,IACE,OAAO,KAAK,SAAS,CAAC,aAAa;QACnC,CAAC,KAAK,SAAS,CAAC,KAAK;QACrB,CAAC,KAAK,SAAS,CAAC,KAAK;QACrB,UAAU,KAAK,SAAS,CAAC,cAAc,EACvC,CAAC;QACD,8FAA8F;QAC9F,kGAAkG;QAClG,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAC3D,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACxB,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QAC/F,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,iGAAiG;QACjG,2EAA2E;QAC3E,uBAAuB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC;QAClC,SAAS,CAAC,cAAc,GAAG,UAAU,CAAC;QACtC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QACpB,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAEpC,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,4BAA4B,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACrF,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAChD,MAAM,IAAI,GAAG,yBAAyB,CACpC,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,WAAW,CAAC,SAAS,EACrB,QAAQ,EACR,gBAAgB,EAChB,CAAC,CACF,CAAC;IACF,MAAM,CAAC,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAC9C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACd,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IACjC,iCAAiC,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC/E,iCAAiC,CAAC,KAAK,EAAE,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAC5G,OAAO,CAAC,oBAAoB,EAAE,CAAC;AACjC,CAAC;AAED,qGAAqG;AACrG,oFAAoF;AACpF,sGAAsG;AACtG,cAAc;AACd,EAAE;AACF,0GAA0G;AAC1G,kGAAkG;AAClG,2FAA2F;AAC3F,MAAM,CAAC,MAAM,8BAA8B,GAAoB;IAC7D,MAAM,EAAE,WAAW,CAAC,IAAI;IACxB,UAAU,EAAE,mBAAmB;IAC/B,WAAW,EAAE,oBAAoB;IACjC,MAAM,EAAE,mBAAmB;CAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuRichText.d.ts","sourceRoot":"","sources":["../src/wgpuRichText.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EAKX,eAAe,EACf,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAiBlC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,CAE7F;AAGD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAIrF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CASzF;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,aAAa,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI,
|
|
1
|
+
{"version":3,"file":"wgpuRichText.d.ts","sourceRoot":"","sources":["../src/wgpuRichText.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EAKX,eAAe,EACf,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAiBlC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,CAE7F;AAGD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAIrF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CASzF;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,aAAa,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI,CA+DN;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAE/E;AAED,eAAO,MAAM,2BAA2B,EAAE,eAIzC,CAAC"}
|
package/dist/wgpuRichText.js
CHANGED
|
@@ -4,8 +4,8 @@ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
|
4
4
|
import { computeTextFormatFontString } from '@flighthq/text/contract';
|
|
5
5
|
import { getRichTextPasswordCharacter, getRichTextRuntime } from '@flighthq/text/contract';
|
|
6
6
|
import { computeRichTextContent, computeTextBoundsHeight, computeTextBoundsOffsetX, computeTextBoundsWidth, computeTextLayout, getRichTextContent, getRichTextScrollYOffset, getTextLayoutResult, } from '@flighthq/textlayout/contract';
|
|
7
|
+
import { flushWgpuQuadBatchWriter } from './wgpuQuadBatchWriter';
|
|
7
8
|
import { createWgpuRendererData, getWgpuRendererData } from './wgpuRendererData';
|
|
8
|
-
import { flushWgpuSpriteBatch } from './wgpuSpriteBatch';
|
|
9
9
|
let _offscreenCanvas = null;
|
|
10
10
|
let _offscreenCtx = null;
|
|
11
11
|
let _webgpuTextInputOverlay = null;
|
|
@@ -32,7 +32,7 @@ export function drawWgpuRichTextWithOverlay(state, renderProxy, overlay) {
|
|
|
32
32
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
33
33
|
if (runtime.renderPass === null)
|
|
34
34
|
return;
|
|
35
|
-
|
|
35
|
+
flushWgpuQuadBatchWriter(state);
|
|
36
36
|
const source = renderProxy.source;
|
|
37
37
|
const data = source.data;
|
|
38
38
|
const richTextRuntime = getRichTextRuntime(source);
|
|
@@ -72,9 +72,12 @@ export function drawWgpuRichTextWithOverlay(state, renderProxy, overlay) {
|
|
|
72
72
|
const ph = _offscreenCanvas.height;
|
|
73
73
|
let entry = richData.entry;
|
|
74
74
|
if (entry === null || richData.w !== pw || richData.h !== ph) {
|
|
75
|
+
const nextEntry = createWgpuTextureEntry(state, pw, ph, _offscreenCanvas);
|
|
76
|
+
if (nextEntry === null)
|
|
77
|
+
return;
|
|
75
78
|
entry?.texture.destroy();
|
|
76
|
-
entry =
|
|
77
|
-
richData.entry =
|
|
79
|
+
entry = nextEntry;
|
|
80
|
+
richData.entry = nextEntry;
|
|
78
81
|
richData.w = pw;
|
|
79
82
|
richData.h = ph;
|
|
80
83
|
}
|
package/dist/wgpuRichText.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuRichText.js","sourceRoot":"","sources":["../src/wgpuRichText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC9G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC;AAgBvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"wgpuRichText.js","sourceRoot":"","sources":["../src/wgpuRichText.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { Scene2DRenderer, Renderable, RendererData, RenderProxy2D, RenderState, WgpuRenderState } from '@flighthq/types/contract';
|
|
1
|
+
import type { RenderProxy2D, RenderState, Renderable, RendererData, Scene2DRenderer, WgpuRenderState } from '@flighthq/types/contract';
|
|
3
2
|
export declare function createWgpuScale9ShapeData(_state: RenderState, _source: Renderable): RendererData;
|
|
4
3
|
export declare function destroyWgpuScale9ShapeData(_state: RenderState, data: RendererData): void;
|
|
5
4
|
export declare function drawWgpuScale9Shape(state: WgpuRenderState, renderProxy: RenderProxy2D): void;
|
|
6
5
|
export declare function drawWgpuScale9ShapeMask(state: WgpuRenderState, data: RenderProxy2D): void;
|
|
7
|
-
export declare function remapWgpuScale9Commands(out: unknown[], source: readonly unknown[], mapper: Parameters<typeof mapCanvasScale9ShapeCommands>[2]): void;
|
|
8
6
|
export declare const defaultWgpuScale9ShapeRenderer: Scene2DRenderer;
|
|
9
7
|
//# sourceMappingURL=wgpuScale9Shape.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuScale9Shape.d.ts","sourceRoot":"","sources":["../src/wgpuScale9Shape.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuScale9Shape.d.ts","sourceRoot":"","sources":["../src/wgpuScale9Shape.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EAEZ,eAAe,EAEf,eAAe,EAEhB,MAAM,0BAA0B,CAAC;AAyBlC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,CAgBhG;AAGD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAIxF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAmG5F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAEzF;AAED,eAAO,MAAM,8BAA8B,EAAE,eAI5C,CAAC"}
|
package/dist/wgpuScale9Shape.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node/contract';
|
|
2
2
|
import { createWgpuTextureEntry, drawWgpuQuadWithTransform, updateWgpuTextureEntry, } from '@flighthq/render-wgpu/contract';
|
|
3
3
|
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
4
|
-
import {
|
|
4
|
+
import { mapScale9ShapeCommands } from '@flighthq/shape/contract';
|
|
5
|
+
import { RenderRegistry, Scale9ShapeKind } from '@flighthq/types/contract';
|
|
6
|
+
import { flushWgpuQuadBatchWriter } from './wgpuQuadBatchWriter';
|
|
5
7
|
import { createWgpuRendererData, getWgpuRendererData } from './wgpuRendererData';
|
|
6
8
|
import { buildWgpuScale9Mapper } from './wgpuScale9Mapper';
|
|
7
9
|
import { drawWgpuShape } from './wgpuShape';
|
|
8
|
-
import {
|
|
10
|
+
import { getWgpuShapeRasterizer } from './wgpuShapeRasterizer';
|
|
9
11
|
export function createWgpuScale9ShapeData(_state, _source) {
|
|
10
12
|
const canvas = document.createElement('canvas');
|
|
11
13
|
canvas.width = 1;
|
|
@@ -18,6 +20,7 @@ export function createWgpuScale9ShapeData(_state, _source) {
|
|
|
18
20
|
lastScaleX: -1,
|
|
19
21
|
lastScaleY: -1,
|
|
20
22
|
lastContentId: -1,
|
|
23
|
+
lastPixelRatio: 0,
|
|
21
24
|
lastW: 0,
|
|
22
25
|
entry: null,
|
|
23
26
|
});
|
|
@@ -33,7 +36,7 @@ export function drawWgpuScale9Shape(state, renderProxy) {
|
|
|
33
36
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
34
37
|
if (runtime.renderPass === null)
|
|
35
38
|
return;
|
|
36
|
-
|
|
39
|
+
flushWgpuQuadBatchWriter(state);
|
|
37
40
|
const source = renderProxy.source;
|
|
38
41
|
const { commands, scale9Grid } = source.data;
|
|
39
42
|
const version = getNodeLocalContentRevision(source);
|
|
@@ -41,6 +44,13 @@ export function drawWgpuScale9Shape(state, renderProxy) {
|
|
|
41
44
|
return;
|
|
42
45
|
if (renderProxy.rendererData === null)
|
|
43
46
|
return;
|
|
47
|
+
// A fill with no tessellated form is the registered rasterizer's job; an absent one is reported
|
|
48
|
+
// rather than quietly dropping the fill.
|
|
49
|
+
const rasterizer = getWgpuShapeRasterizer(state);
|
|
50
|
+
if (rasterizer === null) {
|
|
51
|
+
getWgpuRenderStateRuntime(state).registryMiss?.(RenderRegistry.ShapeRasterizer, Scale9ShapeKind);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
44
54
|
const bounds = getNodeLocalBoundsRectangle(source);
|
|
45
55
|
const mapper = buildWgpuScale9Mapper(bounds, scale9Grid, source.scaleX, source.scaleY);
|
|
46
56
|
if (mapper === null) {
|
|
@@ -48,6 +58,7 @@ export function drawWgpuScale9Shape(state, renderProxy) {
|
|
|
48
58
|
return;
|
|
49
59
|
}
|
|
50
60
|
const shapeData = getWgpuRendererData(renderProxy.rendererData);
|
|
61
|
+
const pixelRatio = state.pixelRatio;
|
|
51
62
|
if (shapeData === null)
|
|
52
63
|
return;
|
|
53
64
|
const w = Math.ceil(bounds.width * source.scaleX);
|
|
@@ -58,21 +69,29 @@ export function drawWgpuScale9Shape(state, renderProxy) {
|
|
|
58
69
|
w !== shapeData.lastW ||
|
|
59
70
|
h !== shapeData.lastH ||
|
|
60
71
|
source.scaleX !== shapeData.lastScaleX ||
|
|
61
|
-
source.scaleY !== shapeData.lastScaleY
|
|
62
|
-
shapeData.
|
|
63
|
-
|
|
72
|
+
source.scaleY !== shapeData.lastScaleY ||
|
|
73
|
+
pixelRatio !== shapeData.lastPixelRatio) {
|
|
74
|
+
const pw = Math.ceil(w * pixelRatio);
|
|
75
|
+
const ph = Math.ceil(h * pixelRatio);
|
|
76
|
+
shapeData.canvas.width = pw;
|
|
77
|
+
shapeData.canvas.height = ph;
|
|
64
78
|
const ctx = shapeData.ctx;
|
|
65
|
-
ctx.
|
|
66
|
-
ctx.
|
|
67
|
-
|
|
68
|
-
ctx
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
79
|
+
ctx.setTransform(pixelRatio, 0, 0, pixelRatio, -bounds.x * pixelRatio, -bounds.y * pixelRatio);
|
|
80
|
+
ctx.clearRect(bounds.x, bounds.y, w, h);
|
|
81
|
+
mapScale9ShapeCommands(_remappedCommands, commands, mapper);
|
|
82
|
+
rasterizer(ctx, _remappedCommands, state);
|
|
83
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
84
|
+
// GPU textures are fixed-size: recreate the entry when the device-pixel size changes — which a
|
|
85
|
+
// pixelRatio change does even at a fixed field size — otherwise reupload into the existing entry.
|
|
86
|
+
if (shapeData.entry === null ||
|
|
87
|
+
shapeData.lastW !== w ||
|
|
88
|
+
shapeData.lastH !== h ||
|
|
89
|
+
shapeData.lastPixelRatio !== pixelRatio) {
|
|
90
|
+
const nextEntry = createWgpuTextureEntry(state, pw, ph, shapeData.canvas);
|
|
91
|
+
if (nextEntry === null)
|
|
92
|
+
return;
|
|
74
93
|
shapeData.entry?.texture.destroy();
|
|
75
|
-
shapeData.entry =
|
|
94
|
+
shapeData.entry = nextEntry;
|
|
76
95
|
}
|
|
77
96
|
else {
|
|
78
97
|
updateWgpuTextureEntry(state, shapeData.entry, shapeData.canvas);
|
|
@@ -81,6 +100,7 @@ export function drawWgpuScale9Shape(state, renderProxy) {
|
|
|
81
100
|
shapeData.lastScaleX = source.scaleX;
|
|
82
101
|
shapeData.lastScaleY = source.scaleY;
|
|
83
102
|
shapeData.lastContentId = version;
|
|
103
|
+
shapeData.lastPixelRatio = pixelRatio;
|
|
84
104
|
shapeData.lastW = w;
|
|
85
105
|
}
|
|
86
106
|
if (shapeData.entry === null)
|
|
@@ -97,27 +117,10 @@ export function drawWgpuScale9Shape(state, renderProxy) {
|
|
|
97
117
|
export function drawWgpuScale9ShapeMask(state, data) {
|
|
98
118
|
drawWgpuScale9Shape(state, data);
|
|
99
119
|
}
|
|
100
|
-
export function remapWgpuScale9Commands(out, source, mapper) {
|
|
101
|
-
mapCanvasScale9ShapeCommands(out, source, mapper);
|
|
102
|
-
let i = 0;
|
|
103
|
-
while (i < out.length) {
|
|
104
|
-
const key = out[i];
|
|
105
|
-
const argCount = out[i + 1];
|
|
106
|
-
if (key === 'drawPath') {
|
|
107
|
-
const pathData = out[i + 3];
|
|
108
|
-
_remappedPathData.length = pathData.length;
|
|
109
|
-
for (let k = 0; k < pathData.length; k++)
|
|
110
|
-
_remappedPathData[k] = pathData[k];
|
|
111
|
-
out[i + 3] = _remappedPathData;
|
|
112
|
-
}
|
|
113
|
-
i += argCount + 2;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
120
|
export const defaultWgpuScale9ShapeRenderer = {
|
|
117
121
|
createData: createWgpuScale9ShapeData,
|
|
118
122
|
destroyData: destroyWgpuScale9ShapeData,
|
|
119
123
|
submit: drawWgpuScale9Shape,
|
|
120
124
|
};
|
|
121
125
|
const _remappedCommands = [];
|
|
122
|
-
const _remappedPathData = [];
|
|
123
126
|
//# sourceMappingURL=wgpuScale9Shape.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuScale9Shape.js","sourceRoot":"","sources":["../src/wgpuScale9Shape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"wgpuScale9Shape.js","sourceRoot":"","sources":["../src/wgpuScale9Shape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAYlE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAkB/D,MAAM,UAAU,yBAAyB,CAAC,MAAmB,EAAE,OAAmB;IAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC;IACrC,OAAO,sBAAsB,CAAsB;QACjD,MAAM;QACN,GAAG;QACH,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,CAAC,CAAC;QACd,UAAU,EAAE,CAAC,CAAC;QACd,aAAa,EAAE,CAAC,CAAC;QACjB,cAAc,EAAE,CAAC;QACjB,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;AACL,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,0BAA0B,CAAC,MAAmB,EAAE,IAAkB;IAChF,MAAM,SAAS,GAAG,mBAAmB,CAAsB,IAAI,CAAC,CAAC;IACjE,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO;IAC/B,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAsB,EAAE,WAA0B;IACpF,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO;IACxC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAqB,CAAC;IACjD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7C,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,IAAI,WAAW,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO;IAE9C,gGAAgG;IAChG,yCAAyC;IACzC,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,yBAAyB,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAsB,WAAW,CAAC,YAAY,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IAE7B,IACE,OAAO,KAAK,SAAS,CAAC,aAAa;QACnC,CAAC,KAAK,SAAS,CAAC,KAAK;QACrB,CAAC,KAAK,SAAS,CAAC,KAAK;QACrB,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,UAAU;QACtC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,UAAU;QACtC,UAAU,KAAK,SAAS,CAAC,cAAc,EACvC,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACrC,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAC5B,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QAC1B,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QAC/F,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,sBAAsB,CAAC,iBAAiB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5D,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnC,+FAA+F;QAC/F,kGAAkG;QAClG,IACE,SAAS,CAAC,KAAK,KAAK,IAAI;YACxB,SAAS,CAAC,KAAK,KAAK,CAAC;YACrB,SAAS,CAAC,KAAK,KAAK,CAAC;YACrB,SAAS,CAAC,cAAc,KAAK,UAAU,EACvC,CAAC;YACD,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,SAAS,KAAK,IAAI;gBAAE,OAAO;YAC/B,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YACnC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;QAED,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QACpB,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC;QAClC,SAAS,CAAC,cAAc,GAAG,UAAU,CAAC;QACtC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO;IAErC,oGAAoG;IACpG,0FAA0F;IAC1F,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,yBAAyB,CACvB,KAAK,EACL,WAAW,EACX,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAClC,SAAS,CAAC,KAAK,EACf,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAsB,EAAE,IAAmB;IACjF,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAoB;IAC7D,UAAU,EAAE,yBAAyB;IACrC,WAAW,EAAE,0BAA0B;IACvC,MAAM,EAAE,mBAAmB;CAC5B,CAAC;AAEF,MAAM,iBAAiB,GAAwB,EAAE,CAAC"}
|
package/dist/wgpuShape.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { RenderProxy2D, Scene2DRenderer, WgpuRenderState } from '@flighthq/types/contract';
|
|
2
2
|
export declare function drawWgpuShape(state: WgpuRenderState, renderProxy: RenderProxy2D): void;
|
|
3
3
|
export declare const defaultWgpuShapeRenderer: Scene2DRenderer;
|
|
4
|
+
export declare const defaultWgpuMorphShapeRenderer: Scene2DRenderer;
|
|
4
5
|
//# sourceMappingURL=wgpuShape.d.ts.map
|
package/dist/wgpuShape.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuShape.d.ts","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuShape.d.ts","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWhG,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAGtF;AAUD,eAAO,MAAM,wBAAwB,EAAE,eAKtC,CAAC;AAGF,eAAO,MAAM,6BAA6B,EAAE,eAA0C,CAAC"}
|
package/dist/wgpuShape.js
CHANGED
|
@@ -1,164 +1,30 @@
|
|
|
1
|
-
import { createImageResource, setImageResourceSource } from '@flighthq/image/contract';
|
|
2
|
-
import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node/contract';
|
|
3
|
-
import { tessellatePath } from '@flighthq/path/contract';
|
|
4
|
-
import { resolveWgpuMaterialRenderer } from '@flighthq/render-wgpu/contract';
|
|
5
|
-
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
6
|
-
import { renderCanvasShapeCommands } from '@flighthq/scene2d-canvas/contract';
|
|
7
|
-
import { getShapeFillRegions, getShapeStrokeRegions, hasShapeFill } from '@flighthq/shape/contract';
|
|
8
1
|
import { BatchFormat } from '@flighthq/types/contract';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const ctx = canvas.getContext('2d');
|
|
17
|
-
return createWgpuRendererData({
|
|
18
|
-
canvas,
|
|
19
|
-
ctx,
|
|
20
|
-
image: createImageResource(canvas),
|
|
21
|
-
lastContentId: -1,
|
|
22
|
-
lastW: 0,
|
|
23
|
-
lastH: 0,
|
|
24
|
-
meshVersion: -1,
|
|
25
|
-
meshes: null,
|
|
26
|
-
meshBuffers: {
|
|
27
|
-
vertexBuffer: null,
|
|
28
|
-
vertexCapacity: 0,
|
|
29
|
-
indexBuffer: null,
|
|
30
|
-
indexCapacity: 0,
|
|
31
|
-
uniformBuffer: null,
|
|
32
|
-
bindGroup: null,
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
// Destroy the GPU texture the batch uploaded for this shape's canvas, plus the mesh path's per-shape
|
|
37
|
-
// vertex/index/uniform buffers, when the shape is torn down.
|
|
38
|
-
function destroyWgpuShapeData(state, data) {
|
|
39
|
-
const runtime = getWgpuRenderStateRuntime(state);
|
|
40
|
-
const shapeData = getWgpuRendererData(data);
|
|
41
|
-
if (shapeData === null)
|
|
42
|
-
return;
|
|
43
|
-
const entry = runtime.imageResourcePremultipliedTextureCache.get(shapeData.image);
|
|
44
|
-
if (entry !== undefined) {
|
|
45
|
-
entry.texture.destroy();
|
|
46
|
-
runtime.imageResourcePremultipliedTextureCache.delete(shapeData.image);
|
|
47
|
-
}
|
|
48
|
-
const b = shapeData.meshBuffers;
|
|
49
|
-
b.vertexBuffer?.destroy();
|
|
50
|
-
b.indexBuffer?.destroy();
|
|
51
|
-
b.uniformBuffer?.destroy();
|
|
52
|
-
b.vertexBuffer = null;
|
|
53
|
-
b.indexBuffer = null;
|
|
54
|
-
b.uniformBuffer = null;
|
|
55
|
-
b.bindGroup = null;
|
|
56
|
-
}
|
|
57
|
-
// Chooses the fillable regions to tessellate into GPU meshes for a shape: its solid-fill regions when it
|
|
58
|
-
// is fill-only, or its stroke-outline regions (via getShapeStrokeRegions → strokePath) when it is
|
|
59
|
-
// stroke-only. Returns null when the shape must use the raster fallback — a gradient/bitmap fill or
|
|
60
|
-
// stroke, a closed-primitive (ring) stroke, or a shape that BOTH fills and strokes. Mirrors
|
|
61
|
-
// scene2d-gl/glShape's resolveGlShapeMeshRegions.
|
|
62
|
-
function resolveWgpuShapeMeshRegions(commands) {
|
|
63
|
-
const fillRegions = getShapeFillRegions(commands);
|
|
64
|
-
if (fillRegions !== null)
|
|
65
|
-
return fillRegions.length > 0 ? fillRegions : null;
|
|
66
|
-
if (hasShapeFill(commands))
|
|
67
|
-
return null;
|
|
68
|
-
return getShapeStrokeRegions(commands);
|
|
69
|
-
}
|
|
2
|
+
import { drawWgpuMeshShape } from './wgpuMeshShapeRenderer';
|
|
3
|
+
import { drawWgpuRasterShape } from './wgpuRasterShapeRenderer';
|
|
4
|
+
import { createWgpuShapeData, destroyWgpuShapeData } from './wgpuShapeData';
|
|
5
|
+
// Tessellates what it can and rasterizes the rest: the GPU mesh path is tried first, and a shape with a
|
|
6
|
+
// fill that has no tessellated form — a gradient, a texture fill, a closed stroke — falls through to the
|
|
7
|
+
// canvas replay. Both halves cache into the same per-node renderer data, so a shape that changes between
|
|
8
|
+
// the two does not thrash.
|
|
70
9
|
export function drawWgpuShape(state, renderProxy) {
|
|
71
|
-
|
|
72
|
-
if (runtime.renderPass === null)
|
|
73
|
-
return;
|
|
74
|
-
const source = renderProxy.source;
|
|
75
|
-
const { commands } = source.data;
|
|
76
|
-
const version = getNodeLocalContentRevision(source);
|
|
77
|
-
if (commands.length === 0)
|
|
78
|
-
return;
|
|
79
|
-
if (renderProxy.rendererData === null)
|
|
80
|
-
return;
|
|
81
|
-
// GPU mesh path: solid-fill shapes tessellate to colored meshes (crisp at any zoom), and a STROKE-ONLY
|
|
82
|
-
// shape offsets its strokes to fillable outlines via getShapeStrokeRegions (real joins/caps/dashing,
|
|
83
|
-
// resolution-independent — no offscreen raster). Falls through to the canvas-raster path for
|
|
84
|
-
// gradient/bitmap fills/strokes, closed-primitive (ring) strokes, and filled-and-stroked shapes (the
|
|
85
|
-
// fill + stroke mesh paths don't compose yet). Mirrors scene2d-gl/glShape.
|
|
86
|
-
const regions = resolveWgpuShapeMeshRegions(commands);
|
|
87
|
-
if (regions !== null && regions.length > 0) {
|
|
88
|
-
const meshData = getWgpuRendererData(renderProxy.rendererData);
|
|
89
|
-
if (meshData === null)
|
|
90
|
-
return;
|
|
91
|
-
if (meshData.meshVersion !== version) {
|
|
92
|
-
meshData.meshes = regions.map((region) => {
|
|
93
|
-
const mesh = tessellatePath(region.path);
|
|
94
|
-
return {
|
|
95
|
-
vertices: new Float32Array(mesh.vertices),
|
|
96
|
-
indices: new Uint16Array(mesh.indices),
|
|
97
|
-
color: region.color,
|
|
98
|
-
alpha: region.alpha,
|
|
99
|
-
};
|
|
100
|
-
});
|
|
101
|
-
meshData.meshVersion = version;
|
|
102
|
-
}
|
|
103
|
-
drawWgpuShapeMeshes(state, renderProxy, meshData.meshes ?? [], meshData.meshBuffers);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
const material = renderProxy.material;
|
|
107
|
-
const materialRenderer = resolveWgpuMaterialRenderer(state, material);
|
|
108
|
-
if (materialRenderer === null)
|
|
109
|
-
return;
|
|
110
|
-
const shapeData = getWgpuRendererData(renderProxy.rendererData);
|
|
111
|
-
if (shapeData === null)
|
|
112
|
-
return;
|
|
113
|
-
const bounds = getNodeLocalBoundsRectangle(source);
|
|
114
|
-
const w = Math.ceil(bounds.width);
|
|
115
|
-
const h = Math.ceil(bounds.height);
|
|
116
|
-
if (w <= 0 || h <= 0)
|
|
10
|
+
if (drawWgpuMeshShape(state, renderProxy))
|
|
117
11
|
return;
|
|
118
|
-
|
|
119
|
-
shapeData.canvas.width = w;
|
|
120
|
-
shapeData.canvas.height = h;
|
|
121
|
-
const ctx = shapeData.ctx;
|
|
122
|
-
ctx.clearRect(0, 0, w, h);
|
|
123
|
-
ctx.save();
|
|
124
|
-
ctx.translate(-bounds.x, -bounds.y);
|
|
125
|
-
renderCanvasShapeCommands(ctx, commands);
|
|
126
|
-
ctx.restore();
|
|
127
|
-
// Re-read the canvas dimensions and bump the resource version so the batch's version-aware cache
|
|
128
|
-
// re-uploads (recreating the GPU texture, which covers a size change too).
|
|
129
|
-
setImageResourceSource(shapeData.image, shapeData.canvas);
|
|
130
|
-
shapeData.lastContentId = version;
|
|
131
|
-
shapeData.lastW = w;
|
|
132
|
-
shapeData.lastH = h;
|
|
133
|
-
}
|
|
134
|
-
ensureWgpuQuadBatchResources(state);
|
|
135
|
-
const t = renderProxy.transform2D;
|
|
136
|
-
const tx = t.tx + t.a * bounds.x + t.c * bounds.y;
|
|
137
|
-
const ty = t.ty + t.b * bounds.x + t.d * bounds.y;
|
|
138
|
-
const startCount = runtime.spriteBatchCount;
|
|
139
|
-
const base = prepareWgpuSpriteBatchWrite(state, shapeData.image, renderProxy.blendMode, material, materialRenderer, 1);
|
|
140
|
-
const d = runtime.spriteBatchInstanceData;
|
|
141
|
-
d[base] = t.a;
|
|
142
|
-
d[base + 1] = t.b;
|
|
143
|
-
d[base + 2] = t.c;
|
|
144
|
-
d[base + 3] = t.d;
|
|
145
|
-
d[base + 4] = tx;
|
|
146
|
-
d[base + 5] = ty;
|
|
147
|
-
d[base + 6] = w;
|
|
148
|
-
d[base + 7] = h;
|
|
149
|
-
d[base + 8] = 0;
|
|
150
|
-
d[base + 9] = 0;
|
|
151
|
-
d[base + 10] = 1;
|
|
152
|
-
d[base + 11] = 1;
|
|
153
|
-
d[base + 12] = renderProxy.alpha;
|
|
154
|
-
packWgpuSpriteBatchMaterialInstance(state, renderProxy.materialData, startCount);
|
|
155
|
-
recordWgpuSpriteBatchColorScaleBias(state, renderProxy.colorMatrix ?? renderProxy.colorScaleBias, startCount);
|
|
156
|
-
runtime.spriteBatchCount++;
|
|
12
|
+
drawWgpuRasterShape(state, renderProxy);
|
|
157
13
|
}
|
|
14
|
+
// The general-purpose shape strategy, and the right default for an app that does not want to reason
|
|
15
|
+
// about which fills tessellate. Because it may take either path, it pulls both the tessellator and the
|
|
16
|
+
// canvas replay into the bundle, and whether it needs shape commands registered depends on scene
|
|
17
|
+
// content: a scene of solid fills never rasterizes, while one gradient fill makes the full canvas
|
|
18
|
+
// command vocabulary a requirement.
|
|
19
|
+
//
|
|
20
|
+
// Register defaultWgpuMeshShapeRenderer or defaultWgpuRasterShapeRenderer instead to pin the strategy —
|
|
21
|
+
// each pays for only its own path and has a wiring requirement that does not depend on the scene.
|
|
158
22
|
export const defaultWgpuShapeRenderer = {
|
|
159
23
|
format: BatchFormat.Quad,
|
|
160
24
|
createData: createWgpuShapeData,
|
|
161
25
|
destroyData: destroyWgpuShapeData,
|
|
162
26
|
submit: drawWgpuShape,
|
|
163
27
|
};
|
|
28
|
+
// MorphShape owns a distinct kind while sharing Shape's mesh/raster renderer and cache lifecycle.
|
|
29
|
+
export const defaultWgpuMorphShapeRenderer = defaultWgpuShapeRenderer;
|
|
164
30
|
//# sourceMappingURL=wgpuShape.js.map
|
package/dist/wgpuShape.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuShape.js","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuShape.js","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,wGAAwG;AACxG,yGAAyG;AACzG,yGAAyG;AACzG,2BAA2B;AAC3B,MAAM,UAAU,aAAa,CAAC,KAAsB,EAAE,WAA0B;IAC9E,IAAI,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC;QAAE,OAAO;IAClD,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,oGAAoG;AACpG,uGAAuG;AACvG,iGAAiG;AACjG,kGAAkG;AAClG,oCAAoC;AACpC,EAAE;AACF,wGAAwG;AACxG,kGAAkG;AAClG,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,MAAM,EAAE,WAAW,CAAC,IAAI;IACxB,UAAU,EAAE,mBAAmB;IAC/B,WAAW,EAAE,oBAAoB;IACjC,MAAM,EAAE,aAAa;CACtB,CAAC;AAEF,kGAAkG;AAClG,MAAM,CAAC,MAAM,6BAA6B,GAAoB,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Renderable, RendererData, RenderState, WgpuRenderState, WgpuShapeRasterSurface, WgpuShapeRendererData } from '@flighthq/types/contract';
|
|
2
|
+
export declare function acquireWgpuShapeRasterSurface(data: WgpuShapeRendererData): WgpuShapeRasterSurface;
|
|
3
|
+
export declare function createWgpuShapeData(_state: RenderState, _source: Renderable): RendererData;
|
|
4
|
+
export declare function destroyWgpuShapeData(state: WgpuRenderState, data: RendererData): void;
|
|
5
|
+
export declare function getWgpuShapeData(data: RendererData): WgpuShapeRendererData | null;
|
|
6
|
+
//# sourceMappingURL=wgpuShapeData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuShapeData.d.ts","sourceRoot":"","sources":["../src/wgpuShapeData.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAMlC,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,qBAAqB,GAAG,sBAAsB,CAajG;AAID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,CAoB1F;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAyBrF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,qBAAqB,GAAG,IAAI,CAEjF"}
|