@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
package/dist/wgpuTextLabel.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { computeRgbHexString } from '@flighthq/color/contract';
|
|
2
|
-
import { createImageResource,
|
|
2
|
+
import { createImageResource, invalidateImageResource } from '@flighthq/image/contract';
|
|
3
3
|
import { getNodeLocalContentRevision } from '@flighthq/node/contract';
|
|
4
|
-
import { resolveWgpuMaterialRenderer } from '@flighthq/render-wgpu/contract';
|
|
4
|
+
import { bindWgpuImageResourceTexture, resolveWgpuMaterialRenderer } from '@flighthq/render-wgpu/contract';
|
|
5
5
|
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
6
6
|
import { computeTextFormatFontString } from '@flighthq/text/contract';
|
|
7
7
|
import { getTextLabelRuntime } from '@flighthq/text/contract';
|
|
8
8
|
import { computeTextLayout, createTextFormatRange, getTextLayoutResult } from '@flighthq/textlayout/contract';
|
|
9
9
|
import { BatchFormat } from '@flighthq/types/contract';
|
|
10
|
+
import { ensureWgpuQuadBatchResources, packWgpuQuadBatchMaterialInstance, prepareWgpuQuadBatchWrite, recordWgpuQuadBatchColorScaleBias, } from './wgpuQuadBatchWriter';
|
|
10
11
|
import { createWgpuRendererData, getWgpuRendererData } from './wgpuRendererData';
|
|
11
|
-
import { ensureWgpuQuadBatchResources, packWgpuSpriteBatchMaterialInstance, prepareWgpuSpriteBatchWrite, recordWgpuSpriteBatchColorScaleBias, } from './wgpuSpriteBatch';
|
|
12
12
|
function createWgpuTextLabelData(_state, _source) {
|
|
13
13
|
const canvas = document.createElement('canvas');
|
|
14
14
|
canvas.width = 1;
|
|
@@ -32,10 +32,10 @@ function destroyWgpuTextLabelData(state, data) {
|
|
|
32
32
|
const textLabelData = getWgpuRendererData(data);
|
|
33
33
|
if (textLabelData === null)
|
|
34
34
|
return;
|
|
35
|
-
const entry = runtime.
|
|
35
|
+
const entry = runtime.textureSourcePremultipliedTextureCache.get(textLabelData.image);
|
|
36
36
|
if (entry !== undefined) {
|
|
37
37
|
entry.texture.destroy();
|
|
38
|
-
runtime.
|
|
38
|
+
runtime.textureSourcePremultipliedTextureCache.delete(textLabelData.image);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
export function drawWgpuTextLabel(state, renderProxy) {
|
|
@@ -110,7 +110,7 @@ export function drawWgpuTextLabel(state, renderProxy) {
|
|
|
110
110
|
}
|
|
111
111
|
// Bump the resource version so the batch's version-aware cache re-uploads (recreating the GPU texture,
|
|
112
112
|
// which covers a physical-size change too).
|
|
113
|
-
|
|
113
|
+
invalidateImageResource(textData.image);
|
|
114
114
|
textData.logW = w;
|
|
115
115
|
textData.logH = h;
|
|
116
116
|
textData.lastPW = pw;
|
|
@@ -119,9 +119,12 @@ export function drawWgpuTextLabel(state, renderProxy) {
|
|
|
119
119
|
if (textData.logW <= 0 || textData.logH <= 0)
|
|
120
120
|
return;
|
|
121
121
|
ensureWgpuQuadBatchResources(state);
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
const textureEntry = bindWgpuImageResourceTexture(state, textData.image, false, true);
|
|
123
|
+
if (textureEntry === null)
|
|
124
|
+
return;
|
|
125
|
+
const startCount = runtime.quadBatchWriterCount;
|
|
126
|
+
const base = prepareWgpuQuadBatchWrite(state, textureEntry, null, renderProxy.blendMode, material, materialRenderer, 1);
|
|
127
|
+
const d = runtime.quadBatchWriterInstanceData;
|
|
125
128
|
const t = renderProxy.transform2D;
|
|
126
129
|
d[base] = t.a;
|
|
127
130
|
d[base + 1] = t.b;
|
|
@@ -136,9 +139,9 @@ export function drawWgpuTextLabel(state, renderProxy) {
|
|
|
136
139
|
d[base + 10] = 1;
|
|
137
140
|
d[base + 11] = 1;
|
|
138
141
|
d[base + 12] = renderProxy.alpha;
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
runtime.
|
|
142
|
+
packWgpuQuadBatchMaterialInstance(state, renderProxy.materialData, startCount);
|
|
143
|
+
recordWgpuQuadBatchColorScaleBias(state, renderProxy.colorMatrix ?? renderProxy.colorScaleBias, startCount);
|
|
144
|
+
runtime.quadBatchWriterCount++;
|
|
142
145
|
}
|
|
143
146
|
export const defaultWgpuTextLabelRenderer = {
|
|
144
147
|
format: BatchFormat.Quad,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuTextLabel.js","sourceRoot":"","sources":["../src/wgpuTextLabel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"wgpuTextLabel.js","sourceRoot":"","sources":["../src/wgpuTextLabel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuTilemap.d.ts","sourceRoot":"","sources":["../src/wgpuTilemap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuTilemap.d.ts","sourceRoot":"","sources":["../src/wgpuTilemap.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,0BAA0B,CAAC;AAsGlC,eAAO,MAAM,0BAA0B,EAAE,cAIxC,CAAC"}
|
package/dist/wgpuTilemap.js
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { resolveWgpuMaterialRenderer } from '@flighthq/render-wgpu/contract';
|
|
1
|
+
import { resolveWgpuMaterialRenderer, resolveWgpuTexture } from '@flighthq/render-wgpu/contract';
|
|
3
2
|
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
3
|
+
import { SCENE2D_WORKING_COLOR_SPACE } from '@flighthq/render/contract';
|
|
4
4
|
import { noopRendererData } from '@flighthq/render/contract';
|
|
5
|
+
import { getTextureHeight, getTextureWidth, hasTextureSource } from '@flighthq/texture/contract';
|
|
5
6
|
import { BatchFormat } from '@flighthq/types/contract';
|
|
6
|
-
import {
|
|
7
|
+
import { packWgpuQuadBatchMaterialInstance, prepareWgpuQuadBatchWrite, recordWgpuQuadBatchColorScaleBias, QUAD_BATCH_INSTANCE_FLOATS, } from './wgpuQuadBatchWriter';
|
|
7
8
|
// Each tile writes the 13 base instance floats; any material packs its own per-instance data.
|
|
8
|
-
const INSTANCE_STRIDE_FLOATS =
|
|
9
|
+
const INSTANCE_STRIDE_FLOATS = QUAD_BATCH_INSTANCE_FLOATS;
|
|
9
10
|
function submitWgpuTilemap(state, tilemapNode) {
|
|
10
11
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
11
12
|
if (runtime.renderPass === null)
|
|
12
13
|
return;
|
|
13
14
|
const source = tilemapNode.source;
|
|
14
|
-
const { columns, rows,
|
|
15
|
-
if (
|
|
16
|
-
return;
|
|
17
|
-
const atlas = tileset.atlas;
|
|
18
|
-
if (atlas === null || atlas.image === null || !hasImageResourcePixels(atlas.image))
|
|
15
|
+
const { atlas, columns, rows, tileHeight, tileWidth, tiles } = source.data;
|
|
16
|
+
if (atlas === null || atlas.texture === null || !hasTextureSource(atlas.texture))
|
|
19
17
|
return;
|
|
20
18
|
if (columns === 0 || rows === 0)
|
|
21
19
|
return;
|
|
@@ -23,19 +21,22 @@ function submitWgpuTilemap(state, tilemapNode) {
|
|
|
23
21
|
const materialRenderer = resolveWgpuMaterialRenderer(state, material);
|
|
24
22
|
if (materialRenderer === null)
|
|
25
23
|
return;
|
|
24
|
+
const texture = atlas.texture;
|
|
25
|
+
const textureEntry = resolveWgpuTexture(state, texture, true, SCENE2D_WORKING_COLOR_SPACE);
|
|
26
|
+
if (textureEntry === null)
|
|
27
|
+
return;
|
|
26
28
|
const nodeMaterialData = tilemapNode.materialData;
|
|
27
29
|
// Per-tile color adjustments, overriding the node-level tint for the tiles that carry one.
|
|
28
30
|
const perTileColorScaleBias = source.data.materialData;
|
|
29
31
|
const nodeColorScaleBias = tilemapNode.colorScaleBias;
|
|
30
32
|
const nodeColorMatrix = tilemapNode.colorMatrix;
|
|
31
|
-
const startCount = runtime.
|
|
32
|
-
const base =
|
|
33
|
+
const startCount = runtime.quadBatchWriterCount;
|
|
34
|
+
const base = prepareWgpuQuadBatchWrite(state, textureEntry, texture.sampler, tilemapNode.blendMode, material, materialRenderer, columns * rows);
|
|
33
35
|
const regions = atlas.regions;
|
|
34
36
|
const numRegions = regions.length;
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const instanceData = runtime.spriteBatchInstanceData;
|
|
37
|
+
const iw = 1 / Math.max(1, getTextureWidth(texture));
|
|
38
|
+
const ih = 1 / Math.max(1, getTextureHeight(texture));
|
|
39
|
+
const instanceData = runtime.quadBatchWriterInstanceData;
|
|
39
40
|
const pt = tilemapNode.transform2D;
|
|
40
41
|
const pa = pt.a, pb = pt.b, pc = pt.c, pd = pt.d, ptx = pt.tx, pty = pt.ty;
|
|
41
42
|
const alpha = tilemapNode.alpha;
|
|
@@ -64,17 +65,17 @@ function submitWgpuTilemap(state, tilemapNode) {
|
|
|
64
65
|
instanceData[writeBase + 10] = (region.x + region.width) * iw;
|
|
65
66
|
instanceData[writeBase + 11] = (region.y + region.height) * ih;
|
|
66
67
|
instanceData[writeBase + 12] = alpha;
|
|
67
|
-
|
|
68
|
+
packWgpuQuadBatchMaterialInstance(state, nodeMaterialData, startCount + drawCount);
|
|
68
69
|
// Per-tile tint overrides the node-level tint (null → the node's, itself possibly null → untinted).
|
|
69
70
|
const colorScaleBias = perTileColorScaleBias?.[row * columns + col] ??
|
|
70
71
|
nodeColorMatrix ??
|
|
71
72
|
nodeColorScaleBias;
|
|
72
|
-
|
|
73
|
+
recordWgpuQuadBatchColorScaleBias(state, colorScaleBias, startCount + drawCount);
|
|
73
74
|
writeBase += INSTANCE_STRIDE_FLOATS;
|
|
74
75
|
drawCount++;
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
|
-
runtime.
|
|
78
|
+
runtime.quadBatchWriterCount += drawCount;
|
|
78
79
|
}
|
|
79
80
|
export const defaultWgpuTilemapRenderer = {
|
|
80
81
|
format: BatchFormat.Quad,
|
package/dist/wgpuTilemap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuTilemap.js","sourceRoot":"","sources":["../src/wgpuTilemap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"wgpuTilemap.js","sourceRoot":"","sources":["../src/wgpuTilemap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AASjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,8FAA8F;AAC9F,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAE1D,SAAS,iBAAiB,CAAC,KAAsB,EAAE,WAA0B;IAC3E,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO;IAExC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAiB,CAAC;IAC7C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAE3E,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO;IACzF,IAAI,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO;IAExC,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;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAC3F,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO;IAClC,MAAM,gBAAgB,GAAG,WAAW,CAAC,YAAY,CAAC;IAClD,2FAA2F;IAC3F,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;IACvD,MAAM,kBAAkB,GAAG,WAAW,CAAC,cAAc,CAAC;IACtD,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAChD,MAAM,IAAI,GAAG,yBAAyB,CACpC,KAAK,EACL,YAAY,EACZ,OAAO,CAAC,OAAO,EACf,WAAW,CAAC,SAAS,EACrB,QAAQ,EACR,gBAAgB,EAChB,OAAO,GAAG,IAAI,CACf,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,OAAO,CAAC,2BAA2B,CAAC;IACzD,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC;IACnC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EACb,EAAE,GAAG,EAAE,CAAC,CAAC,EACT,EAAE,GAAG,EAAE,CAAC,CAAC,EACT,EAAE,GAAG,EAAE,CAAC,CAAC,EACT,GAAG,GAAG,EAAE,CAAC,EAAE,EACX,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;IACd,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IAEhC,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;QACpC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC;YACtC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,UAAU;gBAAE,SAAS;YACzC,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;gBAAE,SAAS;YAEtD,MAAM,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;YAC3B,MAAM,EAAE,GAAG,GAAG,GAAG,UAAU,CAAC;YAC5B,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YAC7B,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACjC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACjC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACjC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;YACtD,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;YACtD,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;YACxC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC;YACzC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;YAC5C,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;YAC5C,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC9D,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAC/D,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;YACrC,iCAAiC,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;YACnF,oGAAoG;YACpG,MAAM,cAAc,GACjB,qBAAqB,EAAE,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,CAInC;gBACT,eAAe;gBACf,kBAAkB,CAAC;YACrB,iCAAiC,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;YACjF,SAAS,IAAI,sBAAsB,CAAC;YACpC,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,CAAC,oBAAoB,IAAI,SAAS,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAmB;IACxD,MAAM,EAAE,WAAW,CAAC,IAAI;IACxB,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,iBAAiB;CAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/scene2d-wgpu",
|
|
3
|
-
"version": "0.3.0
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"author": "Joshua Granick and other contributors",
|
|
5
|
+
"license": "MIT",
|
|
4
6
|
"repository": {
|
|
5
7
|
"type": "git",
|
|
6
8
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,27 +38,29 @@
|
|
|
36
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
39
|
},
|
|
38
40
|
"dependencies": {
|
|
39
|
-
"@flighthq/color": "0.3.0
|
|
40
|
-
"@flighthq/scene2d": "0.3.0
|
|
41
|
-
"@flighthq/scene2d-canvas": "0.3.0
|
|
42
|
-
"@flighthq/geometry": "0.3.0
|
|
43
|
-
"@flighthq/image": "0.3.0
|
|
44
|
-
"@flighthq/log": "0.3.0
|
|
45
|
-
"@flighthq/node": "0.3.0
|
|
46
|
-
"@flighthq/path": "0.3.0
|
|
47
|
-
"@flighthq/render": "0.3.0
|
|
48
|
-
"@flighthq/render-wgpu": "0.3.0
|
|
49
|
-
"@flighthq/shape": "0.3.0
|
|
50
|
-
"@flighthq/text": "0.3.0
|
|
51
|
-
"@flighthq/textinput": "0.3.0
|
|
52
|
-
"@flighthq/textlayout": "0.3.0
|
|
53
|
-
"@flighthq/
|
|
54
|
-
"@flighthq/
|
|
41
|
+
"@flighthq/color": "0.3.0",
|
|
42
|
+
"@flighthq/scene2d": "0.3.0",
|
|
43
|
+
"@flighthq/scene2d-canvas": "0.3.0",
|
|
44
|
+
"@flighthq/geometry": "0.3.0",
|
|
45
|
+
"@flighthq/image": "0.3.0",
|
|
46
|
+
"@flighthq/log": "0.3.0",
|
|
47
|
+
"@flighthq/node": "0.3.0",
|
|
48
|
+
"@flighthq/path": "0.3.0",
|
|
49
|
+
"@flighthq/render": "0.3.0",
|
|
50
|
+
"@flighthq/render-wgpu": "0.3.0",
|
|
51
|
+
"@flighthq/shape": "0.3.0",
|
|
52
|
+
"@flighthq/text": "0.3.0",
|
|
53
|
+
"@flighthq/textinput": "0.3.0",
|
|
54
|
+
"@flighthq/textlayout": "0.3.0",
|
|
55
|
+
"@flighthq/texture": "0.3.0",
|
|
56
|
+
"@flighthq/types": "0.3.0",
|
|
57
|
+
"@flighthq/velocity": "0.3.0"
|
|
55
58
|
},
|
|
56
59
|
"devDependencies": {
|
|
57
60
|
"@flighthq/bitmaptext": "*",
|
|
58
61
|
"@flighthq/particleemitter": "*",
|
|
59
|
-
"@flighthq/
|
|
62
|
+
"@flighthq/quadbatch": "*",
|
|
63
|
+
"@flighthq/tilemap": "*",
|
|
60
64
|
"@webgpu/types": "*",
|
|
61
65
|
"typescript": "^5.3.0"
|
|
62
66
|
},
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
areWgpuColorAdjustmentGuardsEnabled,
|
|
8
8
|
enableWgpuColorAdjustmentGuards,
|
|
9
9
|
} from './enableWgpuColorAdjustmentGuards';
|
|
10
|
-
import {
|
|
10
|
+
import { recordWgpuQuadBatchColorScaleBias } from './wgpuQuadBatchWriter';
|
|
11
11
|
|
|
12
12
|
beforeAll(() => {
|
|
13
13
|
installWgpuMock();
|
|
@@ -42,7 +42,7 @@ describe('enableWgpuColorAdjustmentGuards', () => {
|
|
|
42
42
|
addLogSink(sink.sink);
|
|
43
43
|
try {
|
|
44
44
|
enableWgpuColorAdjustmentGuards(state);
|
|
45
|
-
|
|
45
|
+
recordWgpuQuadBatchColorScaleBias(state, ct(), 0);
|
|
46
46
|
const entries = getMemoryLogSinkEntries(sink);
|
|
47
47
|
expect(entries.length).toBe(1);
|
|
48
48
|
const data = entries[0].data as Record<string, unknown>;
|
|
@@ -58,7 +58,7 @@ describe('enableWgpuColorAdjustmentGuards', () => {
|
|
|
58
58
|
addLogSink(sink.sink);
|
|
59
59
|
try {
|
|
60
60
|
enableWgpuColorAdjustmentGuards(state);
|
|
61
|
-
|
|
61
|
+
recordWgpuQuadBatchColorScaleBias(state, null, 0);
|
|
62
62
|
expect(getMemoryLogSinkEntries(sink).length).toBe(0);
|
|
63
63
|
} finally {
|
|
64
64
|
removeLogSink(sink.sink);
|
|
@@ -78,7 +78,7 @@ describe('enableWgpuColorAdjustmentGuards', () => {
|
|
|
78
78
|
record: () => {},
|
|
79
79
|
resolveFlush: () => null,
|
|
80
80
|
};
|
|
81
|
-
|
|
81
|
+
recordWgpuQuadBatchColorScaleBias(state, ct(), 0);
|
|
82
82
|
expect(getMemoryLogSinkEntries(sink).length).toBe(0);
|
|
83
83
|
} finally {
|
|
84
84
|
removeLogSink(sink.sink);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { tessellateStrokePath } from '@flighthq/path/contract';
|
|
2
|
+
import {
|
|
3
|
+
createWgpuRenderStateForTest,
|
|
4
|
+
getWgpuRenderStateRuntime,
|
|
5
|
+
installWgpuMock,
|
|
6
|
+
} from '@flighthq/render-wgpu/contract';
|
|
7
|
+
|
|
8
|
+
import { enableWgpuStrokePathTessellation } from './enableWgpuStrokePathTessellation';
|
|
9
|
+
|
|
10
|
+
beforeAll(() => {
|
|
11
|
+
installWgpuMock();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
describe('enableWgpuStrokePathTessellation', () => {
|
|
15
|
+
it('installs the full stroke tessellator on the render state', async () => {
|
|
16
|
+
const state = await createWgpuRenderStateForTest();
|
|
17
|
+
expect(getWgpuRenderStateRuntime(state).strokeTessellator).toBeNull();
|
|
18
|
+
|
|
19
|
+
enableWgpuStrokePathTessellation(state);
|
|
20
|
+
|
|
21
|
+
expect(getWgpuRenderStateRuntime(state).strokeTessellator).toBe(tessellateStrokePath);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -4,7 +4,7 @@ import { createWgpuRenderStateForTest, installWgpuMock } from '@flighthq/render-
|
|
|
4
4
|
import { getRenderProxy2D, prepareScene2DRender } from '@flighthq/render/contract';
|
|
5
5
|
|
|
6
6
|
import { defaultWgpuBitmapTextRenderer } from './wgpuBitmapText';
|
|
7
|
-
import {
|
|
7
|
+
import { flushWgpuQuadBatchWriter } from './wgpuQuadBatchWriter';
|
|
8
8
|
|
|
9
9
|
beforeAll(() => {
|
|
10
10
|
installWgpuMock();
|
|
@@ -29,7 +29,7 @@ describe('defaultWgpuBitmapTextRenderer.submit', () => {
|
|
|
29
29
|
|
|
30
30
|
expect(() => {
|
|
31
31
|
defaultWgpuBitmapTextRenderer.submit(state, renderProxy);
|
|
32
|
-
|
|
32
|
+
flushWgpuQuadBatchWriter(state as never);
|
|
33
33
|
}).not.toThrow();
|
|
34
34
|
submitWgpuRenderPass(state);
|
|
35
35
|
});
|
package/src/wgpuCache.test.ts
CHANGED
|
@@ -8,10 +8,10 @@ import { EntityRuntimeKey } from '@flighthq/types/contract';
|
|
|
8
8
|
import { scopeModuleMocks } from './moduleMockTestHelper';
|
|
9
9
|
import type * as WgpuCacheModule from './wgpuCache';
|
|
10
10
|
import type * as WgpuNode2DModule from './wgpuNode2D';
|
|
11
|
-
import type * as
|
|
11
|
+
import type * as WgpuQuadBatchWriterModule from './wgpuQuadBatchWriter';
|
|
12
12
|
|
|
13
13
|
// The GPU render-target lifecycle (@flighthq/render-wgpu) and the two local collaborators
|
|
14
|
-
// ./
|
|
14
|
+
// ./wgpuQuadBatchWriter and ./wgpuNode2D are stubbed so cache orchestration can be unit-tested
|
|
15
15
|
// without a real GPU pipeline: createWgpuRenderTarget returns a plain descriptor, and the composite,
|
|
16
16
|
// batch-flush, and subtree-render calls become spies for the call and ordering assertions below.
|
|
17
17
|
// The mocks are scoped to this file's dynamic import of ./wgpuCache and unmocked in afterAll, so
|
|
@@ -33,18 +33,18 @@ let destroyWgpuRenderTarget: typeof WgpuRenderWgpuModule.destroyWgpuRenderTarget
|
|
|
33
33
|
let drawWgpuRenderTargetResult: typeof WgpuRenderWgpuModule.drawWgpuRenderTargetResult;
|
|
34
34
|
let submitWgpuRenderPass: typeof WgpuRenderWgpuModule.submitWgpuRenderPass;
|
|
35
35
|
let renderWgpuScene2D: typeof WgpuNode2DModule.renderWgpuScene2D;
|
|
36
|
-
let
|
|
36
|
+
let flushWgpuQuadBatchWriter: typeof WgpuQuadBatchWriterModule.flushWgpuQuadBatchWriter;
|
|
37
37
|
|
|
38
38
|
// EntityRuntimeKey (Symbol.for) and RenderCacheKind (a string) are identity-stable across the
|
|
39
39
|
// registry reset scopeModuleMocks performs, and cache adapters are stored on the state, not module-
|
|
40
40
|
// level, so the statically-imported @flighthq/render still interoperates with the re-evaluated
|
|
41
41
|
// subject even though the subject re-imports @flighthq/render under the reset.
|
|
42
|
-
scopeModuleMocks(['./
|
|
42
|
+
scopeModuleMocks(['./wgpuQuadBatchWriter', '@flighthq/render-wgpu', './wgpuNode2D']);
|
|
43
43
|
|
|
44
44
|
beforeAll(async () => {
|
|
45
|
-
vi.doMock('./
|
|
46
|
-
const actual = await importOriginal<typeof
|
|
47
|
-
return { ...actual,
|
|
45
|
+
vi.doMock('./wgpuQuadBatchWriter', async (importOriginal) => {
|
|
46
|
+
const actual = await importOriginal<typeof WgpuQuadBatchWriterModule>();
|
|
47
|
+
return { ...actual, flushWgpuQuadBatchWriter: vi.fn() };
|
|
48
48
|
});
|
|
49
49
|
vi.doMock('@flighthq/render-wgpu/contract', async (importOriginal) => {
|
|
50
50
|
const actual = await importOriginal<typeof WgpuRenderWgpuModule>();
|
|
@@ -95,7 +95,7 @@ beforeAll(async () => {
|
|
|
95
95
|
getWgpuRenderStateRuntime,
|
|
96
96
|
submitWgpuRenderPass,
|
|
97
97
|
} = await import('@flighthq/render-wgpu/contract'));
|
|
98
|
-
({
|
|
98
|
+
({ flushWgpuQuadBatchWriter } = await import('./wgpuQuadBatchWriter'));
|
|
99
99
|
({ renderWgpuScene2D } = await import('./wgpuNode2D'));
|
|
100
100
|
({
|
|
101
101
|
createWgpuCacheState,
|
|
@@ -126,6 +126,8 @@ function makeCacheNode(source: unknown): any {
|
|
|
126
126
|
describe('createWgpuCacheState', () => {
|
|
127
127
|
it('copies renderers and shares the GPU device but keeps its own node map', () => {
|
|
128
128
|
const screen = fakeScreen();
|
|
129
|
+
const resolver = vi.fn();
|
|
130
|
+
getWgpuRenderStateRuntime(screen).colorAdjustmentResolver = resolver;
|
|
129
131
|
enableWgpuRenderCache(screen);
|
|
130
132
|
const cacheState = createWgpuCacheState(screen);
|
|
131
133
|
expect(getWgpuRenderStateRuntime(cacheState).rendererMap.get(RenderCacheKind)).toBe(defaultWgpuRenderCacheRenderer);
|
|
@@ -133,6 +135,7 @@ describe('createWgpuCacheState', () => {
|
|
|
133
135
|
expect(getWgpuRenderStateRuntime(cacheState).renderProxyMap).not.toBe(
|
|
134
136
|
getWgpuRenderStateRuntime(screen).renderProxyMap,
|
|
135
137
|
);
|
|
138
|
+
expect(getWgpuRenderStateRuntime(cacheState).colorAdjustmentResolver).toBe(resolver);
|
|
136
139
|
});
|
|
137
140
|
});
|
|
138
141
|
|
|
@@ -160,11 +163,11 @@ describe('defaultWgpuRenderCacheRenderer', () => {
|
|
|
160
163
|
useRenderCache(state, obj, cache);
|
|
161
164
|
ensureWgpuRenderCacheTarget(state, cache, 16, 16);
|
|
162
165
|
defaultWgpuRenderCacheRenderer.submit(state, makeCacheNode(obj));
|
|
163
|
-
// The composite draws an immediate quad outside the
|
|
166
|
+
// The composite draws an immediate quad outside the quad-batch writer; geometry submitted earlier in
|
|
164
167
|
// the walk must be drained first, or the immediate quad interleaves with the un-flushed batch's
|
|
165
168
|
// instance buffer and bind-group state and corrupts it.
|
|
166
|
-
expect(
|
|
167
|
-
expect((
|
|
169
|
+
expect(flushWgpuQuadBatchWriter).toHaveBeenCalledWith(state);
|
|
170
|
+
expect((flushWgpuQuadBatchWriter as any).mock.invocationCallOrder[0]).toBeLessThan(
|
|
168
171
|
(drawWgpuRenderTargetResult as any).mock.invocationCallOrder[0],
|
|
169
172
|
);
|
|
170
173
|
});
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { createImageResource } from '@flighthq/image/contract';
|
|
2
1
|
import { renderWgpuBackground, submitWgpuRenderPass } from '@flighthq/render-wgpu/contract';
|
|
3
2
|
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu/contract';
|
|
4
3
|
import { createWgpuRenderStateForTest, installWgpuMock } from '@flighthq/render-wgpu/contract';
|
|
4
|
+
import { areColorAdjustmentsEnabled } from '@flighthq/render/contract';
|
|
5
5
|
import type { ColorScaleBias } from '@flighthq/types/contract';
|
|
6
6
|
|
|
7
7
|
import { registerWgpuColorAdjustmentMaterialFeature } from './wgpuColorAdjustmentMaterialFeature';
|
|
8
8
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
} from './
|
|
9
|
+
flushWgpuQuadBatchWriter,
|
|
10
|
+
prepareWgpuQuadBatchWrite,
|
|
11
|
+
recordWgpuQuadBatchColorScaleBias,
|
|
12
|
+
} from './wgpuQuadBatchWriter';
|
|
13
13
|
import { standardWgpuMaterialRenderer } from './wgpuStandardMaterial';
|
|
14
14
|
|
|
15
15
|
beforeAll(() => {
|
|
@@ -50,8 +50,10 @@ describe('registerWgpuColorAdjustmentMaterialFeature', () => {
|
|
|
50
50
|
const state = await createWgpuRenderStateForTest();
|
|
51
51
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
52
52
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
53
|
+
expect(areColorAdjustmentsEnabled(state)).toBe(true);
|
|
53
54
|
expect(runtime.wgpuColorAdjustmentMaterialFeature).toBeDefined();
|
|
54
55
|
expect(runtime.wgpuColorAdjustmentMaterialFeature).not.toBeNull();
|
|
56
|
+
expect(runtime.wgpuColorAdjustmentMaterialFeature?.drawShapeMeshes).toBeTypeOf('function');
|
|
55
57
|
});
|
|
56
58
|
|
|
57
59
|
it('is idempotent', async () => {
|
|
@@ -67,11 +69,11 @@ describe('registerWgpuColorAdjustmentMaterialFeature', () => {
|
|
|
67
69
|
const state = await createWgpuRenderStateForTest();
|
|
68
70
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
69
71
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
expect(runtime.
|
|
73
|
-
expect(runtime.
|
|
74
|
-
expect(runtime.
|
|
72
|
+
recordWgpuQuadBatchColorScaleBias(state, null, 0);
|
|
73
|
+
recordWgpuQuadBatchColorScaleBias(state, null, 1);
|
|
74
|
+
expect(runtime.quadBatchWriterColorScaleBiasMode).toBe(CT_MODE_NONE);
|
|
75
|
+
expect(runtime.quadBatchWriterColorTintData).toBeUndefined();
|
|
76
|
+
expect(runtime.quadBatchWriterColorScaleBiasData).toBeUndefined();
|
|
75
77
|
});
|
|
76
78
|
|
|
77
79
|
it('uses one whole-batch uniform when every instance shares one tint', async () => {
|
|
@@ -79,33 +81,33 @@ describe('registerWgpuColorAdjustmentMaterialFeature', () => {
|
|
|
79
81
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
80
82
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
81
83
|
const tint = ct(0.5);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
expect(runtime.
|
|
85
|
-
expect(runtime.
|
|
84
|
+
recordWgpuQuadBatchColorScaleBias(state, tint, 0);
|
|
85
|
+
recordWgpuQuadBatchColorScaleBias(state, tint, 1);
|
|
86
|
+
expect(runtime.quadBatchWriterColorScaleBiasMode).toBe(CT_MODE_UNIFORM);
|
|
87
|
+
expect(runtime.quadBatchWriterUniformColorScaleBias).toBe(tint);
|
|
86
88
|
});
|
|
87
89
|
|
|
88
90
|
it('promotes varying multiply-only tints to packed RGBA8 without splitting', async () => {
|
|
89
91
|
const state = await createWgpuRenderStateForTest();
|
|
90
92
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
91
93
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
expect(runtime.
|
|
95
|
-
expect(Array.from(new Uint8Array(runtime.
|
|
94
|
+
recordWgpuQuadBatchColorScaleBias(state, ct(0.5), 0);
|
|
95
|
+
recordWgpuQuadBatchColorScaleBias(state, ct(0.25), 1);
|
|
96
|
+
expect(runtime.quadBatchWriterColorScaleBiasMode).toBe(CT_MODE_PACKED_TINT);
|
|
97
|
+
expect(Array.from(new Uint8Array(runtime.quadBatchWriterColorTintData!.buffer, 0, 8))).toEqual([
|
|
96
98
|
128, 255, 255, 255, 64, 255, 255, 255,
|
|
97
99
|
]);
|
|
98
|
-
expect(runtime.
|
|
100
|
+
expect(runtime.quadBatchWriterColorScaleBiasData).toBeUndefined();
|
|
99
101
|
});
|
|
100
102
|
|
|
101
103
|
it('promotes with identity fill when a tinted instance follows an untinted one', async () => {
|
|
102
104
|
const state = await createWgpuRenderStateForTest();
|
|
103
105
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
104
106
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
expect(runtime.
|
|
108
|
-
expect(Array.from(new Uint8Array(runtime.
|
|
107
|
+
recordWgpuQuadBatchColorScaleBias(state, null, 0);
|
|
108
|
+
recordWgpuQuadBatchColorScaleBias(state, ct(0.5), 1);
|
|
109
|
+
expect(runtime.quadBatchWriterColorScaleBiasMode).toBe(CT_MODE_PACKED_TINT);
|
|
110
|
+
expect(Array.from(new Uint8Array(runtime.quadBatchWriterColorTintData!.buffer, 0, 8))).toEqual([
|
|
109
111
|
255, 255, 255, 255, 128, 255, 255, 255,
|
|
110
112
|
]);
|
|
111
113
|
});
|
|
@@ -115,13 +117,17 @@ describe('registerWgpuColorAdjustmentMaterialFeature', () => {
|
|
|
115
117
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
116
118
|
renderWgpuBackground(state);
|
|
117
119
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
118
|
-
const tex =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
120
|
+
const tex = {
|
|
121
|
+
bindGroup: {} as GPUBindGroup,
|
|
122
|
+
texture: {} as GPUTexture,
|
|
123
|
+
view: {} as GPUTextureView,
|
|
124
|
+
};
|
|
125
|
+
prepareWgpuQuadBatchWrite(state, tex, null, null, null, standardWgpuMaterialRenderer, 2);
|
|
126
|
+
recordWgpuQuadBatchColorScaleBias(state, ct(0.5), 0);
|
|
127
|
+
recordWgpuQuadBatchColorScaleBias(state, ct(0.5), 1);
|
|
128
|
+
runtime.quadBatchWriterCount = 2;
|
|
129
|
+
flushWgpuQuadBatchWriter(state);
|
|
130
|
+
expect(Array.from(new Uint8Array(runtime.quadBatchWriterColorTintData!.buffer, 0, 8))).toEqual([
|
|
125
131
|
128, 255, 255, 255, 128, 255, 255, 255,
|
|
126
132
|
]);
|
|
127
133
|
submitWgpuRenderPass(state);
|
|
@@ -131,10 +137,10 @@ describe('registerWgpuColorAdjustmentMaterialFeature', () => {
|
|
|
131
137
|
const state = await createWgpuRenderStateForTest();
|
|
132
138
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
133
139
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
expect(runtime.
|
|
137
|
-
expect(Array.from(new Uint8Array(runtime.
|
|
140
|
+
recordWgpuQuadBatchColorScaleBias(state, null, 0);
|
|
141
|
+
recordWgpuQuadBatchColorScaleBias(state, { tint: 0x12345678 }, 1);
|
|
142
|
+
expect(runtime.quadBatchWriterColorScaleBiasMode).toBe(CT_MODE_PACKED_TINT);
|
|
143
|
+
expect(Array.from(new Uint8Array(runtime.quadBatchWriterColorTintData!.buffer, 4, 4))).toEqual([
|
|
138
144
|
0x12, 0x34, 0x56, 0x78,
|
|
139
145
|
]);
|
|
140
146
|
});
|
|
@@ -143,23 +149,23 @@ describe('registerWgpuColorAdjustmentMaterialFeature', () => {
|
|
|
143
149
|
const state = await createWgpuRenderStateForTest();
|
|
144
150
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
145
151
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
expect(runtime.
|
|
149
|
-
expect(runtime.
|
|
150
|
-
expect(runtime.
|
|
152
|
+
recordWgpuQuadBatchColorScaleBias(state, { tint: 0x808080ff }, 0);
|
|
153
|
+
recordWgpuQuadBatchColorScaleBias(state, ct(1, 1, 1, 1, 1), 1);
|
|
154
|
+
expect(runtime.quadBatchWriterColorScaleBiasMode).toBe(CT_MODE_PER_INSTANCE);
|
|
155
|
+
expect(runtime.quadBatchWriterColorScaleBiasData![0]).toBeCloseTo(128 / 255);
|
|
156
|
+
expect(runtime.quadBatchWriterColorScaleBiasData![12]).toBe(1);
|
|
151
157
|
});
|
|
152
158
|
|
|
153
159
|
it('widens to a 20-float matrix stream only when channel mixing appears', async () => {
|
|
154
160
|
const state = await createWgpuRenderStateForTest();
|
|
155
161
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
156
162
|
registerWgpuColorAdjustmentMaterialFeature(state);
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
expect(runtime.
|
|
160
|
-
expect(runtime.
|
|
161
|
-
expect(runtime.
|
|
162
|
-
expect(runtime.
|
|
163
|
-
expect(runtime.
|
|
163
|
+
recordWgpuQuadBatchColorScaleBias(state, { tint: 0x808080ff }, 0);
|
|
164
|
+
recordWgpuQuadBatchColorScaleBias(state, MIX_RED_GREEN, 1);
|
|
165
|
+
expect(runtime.quadBatchWriterColorScaleBiasMode).toBe(CT_MODE_MATRIX);
|
|
166
|
+
expect(runtime.quadBatchWriterColorMatrixData![0]).toBeCloseTo(128 / 255);
|
|
167
|
+
expect(runtime.quadBatchWriterColorMatrixData![20]).toBe(1);
|
|
168
|
+
expect(runtime.quadBatchWriterColorMatrixData![21]).toBe(0.5);
|
|
169
|
+
expect(runtime.quadBatchWriterColorMatrixData![36]).toBe(0.25);
|
|
164
170
|
});
|
|
165
171
|
});
|