@flighthq/effects-gl 0.3.0-next.906.07cea63 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contract.d.ts +3 -2
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +3 -2
- package/dist/contract.js.map +1 -1
- package/dist/enableGlRenderEffectGuards.d.ts +5 -0
- package/dist/enableGlRenderEffectGuards.d.ts.map +1 -0
- package/dist/enableGlRenderEffectGuards.js +43 -0
- package/dist/enableGlRenderEffectGuards.js.map +1 -0
- package/dist/glBevelEffect.d.ts +1 -0
- package/dist/glBevelEffect.d.ts.map +1 -1
- package/dist/glBevelEffect.js +7 -3
- package/dist/glBevelEffect.js.map +1 -1
- package/dist/glBlendEffect.d.ts +2 -0
- package/dist/glBlendEffect.d.ts.map +1 -1
- package/dist/glBlendEffect.js +13 -2
- package/dist/glBlendEffect.js.map +1 -1
- package/dist/glBloomEffect.d.ts +1 -0
- package/dist/glBloomEffect.d.ts.map +1 -1
- package/dist/glBloomEffect.js +4 -0
- package/dist/glBloomEffect.js.map +1 -1
- package/dist/glBlurEffect.d.ts +7 -1
- package/dist/glBlurEffect.d.ts.map +1 -1
- package/dist/glBlurEffect.js +34 -6
- package/dist/glBlurEffect.js.map +1 -1
- package/dist/glBokehDepthOfFieldEffect.d.ts +1 -0
- package/dist/glBokehDepthOfFieldEffect.d.ts.map +1 -1
- package/dist/glBokehDepthOfFieldEffect.js +4 -0
- package/dist/glBokehDepthOfFieldEffect.js.map +1 -1
- package/dist/glCameraMotionBlurEffect.d.ts +1 -0
- package/dist/glCameraMotionBlurEffect.d.ts.map +1 -1
- package/dist/glCameraMotionBlurEffect.js +4 -0
- package/dist/glCameraMotionBlurEffect.js.map +1 -1
- package/dist/glChromaticAberrationEffect.d.ts +1 -0
- package/dist/glChromaticAberrationEffect.d.ts.map +1 -1
- package/dist/glChromaticAberrationEffect.js +4 -0
- package/dist/glChromaticAberrationEffect.js.map +1 -1
- package/dist/glCompositeEffect.d.ts +1 -0
- package/dist/glCompositeEffect.d.ts.map +1 -1
- package/dist/glCompositeEffect.js +4 -0
- package/dist/glCompositeEffect.js.map +1 -1
- package/dist/glContactShadowsEffect.d.ts +5 -0
- package/dist/glContactShadowsEffect.d.ts.map +1 -0
- package/dist/glContactShadowsEffect.js +20 -0
- package/dist/glContactShadowsEffect.js.map +1 -0
- package/dist/glConvolutionEffect.d.ts +1 -0
- package/dist/glConvolutionEffect.d.ts.map +1 -1
- package/dist/glConvolutionEffect.js +4 -0
- package/dist/glConvolutionEffect.js.map +1 -1
- package/dist/glCrtEffect.d.ts +1 -0
- package/dist/glCrtEffect.d.ts.map +1 -1
- package/dist/glCrtEffect.js +4 -0
- package/dist/glCrtEffect.js.map +1 -1
- package/dist/glCustomShaderEffect.d.ts +1 -0
- package/dist/glCustomShaderEffect.d.ts.map +1 -1
- package/dist/glCustomShaderEffect.js +4 -0
- package/dist/glCustomShaderEffect.js.map +1 -1
- package/dist/glDirectionalBlurEffect.d.ts +1 -0
- package/dist/glDirectionalBlurEffect.d.ts.map +1 -1
- package/dist/glDirectionalBlurEffect.js +4 -0
- package/dist/glDirectionalBlurEffect.js.map +1 -1
- package/dist/glDisplacementEffect.d.ts +1 -0
- package/dist/glDisplacementEffect.d.ts.map +1 -1
- package/dist/glDisplacementEffect.js +4 -0
- package/dist/glDisplacementEffect.js.map +1 -1
- package/dist/glDitherEffect.d.ts +1 -0
- package/dist/glDitherEffect.d.ts.map +1 -1
- package/dist/glDitherEffect.js +4 -0
- package/dist/glDitherEffect.js.map +1 -1
- package/dist/glDropShadowEffect.d.ts +1 -0
- package/dist/glDropShadowEffect.d.ts.map +1 -1
- package/dist/glDropShadowEffect.js +4 -0
- package/dist/glDropShadowEffect.js.map +1 -1
- package/dist/glEffectBlitShader.js +6 -6
- package/dist/glEffectBlitShader.js.map +1 -1
- package/dist/glEffectBoxBlur.js +2 -2
- package/dist/glEffectBoxBlur.js.map +1 -1
- package/dist/glEffectProgramCache.js +5 -5
- package/dist/glEffectProgramCache.js.map +1 -1
- package/dist/glEffectTintShader.js +4 -4
- package/dist/glEffectTintShader.js.map +1 -1
- package/dist/glFilmGrainEffect.d.ts +1 -0
- package/dist/glFilmGrainEffect.d.ts.map +1 -1
- package/dist/glFilmGrainEffect.js +4 -0
- package/dist/glFilmGrainEffect.js.map +1 -1
- package/dist/glFxaaEffect.d.ts +1 -0
- package/dist/glFxaaEffect.d.ts.map +1 -1
- package/dist/glFxaaEffect.js +4 -0
- package/dist/glFxaaEffect.js.map +1 -1
- package/dist/glGlitchEffect.d.ts +1 -0
- package/dist/glGlitchEffect.d.ts.map +1 -1
- package/dist/glGlitchEffect.js +4 -0
- package/dist/glGlitchEffect.js.map +1 -1
- package/dist/glGodRaysEffect.d.ts +1 -0
- package/dist/glGodRaysEffect.d.ts.map +1 -1
- package/dist/glGodRaysEffect.js +4 -0
- package/dist/glGodRaysEffect.js.map +1 -1
- package/dist/glGradientBevelEffect.d.ts +1 -0
- package/dist/glGradientBevelEffect.d.ts.map +1 -1
- package/dist/glGradientBevelEffect.js +8 -4
- package/dist/glGradientBevelEffect.js.map +1 -1
- package/dist/glGradientGlowEffect.d.ts +1 -0
- package/dist/glGradientGlowEffect.d.ts.map +1 -1
- package/dist/glGradientGlowEffect.js +6 -2
- package/dist/glGradientGlowEffect.js.map +1 -1
- package/dist/glHalftoneEffect.d.ts +1 -0
- package/dist/glHalftoneEffect.d.ts.map +1 -1
- package/dist/glHalftoneEffect.js +4 -0
- package/dist/glHalftoneEffect.js.map +1 -1
- package/dist/glInnerGlowEffect.d.ts +1 -0
- package/dist/glInnerGlowEffect.d.ts.map +1 -1
- package/dist/glInnerGlowEffect.js +6 -2
- package/dist/glInnerGlowEffect.js.map +1 -1
- package/dist/glInnerShadowEffect.d.ts +1 -0
- package/dist/glInnerShadowEffect.d.ts.map +1 -1
- package/dist/glInnerShadowEffect.js +6 -2
- package/dist/glInnerShadowEffect.js.map +1 -1
- package/dist/glKuwaharaEffect.d.ts +1 -0
- package/dist/glKuwaharaEffect.d.ts.map +1 -1
- package/dist/glKuwaharaEffect.js +4 -0
- package/dist/glKuwaharaEffect.js.map +1 -1
- package/dist/glLensDirtEffect.d.ts +1 -0
- package/dist/glLensDirtEffect.d.ts.map +1 -1
- package/dist/glLensDirtEffect.js +4 -0
- package/dist/glLensDirtEffect.js.map +1 -1
- package/dist/glLensDistortionEffect.d.ts +1 -0
- package/dist/glLensDistortionEffect.d.ts.map +1 -1
- package/dist/glLensDistortionEffect.js +4 -0
- package/dist/glLensDistortionEffect.js.map +1 -1
- package/dist/glLensFlareEffect.d.ts +1 -0
- package/dist/glLensFlareEffect.d.ts.map +1 -1
- package/dist/glLensFlareEffect.js +4 -0
- package/dist/glLensFlareEffect.js.map +1 -1
- package/dist/glMedianEffect.d.ts +1 -0
- package/dist/glMedianEffect.d.ts.map +1 -1
- package/dist/glMedianEffect.js +4 -0
- package/dist/glMedianEffect.js.map +1 -1
- package/dist/glMotionBlurEffect.d.ts +1 -0
- package/dist/glMotionBlurEffect.d.ts.map +1 -1
- package/dist/glMotionBlurEffect.js +4 -0
- package/dist/glMotionBlurEffect.js.map +1 -1
- package/dist/glOuterGlowEffect.d.ts +1 -0
- package/dist/glOuterGlowEffect.d.ts.map +1 -1
- package/dist/glOuterGlowEffect.js +4 -0
- package/dist/glOuterGlowEffect.js.map +1 -1
- package/dist/glOutlineEffect.d.ts +1 -0
- package/dist/glOutlineEffect.d.ts.map +1 -1
- package/dist/glOutlineEffect.js +4 -0
- package/dist/glOutlineEffect.js.map +1 -1
- package/dist/glPixelateEffect.d.ts +1 -0
- package/dist/glPixelateEffect.d.ts.map +1 -1
- package/dist/glPixelateEffect.js +4 -0
- package/dist/glPixelateEffect.js.map +1 -1
- package/dist/glPosterizeEffect.d.ts +1 -0
- package/dist/glPosterizeEffect.d.ts.map +1 -1
- package/dist/glPosterizeEffect.js +4 -0
- package/dist/glPosterizeEffect.js.map +1 -1
- package/dist/glRadialBlurEffect.d.ts +1 -0
- package/dist/glRadialBlurEffect.d.ts.map +1 -1
- package/dist/glRadialBlurEffect.js +4 -0
- package/dist/glRadialBlurEffect.js.map +1 -1
- package/dist/glRenderEffectPipeline.d.ts +2 -2
- package/dist/glRenderEffectPipeline.d.ts.map +1 -1
- package/dist/glRenderEffectPipeline.js +14 -7
- package/dist/glRenderEffectPipeline.js.map +1 -1
- package/dist/glRenderEffectRegistry.d.ts.map +1 -1
- package/dist/glRenderEffectRegistry.js +8 -10
- package/dist/glRenderEffectRegistry.js.map +1 -1
- package/dist/glRenderTextureEffect.d.ts +5 -0
- package/dist/glRenderTextureEffect.d.ts.map +1 -0
- package/dist/glRenderTextureEffect.js +83 -0
- package/dist/glRenderTextureEffect.js.map +1 -0
- package/dist/glScanlinesEffect.d.ts +1 -0
- package/dist/glScanlinesEffect.d.ts.map +1 -1
- package/dist/glScanlinesEffect.js +4 -0
- package/dist/glScanlinesEffect.js.map +1 -1
- package/dist/glScreenSpaceFogEffect.d.ts +1 -0
- package/dist/glScreenSpaceFogEffect.d.ts.map +1 -1
- package/dist/glScreenSpaceFogEffect.js +4 -0
- package/dist/glScreenSpaceFogEffect.js.map +1 -1
- package/dist/glSharpenEffect.d.ts +1 -0
- package/dist/glSharpenEffect.d.ts.map +1 -1
- package/dist/glSharpenEffect.js +4 -0
- package/dist/glSharpenEffect.js.map +1 -1
- package/dist/glSketchEffect.d.ts +1 -0
- package/dist/glSketchEffect.d.ts.map +1 -1
- package/dist/glSketchEffect.js +4 -0
- package/dist/glSketchEffect.js.map +1 -1
- package/dist/glSmaaEffect.d.ts +1 -0
- package/dist/glSmaaEffect.d.ts.map +1 -1
- package/dist/glSmaaEffect.js +4 -0
- package/dist/glSmaaEffect.js.map +1 -1
- package/dist/glSsaoEffect.d.ts +1 -0
- package/dist/glSsaoEffect.d.ts.map +1 -1
- package/dist/glSsaoEffect.js +4 -0
- package/dist/glSsaoEffect.js.map +1 -1
- package/dist/glTiltShiftEffect.d.ts +1 -0
- package/dist/glTiltShiftEffect.d.ts.map +1 -1
- package/dist/glTiltShiftEffect.js +4 -0
- package/dist/glTiltShiftEffect.js.map +1 -1
- package/dist/glToneMapEffect.d.ts +1 -0
- package/dist/glToneMapEffect.d.ts.map +1 -1
- package/dist/glToneMapEffect.js +4 -0
- package/dist/glToneMapEffect.js.map +1 -1
- package/dist/glVignetteEffect.d.ts +1 -0
- package/dist/glVignetteEffect.d.ts.map +1 -1
- package/dist/glVignetteEffect.js +4 -0
- package/dist/glVignetteEffect.js.map +1 -1
- package/dist/glWhiteBalanceEffect.d.ts +1 -0
- package/dist/glWhiteBalanceEffect.d.ts.map +1 -1
- package/dist/glWhiteBalanceEffect.js +4 -0
- package/dist/glWhiteBalanceEffect.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +9 -6
- package/src/enableGlRenderEffectGuards.test.ts +156 -0
- package/src/glBevelEffect.test.ts +7 -1
- package/src/glBlendEffect.test.ts +26 -0
- package/src/glBloomEffect.test.ts +7 -1
- package/src/glBlurEffect.test.ts +69 -1
- package/src/glBokehDepthOfFieldEffect.test.ts +11 -1
- package/src/glCameraMotionBlurEffect.test.ts +11 -1
- package/src/glChromaticAberrationEffect.test.ts +7 -0
- package/src/glCompositeEffect.test.ts +7 -0
- package/src/glContactShadowsEffect.test.ts +43 -0
- package/src/glConvolutionEffect.test.ts +11 -1
- package/src/glCrtEffect.test.ts +7 -1
- package/src/glCustomShaderEffect.test.ts +7 -0
- package/src/glDirectionalBlurEffect.test.ts +11 -1
- package/src/glDisplacementEffect.test.ts +11 -1
- package/src/glDitherEffect.test.ts +7 -1
- package/src/glDropShadowEffect.test.ts +11 -9
- package/src/glEffectBoxBlur.test.ts +0 -5
- package/src/glFilmGrainEffect.test.ts +11 -1
- package/src/glFxaaEffect.test.ts +7 -1
- package/src/glGlitchEffect.test.ts +7 -1
- package/src/glGodRaysEffect.test.ts +7 -1
- package/src/glGradientBevelEffect.test.ts +11 -1
- package/src/glGradientGlowEffect.test.ts +11 -1
- package/src/glHalftoneEffect.test.ts +7 -1
- package/src/glInnerGlowEffect.test.ts +11 -9
- package/src/glInnerShadowEffect.test.ts +11 -9
- package/src/glKuwaharaEffect.test.ts +7 -1
- package/src/glLensDirtEffect.test.ts +7 -1
- package/src/glLensDistortionEffect.test.ts +11 -1
- package/src/glLensFlareEffect.test.ts +11 -1
- package/src/glMedianEffect.test.ts +7 -1
- package/src/glMotionBlurEffect.test.ts +11 -1
- package/src/glOuterGlowEffect.test.ts +11 -9
- package/src/glOutlineEffect.test.ts +7 -1
- package/src/glPixelateEffect.test.ts +7 -1
- package/src/glPosterizeEffect.test.ts +11 -1
- package/src/glRadialBlurEffect.test.ts +11 -1
- package/src/glRenderEffectPipeline.test.ts +15 -0
- package/src/glRenderEffectRegistry.test.ts +24 -14
- package/src/glRenderTextureEffect.test.ts +246 -0
- package/src/glScanlinesEffect.test.ts +11 -1
- package/src/glScreenSpaceFogEffect.test.ts +11 -1
- package/src/glSharpenEffect.test.ts +7 -1
- package/src/glSketchEffect.test.ts +7 -1
- package/src/glSmaaEffect.test.ts +7 -1
- package/src/glSpatialEffectRegistration.test.ts +64 -0
- package/src/glSsaoEffect.test.ts +7 -1
- package/src/glTiltShiftEffect.test.ts +11 -1
- package/src/glToneMapEffect.test.ts +7 -1
- package/src/glVignetteEffect.test.ts +7 -1
- package/src/glWhiteBalanceEffect.test.ts +11 -1
- package/dist/glSsrEffect.d.ts +0 -4
- package/dist/glSsrEffect.d.ts.map +0 -1
- package/dist/glSsrEffect.js +0 -24
- package/dist/glSsrEffect.js.map +0 -1
- package/dist/glTaaEffect.d.ts +0 -4
- package/dist/glTaaEffect.d.ts.map +0 -1
- package/dist/glTaaEffect.js +0 -22
- package/dist/glTaaEffect.js.map +0 -1
- package/src/glSsrEffect.test.ts +0 -13
- package/src/glTaaEffect.test.ts +0 -13
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import {
|
|
2
|
+
acquireGlRenderTexture,
|
|
3
|
+
clearGlRenderTexture,
|
|
4
|
+
copyGlRenderStateRegistrations,
|
|
5
|
+
createGlOffscreenRenderState,
|
|
6
|
+
createGlRenderState,
|
|
7
|
+
createGlRenderTexturePool,
|
|
8
|
+
getGlRenderTextureTarget,
|
|
9
|
+
isGlRenderTextureReady,
|
|
10
|
+
writeGlRenderTextureTarget,
|
|
11
|
+
} from '@flighthq/render-gl/contract';
|
|
12
|
+
import type { GlRenderEffectRunner, GlRenderState, RenderEffect } from '@flighthq/types/contract';
|
|
13
|
+
|
|
14
|
+
import { applyGaussianBlurToGlRenderTextures } from './glBlurEffect';
|
|
15
|
+
import { getGlRenderEffectRunner, registerGlRenderEffect } from './glRenderEffectRegistry';
|
|
16
|
+
import {
|
|
17
|
+
applyGlRenderEffectsToRenderTexture,
|
|
18
|
+
explainGlRenderEffectApplication,
|
|
19
|
+
setGlRenderEffectApplicationGuard,
|
|
20
|
+
} from './glRenderTextureEffect';
|
|
21
|
+
|
|
22
|
+
describe('applyGaussianBlurToGlRenderTextures', () => {
|
|
23
|
+
it('publishes destination and scratch RenderTextures after the two Gaussian target passes', () => {
|
|
24
|
+
const state = createState();
|
|
25
|
+
const pool = createGlRenderTexturePool();
|
|
26
|
+
const source = acquireGlRenderTexture(state, pool, { width: 16, height: 12 });
|
|
27
|
+
const dest = acquireGlRenderTexture(state, pool, { width: 16, height: 12 });
|
|
28
|
+
const scratch = acquireGlRenderTexture(state, pool, { width: 16, height: 12 });
|
|
29
|
+
writeGlRenderTextureTarget(state, source, () => {});
|
|
30
|
+
|
|
31
|
+
expect(applyGaussianBlurToGlRenderTextures(state, source, dest, scratch, { blurX: 2, blurY: 3 })).toBe(true);
|
|
32
|
+
expect(isGlRenderTextureReady(state, dest)).toBe(true);
|
|
33
|
+
expect(isGlRenderTextureReady(state, scratch)).toBe(true);
|
|
34
|
+
expect(dest.version).toBe(1);
|
|
35
|
+
expect(scratch.version).toBe(1);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('applyGlRenderEffectsToRenderTexture', () => {
|
|
40
|
+
it('ping-pongs registered effects so an even chain still finishes in the destination lease', () => {
|
|
41
|
+
const state = createState();
|
|
42
|
+
const pool = createGlRenderTexturePool();
|
|
43
|
+
const source = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
44
|
+
const dest = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
45
|
+
const scratch = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
46
|
+
writeGlRenderTextureTarget(state, source, () => {});
|
|
47
|
+
const first: GlRenderEffectRunner = vi.fn();
|
|
48
|
+
const second: GlRenderEffectRunner = vi.fn();
|
|
49
|
+
registerGlRenderEffect(state, 'acme.First', first);
|
|
50
|
+
registerGlRenderEffect(state, 'acme.Second', second);
|
|
51
|
+
|
|
52
|
+
expect(
|
|
53
|
+
applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, [
|
|
54
|
+
{ kind: 'acme.First' },
|
|
55
|
+
{ kind: 'acme.Second' },
|
|
56
|
+
]),
|
|
57
|
+
).toBe(true);
|
|
58
|
+
|
|
59
|
+
expect(first).toHaveBeenCalledOnce();
|
|
60
|
+
expect(second).toHaveBeenCalledOnce();
|
|
61
|
+
expect(vi.mocked(first).mock.calls[0][0].dest).toBe(getGlRenderTextureTarget(state, scratch));
|
|
62
|
+
expect(vi.mocked(second).mock.calls[0][0].dest).toBe(getGlRenderTextureTarget(state, dest));
|
|
63
|
+
expect(isGlRenderTextureReady(state, dest)).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('leaves the destination unpublished when no effect kind is registered', () => {
|
|
67
|
+
const state = createState();
|
|
68
|
+
const pool = createGlRenderTexturePool();
|
|
69
|
+
const source = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
70
|
+
const dest = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
71
|
+
const scratch = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
72
|
+
writeGlRenderTextureTarget(state, source, () => {});
|
|
73
|
+
|
|
74
|
+
expect(applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, [{ kind: 'acme.Missing' }])).toBe(
|
|
75
|
+
false,
|
|
76
|
+
);
|
|
77
|
+
expect(isGlRenderTextureReady(state, dest)).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('is byte-stable across constant-input frames only when reused destinations are cleared', () => {
|
|
81
|
+
const state = createState();
|
|
82
|
+
const pool = createGlRenderTexturePool();
|
|
83
|
+
const source = acquireGlRenderTexture(state, pool, { width: 1, height: 1 });
|
|
84
|
+
const dest = acquireGlRenderTexture(state, pool, { width: 1, height: 1 });
|
|
85
|
+
const scratch = acquireGlRenderTexture(state, pool, { width: 1, height: 1 });
|
|
86
|
+
const constantSource = Uint8Array.from([64, 32, 16, 128]);
|
|
87
|
+
let destinationPixel: Uint8Array = new Uint8Array(4);
|
|
88
|
+
let clearObserved = false;
|
|
89
|
+
vi.mocked(state.gl.clear).mockImplementation(() => {
|
|
90
|
+
clearObserved = true;
|
|
91
|
+
});
|
|
92
|
+
registerGlRenderEffect(state, 'test.constant-frame', () => {
|
|
93
|
+
if (clearObserved) {
|
|
94
|
+
destinationPixel.fill(0);
|
|
95
|
+
clearObserved = false;
|
|
96
|
+
}
|
|
97
|
+
destinationPixel = compositePremultipliedPixel(destinationPixel, constantSource);
|
|
98
|
+
});
|
|
99
|
+
writeGlRenderTextureTarget(state, source, () => {});
|
|
100
|
+
const effect = effects(['test.constant-frame']);
|
|
101
|
+
|
|
102
|
+
const clearedFrames = Array.from({ length: 4 }, () => {
|
|
103
|
+
clearGlRenderTexture(state, dest);
|
|
104
|
+
expect(applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effect)).toBe(true);
|
|
105
|
+
return Array.from(destinationPixel);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
destinationPixel.fill(0);
|
|
109
|
+
clearObserved = false;
|
|
110
|
+
const accumulatedFrames = Array.from({ length: 4 }, () => {
|
|
111
|
+
expect(applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effect)).toBe(true);
|
|
112
|
+
return Array.from(destinationPixel);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
expect(clearedFrames).toEqual(Array.from({ length: 4 }, () => [64, 32, 16, 128]));
|
|
116
|
+
expect(accumulatedFrames).toEqual([
|
|
117
|
+
[64, 32, 16, 128],
|
|
118
|
+
[96, 48, 24, 192],
|
|
119
|
+
[112, 56, 28, 224],
|
|
120
|
+
[120, 60, 30, 240],
|
|
121
|
+
]);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
describe('explainGlRenderEffectApplication', () => {
|
|
126
|
+
it('separates an empty chain from one whose effects are all unregistered', () => {
|
|
127
|
+
const state = createState();
|
|
128
|
+
// Both return false from the apply path, but only the second is a registration miss.
|
|
129
|
+
expect(explainGlRenderEffectApplication(state, [], true).status).toBe('no-effects');
|
|
130
|
+
expect(explainGlRenderEffectApplication(state, effects(['test.explain-a']), true).status).toBe(
|
|
131
|
+
'unregistered-effects',
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('reports partial registration, the case that SUCCEEDS while dropping effects', () => {
|
|
136
|
+
const state = createState();
|
|
137
|
+
registerGlRenderEffect(state, 'test.explain-b', () => {});
|
|
138
|
+
const explanation = explainGlRenderEffectApplication(state, effects(['test.explain-b', 'test.explain-c']), true);
|
|
139
|
+
expect(explanation).toEqual({
|
|
140
|
+
registeredCount: 1,
|
|
141
|
+
requestedCount: 2,
|
|
142
|
+
status: 'partial-registration',
|
|
143
|
+
unregisteredKinds: ['test.explain-c'],
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('blames an unrealized source ahead of registration, since it explains a false return either way', () => {
|
|
148
|
+
const state = createState();
|
|
149
|
+
registerGlRenderEffect(state, 'test.explain-d', () => {});
|
|
150
|
+
expect(explainGlRenderEffectApplication(state, effects(['test.explain-d']), false).status).toBe(
|
|
151
|
+
'source-unavailable',
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('reports a fully registered chain as complete', () => {
|
|
156
|
+
const state = createState();
|
|
157
|
+
registerGlRenderEffect(state, 'test.explain-e', () => {});
|
|
158
|
+
expect(explainGlRenderEffectApplication(state, effects(['test.explain-e']), true).status).toBe('complete');
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('reports a ready destination as stale when a failed call cannot replace it', () => {
|
|
162
|
+
const state = createState();
|
|
163
|
+
expect(explainGlRenderEffectApplication(state, effects(['test.explain-f']), true, true).status).toBe(
|
|
164
|
+
'stale-destination',
|
|
165
|
+
);
|
|
166
|
+
registerGlRenderEffect(state, 'test.explain-g', () => {});
|
|
167
|
+
expect(explainGlRenderEffectApplication(state, effects(['test.explain-g']), false, true).status).toBe(
|
|
168
|
+
'stale-destination',
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
function createState(): GlRenderState {
|
|
174
|
+
const canvas = document.createElement('canvas');
|
|
175
|
+
canvas.width = 32;
|
|
176
|
+
canvas.height = 24;
|
|
177
|
+
return createGlRenderState(canvas);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
describe('offscreen effect registration snapshots', () => {
|
|
181
|
+
it('copies registered runners at derivation and requires explicit re-copy for later runners', () => {
|
|
182
|
+
const screen = createState();
|
|
183
|
+
const first: GlRenderEffectRunner = vi.fn();
|
|
184
|
+
const later: GlRenderEffectRunner = vi.fn();
|
|
185
|
+
registerGlRenderEffect(screen, 'acme.First', first);
|
|
186
|
+
const offscreen = createGlOffscreenRenderState(screen);
|
|
187
|
+
registerGlRenderEffect(screen, 'acme.Later', later);
|
|
188
|
+
|
|
189
|
+
expect(getGlRenderEffectRunner(offscreen, 'acme.First')).toBe(first);
|
|
190
|
+
expect(getGlRenderEffectRunner(offscreen, 'acme.Later')).toBeNull();
|
|
191
|
+
|
|
192
|
+
copyGlRenderStateRegistrations(offscreen, screen);
|
|
193
|
+
expect(getGlRenderEffectRunner(offscreen, 'acme.Later')).toBe(later);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
describe('setGlRenderEffectApplicationGuard', () => {
|
|
198
|
+
it('reports only the sentinel outcomes, and stops once cleared', () => {
|
|
199
|
+
const state = createState();
|
|
200
|
+
const seen: string[] = [];
|
|
201
|
+
setGlRenderEffectApplicationGuard(state, (_s, explanation) => seen.push(explanation.status));
|
|
202
|
+
const pool = createGlRenderTexturePool();
|
|
203
|
+
const source = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
204
|
+
const dest = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
205
|
+
const scratch = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
206
|
+
writeGlRenderTextureTarget(state, source, () => {});
|
|
207
|
+
|
|
208
|
+
applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effects(['test.guard-a']));
|
|
209
|
+
applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, []);
|
|
210
|
+
expect(seen).toEqual(['unregistered-effects']);
|
|
211
|
+
|
|
212
|
+
setGlRenderEffectApplicationGuard(state, null);
|
|
213
|
+
applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effects(['test.guard-b']));
|
|
214
|
+
expect(seen).toEqual(['unregistered-effects']);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('reports a previously published destination as stale when no runner can replace it', () => {
|
|
218
|
+
const state = createState();
|
|
219
|
+
const seen: string[] = [];
|
|
220
|
+
setGlRenderEffectApplicationGuard(state, (_s, explanation) => seen.push(explanation.status));
|
|
221
|
+
const pool = createGlRenderTexturePool();
|
|
222
|
+
const source = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
223
|
+
const dest = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
224
|
+
const scratch = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
|
|
225
|
+
writeGlRenderTextureTarget(state, source, () => {});
|
|
226
|
+
writeGlRenderTextureTarget(state, dest, () => {});
|
|
227
|
+
|
|
228
|
+
expect(applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effects(['test.guard-stale']))).toBe(
|
|
229
|
+
false,
|
|
230
|
+
);
|
|
231
|
+
expect(seen).toEqual(['stale-destination']);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
function effects(kinds: readonly string[]): ReadonlyArray<Readonly<RenderEffect>> {
|
|
236
|
+
return kinds.map((kind) => ({ kind }) as unknown as Readonly<RenderEffect>);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function compositePremultipliedPixel(destination: Uint8Array, source: Uint8Array): Uint8Array {
|
|
240
|
+
const result = new Uint8Array(4);
|
|
241
|
+
const destinationScale = 1 - source[3] / 255;
|
|
242
|
+
for (let channel = 0; channel < 4; channel++) {
|
|
243
|
+
result[channel] = Math.round(source[channel] + destination[channel] * destinationScale);
|
|
244
|
+
}
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
applyScanlinesEffectToGl,
|
|
3
|
+
defaultGlScanlinesEffectRunner,
|
|
4
|
+
registerGlScanlinesEffect,
|
|
5
|
+
} from './glScanlinesEffect';
|
|
2
6
|
|
|
3
7
|
describe('applyScanlinesEffectToGl', () => {
|
|
4
8
|
it('is a function', () => {
|
|
@@ -11,3 +15,9 @@ describe('defaultGlScanlinesEffectRunner', () => {
|
|
|
11
15
|
expect(typeof defaultGlScanlinesEffectRunner).toBe('function');
|
|
12
16
|
});
|
|
13
17
|
});
|
|
18
|
+
|
|
19
|
+
describe('registerGlScanlinesEffect', () => {
|
|
20
|
+
it('is a separately importable registration primitive', () => {
|
|
21
|
+
expect(registerGlScanlinesEffect).toBeTypeOf('function');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
applyScreenSpaceFogEffectToGl,
|
|
3
|
+
defaultGlScreenSpaceFogEffectRunner,
|
|
4
|
+
registerGlScreenSpaceFogEffect,
|
|
5
|
+
} from './glScreenSpaceFogEffect';
|
|
2
6
|
|
|
3
7
|
describe('applyScreenSpaceFogEffectToGl', () => {
|
|
4
8
|
it('is a function', () => {
|
|
@@ -11,3 +15,9 @@ describe('defaultGlScreenSpaceFogEffectRunner', () => {
|
|
|
11
15
|
expect(typeof defaultGlScreenSpaceFogEffectRunner).toBe('function');
|
|
12
16
|
});
|
|
13
17
|
});
|
|
18
|
+
|
|
19
|
+
describe('registerGlScreenSpaceFogEffect', () => {
|
|
20
|
+
it('is a separately importable registration primitive', () => {
|
|
21
|
+
expect(registerGlScreenSpaceFogEffect).toBeTypeOf('function');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applySharpenEffectToGl, defaultGlSharpenEffectRunner } from './glSharpenEffect';
|
|
1
|
+
import { applySharpenEffectToGl, defaultGlSharpenEffectRunner, registerGlSharpenEffect } from './glSharpenEffect';
|
|
2
2
|
|
|
3
3
|
describe('applySharpenEffectToGl', () => {
|
|
4
4
|
it('is a function', () => {
|
|
@@ -11,3 +11,9 @@ describe('defaultGlSharpenEffectRunner', () => {
|
|
|
11
11
|
expect(typeof defaultGlSharpenEffectRunner).toBe('function');
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
|
+
|
|
15
|
+
describe('registerGlSharpenEffect', () => {
|
|
16
|
+
it('is a separately importable registration primitive', () => {
|
|
17
|
+
expect(registerGlSharpenEffect).toBeTypeOf('function');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applySketchEffectToGl, defaultGlSketchEffectRunner } from './glSketchEffect';
|
|
1
|
+
import { applySketchEffectToGl, defaultGlSketchEffectRunner, registerGlSketchEffect } from './glSketchEffect';
|
|
2
2
|
|
|
3
3
|
describe('applySketchEffectToGl', () => {
|
|
4
4
|
it('is a function', () => {
|
|
@@ -11,3 +11,9 @@ describe('defaultGlSketchEffectRunner', () => {
|
|
|
11
11
|
expect(typeof defaultGlSketchEffectRunner).toBe('function');
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
|
+
|
|
15
|
+
describe('registerGlSketchEffect', () => {
|
|
16
|
+
it('is a separately importable registration primitive', () => {
|
|
17
|
+
expect(registerGlSketchEffect).toBeTypeOf('function');
|
|
18
|
+
});
|
|
19
|
+
});
|
package/src/glSmaaEffect.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applySmaaEffectToGl, defaultGlSmaaEffectRunner } from './glSmaaEffect';
|
|
1
|
+
import { applySmaaEffectToGl, defaultGlSmaaEffectRunner, registerGlSmaaEffect } from './glSmaaEffect';
|
|
2
2
|
|
|
3
3
|
describe('applySmaaEffectToGl', () => {
|
|
4
4
|
it('is a function', () => {
|
|
@@ -11,3 +11,9 @@ describe('defaultGlSmaaEffectRunner', () => {
|
|
|
11
11
|
expect(typeof defaultGlSmaaEffectRunner).toBe('function');
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
|
+
|
|
15
|
+
describe('registerGlSmaaEffect', () => {
|
|
16
|
+
it('is a separately importable registration primitive', () => {
|
|
17
|
+
expect(registerGlSmaaEffect).toBeTypeOf('function');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createGlRenderState } from '@flighthq/render-gl/contract';
|
|
2
|
+
|
|
3
|
+
import * as contractEffects from './contract';
|
|
4
|
+
import { getGlRenderEffectRunner } from './glRenderEffectRegistry';
|
|
5
|
+
import * as publicEffects from './index';
|
|
6
|
+
|
|
7
|
+
describe('GL effect registration', () => {
|
|
8
|
+
it.each([
|
|
9
|
+
['BevelEffect', 'registerGlBevelEffect', 'defaultGlBevelEffectRunner'],
|
|
10
|
+
['BlendEffect', 'registerGlBlendEffect', 'defaultGlBlendEffectRunner'],
|
|
11
|
+
['BloomEffect', 'registerGlBloomEffect', 'defaultGlBloomEffectRunner'],
|
|
12
|
+
['BlurEffect', 'registerGlBlurEffect', 'defaultGlBlurEffectRunner'],
|
|
13
|
+
['BokehDepthOfFieldEffect', 'registerGlBokehDepthOfFieldEffect', 'defaultGlBokehDepthOfFieldEffectRunner'],
|
|
14
|
+
['CameraMotionBlurEffect', 'registerGlCameraMotionBlurEffect', 'defaultGlCameraMotionBlurEffectRunner'],
|
|
15
|
+
['ChromaticAberrationEffect', 'registerGlChromaticAberrationEffect', 'defaultGlChromaticAberrationEffectRunner'],
|
|
16
|
+
['CompositeEffect', 'registerGlCompositeEffect', 'defaultGlCompositeEffectRunner'],
|
|
17
|
+
['ContactShadowsEffect', 'registerGlContactShadowsEffect', 'defaultGlContactShadowsEffectRunner'],
|
|
18
|
+
['ConvolutionEffect', 'registerGlConvolutionEffect', 'defaultGlConvolutionEffectRunner'],
|
|
19
|
+
['CrtEffect', 'registerGlCrtEffect', 'defaultGlCrtEffectRunner'],
|
|
20
|
+
['CustomShaderEffect', 'registerGlCustomShaderEffect', 'defaultGlCustomShaderEffectRunner'],
|
|
21
|
+
['DirectionalBlurEffect', 'registerGlDirectionalBlurEffect', 'defaultGlDirectionalBlurEffectRunner'],
|
|
22
|
+
['DisplacementEffect', 'registerGlDisplacementEffect', 'defaultGlDisplacementEffectRunner'],
|
|
23
|
+
['DitherEffect', 'registerGlDitherEffect', 'defaultGlDitherEffectRunner'],
|
|
24
|
+
['DropShadowEffect', 'registerGlDropShadowEffect', 'defaultGlDropShadowEffectRunner'],
|
|
25
|
+
['FilmGrainEffect', 'registerGlFilmGrainEffect', 'defaultGlFilmGrainEffectRunner'],
|
|
26
|
+
['FxaaEffect', 'registerGlFxaaEffect', 'defaultGlFxaaEffectRunner'],
|
|
27
|
+
['GlitchEffect', 'registerGlGlitchEffect', 'defaultGlGlitchEffectRunner'],
|
|
28
|
+
['GodRaysEffect', 'registerGlGodRaysEffect', 'defaultGlGodRaysEffectRunner'],
|
|
29
|
+
['GradientBevelEffect', 'registerGlGradientBevelEffect', 'defaultGlGradientBevelEffectRunner'],
|
|
30
|
+
['GradientGlowEffect', 'registerGlGradientGlowEffect', 'defaultGlGradientGlowEffectRunner'],
|
|
31
|
+
['HalftoneEffect', 'registerGlHalftoneEffect', 'defaultGlHalftoneEffectRunner'],
|
|
32
|
+
['InnerGlowEffect', 'registerGlInnerGlowEffect', 'defaultGlInnerGlowEffectRunner'],
|
|
33
|
+
['InnerShadowEffect', 'registerGlInnerShadowEffect', 'defaultGlInnerShadowEffectRunner'],
|
|
34
|
+
['KuwaharaEffect', 'registerGlKuwaharaEffect', 'defaultGlKuwaharaEffectRunner'],
|
|
35
|
+
['LensDirtEffect', 'registerGlLensDirtEffect', 'defaultGlLensDirtEffectRunner'],
|
|
36
|
+
['LensDistortionEffect', 'registerGlLensDistortionEffect', 'defaultGlLensDistortionEffectRunner'],
|
|
37
|
+
['LensFlareEffect', 'registerGlLensFlareEffect', 'defaultGlLensFlareEffectRunner'],
|
|
38
|
+
['MedianEffect', 'registerGlMedianEffect', 'defaultGlMedianEffectRunner'],
|
|
39
|
+
['MotionBlurEffect', 'registerGlMotionBlurEffect', 'defaultGlMotionBlurEffectRunner'],
|
|
40
|
+
['OuterGlowEffect', 'registerGlOuterGlowEffect', 'defaultGlOuterGlowEffectRunner'],
|
|
41
|
+
['OutlineEffect', 'registerGlOutlineEffect', 'defaultGlOutlineEffectRunner'],
|
|
42
|
+
['PixelateEffect', 'registerGlPixelateEffect', 'defaultGlPixelateEffectRunner'],
|
|
43
|
+
['PosterizeEffect', 'registerGlPosterizeEffect', 'defaultGlPosterizeEffectRunner'],
|
|
44
|
+
['RadialBlurEffect', 'registerGlRadialBlurEffect', 'defaultGlRadialBlurEffectRunner'],
|
|
45
|
+
['ScanlinesEffect', 'registerGlScanlinesEffect', 'defaultGlScanlinesEffectRunner'],
|
|
46
|
+
['ScreenSpaceFogEffect', 'registerGlScreenSpaceFogEffect', 'defaultGlScreenSpaceFogEffectRunner'],
|
|
47
|
+
['SharpenEffect', 'registerGlSharpenEffect', 'defaultGlSharpenEffectRunner'],
|
|
48
|
+
['SketchEffect', 'registerGlSketchEffect', 'defaultGlSketchEffectRunner'],
|
|
49
|
+
['SmaaEffect', 'registerGlSmaaEffect', 'defaultGlSmaaEffectRunner'],
|
|
50
|
+
['SsaoEffect', 'registerGlSsaoEffect', 'defaultGlSsaoEffectRunner'],
|
|
51
|
+
['TiltShiftEffect', 'registerGlTiltShiftEffect', 'defaultGlTiltShiftEffectRunner'],
|
|
52
|
+
['ToneMapEffect', 'registerGlToneMapEffect', 'defaultGlToneMapEffectRunner'],
|
|
53
|
+
['VignetteEffect', 'registerGlVignetteEffect', 'defaultGlVignetteEffectRunner'],
|
|
54
|
+
['WhiteBalanceEffect', 'registerGlWhiteBalanceEffect', 'defaultGlWhiteBalanceEffectRunner'],
|
|
55
|
+
] as const)('registers the public %s runner on only the supplied state', (kind, registerName, runnerName) => {
|
|
56
|
+
const state = createGlRenderState(document.createElement('canvas'));
|
|
57
|
+
const other = createGlRenderState(document.createElement('canvas'));
|
|
58
|
+
|
|
59
|
+
publicEffects[registerName](state);
|
|
60
|
+
|
|
61
|
+
expect(getGlRenderEffectRunner(state, kind)).toBe(contractEffects[runnerName]);
|
|
62
|
+
expect(getGlRenderEffectRunner(other, kind)).toBeNull();
|
|
63
|
+
});
|
|
64
|
+
});
|
package/src/glSsaoEffect.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applySsaoEffectToGl, defaultGlSsaoEffectRunner } from './glSsaoEffect';
|
|
1
|
+
import { applySsaoEffectToGl, defaultGlSsaoEffectRunner, registerGlSsaoEffect } from './glSsaoEffect';
|
|
2
2
|
|
|
3
3
|
describe('applySsaoEffectToGl', () => {
|
|
4
4
|
it('is a function', () => {
|
|
@@ -11,3 +11,9 @@ describe('defaultGlSsaoEffectRunner', () => {
|
|
|
11
11
|
expect(typeof defaultGlSsaoEffectRunner).toBe('function');
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
|
+
|
|
15
|
+
describe('registerGlSsaoEffect', () => {
|
|
16
|
+
it('is a separately importable registration primitive', () => {
|
|
17
|
+
expect(registerGlSsaoEffect).toBeTypeOf('function');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
applyTiltShiftEffectToGl,
|
|
3
|
+
defaultGlTiltShiftEffectRunner,
|
|
4
|
+
registerGlTiltShiftEffect,
|
|
5
|
+
} from './glTiltShiftEffect';
|
|
2
6
|
|
|
3
7
|
describe('applyTiltShiftEffectToGl', () => {
|
|
4
8
|
it('is a function', () => {
|
|
@@ -11,3 +15,9 @@ describe('defaultGlTiltShiftEffectRunner', () => {
|
|
|
11
15
|
expect(typeof defaultGlTiltShiftEffectRunner).toBe('function');
|
|
12
16
|
});
|
|
13
17
|
});
|
|
18
|
+
|
|
19
|
+
describe('registerGlTiltShiftEffect', () => {
|
|
20
|
+
it('is a separately importable registration primitive', () => {
|
|
21
|
+
expect(registerGlTiltShiftEffect).toBeTypeOf('function');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applyToneMapEffectToGl, defaultGlToneMapEffectRunner } from './glToneMapEffect';
|
|
1
|
+
import { applyToneMapEffectToGl, defaultGlToneMapEffectRunner, registerGlToneMapEffect } from './glToneMapEffect';
|
|
2
2
|
|
|
3
3
|
describe('applyToneMapEffectToGl', () => {
|
|
4
4
|
it('is a function', () => {
|
|
@@ -11,3 +11,9 @@ describe('defaultGlToneMapEffectRunner', () => {
|
|
|
11
11
|
expect(typeof defaultGlToneMapEffectRunner).toBe('function');
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
|
+
|
|
15
|
+
describe('registerGlToneMapEffect', () => {
|
|
16
|
+
it('is a separately importable registration primitive', () => {
|
|
17
|
+
expect(registerGlToneMapEffect).toBeTypeOf('function');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applyVignetteEffectToGl, defaultGlVignetteEffectRunner } from './glVignetteEffect';
|
|
1
|
+
import { applyVignetteEffectToGl, defaultGlVignetteEffectRunner, registerGlVignetteEffect } from './glVignetteEffect';
|
|
2
2
|
|
|
3
3
|
describe('applyVignetteEffectToGl', () => {
|
|
4
4
|
it('is a function', () => {
|
|
@@ -11,3 +11,9 @@ describe('defaultGlVignetteEffectRunner', () => {
|
|
|
11
11
|
expect(typeof defaultGlVignetteEffectRunner).toBe('function');
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
|
+
|
|
15
|
+
describe('registerGlVignetteEffect', () => {
|
|
16
|
+
it('is a separately importable registration primitive', () => {
|
|
17
|
+
expect(registerGlVignetteEffect).toBeTypeOf('function');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
applyWhiteBalanceEffectToGl,
|
|
3
|
+
defaultGlWhiteBalanceEffectRunner,
|
|
4
|
+
registerGlWhiteBalanceEffect,
|
|
5
|
+
} from './glWhiteBalanceEffect';
|
|
2
6
|
|
|
3
7
|
describe('applyWhiteBalanceEffectToGl', () => {
|
|
4
8
|
it('is a function', () => {
|
|
@@ -11,3 +15,9 @@ describe('defaultGlWhiteBalanceEffectRunner', () => {
|
|
|
11
15
|
expect(typeof defaultGlWhiteBalanceEffectRunner).toBe('function');
|
|
12
16
|
});
|
|
13
17
|
});
|
|
18
|
+
|
|
19
|
+
describe('registerGlWhiteBalanceEffect', () => {
|
|
20
|
+
it('is a separately importable registration primitive', () => {
|
|
21
|
+
expect(registerGlWhiteBalanceEffect).toBeTypeOf('function');
|
|
22
|
+
});
|
|
23
|
+
});
|
package/dist/glSsrEffect.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, SsrEffect } from '@flighthq/types/contract';
|
|
2
|
-
export declare function applySsrEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<SsrEffect>): void;
|
|
3
|
-
export declare const defaultGlSsrEffectRunner: GlRenderEffectRunner;
|
|
4
|
-
//# sourceMappingURL=glSsrEffect.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glSsrEffect.d.ts","sourceRoot":"","sources":["../src/glSsrEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAQ/G,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAE9B,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC1B,IAAI,CAGN;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAEtC,CAAC"}
|
package/dist/glSsrEffect.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { drawGlFullscreenPass } from '@flighthq/render-gl/contract';
|
|
2
|
-
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
-
// SSR: screen-space reflections. The real recipe ray-marches reflected rays against a sampleable DEPTH
|
|
4
|
-
// buffer using view-space normals, walking `steps` increments up to `maxDistance` at the given
|
|
5
|
-
// `resolution`; depth and normals are absent in the color-only context, so this is a passthrough copy
|
|
6
|
-
// that preserves the pipeline scene2d. maxDistance/resolution/steps are reserved for the depth-driven recipe.
|
|
7
|
-
export function applySsrEffectToGl(state, source, dest,
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
9
|
-
effect) {
|
|
10
|
-
const program = getGlEffectProgram(state, 'atmospheric.ssr', SSR_FRAGMENT_SRC);
|
|
11
|
-
drawGlFullscreenPass(state, program, [source.texture], dest, () => { });
|
|
12
|
-
}
|
|
13
|
-
export const defaultGlSsrEffectRunner = (ctx, effect) => {
|
|
14
|
-
applySsrEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
15
|
-
};
|
|
16
|
-
const SSR_FRAGMENT_SRC = `#version 300 es
|
|
17
|
-
precision highp float;
|
|
18
|
-
in vec2 v_texCoord;
|
|
19
|
-
uniform sampler2D u_texture0;
|
|
20
|
-
out vec4 o_color;
|
|
21
|
-
void main() {
|
|
22
|
-
o_color = texture(u_texture0, v_texCoord);
|
|
23
|
-
}`;
|
|
24
|
-
//# sourceMappingURL=glSsrEffect.js.map
|
package/dist/glSsrEffect.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glSsrEffect.js","sourceRoot":"","sources":["../src/glSsrEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,uGAAuG;AACvG,+FAA+F;AAC/F,sGAAsG;AACtG,8GAA8G;AAC9G,MAAM,UAAU,kBAAkB,CAChC,KAAoB,EACpB,MAAgC,EAChC,IAA8B;AAC9B,6DAA6D;AAC7D,MAA2B;IAE3B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC/E,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5E,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;EAOvB,CAAC"}
|
package/dist/glTaaEffect.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, TaaEffect } from '@flighthq/types/contract';
|
|
2
|
-
export declare function applyTaaEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, _effect: Readonly<TaaEffect>): void;
|
|
3
|
-
export declare const defaultGlTaaEffectRunner: GlRenderEffectRunner;
|
|
4
|
-
//# sourceMappingURL=glTaaEffect.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glTaaEffect.d.ts","sourceRoot":"","sources":["../src/glTaaEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAO/G,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC3B,IAAI,CAGN;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAEtC,CAAC"}
|
package/dist/glTaaEffect.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { drawGlFullscreenPass } from '@flighthq/render-gl/contract';
|
|
2
|
-
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
-
// TAA: passthrough copy of source → dest. Real temporal AA needs a history buffer + motion vectors to
|
|
4
|
-
// reproject and accumulate prior frames; neither is available in the single-frame effect context, so
|
|
5
|
-
// this is a placeholder that preserves the pipeline scene2d without altering the image.
|
|
6
|
-
export function applyTaaEffectToGl(state, source, dest, _effect) {
|
|
7
|
-
const program = getGlEffectProgram(state, 'antialiasing.taa', TAA_FRAGMENT_SRC);
|
|
8
|
-
drawGlFullscreenPass(state, program, [source.texture], dest, _noopSetUniforms);
|
|
9
|
-
}
|
|
10
|
-
export const defaultGlTaaEffectRunner = (ctx, effect) => {
|
|
11
|
-
applyTaaEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
12
|
-
};
|
|
13
|
-
function _noopSetUniforms() { }
|
|
14
|
-
const TAA_FRAGMENT_SRC = `#version 300 es
|
|
15
|
-
precision highp float;
|
|
16
|
-
in vec2 v_texCoord;
|
|
17
|
-
uniform sampler2D u_texture0;
|
|
18
|
-
out vec4 o_color;
|
|
19
|
-
void main() {
|
|
20
|
-
o_color = texture(u_texture0, v_texCoord);
|
|
21
|
-
}`;
|
|
22
|
-
//# sourceMappingURL=glTaaEffect.js.map
|
package/dist/glTaaEffect.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glTaaEffect.js","sourceRoot":"","sources":["../src/glTaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,sGAAsG;AACtG,qGAAqG;AACrG,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAChC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,OAA4B;IAE5B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;IAChF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5E,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,SAAS,gBAAgB,KAAU,CAAC;AAEpC,MAAM,gBAAgB,GAAG;;;;;;;EAOvB,CAAC"}
|
package/src/glSsrEffect.test.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { applySsrEffectToGl, defaultGlSsrEffectRunner } from './glSsrEffect';
|
|
2
|
-
|
|
3
|
-
describe('applySsrEffectToGl', () => {
|
|
4
|
-
it('is a function', () => {
|
|
5
|
-
expect(typeof applySsrEffectToGl).toBe('function');
|
|
6
|
-
});
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
describe('defaultGlSsrEffectRunner', () => {
|
|
10
|
-
it('is a function', () => {
|
|
11
|
-
expect(typeof defaultGlSsrEffectRunner).toBe('function');
|
|
12
|
-
});
|
|
13
|
-
});
|
package/src/glTaaEffect.test.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { applyTaaEffectToGl, defaultGlTaaEffectRunner } from './glTaaEffect';
|
|
2
|
-
|
|
3
|
-
describe('applyTaaEffectToGl', () => {
|
|
4
|
-
it('is a function', () => {
|
|
5
|
-
expect(typeof applyTaaEffectToGl).toBe('function');
|
|
6
|
-
});
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
describe('defaultGlTaaEffectRunner', () => {
|
|
10
|
-
it('is a function', () => {
|
|
11
|
-
expect(typeof defaultGlTaaEffectRunner).toBe('function');
|
|
12
|
-
});
|
|
13
|
-
});
|