@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 @@
|
|
|
1
|
+
{"version":3,"file":"glEffectBlitShader.d.ts","sourceRoot":"","sources":["../src/glEffectBlitShader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAmC1E;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI,CAKN;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAG9G"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { compileGlFullscreenProgram, drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
// Blits a tinted texture at a UV offset. Out-of-bounds samples produce transparent output.
|
|
3
|
+
const BLIT_OFFSET_FRAGMENT_SRC = `#version 300 es
|
|
4
|
+
precision mediump float;
|
|
5
|
+
in vec2 v_texCoord;
|
|
6
|
+
uniform sampler2D u_texture;
|
|
7
|
+
uniform vec2 u_offset;
|
|
8
|
+
out vec4 fragColor;
|
|
9
|
+
void main() {
|
|
10
|
+
vec2 uv = v_texCoord + u_offset;
|
|
11
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
|
|
12
|
+
fragColor = vec4(0.0);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
fragColor = texture(u_texture, uv);
|
|
16
|
+
}`;
|
|
17
|
+
// Pass-through blit.
|
|
18
|
+
const BLIT_FRAGMENT_SRC = `#version 300 es
|
|
19
|
+
precision mediump float;
|
|
20
|
+
in vec2 v_texCoord;
|
|
21
|
+
uniform sampler2D u_texture;
|
|
22
|
+
out vec4 fragColor;
|
|
23
|
+
void main() {
|
|
24
|
+
fragColor = texture(u_texture, v_texCoord);
|
|
25
|
+
}`;
|
|
26
|
+
const blitOffsetShaders = new WeakMap();
|
|
27
|
+
const blitShaders = new WeakMap();
|
|
28
|
+
/**
|
|
29
|
+
* Blits source into dest at a pixel offset (dx, dy in screen-space Y-down).
|
|
30
|
+
* Pixels sampling outside the source bounds produce transparent output.
|
|
31
|
+
*/
|
|
32
|
+
export function applyGlEffectBlitOffsetPass(state, source, dest, dx, dy) {
|
|
33
|
+
const loc = getGlBlitOffsetShader(state);
|
|
34
|
+
drawGlFullscreenPass(state, loc, [source.texture], dest, (gl) => {
|
|
35
|
+
gl.uniform2f(loc.locOffset, -dx / source.width, dy / source.height);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Blits source directly into dest without modification. */
|
|
39
|
+
export function applyGlEffectBlitPass(state, source, dest) {
|
|
40
|
+
const loc = getGlBlitShader(state);
|
|
41
|
+
drawGlFullscreenPass(state, loc, [source.texture], dest, () => { });
|
|
42
|
+
}
|
|
43
|
+
function getGlBlitOffsetShader(state) {
|
|
44
|
+
let loc = blitOffsetShaders.get(state);
|
|
45
|
+
if (loc === undefined) {
|
|
46
|
+
const gl = state.gl;
|
|
47
|
+
const base = compileGlFullscreenProgram(gl, BLIT_OFFSET_FRAGMENT_SRC);
|
|
48
|
+
loc = { ...base, locOffset: gl.getUniformLocation(base.program, 'u_offset') };
|
|
49
|
+
blitOffsetShaders.set(state, loc);
|
|
50
|
+
}
|
|
51
|
+
return loc;
|
|
52
|
+
}
|
|
53
|
+
function getGlBlitShader(state) {
|
|
54
|
+
let loc = blitShaders.get(state);
|
|
55
|
+
if (loc === undefined) {
|
|
56
|
+
const gl = state.gl;
|
|
57
|
+
loc = compileGlFullscreenProgram(gl, BLIT_FRAGMENT_SRC);
|
|
58
|
+
blitShaders.set(state, loc);
|
|
59
|
+
}
|
|
60
|
+
return loc;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=glEffectBlitShader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEffectBlitShader.js","sourceRoot":"","sources":["../src/glEffectBlitShader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGvF,2FAA2F;AAC3F,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;EAa/B,CAAC;AAEH,qBAAqB;AACrB,MAAM,iBAAiB,GAAG;;;;;;;EAOxB,CAAC;AAMH,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAA4C,CAAC;AAClF,MAAM,WAAW,GAAG,IAAI,OAAO,EAAsC,CAAC;AAEtE;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAoB,EACpB,MAAsB,EACtB,IAAoB,EACpB,EAAU,EACV,EAAU;IAEV,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACzC,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;QAC9D,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,qBAAqB,CAAC,KAAoB,EAAE,MAAsB,EAAE,IAAoB;IACtG,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACnC,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAoB;IACjD,IAAI,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,0BAA0B,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACtE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAE,EAAE,CAAC;QAC/E,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,KAAoB;IAC3C,IAAI,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,GAAG,GAAG,0BAA0B,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACxD,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GlRenderTarget } from '@flighthq/render-gl';
|
|
2
|
+
import type { GlRenderState } from '@flighthq/types';
|
|
3
|
+
/**
|
|
4
|
+
* Applies a separable box blur to `source`, writing to `dest`. `blurX`/`blurY` are the target
|
|
5
|
+
* Gaussian standard deviations; `passes` is the number of box passes per axis (more passes
|
|
6
|
+
* converge on a Gaussian — see `computeBoxBlurPassRadius` — not a larger blur). A box blur is cheap
|
|
7
|
+
* and the right building block for soft spreads (glow, drop shadow). `temp` is a caller-provided
|
|
8
|
+
* ping-pong scratch target distinct from both `source` and `dest`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function applyGlEffectBoxBlur(state: GlRenderState, source: GlRenderTarget, dest: GlRenderTarget, temp: GlRenderTarget, options: Readonly<{
|
|
11
|
+
blurX?: number;
|
|
12
|
+
blurY?: number;
|
|
13
|
+
passes?: number;
|
|
14
|
+
}>): void;
|
|
15
|
+
//# sourceMappingURL=glEffectBoxBlur.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEffectBoxBlur.d.ts","sourceRoot":"","sources":["../src/glEffectBoxBlur.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgC1E;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACrE,IAAI,CA6BN"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { computeBoxBlurPassRadius } from '@flighthq/effects';
|
|
2
|
+
import { compileGlFullscreenProgram, drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
3
|
+
const BOX_BLUR_FRAGMENT_SRC = `#version 300 es
|
|
4
|
+
precision mediump float;
|
|
5
|
+
in vec2 v_texCoord;
|
|
6
|
+
uniform sampler2D u_texture;
|
|
7
|
+
uniform vec2 u_texelSize;
|
|
8
|
+
uniform float u_radius;
|
|
9
|
+
uniform vec2 u_direction;
|
|
10
|
+
out vec4 fragColor;
|
|
11
|
+
void main() {
|
|
12
|
+
int r = max(0, int(u_radius));
|
|
13
|
+
if (r == 0) {
|
|
14
|
+
fragColor = texture(u_texture, v_texCoord);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
vec4 sum = vec4(0.0);
|
|
18
|
+
int count = 2 * r + 1;
|
|
19
|
+
for (int i = -r; i <= r; i++) {
|
|
20
|
+
sum += texture(u_texture, v_texCoord + float(i) * u_texelSize * u_direction);
|
|
21
|
+
}
|
|
22
|
+
fragColor = sum / float(count);
|
|
23
|
+
}`;
|
|
24
|
+
const boxBlurShaders = new WeakMap();
|
|
25
|
+
/**
|
|
26
|
+
* Applies a separable box blur to `source`, writing to `dest`. `blurX`/`blurY` are the target
|
|
27
|
+
* Gaussian standard deviations; `passes` is the number of box passes per axis (more passes
|
|
28
|
+
* converge on a Gaussian — see `computeBoxBlurPassRadius` — not a larger blur). A box blur is cheap
|
|
29
|
+
* and the right building block for soft spreads (glow, drop shadow). `temp` is a caller-provided
|
|
30
|
+
* ping-pong scratch target distinct from both `source` and `dest`.
|
|
31
|
+
*/
|
|
32
|
+
export function applyGlEffectBoxBlur(state, source, dest, temp, options) {
|
|
33
|
+
const passes = Math.max(1, Math.round(options.passes ?? 1));
|
|
34
|
+
const blurX = options.blurX ?? 4;
|
|
35
|
+
const blurY = options.blurY ?? 4;
|
|
36
|
+
const loc = getBoxBlurShader(state);
|
|
37
|
+
let read = source;
|
|
38
|
+
let write = temp;
|
|
39
|
+
// Each pass may use a different radius per axis so the box widths converge on the target sigma;
|
|
40
|
+
// zero-radius passes are skipped. If nothing is written, the tail blit copies source to dest.
|
|
41
|
+
for (let pass = 0; pass < passes; pass++) {
|
|
42
|
+
const radiusX = computeBoxBlurPassRadius(blurX, passes, pass);
|
|
43
|
+
if (radiusX > 0) {
|
|
44
|
+
applyBoxBlurPass(state, read, write, loc, radiusX, 1, 0);
|
|
45
|
+
read = write;
|
|
46
|
+
write = write === temp ? dest : temp;
|
|
47
|
+
}
|
|
48
|
+
const radiusY = computeBoxBlurPassRadius(blurY, passes, pass);
|
|
49
|
+
if (radiusY > 0) {
|
|
50
|
+
applyBoxBlurPass(state, read, write, loc, radiusY, 0, 1);
|
|
51
|
+
read = write;
|
|
52
|
+
write = write === temp ? dest : temp;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (read !== dest) {
|
|
56
|
+
applyBlurBlit(state, read, dest);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function applyBlurBlit(state, source, dest) {
|
|
60
|
+
const loc = getBoxBlurShader(state);
|
|
61
|
+
drawGlFullscreenPass(state, loc, [source.texture], dest, (gl) => {
|
|
62
|
+
gl.uniform2f(loc.locTexelSize, 0, 0);
|
|
63
|
+
gl.uniform1f(loc.locRadius, 0);
|
|
64
|
+
gl.uniform2f(loc.locDirection, 0, 0);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function applyBoxBlurPass(state, source, dest, loc, radius, dirX, dirY) {
|
|
68
|
+
drawGlFullscreenPass(state, loc, [source.texture], dest, (gl) => {
|
|
69
|
+
gl.uniform2f(loc.locTexelSize, 1 / source.width, 1 / source.height);
|
|
70
|
+
gl.uniform1f(loc.locRadius, radius);
|
|
71
|
+
gl.uniform2f(loc.locDirection, dirX, dirY);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function getBoxBlurShader(state) {
|
|
75
|
+
let loc = boxBlurShaders.get(state);
|
|
76
|
+
if (loc === undefined) {
|
|
77
|
+
const gl = state.gl;
|
|
78
|
+
const base = compileGlFullscreenProgram(gl, BOX_BLUR_FRAGMENT_SRC);
|
|
79
|
+
loc = {
|
|
80
|
+
...base,
|
|
81
|
+
locTexelSize: gl.getUniformLocation(base.program, 'u_texelSize'),
|
|
82
|
+
locRadius: gl.getUniformLocation(base.program, 'u_radius'),
|
|
83
|
+
locDirection: gl.getUniformLocation(base.program, 'u_direction'),
|
|
84
|
+
};
|
|
85
|
+
boxBlurShaders.set(state, loc);
|
|
86
|
+
}
|
|
87
|
+
return loc;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=glEffectBoxBlur.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEffectBoxBlur.js","sourceRoot":"","sources":["../src/glEffectBoxBlur.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a 256-entry RGBA gradient ramp on the GPU. The caller owns the
|
|
3
|
+
* returned texture and must delete it with `gl.deleteTexture` when done.
|
|
4
|
+
*
|
|
5
|
+
* `ratios` are in byte scale [0,255]. Colors are packed RGB integers.
|
|
6
|
+
* `alphas` are in [0,1].
|
|
7
|
+
*/
|
|
8
|
+
export declare function createGlEffectGradientRampTexture(gl: WebGL2RenderingContext, colors: ReadonlyArray<number>, alphas: ReadonlyArray<number>, ratios: ReadonlyArray<number>): WebGLTexture;
|
|
9
|
+
//# sourceMappingURL=glEffectGradientRamp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEffectGradientRamp.d.ts","sourceRoot":"","sources":["../src/glEffectGradientRamp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,EAAE,EAAE,sBAAsB,EAC1B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,YAAY,CAWd"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a 256-entry RGBA gradient ramp on the GPU. The caller owns the
|
|
3
|
+
* returned texture and must delete it with `gl.deleteTexture` when done.
|
|
4
|
+
*
|
|
5
|
+
* `ratios` are in byte scale [0,255]. Colors are packed RGB integers.
|
|
6
|
+
* `alphas` are in [0,1].
|
|
7
|
+
*/
|
|
8
|
+
export function createGlEffectGradientRampTexture(gl, colors, alphas, ratios) {
|
|
9
|
+
const data = buildRampData(colors, alphas, ratios);
|
|
10
|
+
const texture = gl.createTexture();
|
|
11
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
12
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 256, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
|
|
13
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
14
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
15
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
16
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
17
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
18
|
+
return texture;
|
|
19
|
+
}
|
|
20
|
+
function buildRampData(colors, alphas, ratios) {
|
|
21
|
+
const out = new Uint8ClampedArray(256 * 4);
|
|
22
|
+
if (colors.length === 0)
|
|
23
|
+
return out;
|
|
24
|
+
for (let i = 0; i < 256; i++) {
|
|
25
|
+
const t = i;
|
|
26
|
+
let r = 0, g = 0, b = 0, a = 0;
|
|
27
|
+
if (t <= ratios[0]) {
|
|
28
|
+
const c = colors[0];
|
|
29
|
+
r = (c >> 16) & 0xff;
|
|
30
|
+
g = (c >> 8) & 0xff;
|
|
31
|
+
b = c & 0xff;
|
|
32
|
+
a = Math.round(alphas[0] * 255);
|
|
33
|
+
}
|
|
34
|
+
else if (t >= ratios[ratios.length - 1]) {
|
|
35
|
+
const c = colors[colors.length - 1];
|
|
36
|
+
r = (c >> 16) & 0xff;
|
|
37
|
+
g = (c >> 8) & 0xff;
|
|
38
|
+
b = c & 0xff;
|
|
39
|
+
a = Math.round(alphas[alphas.length - 1] * 255);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
for (let j = 0; j < ratios.length - 1; j++) {
|
|
43
|
+
const r0 = ratios[j];
|
|
44
|
+
const r1 = ratios[j + 1];
|
|
45
|
+
if (t >= r0 && t <= r1) {
|
|
46
|
+
const blend = r1 > r0 ? (t - r0) / (r1 - r0) : 0;
|
|
47
|
+
const c0 = colors[j];
|
|
48
|
+
const c1 = colors[j + 1];
|
|
49
|
+
r = Math.round(((c0 >> 16) & 0xff) * (1 - blend) + ((c1 >> 16) & 0xff) * blend);
|
|
50
|
+
g = Math.round(((c0 >> 8) & 0xff) * (1 - blend) + ((c1 >> 8) & 0xff) * blend);
|
|
51
|
+
b = Math.round((c0 & 0xff) * (1 - blend) + (c1 & 0xff) * blend);
|
|
52
|
+
a = Math.round(alphas[j] * 255 * (1 - blend) + alphas[j + 1] * 255 * blend);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
out[i * 4] = r;
|
|
58
|
+
out[i * 4 + 1] = g;
|
|
59
|
+
out[i * 4 + 2] = b;
|
|
60
|
+
out[i * 4 + 3] = a;
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=glEffectGradientRamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEffectGradientRamp.js","sourceRoot":"","sources":["../src/glEffectGradientRamp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GlRenderTarget } from '@flighthq/render-gl';
|
|
2
|
+
import type { GlRenderState } from '@flighthq/types';
|
|
3
|
+
/** Tints the INVERTED source alpha with color, outputs a premultiplied mask. Used for inner effects. */
|
|
4
|
+
export declare function applyGlEffectInvertTintPass(state: GlRenderState, source: GlRenderTarget, dest: GlRenderTarget, color: number, alpha: number, strength: number): void;
|
|
5
|
+
/** Tints the source alpha with color, outputs a premultiplied mask into dest. */
|
|
6
|
+
export declare function applyGlEffectTintPass(state: GlRenderState, source: GlRenderTarget, dest: GlRenderTarget, color: number, alpha: number, strength: number): void;
|
|
7
|
+
//# sourceMappingURL=glEffectTintShader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEffectTintShader.d.ts","sourceRoot":"","sources":["../src/glEffectTintShader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAyC1E,wGAAwG;AACxG,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,IAAI,CAON;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,IAAI,CAON"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { compileGlFullscreenProgram, drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
// Extracts the source alpha, tints it with a solid color, and outputs a
|
|
3
|
+
// premultiplied RGBA texture.
|
|
4
|
+
const TINT_FRAGMENT_SRC = `#version 300 es
|
|
5
|
+
precision mediump float;
|
|
6
|
+
in vec2 v_texCoord;
|
|
7
|
+
uniform sampler2D u_texture;
|
|
8
|
+
uniform vec3 u_color;
|
|
9
|
+
uniform float u_alpha;
|
|
10
|
+
uniform float u_strength;
|
|
11
|
+
out vec4 fragColor;
|
|
12
|
+
void main() {
|
|
13
|
+
float a = min(1.0, texture(u_texture, v_texCoord).a * u_alpha * u_strength);
|
|
14
|
+
fragColor = vec4(u_color * a, a);
|
|
15
|
+
}`;
|
|
16
|
+
// Extracts the INVERTED source alpha, tints it with a solid color, and outputs
|
|
17
|
+
// a premultiplied RGBA texture. Used as the first pass for inner glow/shadow.
|
|
18
|
+
const INVERT_TINT_FRAGMENT_SRC = `#version 300 es
|
|
19
|
+
precision mediump float;
|
|
20
|
+
in vec2 v_texCoord;
|
|
21
|
+
uniform sampler2D u_texture;
|
|
22
|
+
uniform vec3 u_color;
|
|
23
|
+
uniform float u_alpha;
|
|
24
|
+
uniform float u_strength;
|
|
25
|
+
out vec4 fragColor;
|
|
26
|
+
void main() {
|
|
27
|
+
float a = min(1.0, (1.0 - texture(u_texture, v_texCoord).a) * u_alpha * u_strength);
|
|
28
|
+
fragColor = vec4(u_color * a, a);
|
|
29
|
+
}`;
|
|
30
|
+
const tintShaders = new WeakMap();
|
|
31
|
+
const invertTintShaders = new WeakMap();
|
|
32
|
+
/** Tints the INVERTED source alpha with color, outputs a premultiplied mask. Used for inner effects. */
|
|
33
|
+
export function applyGlEffectInvertTintPass(state, source, dest, color, alpha, strength) {
|
|
34
|
+
const loc = getGlInvertTintShader(state);
|
|
35
|
+
drawGlFullscreenPass(state, loc, [source.texture], dest, (gl) => {
|
|
36
|
+
gl.uniform3f(loc.locColor, ((color >> 16) & 0xff) / 255, ((color >> 8) & 0xff) / 255, (color & 0xff) / 255);
|
|
37
|
+
gl.uniform1f(loc.locAlpha, alpha);
|
|
38
|
+
gl.uniform1f(loc.locStrength, strength);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Tints the source alpha with color, outputs a premultiplied mask into dest. */
|
|
42
|
+
export function applyGlEffectTintPass(state, source, dest, color, alpha, strength) {
|
|
43
|
+
const loc = getGlTintShader(state);
|
|
44
|
+
drawGlFullscreenPass(state, loc, [source.texture], dest, (gl) => {
|
|
45
|
+
gl.uniform3f(loc.locColor, ((color >> 16) & 0xff) / 255, ((color >> 8) & 0xff) / 255, (color & 0xff) / 255);
|
|
46
|
+
gl.uniform1f(loc.locAlpha, alpha);
|
|
47
|
+
gl.uniform1f(loc.locStrength, strength);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function getGlInvertTintShader(state) {
|
|
51
|
+
let loc = invertTintShaders.get(state);
|
|
52
|
+
if (loc === undefined) {
|
|
53
|
+
const gl = state.gl;
|
|
54
|
+
const base = compileGlFullscreenProgram(gl, INVERT_TINT_FRAGMENT_SRC);
|
|
55
|
+
loc = {
|
|
56
|
+
...base,
|
|
57
|
+
locColor: gl.getUniformLocation(base.program, 'u_color'),
|
|
58
|
+
locAlpha: gl.getUniformLocation(base.program, 'u_alpha'),
|
|
59
|
+
locStrength: gl.getUniformLocation(base.program, 'u_strength'),
|
|
60
|
+
};
|
|
61
|
+
invertTintShaders.set(state, loc);
|
|
62
|
+
}
|
|
63
|
+
return loc;
|
|
64
|
+
}
|
|
65
|
+
function getGlTintShader(state) {
|
|
66
|
+
let loc = tintShaders.get(state);
|
|
67
|
+
if (loc === undefined) {
|
|
68
|
+
const gl = state.gl;
|
|
69
|
+
const base = compileGlFullscreenProgram(gl, TINT_FRAGMENT_SRC);
|
|
70
|
+
loc = {
|
|
71
|
+
...base,
|
|
72
|
+
locColor: gl.getUniformLocation(base.program, 'u_color'),
|
|
73
|
+
locAlpha: gl.getUniformLocation(base.program, 'u_alpha'),
|
|
74
|
+
locStrength: gl.getUniformLocation(base.program, 'u_strength'),
|
|
75
|
+
};
|
|
76
|
+
tintShaders.set(state, loc);
|
|
77
|
+
}
|
|
78
|
+
return loc;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=glEffectTintShader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEffectTintShader.js","sourceRoot":"","sources":["../src/glEffectTintShader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GradientBevelEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget, GlRenderTargetPool } from '@flighthq/types';
|
|
2
|
+
export declare function applyGradientBevelEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, pool: GlRenderTargetPool, effect: Readonly<GradientBevelEffect>): void;
|
|
3
|
+
export declare const defaultGlGradientBevelEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glGradientBevelEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glGradientBevelEffect.d.ts","sourceRoot":"","sources":["../src/glGradientBevelEffect.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,mBAAmB,EAEnB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAuDzB,wBAAgB,4BAA4B,CAC1C,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,mBAAmB,CAAC,GACpC,IAAI,CAyCN;AAED,eAAO,MAAM,kCAAkC,EAAE,oBAEhD,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { acquireGlRenderTarget, clearGlRenderTarget, compileGlFullscreenProgram, drawGlFullscreenPass, releaseGlRenderTarget, } from '@flighthq/render-gl';
|
|
2
|
+
import { applyGlEffectBlitPass } from './glEffectBlitShader';
|
|
3
|
+
import { applyGlEffectBoxBlur } from './glEffectBoxBlur';
|
|
4
|
+
import { createGlEffectGradientRampTexture } from './glEffectGradientRamp';
|
|
5
|
+
import { applyGlEffectTintPass } from './glEffectTintShader';
|
|
6
|
+
// Samples the blurred alpha at +offset and -offset to compute a bevel value
|
|
7
|
+
// in [-1, 1], mapped to [0, 1] for gradient lookup. Outputs the encoded
|
|
8
|
+
// bevel value in the red channel; alpha=1 (will be clipped later).
|
|
9
|
+
const BEVEL_ENCODE_FRAGMENT_SRC = `#version 300 es
|
|
10
|
+
precision mediump float;
|
|
11
|
+
in vec2 v_texCoord;
|
|
12
|
+
uniform sampler2D u_texture;
|
|
13
|
+
uniform vec2 u_offset;
|
|
14
|
+
out vec4 fragColor;
|
|
15
|
+
void main() {
|
|
16
|
+
float high = texture(u_texture, v_texCoord - u_offset).a;
|
|
17
|
+
float low = texture(u_texture, v_texCoord + u_offset).a;
|
|
18
|
+
float bevelVal = clamp((high - low) * 0.5 + 0.5, 0.0, 1.0);
|
|
19
|
+
fragColor = vec4(bevelVal, 0.0, 0.0, 1.0);
|
|
20
|
+
}`;
|
|
21
|
+
// Looks up the encoded bevel value (in .r) in the gradient ramp and clips
|
|
22
|
+
// the result to the source alpha (unit 1 holds the source).
|
|
23
|
+
const BEVEL_APPLY_FRAGMENT_SRC = `#version 300 es
|
|
24
|
+
precision mediump float;
|
|
25
|
+
in vec2 v_texCoord;
|
|
26
|
+
uniform sampler2D u_texture;
|
|
27
|
+
uniform sampler2D u_ramp;
|
|
28
|
+
uniform sampler2D u_source;
|
|
29
|
+
out vec4 fragColor;
|
|
30
|
+
void main() {
|
|
31
|
+
float bevelVal = texture(u_texture, v_texCoord).r;
|
|
32
|
+
vec4 color = texture(u_ramp, vec2(bevelVal, 0.5));
|
|
33
|
+
float srcAlpha = texture(u_source, v_texCoord).a;
|
|
34
|
+
fragColor = color * srcAlpha;
|
|
35
|
+
}`;
|
|
36
|
+
const encodeShaders = new WeakMap();
|
|
37
|
+
const applyShaders = new WeakMap();
|
|
38
|
+
// Gradient-bevel composite effect: a bevel whose highlight→shadow band color is looked up from a colors/alphas/ratios gradient ramp indexed by the encoded bevel depth.
|
|
39
|
+
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
40
|
+
// inlined multi-pass recipe, then releases them. The gradient maps bevel depth (shadow edge →
|
|
41
|
+
// highlight edge) to colors, building a temporary `WebGLTexture` per call.
|
|
42
|
+
export function applyGradientBevelEffectToGl(state, source, dest, pool, effect) {
|
|
43
|
+
const descriptor = { width: source.width, height: source.height, format: source.format };
|
|
44
|
+
const s0 = acquireGlRenderTarget(state, pool, descriptor);
|
|
45
|
+
const s1 = acquireGlRenderTarget(state, pool, descriptor);
|
|
46
|
+
const s2 = acquireGlRenderTarget(state, pool, descriptor);
|
|
47
|
+
const src = source;
|
|
48
|
+
const dst = dest;
|
|
49
|
+
const angle = ((effect.angle ?? 45) * Math.PI) / 180;
|
|
50
|
+
const distance = effect.distance ?? 4;
|
|
51
|
+
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
52
|
+
const strength = effect.strength ?? 1;
|
|
53
|
+
const gl = state.gl;
|
|
54
|
+
// Build blur basis → s1
|
|
55
|
+
applyGlEffectTintPass(state, src, s0, 0xffffff, 1, Math.min(1, strength));
|
|
56
|
+
applyGlEffectBoxBlur(state, s0, s1, s2, { blurX: effect.blurX ?? 4, blurY: effect.blurY ?? 4, passes: quality });
|
|
57
|
+
// Encode bevel value from blurred alpha offset samples → s0.
|
|
58
|
+
// The Y offset is negated because render targets are bottom-left origin (V-flipped vs image space),
|
|
59
|
+
// so an image-space downward light direction maps to a negative texel-V offset — matching glBevelEffect.
|
|
60
|
+
const dx = Math.cos(angle) * distance;
|
|
61
|
+
const dy = Math.sin(angle) * distance;
|
|
62
|
+
applyBevelEncodePass(state, s1, s0, dx / s1.width, -dy / s1.height);
|
|
63
|
+
// Build gradient ramp, apply to encoded bevel value clipped to source alpha → s1
|
|
64
|
+
const ramp = createGlEffectGradientRampTexture(gl, effect.colors, effect.alphas, effect.ratios);
|
|
65
|
+
applyBevelApplyPass(state, s0, ramp, src, s1);
|
|
66
|
+
gl.deleteTexture(ramp);
|
|
67
|
+
clearGlRenderTarget(state, dst);
|
|
68
|
+
if (!(effect.bevelType && effect.bevelType !== 'full')) {
|
|
69
|
+
applyGlEffectBlitPass(state, src, dst);
|
|
70
|
+
}
|
|
71
|
+
applyGlEffectBlitPass(state, s1, dst);
|
|
72
|
+
releaseGlRenderTarget(pool, s0);
|
|
73
|
+
releaseGlRenderTarget(pool, s1);
|
|
74
|
+
releaseGlRenderTarget(pool, s2);
|
|
75
|
+
}
|
|
76
|
+
export const defaultGlGradientBevelEffectRunner = (ctx, effect) => {
|
|
77
|
+
applyGradientBevelEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
78
|
+
};
|
|
79
|
+
function applyBevelApplyPass(state, encoded, ramp, source, dest) {
|
|
80
|
+
const loc = getApplyShader(state);
|
|
81
|
+
drawGlFullscreenPass(state, loc, [encoded.texture], dest, (gl) => {
|
|
82
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
83
|
+
gl.bindTexture(gl.TEXTURE_2D, ramp);
|
|
84
|
+
gl.uniform1i(loc.locRamp, 1);
|
|
85
|
+
gl.activeTexture(gl.TEXTURE2);
|
|
86
|
+
gl.bindTexture(gl.TEXTURE_2D, source.texture);
|
|
87
|
+
gl.uniform1i(loc.locSource, 2);
|
|
88
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function applyBevelEncodePass(state, blurred, dest, dx, dy) {
|
|
92
|
+
const loc = getEncodeShader(state);
|
|
93
|
+
drawGlFullscreenPass(state, loc, [blurred.texture], dest, (gl) => {
|
|
94
|
+
gl.uniform2f(loc.locOffset, dx, dy);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function getApplyShader(state) {
|
|
98
|
+
let loc = applyShaders.get(state);
|
|
99
|
+
if (loc === undefined) {
|
|
100
|
+
const gl = state.gl;
|
|
101
|
+
const base = compileGlFullscreenProgram(gl, BEVEL_APPLY_FRAGMENT_SRC);
|
|
102
|
+
loc = {
|
|
103
|
+
...base,
|
|
104
|
+
locRamp: gl.getUniformLocation(base.program, 'u_ramp'),
|
|
105
|
+
locSource: gl.getUniformLocation(base.program, 'u_source'),
|
|
106
|
+
};
|
|
107
|
+
applyShaders.set(state, loc);
|
|
108
|
+
}
|
|
109
|
+
return loc;
|
|
110
|
+
}
|
|
111
|
+
function getEncodeShader(state) {
|
|
112
|
+
let loc = encodeShaders.get(state);
|
|
113
|
+
if (loc === undefined) {
|
|
114
|
+
const gl = state.gl;
|
|
115
|
+
const base = compileGlFullscreenProgram(gl, BEVEL_ENCODE_FRAGMENT_SRC);
|
|
116
|
+
loc = { ...base, locOffset: gl.getUniformLocation(base.program, 'u_offset') };
|
|
117
|
+
encodeShaders.set(state, loc);
|
|
118
|
+
}
|
|
119
|
+
return loc;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=glGradientBevelEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glGradientBevelEffect.js","sourceRoot":"","sources":["../src/glGradientBevelEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GradientGlowEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget, GlRenderTargetPool } from '@flighthq/types';
|
|
2
|
+
export declare function applyGradientGlowEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, pool: GlRenderTargetPool, effect: Readonly<GradientGlowEffect>): void;
|
|
3
|
+
export declare const defaultGlGradientGlowEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glGradientGlowEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glGradientGlowEffect.d.ts","sourceRoot":"","sources":["../src/glGradientGlowEffect.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,kBAAkB,EAElB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAgCzB,wBAAgB,2BAA2B,CACzC,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,kBAAkB,CAAC,GACnC,IAAI,CA8BN;AAED,eAAO,MAAM,iCAAiC,EAAE,oBAE/C,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { acquireGlRenderTarget, clearGlRenderTarget, compileGlFullscreenProgram, drawGlFullscreenPass, releaseGlRenderTarget, } from '@flighthq/render-gl';
|
|
2
|
+
import { applyGlEffectBlitPass } from './glEffectBlitShader';
|
|
3
|
+
import { applyGlEffectBoxBlur } from './glEffectBoxBlur';
|
|
4
|
+
import { createGlEffectGradientRampTexture } from './glEffectGradientRamp';
|
|
5
|
+
import { applyGlEffectTintPass } from './glEffectTintShader';
|
|
6
|
+
// Uses the blurred alpha (unit 0) to index into a gradient ramp texture (unit 1).
|
|
7
|
+
// Outputs the gradient-colored glow at the correct intensity per pixel.
|
|
8
|
+
const GRADIENT_LOOKUP_FRAGMENT_SRC = `#version 300 es
|
|
9
|
+
precision mediump float;
|
|
10
|
+
in vec2 v_texCoord;
|
|
11
|
+
uniform sampler2D u_texture;
|
|
12
|
+
uniform sampler2D u_ramp;
|
|
13
|
+
out vec4 fragColor;
|
|
14
|
+
void main() {
|
|
15
|
+
float alpha = texture(u_texture, v_texCoord).a;
|
|
16
|
+
fragColor = texture(u_ramp, vec2(alpha, 0.5));
|
|
17
|
+
}`;
|
|
18
|
+
const lookupShaders = new WeakMap();
|
|
19
|
+
// Gradient-glow composite effect: an outer glow whose color is looked up from a colors/alphas/ratios gradient ramp indexed by the blurred silhouette alpha.
|
|
20
|
+
// Full-frame realization: acquires the recipe's three scratch targets from the effect pool, runs the
|
|
21
|
+
// inlined multi-pass recipe, then releases them. The gradient ramp is built each call from
|
|
22
|
+
// `effect.colors`, `effect.alphas`, and `effect.ratios` (a temporary `WebGLTexture` per call).
|
|
23
|
+
//
|
|
24
|
+
// Compositing order: gradient glow → source on top.
|
|
25
|
+
export function applyGradientGlowEffectToGl(state, source, dest, pool, effect) {
|
|
26
|
+
const descriptor = { width: source.width, height: source.height, format: source.format };
|
|
27
|
+
const s0 = acquireGlRenderTarget(state, pool, descriptor);
|
|
28
|
+
const s1 = acquireGlRenderTarget(state, pool, descriptor);
|
|
29
|
+
const s2 = acquireGlRenderTarget(state, pool, descriptor);
|
|
30
|
+
const src = source;
|
|
31
|
+
const dst = dest;
|
|
32
|
+
const quality = Math.max(1, Math.round(effect.quality ?? 1));
|
|
33
|
+
const strength = effect.strength ?? 1;
|
|
34
|
+
const gl = state.gl;
|
|
35
|
+
// Extract alpha as a neutral (white) mask, then blur → s1
|
|
36
|
+
applyGlEffectTintPass(state, src, s0, 0xffffff, 1, Math.min(1, strength));
|
|
37
|
+
applyGlEffectBoxBlur(state, s0, s1, s2, { blurX: effect.blurX ?? 6, blurY: effect.blurY ?? 6, passes: quality });
|
|
38
|
+
// Build gradient ramp texture and look up the blurred alpha → s0
|
|
39
|
+
const ramp = createGlEffectGradientRampTexture(gl, effect.colors, effect.alphas, effect.ratios);
|
|
40
|
+
applyGradientLookupPass(state, s1, ramp, s0);
|
|
41
|
+
gl.deleteTexture(ramp);
|
|
42
|
+
clearGlRenderTarget(state, dst);
|
|
43
|
+
applyGlEffectBlitPass(state, s0, dst);
|
|
44
|
+
applyGlEffectBlitPass(state, src, dst);
|
|
45
|
+
releaseGlRenderTarget(pool, s0);
|
|
46
|
+
releaseGlRenderTarget(pool, s1);
|
|
47
|
+
releaseGlRenderTarget(pool, s2);
|
|
48
|
+
}
|
|
49
|
+
export const defaultGlGradientGlowEffectRunner = (ctx, effect) => {
|
|
50
|
+
applyGradientGlowEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
|
|
51
|
+
};
|
|
52
|
+
function applyGradientLookupPass(state, blurred, ramp, dest) {
|
|
53
|
+
const loc = getLookupShader(state);
|
|
54
|
+
drawGlFullscreenPass(state, loc, [blurred.texture], dest, (gl) => {
|
|
55
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
56
|
+
gl.bindTexture(gl.TEXTURE_2D, ramp);
|
|
57
|
+
gl.uniform1i(loc.locRamp, 1);
|
|
58
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function getLookupShader(state) {
|
|
62
|
+
let loc = lookupShaders.get(state);
|
|
63
|
+
if (loc === undefined) {
|
|
64
|
+
const gl = state.gl;
|
|
65
|
+
const base = compileGlFullscreenProgram(gl, GRADIENT_LOOKUP_FRAGMENT_SRC);
|
|
66
|
+
loc = { ...base, locRamp: gl.getUniformLocation(base.program, 'u_ramp') };
|
|
67
|
+
lookupShaders.set(state, loc);
|
|
68
|
+
}
|
|
69
|
+
return loc;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=glGradientGlowEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glGradientGlowEffect.js","sourceRoot":"","sources":["../src/glGradientGlowEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { InnerGlowEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget, GlRenderTargetPool } from '@flighthq/types';
|
|
2
|
+
export declare function applyInnerGlowEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, pool: GlRenderTargetPool, effect: Readonly<InnerGlowEffect>): void;
|
|
3
|
+
export declare const defaultGlInnerGlowEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glInnerGlowEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glInnerGlowEffect.d.ts","sourceRoot":"","sources":["../src/glInnerGlowEffect.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EAEf,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAuCzB,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,CAiCN;AAED,eAAO,MAAM,8BAA8B,EAAE,oBAE5C,CAAC"}
|