@flighthq/effects-gl 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/glBevelEffect.d.ts +4 -0
- package/dist/glBevelEffect.d.ts.map +1 -0
- package/dist/glBevelEffect.js +132 -0
- package/dist/glBevelEffect.js.map +1 -0
- package/dist/glBloomEffect.d.ts.map +1 -1
- package/dist/glBloomEffect.js +5 -5
- package/dist/glBloomEffect.js.map +1 -1
- package/dist/glBlurEffect.d.ts +8 -0
- package/dist/glBlurEffect.d.ts.map +1 -0
- package/dist/glBlurEffect.js +65 -0
- package/dist/glBlurEffect.js.map +1 -0
- package/dist/glColorLutPass.d.ts +3 -0
- package/dist/glColorLutPass.d.ts.map +1 -0
- package/dist/glColorLutPass.js +75 -0
- package/dist/glColorLutPass.js.map +1 -0
- package/dist/glColorMatrixPass.d.ts +3 -0
- package/dist/glColorMatrixPass.d.ts.map +1 -0
- package/dist/glColorMatrixPass.js +33 -0
- package/dist/glColorMatrixPass.js.map +1 -0
- package/dist/glConvolutionEffect.d.ts +5 -0
- package/dist/glConvolutionEffect.d.ts.map +1 -0
- package/dist/glConvolutionEffect.js +94 -0
- package/dist/glConvolutionEffect.js.map +1 -0
- package/dist/glDropShadowEffect.d.ts +4 -0
- package/dist/glDropShadowEffect.d.ts.map +1 -0
- package/dist/glDropShadowEffect.js +51 -0
- package/dist/glDropShadowEffect.js.map +1 -0
- package/dist/glEffectBlitShader.d.ts +10 -0
- package/dist/glEffectBlitShader.d.ts.map +1 -0
- package/dist/glEffectBlitShader.js +62 -0
- package/dist/glEffectBlitShader.js.map +1 -0
- package/dist/glEffectBoxBlur.d.ts +15 -0
- package/dist/glEffectBoxBlur.d.ts.map +1 -0
- package/dist/glEffectBoxBlur.js +89 -0
- package/dist/glEffectBoxBlur.js.map +1 -0
- package/dist/glEffectGradientRamp.d.ts +9 -0
- package/dist/glEffectGradientRamp.d.ts.map +1 -0
- package/dist/glEffectGradientRamp.js +64 -0
- package/dist/glEffectGradientRamp.js.map +1 -0
- package/dist/glEffectTintShader.d.ts +7 -0
- package/dist/glEffectTintShader.d.ts.map +1 -0
- package/dist/glEffectTintShader.js +80 -0
- package/dist/glEffectTintShader.js.map +1 -0
- package/dist/glGradientBevelEffect.d.ts +4 -0
- package/dist/glGradientBevelEffect.d.ts.map +1 -0
- package/dist/glGradientBevelEffect.js +121 -0
- package/dist/glGradientBevelEffect.js.map +1 -0
- package/dist/glGradientGlowEffect.d.ts +4 -0
- package/dist/glGradientGlowEffect.d.ts.map +1 -0
- package/dist/glGradientGlowEffect.js +71 -0
- package/dist/glGradientGlowEffect.js.map +1 -0
- package/dist/glInnerGlowEffect.d.ts +4 -0
- package/dist/glInnerGlowEffect.d.ts.map +1 -0
- package/dist/glInnerGlowEffect.js +77 -0
- package/dist/glInnerGlowEffect.js.map +1 -0
- package/dist/glInnerShadowEffect.d.ts +4 -0
- package/dist/glInnerShadowEffect.d.ts.map +1 -0
- package/dist/glInnerShadowEffect.js +84 -0
- package/dist/glInnerShadowEffect.js.map +1 -0
- package/dist/glMedianEffect.d.ts +5 -0
- package/dist/glMedianEffect.d.ts.map +1 -0
- package/dist/glMedianEffect.js +73 -0
- package/dist/glMedianEffect.js.map +1 -0
- package/dist/glOuterGlowEffect.d.ts +4 -0
- package/dist/glOuterGlowEffect.d.ts.map +1 -0
- package/dist/glOuterGlowEffect.js +45 -0
- package/dist/glOuterGlowEffect.js.map +1 -0
- package/dist/glRenderEffectPipeline.d.ts +2 -2
- package/dist/glRenderEffectPipeline.d.ts.map +1 -1
- package/dist/glRenderEffectPipeline.js +64 -8
- package/dist/glRenderEffectPipeline.js.map +1 -1
- package/dist/glRenderEffectRegistrar.d.ts +1 -0
- package/dist/glRenderEffectRegistrar.d.ts.map +1 -1
- package/dist/glRenderEffectRegistrar.js +52 -38
- package/dist/glRenderEffectRegistrar.js.map +1 -1
- package/dist/index.d.ts +16 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -10
- package/dist/index.js.map +1 -1
- package/package.json +11 -6
- package/src/glBevelEffect.test.ts +13 -0
- package/src/glBlurEffect.test.ts +19 -0
- package/src/glColorLutPass.test.ts +7 -0
- package/src/glColorMatrixPass.test.ts +7 -0
- package/src/glConvolutionEffect.test.ts +13 -0
- package/src/glDropShadowEffect.test.ts +13 -0
- package/src/glEffectBlitShader.test.ts +13 -0
- package/src/glEffectBoxBlur.test.ts +7 -0
- package/src/glEffectGradientRamp.test.ts +7 -0
- package/src/glEffectTintShader.test.ts +13 -0
- package/src/glGradientBevelEffect.test.ts +13 -0
- package/src/glGradientGlowEffect.test.ts +13 -0
- package/src/glInnerGlowEffect.test.ts +13 -0
- package/src/glInnerShadowEffect.test.ts +13 -0
- package/src/glMedianEffect.test.ts +13 -0
- package/src/glOuterGlowEffect.test.ts +13 -0
- package/src/glRenderEffectRegistrar.test.ts +36 -6
- package/dist/glBrightnessContrastEffect.d.ts +0 -4
- package/dist/glBrightnessContrastEffect.d.ts.map +0 -1
- package/dist/glBrightnessContrastEffect.js +0 -28
- package/dist/glBrightnessContrastEffect.js.map +0 -1
- package/dist/glChannelMixerEffect.d.ts +0 -4
- package/dist/glChannelMixerEffect.d.ts.map +0 -1
- package/dist/glChannelMixerEffect.js +0 -30
- package/dist/glChannelMixerEffect.js.map +0 -1
- package/dist/glColorGradeEffect.d.ts +0 -4
- package/dist/glColorGradeEffect.d.ts.map +0 -1
- package/dist/glColorGradeEffect.js +0 -46
- package/dist/glColorGradeEffect.js.map +0 -1
- package/dist/glExposureEffect.d.ts +0 -4
- package/dist/glExposureEffect.d.ts.map +0 -1
- package/dist/glExposureEffect.js +0 -24
- package/dist/glExposureEffect.js.map +0 -1
- package/dist/glGrayscaleEffect.d.ts +0 -4
- package/dist/glGrayscaleEffect.d.ts.map +0 -1
- package/dist/glGrayscaleEffect.js +0 -25
- package/dist/glGrayscaleEffect.js.map +0 -1
- package/dist/glHueSaturationEffect.d.ts +0 -4
- package/dist/glHueSaturationEffect.d.ts.map +0 -1
- package/dist/glHueSaturationEffect.js +0 -67
- package/dist/glHueSaturationEffect.js.map +0 -1
- package/dist/glInvertEffect.d.ts +0 -4
- package/dist/glInvertEffect.d.ts.map +0 -1
- package/dist/glInvertEffect.js +0 -24
- package/dist/glInvertEffect.js.map +0 -1
- package/dist/glLiftGammaGainEffect.d.ts +0 -4
- package/dist/glLiftGammaGainEffect.d.ts.map +0 -1
- package/dist/glLiftGammaGainEffect.js +0 -44
- package/dist/glLiftGammaGainEffect.js.map +0 -1
- package/dist/glLookupTableGradeEffect.d.ts +0 -4
- package/dist/glLookupTableGradeEffect.d.ts.map +0 -1
- package/dist/glLookupTableGradeEffect.js +0 -28
- package/dist/glLookupTableGradeEffect.js.map +0 -1
- package/dist/glSepiaEffect.d.ts +0 -4
- package/dist/glSepiaEffect.d.ts.map +0 -1
- package/dist/glSepiaEffect.js +0 -29
- package/dist/glSepiaEffect.js.map +0 -1
- package/src/glBrightnessContrastEffect.test.ts +0 -16
- package/src/glChannelMixerEffect.test.ts +0 -13
- package/src/glColorGradeEffect.test.ts +0 -13
- package/src/glExposureEffect.test.ts +0 -13
- package/src/glGrayscaleEffect.test.ts +0 -13
- package/src/glHueSaturationEffect.test.ts +0 -13
- package/src/glInvertEffect.test.ts +0 -13
- package/src/glLiftGammaGainEffect.test.ts +0 -13
- package/src/glLookupTableGradeEffect.test.ts +0 -13
- package/src/glSepiaEffect.test.ts +0 -13
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { acquireGlRenderTarget, clearGlRenderTarget, compileGlFullscreenProgram, drawGlFullscreenPass, releaseGlRenderTarget, } from '@flighthq/render-gl';
|
|
2
|
+
import { applyGlEffectBlitPass } from './glEffectBlitShader';
|
|
3
|
+
import { applyGlEffectBoxBlur } from './glEffectBoxBlur';
|
|
4
|
+
import { applyGlEffectInvertTintPass } from './glEffectTintShader';
|
|
5
|
+
// Why: all filter passes use ONE/ONE_MINUS_SRC_ALPHA premultiplied blending — they never
|
|
6
|
+
// implicitly clear their destination. Reusing a scratch target without clearing first means
|
|
7
|
+
// the previous pass's content bleeds through wherever the new pass's alpha is 0 (i.e. the
|
|
8
|
+
// exterior of the shape). Clearing before each reuse gives clean replacement semantics.
|
|
9
|
+
// Clips unit-0 (blurred inverted-alpha mask) to the source alpha from unit-1.
|
|
10
|
+
// The blurred inverted alpha is highest near interior edges; clipping to
|
|
11
|
+
// source alpha removes any glow that spilled outside the shape boundary.
|
|
12
|
+
const INNER_CLIP_FRAGMENT_SRC = `#version 300 es
|
|
13
|
+
precision mediump float;
|
|
14
|
+
in vec2 v_texCoord;
|
|
15
|
+
uniform sampler2D u_texture0;
|
|
16
|
+
uniform sampler2D u_texture1;
|
|
17
|
+
out vec4 fragColor;
|
|
18
|
+
void main() {
|
|
19
|
+
vec4 glow = texture(u_texture0, v_texCoord);
|
|
20
|
+
float srcAlpha = texture(u_texture1, v_texCoord).a;
|
|
21
|
+
fragColor = glow * srcAlpha;
|
|
22
|
+
}`;
|
|
23
|
+
const clipShaders = new WeakMap();
|
|
24
|
+
// Inner-glow composite effect: tint the inverted silhouette, blur inward, clip to the source alpha, then composite over the source.
|
|
25
|
+
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
26
|
+
// inlined multi-pass recipe, then releases them.
|
|
27
|
+
//
|
|
28
|
+
// Algorithm:
|
|
29
|
+
// 1. Invert-tint pass: extracts inverted alpha, tinted with glow color.
|
|
30
|
+
// 2. Blur pass: spreads the inverted tint toward the interior.
|
|
31
|
+
// 3. Clip pass: multiplies the blurred glow by the source alpha to confine it inside the shape.
|
|
32
|
+
// 4. Composite: source + clipped glow.
|
|
33
|
+
export function applyInnerGlowEffectToGl(state, source, dest, pool, effect) {
|
|
34
|
+
const descriptor = { width: source.width, height: source.height, format: source.format };
|
|
35
|
+
const s0 = acquireGlRenderTarget(state, pool, descriptor);
|
|
36
|
+
const s1 = acquireGlRenderTarget(state, pool, descriptor);
|
|
37
|
+
const s2 = acquireGlRenderTarget(state, pool, descriptor);
|
|
38
|
+
const src = source;
|
|
39
|
+
const dst = dest;
|
|
40
|
+
const color = effect.color ?? 0xff0000;
|
|
41
|
+
const alpha = effect.alpha ?? 1;
|
|
42
|
+
const strength = effect.strength ?? 1;
|
|
43
|
+
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
44
|
+
// Pass 1: invert source alpha and tint with glow color → s0
|
|
45
|
+
applyGlEffectInvertTintPass(state, src, s0, color, alpha, strength);
|
|
46
|
+
// Pass 2: blur → s1 (s2 is ping-pong temp)
|
|
47
|
+
applyGlEffectBoxBlur(state, s0, s1, s2, { blurX: effect.blurX ?? 6, blurY: effect.blurY ?? 6, passes: quality });
|
|
48
|
+
// Pass 3: clip blurred glow (s1) to source alpha, output to s0 (s1 no longer needed).
|
|
49
|
+
// s0 still holds pass-1 content; clear it so the blend doesn't retain the exterior red.
|
|
50
|
+
clearGlRenderTarget(state, s0);
|
|
51
|
+
applyGlInnerClipPass(state, s1, src, s0);
|
|
52
|
+
// Final composite: source first, then clipped glow on top
|
|
53
|
+
clearGlRenderTarget(state, dst);
|
|
54
|
+
applyGlEffectBlitPass(state, src, dst);
|
|
55
|
+
applyGlEffectBlitPass(state, s0, dst);
|
|
56
|
+
releaseGlRenderTarget(pool, s0);
|
|
57
|
+
releaseGlRenderTarget(pool, s1);
|
|
58
|
+
releaseGlRenderTarget(pool, s2);
|
|
59
|
+
}
|
|
60
|
+
export const defaultGlInnerGlowEffectRunner = (ctx, effect) => {
|
|
61
|
+
applyInnerGlowEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
62
|
+
};
|
|
63
|
+
function applyGlInnerClipPass(state, glow, source, dest) {
|
|
64
|
+
const loc = getClipShader(state);
|
|
65
|
+
drawGlFullscreenPass(state, loc, [glow.texture, source.texture], dest, () => { });
|
|
66
|
+
}
|
|
67
|
+
function getClipShader(state) {
|
|
68
|
+
let loc = clipShaders.get(state);
|
|
69
|
+
if (loc === undefined) {
|
|
70
|
+
const gl = state.gl;
|
|
71
|
+
const base = compileGlFullscreenProgram(gl, INNER_CLIP_FRAGMENT_SRC);
|
|
72
|
+
loc = { ...base };
|
|
73
|
+
clipShaders.set(state, loc);
|
|
74
|
+
}
|
|
75
|
+
return loc;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=glInnerGlowEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glInnerGlowEffect.js","sourceRoot":"","sources":["../src/glInnerGlowEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { InnerShadowEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget, GlRenderTargetPool } from '@flighthq/types';
|
|
2
|
+
export declare function applyInnerShadowEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, pool: GlRenderTargetPool, effect: Readonly<InnerShadowEffect>): void;
|
|
3
|
+
export declare const defaultGlInnerShadowEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glInnerShadowEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glInnerShadowEffect.d.ts","sourceRoot":"","sources":["../src/glInnerShadowEffect.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,iBAAiB,EAEjB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAsCzB,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAClC,IAAI,CA0CN;AAED,eAAO,MAAM,gCAAgC,EAAE,oBAE9C,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { acquireGlRenderTarget, clearGlRenderTarget, compileGlFullscreenProgram, drawGlFullscreenPass, releaseGlRenderTarget, } from '@flighthq/render-gl';
|
|
2
|
+
import { applyGlEffectBlitOffsetPass, applyGlEffectBlitPass } from './glEffectBlitShader';
|
|
3
|
+
import { applyGlEffectBoxBlur } from './glEffectBoxBlur';
|
|
4
|
+
import { applyGlEffectInvertTintPass } from './glEffectTintShader';
|
|
5
|
+
// Why: all filter passes use ONE/ONE_MINUS_SRC_ALPHA premultiplied blending — they never
|
|
6
|
+
// implicitly clear their destination. Reusing a scratch target without clearing first means
|
|
7
|
+
// the previous pass's content bleeds through wherever the new pass's alpha is 0. Clearing
|
|
8
|
+
// before each reuse gives clean replacement semantics.
|
|
9
|
+
// Same clip shader as innerGlow — clips unit-0 glow to unit-1 source alpha.
|
|
10
|
+
const INNER_CLIP_FRAGMENT_SRC = `#version 300 es
|
|
11
|
+
precision mediump float;
|
|
12
|
+
in vec2 v_texCoord;
|
|
13
|
+
uniform sampler2D u_texture0;
|
|
14
|
+
uniform sampler2D u_texture1;
|
|
15
|
+
out vec4 fragColor;
|
|
16
|
+
void main() {
|
|
17
|
+
vec4 shadow = texture(u_texture0, v_texCoord);
|
|
18
|
+
float srcAlpha = texture(u_texture1, v_texCoord).a;
|
|
19
|
+
fragColor = shadow * srcAlpha;
|
|
20
|
+
}`;
|
|
21
|
+
const clipShaders = new WeakMap();
|
|
22
|
+
// Inner-shadow composite effect: tint the inverted silhouette, blur, offset by angle/distance, clip to the source alpha, then composite over the source.
|
|
23
|
+
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
24
|
+
// inlined multi-pass recipe, then releases them.
|
|
25
|
+
//
|
|
26
|
+
// Algorithm:
|
|
27
|
+
// 1. Invert-tint pass: extracts inverted alpha, tinted with shadow color.
|
|
28
|
+
// 2. Blur pass.
|
|
29
|
+
// 3. Offset pass: shifts the blurred shadow by the angle/distance.
|
|
30
|
+
// 4. Clip pass: clips the offset shadow to source alpha (keeps shadow inside shape).
|
|
31
|
+
// 5. Composite: source + clipped shadow.
|
|
32
|
+
export function applyInnerShadowEffectToGl(state, source, dest, pool, effect) {
|
|
33
|
+
const descriptor = { width: source.width, height: source.height, format: source.format };
|
|
34
|
+
const s0 = acquireGlRenderTarget(state, pool, descriptor);
|
|
35
|
+
const s1 = acquireGlRenderTarget(state, pool, descriptor);
|
|
36
|
+
const s2 = acquireGlRenderTarget(state, pool, descriptor);
|
|
37
|
+
const src = source;
|
|
38
|
+
const dst = dest;
|
|
39
|
+
const angle = ((effect.angle ?? 45) * Math.PI) / 180;
|
|
40
|
+
const distance = effect.distance ?? 4;
|
|
41
|
+
const dx = Math.cos(angle) * distance;
|
|
42
|
+
const dy = Math.sin(angle) * distance;
|
|
43
|
+
const color = effect.color ?? 0;
|
|
44
|
+
const alpha = effect.alpha ?? 1;
|
|
45
|
+
const strength = effect.strength ?? 1;
|
|
46
|
+
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
47
|
+
// Pass 1: invert source alpha and tint with shadow color → s0
|
|
48
|
+
applyGlEffectInvertTintPass(state, src, s0, color, alpha, strength);
|
|
49
|
+
// Pass 2: blur → s1 (s2 is ping-pong temp)
|
|
50
|
+
applyGlEffectBoxBlur(state, s0, s1, s2, { blurX: effect.blurX ?? 4, blurY: effect.blurY ?? 4, passes: quality });
|
|
51
|
+
// Pass 3: shift the blurred shadow by the offset → s0 (s1 no longer needed).
|
|
52
|
+
// s0 still holds pass-1 content; clear it so the offset blit doesn't blend on top of it.
|
|
53
|
+
clearGlRenderTarget(state, s0);
|
|
54
|
+
applyGlEffectBlitOffsetPass(state, s1, s0, dx, dy);
|
|
55
|
+
// Pass 4: clip offset shadow (s0) to source alpha → s1.
|
|
56
|
+
// s1 still holds pass-2 blur content; clear it before the clip blit.
|
|
57
|
+
clearGlRenderTarget(state, s1);
|
|
58
|
+
applyGlInnerClipPass(state, s0, src, s1);
|
|
59
|
+
// Final composite: source first, then clipped shadow on top
|
|
60
|
+
clearGlRenderTarget(state, dst);
|
|
61
|
+
applyGlEffectBlitPass(state, src, dst);
|
|
62
|
+
applyGlEffectBlitPass(state, s1, dst);
|
|
63
|
+
releaseGlRenderTarget(pool, s0);
|
|
64
|
+
releaseGlRenderTarget(pool, s1);
|
|
65
|
+
releaseGlRenderTarget(pool, s2);
|
|
66
|
+
}
|
|
67
|
+
export const defaultGlInnerShadowEffectRunner = (ctx, effect) => {
|
|
68
|
+
applyInnerShadowEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
69
|
+
};
|
|
70
|
+
function applyGlInnerClipPass(state, shadow, source, dest) {
|
|
71
|
+
const loc = getClipShader(state);
|
|
72
|
+
drawGlFullscreenPass(state, loc, [shadow.texture, source.texture], dest, () => { });
|
|
73
|
+
}
|
|
74
|
+
function getClipShader(state) {
|
|
75
|
+
let loc = clipShaders.get(state);
|
|
76
|
+
if (loc === undefined) {
|
|
77
|
+
const gl = state.gl;
|
|
78
|
+
const base = compileGlFullscreenProgram(gl, INNER_CLIP_FRAGMENT_SRC);
|
|
79
|
+
loc = { ...base };
|
|
80
|
+
clipShaders.set(state, loc);
|
|
81
|
+
}
|
|
82
|
+
return loc;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=glInnerShadowEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glInnerShadowEffect.js","sourceRoot":"","sources":["../src/glInnerShadowEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, MedianEffect } from '@flighthq/types';
|
|
2
|
+
export declare const MAX_MEDIAN_EFFECT_GL_RADIUS = 2;
|
|
3
|
+
export declare function applyMedianEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<MedianEffect>): void;
|
|
4
|
+
export declare const defaultGlMedianEffectRunner: GlRenderEffectRunner;
|
|
5
|
+
//# sourceMappingURL=glMedianEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glMedianEffect.d.ts","sourceRoot":"","sources":["../src/glMedianEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMzG,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAM7C,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAON;AAED,eAAO,MAAM,2BAA2B,EAAE,oBAEzC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Largest median-filter radius the WebGL path supports (radius 2 → a 5×5, 25-sample window). The cap
|
|
4
|
+
// is the fixed sort-array size in the fragment shader; larger radii are unsupported on this backend.
|
|
5
|
+
export const MAX_MEDIAN_EFFECT_GL_RADIUS = 2;
|
|
6
|
+
const MAX_SAMPLES = (MAX_MEDIAN_EFFECT_GL_RADIUS * 2 + 1) * (MAX_MEDIAN_EFFECT_GL_RADIUS * 2 + 1); // 25
|
|
7
|
+
// Per-channel median denoise: each output pixel is the median of its (2·radius+1)² neighborhood.
|
|
8
|
+
// Preserves edges while removing salt-and-pepper noise. A single GPU pass — no scratch targets.
|
|
9
|
+
export function applyMedianEffectToGl(state, source, dest, effect) {
|
|
10
|
+
const radius = Math.min(MAX_MEDIAN_EFFECT_GL_RADIUS, Math.max(0, Math.round(effect.radius ?? 1)));
|
|
11
|
+
const program = getGlEffectProgram(state, 'stylization.median', MEDIAN_FRAGMENT_SRC);
|
|
12
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
13
|
+
gl.uniform2f(gl.getUniformLocation(p.program, 'u_texelSize'), 1 / source.width, 1 / source.height);
|
|
14
|
+
gl.uniform1i(gl.getUniformLocation(p.program, 'u_radius'), radius);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export const defaultGlMedianEffectRunner = (ctx, effect) => {
|
|
18
|
+
applyMedianEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
19
|
+
};
|
|
20
|
+
const MEDIAN_FRAGMENT_SRC = `#version 300 es
|
|
21
|
+
precision mediump float;
|
|
22
|
+
in vec2 v_texCoord;
|
|
23
|
+
uniform sampler2D u_texture0;
|
|
24
|
+
uniform vec2 u_texelSize;
|
|
25
|
+
uniform int u_radius;
|
|
26
|
+
out vec4 fragColor;
|
|
27
|
+
|
|
28
|
+
const int MAX_S = ${MAX_SAMPLES};
|
|
29
|
+
|
|
30
|
+
void sortFloat(inout float arr[MAX_S], int n) {
|
|
31
|
+
for (int i = 1; i < n; i++) {
|
|
32
|
+
float key = arr[i];
|
|
33
|
+
int j = i - 1;
|
|
34
|
+
while (j >= 0 && arr[j] > key) {
|
|
35
|
+
arr[j + 1] = arr[j];
|
|
36
|
+
j--;
|
|
37
|
+
}
|
|
38
|
+
arr[j + 1] = key;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void main() {
|
|
43
|
+
int r = clamp(u_radius, 0, ${MAX_MEDIAN_EFFECT_GL_RADIUS});
|
|
44
|
+
if (r == 0) {
|
|
45
|
+
fragColor = texture(u_texture0, v_texCoord);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
int n = (2 * r + 1) * (2 * r + 1);
|
|
49
|
+
float rv[MAX_S];
|
|
50
|
+
float gv[MAX_S];
|
|
51
|
+
float bv[MAX_S];
|
|
52
|
+
float av[MAX_S];
|
|
53
|
+
int count = 0;
|
|
54
|
+
for (int dy = -${MAX_MEDIAN_EFFECT_GL_RADIUS}; dy <= ${MAX_MEDIAN_EFFECT_GL_RADIUS}; dy++) {
|
|
55
|
+
for (int dx = -${MAX_MEDIAN_EFFECT_GL_RADIUS}; dx <= ${MAX_MEDIAN_EFFECT_GL_RADIUS}; dx++) {
|
|
56
|
+
if (abs(dy) <= r && abs(dx) <= r) {
|
|
57
|
+
vec4 s = texture(u_texture0, v_texCoord + vec2(float(dx), float(dy)) * u_texelSize);
|
|
58
|
+
rv[count] = s.r;
|
|
59
|
+
gv[count] = s.g;
|
|
60
|
+
bv[count] = s.b;
|
|
61
|
+
av[count] = s.a;
|
|
62
|
+
count++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
sortFloat(rv, n);
|
|
67
|
+
sortFloat(gv, n);
|
|
68
|
+
sortFloat(bv, n);
|
|
69
|
+
sortFloat(av, n);
|
|
70
|
+
int mid = n / 2;
|
|
71
|
+
fragColor = vec4(rv[mid], gv[mid], bv[mid], av[mid]);
|
|
72
|
+
}`;
|
|
73
|
+
//# sourceMappingURL=glMedianEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glMedianEffect.js","sourceRoot":"","sources":["../src/glMedianEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,qGAAqG;AACrG,qGAAqG;AACrG,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAE7C,MAAM,WAAW,GAAG,CAAC,2BAA2B,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,2BAA2B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK;AAExG,iGAAiG;AACjG,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CACnC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IACrF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACnG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC/E,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG;;;;;;;;oBAQR,WAAW;;;;;;;;;;;;;;;+BAeA,2BAA2B;;;;;;;;;;;mBAWvC,2BAA2B,WAAW,2BAA2B;qBAC/D,2BAA2B,WAAW,2BAA2B;;;;;;;;;;;;;;;;;EAiBpF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OuterGlowEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget, GlRenderTargetPool } from '@flighthq/types';
|
|
2
|
+
export declare function applyOuterGlowEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, pool: GlRenderTargetPool, effect: Readonly<OuterGlowEffect>): void;
|
|
3
|
+
export declare const defaultGlOuterGlowEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glOuterGlowEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glOuterGlowEffect.d.ts","sourceRoot":"","sources":["../src/glOuterGlowEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAWzB,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAuCN;AAED,eAAO,MAAM,8BAA8B,EAAE,oBAE5C,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { acquireGlRenderTarget, clearGlRenderTarget, releaseGlRenderTarget } from '@flighthq/render-gl';
|
|
2
|
+
import { applyGlEffectBlitPass } from './glEffectBlitShader';
|
|
3
|
+
import { applyGlEffectBoxBlur } from './glEffectBoxBlur';
|
|
4
|
+
import { applyGlEffectTintPass } from './glEffectTintShader';
|
|
5
|
+
// Outer-glow composite effect: tint the scene silhouette, blur it centered (no offset), then composite the source over the glow.
|
|
6
|
+
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
7
|
+
// inlined multi-pass recipe, then releases them.
|
|
8
|
+
//
|
|
9
|
+
// Compositing order: glow (centered, no offset) → source (unless `knockout`).
|
|
10
|
+
export function applyOuterGlowEffectToGl(state, source, dest, pool, effect) {
|
|
11
|
+
const descriptor = { width: source.width, height: source.height, format: source.format };
|
|
12
|
+
const s0 = acquireGlRenderTarget(state, pool, descriptor);
|
|
13
|
+
const s1 = acquireGlRenderTarget(state, pool, descriptor);
|
|
14
|
+
const s2 = acquireGlRenderTarget(state, pool, descriptor);
|
|
15
|
+
const src = source;
|
|
16
|
+
const dst = dest;
|
|
17
|
+
const color = effect.color ?? 0xff0000;
|
|
18
|
+
const alpha = effect.alpha ?? 1;
|
|
19
|
+
const strength = effect.strength ?? 1;
|
|
20
|
+
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
21
|
+
const knockout = effect.knockout ?? false;
|
|
22
|
+
const tintStrength = Math.min(1, strength);
|
|
23
|
+
const glowPasses = Math.max(1, Math.floor(strength));
|
|
24
|
+
const [mask, blurred, blurTemp] = [s0, s1, s2];
|
|
25
|
+
applyGlEffectTintPass(state, src, mask, color, alpha, tintStrength);
|
|
26
|
+
applyGlEffectBoxBlur(state, mask, blurred, blurTemp, {
|
|
27
|
+
blurX: effect.blurX ?? 6,
|
|
28
|
+
blurY: effect.blurY ?? 6,
|
|
29
|
+
passes: quality,
|
|
30
|
+
});
|
|
31
|
+
clearGlRenderTarget(state, dst);
|
|
32
|
+
for (let i = 0; i < glowPasses; i++) {
|
|
33
|
+
applyGlEffectBlitPass(state, blurred, dst);
|
|
34
|
+
}
|
|
35
|
+
if (!knockout) {
|
|
36
|
+
applyGlEffectBlitPass(state, src, dst);
|
|
37
|
+
}
|
|
38
|
+
releaseGlRenderTarget(pool, s0);
|
|
39
|
+
releaseGlRenderTarget(pool, s1);
|
|
40
|
+
releaseGlRenderTarget(pool, s2);
|
|
41
|
+
}
|
|
42
|
+
export const defaultGlOuterGlowEffectRunner = (ctx, effect) => {
|
|
43
|
+
applyOuterGlowEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=glOuterGlowEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glOuterGlowEffect.js","sourceRoot":"","sources":["../src/glOuterGlowEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { GlRenderEffectPipeline, GlRenderState, RenderEffect, RenderEffectPipelineOptions } from '@flighthq/types';
|
|
1
|
+
import type { Adjustment, GlRenderEffectPipeline, GlRenderState, RenderEffect, RenderEffectPipelineOptions } from '@flighthq/types';
|
|
2
2
|
export declare function beginGlRenderEffectPipeline(state: GlRenderState, pipeline: GlRenderEffectPipeline): void;
|
|
3
3
|
export declare function createGlRenderEffectPipeline(_state: GlRenderState, options?: Readonly<RenderEffectPipelineOptions>): GlRenderEffectPipeline;
|
|
4
4
|
export declare function destroyGlRenderEffectPipeline(state: GlRenderState, pipeline: GlRenderEffectPipeline): void;
|
|
5
|
-
export declare function endGlRenderEffectPipeline(state: GlRenderState, pipeline: GlRenderEffectPipeline,
|
|
5
|
+
export declare function endGlRenderEffectPipeline(state: GlRenderState, pipeline: GlRenderEffectPipeline, operations: ReadonlyArray<RenderEffect | Adjustment>): void;
|
|
6
6
|
export declare function setGlRenderEffectVelocityTexture(pipeline: GlRenderEffectPipeline, texture: WebGLTexture | null): void;
|
|
7
7
|
//# sourceMappingURL=glRenderEffectPipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/glRenderEffectPipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"glRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/glRenderEffectPipeline.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,UAAU,EACV,sBAAsB,EACtB,aAAa,EAEb,YAAY,EACZ,2BAA2B,EAC5B,MAAM,iBAAiB,CAAC;AAYzB,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAWxG;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,QAAQ,CAAC,2BAA2B,CAAM,GAClD,sBAAsB,CASxB;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAa1G;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,sBAAsB,EAChC,UAAU,EAAE,aAAa,CAAC,YAAY,GAAG,UAAU,CAAC,GACnD,IAAI,CA2EN;AAID,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAErH"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { bakeColorLutForRun, createColorLutCache, fuseColorMatrices, getAdjustmentColorMatrix, isColorLutAdjustment, } from '@flighthq/adjustments';
|
|
1
2
|
import { createMatrix } from '@flighthq/geometry';
|
|
2
|
-
import { acquireGlRenderTarget, beginGlRenderTarget, createGlRenderTarget, createGlRenderTargetPool, destroyGlRenderTarget, destroyGlRenderTargetPool, drawGlFullscreenPass, endGlRenderTarget, releaseGlRenderTarget, resizeGlRenderTarget, resolveGlRenderTarget, } from '@flighthq/render-gl';
|
|
3
|
+
import { acquireGlRenderTarget, beginGlRenderTarget, clearGlRenderTarget, createGlRenderTarget, createGlRenderTargetPool, destroyGlRenderTarget, destroyGlRenderTargetPool, drawGlFullscreenPass, endGlRenderTarget, releaseGlRenderTarget, resizeGlRenderTarget, resolveGlRenderTarget, } from '@flighthq/render-gl';
|
|
4
|
+
import { applyColorLutPassToGl } from './glColorLutPass';
|
|
5
|
+
import { applyColorMatrixPassToGl } from './glColorMatrixPass';
|
|
3
6
|
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
4
7
|
import { getGlRenderEffectRunner } from './glRenderEffectRegistry';
|
|
5
8
|
// Opt-in post-process pipeline. The scene renders into the pipeline's (optionally MSAA / HDR) target
|
|
@@ -19,7 +22,14 @@ export function beginGlRenderEffectPipeline(state, pipeline) {
|
|
|
19
22
|
beginGlRenderTarget(state, pipeline.sceneTarget, state.renderTransform2D ?? createMatrix());
|
|
20
23
|
}
|
|
21
24
|
export function createGlRenderEffectPipeline(_state, options = {}) {
|
|
22
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
options: { ...options },
|
|
27
|
+
sceneTarget: null,
|
|
28
|
+
pool: createGlRenderTargetPool(),
|
|
29
|
+
lutCache: createColorLutCache(),
|
|
30
|
+
lutTexture: { texture: null, lut: null },
|
|
31
|
+
velocityTexture: null,
|
|
32
|
+
};
|
|
23
33
|
}
|
|
24
34
|
export function destroyGlRenderEffectPipeline(state, pipeline) {
|
|
25
35
|
if (pipeline.sceneTarget) {
|
|
@@ -27,8 +37,15 @@ export function destroyGlRenderEffectPipeline(state, pipeline) {
|
|
|
27
37
|
pipeline.sceneTarget = null;
|
|
28
38
|
}
|
|
29
39
|
destroyGlRenderTargetPool(state, pipeline.pool);
|
|
40
|
+
if (pipeline.lutTexture.texture !== null) {
|
|
41
|
+
state.gl.deleteTexture(pipeline.lutTexture.texture);
|
|
42
|
+
pipeline.lutTexture.texture = null;
|
|
43
|
+
}
|
|
44
|
+
pipeline.lutTexture.lut = null;
|
|
45
|
+
pipeline.lutCache.signature = null;
|
|
46
|
+
pipeline.lutCache.lut = null;
|
|
30
47
|
}
|
|
31
|
-
export function endGlRenderEffectPipeline(state, pipeline,
|
|
48
|
+
export function endGlRenderEffectPipeline(state, pipeline, operations) {
|
|
32
49
|
const scene = pipeline.sceneTarget;
|
|
33
50
|
if (scene === null)
|
|
34
51
|
return;
|
|
@@ -39,15 +56,53 @@ export function endGlRenderEffectPipeline(state, pipeline, effects) {
|
|
|
39
56
|
let source = scene;
|
|
40
57
|
let scratchA = null;
|
|
41
58
|
let scratchB = null;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
59
|
+
// A maximal run of consecutive pointwise adjustments fuses into ONE pass: all matrix-tier → one 4×5
|
|
60
|
+
// matrix (cheaper applyColorMatrixPass); any LUT-tier member → the whole run (matrices folded in) bakes
|
|
61
|
+
// into one ColorLut (applyColorLutPass). An effect (or the end of the stack) breaks the run and flushes
|
|
62
|
+
// it first, preserving stack order.
|
|
63
|
+
let pending = [];
|
|
64
|
+
const ensureScratch = () => {
|
|
46
65
|
if (scratchA === null)
|
|
47
66
|
scratchA = acquireGlRenderTarget(state, pipeline.pool, descriptor);
|
|
48
67
|
if (scratchB === null)
|
|
49
68
|
scratchB = acquireGlRenderTarget(state, pipeline.pool, descriptor);
|
|
69
|
+
};
|
|
70
|
+
// Hand every pass a clean destination. scratchA/scratchB ping-pong across the chain, so a target
|
|
71
|
+
// reused two passes later still holds an earlier pass's output; clearing means a non-covering effect
|
|
72
|
+
// never composites onto stale content.
|
|
73
|
+
const flushAdjustments = () => {
|
|
74
|
+
if (pending.length === 0)
|
|
75
|
+
return;
|
|
76
|
+
ensureScratch();
|
|
77
|
+
const dest = source === scratchA ? scratchB : scratchA;
|
|
78
|
+
clearGlRenderTarget(state, dest);
|
|
79
|
+
if (pending.some(isColorLutAdjustment)) {
|
|
80
|
+
applyColorLutPassToGl(state, source, dest, bakeColorLutForRun(pipeline.lutCache, pending), pipeline.lutTexture);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const matrices = [];
|
|
84
|
+
for (const op of pending) {
|
|
85
|
+
const matrix = getAdjustmentColorMatrix(op);
|
|
86
|
+
if (matrix !== null)
|
|
87
|
+
matrices.push(matrix);
|
|
88
|
+
}
|
|
89
|
+
applyColorMatrixPassToGl(state, source, dest, fuseColorMatrices(matrices));
|
|
90
|
+
}
|
|
91
|
+
source = dest;
|
|
92
|
+
pending = [];
|
|
93
|
+
};
|
|
94
|
+
for (const operation of operations) {
|
|
95
|
+
if (getAdjustmentColorMatrix(operation) !== null || isColorLutAdjustment(operation)) {
|
|
96
|
+
pending.push(operation);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const runner = getGlRenderEffectRunner(state, operation.kind);
|
|
100
|
+
if (runner === null)
|
|
101
|
+
continue;
|
|
102
|
+
flushAdjustments();
|
|
103
|
+
ensureScratch();
|
|
50
104
|
const dest = source === scratchA ? scratchB : scratchA;
|
|
105
|
+
clearGlRenderTarget(state, dest);
|
|
51
106
|
// Depth/velocity always come from the original scene target, not the ping-ponged `source`.
|
|
52
107
|
runner({
|
|
53
108
|
state,
|
|
@@ -56,9 +111,10 @@ export function endGlRenderEffectPipeline(state, pipeline, effects) {
|
|
|
56
111
|
pool: pipeline.pool,
|
|
57
112
|
sceneDepthTexture: scene.depthTexture,
|
|
58
113
|
sceneVelocityTexture: pipeline.velocityTexture,
|
|
59
|
-
},
|
|
114
|
+
}, operation);
|
|
60
115
|
source = dest;
|
|
61
116
|
}
|
|
117
|
+
flushAdjustments();
|
|
62
118
|
presentGlRenderEffectResult(state, source);
|
|
63
119
|
if (scratchA !== null)
|
|
64
120
|
releaseGlRenderTarget(pipeline.pool, scratchA);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glRenderEffectPipeline.js","sourceRoot":"","sources":["../src/glRenderEffectPipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"glRenderEffectPipeline.js","sourceRoot":"","sources":["../src/glRenderEffectPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare function registerBloomGlRenderEffects(state: GlRenderState): void
|
|
|
5
5
|
export declare function registerBlurGlRenderEffects(state: GlRenderState): void;
|
|
6
6
|
export declare function registerColorGlRenderEffects(state: GlRenderState): void;
|
|
7
7
|
export declare function registerColorGradeGlRenderEffects(state: GlRenderState): void;
|
|
8
|
+
export declare function registerCompositeGlRenderEffects(state: GlRenderState): void;
|
|
8
9
|
export declare function registerCustomShaderGlRenderEffect(state: GlRenderState): void;
|
|
9
10
|
export declare function registerDefaultGlRenderEffects(state: GlRenderState): void;
|
|
10
11
|
export declare function registerScreenSpaceGlRenderEffects(state: GlRenderState): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glRenderEffectRegistrar.d.ts","sourceRoot":"","sources":["../src/glRenderEffectRegistrar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"glRenderEffectRegistrar.d.ts","sourceRoot":"","sources":["../src/glRenderEffectRegistrar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAqErD,wBAAgB,sBAAsB,IAAI,aAAa,CAAC,MAAM,CAAC,CAE9D;AAID,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAI9E;AAKD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAQvE;AAKD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAQtE;AASD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAGvE;AAID,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAE5E;AAMD,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAQ3E;AAOD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAE7E;AAKD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CASzE;AAMD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAM7E;AAID,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAE1E;AAQD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAczE"}
|