@flighthq/effects-wgpu 0.1.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 +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/wgpuBloomEffect.d.ts +4 -0
- package/dist/wgpuBloomEffect.d.ts.map +1 -0
- package/dist/wgpuBloomEffect.js +72 -0
- package/dist/wgpuBloomEffect.js.map +1 -0
- package/dist/wgpuBokehDepthOfFieldEffect.d.ts +4 -0
- package/dist/wgpuBokehDepthOfFieldEffect.d.ts.map +1 -0
- package/dist/wgpuBokehDepthOfFieldEffect.js +51 -0
- package/dist/wgpuBokehDepthOfFieldEffect.js.map +1 -0
- package/dist/wgpuBrightnessContrastEffect.d.ts +4 -0
- package/dist/wgpuBrightnessContrastEffect.d.ts.map +1 -0
- package/dist/wgpuBrightnessContrastEffect.js +29 -0
- package/dist/wgpuBrightnessContrastEffect.js.map +1 -0
- package/dist/wgpuCameraMotionBlurEffect.d.ts +4 -0
- package/dist/wgpuCameraMotionBlurEffect.d.ts.map +1 -0
- package/dist/wgpuCameraMotionBlurEffect.js +49 -0
- package/dist/wgpuCameraMotionBlurEffect.js.map +1 -0
- package/dist/wgpuChannelMixerEffect.d.ts +4 -0
- package/dist/wgpuChannelMixerEffect.d.ts.map +1 -0
- package/dist/wgpuChannelMixerEffect.js +34 -0
- package/dist/wgpuChannelMixerEffect.js.map +1 -0
- package/dist/wgpuChromaticAberrationEffect.d.ts +4 -0
- package/dist/wgpuChromaticAberrationEffect.d.ts.map +1 -0
- package/dist/wgpuChromaticAberrationEffect.js +40 -0
- package/dist/wgpuChromaticAberrationEffect.js.map +1 -0
- package/dist/wgpuColorGradeEffect.d.ts +4 -0
- package/dist/wgpuColorGradeEffect.d.ts.map +1 -0
- package/dist/wgpuColorGradeEffect.js +52 -0
- package/dist/wgpuColorGradeEffect.js.map +1 -0
- package/dist/wgpuCrtEffect.d.ts +4 -0
- package/dist/wgpuCrtEffect.d.ts.map +1 -0
- package/dist/wgpuCrtEffect.js +60 -0
- package/dist/wgpuCrtEffect.js.map +1 -0
- package/dist/wgpuDirectionalBlurEffect.d.ts +4 -0
- package/dist/wgpuDirectionalBlurEffect.d.ts.map +1 -0
- package/dist/wgpuDirectionalBlurEffect.js +52 -0
- package/dist/wgpuDirectionalBlurEffect.js.map +1 -0
- package/dist/wgpuDisplacementEffect.d.ts +4 -0
- package/dist/wgpuDisplacementEffect.d.ts.map +1 -0
- package/dist/wgpuDisplacementEffect.js +44 -0
- package/dist/wgpuDisplacementEffect.js.map +1 -0
- package/dist/wgpuDitherEffect.d.ts +4 -0
- package/dist/wgpuDitherEffect.d.ts.map +1 -0
- package/dist/wgpuDitherEffect.js +45 -0
- package/dist/wgpuDitherEffect.js.map +1 -0
- package/dist/wgpuEffectProgramCache.d.ts +4 -0
- package/dist/wgpuEffectProgramCache.d.ts.map +1 -0
- package/dist/wgpuEffectProgramCache.js +26 -0
- package/dist/wgpuEffectProgramCache.js.map +1 -0
- package/dist/wgpuExposureEffect.d.ts +4 -0
- package/dist/wgpuExposureEffect.d.ts.map +1 -0
- package/dist/wgpuExposureEffect.js +28 -0
- package/dist/wgpuExposureEffect.js.map +1 -0
- package/dist/wgpuFilmGrainEffect.d.ts +4 -0
- package/dist/wgpuFilmGrainEffect.d.ts.map +1 -0
- package/dist/wgpuFilmGrainEffect.js +41 -0
- package/dist/wgpuFilmGrainEffect.js.map +1 -0
- package/dist/wgpuFxaaEffect.d.ts +4 -0
- package/dist/wgpuFxaaEffect.d.ts.map +1 -0
- package/dist/wgpuFxaaEffect.js +65 -0
- package/dist/wgpuFxaaEffect.js.map +1 -0
- package/dist/wgpuGlitchEffect.d.ts +4 -0
- package/dist/wgpuGlitchEffect.d.ts.map +1 -0
- package/dist/wgpuGlitchEffect.js +60 -0
- package/dist/wgpuGlitchEffect.js.map +1 -0
- package/dist/wgpuGodRaysEffect.d.ts +4 -0
- package/dist/wgpuGodRaysEffect.d.ts.map +1 -0
- package/dist/wgpuGodRaysEffect.js +67 -0
- package/dist/wgpuGodRaysEffect.js.map +1 -0
- package/dist/wgpuGrayscaleEffect.d.ts +4 -0
- package/dist/wgpuGrayscaleEffect.d.ts.map +1 -0
- package/dist/wgpuGrayscaleEffect.js +27 -0
- package/dist/wgpuGrayscaleEffect.js.map +1 -0
- package/dist/wgpuHalftoneEffect.d.ts +4 -0
- package/dist/wgpuHalftoneEffect.d.ts.map +1 -0
- package/dist/wgpuHalftoneEffect.js +45 -0
- package/dist/wgpuHalftoneEffect.js.map +1 -0
- package/dist/wgpuHueSaturationEffect.d.ts +4 -0
- package/dist/wgpuHueSaturationEffect.d.ts.map +1 -0
- package/dist/wgpuHueSaturationEffect.js +75 -0
- package/dist/wgpuHueSaturationEffect.js.map +1 -0
- package/dist/wgpuInvertEffect.d.ts +4 -0
- package/dist/wgpuInvertEffect.d.ts.map +1 -0
- package/dist/wgpuInvertEffect.js +26 -0
- package/dist/wgpuInvertEffect.js.map +1 -0
- package/dist/wgpuKuwaharaEffect.d.ts +4 -0
- package/dist/wgpuKuwaharaEffect.d.ts.map +1 -0
- package/dist/wgpuKuwaharaEffect.js +69 -0
- package/dist/wgpuKuwaharaEffect.js.map +1 -0
- package/dist/wgpuLensDirtEffect.d.ts +4 -0
- package/dist/wgpuLensDirtEffect.d.ts.map +1 -0
- package/dist/wgpuLensDirtEffect.js +51 -0
- package/dist/wgpuLensDirtEffect.js.map +1 -0
- package/dist/wgpuLensDistortionEffect.d.ts +4 -0
- package/dist/wgpuLensDistortionEffect.d.ts.map +1 -0
- package/dist/wgpuLensDistortionEffect.js +36 -0
- package/dist/wgpuLensDistortionEffect.js.map +1 -0
- package/dist/wgpuLensFlareEffect.d.ts +4 -0
- package/dist/wgpuLensFlareEffect.d.ts.map +1 -0
- package/dist/wgpuLensFlareEffect.js +61 -0
- package/dist/wgpuLensFlareEffect.js.map +1 -0
- package/dist/wgpuLiftGammaGainEffect.d.ts +4 -0
- package/dist/wgpuLiftGammaGainEffect.d.ts.map +1 -0
- package/dist/wgpuLiftGammaGainEffect.js +51 -0
- package/dist/wgpuLiftGammaGainEffect.js.map +1 -0
- package/dist/wgpuLookupTableGradeEffect.d.ts +4 -0
- package/dist/wgpuLookupTableGradeEffect.d.ts.map +1 -0
- package/dist/wgpuLookupTableGradeEffect.js +30 -0
- package/dist/wgpuLookupTableGradeEffect.js.map +1 -0
- package/dist/wgpuMotionBlurEffect.d.ts +4 -0
- package/dist/wgpuMotionBlurEffect.d.ts.map +1 -0
- package/dist/wgpuMotionBlurEffect.js +97 -0
- package/dist/wgpuMotionBlurEffect.js.map +1 -0
- package/dist/wgpuOutlineEffect.d.ts +4 -0
- package/dist/wgpuOutlineEffect.d.ts.map +1 -0
- package/dist/wgpuOutlineEffect.js +64 -0
- package/dist/wgpuOutlineEffect.js.map +1 -0
- package/dist/wgpuPixelateEffect.d.ts +4 -0
- package/dist/wgpuPixelateEffect.d.ts.map +1 -0
- package/dist/wgpuPixelateEffect.js +34 -0
- package/dist/wgpuPixelateEffect.js.map +1 -0
- package/dist/wgpuPosterizeEffect.d.ts +4 -0
- package/dist/wgpuPosterizeEffect.d.ts.map +1 -0
- package/dist/wgpuPosterizeEffect.js +27 -0
- package/dist/wgpuPosterizeEffect.js.map +1 -0
- package/dist/wgpuRadialBlurEffect.d.ts +4 -0
- package/dist/wgpuRadialBlurEffect.d.ts.map +1 -0
- package/dist/wgpuRadialBlurEffect.js +50 -0
- package/dist/wgpuRadialBlurEffect.js.map +1 -0
- package/dist/wgpuRenderEffectPipeline.d.ts +7 -0
- package/dist/wgpuRenderEffectPipeline.d.ts.map +1 -0
- package/dist/wgpuRenderEffectPipeline.js +106 -0
- package/dist/wgpuRenderEffectPipeline.js.map +1 -0
- package/dist/wgpuRenderEffectRegistrants.d.ts +9 -0
- package/dist/wgpuRenderEffectRegistrants.d.ts.map +1 -0
- package/dist/wgpuRenderEffectRegistrants.js +129 -0
- package/dist/wgpuRenderEffectRegistrants.js.map +1 -0
- package/dist/wgpuRenderEffectRegistry.d.ts +5 -0
- package/dist/wgpuRenderEffectRegistry.d.ts.map +1 -0
- package/dist/wgpuRenderEffectRegistry.js +25 -0
- package/dist/wgpuRenderEffectRegistry.js.map +1 -0
- package/dist/wgpuScanlinesEffect.d.ts +4 -0
- package/dist/wgpuScanlinesEffect.d.ts.map +1 -0
- package/dist/wgpuScanlinesEffect.js +32 -0
- package/dist/wgpuScanlinesEffect.js.map +1 -0
- package/dist/wgpuScreenSpaceFogEffect.d.ts +4 -0
- package/dist/wgpuScreenSpaceFogEffect.d.ts.map +1 -0
- package/dist/wgpuScreenSpaceFogEffect.js +47 -0
- package/dist/wgpuScreenSpaceFogEffect.js.map +1 -0
- package/dist/wgpuSepiaEffect.d.ts +4 -0
- package/dist/wgpuSepiaEffect.d.ts.map +1 -0
- package/dist/wgpuSepiaEffect.js +31 -0
- package/dist/wgpuSepiaEffect.js.map +1 -0
- package/dist/wgpuSharpenEffect.d.ts +4 -0
- package/dist/wgpuSharpenEffect.d.ts.map +1 -0
- package/dist/wgpuSharpenEffect.js +40 -0
- package/dist/wgpuSharpenEffect.js.map +1 -0
- package/dist/wgpuSketchEffect.d.ts +4 -0
- package/dist/wgpuSketchEffect.d.ts.map +1 -0
- package/dist/wgpuSketchEffect.js +51 -0
- package/dist/wgpuSketchEffect.js.map +1 -0
- package/dist/wgpuSmaaEffect.d.ts +4 -0
- package/dist/wgpuSmaaEffect.d.ts.map +1 -0
- package/dist/wgpuSmaaEffect.js +52 -0
- package/dist/wgpuSmaaEffect.js.map +1 -0
- package/dist/wgpuSsaoEffect.d.ts +4 -0
- package/dist/wgpuSsaoEffect.d.ts.map +1 -0
- package/dist/wgpuSsaoEffect.js +51 -0
- package/dist/wgpuSsaoEffect.js.map +1 -0
- package/dist/wgpuSsrEffect.d.ts +4 -0
- package/dist/wgpuSsrEffect.d.ts.map +1 -0
- package/dist/wgpuSsrEffect.js +28 -0
- package/dist/wgpuSsrEffect.js.map +1 -0
- package/dist/wgpuTaaEffect.d.ts +4 -0
- package/dist/wgpuTaaEffect.d.ts.map +1 -0
- package/dist/wgpuTaaEffect.js +27 -0
- package/dist/wgpuTaaEffect.js.map +1 -0
- package/dist/wgpuTiltShiftEffect.d.ts +4 -0
- package/dist/wgpuTiltShiftEffect.d.ts.map +1 -0
- package/dist/wgpuTiltShiftEffect.js +51 -0
- package/dist/wgpuTiltShiftEffect.js.map +1 -0
- package/dist/wgpuToneMapEffect.d.ts +4 -0
- package/dist/wgpuToneMapEffect.d.ts.map +1 -0
- package/dist/wgpuToneMapEffect.js +57 -0
- package/dist/wgpuToneMapEffect.js.map +1 -0
- package/dist/wgpuVignetteEffect.d.ts +4 -0
- package/dist/wgpuVignetteEffect.d.ts.map +1 -0
- package/dist/wgpuVignetteEffect.js +54 -0
- package/dist/wgpuVignetteEffect.js.map +1 -0
- package/dist/wgpuWhiteBalanceEffect.d.ts +4 -0
- package/dist/wgpuWhiteBalanceEffect.d.ts.map +1 -0
- package/dist/wgpuWhiteBalanceEffect.js +32 -0
- package/dist/wgpuWhiteBalanceEffect.js.map +1 -0
- package/package.json +42 -0
- package/src/wgpuBloomEffect.test.ts +13 -0
- package/src/wgpuBokehDepthOfFieldEffect.test.ts +16 -0
- package/src/wgpuBrightnessContrastEffect.test.ts +16 -0
- package/src/wgpuCameraMotionBlurEffect.test.ts +16 -0
- package/src/wgpuChannelMixerEffect.test.ts +13 -0
- package/src/wgpuChromaticAberrationEffect.test.ts +16 -0
- package/src/wgpuColorGradeEffect.test.ts +13 -0
- package/src/wgpuCrtEffect.test.ts +13 -0
- package/src/wgpuDirectionalBlurEffect.test.ts +13 -0
- package/src/wgpuDisplacementEffect.test.ts +13 -0
- package/src/wgpuDitherEffect.test.ts +13 -0
- package/src/wgpuEffectProgramCache.test.ts +7 -0
- package/src/wgpuExposureEffect.test.ts +13 -0
- package/src/wgpuFilmGrainEffect.test.ts +13 -0
- package/src/wgpuFxaaEffect.test.ts +13 -0
- package/src/wgpuGlitchEffect.test.ts +13 -0
- package/src/wgpuGodRaysEffect.test.ts +13 -0
- package/src/wgpuGrayscaleEffect.test.ts +13 -0
- package/src/wgpuHalftoneEffect.test.ts +13 -0
- package/src/wgpuHueSaturationEffect.test.ts +13 -0
- package/src/wgpuInvertEffect.test.ts +13 -0
- package/src/wgpuKuwaharaEffect.test.ts +13 -0
- package/src/wgpuLensDirtEffect.test.ts +13 -0
- package/src/wgpuLensDistortionEffect.test.ts +13 -0
- package/src/wgpuLensFlareEffect.test.ts +13 -0
- package/src/wgpuLiftGammaGainEffect.test.ts +13 -0
- package/src/wgpuLookupTableGradeEffect.test.ts +16 -0
- package/src/wgpuMotionBlurEffect.test.ts +13 -0
- package/src/wgpuOutlineEffect.test.ts +13 -0
- package/src/wgpuPixelateEffect.test.ts +13 -0
- package/src/wgpuPosterizeEffect.test.ts +13 -0
- package/src/wgpuRadialBlurEffect.test.ts +13 -0
- package/src/wgpuRenderEffectPipeline.test.ts +45 -0
- package/src/wgpuRenderEffectRegistrants.test.ts +122 -0
- package/src/wgpuRenderEffectRegistry.test.ts +40 -0
- package/src/wgpuScanlinesEffect.test.ts +13 -0
- package/src/wgpuScreenSpaceFogEffect.test.ts +13 -0
- package/src/wgpuSepiaEffect.test.ts +13 -0
- package/src/wgpuSharpenEffect.test.ts +13 -0
- package/src/wgpuSketchEffect.test.ts +13 -0
- package/src/wgpuSmaaEffect.test.ts +13 -0
- package/src/wgpuSsaoEffect.test.ts +13 -0
- package/src/wgpuSsrEffect.test.ts +13 -0
- package/src/wgpuTaaEffect.test.ts +13 -0
- package/src/wgpuTiltShiftEffect.test.ts +13 -0
- package/src/wgpuToneMapEffect.test.ts +13 -0
- package/src/wgpuVignetteEffect.test.ts +13 -0
- package/src/wgpuWhiteBalanceEffect.test.ts +13 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { createWgpuDualSourcePipeline } from '@flighthq/filters-wgpu';
|
|
2
|
+
import { drawWgpuDualSourcePass } from '@flighthq/filters-wgpu';
|
|
3
|
+
// Motion blur (per-object): the velocity-driven analog of the depth consumers (fog/DoF), the Wgpu
|
|
4
|
+
// mirror of effects-gl's applyMotionBlurEffectToGl. When the scene produced a per-pixel velocity
|
|
5
|
+
// buffer (`velocityTexture`, rgba16f screen-space velocity in pixels in the RG channels), this is the
|
|
6
|
+
// real recipe — read each fragment's velocity, scale it by `intensity`, and accumulate `samples` taps
|
|
7
|
+
// spread along that vector centered on the fragment, smearing every object by its own motion. The
|
|
8
|
+
// velocity texture binds as the second source via drawWgpuDualSourcePass (@group(2)). When velocity is
|
|
9
|
+
// absent (the scene did not write the buffer), u_hasVelocity=0 and it is a passthrough copy (sentinel
|
|
10
|
+
// path), preserving the pipeline stage without altering the image. Demonstrates the
|
|
11
|
+
// ctx.sceneVelocityTexture seam: real velocity path when present, sentinel copy when null.
|
|
12
|
+
export function applyMotionBlurEffectToWgpu(state, source, dest, velocityTexture, effect) {
|
|
13
|
+
const intensity = effect.intensity ?? 1;
|
|
14
|
+
const samples = effect.samples ?? 16;
|
|
15
|
+
const pipeline = getMotionBlurPipeline(state);
|
|
16
|
+
if (velocityTexture === null) {
|
|
17
|
+
// Sentinel path: no velocity buffer — bind source as both inputs so the dual-source layout is
|
|
18
|
+
// satisfied, and u_hasVelocity=0 makes the fragment a passthrough copy.
|
|
19
|
+
drawWgpuDualSourcePass(state, source, source, dest, pipeline, (f32) => {
|
|
20
|
+
f32[0] = intensity;
|
|
21
|
+
f32[1] = samples;
|
|
22
|
+
f32[2] = source.width;
|
|
23
|
+
f32[3] = source.height;
|
|
24
|
+
f32[4] = 0;
|
|
25
|
+
});
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Wrap the raw velocity GPUTexture as a minimal second source: drawWgpuDualSourcePass reads only the
|
|
29
|
+
// `.view`, so a view over the velocity texture is all that is required for the @group(2) binding.
|
|
30
|
+
const velocitySource = { view: velocityTexture.createView() };
|
|
31
|
+
drawWgpuDualSourcePass(state, source, velocitySource, dest, pipeline, (f32) => {
|
|
32
|
+
f32[0] = intensity;
|
|
33
|
+
f32[1] = samples;
|
|
34
|
+
f32[2] = source.width;
|
|
35
|
+
f32[3] = source.height;
|
|
36
|
+
f32[4] = 1;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export const defaultWgpuMotionBlurEffectRunner = (ctx, effect) => {
|
|
40
|
+
applyMotionBlurEffectToWgpu(ctx.state, ctx.source, ctx.dest, ctx.sceneVelocityTexture, effect);
|
|
41
|
+
};
|
|
42
|
+
// Motion blur needs two source bindings (color = group 1, velocity = group 2), so it uses the
|
|
43
|
+
// dual-source filter primitive; cached per state alongside the single-source effect pipelines.
|
|
44
|
+
function getMotionBlurPipeline(state) {
|
|
45
|
+
let pipeline = _motionBlurPipelines.get(state);
|
|
46
|
+
if (pipeline === undefined) {
|
|
47
|
+
pipeline = createWgpuDualSourcePipeline(state, MOTION_BLUR_FRAGMENT_WGSL, 'replace');
|
|
48
|
+
_motionBlurPipelines.set(state, pipeline);
|
|
49
|
+
}
|
|
50
|
+
return pipeline;
|
|
51
|
+
}
|
|
52
|
+
const _motionBlurPipelines = new WeakMap();
|
|
53
|
+
// Slot layout: [0]=intensity, [1]=samples, [2]=resolution.x, [3]=resolution.y, [4]=hasVelocity. Color
|
|
54
|
+
// binds at group 1, velocity at group 2. u_resolution converts the pixel-space velocity into UV offsets.
|
|
55
|
+
const MOTION_BLUR_FRAGMENT_WGSL = /* wgsl */ `
|
|
56
|
+
struct Uniforms {
|
|
57
|
+
u_intensity : f32,
|
|
58
|
+
u_samples : f32,
|
|
59
|
+
u_resolution : vec2f,
|
|
60
|
+
u_hasVelocity : f32,
|
|
61
|
+
_pad0 : f32,
|
|
62
|
+
_pad1 : f32,
|
|
63
|
+
_pad2 : f32,
|
|
64
|
+
}
|
|
65
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
66
|
+
@group(1) @binding(0) var tex0 : texture_2d<f32>;
|
|
67
|
+
@group(1) @binding(1) var smp0 : sampler;
|
|
68
|
+
@group(2) @binding(0) var tex1 : texture_2d<f32>;
|
|
69
|
+
@group(2) @binding(1) var smp1 : sampler;
|
|
70
|
+
|
|
71
|
+
const SAMPLES : i32 = 16;
|
|
72
|
+
|
|
73
|
+
@fragment
|
|
74
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
75
|
+
let base = textureSampleLevel(tex0, smp0, uv, 0.0);
|
|
76
|
+
if (uni.u_hasVelocity < 0.5) {
|
|
77
|
+
// Sentinel path: no velocity buffer written — passthrough copy.
|
|
78
|
+
return base;
|
|
79
|
+
}
|
|
80
|
+
// Velocity decode: rgba16f buffer stores screen-space velocity in pixels in the RG channels. Convert
|
|
81
|
+
// to a UV-space smear vector via u_resolution and scale by intensity.
|
|
82
|
+
let velocityPixels = textureSampleLevel(tex1, smp1, uv, 0.0).rg;
|
|
83
|
+
let smear = (velocityPixels / uni.u_resolution) * uni.u_intensity;
|
|
84
|
+
let count = min(uni.u_samples, 16.0);
|
|
85
|
+
var sum = vec4f(0.0);
|
|
86
|
+
var taken = 0.0;
|
|
87
|
+
for (var i = 0; i < SAMPLES; i = i + 1) {
|
|
88
|
+
if (f32(i) >= count) { break; }
|
|
89
|
+
// Center the taps on the fragment: t in [-0.5, 0.5] spreads the accumulation along the motion vector.
|
|
90
|
+
let t = select(0.0, (f32(i) / (count - 1.0)) - 0.5, count > 1.0);
|
|
91
|
+
let p = uv + smear * t;
|
|
92
|
+
sum = sum + textureSampleLevel(tex0, smp0, p, 0.0);
|
|
93
|
+
taken = taken + 1.0;
|
|
94
|
+
}
|
|
95
|
+
return sum / max(taken, 1.0);
|
|
96
|
+
}`;
|
|
97
|
+
//# sourceMappingURL=wgpuMotionBlurEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuMotionBlurEffect.js","sourceRoot":"","sources":["../src/wgpuMotionBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,kGAAkG;AAClG,iGAAiG;AACjG,sGAAsG;AACtG,sGAAsG;AACtG,kGAAkG;AAClG,uGAAuG;AACvG,sGAAsG;AACtG,oFAAoF;AACpF,2FAA2F;AAC3F,MAAM,UAAU,2BAA2B,CACzC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,eAAkC,EAClC,MAAkC;IAElC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QAC7B,8FAA8F;QAC9F,wEAAwE;QACxE,sBAAsB,CACpB,KAAK,EACL,MAA0B,EAC1B,MAA0B,EAC1B,IAAwB,EACxB,QAAQ,EACR,CAAC,GAAG,EAAE,EAAE;YACN,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;YACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;YACjB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC,CACF,CAAC;QACF,OAAO;IACT,CAAC;IACD,qGAAqG;IACrG,kGAAkG;IAClG,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,UAAU,EAAE,EAAsB,CAAC;IAClF,sBAAsB,CACpB,KAAK,EACL,MAA0B,EAC1B,cAAc,EACd,IAAwB,EACxB,QAAQ,EACR,CAAC,GAAG,EAAE,EAAE;QACN,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iCAAiC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACvF,2BAA2B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,oBAAoB,EAAE,MAA0B,CAAC,CAAC;AACrH,CAAC,CAAC;AAEF,8FAA8F;AAC9F,+FAA+F;AAC/F,SAAS,qBAAqB,CAAC,KAAsB;IACnD,IAAI,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,QAAQ,GAAG,4BAA4B,CAAC,KAAK,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;QACrF,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAA2C,CAAC;AAEpF,sGAAsG;AACtG,yGAAyG;AACzG,MAAM,yBAAyB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyC3C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OutlineEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function applyOutlineEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<OutlineEffect>): void;
|
|
3
|
+
export declare const defaultWgpuOutlineEffectRunner: WgpuRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=wgpuOutlineEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuOutlineEffect.d.ts","sourceRoot":"","sources":["../src/wgpuOutlineEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAMhH,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,CAqBN;AAED,eAAO,MAAM,8BAA8B,EAAE,sBAE5C,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
|
|
2
|
+
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
3
|
+
// Outline: Sobel edge detection on luminance; where the gradient magnitude exceeds `threshold`, mix
|
|
4
|
+
// the pixel toward the outline color by `thickness`. Color arrives packed RGBA, unpacked to 0..1 here.
|
|
5
|
+
export function applyOutlineEffectToWgpu(state, source, dest, effect) {
|
|
6
|
+
const threshold = effect.threshold ?? 0.2;
|
|
7
|
+
const thickness = effect.thickness ?? 1;
|
|
8
|
+
const color = effect.color ?? 0x000000ff;
|
|
9
|
+
const r = ((color >>> 24) & 0xff) / 255;
|
|
10
|
+
const g = ((color >>> 16) & 0xff) / 255;
|
|
11
|
+
const b = ((color >>> 8) & 0xff) / 255;
|
|
12
|
+
const a = (color & 0xff) / 255;
|
|
13
|
+
const pipeline = getWgpuEffectPipeline(state, 'stylization.outline', OUTLINE_FRAGMENT_WGSL, 'replace');
|
|
14
|
+
drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
|
|
15
|
+
f32[0] = threshold;
|
|
16
|
+
f32[1] = thickness;
|
|
17
|
+
// u_resolution (vec2f) aligns to slot [2].
|
|
18
|
+
f32[2] = source.width;
|
|
19
|
+
f32[3] = source.height;
|
|
20
|
+
// u_color (vec4f) aligns to slot [4].
|
|
21
|
+
f32[4] = r;
|
|
22
|
+
f32[5] = g;
|
|
23
|
+
f32[6] = b;
|
|
24
|
+
f32[7] = a;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export const defaultWgpuOutlineEffectRunner = (ctx, effect) => {
|
|
28
|
+
applyOutlineEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
|
|
29
|
+
};
|
|
30
|
+
// Slot layout: [0]=threshold, [1]=thickness, [2..3]=resolution, [4..7]=color rgba.
|
|
31
|
+
const OUTLINE_FRAGMENT_WGSL = /* wgsl */ `
|
|
32
|
+
struct Uniforms {
|
|
33
|
+
u_threshold : f32,
|
|
34
|
+
u_thickness : f32,
|
|
35
|
+
u_resolution : vec2f,
|
|
36
|
+
u_color : vec4f,
|
|
37
|
+
}
|
|
38
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
39
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
40
|
+
@group(1) @binding(1) var smp : sampler;
|
|
41
|
+
|
|
42
|
+
fn lum(uv : vec2f) -> f32 {
|
|
43
|
+
return dot(textureSampleLevel(tex, smp, uv, 0.0).rgb, vec3f(0.2126, 0.7152, 0.0722));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@fragment
|
|
47
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
48
|
+
let texel = uni.u_thickness / uni.u_resolution;
|
|
49
|
+
let tl = lum(uv + texel * vec2f(-1.0, -1.0));
|
|
50
|
+
let t = lum(uv + texel * vec2f(0.0, -1.0));
|
|
51
|
+
let tr = lum(uv + texel * vec2f(1.0, -1.0));
|
|
52
|
+
let l = lum(uv + texel * vec2f(-1.0, 0.0));
|
|
53
|
+
let rr = lum(uv + texel * vec2f(1.0, 0.0));
|
|
54
|
+
let bl = lum(uv + texel * vec2f(-1.0, 1.0));
|
|
55
|
+
let b = lum(uv + texel * vec2f(0.0, 1.0));
|
|
56
|
+
let br = lum(uv + texel * vec2f(1.0, 1.0));
|
|
57
|
+
let gx = -tl - 2.0 * l - bl + tr + 2.0 * rr + br;
|
|
58
|
+
let gy = -tl - 2.0 * t - tr + bl + 2.0 * b + br;
|
|
59
|
+
let edge = sqrt(gx * gx + gy * gy);
|
|
60
|
+
let c = textureSampleLevel(tex, smp, uv, 0.0);
|
|
61
|
+
let k = step(uni.u_threshold, edge);
|
|
62
|
+
return mix(c, uni.u_color, k * uni.u_color.a);
|
|
63
|
+
}`;
|
|
64
|
+
//# sourceMappingURL=wgpuOutlineEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuOutlineEffect.js","sourceRoot":"","sources":["../src/wgpuOutlineEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,oGAAoG;AACpG,uGAAuG;AACvG,MAAM,UAAU,wBAAwB,CACtC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA+B;IAE/B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACvC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAC/B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;IACvG,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,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,sCAAsC;QACtC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,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,mFAAmF;AACnF,MAAM,qBAAqB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCvC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PixelateEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function applyPixelateEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<PixelateEffect>): void;
|
|
3
|
+
export declare const defaultWgpuPixelateEffectRunner: WgpuRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=wgpuPixelateEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuPixelateEffect.d.ts","sourceRoot":"","sources":["../src/wgpuPixelateEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKjH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CASN;AAED,eAAO,MAAM,+BAA+B,EAAE,sBAE7C,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
|
|
2
|
+
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
3
|
+
// Pixelate: snap uv to the center of `size`-pixel blocks before sampling, producing hard mosaic blocks.
|
|
4
|
+
export function applyPixelateEffectToWgpu(state, source, dest, effect) {
|
|
5
|
+
const size = effect.size ?? 8;
|
|
6
|
+
const pipeline = getWgpuEffectPipeline(state, 'stylization.pixelate', PIXELATE_FRAGMENT_WGSL, 'replace');
|
|
7
|
+
drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
|
|
8
|
+
f32[0] = Math.max(1, size);
|
|
9
|
+
// u_resolution (vec2f) aligns to slot [2].
|
|
10
|
+
f32[2] = source.width;
|
|
11
|
+
f32[3] = source.height;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export const defaultWgpuPixelateEffectRunner = (ctx, effect) => {
|
|
15
|
+
applyPixelateEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
|
|
16
|
+
};
|
|
17
|
+
// Slot layout: [0]=size, [1]=pad, [2..3]=resolution.
|
|
18
|
+
const PIXELATE_FRAGMENT_WGSL = /* wgsl */ `
|
|
19
|
+
struct Uniforms {
|
|
20
|
+
u_size : f32,
|
|
21
|
+
_pad0 : f32,
|
|
22
|
+
u_resolution : vec2f,
|
|
23
|
+
}
|
|
24
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
25
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
26
|
+
@group(1) @binding(1) var smp : sampler;
|
|
27
|
+
|
|
28
|
+
@fragment
|
|
29
|
+
fn fs_main(@location(0) uvIn : vec2f) -> @location(0) vec4f {
|
|
30
|
+
let blocks = uni.u_resolution / uni.u_size;
|
|
31
|
+
let uv = (floor(uvIn * blocks) + 0.5) / blocks;
|
|
32
|
+
return textureSampleLevel(tex, smp, uv, 0.0);
|
|
33
|
+
}`;
|
|
34
|
+
//# sourceMappingURL=wgpuPixelateEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuPixelateEffect.js","sourceRoot":"","sources":["../src/wgpuPixelateEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,wGAAwG;AACxG,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAgC;IAEhC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3B,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,+BAA+B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,qDAAqD;AACrD,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;EAexC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PosterizeEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function applyPosterizeEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<PosterizeEffect>): void;
|
|
3
|
+
export declare const defaultWgpuPosterizeEffectRunner: WgpuRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=wgpuPosterizeEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuPosterizeEffect.d.ts","sourceRoot":"","sources":["../src/wgpuPosterizeEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKlH,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,CAMN;AAED,eAAO,MAAM,gCAAgC,EAAE,sBAE9C,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
|
|
2
|
+
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
3
|
+
// Posterize: floor each channel to `levels` discrete steps.
|
|
4
|
+
export function applyPosterizeEffectToWgpu(state, source, dest, effect) {
|
|
5
|
+
const levels = Math.max(2, effect.levels ?? 8);
|
|
6
|
+
const pipeline = getWgpuEffectPipeline(state, 'colorGrade.posterize', POSTERIZE_FRAGMENT_WGSL, 'replace');
|
|
7
|
+
drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
|
|
8
|
+
f32[0] = levels;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export const defaultWgpuPosterizeEffectRunner = (ctx, effect) => {
|
|
12
|
+
applyPosterizeEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
|
|
13
|
+
};
|
|
14
|
+
// Slot layout: [0]=levels.
|
|
15
|
+
const POSTERIZE_FRAGMENT_WGSL = /* wgsl */ `
|
|
16
|
+
struct Uniforms { u_levels : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
|
|
17
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
18
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
19
|
+
@group(1) @binding(1) var smp : sampler;
|
|
20
|
+
|
|
21
|
+
@fragment
|
|
22
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
23
|
+
let c = textureSampleLevel(tex, smp, uv, 0.0);
|
|
24
|
+
let rgb = floor(c.rgb * uni.u_levels) / (uni.u_levels - 1.0);
|
|
25
|
+
return vec4f(clamp(rgb, vec3f(0.0), vec3f(1.0)), c.a);
|
|
26
|
+
}`;
|
|
27
|
+
//# sourceMappingURL=wgpuPosterizeEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuPosterizeEffect.js","sourceRoot":"","sources":["../src/wgpuPosterizeEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,4DAA4D;AAC5D,MAAM,UAAU,0BAA0B,CACxC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAiC;IAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,SAAS,CAAC,CAAC;IAC1G,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAClB,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,2BAA2B;AAC3B,MAAM,uBAAuB,GAAG,UAAU,CAAC;;;;;;;;;;;EAWzC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RadialBlurEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function applyRadialBlurEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, effect: Readonly<RadialBlurEffect>): void;
|
|
3
|
+
export declare const defaultWgpuRadialBlurEffectRunner: WgpuRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=wgpuRadialBlurEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuRadialBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuRadialBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOnH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CAYN;AAED,eAAO,MAAM,iCAAiC,EAAE,sBAE/C,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
|
|
2
|
+
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
3
|
+
// Radial blur: accumulate samples stepped from the current uv toward (centerX, centerY) scaled by
|
|
4
|
+
// `strength`, normalized by the sample count. Single-pass reference recipe, the Wgpu mirror of
|
|
5
|
+
// effects-gl's applyRadialBlurEffectToGl.
|
|
6
|
+
export function applyRadialBlurEffectToWgpu(state, source, dest, effect) {
|
|
7
|
+
const centerX = effect.centerX ?? 0.5;
|
|
8
|
+
const centerY = effect.centerY ?? 0.5;
|
|
9
|
+
const strength = effect.strength ?? 0.2;
|
|
10
|
+
const samples = effect.samples ?? 16;
|
|
11
|
+
const pipeline = getWgpuEffectPipeline(state, 'motion.radialBlur', RADIAL_BLUR_FRAGMENT_WGSL, 'replace');
|
|
12
|
+
drawWgpuFilterPass(state, source, dest, pipeline, (f32) => {
|
|
13
|
+
f32[0] = centerX;
|
|
14
|
+
f32[1] = centerY;
|
|
15
|
+
f32[2] = strength;
|
|
16
|
+
f32[3] = samples;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export const defaultWgpuRadialBlurEffectRunner = (ctx, effect) => {
|
|
20
|
+
applyRadialBlurEffectToWgpu(ctx.state, ctx.source, ctx.dest, effect);
|
|
21
|
+
};
|
|
22
|
+
// Slot layout: [0]=center.x, [1]=center.y, [2]=strength, [3]=samples.
|
|
23
|
+
const RADIAL_BLUR_FRAGMENT_WGSL = /* wgsl */ `
|
|
24
|
+
struct Uniforms {
|
|
25
|
+
u_center : vec2f,
|
|
26
|
+
u_strength : f32,
|
|
27
|
+
u_samples : f32,
|
|
28
|
+
}
|
|
29
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
30
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
31
|
+
@group(1) @binding(1) var smp : sampler;
|
|
32
|
+
|
|
33
|
+
const SAMPLES : i32 = 16;
|
|
34
|
+
|
|
35
|
+
@fragment
|
|
36
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
37
|
+
let toCenter = uni.u_center - uv;
|
|
38
|
+
let count = min(uni.u_samples, 16.0);
|
|
39
|
+
var sum = vec4f(0.0);
|
|
40
|
+
var taken = 0.0;
|
|
41
|
+
for (var i = 0; i < SAMPLES; i = i + 1) {
|
|
42
|
+
if (f32(i) >= count) { break; }
|
|
43
|
+
let t = select(0.0, f32(i) / (count - 1.0), count > 1.0);
|
|
44
|
+
let p = uv + toCenter * (t * uni.u_strength);
|
|
45
|
+
sum = sum + textureSampleLevel(tex, smp, p, 0.0);
|
|
46
|
+
taken = taken + 1.0;
|
|
47
|
+
}
|
|
48
|
+
return sum / max(taken, 1.0);
|
|
49
|
+
}`;
|
|
50
|
+
//# sourceMappingURL=wgpuRadialBlurEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuRadialBlurEffect.js","sourceRoot":"","sources":["../src/wgpuRadialBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,kGAAkG;AAClG,+FAA+F;AAC/F,0CAA0C;AAC1C,MAAM,UAAU,2BAA2B,CACzC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAkC;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;IACzG,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,QAAQ,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,iCAAiC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACvF,2BAA2B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA0B,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF,sEAAsE;AACtE,MAAM,yBAAyB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B3C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RenderEffect, RenderEffectPipelineOptions, WgpuRenderEffectPipeline, WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare function beginWgpuRenderEffectPipeline(state: WgpuRenderState, pipeline: WgpuRenderEffectPipeline): void;
|
|
3
|
+
export declare function createWgpuRenderEffectPipeline(_state: WgpuRenderState, options?: Readonly<RenderEffectPipelineOptions>): WgpuRenderEffectPipeline;
|
|
4
|
+
export declare function destroyWgpuRenderEffectPipeline(state: WgpuRenderState, pipeline: WgpuRenderEffectPipeline): void;
|
|
5
|
+
export declare function endWgpuRenderEffectPipeline(state: WgpuRenderState, pipeline: WgpuRenderEffectPipeline, effects: ReadonlyArray<RenderEffect>): void;
|
|
6
|
+
export declare function setWgpuRenderEffectVelocityTexture(pipeline: WgpuRenderEffectPipeline, texture: GPUTexture | null): void;
|
|
7
|
+
//# sourceMappingURL=wgpuRenderEffectPipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,YAAY,EACZ,2BAA2B,EAC3B,wBAAwB,EACxB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAgBzB,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAiB9G;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,QAAQ,CAAC,2BAA2B,CAAM,GAClD,wBAAwB,CAE1B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAMhH;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,GACnC,IAAI,CAwCN;AAID,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,UAAU,GAAG,IAAI,GACzB,IAAI,CAEN"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { drawWgpuFilterPass } from '@flighthq/filters-wgpu';
|
|
2
|
+
import { createMatrix } from '@flighthq/geometry';
|
|
3
|
+
import { acquireWgpuRenderTarget, beginWgpuRenderTarget, createWgpuRenderTarget, createWgpuRenderTargetPool, destroyWgpuRenderTarget, destroyWgpuRenderTargetPool, endWgpuRenderTarget, getWgpuRenderStateRuntime, releaseWgpuRenderTarget, resizeWgpuRenderTarget, } from '@flighthq/render-wgpu';
|
|
4
|
+
import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
|
|
5
|
+
import { getWgpuRenderEffectRunner } from './wgpuRenderEffectRegistry';
|
|
6
|
+
// Opt-in post-process pipeline, the Wgpu mirror of effects-gl's renderEffectPipeline. The caller
|
|
7
|
+
// opens the frame with renderWgpuBackground (creating the command encoder + canvas pass), then:
|
|
8
|
+
// beginWgpuRenderEffectPipeline → renders the scene into the pipeline's offscreen target
|
|
9
|
+
// ...draw the scene tree...
|
|
10
|
+
// endWgpuRenderEffectPipeline(effects) → pops back to the canvas, then runs the agnostic effect
|
|
11
|
+
// list through the per-state registry ping-ponging pooled targets, and presents to the canvas
|
|
12
|
+
// submitWgpuRenderPass → submits the encoder
|
|
13
|
+
// The default render loop imports none of this. The effect list is per-frame data; only the scene
|
|
14
|
+
// target and pool are retained. Depth/velocity G-buffers are not yet produced (follow-up); depth- and
|
|
15
|
+
// velocity-driven recipes receive null and fall back to their color-only paths.
|
|
16
|
+
export function beginWgpuRenderEffectPipeline(state, pipeline) {
|
|
17
|
+
const w = state.canvas.width;
|
|
18
|
+
const h = state.canvas.height;
|
|
19
|
+
const format = pipeline.options.format === 'rgba16f' ? 'rgba16float' : state.format;
|
|
20
|
+
if (pipeline.sceneTarget === null) {
|
|
21
|
+
pipeline.sceneTarget = createWgpuRenderTarget(state, w, h, format);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
resizeWgpuRenderTarget(state, pipeline.sceneTarget, w, h);
|
|
25
|
+
}
|
|
26
|
+
// Clear the scene target to the background colour (not transparent) so the background is part of the
|
|
27
|
+
// image the effects process and the replace-blend present composites — mirroring the Gl pipeline,
|
|
28
|
+
// where renderGlBackground draws into the scene target. Without this the present overwrites the bg.
|
|
29
|
+
const rgba = state.backgroundColorRgba;
|
|
30
|
+
const clearColor = rgba !== undefined && rgba.length >= 4 ? { r: rgba[0], g: rgba[1], b: rgba[2], a: rgba[3] } : undefined;
|
|
31
|
+
beginWgpuRenderTarget(state, pipeline.sceneTarget, state.renderTransform2D ?? createMatrix(), clearColor);
|
|
32
|
+
}
|
|
33
|
+
export function createWgpuRenderEffectPipeline(_state, options = {}) {
|
|
34
|
+
return { options: { ...options }, sceneTarget: null, pool: createWgpuRenderTargetPool(), velocityTexture: null };
|
|
35
|
+
}
|
|
36
|
+
export function destroyWgpuRenderEffectPipeline(state, pipeline) {
|
|
37
|
+
if (pipeline.sceneTarget) {
|
|
38
|
+
destroyWgpuRenderTarget(state, pipeline.sceneTarget);
|
|
39
|
+
pipeline.sceneTarget = null;
|
|
40
|
+
}
|
|
41
|
+
destroyWgpuRenderTargetPool(state, pipeline.pool);
|
|
42
|
+
}
|
|
43
|
+
export function endWgpuRenderEffectPipeline(state, pipeline, effects) {
|
|
44
|
+
const scene = pipeline.sceneTarget;
|
|
45
|
+
if (scene === null)
|
|
46
|
+
return;
|
|
47
|
+
// Pop the scene render target; restores the canvas pass (loadOp 'load').
|
|
48
|
+
endWgpuRenderTarget(state);
|
|
49
|
+
const format = scene.format;
|
|
50
|
+
const descriptor = { width: scene.width, height: scene.height, format };
|
|
51
|
+
let source = scene;
|
|
52
|
+
let scratchA = null;
|
|
53
|
+
let scratchB = null;
|
|
54
|
+
for (const effect of effects) {
|
|
55
|
+
const runner = getWgpuRenderEffectRunner(state, effect.kind);
|
|
56
|
+
if (runner === null)
|
|
57
|
+
continue;
|
|
58
|
+
if (scratchA === null)
|
|
59
|
+
scratchA = acquireWgpuRenderTarget(state, pipeline.pool, descriptor);
|
|
60
|
+
if (scratchB === null)
|
|
61
|
+
scratchB = acquireWgpuRenderTarget(state, pipeline.pool, descriptor);
|
|
62
|
+
const dest = source === scratchA ? scratchB : scratchA;
|
|
63
|
+
runner({
|
|
64
|
+
state,
|
|
65
|
+
source,
|
|
66
|
+
dest,
|
|
67
|
+
pool: pipeline.pool,
|
|
68
|
+
// Depth/velocity G-buffers are not yet produced for Wgpu; depth/velocity-driven recipes
|
|
69
|
+
// fall back to color-only when null. Wiring them is a follow-up (depth needs a sampleable
|
|
70
|
+
// depth attachment; velocity a separate pass), mirroring the Gl seam.
|
|
71
|
+
sceneDepthTexture: null,
|
|
72
|
+
sceneVelocityTexture: pipeline.velocityTexture,
|
|
73
|
+
}, effect);
|
|
74
|
+
source = dest;
|
|
75
|
+
}
|
|
76
|
+
presentWgpuRenderEffectResult(state, source);
|
|
77
|
+
if (scratchA !== null)
|
|
78
|
+
releaseWgpuRenderTarget(pipeline.pool, scratchA);
|
|
79
|
+
if (scratchB !== null)
|
|
80
|
+
releaseWgpuRenderTarget(pipeline.pool, scratchB);
|
|
81
|
+
}
|
|
82
|
+
// Sets the velocity G-buffer the pipeline feeds to velocity-driven effects this frame, or null to
|
|
83
|
+
// clear it. The Wgpu mirror of setGlRenderEffectVelocityTexture.
|
|
84
|
+
export function setWgpuRenderEffectVelocityTexture(pipeline, texture) {
|
|
85
|
+
pipeline.velocityTexture = texture;
|
|
86
|
+
}
|
|
87
|
+
// Presents the final effect result to the canvas. Draws source into the canvas color attachment
|
|
88
|
+
// (dest null → runtime.canvasTextureView) with replace blend so it overwrites the canvas pixels.
|
|
89
|
+
function presentWgpuRenderEffectResult(state, source) {
|
|
90
|
+
const runtime = getWgpuRenderStateRuntime(state);
|
|
91
|
+
if (runtime.commandEncoder === null)
|
|
92
|
+
return;
|
|
93
|
+
const pipeline = getWgpuEffectPipeline(state, 'effect.present', PRESENT_FRAGMENT_WGSL, 'replace');
|
|
94
|
+
drawWgpuFilterPass(state, source, null, pipeline, () => { });
|
|
95
|
+
}
|
|
96
|
+
const PRESENT_FRAGMENT_WGSL = /* wgsl */ `
|
|
97
|
+
struct Uniforms { _u : f32, _pad0 : f32, _pad1 : f32, _pad2 : f32, }
|
|
98
|
+
@group(0) @binding(0) var<uniform> uni : Uniforms;
|
|
99
|
+
@group(1) @binding(0) var tex : texture_2d<f32>;
|
|
100
|
+
@group(1) @binding(1) var smp : sampler;
|
|
101
|
+
|
|
102
|
+
@fragment
|
|
103
|
+
fn fs_main(@location(0) uv : vec2f) -> @location(0) vec4f {
|
|
104
|
+
return textureSampleLevel(tex, smp, uv, 0.0);
|
|
105
|
+
}`;
|
|
106
|
+
//# sourceMappingURL=wgpuRenderEffectPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuRenderEffectPipeline.js","sourceRoot":"","sources":["../src/wgpuRenderEffectPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare function registerAntialiasingWgpuRenderEffects(state: WgpuRenderState): void;
|
|
3
|
+
export declare function registerBloomWgpuRenderEffects(state: WgpuRenderState): void;
|
|
4
|
+
export declare function registerBlurWgpuRenderEffects(state: WgpuRenderState): void;
|
|
5
|
+
export declare function registerColorWgpuRenderEffects(state: WgpuRenderState): void;
|
|
6
|
+
export declare function registerScreenSpaceWgpuRenderEffects(state: WgpuRenderState): void;
|
|
7
|
+
export declare function registerStandardWgpuRenderEffects(state: WgpuRenderState): void;
|
|
8
|
+
export declare function registerStylizeWgpuRenderEffects(state: WgpuRenderState): void;
|
|
9
|
+
//# sourceMappingURL=wgpuRenderEffectRegistrants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuRenderEffectRegistrants.d.ts","sourceRoot":"","sources":["../src/wgpuRenderEffectRegistrants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAsDvD,wBAAgB,qCAAqC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAIlF;AAID,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAQ3E;AAID,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAO1E;AAKD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAc3E;AAID,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAMjF;AAKD,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAO9E;AAID,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAW7E"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { defaultWgpuBloomEffectRunner } from './wgpuBloomEffect';
|
|
2
|
+
import { defaultWgpuBokehDepthOfFieldEffectRunner } from './wgpuBokehDepthOfFieldEffect';
|
|
3
|
+
import { defaultWgpuBrightnessContrastEffectRunner } from './wgpuBrightnessContrastEffect';
|
|
4
|
+
import { defaultWgpuCameraMotionBlurEffectRunner } from './wgpuCameraMotionBlurEffect';
|
|
5
|
+
import { defaultWgpuChannelMixerEffectRunner } from './wgpuChannelMixerEffect';
|
|
6
|
+
import { defaultWgpuChromaticAberrationEffectRunner } from './wgpuChromaticAberrationEffect';
|
|
7
|
+
import { defaultWgpuColorGradeEffectRunner } from './wgpuColorGradeEffect';
|
|
8
|
+
import { defaultWgpuCrtEffectRunner } from './wgpuCrtEffect';
|
|
9
|
+
import { defaultWgpuDirectionalBlurEffectRunner } from './wgpuDirectionalBlurEffect';
|
|
10
|
+
import { defaultWgpuDisplacementEffectRunner } from './wgpuDisplacementEffect';
|
|
11
|
+
import { defaultWgpuDitherEffectRunner } from './wgpuDitherEffect';
|
|
12
|
+
import { defaultWgpuExposureEffectRunner } from './wgpuExposureEffect';
|
|
13
|
+
import { defaultWgpuFilmGrainEffectRunner } from './wgpuFilmGrainEffect';
|
|
14
|
+
import { defaultWgpuFxaaEffectRunner } from './wgpuFxaaEffect';
|
|
15
|
+
import { defaultWgpuGlitchEffectRunner } from './wgpuGlitchEffect';
|
|
16
|
+
import { defaultWgpuGodRaysEffectRunner } from './wgpuGodRaysEffect';
|
|
17
|
+
import { defaultWgpuGrayscaleEffectRunner } from './wgpuGrayscaleEffect';
|
|
18
|
+
import { defaultWgpuHalftoneEffectRunner } from './wgpuHalftoneEffect';
|
|
19
|
+
import { defaultWgpuHueSaturationEffectRunner } from './wgpuHueSaturationEffect';
|
|
20
|
+
import { defaultWgpuInvertEffectRunner } from './wgpuInvertEffect';
|
|
21
|
+
import { defaultWgpuKuwaharaEffectRunner } from './wgpuKuwaharaEffect';
|
|
22
|
+
import { defaultWgpuLensDirtEffectRunner } from './wgpuLensDirtEffect';
|
|
23
|
+
import { defaultWgpuLensDistortionEffectRunner } from './wgpuLensDistortionEffect';
|
|
24
|
+
import { defaultWgpuLensFlareEffectRunner } from './wgpuLensFlareEffect';
|
|
25
|
+
import { defaultWgpuLiftGammaGainEffectRunner } from './wgpuLiftGammaGainEffect';
|
|
26
|
+
import { defaultWgpuLookupTableGradeEffectRunner } from './wgpuLookupTableGradeEffect';
|
|
27
|
+
import { defaultWgpuMotionBlurEffectRunner } from './wgpuMotionBlurEffect';
|
|
28
|
+
import { defaultWgpuOutlineEffectRunner } from './wgpuOutlineEffect';
|
|
29
|
+
import { defaultWgpuPixelateEffectRunner } from './wgpuPixelateEffect';
|
|
30
|
+
import { defaultWgpuPosterizeEffectRunner } from './wgpuPosterizeEffect';
|
|
31
|
+
import { defaultWgpuRadialBlurEffectRunner } from './wgpuRadialBlurEffect';
|
|
32
|
+
import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
|
|
33
|
+
import { defaultWgpuScanlinesEffectRunner } from './wgpuScanlinesEffect';
|
|
34
|
+
import { defaultWgpuScreenSpaceFogEffectRunner } from './wgpuScreenSpaceFogEffect';
|
|
35
|
+
import { defaultWgpuSepiaEffectRunner } from './wgpuSepiaEffect';
|
|
36
|
+
import { defaultWgpuSharpenEffectRunner } from './wgpuSharpenEffect';
|
|
37
|
+
import { defaultWgpuSketchEffectRunner } from './wgpuSketchEffect';
|
|
38
|
+
import { defaultWgpuSmaaEffectRunner } from './wgpuSmaaEffect';
|
|
39
|
+
import { defaultWgpuSsaoEffectRunner } from './wgpuSsaoEffect';
|
|
40
|
+
import { defaultWgpuSsrEffectRunner } from './wgpuSsrEffect';
|
|
41
|
+
import { defaultWgpuTaaEffectRunner } from './wgpuTaaEffect';
|
|
42
|
+
import { defaultWgpuTiltShiftEffectRunner } from './wgpuTiltShiftEffect';
|
|
43
|
+
import { defaultWgpuToneMapEffectRunner } from './wgpuToneMapEffect';
|
|
44
|
+
import { defaultWgpuVignetteEffectRunner } from './wgpuVignetteEffect';
|
|
45
|
+
import { defaultWgpuWhiteBalanceEffectRunner } from './wgpuWhiteBalanceEffect';
|
|
46
|
+
// Curated registrant helpers — each function registers a taxonomy band of default runners under their
|
|
47
|
+
// canonical kind keys. The full-set helper composes all bands. Each helper is a named export so callers
|
|
48
|
+
// can import only the band they need (the rest tree-shakes). The Wgpu mirror of the equivalent helpers
|
|
49
|
+
// in effects-gl.
|
|
50
|
+
// Antialiasing band: FxaaEffect, SmaaEffect, TaaEffect.
|
|
51
|
+
export function registerAntialiasingWgpuRenderEffects(state) {
|
|
52
|
+
registerWgpuRenderEffect(state, 'FxaaEffect', defaultWgpuFxaaEffectRunner);
|
|
53
|
+
registerWgpuRenderEffect(state, 'SmaaEffect', defaultWgpuSmaaEffectRunner);
|
|
54
|
+
registerWgpuRenderEffect(state, 'TaaEffect', defaultWgpuTaaEffectRunner);
|
|
55
|
+
}
|
|
56
|
+
// Bloom / optical band: BloomEffect, ChromaticAberrationEffect, GodRaysEffect, LensDirtEffect,
|
|
57
|
+
// LensDistortionEffect, LensFlareEffect, VignetteEffect.
|
|
58
|
+
export function registerBloomWgpuRenderEffects(state) {
|
|
59
|
+
registerWgpuRenderEffect(state, 'BloomEffect', defaultWgpuBloomEffectRunner);
|
|
60
|
+
registerWgpuRenderEffect(state, 'ChromaticAberrationEffect', defaultWgpuChromaticAberrationEffectRunner);
|
|
61
|
+
registerWgpuRenderEffect(state, 'GodRaysEffect', defaultWgpuGodRaysEffectRunner);
|
|
62
|
+
registerWgpuRenderEffect(state, 'LensDirtEffect', defaultWgpuLensDirtEffectRunner);
|
|
63
|
+
registerWgpuRenderEffect(state, 'LensDistortionEffect', defaultWgpuLensDistortionEffectRunner);
|
|
64
|
+
registerWgpuRenderEffect(state, 'LensFlareEffect', defaultWgpuLensFlareEffectRunner);
|
|
65
|
+
registerWgpuRenderEffect(state, 'VignetteEffect', defaultWgpuVignetteEffectRunner);
|
|
66
|
+
}
|
|
67
|
+
// Blur band: BokehDepthOfFieldEffect, CameraMotionBlurEffect, DirectionalBlurEffect, MotionBlurEffect,
|
|
68
|
+
// RadialBlurEffect, TiltShiftEffect.
|
|
69
|
+
export function registerBlurWgpuRenderEffects(state) {
|
|
70
|
+
registerWgpuRenderEffect(state, 'BokehDepthOfFieldEffect', defaultWgpuBokehDepthOfFieldEffectRunner);
|
|
71
|
+
registerWgpuRenderEffect(state, 'CameraMotionBlurEffect', defaultWgpuCameraMotionBlurEffectRunner);
|
|
72
|
+
registerWgpuRenderEffect(state, 'DirectionalBlurEffect', defaultWgpuDirectionalBlurEffectRunner);
|
|
73
|
+
registerWgpuRenderEffect(state, 'MotionBlurEffect', defaultWgpuMotionBlurEffectRunner);
|
|
74
|
+
registerWgpuRenderEffect(state, 'RadialBlurEffect', defaultWgpuRadialBlurEffectRunner);
|
|
75
|
+
registerWgpuRenderEffect(state, 'TiltShiftEffect', defaultWgpuTiltShiftEffectRunner);
|
|
76
|
+
}
|
|
77
|
+
// Color / tone band: BrightnessContrastEffect, ChannelMixerEffect, ColorGradeEffect, ExposureEffect,
|
|
78
|
+
// GrayscaleEffect, HueSaturationEffect, InvertEffect, LiftGammaGainEffect, LookupTableGradeEffect,
|
|
79
|
+
// PosterizeEffect, SepiaEffect, ToneMapEffect, WhiteBalanceEffect.
|
|
80
|
+
export function registerColorWgpuRenderEffects(state) {
|
|
81
|
+
registerWgpuRenderEffect(state, 'BrightnessContrastEffect', defaultWgpuBrightnessContrastEffectRunner);
|
|
82
|
+
registerWgpuRenderEffect(state, 'ChannelMixerEffect', defaultWgpuChannelMixerEffectRunner);
|
|
83
|
+
registerWgpuRenderEffect(state, 'ColorGradeEffect', defaultWgpuColorGradeEffectRunner);
|
|
84
|
+
registerWgpuRenderEffect(state, 'ExposureEffect', defaultWgpuExposureEffectRunner);
|
|
85
|
+
registerWgpuRenderEffect(state, 'GrayscaleEffect', defaultWgpuGrayscaleEffectRunner);
|
|
86
|
+
registerWgpuRenderEffect(state, 'HueSaturationEffect', defaultWgpuHueSaturationEffectRunner);
|
|
87
|
+
registerWgpuRenderEffect(state, 'InvertEffect', defaultWgpuInvertEffectRunner);
|
|
88
|
+
registerWgpuRenderEffect(state, 'LiftGammaGainEffect', defaultWgpuLiftGammaGainEffectRunner);
|
|
89
|
+
registerWgpuRenderEffect(state, 'LookupTableGradeEffect', defaultWgpuLookupTableGradeEffectRunner);
|
|
90
|
+
registerWgpuRenderEffect(state, 'PosterizeEffect', defaultWgpuPosterizeEffectRunner);
|
|
91
|
+
registerWgpuRenderEffect(state, 'SepiaEffect', defaultWgpuSepiaEffectRunner);
|
|
92
|
+
registerWgpuRenderEffect(state, 'ToneMapEffect', defaultWgpuToneMapEffectRunner);
|
|
93
|
+
registerWgpuRenderEffect(state, 'WhiteBalanceEffect', defaultWgpuWhiteBalanceEffectRunner);
|
|
94
|
+
}
|
|
95
|
+
// Screen-space / atmospheric band: DisplacementEffect, ScreenSpaceFogEffect, SharpenEffect,
|
|
96
|
+
// SsaoEffect, SsrEffect.
|
|
97
|
+
export function registerScreenSpaceWgpuRenderEffects(state) {
|
|
98
|
+
registerWgpuRenderEffect(state, 'DisplacementEffect', defaultWgpuDisplacementEffectRunner);
|
|
99
|
+
registerWgpuRenderEffect(state, 'ScreenSpaceFogEffect', defaultWgpuScreenSpaceFogEffectRunner);
|
|
100
|
+
registerWgpuRenderEffect(state, 'SharpenEffect', defaultWgpuSharpenEffectRunner);
|
|
101
|
+
registerWgpuRenderEffect(state, 'SsaoEffect', defaultWgpuSsaoEffectRunner);
|
|
102
|
+
registerWgpuRenderEffect(state, 'SsrEffect', defaultWgpuSsrEffectRunner);
|
|
103
|
+
}
|
|
104
|
+
// Full standard set — composes all taxonomy bands. Registers all 45 default runners under their
|
|
105
|
+
// canonical kind keys. Import this when the full effect palette is needed; import individual band
|
|
106
|
+
// helpers when only a subset of effects is used.
|
|
107
|
+
export function registerStandardWgpuRenderEffects(state) {
|
|
108
|
+
registerAntialiasingWgpuRenderEffects(state);
|
|
109
|
+
registerBloomWgpuRenderEffects(state);
|
|
110
|
+
registerBlurWgpuRenderEffects(state);
|
|
111
|
+
registerColorWgpuRenderEffects(state);
|
|
112
|
+
registerScreenSpaceWgpuRenderEffects(state);
|
|
113
|
+
registerStylizeWgpuRenderEffects(state);
|
|
114
|
+
}
|
|
115
|
+
// Stylize band: CrtEffect, DitherEffect, FilmGrainEffect, GlitchEffect, HalftoneEffect,
|
|
116
|
+
// KuwaharaEffect, OutlineEffect, PixelateEffect, ScanlinesEffect, SketchEffect.
|
|
117
|
+
export function registerStylizeWgpuRenderEffects(state) {
|
|
118
|
+
registerWgpuRenderEffect(state, 'CrtEffect', defaultWgpuCrtEffectRunner);
|
|
119
|
+
registerWgpuRenderEffect(state, 'DitherEffect', defaultWgpuDitherEffectRunner);
|
|
120
|
+
registerWgpuRenderEffect(state, 'FilmGrainEffect', defaultWgpuFilmGrainEffectRunner);
|
|
121
|
+
registerWgpuRenderEffect(state, 'GlitchEffect', defaultWgpuGlitchEffectRunner);
|
|
122
|
+
registerWgpuRenderEffect(state, 'HalftoneEffect', defaultWgpuHalftoneEffectRunner);
|
|
123
|
+
registerWgpuRenderEffect(state, 'KuwaharaEffect', defaultWgpuKuwaharaEffectRunner);
|
|
124
|
+
registerWgpuRenderEffect(state, 'OutlineEffect', defaultWgpuOutlineEffectRunner);
|
|
125
|
+
registerWgpuRenderEffect(state, 'PixelateEffect', defaultWgpuPixelateEffectRunner);
|
|
126
|
+
registerWgpuRenderEffect(state, 'ScanlinesEffect', defaultWgpuScanlinesEffectRunner);
|
|
127
|
+
registerWgpuRenderEffect(state, 'SketchEffect', defaultWgpuSketchEffectRunner);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=wgpuRenderEffectRegistrants.js.map
|