@flighthq/effects-wgpu 0.1.0 → 0.2.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/index.d.ts +17 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -10
- package/dist/index.js.map +1 -1
- package/dist/wgpuBevelEffect.d.ts +4 -0
- package/dist/wgpuBevelEffect.d.ts.map +1 -0
- package/dist/wgpuBevelEffect.js +122 -0
- package/dist/wgpuBevelEffect.js.map +1 -0
- package/dist/wgpuBloomEffect.d.ts.map +1 -1
- package/dist/wgpuBloomEffect.js +9 -8
- package/dist/wgpuBloomEffect.js.map +1 -1
- package/dist/wgpuBlurEffect.d.ts +8 -0
- package/dist/wgpuBlurEffect.d.ts.map +1 -0
- package/dist/wgpuBlurEffect.js +70 -0
- package/dist/wgpuBlurEffect.js.map +1 -0
- package/dist/wgpuBokehDepthOfFieldEffect.d.ts.map +1 -1
- package/dist/wgpuBokehDepthOfFieldEffect.js +2 -2
- package/dist/wgpuBokehDepthOfFieldEffect.js.map +1 -1
- package/dist/wgpuCameraMotionBlurEffect.d.ts.map +1 -1
- package/dist/wgpuCameraMotionBlurEffect.js +2 -2
- package/dist/wgpuCameraMotionBlurEffect.js.map +1 -1
- package/dist/wgpuChromaticAberrationEffect.d.ts.map +1 -1
- package/dist/wgpuChromaticAberrationEffect.js +2 -2
- package/dist/wgpuChromaticAberrationEffect.js.map +1 -1
- package/dist/wgpuColorLutPass.d.ts +3 -0
- package/dist/wgpuColorLutPass.d.ts.map +1 -0
- package/dist/wgpuColorLutPass.js +144 -0
- package/dist/wgpuColorLutPass.js.map +1 -0
- package/dist/wgpuColorMatrixPass.d.ts +3 -0
- package/dist/wgpuColorMatrixPass.d.ts.map +1 -0
- package/dist/wgpuColorMatrixPass.js +51 -0
- package/dist/wgpuColorMatrixPass.js.map +1 -0
- package/dist/wgpuConvolutionEffect.d.ts +5 -0
- package/dist/wgpuConvolutionEffect.d.ts.map +1 -0
- package/dist/wgpuConvolutionEffect.js +108 -0
- package/dist/wgpuConvolutionEffect.js.map +1 -0
- package/dist/wgpuCrtEffect.d.ts.map +1 -1
- package/dist/wgpuCrtEffect.js +2 -2
- package/dist/wgpuCrtEffect.js.map +1 -1
- package/dist/wgpuDirectionalBlurEffect.d.ts.map +1 -1
- package/dist/wgpuDirectionalBlurEffect.js +2 -2
- package/dist/wgpuDirectionalBlurEffect.js.map +1 -1
- package/dist/wgpuDisplacementEffect.d.ts.map +1 -1
- package/dist/wgpuDisplacementEffect.js +2 -2
- package/dist/wgpuDisplacementEffect.js.map +1 -1
- package/dist/wgpuDitherEffect.d.ts.map +1 -1
- package/dist/wgpuDitherEffect.js +2 -2
- package/dist/wgpuDitherEffect.js.map +1 -1
- package/dist/wgpuDropShadowEffect.d.ts +4 -0
- package/dist/wgpuDropShadowEffect.d.ts.map +1 -0
- package/dist/wgpuDropShadowEffect.js +49 -0
- package/dist/wgpuDropShadowEffect.js.map +1 -0
- package/dist/wgpuEffectBlitShader.d.ts +15 -0
- package/dist/wgpuEffectBlitShader.d.ts.map +1 -0
- package/dist/wgpuEffectBlitShader.js +71 -0
- package/dist/wgpuEffectBlitShader.js.map +1 -0
- package/dist/wgpuEffectBoxBlur.d.ts +14 -0
- package/dist/wgpuEffectBoxBlur.d.ts.map +1 -0
- package/dist/wgpuEffectBoxBlur.js +81 -0
- package/dist/wgpuEffectBoxBlur.js.map +1 -0
- package/dist/wgpuEffectGradientRamp.d.ts +17 -0
- package/dist/wgpuEffectGradientRamp.d.ts.map +1 -0
- package/dist/wgpuEffectGradientRamp.js +89 -0
- package/dist/wgpuEffectGradientRamp.js.map +1 -0
- package/dist/wgpuEffectPass.d.ts +41 -0
- package/dist/wgpuEffectPass.d.ts.map +1 -0
- package/dist/wgpuEffectPass.js +259 -0
- package/dist/wgpuEffectPass.js.map +1 -0
- package/dist/wgpuEffectProgramCache.d.ts +2 -2
- package/dist/wgpuEffectProgramCache.d.ts.map +1 -1
- package/dist/wgpuEffectProgramCache.js +5 -5
- package/dist/wgpuEffectProgramCache.js.map +1 -1
- package/dist/wgpuEffectTintShader.d.ts +8 -0
- package/dist/wgpuEffectTintShader.d.ts.map +1 -0
- package/dist/wgpuEffectTintShader.js +109 -0
- package/dist/wgpuEffectTintShader.js.map +1 -0
- package/dist/wgpuFilmGrainEffect.d.ts.map +1 -1
- package/dist/wgpuFilmGrainEffect.js +2 -2
- package/dist/wgpuFilmGrainEffect.js.map +1 -1
- package/dist/wgpuFxaaEffect.d.ts.map +1 -1
- package/dist/wgpuFxaaEffect.js +2 -2
- package/dist/wgpuFxaaEffect.js.map +1 -1
- package/dist/wgpuGlitchEffect.d.ts.map +1 -1
- package/dist/wgpuGlitchEffect.js +2 -2
- package/dist/wgpuGlitchEffect.js.map +1 -1
- package/dist/wgpuGodRaysEffect.d.ts.map +1 -1
- package/dist/wgpuGodRaysEffect.js +2 -2
- package/dist/wgpuGodRaysEffect.js.map +1 -1
- package/dist/wgpuGradientBevelEffect.d.ts +4 -0
- package/dist/wgpuGradientBevelEffect.d.ts.map +1 -0
- package/dist/wgpuGradientBevelEffect.js +189 -0
- package/dist/wgpuGradientBevelEffect.js.map +1 -0
- package/dist/wgpuGradientGlowEffect.d.ts +4 -0
- package/dist/wgpuGradientGlowEffect.d.ts.map +1 -0
- package/dist/wgpuGradientGlowEffect.js +97 -0
- package/dist/wgpuGradientGlowEffect.js.map +1 -0
- package/dist/wgpuHalftoneEffect.d.ts.map +1 -1
- package/dist/wgpuHalftoneEffect.js +2 -2
- package/dist/wgpuHalftoneEffect.js.map +1 -1
- package/dist/wgpuInnerGlowEffect.d.ts +4 -0
- package/dist/wgpuInnerGlowEffect.d.ts.map +1 -0
- package/dist/wgpuInnerGlowEffect.js +37 -0
- package/dist/wgpuInnerGlowEffect.js.map +1 -0
- package/dist/wgpuInnerShadowEffect.d.ts +4 -0
- package/dist/wgpuInnerShadowEffect.d.ts.map +1 -0
- package/dist/wgpuInnerShadowEffect.js +42 -0
- package/dist/wgpuInnerShadowEffect.js.map +1 -0
- package/dist/wgpuKuwaharaEffect.d.ts.map +1 -1
- package/dist/wgpuKuwaharaEffect.js +2 -2
- package/dist/wgpuKuwaharaEffect.js.map +1 -1
- package/dist/wgpuLensDirtEffect.d.ts.map +1 -1
- package/dist/wgpuLensDirtEffect.js +2 -2
- package/dist/wgpuLensDirtEffect.js.map +1 -1
- package/dist/wgpuLensDistortionEffect.d.ts.map +1 -1
- package/dist/wgpuLensDistortionEffect.js +2 -2
- package/dist/wgpuLensDistortionEffect.js.map +1 -1
- package/dist/wgpuLensFlareEffect.d.ts.map +1 -1
- package/dist/wgpuLensFlareEffect.js +2 -2
- package/dist/wgpuLensFlareEffect.js.map +1 -1
- package/dist/wgpuMedianEffect.d.ts +5 -0
- package/dist/wgpuMedianEffect.d.ts.map +1 -0
- package/dist/wgpuMedianEffect.js +74 -0
- package/dist/wgpuMedianEffect.js.map +1 -0
- package/dist/wgpuMotionBlurEffect.d.ts.map +1 -1
- package/dist/wgpuMotionBlurEffect.js +6 -7
- package/dist/wgpuMotionBlurEffect.js.map +1 -1
- package/dist/wgpuOuterGlowEffect.d.ts +4 -0
- package/dist/wgpuOuterGlowEffect.d.ts.map +1 -0
- package/dist/wgpuOuterGlowEffect.js +43 -0
- package/dist/wgpuOuterGlowEffect.js.map +1 -0
- package/dist/wgpuOutlineEffect.d.ts.map +1 -1
- package/dist/wgpuOutlineEffect.js +2 -2
- package/dist/wgpuOutlineEffect.js.map +1 -1
- package/dist/wgpuPixelateEffect.d.ts.map +1 -1
- package/dist/wgpuPixelateEffect.js +2 -2
- package/dist/wgpuPixelateEffect.js.map +1 -1
- package/dist/wgpuPosterizeEffect.d.ts.map +1 -1
- package/dist/wgpuPosterizeEffect.js +2 -2
- package/dist/wgpuPosterizeEffect.js.map +1 -1
- package/dist/wgpuRadialBlurEffect.d.ts.map +1 -1
- package/dist/wgpuRadialBlurEffect.js +2 -2
- package/dist/wgpuRadialBlurEffect.js.map +1 -1
- package/dist/wgpuRenderEffectPipeline.d.ts +2 -2
- package/dist/wgpuRenderEffectPipeline.d.ts.map +1 -1
- package/dist/wgpuRenderEffectPipeline.js +59 -9
- package/dist/wgpuRenderEffectPipeline.js.map +1 -1
- package/dist/wgpuRenderEffectRegistrants.d.ts +1 -0
- package/dist/wgpuRenderEffectRegistrants.d.ts.map +1 -1
- package/dist/wgpuRenderEffectRegistrants.js +39 -28
- package/dist/wgpuRenderEffectRegistrants.js.map +1 -1
- package/dist/wgpuScanlinesEffect.d.ts.map +1 -1
- package/dist/wgpuScanlinesEffect.js +2 -2
- package/dist/wgpuScanlinesEffect.js.map +1 -1
- package/dist/wgpuScreenSpaceFogEffect.d.ts.map +1 -1
- package/dist/wgpuScreenSpaceFogEffect.js +2 -2
- package/dist/wgpuScreenSpaceFogEffect.js.map +1 -1
- package/dist/wgpuSharpenEffect.d.ts.map +1 -1
- package/dist/wgpuSharpenEffect.js +2 -2
- package/dist/wgpuSharpenEffect.js.map +1 -1
- package/dist/wgpuSketchEffect.d.ts.map +1 -1
- package/dist/wgpuSketchEffect.js +2 -2
- package/dist/wgpuSketchEffect.js.map +1 -1
- package/dist/wgpuSmaaEffect.d.ts.map +1 -1
- package/dist/wgpuSmaaEffect.js +2 -2
- package/dist/wgpuSmaaEffect.js.map +1 -1
- package/dist/wgpuSsaoEffect.d.ts.map +1 -1
- package/dist/wgpuSsaoEffect.js +2 -2
- package/dist/wgpuSsaoEffect.js.map +1 -1
- package/dist/wgpuSsrEffect.d.ts.map +1 -1
- package/dist/wgpuSsrEffect.js +2 -2
- package/dist/wgpuSsrEffect.js.map +1 -1
- package/dist/wgpuTaaEffect.d.ts.map +1 -1
- package/dist/wgpuTaaEffect.js +2 -2
- package/dist/wgpuTaaEffect.js.map +1 -1
- package/dist/wgpuTiltShiftEffect.d.ts.map +1 -1
- package/dist/wgpuTiltShiftEffect.js +2 -2
- package/dist/wgpuTiltShiftEffect.js.map +1 -1
- package/dist/wgpuToneMapEffect.d.ts.map +1 -1
- package/dist/wgpuToneMapEffect.js +2 -2
- package/dist/wgpuToneMapEffect.js.map +1 -1
- package/dist/wgpuVignetteEffect.d.ts.map +1 -1
- package/dist/wgpuVignetteEffect.js +2 -2
- package/dist/wgpuVignetteEffect.js.map +1 -1
- package/dist/wgpuWhiteBalanceEffect.d.ts.map +1 -1
- package/dist/wgpuWhiteBalanceEffect.js +2 -2
- package/dist/wgpuWhiteBalanceEffect.js.map +1 -1
- package/package.json +11 -7
- package/src/wgpuBevelEffect.test.ts +13 -0
- package/src/wgpuBlurEffect.test.ts +19 -0
- package/src/wgpuColorLutPass.test.ts +7 -0
- package/src/wgpuColorMatrixPass.test.ts +7 -0
- package/src/wgpuConvolutionEffect.test.ts +13 -0
- package/src/wgpuDropShadowEffect.test.ts +13 -0
- package/src/wgpuEffectBlitShader.test.ts +13 -0
- package/src/wgpuEffectBoxBlur.test.ts +7 -0
- package/src/wgpuEffectGradientRamp.test.ts +7 -0
- package/src/wgpuEffectPass.test.ts +51 -0
- package/src/wgpuEffectTintShader.test.ts +23 -0
- package/src/wgpuGradientBevelEffect.test.ts +13 -0
- package/src/wgpuGradientGlowEffect.test.ts +13 -0
- package/src/wgpuInnerGlowEffect.test.ts +13 -0
- package/src/wgpuInnerShadowEffect.test.ts +13 -0
- package/src/wgpuMedianEffect.test.ts +13 -0
- package/src/wgpuOuterGlowEffect.test.ts +13 -0
- package/src/wgpuRenderEffectPipeline.test.ts +2 -0
- package/src/wgpuRenderEffectRegistrants.test.ts +25 -14
- package/dist/wgpuBrightnessContrastEffect.d.ts +0 -4
- package/dist/wgpuBrightnessContrastEffect.d.ts.map +0 -1
- package/dist/wgpuBrightnessContrastEffect.js +0 -29
- package/dist/wgpuBrightnessContrastEffect.js.map +0 -1
- package/dist/wgpuChannelMixerEffect.d.ts +0 -4
- package/dist/wgpuChannelMixerEffect.d.ts.map +0 -1
- package/dist/wgpuChannelMixerEffect.js +0 -34
- package/dist/wgpuChannelMixerEffect.js.map +0 -1
- package/dist/wgpuColorGradeEffect.d.ts +0 -4
- package/dist/wgpuColorGradeEffect.d.ts.map +0 -1
- package/dist/wgpuColorGradeEffect.js +0 -52
- package/dist/wgpuColorGradeEffect.js.map +0 -1
- package/dist/wgpuExposureEffect.d.ts +0 -4
- package/dist/wgpuExposureEffect.d.ts.map +0 -1
- package/dist/wgpuExposureEffect.js +0 -28
- package/dist/wgpuExposureEffect.js.map +0 -1
- package/dist/wgpuGrayscaleEffect.d.ts +0 -4
- package/dist/wgpuGrayscaleEffect.d.ts.map +0 -1
- package/dist/wgpuGrayscaleEffect.js +0 -27
- package/dist/wgpuGrayscaleEffect.js.map +0 -1
- package/dist/wgpuHueSaturationEffect.d.ts +0 -4
- package/dist/wgpuHueSaturationEffect.d.ts.map +0 -1
- package/dist/wgpuHueSaturationEffect.js +0 -75
- package/dist/wgpuHueSaturationEffect.js.map +0 -1
- package/dist/wgpuInvertEffect.d.ts +0 -4
- package/dist/wgpuInvertEffect.d.ts.map +0 -1
- package/dist/wgpuInvertEffect.js +0 -26
- package/dist/wgpuInvertEffect.js.map +0 -1
- package/dist/wgpuLiftGammaGainEffect.d.ts +0 -4
- package/dist/wgpuLiftGammaGainEffect.d.ts.map +0 -1
- package/dist/wgpuLiftGammaGainEffect.js +0 -51
- package/dist/wgpuLiftGammaGainEffect.js.map +0 -1
- package/dist/wgpuLookupTableGradeEffect.d.ts +0 -4
- package/dist/wgpuLookupTableGradeEffect.d.ts.map +0 -1
- package/dist/wgpuLookupTableGradeEffect.js +0 -30
- package/dist/wgpuLookupTableGradeEffect.js.map +0 -1
- package/dist/wgpuSepiaEffect.d.ts +0 -4
- package/dist/wgpuSepiaEffect.d.ts.map +0 -1
- package/dist/wgpuSepiaEffect.js +0 -31
- package/dist/wgpuSepiaEffect.js.map +0 -1
- package/src/wgpuBrightnessContrastEffect.test.ts +0 -16
- package/src/wgpuChannelMixerEffect.test.ts +0 -13
- package/src/wgpuColorGradeEffect.test.ts +0 -13
- package/src/wgpuExposureEffect.test.ts +0 -13
- package/src/wgpuGrayscaleEffect.test.ts +0 -13
- package/src/wgpuHueSaturationEffect.test.ts +0 -13
- package/src/wgpuInvertEffect.test.ts +0 -13
- package/src/wgpuLiftGammaGainEffect.test.ts +0 -13
- package/src/wgpuLookupTableGradeEffect.test.ts +0 -16
- package/src/wgpuSepiaEffect.test.ts +0 -13
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createWgpuEffectPipeline } from './wgpuEffectPass';
|
|
2
2
|
// Per-state cache of compiled effect filter pipelines, keyed by a stable string. Effect recipes call
|
|
3
3
|
// getWgpuEffectPipeline with their own key + fragment WGSL so each pipeline compiles once per state
|
|
4
|
-
// and is reused every frame. The WGSL is the fragment half only;
|
|
5
|
-
// the shared fullscreen-quad vertex (
|
|
4
|
+
// and is reused every frame. The WGSL is the fragment half only; createWgpuEffectPipeline prepends
|
|
5
|
+
// the shared fullscreen-quad vertex (EFFECT_VERTEX_WGSL). Keeps compiled pipelines off the render-state
|
|
6
6
|
// runtime type. Mirrors effects-gl's getGlEffectProgram.
|
|
7
7
|
//
|
|
8
8
|
// Uniform-slot convention every recipe follows: the fragment declares
|
|
9
9
|
// struct Uniforms { ... } @group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
10
10
|
// @group(1) @binding(0) var tex : texture_2d<f32>; @group(1) @binding(1) var smp : sampler;
|
|
11
|
-
// and packs its scalars into the f32/i32 slot written by
|
|
11
|
+
// and packs its scalars into the f32/i32 slot written by drawWgpuEffectPass's setUniforms callback.
|
|
12
12
|
export function getWgpuEffectPipeline(state, key, fragmentWGSL, blend = 'replace') {
|
|
13
13
|
let cache = _pipelines.get(state);
|
|
14
14
|
if (cache === undefined) {
|
|
@@ -18,7 +18,7 @@ export function getWgpuEffectPipeline(state, key, fragmentWGSL, blend = 'replace
|
|
|
18
18
|
const existing = cache.get(key);
|
|
19
19
|
if (existing !== undefined)
|
|
20
20
|
return existing;
|
|
21
|
-
const compiled =
|
|
21
|
+
const compiled = createWgpuEffectPipeline(state, fragmentWGSL, blend);
|
|
22
22
|
cache.set(key, compiled);
|
|
23
23
|
return compiled;
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuEffectProgramCache.js","sourceRoot":"","sources":["../src/wgpuEffectProgramCache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuEffectProgramCache.js","sourceRoot":"","sources":["../src/wgpuEffectProgramCache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,qGAAqG;AACrG,oGAAoG;AACpG,mGAAmG;AACnG,wGAAwG;AACxG,yDAAyD;AACzD,EAAE;AACF,sEAAsE;AACtE,+EAA+E;AAC/E,8FAA8F;AAC9F,oGAAoG;AAEpG,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,GAAW,EACX,YAAoB,EACpB,QAA8B,SAAS;IAEvC,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAClB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACtE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,OAAO,EAAoD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
|
|
2
|
+
/** Clips glow against source alpha: output = glow × source.a. */
|
|
3
|
+
export declare function applyWgpuEffectInnerClipPass(state: WgpuRenderState, glow: WgpuRenderTarget, source: WgpuRenderTarget, dest: WgpuRenderTarget): void;
|
|
4
|
+
/** Tints the INVERTED source alpha with color, outputs a premultiplied mask. Used for inner effects. */
|
|
5
|
+
export declare function applyWgpuEffectInvertTintPass(state: WgpuRenderState, source: WgpuRenderTarget, dest: WgpuRenderTarget, color: number, alpha: number, strength: number): void;
|
|
6
|
+
/** Tints the source alpha with color, outputs a premultiplied mask into dest. */
|
|
7
|
+
export declare function applyWgpuEffectTintPass(state: WgpuRenderState, source: WgpuRenderTarget, dest: WgpuRenderTarget, color: number, alpha: number, strength: number): void;
|
|
8
|
+
//# sourceMappingURL=wgpuEffectTintShader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuEffectTintShader.d.ts","sourceRoot":"","sources":["../src/wgpuEffectTintShader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA4CzE,iEAAiE;AACjE,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAGN;AAED,wGAAwG;AACxG,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,IAAI,CAUN;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,IAAI,CAUN"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createWgpuDualSourceEffectPipeline, createWgpuEffectPipeline, drawWgpuDualSourceEffectPass, drawWgpuEffectPass, } from './wgpuEffectPass';
|
|
2
|
+
// Extracts the source alpha, tints it with a solid color, outputs premultiplied RGBA.
|
|
3
|
+
const TINT_WGSL = /* wgsl */ `
|
|
4
|
+
struct Uniforms {
|
|
5
|
+
colorAlpha : vec4f,
|
|
6
|
+
strength : f32,
|
|
7
|
+
_pad0 : f32, _pad1 : f32, _pad2 : f32,
|
|
8
|
+
}
|
|
9
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
10
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
11
|
+
@group(1) @binding(1) var smp : sampler;
|
|
12
|
+
|
|
13
|
+
@fragment
|
|
14
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
15
|
+
let a = min(1.0, textureSampleLevel(tex, smp, uv, 0.0).a * uni.colorAlpha.w * uni.strength);
|
|
16
|
+
return vec4f(uni.colorAlpha.xyz * a, a);
|
|
17
|
+
}`;
|
|
18
|
+
// Extracts the INVERTED source alpha, tints it. Used for inner glow/shadow.
|
|
19
|
+
const INVERT_TINT_WGSL = /* wgsl */ `
|
|
20
|
+
struct Uniforms {
|
|
21
|
+
colorAlpha : vec4f,
|
|
22
|
+
strength : f32,
|
|
23
|
+
_pad0 : f32, _pad1 : f32, _pad2 : f32,
|
|
24
|
+
}
|
|
25
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
26
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
27
|
+
@group(1) @binding(1) var smp : sampler;
|
|
28
|
+
|
|
29
|
+
@fragment
|
|
30
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
31
|
+
let a = min(1.0, (1.0 - textureSampleLevel(tex, smp, uv, 0.0).a) * uni.colorAlpha.w * uni.strength);
|
|
32
|
+
return vec4f(uni.colorAlpha.xyz * a, a);
|
|
33
|
+
}`;
|
|
34
|
+
/** Clips glow against source alpha: output = glow × source.a. */
|
|
35
|
+
export function applyWgpuEffectInnerClipPass(state, glow, source, dest) {
|
|
36
|
+
const pipeline = getWgpuInnerClipShader(state);
|
|
37
|
+
drawWgpuDualSourceEffectPass(state, glow, source, dest, pipeline, () => { });
|
|
38
|
+
}
|
|
39
|
+
/** Tints the INVERTED source alpha with color, outputs a premultiplied mask. Used for inner effects. */
|
|
40
|
+
export function applyWgpuEffectInvertTintPass(state, source, dest, color, alpha, strength) {
|
|
41
|
+
const [r, g, b] = packColor(color);
|
|
42
|
+
const pipeline = getWgpuInvertTintShader(state);
|
|
43
|
+
drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
|
|
44
|
+
f32[0] = r;
|
|
45
|
+
f32[1] = g;
|
|
46
|
+
f32[2] = b;
|
|
47
|
+
f32[3] = alpha;
|
|
48
|
+
f32[4] = strength;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/** Tints the source alpha with color, outputs a premultiplied mask into dest. */
|
|
52
|
+
export function applyWgpuEffectTintPass(state, source, dest, color, alpha, strength) {
|
|
53
|
+
const [r, g, b] = packColor(color);
|
|
54
|
+
const pipeline = getWgpuTintShader(state);
|
|
55
|
+
drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
|
|
56
|
+
f32[0] = r;
|
|
57
|
+
f32[1] = g;
|
|
58
|
+
f32[2] = b;
|
|
59
|
+
f32[3] = alpha;
|
|
60
|
+
f32[4] = strength;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function getWgpuInnerClipShader(state) {
|
|
64
|
+
let p = innerClipPipelines.get(state);
|
|
65
|
+
if (p === undefined) {
|
|
66
|
+
p = createWgpuDualSourceEffectPipeline(state, INNER_CLIP_WGSL);
|
|
67
|
+
innerClipPipelines.set(state, p);
|
|
68
|
+
}
|
|
69
|
+
return p;
|
|
70
|
+
}
|
|
71
|
+
function getWgpuInvertTintShader(state) {
|
|
72
|
+
let p = invertTintPipelines.get(state);
|
|
73
|
+
if (p === undefined) {
|
|
74
|
+
p = createWgpuEffectPipeline(state, INVERT_TINT_WGSL);
|
|
75
|
+
invertTintPipelines.set(state, p);
|
|
76
|
+
}
|
|
77
|
+
return p;
|
|
78
|
+
}
|
|
79
|
+
function getWgpuTintShader(state) {
|
|
80
|
+
let p = tintPipelines.get(state);
|
|
81
|
+
if (p === undefined) {
|
|
82
|
+
p = createWgpuEffectPipeline(state, TINT_WGSL);
|
|
83
|
+
tintPipelines.set(state, p);
|
|
84
|
+
}
|
|
85
|
+
return p;
|
|
86
|
+
}
|
|
87
|
+
function packColor(color) {
|
|
88
|
+
return [((color >> 16) & 0xff) / 255, ((color >> 8) & 0xff) / 255, (color & 0xff) / 255];
|
|
89
|
+
}
|
|
90
|
+
const tintPipelines = new WeakMap();
|
|
91
|
+
const invertTintPipelines = new WeakMap();
|
|
92
|
+
// Inner-clip dual-source pipeline: clips unit-1 glow to unit-2 source alpha.
|
|
93
|
+
// Used by inner glow and inner shadow.
|
|
94
|
+
const INNER_CLIP_WGSL = /* wgsl */ `
|
|
95
|
+
struct Uniforms { _u : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
|
|
96
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
97
|
+
@group(1) @binding(0) var texGlow : texture_2d<f32>;
|
|
98
|
+
@group(1) @binding(1) var smp : sampler;
|
|
99
|
+
@group(2) @binding(0) var texSrc : texture_2d<f32>;
|
|
100
|
+
@group(2) @binding(1) var smp2 : sampler;
|
|
101
|
+
|
|
102
|
+
@fragment
|
|
103
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
104
|
+
let glow = textureSampleLevel(texGlow, smp, uv, 0.0);
|
|
105
|
+
let srcAlpha = textureSampleLevel(texSrc, smp2, uv, 0.0).a;
|
|
106
|
+
return glow * srcAlpha;
|
|
107
|
+
}`;
|
|
108
|
+
const innerClipPipelines = new WeakMap();
|
|
109
|
+
//# sourceMappingURL=wgpuEffectTintShader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuEffectTintShader.js","sourceRoot":"","sources":["../src/wgpuEffectTintShader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuFilmGrainEffect.d.ts","sourceRoot":"","sources":["../src/wgpuFilmGrainEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuFilmGrainEffect.d.ts","sourceRoot":"","sources":["../src/wgpuFilmGrainEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOlH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAUN;AAED,eAAO,MAAM,gCAAgC,EAAE,sBAE9C,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { drawWgpuEffectPass } from './wgpuEffectPass';
|
|
2
2
|
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
3
3
|
// Film grain: add per-pixel hash noise scaled by intensity, with grain cell size and a seed so the
|
|
4
4
|
// noise can be animated frame to frame.
|
|
@@ -7,7 +7,7 @@ export function applyFilmGrainEffectToWgpu(state, source, dest, effect) {
|
|
|
7
7
|
const size = effect.size ?? 1;
|
|
8
8
|
const seed = effect.seed ?? 0;
|
|
9
9
|
const pipeline = getWgpuEffectPipeline(state, 'stylization.filmGrain', FILM_GRAIN_FRAGMENT_WGSL, 'replace');
|
|
10
|
-
|
|
10
|
+
drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
|
|
11
11
|
f32[0] = intensity;
|
|
12
12
|
f32[1] = Math.max(0.0001, size);
|
|
13
13
|
f32[2] = seed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuFilmGrainEffect.js","sourceRoot":"","sources":["../src/wgpuFilmGrainEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuFilmGrainEffect.js","sourceRoot":"","sources":["../src/wgpuFilmGrainEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,mGAAmG;AACnG,wCAAwC;AACxC,MAAM,UAAU,0BAA0B,CACxC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAiC;IAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,SAAS,CAAC,CAAC;IAC5G,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACtF,0BAA0B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AACzF,CAAC,CAAC;AAEF,kDAAkD;AAClD,MAAM,wBAAwB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;EAoB1C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuFxaaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuFxaaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAO7G,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAUN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC"}
|
package/dist/wgpuFxaaEffect.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { drawWgpuEffectPass } from './wgpuEffectPass';
|
|
2
2
|
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
3
3
|
// FXAA: luminance edge detection + directional blend along the detected edge. Single-pass reference
|
|
4
4
|
// recipe. Reads `tex`; u_resolution gives the texel size; u_edgeThreshold gates edge detection.
|
|
@@ -7,7 +7,7 @@ export function applyFxaaEffectToWgpu(state, source, dest, effect) {
|
|
|
7
7
|
const width = source.width;
|
|
8
8
|
const height = source.height;
|
|
9
9
|
const pipeline = getWgpuEffectPipeline(state, 'antialiasing.fxaa', FXAA_FRAGMENT_WGSL, 'replace');
|
|
10
|
-
|
|
10
|
+
drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
|
|
11
11
|
f32[0] = width;
|
|
12
12
|
f32[1] = height;
|
|
13
13
|
f32[2] = edgeThreshold;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuFxaaEffect.js","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuFxaaEffect.js","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,oGAAoG;AACpG,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA4B;IAE5B,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAClG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,0GAA0G;AAC1G,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuGlitchEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuGlitchEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAO/G,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAeN;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAE3C,CAAC"}
|
package/dist/wgpuGlitchEffect.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { drawWgpuEffectPass } from './wgpuEffectPass';
|
|
2
2
|
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
3
3
|
// Glitch: split the frame into horizontal blocks, displace each by a per-block hash (data-mosh tear),
|
|
4
4
|
// separate the RGB channels, and corrupt the occasional block to white. `seed` animates it.
|
|
@@ -8,7 +8,7 @@ export function applyGlitchEffectToWgpu(state, source, dest, effect) {
|
|
|
8
8
|
const colorShift = effect.colorShift ?? 8;
|
|
9
9
|
const seed = effect.seed ?? 0;
|
|
10
10
|
const pipeline = getWgpuEffectPipeline(state, 'stylization.glitch', GLITCH_FRAGMENT_WGSL, 'replace');
|
|
11
|
-
|
|
11
|
+
drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
|
|
12
12
|
f32[0] = intensity;
|
|
13
13
|
f32[1] = blockSize;
|
|
14
14
|
f32[2] = colorShift;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuGlitchEffect.js","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuGlitchEffect.js","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,sGAAsG;AACtG,4FAA4F;AAC5F,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,0FAA0F;AAC1F,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuGodRaysEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGodRaysEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuGodRaysEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGodRaysEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAUhH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC9B,IAAI,CAsBN;AAED,eAAO,MAAM,8BAA8B,EAAE,sBAE5C,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { drawWgpuEffectPass } from './wgpuEffectPass';
|
|
2
2
|
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
3
3
|
// God rays: radial light scattering from a screen-space light position (centerX, centerY). Marches
|
|
4
4
|
// SAMPLES steps along the ray from each fragment toward the light, accumulating color with per-step
|
|
@@ -14,7 +14,7 @@ export function applyGodRaysEffectToWgpu(state, source, dest, effect) {
|
|
|
14
14
|
const exposure = effect.exposure ?? 0.6;
|
|
15
15
|
const samples = Math.max(1, Math.round(effect.samples ?? 64));
|
|
16
16
|
const pipeline = getWgpuEffectPipeline(state, `atmospheric.godRays.${samples}`, buildGodRaysFragment(samples), 'replace');
|
|
17
|
-
|
|
17
|
+
drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
|
|
18
18
|
f32[0] = centerX;
|
|
19
19
|
f32[1] = centerY;
|
|
20
20
|
f32[2] = density;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuGodRaysEffect.js","sourceRoot":"","sources":["../src/wgpuGodRaysEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wgpuGodRaysEffect.js","sourceRoot":"","sources":["../src/wgpuGodRaysEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,mGAAmG;AACnG,oGAAoG;AACpG,qGAAqG;AACrG,qGAAqG;AACrG,uCAAuC;AACvC,MAAM,UAAU,wBAAwB,CACtC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA+B;IAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,qBAAqB,CACpC,KAAK,EACL,uBAAuB,OAAO,EAAE,EAChC,oBAAoB,CAAC,OAAO,CAAC,EAC7B,SAAS,CACV,CAAC;IACF,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACpF,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAuB,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,sBAAsB,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,sBAAsB,CAAC;AAC9E,CAAC;AAED,uGAAuG;AACvG,iEAAiE;AACjE,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;uBAanB,CAAC;AAExB,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;EAkB7B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GradientBevelEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget, WgpuRenderTargetPool } from '@flighthq/types';
|
|
2
|
+
export declare function applyGradientBevelEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, pool: WgpuRenderTargetPool, effect: Readonly<GradientBevelEffect>): void;
|
|
3
|
+
export declare const defaultWgpuGradientBevelEffectRunner: WgpuRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=wgpuGradientBevelEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuGradientBevelEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGradientBevelEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,8BAA8B,CAC5C,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,mBAAmB,CAAC,GACpC,IAAI,CAiGN;AAED,eAAO,MAAM,oCAAoC,EAAE,sBAElD,CAAC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { acquireWgpuRenderTarget, releaseWgpuRenderTarget } from '@flighthq/render-wgpu';
|
|
2
|
+
import { applyWgpuEffectBlitPass } from './wgpuEffectBlitShader';
|
|
3
|
+
import { applyWgpuEffectBoxBlur } from './wgpuEffectBoxBlur';
|
|
4
|
+
import { getWgpuEffectGradientRampTexture } from './wgpuEffectGradientRamp';
|
|
5
|
+
import { clearWgpuEffectTarget, EFFECT_VERTEX_WGSL, getWgpuEffectPassState } from './wgpuEffectPass';
|
|
6
|
+
import { applyWgpuEffectTintPass } from './wgpuEffectTintShader';
|
|
7
|
+
// Gradient-bevel composite effect: a bevel whose highlight→shadow band color is looked up from a colors/alphas/ratios gradient ramp indexed by the encoded bevel depth.
|
|
8
|
+
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
9
|
+
// multi-pass recipe (neutral tint → box blur → bevel encode → gradient lookup + clip → composite), then releases them.
|
|
10
|
+
//
|
|
11
|
+
// Note: The Y bevel offset is negated versus the Gl implementation to
|
|
12
|
+
// account for Wgpu's top-left UV origin.
|
|
13
|
+
export function applyGradientBevelEffectToWgpu(state, source, dest, pool, effect) {
|
|
14
|
+
const src = source;
|
|
15
|
+
const dst = dest;
|
|
16
|
+
const descriptor = { width: source.width, height: source.height, format: source.format };
|
|
17
|
+
const s0 = acquireWgpuRenderTarget(state, pool, descriptor);
|
|
18
|
+
const s1 = acquireWgpuRenderTarget(state, pool, descriptor);
|
|
19
|
+
const s2 = acquireWgpuRenderTarget(state, pool, descriptor);
|
|
20
|
+
const angle = ((effect.angle ?? 45) * Math.PI) / 180;
|
|
21
|
+
const distance = effect.distance ?? 4;
|
|
22
|
+
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
23
|
+
const strength = effect.strength ?? 1;
|
|
24
|
+
const { device } = state;
|
|
25
|
+
const fs = getWgpuEffectPassState(state);
|
|
26
|
+
// Build blur basis → s1
|
|
27
|
+
applyWgpuEffectTintPass(state, src, s0, 0xffffff, 1, Math.min(1, strength));
|
|
28
|
+
applyWgpuEffectBoxBlur(state, s0, s1, s2, {
|
|
29
|
+
blurX: effect.blurX ?? 4,
|
|
30
|
+
blurY: effect.blurY ?? 4,
|
|
31
|
+
passes: quality,
|
|
32
|
+
});
|
|
33
|
+
// Encode bevel value from blurred alpha offset samples → s0
|
|
34
|
+
const dx = (Math.cos(angle) * distance) / s1.width;
|
|
35
|
+
// Negate Y: Wgpu UV y=0 is top (Y-down matches screen), Gl UV y=0 is bottom.
|
|
36
|
+
const dy = -((Math.sin(angle) * distance) / s1.height);
|
|
37
|
+
const encodePipeline = getEncodePipeline(state);
|
|
38
|
+
const encodeSlot = fs.acquireSlot();
|
|
39
|
+
fs.writeSlot(encodeSlot, (f32) => {
|
|
40
|
+
f32[0] = dx;
|
|
41
|
+
f32[1] = dy;
|
|
42
|
+
});
|
|
43
|
+
const blurredBG = device.createBindGroup({
|
|
44
|
+
layout: fs.textureBGLayout,
|
|
45
|
+
entries: [
|
|
46
|
+
{ binding: 0, resource: s1.view },
|
|
47
|
+
{ binding: 1, resource: fs.sampler },
|
|
48
|
+
],
|
|
49
|
+
});
|
|
50
|
+
const encodePass = fs.beginPass(s0, 'load');
|
|
51
|
+
encodePass.setPipeline(encodePipeline.pipeline);
|
|
52
|
+
encodePass.setBindGroup(0, fs.uniformBG, [encodeSlot]);
|
|
53
|
+
encodePass.setBindGroup(1, blurredBG);
|
|
54
|
+
encodePass.draw(6);
|
|
55
|
+
encodePass.end();
|
|
56
|
+
// Apply: look up gradient ramp from encoded bevel, clip to source alpha → s1
|
|
57
|
+
const rampTexture = getWgpuEffectGradientRampTexture(state, effect.colors, effect.alphas, effect.ratios);
|
|
58
|
+
const rampBG = device.createBindGroup({
|
|
59
|
+
layout: fs.textureBGLayout,
|
|
60
|
+
entries: [
|
|
61
|
+
{ binding: 0, resource: rampTexture.createView() },
|
|
62
|
+
{ binding: 1, resource: fs.sampler },
|
|
63
|
+
],
|
|
64
|
+
});
|
|
65
|
+
const encodedBG = device.createBindGroup({
|
|
66
|
+
layout: fs.textureBGLayout,
|
|
67
|
+
entries: [
|
|
68
|
+
{ binding: 0, resource: s0.view },
|
|
69
|
+
{ binding: 1, resource: fs.sampler },
|
|
70
|
+
],
|
|
71
|
+
});
|
|
72
|
+
const sourceBG = device.createBindGroup({
|
|
73
|
+
layout: fs.textureBGLayout,
|
|
74
|
+
entries: [
|
|
75
|
+
{ binding: 0, resource: src.view },
|
|
76
|
+
{ binding: 1, resource: fs.sampler },
|
|
77
|
+
],
|
|
78
|
+
});
|
|
79
|
+
const applyPipeline = getApplyPipeline(state);
|
|
80
|
+
const applySlot = fs.acquireSlot();
|
|
81
|
+
fs.writeSlot(applySlot, () => { });
|
|
82
|
+
const applyPass = fs.beginPass(s1, 'load');
|
|
83
|
+
applyPass.setPipeline(applyPipeline.pipeline);
|
|
84
|
+
applyPass.setBindGroup(0, fs.uniformBG, [applySlot]);
|
|
85
|
+
applyPass.setBindGroup(1, encodedBG);
|
|
86
|
+
applyPass.setBindGroup(2, rampBG);
|
|
87
|
+
applyPass.setBindGroup(3, sourceBG);
|
|
88
|
+
applyPass.draw(6);
|
|
89
|
+
applyPass.end();
|
|
90
|
+
clearWgpuEffectTarget(state, dst);
|
|
91
|
+
if (!(effect.bevelType && effect.bevelType !== 'full')) {
|
|
92
|
+
applyWgpuEffectBlitPass(state, src, dst);
|
|
93
|
+
}
|
|
94
|
+
applyWgpuEffectBlitPass(state, s1, dst);
|
|
95
|
+
releaseWgpuRenderTarget(pool, s0);
|
|
96
|
+
releaseWgpuRenderTarget(pool, s1);
|
|
97
|
+
releaseWgpuRenderTarget(pool, s2);
|
|
98
|
+
}
|
|
99
|
+
export const defaultWgpuGradientBevelEffectRunner = (ctx, effect) => {
|
|
100
|
+
applyGradientBevelEffectToWgpu(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
101
|
+
};
|
|
102
|
+
// Samples the blurred alpha at +offset and -offset to compute a bevel value
|
|
103
|
+
// in [-1, 1], mapped to [0, 1] for gradient lookup. Outputs the encoded value
|
|
104
|
+
// in the red channel; alpha=1 (will be clipped later).
|
|
105
|
+
//
|
|
106
|
+
// Note: The Y offset component is negated versus the Gl implementation so
|
|
107
|
+
// that the bevel direction matches across backends (Wgpu UV y=0 is top-left).
|
|
108
|
+
//
|
|
109
|
+
// Uniforms layout (16 bytes):
|
|
110
|
+
// offset 0: offset (vec2f)
|
|
111
|
+
// offset 8: _pad (vec2f)
|
|
112
|
+
const BEVEL_ENCODE_FRAGMENT_WGSL = /* wgsl */ `
|
|
113
|
+
struct Uniforms {
|
|
114
|
+
offset : vec2f,
|
|
115
|
+
_pad : vec2f,
|
|
116
|
+
}
|
|
117
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
118
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
119
|
+
@group(1) @binding(1) var smp : sampler;
|
|
120
|
+
|
|
121
|
+
@fragment
|
|
122
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
123
|
+
let high = textureSampleLevel(tex, smp, uv - uni.offset, 0.0).a;
|
|
124
|
+
let low = textureSampleLevel(tex, smp, uv + uni.offset, 0.0).a;
|
|
125
|
+
let bevelVal = clamp((high - low) * 0.5 + 0.5, 0.0, 1.0);
|
|
126
|
+
return vec4f(bevelVal, 0.0, 0.0, 1.0);
|
|
127
|
+
}`;
|
|
128
|
+
// Looks up the encoded bevel value (in .r) in the gradient ramp (group 2)
|
|
129
|
+
// and clips the result to the source alpha (group 3).
|
|
130
|
+
const BEVEL_APPLY_FRAGMENT_WGSL = /* wgsl */ `
|
|
131
|
+
struct Uniforms { _u : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
|
|
132
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
133
|
+
@group(1) @binding(0) var texEncoded : texture_2d<f32>;
|
|
134
|
+
@group(1) @binding(1) var smp : sampler;
|
|
135
|
+
@group(2) @binding(0) var texRamp : texture_2d<f32>;
|
|
136
|
+
@group(2) @binding(1) var smp2 : sampler;
|
|
137
|
+
@group(3) @binding(0) var texSource : texture_2d<f32>;
|
|
138
|
+
@group(3) @binding(1) var smp3 : sampler;
|
|
139
|
+
|
|
140
|
+
@fragment
|
|
141
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
142
|
+
let bevelVal = textureSampleLevel(texEncoded, smp, uv, 0.0).r;
|
|
143
|
+
let color = textureSampleLevel(texRamp, smp2, vec2f(bevelVal, 0.5), 0.0);
|
|
144
|
+
let srcAlpha = textureSampleLevel(texSource, smp3, uv, 0.0).a;
|
|
145
|
+
return color * srcAlpha;
|
|
146
|
+
}`;
|
|
147
|
+
function getApplyPipeline(state) {
|
|
148
|
+
let p = applyPipelines.get(state);
|
|
149
|
+
if (p === undefined) {
|
|
150
|
+
const fs = getWgpuEffectPassState(state);
|
|
151
|
+
const { device, format } = state;
|
|
152
|
+
const shaderModule = device.createShaderModule({ code: EFFECT_VERTEX_WGSL + BEVEL_APPLY_FRAGMENT_WGSL });
|
|
153
|
+
const pipelineLayout = device.createPipelineLayout({
|
|
154
|
+
bindGroupLayouts: [fs.uniformBGLayout, fs.textureBGLayout, fs.textureBGLayout, fs.textureBGLayout],
|
|
155
|
+
});
|
|
156
|
+
const pipeline = device.createRenderPipeline({
|
|
157
|
+
layout: pipelineLayout,
|
|
158
|
+
vertex: { module: shaderModule, entryPoint: 'vs_main' },
|
|
159
|
+
fragment: { module: shaderModule, entryPoint: 'fs_main', targets: [{ format }] },
|
|
160
|
+
primitive: { topology: 'triangle-list' },
|
|
161
|
+
});
|
|
162
|
+
p = { pipeline, blendMode: 'premul' };
|
|
163
|
+
applyPipelines.set(state, p);
|
|
164
|
+
}
|
|
165
|
+
return p;
|
|
166
|
+
}
|
|
167
|
+
function getEncodePipeline(state) {
|
|
168
|
+
let p = encodePipelines.get(state);
|
|
169
|
+
if (p === undefined) {
|
|
170
|
+
const fs = getWgpuEffectPassState(state);
|
|
171
|
+
const { device, format } = state;
|
|
172
|
+
const shaderModule = device.createShaderModule({ code: EFFECT_VERTEX_WGSL + BEVEL_ENCODE_FRAGMENT_WGSL });
|
|
173
|
+
const pipelineLayout = device.createPipelineLayout({
|
|
174
|
+
bindGroupLayouts: [fs.uniformBGLayout, fs.textureBGLayout],
|
|
175
|
+
});
|
|
176
|
+
const pipeline = device.createRenderPipeline({
|
|
177
|
+
layout: pipelineLayout,
|
|
178
|
+
vertex: { module: shaderModule, entryPoint: 'vs_main' },
|
|
179
|
+
fragment: { module: shaderModule, entryPoint: 'fs_main', targets: [{ format }] },
|
|
180
|
+
primitive: { topology: 'triangle-list' },
|
|
181
|
+
});
|
|
182
|
+
p = { pipeline, blendMode: 'replace' };
|
|
183
|
+
encodePipelines.set(state, p);
|
|
184
|
+
}
|
|
185
|
+
return p;
|
|
186
|
+
}
|
|
187
|
+
const encodePipelines = new WeakMap();
|
|
188
|
+
const applyPipelines = new WeakMap();
|
|
189
|
+
//# sourceMappingURL=wgpuGradientBevelEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuGradientBevelEffect.js","sourceRoot":"","sources":["../src/wgpuGradientBevelEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GradientGlowEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget, WgpuRenderTargetPool } from '@flighthq/types';
|
|
2
|
+
export declare function applyGradientGlowEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, pool: WgpuRenderTargetPool, effect: Readonly<GradientGlowEffect>): void;
|
|
3
|
+
export declare const defaultWgpuGradientGlowEffectRunner: WgpuRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=wgpuGradientGlowEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuGradientGlowEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGradientGlowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAYzB,wBAAgB,6BAA6B,CAC3C,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,kBAAkB,CAAC,GACnC,IAAI,CAwDN;AAED,eAAO,MAAM,mCAAmC,EAAE,sBAEjD,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { acquireWgpuRenderTarget, releaseWgpuRenderTarget } from '@flighthq/render-wgpu';
|
|
2
|
+
import { applyWgpuEffectBlitPass } from './wgpuEffectBlitShader';
|
|
3
|
+
import { applyWgpuEffectBoxBlur } from './wgpuEffectBoxBlur';
|
|
4
|
+
import { getWgpuEffectGradientRampTexture } from './wgpuEffectGradientRamp';
|
|
5
|
+
import { clearWgpuEffectTarget, EFFECT_VERTEX_WGSL, getWgpuEffectPassState } from './wgpuEffectPass';
|
|
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.
|
|
8
|
+
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
9
|
+
// multi-pass recipe (neutral tint → box blur → gradient lookup → composite), then releases them.
|
|
10
|
+
export function applyGradientGlowEffectToWgpu(state, source, dest, pool, effect) {
|
|
11
|
+
const src = source;
|
|
12
|
+
const dst = dest;
|
|
13
|
+
const descriptor = { width: source.width, height: source.height, format: source.format };
|
|
14
|
+
const s0 = acquireWgpuRenderTarget(state, pool, descriptor);
|
|
15
|
+
const s1 = acquireWgpuRenderTarget(state, pool, descriptor);
|
|
16
|
+
const s2 = acquireWgpuRenderTarget(state, pool, descriptor);
|
|
17
|
+
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
18
|
+
const strength = effect.strength ?? 1;
|
|
19
|
+
const { device } = state;
|
|
20
|
+
const fs = getWgpuEffectPassState(state);
|
|
21
|
+
applyWgpuEffectTintPass(state, src, s0, 0xffffff, 1, Math.min(1, strength));
|
|
22
|
+
applyWgpuEffectBoxBlur(state, s0, s1, s2, {
|
|
23
|
+
blurX: effect.blurX ?? 6,
|
|
24
|
+
blurY: effect.blurY ?? 6,
|
|
25
|
+
passes: quality,
|
|
26
|
+
});
|
|
27
|
+
const rampTexture = getWgpuEffectGradientRampTexture(state, effect.colors, effect.alphas, effect.ratios);
|
|
28
|
+
const rampBG = device.createBindGroup({
|
|
29
|
+
layout: fs.textureBGLayout,
|
|
30
|
+
entries: [
|
|
31
|
+
{ binding: 0, resource: rampTexture.createView() },
|
|
32
|
+
{ binding: 1, resource: fs.sampler },
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
const blurredBG = device.createBindGroup({
|
|
36
|
+
layout: fs.textureBGLayout,
|
|
37
|
+
entries: [
|
|
38
|
+
{ binding: 0, resource: s1.view },
|
|
39
|
+
{ binding: 1, resource: fs.sampler },
|
|
40
|
+
],
|
|
41
|
+
});
|
|
42
|
+
const pipeline = getLookupPipeline(state);
|
|
43
|
+
const slotOffset = fs.acquireSlot();
|
|
44
|
+
fs.writeSlot(slotOffset, () => { });
|
|
45
|
+
const pass = fs.beginPass(s0, 'load');
|
|
46
|
+
pass.setPipeline(pipeline.pipeline);
|
|
47
|
+
pass.setBindGroup(0, fs.uniformBG, [slotOffset]);
|
|
48
|
+
pass.setBindGroup(1, blurredBG);
|
|
49
|
+
pass.setBindGroup(2, rampBG);
|
|
50
|
+
pass.draw(6);
|
|
51
|
+
pass.end();
|
|
52
|
+
clearWgpuEffectTarget(state, dst);
|
|
53
|
+
applyWgpuEffectBlitPass(state, s0, dst);
|
|
54
|
+
applyWgpuEffectBlitPass(state, src, dst);
|
|
55
|
+
releaseWgpuRenderTarget(pool, s0);
|
|
56
|
+
releaseWgpuRenderTarget(pool, s1);
|
|
57
|
+
releaseWgpuRenderTarget(pool, s2);
|
|
58
|
+
}
|
|
59
|
+
export const defaultWgpuGradientGlowEffectRunner = (ctx, effect) => {
|
|
60
|
+
applyGradientGlowEffectToWgpu(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
61
|
+
};
|
|
62
|
+
// Uses the blurred alpha (group 1) to index into a gradient ramp texture (group 2).
|
|
63
|
+
const GRADIENT_LOOKUP_FRAGMENT_WGSL = /* wgsl */ `
|
|
64
|
+
struct Uniforms { _u : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
|
|
65
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
66
|
+
@group(1) @binding(0) var texBlurred : texture_2d<f32>;
|
|
67
|
+
@group(1) @binding(1) var smp : sampler;
|
|
68
|
+
@group(2) @binding(0) var texRamp : texture_2d<f32>;
|
|
69
|
+
@group(2) @binding(1) var smp2 : sampler;
|
|
70
|
+
|
|
71
|
+
@fragment
|
|
72
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
73
|
+
let alpha = textureSampleLevel(texBlurred, smp, uv, 0.0).a;
|
|
74
|
+
return textureSampleLevel(texRamp, smp2, vec2f(alpha, 0.5), 0.0);
|
|
75
|
+
}`;
|
|
76
|
+
function getLookupPipeline(state) {
|
|
77
|
+
let p = lookupPipelines.get(state);
|
|
78
|
+
if (p === undefined) {
|
|
79
|
+
const fs = getWgpuEffectPassState(state);
|
|
80
|
+
const { device, format } = state;
|
|
81
|
+
const shaderModule = device.createShaderModule({ code: EFFECT_VERTEX_WGSL + GRADIENT_LOOKUP_FRAGMENT_WGSL });
|
|
82
|
+
const pipelineLayout = device.createPipelineLayout({
|
|
83
|
+
bindGroupLayouts: [fs.uniformBGLayout, fs.textureBGLayout, fs.textureBGLayout],
|
|
84
|
+
});
|
|
85
|
+
const pipeline = device.createRenderPipeline({
|
|
86
|
+
layout: pipelineLayout,
|
|
87
|
+
vertex: { module: shaderModule, entryPoint: 'vs_main' },
|
|
88
|
+
fragment: { module: shaderModule, entryPoint: 'fs_main', targets: [{ format }] },
|
|
89
|
+
primitive: { topology: 'triangle-list' },
|
|
90
|
+
});
|
|
91
|
+
p = { pipeline, blendMode: 'premul' };
|
|
92
|
+
lookupPipelines.set(state, p);
|
|
93
|
+
}
|
|
94
|
+
return p;
|
|
95
|
+
}
|
|
96
|
+
const lookupPipelines = new WeakMap();
|
|
97
|
+
//# sourceMappingURL=wgpuGradientGlowEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuGradientGlowEffect.js","sourceRoot":"","sources":["../src/wgpuGradientGlowEffect.ts"],"names":[],"mappings":"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"}
|