@flighthq/scene2d-wgpu 0.3.0-next.1220.6982c21 → 0.3.0-next.1248.f867198
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/wgpuShape.d.ts.map +1 -1
- package/dist/wgpuShape.js +55 -36
- package/dist/wgpuShape.js.map +1 -1
- package/dist/wgpuShapeMesh.d.ts.map +1 -1
- package/dist/wgpuShapeMesh.js +36 -32
- package/dist/wgpuShapeMesh.js.map +1 -1
- package/dist/wgpuSprite.d.ts.map +1 -1
- package/dist/wgpuSprite.js +3 -2
- package/dist/wgpuSprite.js.map +1 -1
- package/package.json +18 -18
- package/src/wgpuShape.test.ts +91 -1
- package/src/wgpuShapeMesh.test.ts +23 -8
- package/src/wgpuSprite.test.ts +1 -0
package/dist/wgpuShape.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuShape.d.ts","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EAIf,aAAa,
|
|
1
|
+
{"version":3,"file":"wgpuShape.d.ts","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EAIf,aAAa,EAMb,eAAe,EAEhB,MAAM,0BAA0B,CAAC;AA6FlC,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CA4GtF;AAMD,eAAO,MAAM,wBAAwB,EAAE,eAKtC,CAAC"}
|
package/dist/wgpuShape.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createImageResource, invalidateImageResource } from '@flighthq/image/contract';
|
|
2
2
|
import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node/contract';
|
|
3
|
-
import { tessellatePath } from '@flighthq/path/contract';
|
|
3
|
+
import { tessellatePath, tessellateStrokePath } from '@flighthq/path/contract';
|
|
4
4
|
import { bindWgpuImageResourceTexture, resolveWgpuMaterialRenderer } from '@flighthq/render-wgpu/contract';
|
|
5
5
|
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
6
6
|
import { renderCanvasShapeCommands } from '@flighthq/scene2d-canvas/contract';
|
|
7
|
-
import { getShapeFillRegions, getShapeStrokeRegions
|
|
7
|
+
import { getShapeFillRegions, getShapeStrokeRegions } from '@flighthq/shape/contract';
|
|
8
8
|
import { BatchFormat } from '@flighthq/types/contract';
|
|
9
9
|
import { ensureWgpuQuadBatchResources, packWgpuQuadBatchMaterialInstance, prepareWgpuQuadBatchWrite, recordWgpuQuadBatchColorScaleBias, } from './wgpuQuadBatchWriter';
|
|
10
10
|
import { createWgpuRendererData, getWgpuRendererData } from './wgpuRendererData';
|
|
@@ -24,12 +24,12 @@ function createWgpuShapeData(_state, _source) {
|
|
|
24
24
|
meshVersion: -1,
|
|
25
25
|
meshes: null,
|
|
26
26
|
meshBuffers: {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
vertexBuffers: [],
|
|
28
|
+
vertexCapacities: [],
|
|
29
|
+
indexBuffers: [],
|
|
30
|
+
indexCapacities: [],
|
|
31
|
+
uniformBuffers: [],
|
|
32
|
+
bindGroups: [],
|
|
33
33
|
},
|
|
34
34
|
});
|
|
35
35
|
}
|
|
@@ -46,26 +46,31 @@ function destroyWgpuShapeData(state, data) {
|
|
|
46
46
|
runtime.textureSourcePremultipliedTextureCache.delete(shapeData.image);
|
|
47
47
|
}
|
|
48
48
|
const b = shapeData.meshBuffers;
|
|
49
|
-
b.
|
|
50
|
-
|
|
51
|
-
b.
|
|
52
|
-
|
|
53
|
-
b.
|
|
54
|
-
|
|
55
|
-
b.
|
|
49
|
+
for (const buffer of b.vertexBuffers)
|
|
50
|
+
buffer.destroy();
|
|
51
|
+
for (const buffer of b.indexBuffers)
|
|
52
|
+
buffer.destroy();
|
|
53
|
+
for (const buffer of b.uniformBuffers)
|
|
54
|
+
buffer.destroy();
|
|
55
|
+
b.vertexBuffers.length = 0;
|
|
56
|
+
b.vertexCapacities.length = 0;
|
|
57
|
+
b.indexBuffers.length = 0;
|
|
58
|
+
b.indexCapacities.length = 0;
|
|
59
|
+
b.uniformBuffers.length = 0;
|
|
60
|
+
b.bindGroups.length = 0;
|
|
56
61
|
}
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
// stroke, a closed-primitive (ring) stroke, or a shape that BOTH fills and strokes. Mirrors
|
|
61
|
-
// scene2d-gl/glShape's resolveGlShapeMeshRegions.
|
|
62
|
+
// Resolves every solid fill and solid stroke into one fill-before-stroke source list. Style sentinels
|
|
63
|
+
// are decided here; geometric stroke sentinels are decided by tessellateStrokePath during cache rebuild.
|
|
64
|
+
// Mirrors scene2d-gl/glShape.
|
|
62
65
|
function resolveWgpuShapeMeshRegions(commands) {
|
|
63
66
|
const fillRegions = getShapeFillRegions(commands);
|
|
64
|
-
if (fillRegions
|
|
65
|
-
return fillRegions.length > 0 ? fillRegions : null;
|
|
66
|
-
if (hasShapeFill(commands))
|
|
67
|
+
if (fillRegions === null)
|
|
67
68
|
return null;
|
|
68
|
-
|
|
69
|
+
const strokeRegions = getShapeStrokeRegions(commands);
|
|
70
|
+
if (strokeRegions === null)
|
|
71
|
+
return null;
|
|
72
|
+
const regions = [...fillRegions, ...strokeRegions];
|
|
73
|
+
return regions.length > 0 ? regions : null;
|
|
69
74
|
}
|
|
70
75
|
export function drawWgpuShape(state, renderProxy) {
|
|
71
76
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
@@ -78,30 +83,41 @@ export function drawWgpuShape(state, renderProxy) {
|
|
|
78
83
|
return;
|
|
79
84
|
if (renderProxy.rendererData === null)
|
|
80
85
|
return;
|
|
81
|
-
// GPU mesh path:
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
// fill + stroke mesh paths don't compose yet). Mirrors scene2d-gl/glShape.
|
|
86
|
+
// GPU mesh path: fills use direct path tessellation; strokes use the dedicated cross-section mesh so
|
|
87
|
+
// open outlines and hollow closed rings share joins/caps/dashes without hole-fill ambiguity. A
|
|
88
|
+
// pathological stroke's null mesh deliberately falls through to the Canvas raster path below.
|
|
89
|
+
// Mirrors scene2d-gl/glShape.
|
|
86
90
|
const regions = resolveWgpuShapeMeshRegions(commands);
|
|
87
91
|
if (regions !== null && regions.length > 0) {
|
|
88
92
|
const meshData = getWgpuRendererData(renderProxy.rendererData);
|
|
89
93
|
if (meshData === null)
|
|
90
94
|
return;
|
|
91
95
|
if (meshData.meshVersion !== version) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
96
|
+
const meshes = [];
|
|
97
|
+
let supported = true;
|
|
98
|
+
for (let i = 0; i < regions.length; i++) {
|
|
99
|
+
const region = regions[i];
|
|
100
|
+
const mesh = isShapeStrokeRegion(region)
|
|
101
|
+
? tessellateStrokePath(region.path, region.style)
|
|
102
|
+
: tessellatePath(region.path);
|
|
103
|
+
if (mesh === null) {
|
|
104
|
+
supported = false;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
meshes.push({
|
|
95
108
|
vertices: new Float32Array(mesh.vertices),
|
|
96
109
|
indices: new Uint16Array(mesh.indices),
|
|
97
110
|
color: region.color,
|
|
98
111
|
alpha: region.alpha,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
meshData.meshes = supported ? meshes : null;
|
|
101
115
|
meshData.meshVersion = version;
|
|
102
116
|
}
|
|
103
|
-
|
|
104
|
-
|
|
117
|
+
if (meshData.meshes !== null) {
|
|
118
|
+
drawWgpuShapeMeshes(state, renderProxy, meshData.meshes, meshData.meshBuffers);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
105
121
|
}
|
|
106
122
|
const material = renderProxy.material;
|
|
107
123
|
const materialRenderer = resolveWgpuMaterialRenderer(state, material);
|
|
@@ -156,6 +172,9 @@ export function drawWgpuShape(state, renderProxy) {
|
|
|
156
172
|
recordWgpuQuadBatchColorScaleBias(state, renderProxy.colorMatrix ?? renderProxy.colorScaleBias, startCount);
|
|
157
173
|
runtime.quadBatchWriterCount++;
|
|
158
174
|
}
|
|
175
|
+
function isShapeStrokeRegion(region) {
|
|
176
|
+
return 'style' in region;
|
|
177
|
+
}
|
|
159
178
|
export const defaultWgpuShapeRenderer = {
|
|
160
179
|
format: BatchFormat.Quad,
|
|
161
180
|
createData: createWgpuShapeData,
|
package/dist/wgpuShape.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuShape.js","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"wgpuShape.js","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuShapeMesh.d.ts","sourceRoot":"","sources":["../src/wgpuShapeMesh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,oBAAoB,EAErB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"wgpuShapeMesh.d.ts","sourceRoot":"","sources":["../src/wgpuShapeMesh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,oBAAoB,EAErB,MAAM,0BAA0B,CAAC;AAwBlC,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,aAAa,EAC1B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAiDN"}
|
package/dist/wgpuShapeMesh.js
CHANGED
|
@@ -4,22 +4,21 @@ import { flushWgpuQuadBatchWriter } from './wgpuQuadBatchWriter';
|
|
|
4
4
|
// canvas-raster-to-texture shortcut (resolution-bound, so circles go jagged when scaled up). Each fill
|
|
5
5
|
// region is tessellated to a triangle mesh (CPU, cached by content version in webgpuShape) and drawn here
|
|
6
6
|
// with a flat-color pipeline, transformed by the node world transform in the vertex shader so it stays
|
|
7
|
-
// crisp at any zoom. Gradient/
|
|
8
|
-
//
|
|
7
|
+
// crisp at any zoom. Gradient/texture styles and pathological stroke centerlines still take the raster
|
|
8
|
+
// path.
|
|
9
9
|
//
|
|
10
10
|
// The fill is gated by any active contour clip: the pipeline compares stencil 'equal' currentMaskDepth
|
|
11
11
|
// (set per draw via setStencilReference) and writes nothing back, so at depth 0 the cleared stencil (0)
|
|
12
12
|
// passes everywhere and inside a clip only the clip's stamped region passes. Blend state is immutable
|
|
13
13
|
// in WebGPU, so the pipeline cache is keyed by the node's fixed-function BlendMode and target format.
|
|
14
14
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// available.
|
|
15
|
+
// The shape-stroke-ring-fallback functional scene exercises this path through the headless software
|
|
16
|
+
// adapter and keeps its closed-ring pixels in parity with Canvas and WebGL.
|
|
18
17
|
// Draws the shape's tessellated fill meshes. Flushes the quad-batch writer first (these go through a separate
|
|
19
18
|
// pipeline). Uploads each mesh's geometry and premultiplied color into the shape's reusable per-shape
|
|
20
|
-
//
|
|
21
|
-
// by the active contour-clip stencil.
|
|
22
|
-
//
|
|
19
|
+
// buffer slot (grown by replacement when that region needs more room) and issues one indexed draw per
|
|
20
|
+
// mesh, gated by the active contour-clip stencil. Slots are distinct because queue writes precede render
|
|
21
|
+
// pass submission; reusing one slot would make every recorded draw observe the final mesh upload.
|
|
23
22
|
export function drawWgpuShapeMeshes(state, renderProxy, meshes, buffers) {
|
|
24
23
|
if (meshes.length === 0)
|
|
25
24
|
return;
|
|
@@ -31,12 +30,10 @@ export function drawWgpuShapeMeshes(state, renderProxy, meshes, buffers) {
|
|
|
31
30
|
const pipelineEntry = ensureShapeMeshPipeline(state, renderProxy.blendMode);
|
|
32
31
|
const device = state.device;
|
|
33
32
|
const queue = device.queue;
|
|
34
|
-
const uniform = ensureShapeMeshUniform(state, pipelineEntry, buffers);
|
|
35
33
|
// Writes the projection·world matrix into uniform columns 0..11 (it shares the same scratch array);
|
|
36
34
|
// the per-mesh color fills 12..15 in the loop below. Same matrix for every mesh of this shape.
|
|
37
35
|
shapeMeshMatrix(state, renderProxy);
|
|
38
36
|
pass.setPipeline(pipelineEntry.pipeline);
|
|
39
|
-
pass.setBindGroup(0, buffers.bindGroup);
|
|
40
37
|
// The cleared stencil is 0, so at depth 0 'equal 0' passes everywhere; inside a contour clip only its
|
|
41
38
|
// stamped region equals currentMaskDepth, so the fill is confined to the clip.
|
|
42
39
|
pass.setStencilReference(runtime.currentMaskDepth);
|
|
@@ -48,8 +45,9 @@ export function drawWgpuShapeMeshes(state, renderProxy, meshes, buffers) {
|
|
|
48
45
|
const a = mesh.alpha * nodeAlpha;
|
|
49
46
|
if (a <= 0)
|
|
50
47
|
continue;
|
|
51
|
-
const
|
|
52
|
-
const
|
|
48
|
+
const uniform = ensureShapeMeshUniform(state, pipelineEntry, buffers, i);
|
|
49
|
+
const vertexBuffer = ensureShapeMeshVertexBuffer(state, buffers, i, mesh.vertices.byteLength);
|
|
50
|
+
const indexBuffer = ensureShapeMeshIndexBuffer(state, buffers, i, mesh.indices.byteLength);
|
|
53
51
|
queue.writeBuffer(vertexBuffer, 0, mesh.vertices.buffer, mesh.vertices.byteOffset, mesh.vertices.byteLength);
|
|
54
52
|
writeShapeMeshIndices(queue, indexBuffer, mesh.indices);
|
|
55
53
|
// Premultiplied color (r*a, g*a, b*a, a) for the one / one-minus-src-alpha target blend.
|
|
@@ -60,7 +58,8 @@ export function drawWgpuShapeMeshes(state, renderProxy, meshes, buffers) {
|
|
|
60
58
|
uniform[13] = g * a;
|
|
61
59
|
uniform[14] = b * a;
|
|
62
60
|
uniform[15] = a;
|
|
63
|
-
queue.writeBuffer(buffers.
|
|
61
|
+
queue.writeBuffer(buffers.uniformBuffers[i], 0, uniform.buffer, uniform.byteOffset, uniform.byteLength);
|
|
62
|
+
pass.setBindGroup(0, buffers.bindGroups[i]);
|
|
64
63
|
pass.setVertexBuffer(0, vertexBuffer);
|
|
65
64
|
pass.setIndexBuffer(indexBuffer, 'uint16');
|
|
66
65
|
pass.drawIndexed(mesh.indices.length);
|
|
@@ -78,34 +77,37 @@ struct ShapeMeshUniforms { matrix : mat3x3f, color : vec4f }
|
|
|
78
77
|
// mat3x3f occupies 48 bytes (three vec3 columns each padded to 16), then a vec4f color (16 bytes): 64.
|
|
79
78
|
const SHAPE_MESH_UNIFORM_BYTES = 64;
|
|
80
79
|
const SHAPE_MESH_UNIFORM_FLOATS = SHAPE_MESH_UNIFORM_BYTES / 4;
|
|
81
|
-
function ensureShapeMeshIndexBuffer(state, buffers, byteLength) {
|
|
80
|
+
function ensureShapeMeshIndexBuffer(state, buffers, meshIndex, byteLength) {
|
|
82
81
|
// Index buffers must be a multiple of 4 bytes for COPY_DST writes; round up the requested size.
|
|
83
82
|
const size = Math.max(4, (byteLength + 3) & ~3);
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
let buffer = buffers.indexBuffers[meshIndex];
|
|
84
|
+
if (buffer === undefined || (buffers.indexCapacities[meshIndex] ?? 0) < size) {
|
|
85
|
+
if (buffer !== undefined) {
|
|
86
86
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
87
|
-
(runtime.retiredBuffers ?? (runtime.retiredBuffers = [])).push(
|
|
87
|
+
(runtime.retiredBuffers ?? (runtime.retiredBuffers = [])).push(buffer);
|
|
88
88
|
}
|
|
89
|
-
|
|
89
|
+
buffer = state.device.createBuffer({
|
|
90
90
|
size,
|
|
91
91
|
usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
|
|
92
92
|
});
|
|
93
|
-
buffers.
|
|
93
|
+
buffers.indexBuffers[meshIndex] = buffer;
|
|
94
|
+
buffers.indexCapacities[meshIndex] = size;
|
|
94
95
|
}
|
|
95
|
-
return
|
|
96
|
+
return buffer;
|
|
96
97
|
}
|
|
97
98
|
// Lazily builds (once per shape) the uniform buffer + bind group, then returns the scratch float view the
|
|
98
99
|
// caller fills with the matrix (uploaded once) and per-mesh color. The matrix columns are written here so
|
|
99
100
|
// every draw shares them; only color (floats 12..15) changes per mesh.
|
|
100
|
-
function ensureShapeMeshUniform(state, pipelineEntry, buffers) {
|
|
101
|
-
if (buffers.
|
|
102
|
-
|
|
101
|
+
function ensureShapeMeshUniform(state, pipelineEntry, buffers, meshIndex) {
|
|
102
|
+
if (buffers.uniformBuffers[meshIndex] === undefined) {
|
|
103
|
+
const uniformBuffer = state.device.createBuffer({
|
|
103
104
|
size: SHAPE_MESH_UNIFORM_BYTES,
|
|
104
105
|
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
105
106
|
});
|
|
106
|
-
buffers.
|
|
107
|
+
buffers.uniformBuffers[meshIndex] = uniformBuffer;
|
|
108
|
+
buffers.bindGroups[meshIndex] = state.device.createBindGroup({
|
|
107
109
|
layout: pipelineEntry.bindGroupLayout,
|
|
108
|
-
entries: [{ binding: 0, resource: { buffer:
|
|
110
|
+
entries: [{ binding: 0, resource: { buffer: uniformBuffer } }],
|
|
109
111
|
});
|
|
110
112
|
}
|
|
111
113
|
return _shapeMeshUniformScratch;
|
|
@@ -158,20 +160,22 @@ function ensureShapeMeshPipeline(state, blendMode) {
|
|
|
158
160
|
cache.set(key, entry);
|
|
159
161
|
return entry;
|
|
160
162
|
}
|
|
161
|
-
function ensureShapeMeshVertexBuffer(state, buffers, byteLength) {
|
|
163
|
+
function ensureShapeMeshVertexBuffer(state, buffers, meshIndex, byteLength) {
|
|
162
164
|
const size = Math.max(8, byteLength);
|
|
163
|
-
|
|
164
|
-
|
|
165
|
+
let buffer = buffers.vertexBuffers[meshIndex];
|
|
166
|
+
if (buffer === undefined || (buffers.vertexCapacities[meshIndex] ?? 0) < size) {
|
|
167
|
+
if (buffer !== undefined) {
|
|
165
168
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
166
|
-
(runtime.retiredBuffers ?? (runtime.retiredBuffers = [])).push(
|
|
169
|
+
(runtime.retiredBuffers ?? (runtime.retiredBuffers = [])).push(buffer);
|
|
167
170
|
}
|
|
168
|
-
|
|
171
|
+
buffer = state.device.createBuffer({
|
|
169
172
|
size,
|
|
170
173
|
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
171
174
|
});
|
|
172
|
-
buffers.
|
|
175
|
+
buffers.vertexBuffers[meshIndex] = buffer;
|
|
176
|
+
buffers.vertexCapacities[meshIndex] = size;
|
|
173
177
|
}
|
|
174
|
-
return
|
|
178
|
+
return buffer;
|
|
175
179
|
}
|
|
176
180
|
// Column-major mat3x3f = projection · worldTransform, mapping shape-local points to clip space exactly as
|
|
177
181
|
// webgpuClipContours/webgpuDraw build it (so the fill lands in identical clip space). Each column is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuShapeMesh.js","sourceRoot":"","sources":["../src/wgpuShapeMesh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAS9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,gGAAgG;AAChG,uGAAuG;AACvG,0GAA0G;AAC1G,uGAAuG;AACvG,uGAAuG;AACvG,
|
|
1
|
+
{"version":3,"file":"wgpuShapeMesh.js","sourceRoot":"","sources":["../src/wgpuShapeMesh.ts"],"names":[],"mappings":"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"}
|
package/dist/wgpuSprite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuSprite.d.ts","sourceRoot":"","sources":["../src/wgpuSprite.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAU,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWxG,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CA8DvF;AAED,eAAO,MAAM,yBAAyB,EAAE,
|
|
1
|
+
{"version":3,"file":"wgpuSprite.d.ts","sourceRoot":"","sources":["../src/wgpuSprite.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAU,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWxG,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CA8DvF;AAED,eAAO,MAAM,yBAAyB,EAAE,eAKvC,CAAC"}
|
package/dist/wgpuSprite.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getWgpuRenderStateRuntime, resolveWgpuMaterialRenderer, resolveWgpuShader, resolveWgpuTexture, } from '@flighthq/render-wgpu/contract';
|
|
2
|
-
import {
|
|
2
|
+
import { createSpriteRendererData, isSpriteRendererDirty } from '@flighthq/scene2d/contract';
|
|
3
3
|
import { getTextureHeight, getTextureWidth, hasTextureSource } from '@flighthq/texture/contract';
|
|
4
4
|
import { BatchFormat } from '@flighthq/types/contract';
|
|
5
5
|
import { ensureWgpuQuadBatchResources, flushWgpuQuadBatchWriter, packWgpuQuadBatchMaterialInstance, prepareWgpuQuadBatchWrite, recordWgpuQuadBatchColorScaleBias, } from './wgpuQuadBatchWriter';
|
|
@@ -62,7 +62,8 @@ export function drawWgpuSprite(state, renderProxy) {
|
|
|
62
62
|
}
|
|
63
63
|
export const defaultWgpuSpriteRenderer = {
|
|
64
64
|
format: BatchFormat.Quad,
|
|
65
|
-
createData:
|
|
65
|
+
createData: createSpriteRendererData,
|
|
66
|
+
isDirty: isSpriteRendererDirty,
|
|
66
67
|
submit: drawWgpuSprite,
|
|
67
68
|
};
|
|
68
69
|
//# sourceMappingURL=wgpuSprite.js.map
|
package/dist/wgpuSprite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuSprite.js","sourceRoot":"","sources":["../src/wgpuSprite.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"wgpuSprite.js","sourceRoot":"","sources":["../src/wgpuSprite.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/scene2d-wgpu",
|
|
3
|
-
"version": "0.3.0-next.
|
|
3
|
+
"version": "0.3.0-next.1248.f867198",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,23 +36,23 @@
|
|
|
36
36
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@flighthq/color": "0.3.0-next.
|
|
40
|
-
"@flighthq/scene2d": "0.3.0-next.
|
|
41
|
-
"@flighthq/scene2d-canvas": "0.3.0-next.
|
|
42
|
-
"@flighthq/geometry": "0.3.0-next.
|
|
43
|
-
"@flighthq/image": "0.3.0-next.
|
|
44
|
-
"@flighthq/log": "0.3.0-next.
|
|
45
|
-
"@flighthq/node": "0.3.0-next.
|
|
46
|
-
"@flighthq/path": "0.3.0-next.
|
|
47
|
-
"@flighthq/render": "0.3.0-next.
|
|
48
|
-
"@flighthq/render-wgpu": "0.3.0-next.
|
|
49
|
-
"@flighthq/shape": "0.3.0-next.
|
|
50
|
-
"@flighthq/text": "0.3.0-next.
|
|
51
|
-
"@flighthq/textinput": "0.3.0-next.
|
|
52
|
-
"@flighthq/textlayout": "0.3.0-next.
|
|
53
|
-
"@flighthq/texture": "0.3.0-next.
|
|
54
|
-
"@flighthq/types": "0.3.0-next.
|
|
55
|
-
"@flighthq/velocity": "0.3.0-next.
|
|
39
|
+
"@flighthq/color": "0.3.0-next.1248.f867198",
|
|
40
|
+
"@flighthq/scene2d": "0.3.0-next.1248.f867198",
|
|
41
|
+
"@flighthq/scene2d-canvas": "0.3.0-next.1248.f867198",
|
|
42
|
+
"@flighthq/geometry": "0.3.0-next.1248.f867198",
|
|
43
|
+
"@flighthq/image": "0.3.0-next.1248.f867198",
|
|
44
|
+
"@flighthq/log": "0.3.0-next.1248.f867198",
|
|
45
|
+
"@flighthq/node": "0.3.0-next.1248.f867198",
|
|
46
|
+
"@flighthq/path": "0.3.0-next.1248.f867198",
|
|
47
|
+
"@flighthq/render": "0.3.0-next.1248.f867198",
|
|
48
|
+
"@flighthq/render-wgpu": "0.3.0-next.1248.f867198",
|
|
49
|
+
"@flighthq/shape": "0.3.0-next.1248.f867198",
|
|
50
|
+
"@flighthq/text": "0.3.0-next.1248.f867198",
|
|
51
|
+
"@flighthq/textinput": "0.3.0-next.1248.f867198",
|
|
52
|
+
"@flighthq/textlayout": "0.3.0-next.1248.f867198",
|
|
53
|
+
"@flighthq/texture": "0.3.0-next.1248.f867198",
|
|
54
|
+
"@flighthq/types": "0.3.0-next.1248.f867198",
|
|
55
|
+
"@flighthq/velocity": "0.3.0-next.1248.f867198"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@flighthq/bitmaptext": "*",
|
package/src/wgpuShape.test.ts
CHANGED
|
@@ -3,8 +3,18 @@ import type * as FlightNodeModule from '@flighthq/node/contract';
|
|
|
3
3
|
import { renderWgpuBackground, submitWgpuRenderPass } from '@flighthq/render-wgpu/contract';
|
|
4
4
|
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
5
5
|
import { createWgpuRenderStateForTest, installWgpuMock } from '@flighthq/render-wgpu/contract';
|
|
6
|
+
import {
|
|
7
|
+
appendShapeBeginFill,
|
|
8
|
+
appendShapeEndFill,
|
|
9
|
+
appendShapePath,
|
|
10
|
+
appendShapeLineStyle,
|
|
11
|
+
appendShapeLineTo,
|
|
12
|
+
appendShapeMoveTo,
|
|
13
|
+
appendShapeRectangle,
|
|
14
|
+
createShape,
|
|
15
|
+
} from '@flighthq/shape/contract';
|
|
6
16
|
import type { RenderProxy2D } from '@flighthq/types/contract';
|
|
7
|
-
import { BatchFormat } from '@flighthq/types/contract';
|
|
17
|
+
import { BatchFormat, PathCommand } from '@flighthq/types/contract';
|
|
8
18
|
|
|
9
19
|
import { scopeModuleMocks } from './moduleMockTestHelper';
|
|
10
20
|
import type * as WgpuShapeModule from './wgpuShape';
|
|
@@ -50,6 +60,19 @@ function makeShapeProxy(data: Record<string, unknown> = {}, rendererData: unknow
|
|
|
50
60
|
} as unknown as RenderProxy2D;
|
|
51
61
|
}
|
|
52
62
|
|
|
63
|
+
function makeMeshPassSpy(): GPURenderPassEncoder {
|
|
64
|
+
return {
|
|
65
|
+
setPipeline: vi.fn(),
|
|
66
|
+
setBindGroup: vi.fn(),
|
|
67
|
+
setVertexBuffer: vi.fn(),
|
|
68
|
+
setIndexBuffer: vi.fn(),
|
|
69
|
+
setStencilReference: vi.fn(),
|
|
70
|
+
draw: vi.fn(),
|
|
71
|
+
drawIndexed: vi.fn(),
|
|
72
|
+
end: vi.fn(),
|
|
73
|
+
} as unknown as GPURenderPassEncoder;
|
|
74
|
+
}
|
|
75
|
+
|
|
53
76
|
describe('defaultWgpuShapeRenderer', () => {
|
|
54
77
|
it('declares BatchFormat.Quad', () => {
|
|
55
78
|
expect(defaultWgpuShapeRenderer.format).toBe(BatchFormat.Quad);
|
|
@@ -62,6 +85,73 @@ describe('defaultWgpuShapeRenderer', () => {
|
|
|
62
85
|
});
|
|
63
86
|
|
|
64
87
|
describe('drawWgpuShape', () => {
|
|
88
|
+
it('draws a solid fill and open solid stroke as GPU meshes in one shape', async () => {
|
|
89
|
+
const state = await createWgpuRenderStateForTest();
|
|
90
|
+
renderWgpuBackground(state);
|
|
91
|
+
getWgpuRenderStateRuntime(state).renderPass = makeMeshPassSpy();
|
|
92
|
+
const shape = createShape();
|
|
93
|
+
appendShapeBeginFill(shape, 0x00cc00);
|
|
94
|
+
appendShapeRectangle(shape, 8, 8, 32, 24);
|
|
95
|
+
appendShapeEndFill(shape);
|
|
96
|
+
appendShapeLineStyle(shape, 4, 0xff0000);
|
|
97
|
+
appendShapeMoveTo(shape, 8, 4);
|
|
98
|
+
appendShapeLineTo(shape, 40, 4);
|
|
99
|
+
const rendererData = defaultWgpuShapeRenderer.createData!(state, shape)!;
|
|
100
|
+
|
|
101
|
+
drawWgpuShape(state, makeShapeProxy({ commands: shape.data.commands, version: 1 }, rendererData));
|
|
102
|
+
|
|
103
|
+
const pass = getWgpuRenderStateRuntime(state).renderPass as unknown as {
|
|
104
|
+
drawIndexed: ReturnType<typeof vi.fn>;
|
|
105
|
+
};
|
|
106
|
+
expect(pass.drawIndexed).toHaveBeenCalledTimes(2);
|
|
107
|
+
expect(getWgpuRenderStateRuntime(state).quadBatchWriterCount).toBe(0);
|
|
108
|
+
submitWgpuRenderPass(state);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('draws a closed solid stroke ring as one GPU mesh', async () => {
|
|
112
|
+
const state = await createWgpuRenderStateForTest();
|
|
113
|
+
renderWgpuBackground(state);
|
|
114
|
+
getWgpuRenderStateRuntime(state).renderPass = makeMeshPassSpy();
|
|
115
|
+
const shape = createShape();
|
|
116
|
+
appendShapeLineStyle(shape, 8, 0xff0000);
|
|
117
|
+
appendShapeRectangle(shape, 8, 8, 32, 24);
|
|
118
|
+
const rendererData = defaultWgpuShapeRenderer.createData!(state, shape)!;
|
|
119
|
+
|
|
120
|
+
drawWgpuShape(state, makeShapeProxy({ commands: shape.data.commands, version: 1 }, rendererData));
|
|
121
|
+
|
|
122
|
+
const pass = getWgpuRenderStateRuntime(state).renderPass as unknown as {
|
|
123
|
+
drawIndexed: ReturnType<typeof vi.fn>;
|
|
124
|
+
};
|
|
125
|
+
expect(pass.drawIndexed).toHaveBeenCalledTimes(1);
|
|
126
|
+
expect(getWgpuRenderStateRuntime(state).quadBatchWriterCount).toBe(0);
|
|
127
|
+
submitWgpuRenderPass(state);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('falls back to the raster quad for a self-intersecting stroke centerline', async () => {
|
|
131
|
+
const state = await createWgpuRenderStateForTest();
|
|
132
|
+
renderWgpuBackground(state);
|
|
133
|
+
registerStandardWgpuMaterial(state);
|
|
134
|
+
const pass = makeMeshPassSpy();
|
|
135
|
+
getWgpuRenderStateRuntime(state).renderPass = pass;
|
|
136
|
+
const shape = createShape();
|
|
137
|
+
appendShapeLineStyle(shape, 8, 0xff0000);
|
|
138
|
+
appendShapePath(
|
|
139
|
+
shape,
|
|
140
|
+
[PathCommand.MOVE_TO, PathCommand.LINE_TO, PathCommand.LINE_TO, PathCommand.LINE_TO, PathCommand.CLOSE],
|
|
141
|
+
[8, 8, 40, 40, 8, 40, 40, 8],
|
|
142
|
+
'nonZero',
|
|
143
|
+
);
|
|
144
|
+
const rendererData = defaultWgpuShapeRenderer.createData!(state, shape)!;
|
|
145
|
+
const proxy = makeShapeProxy({ commands: shape.data.commands, version: 1 }, rendererData);
|
|
146
|
+
|
|
147
|
+
drawWgpuShape(state, proxy);
|
|
148
|
+
drawWgpuShape(state, proxy);
|
|
149
|
+
|
|
150
|
+
expect(pass.drawIndexed).not.toHaveBeenCalled();
|
|
151
|
+
expect(getWgpuRenderStateRuntime(state).quadBatchWriterCount).toBe(2);
|
|
152
|
+
submitWgpuRenderPass(state);
|
|
153
|
+
});
|
|
154
|
+
|
|
65
155
|
it('returns early without writing to batch when commands are empty', async () => {
|
|
66
156
|
const state = await createWgpuRenderStateForTest();
|
|
67
157
|
renderWgpuBackground(state);
|
|
@@ -20,12 +20,12 @@ const TRIANGLE: WgpuShapeMesh = {
|
|
|
20
20
|
|
|
21
21
|
function makeBuffers(): WgpuShapeMeshBuffers {
|
|
22
22
|
return {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
vertexBuffers: [],
|
|
24
|
+
vertexCapacities: [],
|
|
25
|
+
indexBuffers: [],
|
|
26
|
+
indexCapacities: [],
|
|
27
|
+
uniformBuffers: [],
|
|
28
|
+
bindGroups: [],
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -68,6 +68,20 @@ describe('drawWgpuShapeMeshes', () => {
|
|
|
68
68
|
expect(pass.drawIndexed).toHaveBeenCalledWith(3);
|
|
69
69
|
});
|
|
70
70
|
|
|
71
|
+
it('retains distinct GPU storage for every mesh recorded before submit', async () => {
|
|
72
|
+
const state = await makeState();
|
|
73
|
+
const buffers = makeBuffers();
|
|
74
|
+
|
|
75
|
+
drawWgpuShapeMeshes(state, makeProxy(), [TRIANGLE, { ...TRIANGLE, color: 0x0080ff }], buffers);
|
|
76
|
+
|
|
77
|
+
expect(buffers.vertexBuffers).toHaveLength(2);
|
|
78
|
+
expect(buffers.indexBuffers).toHaveLength(2);
|
|
79
|
+
expect(buffers.uniformBuffers).toHaveLength(2);
|
|
80
|
+
expect(buffers.vertexBuffers[0]).not.toBe(buffers.vertexBuffers[1]);
|
|
81
|
+
expect(buffers.indexBuffers[0]).not.toBe(buffers.indexBuffers[1]);
|
|
82
|
+
expect(buffers.uniformBuffers[0]).not.toBe(buffers.uniformBuffers[1]);
|
|
83
|
+
});
|
|
84
|
+
|
|
71
85
|
it('retires grown geometry buffers until the recorded frame is submitted', async () => {
|
|
72
86
|
const state = await makeState();
|
|
73
87
|
const buffers = makeBuffers();
|
|
@@ -83,7 +97,8 @@ describe('drawWgpuShapeMeshes', () => {
|
|
|
83
97
|
indices: new Uint16Array([0, 1, 2, 1, 3, 2]),
|
|
84
98
|
};
|
|
85
99
|
|
|
86
|
-
drawWgpuShapeMeshes(state, makeProxy(), [TRIANGLE
|
|
100
|
+
drawWgpuShapeMeshes(state, makeProxy(), [TRIANGLE], buffers);
|
|
101
|
+
drawWgpuShapeMeshes(state, makeProxy(), [larger], buffers);
|
|
87
102
|
|
|
88
103
|
const retired = getWgpuRenderStateRuntime(state).retiredBuffers!;
|
|
89
104
|
expect(retired).toHaveLength(2);
|
|
@@ -132,7 +147,7 @@ describe('drawWgpuShapeMeshes', () => {
|
|
|
132
147
|
|
|
133
148
|
drawWgpuShapeMeshes(state, makeProxy(createMatrix(), 0.5), [{ ...TRIANGLE, color: 0xffffff }], buffers);
|
|
134
149
|
|
|
135
|
-
const uniformData = writes.get(buffers.
|
|
150
|
+
const uniformData = writes.get(buffers.uniformBuffers[0]);
|
|
136
151
|
expect(uniformData).toBeDefined();
|
|
137
152
|
// Color occupies floats 12..15 (after the mat3x3f columns): premultiplied (0.5, 0.5, 0.5, 0.5).
|
|
138
153
|
const color = uniformData!.slice(12, 16);
|
package/src/wgpuSprite.test.ts
CHANGED
|
@@ -14,6 +14,7 @@ beforeAll(() => installWgpuMock());
|
|
|
14
14
|
describe('defaultWgpuSpriteRenderer', () => {
|
|
15
15
|
it('has createData and submit functions', () => {
|
|
16
16
|
expect(typeof defaultWgpuSpriteRenderer.createData).toBe('function');
|
|
17
|
+
expect(typeof defaultWgpuSpriteRenderer.isDirty).toBe('function');
|
|
17
18
|
expect(defaultWgpuSpriteRenderer.submit).toBe(drawWgpuSprite);
|
|
18
19
|
});
|
|
19
20
|
});
|