@flighthq/effects-wgpu 0.2.0 → 0.2.1-next.423.3350e53
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/wgpuBevelEffect.d.ts.map +1 -1
- package/dist/wgpuBevelEffect.js +7 -5
- package/dist/wgpuBevelEffect.js.map +1 -1
- package/dist/wgpuDropShadowEffect.d.ts.map +1 -1
- package/dist/wgpuDropShadowEffect.js +7 -6
- package/dist/wgpuDropShadowEffect.js.map +1 -1
- package/dist/wgpuEffectBlitShader.d.ts +2 -0
- package/dist/wgpuEffectBlitShader.d.ts.map +1 -1
- package/dist/wgpuEffectBlitShader.js +26 -0
- package/dist/wgpuEffectBlitShader.js.map +1 -1
- package/dist/wgpuEffectBoxBlur.d.ts +1 -0
- package/dist/wgpuEffectBoxBlur.d.ts.map +1 -1
- package/dist/wgpuEffectBoxBlur.js +36 -11
- package/dist/wgpuEffectBoxBlur.js.map +1 -1
- package/dist/wgpuEffectPass.d.ts +4 -3
- package/dist/wgpuEffectPass.d.ts.map +1 -1
- package/dist/wgpuEffectPass.js +14 -2
- package/dist/wgpuEffectPass.js.map +1 -1
- package/dist/wgpuEffectTintShader.js +3 -3
- package/dist/wgpuEffectTintShader.js.map +1 -1
- package/dist/wgpuGradientBevelEffect.js +6 -4
- package/dist/wgpuGradientBevelEffect.js.map +1 -1
- package/dist/wgpuGradientGlowEffect.d.ts.map +1 -1
- package/dist/wgpuGradientGlowEffect.js +9 -3
- package/dist/wgpuGradientGlowEffect.js.map +1 -1
- package/dist/wgpuInnerGlowEffect.d.ts.map +1 -1
- package/dist/wgpuInnerGlowEffect.js +15 -2
- package/dist/wgpuInnerGlowEffect.js.map +1 -1
- package/dist/wgpuInnerShadowEffect.d.ts.map +1 -1
- package/dist/wgpuInnerShadowEffect.js +15 -2
- package/dist/wgpuInnerShadowEffect.js.map +1 -1
- package/dist/wgpuOuterGlowEffect.d.ts.map +1 -1
- package/dist/wgpuOuterGlowEffect.js +7 -4
- package/dist/wgpuOuterGlowEffect.js.map +1 -1
- package/dist/wgpuRenderEffectPipeline.d.ts.map +1 -1
- package/dist/wgpuRenderEffectPipeline.js +15 -6
- package/dist/wgpuRenderEffectPipeline.js.map +1 -1
- package/package.json +6 -6
- package/src/wgpuDropShadowEffect.test.ts +96 -0
- package/src/wgpuEffectBlitShader.test.ts +11 -1
- package/src/wgpuEffectBoxBlur.test.ts +68 -0
- package/src/wgpuEffectTintShader.test.ts +43 -0
- package/src/wgpuInnerGlowEffect.test.ts +124 -0
- package/src/wgpuInnerShadowEffect.test.ts +124 -0
- package/src/wgpuOuterGlowEffect.test.ts +95 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { acquireWgpuRenderTarget, releaseWgpuRenderTarget } from '@flighthq/render-wgpu';
|
|
2
|
-
import { applyWgpuEffectBlitPass } from './wgpuEffectBlitShader';
|
|
2
|
+
import { applyWgpuEffectBlitPass, applyWgpuEffectErasePass } from './wgpuEffectBlitShader';
|
|
3
3
|
import { applyWgpuEffectBoxBlur } from './wgpuEffectBoxBlur';
|
|
4
4
|
import { getWgpuEffectGradientRampTexture } from './wgpuEffectGradientRamp';
|
|
5
5
|
import { clearWgpuEffectTarget, EFFECT_VERTEX_WGSL, getWgpuEffectPassState } from './wgpuEffectPass';
|
|
6
6
|
import { applyWgpuEffectTintPass } from './wgpuEffectTintShader';
|
|
7
|
-
// Gradient-glow composite effect: an outer glow whose color is looked up from a colors/alphas/ratios gradient ramp indexed by the blurred silhouette alpha.
|
|
7
|
+
// Gradient-glow composite effect: an outer glow whose color is looked up from a colors/alphas/ratios gradient ramp indexed by the blurred silhouette alpha, then sourceMode decides source compositing.
|
|
8
8
|
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
9
9
|
// multi-pass recipe (neutral tint → box blur → gradient lookup → composite), then releases them.
|
|
10
10
|
export function applyGradientGlowEffectToWgpu(state, source, dest, pool, effect) {
|
|
@@ -16,6 +16,7 @@ export function applyGradientGlowEffectToWgpu(state, source, dest, pool, effect)
|
|
|
16
16
|
const s2 = acquireWgpuRenderTarget(state, pool, descriptor);
|
|
17
17
|
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
18
18
|
const strength = effect.strength ?? 1;
|
|
19
|
+
const sourceMode = effect.sourceMode ?? 'draw';
|
|
19
20
|
const { device } = state;
|
|
20
21
|
const fs = getWgpuEffectPassState(state);
|
|
21
22
|
applyWgpuEffectTintPass(state, src, s0, 0xffffff, 1, Math.min(1, strength));
|
|
@@ -51,7 +52,12 @@ export function applyGradientGlowEffectToWgpu(state, source, dest, pool, effect)
|
|
|
51
52
|
pass.end();
|
|
52
53
|
clearWgpuEffectTarget(state, dst);
|
|
53
54
|
applyWgpuEffectBlitPass(state, s0, dst);
|
|
54
|
-
|
|
55
|
+
if (sourceMode === 'knockout') {
|
|
56
|
+
applyWgpuEffectErasePass(state, src, dst);
|
|
57
|
+
}
|
|
58
|
+
else if (sourceMode === 'draw') {
|
|
59
|
+
applyWgpuEffectBlitPass(state, src, dst);
|
|
60
|
+
}
|
|
55
61
|
releaseWgpuRenderTarget(pool, s0);
|
|
56
62
|
releaseWgpuRenderTarget(pool, s1);
|
|
57
63
|
releaseWgpuRenderTarget(pool, s2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuGradientGlowEffect.js","sourceRoot":"","sources":["../src/wgpuGradientGlowEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AASzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"wgpuGradientGlowEffect.js","sourceRoot":"","sources":["../src/wgpuGradientGlowEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuInnerGlowEffect.d.ts","sourceRoot":"","sources":["../src/wgpuInnerGlowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,
|
|
1
|
+
{"version":3,"file":"wgpuInnerGlowEffect.d.ts","sourceRoot":"","sources":["../src/wgpuInnerGlowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAgCN;AAED,eAAO,MAAM,gCAAgC,EAAE,sBAE9C,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { applyWgpuEffectBlitPass } from './wgpuEffectBlitShader';
|
|
|
3
3
|
import { applyWgpuEffectBoxBlur } from './wgpuEffectBoxBlur';
|
|
4
4
|
import { clearWgpuEffectTarget } from './wgpuEffectPass';
|
|
5
5
|
import { applyWgpuEffectInnerClipPass, applyWgpuEffectInvertTintPass } from './wgpuEffectTintShader';
|
|
6
|
-
// Inner-glow composite effect: tint the inverted silhouette, blur inward, clip to the source alpha, then
|
|
6
|
+
// Inner-glow composite effect: tint the inverted silhouette, blur inward, clip to the source alpha, then apply draw/hide source compositing.
|
|
7
7
|
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
8
8
|
// multi-pass recipe (invert-tint → box blur → inner clip → composite), then releases them.
|
|
9
9
|
export function applyInnerGlowEffectToWgpu(state, source, dest, pool, effect) {
|
|
@@ -17,15 +17,19 @@ export function applyInnerGlowEffectToWgpu(state, source, dest, pool, effect) {
|
|
|
17
17
|
const alpha = effect.alpha ?? 1;
|
|
18
18
|
const strength = effect.strength ?? 1;
|
|
19
19
|
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
20
|
+
const sourceMode = effect.sourceMode ?? 'draw';
|
|
20
21
|
applyWgpuEffectInvertTintPass(state, src, s0, color, alpha, strength);
|
|
21
22
|
applyWgpuEffectBoxBlur(state, s0, s1, s2, {
|
|
22
23
|
blurX: effect.blurX ?? 6,
|
|
23
24
|
blurY: effect.blurY ?? 6,
|
|
25
|
+
edgeColor: getInvertTintEdgeColor(color, alpha, strength),
|
|
24
26
|
passes: quality,
|
|
25
27
|
});
|
|
26
28
|
applyWgpuEffectInnerClipPass(state, s1, src, s0);
|
|
27
29
|
clearWgpuEffectTarget(state, dst);
|
|
28
|
-
|
|
30
|
+
if (sourceMode === 'draw') {
|
|
31
|
+
applyWgpuEffectBlitPass(state, src, dst);
|
|
32
|
+
}
|
|
29
33
|
applyWgpuEffectBlitPass(state, s0, dst);
|
|
30
34
|
releaseWgpuRenderTarget(pool, s0);
|
|
31
35
|
releaseWgpuRenderTarget(pool, s1);
|
|
@@ -34,4 +38,13 @@ export function applyInnerGlowEffectToWgpu(state, source, dest, pool, effect) {
|
|
|
34
38
|
export const defaultWgpuInnerGlowEffectRunner = (ctx, effect) => {
|
|
35
39
|
applyInnerGlowEffectToWgpu(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
36
40
|
};
|
|
41
|
+
function getInvertTintEdgeColor(color, alpha, strength) {
|
|
42
|
+
const edgeAlpha = Math.min(1, alpha * strength);
|
|
43
|
+
return [
|
|
44
|
+
(((color >> 16) & 0xff) / 255) * edgeAlpha,
|
|
45
|
+
(((color >> 8) & 0xff) / 255) * edgeAlpha,
|
|
46
|
+
((color & 0xff) / 255) * edgeAlpha,
|
|
47
|
+
edgeAlpha,
|
|
48
|
+
];
|
|
49
|
+
}
|
|
37
50
|
//# sourceMappingURL=wgpuInnerGlowEffect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuInnerGlowEffect.js","sourceRoot":"","sources":["../src/wgpuInnerGlowEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AASzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAErG,
|
|
1
|
+
{"version":3,"file":"wgpuInnerGlowEffect.js","sourceRoot":"","sources":["../src/wgpuInnerGlowEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuInnerShadowEffect.d.ts","sourceRoot":"","sources":["../src/wgpuInnerShadowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAClC,IAAI,
|
|
1
|
+
{"version":3,"file":"wgpuInnerShadowEffect.d.ts","sourceRoot":"","sources":["../src/wgpuInnerShadowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAClC,IAAI,CAqCN;AAED,eAAO,MAAM,kCAAkC,EAAE,sBAEhD,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { applyWgpuEffectBlitOffsetPass, applyWgpuEffectBlitPass } from './wgpuEf
|
|
|
3
3
|
import { applyWgpuEffectBoxBlur } from './wgpuEffectBoxBlur';
|
|
4
4
|
import { clearWgpuEffectTarget } from './wgpuEffectPass';
|
|
5
5
|
import { applyWgpuEffectInnerClipPass, applyWgpuEffectInvertTintPass } from './wgpuEffectTintShader';
|
|
6
|
-
// Inner-shadow composite effect: tint the inverted silhouette, blur, offset by angle/distance, clip to the source alpha, then
|
|
6
|
+
// Inner-shadow composite effect: tint the inverted silhouette, blur, offset by angle/distance, clip to the source alpha, then apply draw/hide source compositing.
|
|
7
7
|
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
8
8
|
// multi-pass recipe (invert-tint → box blur → offset → inner clip → composite), then releases them.
|
|
9
9
|
export function applyInnerShadowEffectToWgpu(state, source, dest, pool, effect) {
|
|
@@ -21,16 +21,20 @@ export function applyInnerShadowEffectToWgpu(state, source, dest, pool, effect)
|
|
|
21
21
|
const alpha = effect.alpha ?? 1;
|
|
22
22
|
const strength = effect.strength ?? 1;
|
|
23
23
|
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
24
|
+
const sourceMode = effect.sourceMode ?? 'draw';
|
|
24
25
|
applyWgpuEffectInvertTintPass(state, src, s0, color, alpha, strength);
|
|
25
26
|
applyWgpuEffectBoxBlur(state, s0, s1, s2, {
|
|
26
27
|
blurX: effect.blurX ?? 4,
|
|
27
28
|
blurY: effect.blurY ?? 4,
|
|
29
|
+
edgeColor: getInvertTintEdgeColor(color, alpha, strength),
|
|
28
30
|
passes: quality,
|
|
29
31
|
});
|
|
30
32
|
applyWgpuEffectBlitOffsetPass(state, s1, s0, dx, dy);
|
|
31
33
|
applyWgpuEffectInnerClipPass(state, s0, src, s1);
|
|
32
34
|
clearWgpuEffectTarget(state, dst);
|
|
33
|
-
|
|
35
|
+
if (sourceMode === 'draw') {
|
|
36
|
+
applyWgpuEffectBlitPass(state, src, dst);
|
|
37
|
+
}
|
|
34
38
|
applyWgpuEffectBlitPass(state, s1, dst);
|
|
35
39
|
releaseWgpuRenderTarget(pool, s0);
|
|
36
40
|
releaseWgpuRenderTarget(pool, s1);
|
|
@@ -39,4 +43,13 @@ export function applyInnerShadowEffectToWgpu(state, source, dest, pool, effect)
|
|
|
39
43
|
export const defaultWgpuInnerShadowEffectRunner = (ctx, effect) => {
|
|
40
44
|
applyInnerShadowEffectToWgpu(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
41
45
|
};
|
|
46
|
+
function getInvertTintEdgeColor(color, alpha, strength) {
|
|
47
|
+
const edgeAlpha = Math.min(1, alpha * strength);
|
|
48
|
+
return [
|
|
49
|
+
(((color >> 16) & 0xff) / 255) * edgeAlpha,
|
|
50
|
+
(((color >> 8) & 0xff) / 255) * edgeAlpha,
|
|
51
|
+
((color & 0xff) / 255) * edgeAlpha,
|
|
52
|
+
edgeAlpha,
|
|
53
|
+
];
|
|
54
|
+
}
|
|
42
55
|
//# sourceMappingURL=wgpuInnerShadowEffect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuInnerShadowEffect.js","sourceRoot":"","sources":["../src/wgpuInnerShadowEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AASzF,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAErG,
|
|
1
|
+
{"version":3,"file":"wgpuInnerShadowEffect.js","sourceRoot":"","sources":["../src/wgpuInnerShadowEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuOuterGlowEffect.d.ts","sourceRoot":"","sources":["../src/wgpuOuterGlowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,
|
|
1
|
+
{"version":3,"file":"wgpuOuterGlowEffect.d.ts","sourceRoot":"","sources":["../src/wgpuOuterGlowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAUzB,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAsCN;AAED,eAAO,MAAM,gCAAgC,EAAE,sBAE9C,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { acquireWgpuRenderTarget, releaseWgpuRenderTarget } from '@flighthq/render-wgpu';
|
|
2
|
-
import { applyWgpuEffectBlitPass } from './wgpuEffectBlitShader';
|
|
2
|
+
import { applyWgpuEffectBlitPass, applyWgpuEffectErasePass } from './wgpuEffectBlitShader';
|
|
3
3
|
import { applyWgpuEffectBoxBlur } from './wgpuEffectBoxBlur';
|
|
4
4
|
import { clearWgpuEffectTarget } from './wgpuEffectPass';
|
|
5
5
|
import { applyWgpuEffectTintPass } from './wgpuEffectTintShader';
|
|
6
|
-
// Outer-glow composite effect: tint the scene silhouette, blur it centered (no offset), then
|
|
6
|
+
// Outer-glow composite effect: tint the scene silhouette, blur it centered (no offset), then apply sourceMode compositing.
|
|
7
7
|
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
8
8
|
// multi-pass recipe (tint → box blur → composite), then releases them.
|
|
9
9
|
export function applyOuterGlowEffectToWgpu(state, source, dest, pool, effect) {
|
|
@@ -17,7 +17,7 @@ export function applyOuterGlowEffectToWgpu(state, source, dest, pool, effect) {
|
|
|
17
17
|
const alpha = effect.alpha ?? 1;
|
|
18
18
|
const strength = effect.strength ?? 1;
|
|
19
19
|
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
20
|
-
const
|
|
20
|
+
const sourceMode = effect.sourceMode ?? 'draw';
|
|
21
21
|
const tintStrength = Math.min(1, strength);
|
|
22
22
|
const glowPasses = Math.max(1, Math.floor(strength));
|
|
23
23
|
applyWgpuEffectTintPass(state, src, mask, color, alpha, tintStrength);
|
|
@@ -30,7 +30,10 @@ export function applyOuterGlowEffectToWgpu(state, source, dest, pool, effect) {
|
|
|
30
30
|
for (let i = 0; i < glowPasses; i++) {
|
|
31
31
|
applyWgpuEffectBlitPass(state, blurred, dst);
|
|
32
32
|
}
|
|
33
|
-
if (
|
|
33
|
+
if (sourceMode === 'knockout') {
|
|
34
|
+
applyWgpuEffectErasePass(state, src, dst);
|
|
35
|
+
}
|
|
36
|
+
else if (sourceMode === 'draw') {
|
|
34
37
|
applyWgpuEffectBlitPass(state, src, dst);
|
|
35
38
|
}
|
|
36
39
|
releaseWgpuRenderTarget(pool, mask);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuOuterGlowEffect.js","sourceRoot":"","sources":["../src/wgpuOuterGlowEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AASzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"wgpuOuterGlowEffect.js","sourceRoot":"","sources":["../src/wgpuOuterGlowEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,2BAA2B,EAC3B,wBAAwB,EACxB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAmBzB,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAkB9G;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,QAAQ,CAAC,2BAA2B,CAAM,GAClD,wBAAwB,CAS1B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAYhH;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,wBAAwB,EAClC,UAAU,EAAE,aAAa,CAAC,YAAY,GAAG,UAAU,CAAC,GACnD,IAAI,CAwEN;AAID,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,UAAU,GAAG,IAAI,GACzB,IAAI,CAEN"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { bakeColorLutForRun, createColorLutCache, fuseColorMatrices, getAdjustmentColorMatrix, isColorLutAdjustment, } from '@flighthq/adjustments';
|
|
2
|
-
import {
|
|
3
|
-
import { acquireWgpuRenderTarget, beginWgpuRenderTarget, createWgpuRenderTarget, createWgpuRenderTargetPool, destroyWgpuRenderTarget, destroyWgpuRenderTargetPool, endWgpuRenderTarget, getWgpuRenderStateRuntime, releaseWgpuRenderTarget, resizeWgpuRenderTarget, } from '@flighthq/render-wgpu';
|
|
2
|
+
import { acquireWgpuRenderTarget, beginWgpuRenderPass, createWgpuRenderTarget, createWgpuRenderTargetPool, destroyWgpuRenderTarget, destroyWgpuRenderTargetPool, endWgpuRenderPass, getWgpuRenderStateRuntime, releaseWgpuRenderTarget, resizeWgpuRenderTarget, } from '@flighthq/render-wgpu';
|
|
4
3
|
import { applyColorLutPassToWgpu } from './wgpuColorLutPass';
|
|
5
4
|
import { applyColorMatrixPassToWgpu } from './wgpuColorMatrixPass';
|
|
6
5
|
import { drawWgpuEffectPass } from './wgpuEffectPass';
|
|
@@ -28,10 +27,12 @@ export function beginWgpuRenderEffectPipeline(state, pipeline) {
|
|
|
28
27
|
}
|
|
29
28
|
// Clear the scene target to the background colour (not transparent) so the background is part of the
|
|
30
29
|
// image the effects process and the replace-blend present composites — mirroring the Gl pipeline,
|
|
31
|
-
// where renderGlBackground draws into the scene target.
|
|
30
|
+
// where renderGlBackground draws into the scene target. The clear color is a target property now, so
|
|
31
|
+
// set it from the background before begin (default clear); the transform is inherited from the current
|
|
32
|
+
// pass rather than passed.
|
|
32
33
|
const rgba = state.backgroundColorRgba;
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
pipeline.sceneTarget.clearColors = rgba !== undefined && rgba.length >= 4 ? [packBackgroundClearColor(rgba)] : [];
|
|
35
|
+
beginWgpuRenderPass(state, pipeline.sceneTarget);
|
|
35
36
|
}
|
|
36
37
|
export function createWgpuRenderEffectPipeline(_state, options = {}) {
|
|
37
38
|
return {
|
|
@@ -61,7 +62,7 @@ export function endWgpuRenderEffectPipeline(state, pipeline, operations) {
|
|
|
61
62
|
if (scene === null)
|
|
62
63
|
return;
|
|
63
64
|
// Pop the scene render target; restores the canvas pass (loadOp 'load').
|
|
64
|
-
|
|
65
|
+
endWgpuRenderPass(state);
|
|
65
66
|
const format = scene.format;
|
|
66
67
|
const descriptor = { width: scene.width, height: scene.height, format };
|
|
67
68
|
let source = scene;
|
|
@@ -143,6 +144,14 @@ function presentWgpuRenderEffectResult(state, source) {
|
|
|
143
144
|
const pipeline = getWgpuEffectPipeline(state, 'effect.present', PRESENT_FRAGMENT_WGSL, 'replace');
|
|
144
145
|
drawWgpuEffectPass(state, source, null, pipeline, () => { });
|
|
145
146
|
}
|
|
147
|
+
// Packs a linear 0..1 RGBA background into the 0xRRGGBBAA integer WgpuRenderTarget.clearColors holds.
|
|
148
|
+
function packBackgroundClearColor(rgba) {
|
|
149
|
+
const r = Math.round((rgba[0] ?? 0) * 255) & 0xff;
|
|
150
|
+
const g = Math.round((rgba[1] ?? 0) * 255) & 0xff;
|
|
151
|
+
const b = Math.round((rgba[2] ?? 0) * 255) & 0xff;
|
|
152
|
+
const a = Math.round((rgba[3] ?? 0) * 255) & 0xff;
|
|
153
|
+
return ((r << 24) | (g << 16) | (b << 8) | a) >>> 0;
|
|
154
|
+
}
|
|
146
155
|
const PRESENT_FRAGMENT_WGSL = /* wgsl */ `
|
|
147
156
|
struct Uniforms { _u : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
|
|
148
157
|
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuRenderEffectPipeline.js","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,
|
|
1
|
+
{"version":3,"file":"wgpuRenderEffectPipeline.js","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/effects-wgpu",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1-next.423.3350e53",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@flighthq/adjustments": "0.2.
|
|
36
|
-
"@flighthq/effects": "0.2.
|
|
37
|
-
"@flighthq/geometry": "0.2.
|
|
38
|
-
"@flighthq/render-wgpu": "0.2.
|
|
39
|
-
"@flighthq/types": "0.2.
|
|
35
|
+
"@flighthq/adjustments": "0.2.1-next.423.3350e53",
|
|
36
|
+
"@flighthq/effects": "0.2.1-next.423.3350e53",
|
|
37
|
+
"@flighthq/geometry": "0.2.1-next.423.3350e53",
|
|
38
|
+
"@flighthq/render-wgpu": "0.2.1-next.423.3350e53",
|
|
39
|
+
"@flighthq/types": "0.2.1-next.423.3350e53"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"typescript": "^5.3.0"
|
|
@@ -1,9 +1,80 @@
|
|
|
1
|
+
vi.hoisted(() => {
|
|
2
|
+
vi.resetModules();
|
|
3
|
+
});
|
|
4
|
+
|
|
5
|
+
vi.mock('@flighthq/render-wgpu', () => {
|
|
6
|
+
let nextTargetId = 0;
|
|
7
|
+
return {
|
|
8
|
+
acquireWgpuRenderTarget: vi.fn((_state, _pool, descriptor) => ({
|
|
9
|
+
...descriptor,
|
|
10
|
+
id: `scratch-${nextTargetId++}`,
|
|
11
|
+
texture: {},
|
|
12
|
+
})),
|
|
13
|
+
releaseWgpuRenderTarget: vi.fn(),
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
vi.mock('./wgpuEffectBlitShader', () => ({
|
|
18
|
+
applyWgpuEffectBlitOffsetPass: vi.fn(),
|
|
19
|
+
applyWgpuEffectBlitPass: vi.fn(),
|
|
20
|
+
applyWgpuEffectErasePass: vi.fn(),
|
|
21
|
+
}));
|
|
22
|
+
|
|
23
|
+
vi.mock('./wgpuEffectBoxBlur', () => ({
|
|
24
|
+
applyWgpuEffectBoxBlur: vi.fn(),
|
|
25
|
+
}));
|
|
26
|
+
|
|
27
|
+
vi.mock('./wgpuEffectPass', () => ({
|
|
28
|
+
clearWgpuEffectTarget: vi.fn(),
|
|
29
|
+
}));
|
|
30
|
+
|
|
31
|
+
vi.mock('./wgpuEffectTintShader', () => ({
|
|
32
|
+
applyWgpuEffectTintPass: vi.fn(),
|
|
33
|
+
}));
|
|
34
|
+
|
|
1
35
|
import { applyDropShadowEffectToWgpu, defaultWgpuDropShadowEffectRunner } from './wgpuDropShadowEffect';
|
|
36
|
+
import { applyWgpuEffectBlitPass, applyWgpuEffectErasePass } from './wgpuEffectBlitShader';
|
|
2
37
|
|
|
3
38
|
describe('applyDropShadowEffectToWgpu', () => {
|
|
4
39
|
it('is a function', () => {
|
|
5
40
|
expect(typeof applyDropShadowEffectToWgpu).toBe('function');
|
|
6
41
|
});
|
|
42
|
+
|
|
43
|
+
it('draws the source by default', () => {
|
|
44
|
+
const source = createTarget('source');
|
|
45
|
+
const dest = createTarget('dest');
|
|
46
|
+
|
|
47
|
+
applyDropShadowEffectToWgpu(createState(), source, dest, createPool(), { kind: 'DropShadowEffect' });
|
|
48
|
+
|
|
49
|
+
expect(applyWgpuEffectBlitPass).toHaveBeenCalledWith(expect.anything(), source, dest);
|
|
50
|
+
expect(applyWgpuEffectErasePass).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('hides the source when sourceMode is hide', () => {
|
|
54
|
+
const source = createTarget('source');
|
|
55
|
+
const dest = createTarget('dest');
|
|
56
|
+
|
|
57
|
+
applyDropShadowEffectToWgpu(createState(), source, dest, createPool(), {
|
|
58
|
+
kind: 'DropShadowEffect',
|
|
59
|
+
sourceMode: 'hide',
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
expect(applyWgpuEffectBlitPass).not.toHaveBeenCalledWith(expect.anything(), source, dest);
|
|
63
|
+
expect(applyWgpuEffectErasePass).not.toHaveBeenCalled();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('erases the source silhouette when sourceMode is knockout', () => {
|
|
67
|
+
const source = createTarget('source');
|
|
68
|
+
const dest = createTarget('dest');
|
|
69
|
+
|
|
70
|
+
applyDropShadowEffectToWgpu(createState(), source, dest, createPool(), {
|
|
71
|
+
kind: 'DropShadowEffect',
|
|
72
|
+
sourceMode: 'knockout',
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
expect(applyWgpuEffectBlitPass).not.toHaveBeenCalledWith(expect.anything(), source, dest);
|
|
76
|
+
expect(applyWgpuEffectErasePass).toHaveBeenCalledWith(expect.anything(), source, dest);
|
|
77
|
+
});
|
|
7
78
|
});
|
|
8
79
|
|
|
9
80
|
describe('defaultWgpuDropShadowEffectRunner', () => {
|
|
@@ -11,3 +82,28 @@ describe('defaultWgpuDropShadowEffectRunner', () => {
|
|
|
11
82
|
expect(typeof defaultWgpuDropShadowEffectRunner).toBe('function');
|
|
12
83
|
});
|
|
13
84
|
});
|
|
85
|
+
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
vi.clearAllMocks();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
afterAll(() => {
|
|
91
|
+
vi.doUnmock('@flighthq/render-wgpu');
|
|
92
|
+
vi.doUnmock('./wgpuEffectBlitShader');
|
|
93
|
+
vi.doUnmock('./wgpuEffectBoxBlur');
|
|
94
|
+
vi.doUnmock('./wgpuEffectPass');
|
|
95
|
+
vi.doUnmock('./wgpuEffectTintShader');
|
|
96
|
+
vi.resetModules();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
function createState(): never {
|
|
100
|
+
return {} as never;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function createPool(): never {
|
|
104
|
+
return { free: [] } as never;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function createTarget(id: string): never {
|
|
108
|
+
return { id, width: 32, height: 16, format: 'rgba8', texture: {} } as never;
|
|
109
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
applyWgpuEffectBlitOffsetPass,
|
|
3
|
+
applyWgpuEffectBlitPass,
|
|
4
|
+
applyWgpuEffectErasePass,
|
|
5
|
+
} from './wgpuEffectBlitShader';
|
|
2
6
|
|
|
3
7
|
describe('applyWgpuEffectBlitOffsetPass', () => {
|
|
4
8
|
it('is a function', () => {
|
|
@@ -11,3 +15,9 @@ describe('applyWgpuEffectBlitPass', () => {
|
|
|
11
15
|
expect(typeof applyWgpuEffectBlitPass).toBe('function');
|
|
12
16
|
});
|
|
13
17
|
});
|
|
18
|
+
|
|
19
|
+
describe('applyWgpuEffectErasePass', () => {
|
|
20
|
+
it('is a function', () => {
|
|
21
|
+
expect(typeof applyWgpuEffectErasePass).toBe('function');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -1,7 +1,75 @@
|
|
|
1
|
+
const mockState = vi.hoisted(() => ({
|
|
2
|
+
uniformSnapshots: [] as number[][],
|
|
3
|
+
}));
|
|
4
|
+
|
|
5
|
+
vi.hoisted(() => {
|
|
6
|
+
vi.resetModules();
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
vi.mock('./wgpuEffectPass', () => ({
|
|
10
|
+
createWgpuEffectPipeline: vi.fn(() => ({ blendMode: 'replace', pipeline: {} })),
|
|
11
|
+
drawWgpuEffectPass: vi.fn((_state, _source, _dest, _pipeline, setUniforms) => {
|
|
12
|
+
const f32 = new Float32Array(16);
|
|
13
|
+
const i32 = new Int32Array(f32.buffer);
|
|
14
|
+
setUniforms(f32, i32);
|
|
15
|
+
mockState.uniformSnapshots.push(Array.from(f32));
|
|
16
|
+
}),
|
|
17
|
+
}));
|
|
18
|
+
|
|
1
19
|
import { applyWgpuEffectBoxBlur } from './wgpuEffectBoxBlur';
|
|
20
|
+
import { createWgpuEffectPipeline, drawWgpuEffectPass } from './wgpuEffectPass';
|
|
2
21
|
|
|
3
22
|
describe('applyWgpuEffectBoxBlur', () => {
|
|
4
23
|
it('is a function', () => {
|
|
5
24
|
expect(typeof applyWgpuEffectBoxBlur).toBe('function');
|
|
6
25
|
});
|
|
26
|
+
|
|
27
|
+
it('binds the exterior edge color when one is provided', () => {
|
|
28
|
+
applyWgpuEffectBoxBlur(createState(), createTarget('source'), createTarget('dest'), createTarget('temp'), {
|
|
29
|
+
blurX: 4,
|
|
30
|
+
blurY: 0,
|
|
31
|
+
edgeColor: [0.1, 0.2, 0.3, 0.4],
|
|
32
|
+
passes: 1,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
expect(createWgpuEffectPipeline).toHaveBeenCalledWith(expect.anything(), expect.any(String), 'replace');
|
|
36
|
+
expect(mockState.uniformSnapshots[0]![4]).toBeCloseTo(0.1);
|
|
37
|
+
expect(mockState.uniformSnapshots[0]![5]).toBeCloseTo(0.2);
|
|
38
|
+
expect(mockState.uniformSnapshots[0]![6]).toBeCloseTo(0.3);
|
|
39
|
+
expect(mockState.uniformSnapshots[0]![7]).toBeCloseTo(0.4);
|
|
40
|
+
expect(mockState.uniformSnapshots[0]![9]).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('uses the replacement blur pipeline for zero-radius copies', () => {
|
|
44
|
+
const dest = createTarget('dest');
|
|
45
|
+
|
|
46
|
+
applyWgpuEffectBoxBlur(createState(), createTarget('source'), dest, createTarget('temp'), {
|
|
47
|
+
blurX: 0,
|
|
48
|
+
blurY: 0,
|
|
49
|
+
passes: 1,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
expect(drawWgpuEffectPass).toHaveBeenCalledTimes(1);
|
|
53
|
+
expect(vi.mocked(drawWgpuEffectPass).mock.calls[0]![2]).toBe(dest);
|
|
54
|
+
expect(mockState.uniformSnapshots[0]![8]).toBe(0);
|
|
55
|
+
expect(mockState.uniformSnapshots[0]![9]).toBe(0);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
beforeEach(() => {
|
|
60
|
+
vi.clearAllMocks();
|
|
61
|
+
mockState.uniformSnapshots.length = 0;
|
|
7
62
|
});
|
|
63
|
+
|
|
64
|
+
afterAll(() => {
|
|
65
|
+
vi.doUnmock('./wgpuEffectPass');
|
|
66
|
+
vi.resetModules();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
function createState(): never {
|
|
70
|
+
return {} as never;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function createTarget(id: string): never {
|
|
74
|
+
return { id, width: 32, height: 16, format: 'rgba8', texture: {}, view: {} } as never;
|
|
75
|
+
}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
vi.hoisted(() => {
|
|
2
|
+
vi.resetModules();
|
|
3
|
+
});
|
|
4
|
+
|
|
5
|
+
vi.mock('./wgpuEffectPass', () => ({
|
|
6
|
+
createWgpuDualSourceEffectPipeline: vi.fn(() => ({ blendMode: 'replace', pipeline: {} })),
|
|
7
|
+
createWgpuEffectPipeline: vi.fn(() => ({ blendMode: 'replace', pipeline: {} })),
|
|
8
|
+
drawWgpuDualSourceEffectPass: vi.fn(),
|
|
9
|
+
drawWgpuEffectPass: vi.fn(),
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
import { createWgpuDualSourceEffectPipeline, createWgpuEffectPipeline } from './wgpuEffectPass';
|
|
1
13
|
import {
|
|
2
14
|
applyWgpuEffectInnerClipPass,
|
|
3
15
|
applyWgpuEffectInvertTintPass,
|
|
@@ -8,16 +20,47 @@ describe('applyWgpuEffectInnerClipPass', () => {
|
|
|
8
20
|
it('is a function', () => {
|
|
9
21
|
expect(typeof applyWgpuEffectInnerClipPass).toBe('function');
|
|
10
22
|
});
|
|
23
|
+
|
|
24
|
+
it('uses replacement blending', () => {
|
|
25
|
+
applyWgpuEffectInnerClipPass(createState(), createTarget(), createTarget(), createTarget());
|
|
26
|
+
|
|
27
|
+
expect(createWgpuDualSourceEffectPipeline).toHaveBeenCalledWith(expect.anything(), expect.any(String), 'replace');
|
|
28
|
+
});
|
|
11
29
|
});
|
|
12
30
|
|
|
13
31
|
describe('applyWgpuEffectInvertTintPass', () => {
|
|
14
32
|
it('is a function', () => {
|
|
15
33
|
expect(typeof applyWgpuEffectInvertTintPass).toBe('function');
|
|
16
34
|
});
|
|
35
|
+
|
|
36
|
+
it('uses replacement blending', () => {
|
|
37
|
+
applyWgpuEffectInvertTintPass(createState(), createTarget(), createTarget(), 0xff00cc, 0.5, 2);
|
|
38
|
+
|
|
39
|
+
expect(createWgpuEffectPipeline).toHaveBeenCalledWith(expect.anything(), expect.any(String), 'replace');
|
|
40
|
+
});
|
|
17
41
|
});
|
|
18
42
|
|
|
19
43
|
describe('applyWgpuEffectTintPass', () => {
|
|
20
44
|
it('is a function', () => {
|
|
21
45
|
expect(typeof applyWgpuEffectTintPass).toBe('function');
|
|
22
46
|
});
|
|
47
|
+
|
|
48
|
+
it('uses replacement blending', () => {
|
|
49
|
+
applyWgpuEffectTintPass(createState(), createTarget(), createTarget(), 0xff00cc, 0.5, 2);
|
|
50
|
+
|
|
51
|
+
expect(createWgpuEffectPipeline).toHaveBeenCalledWith(expect.anything(), expect.any(String), 'replace');
|
|
52
|
+
});
|
|
23
53
|
});
|
|
54
|
+
|
|
55
|
+
afterAll(() => {
|
|
56
|
+
vi.doUnmock('./wgpuEffectPass');
|
|
57
|
+
vi.resetModules();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
function createState(): never {
|
|
61
|
+
return {} as never;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function createTarget(): never {
|
|
65
|
+
return {} as never;
|
|
66
|
+
}
|