@flighthq/effects-gl 0.1.0 → 0.2.1-next.410.a23f189

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.
Files changed (157) hide show
  1. package/dist/glBevelEffect.d.ts +4 -0
  2. package/dist/glBevelEffect.d.ts.map +1 -0
  3. package/dist/glBevelEffect.js +134 -0
  4. package/dist/glBevelEffect.js.map +1 -0
  5. package/dist/glBlendEffect.d.ts +8 -0
  6. package/dist/glBlendEffect.d.ts.map +1 -0
  7. package/dist/glBlendEffect.js +169 -0
  8. package/dist/glBlendEffect.js.map +1 -0
  9. package/dist/glBloomEffect.d.ts.map +1 -1
  10. package/dist/glBloomEffect.js +5 -5
  11. package/dist/glBloomEffect.js.map +1 -1
  12. package/dist/glBlurEffect.d.ts +8 -0
  13. package/dist/glBlurEffect.d.ts.map +1 -0
  14. package/dist/glBlurEffect.js +65 -0
  15. package/dist/glBlurEffect.js.map +1 -0
  16. package/dist/glColorLutPass.d.ts +3 -0
  17. package/dist/glColorLutPass.d.ts.map +1 -0
  18. package/dist/glColorLutPass.js +75 -0
  19. package/dist/glColorLutPass.js.map +1 -0
  20. package/dist/glColorMatrixPass.d.ts +3 -0
  21. package/dist/glColorMatrixPass.d.ts.map +1 -0
  22. package/dist/glColorMatrixPass.js +33 -0
  23. package/dist/glColorMatrixPass.js.map +1 -0
  24. package/dist/glCompositeEffect.d.ts +5 -0
  25. package/dist/glCompositeEffect.d.ts.map +1 -0
  26. package/dist/glCompositeEffect.js +90 -0
  27. package/dist/glCompositeEffect.js.map +1 -0
  28. package/dist/glConvolutionEffect.d.ts +5 -0
  29. package/dist/glConvolutionEffect.d.ts.map +1 -0
  30. package/dist/glConvolutionEffect.js +94 -0
  31. package/dist/glConvolutionEffect.js.map +1 -0
  32. package/dist/glDropShadowEffect.d.ts +4 -0
  33. package/dist/glDropShadowEffect.d.ts.map +1 -0
  34. package/dist/glDropShadowEffect.js +53 -0
  35. package/dist/glDropShadowEffect.js.map +1 -0
  36. package/dist/glEffectBlitShader.d.ts +12 -0
  37. package/dist/glEffectBlitShader.d.ts.map +1 -0
  38. package/dist/glEffectBlitShader.js +89 -0
  39. package/dist/glEffectBlitShader.js.map +1 -0
  40. package/dist/glEffectBoxBlur.d.ts +16 -0
  41. package/dist/glEffectBoxBlur.d.ts.map +1 -0
  42. package/dist/glEffectBoxBlur.js +112 -0
  43. package/dist/glEffectBoxBlur.js.map +1 -0
  44. package/dist/glEffectGradientRamp.d.ts +9 -0
  45. package/dist/glEffectGradientRamp.d.ts.map +1 -0
  46. package/dist/glEffectGradientRamp.js +64 -0
  47. package/dist/glEffectGradientRamp.js.map +1 -0
  48. package/dist/glEffectTintShader.d.ts +7 -0
  49. package/dist/glEffectTintShader.d.ts.map +1 -0
  50. package/dist/glEffectTintShader.js +82 -0
  51. package/dist/glEffectTintShader.js.map +1 -0
  52. package/dist/glGradientBevelEffect.d.ts +4 -0
  53. package/dist/glGradientBevelEffect.d.ts.map +1 -0
  54. package/dist/glGradientBevelEffect.js +127 -0
  55. package/dist/glGradientBevelEffect.js.map +1 -0
  56. package/dist/glGradientGlowEffect.d.ts +4 -0
  57. package/dist/glGradientGlowEffect.d.ts.map +1 -0
  58. package/dist/glGradientGlowEffect.js +78 -0
  59. package/dist/glGradientGlowEffect.js.map +1 -0
  60. package/dist/glInnerGlowEffect.d.ts +4 -0
  61. package/dist/glInnerGlowEffect.d.ts.map +1 -0
  62. package/dist/glInnerGlowEffect.js +96 -0
  63. package/dist/glInnerGlowEffect.js.map +1 -0
  64. package/dist/glInnerShadowEffect.d.ts +4 -0
  65. package/dist/glInnerShadowEffect.d.ts.map +1 -0
  66. package/dist/glInnerShadowEffect.js +103 -0
  67. package/dist/glInnerShadowEffect.js.map +1 -0
  68. package/dist/glMedianEffect.d.ts +5 -0
  69. package/dist/glMedianEffect.d.ts.map +1 -0
  70. package/dist/glMedianEffect.js +73 -0
  71. package/dist/glMedianEffect.js.map +1 -0
  72. package/dist/glOuterGlowEffect.d.ts +4 -0
  73. package/dist/glOuterGlowEffect.d.ts.map +1 -0
  74. package/dist/glOuterGlowEffect.js +49 -0
  75. package/dist/glOuterGlowEffect.js.map +1 -0
  76. package/dist/glRenderEffectPipeline.d.ts +2 -2
  77. package/dist/glRenderEffectPipeline.d.ts.map +1 -1
  78. package/dist/glRenderEffectPipeline.js +86 -14
  79. package/dist/glRenderEffectPipeline.js.map +1 -1
  80. package/dist/glRenderEffectRegistrar.d.ts +1 -0
  81. package/dist/glRenderEffectRegistrar.d.ts.map +1 -1
  82. package/dist/glRenderEffectRegistrar.js +62 -38
  83. package/dist/glRenderEffectRegistrar.js.map +1 -1
  84. package/dist/index.d.ts +18 -10
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +18 -10
  87. package/dist/index.js.map +1 -1
  88. package/package.json +11 -6
  89. package/src/glBevelEffect.test.ts +13 -0
  90. package/src/glBlendEffect.test.ts +111 -0
  91. package/src/glBlurEffect.test.ts +19 -0
  92. package/src/glColorLutPass.test.ts +7 -0
  93. package/src/glColorMatrixPass.test.ts +7 -0
  94. package/src/glCompositeEffect.test.ts +39 -0
  95. package/src/glConvolutionEffect.test.ts +13 -0
  96. package/src/glDropShadowEffect.test.ts +105 -0
  97. package/src/glEffectBlitShader.test.ts +19 -0
  98. package/src/glEffectBoxBlur.test.ts +57 -0
  99. package/src/glEffectGradientRamp.test.ts +7 -0
  100. package/src/glEffectTintShader.test.ts +13 -0
  101. package/src/glGradientBevelEffect.test.ts +13 -0
  102. package/src/glGradientGlowEffect.test.ts +13 -0
  103. package/src/glInnerGlowEffect.test.ts +145 -0
  104. package/src/glInnerShadowEffect.test.ts +145 -0
  105. package/src/glMedianEffect.test.ts +13 -0
  106. package/src/glOuterGlowEffect.test.ts +104 -0
  107. package/src/glRenderEffectRegistrar.test.ts +37 -6
  108. package/dist/glBrightnessContrastEffect.d.ts +0 -4
  109. package/dist/glBrightnessContrastEffect.d.ts.map +0 -1
  110. package/dist/glBrightnessContrastEffect.js +0 -28
  111. package/dist/glBrightnessContrastEffect.js.map +0 -1
  112. package/dist/glChannelMixerEffect.d.ts +0 -4
  113. package/dist/glChannelMixerEffect.d.ts.map +0 -1
  114. package/dist/glChannelMixerEffect.js +0 -30
  115. package/dist/glChannelMixerEffect.js.map +0 -1
  116. package/dist/glColorGradeEffect.d.ts +0 -4
  117. package/dist/glColorGradeEffect.d.ts.map +0 -1
  118. package/dist/glColorGradeEffect.js +0 -46
  119. package/dist/glColorGradeEffect.js.map +0 -1
  120. package/dist/glExposureEffect.d.ts +0 -4
  121. package/dist/glExposureEffect.d.ts.map +0 -1
  122. package/dist/glExposureEffect.js +0 -24
  123. package/dist/glExposureEffect.js.map +0 -1
  124. package/dist/glGrayscaleEffect.d.ts +0 -4
  125. package/dist/glGrayscaleEffect.d.ts.map +0 -1
  126. package/dist/glGrayscaleEffect.js +0 -25
  127. package/dist/glGrayscaleEffect.js.map +0 -1
  128. package/dist/glHueSaturationEffect.d.ts +0 -4
  129. package/dist/glHueSaturationEffect.d.ts.map +0 -1
  130. package/dist/glHueSaturationEffect.js +0 -67
  131. package/dist/glHueSaturationEffect.js.map +0 -1
  132. package/dist/glInvertEffect.d.ts +0 -4
  133. package/dist/glInvertEffect.d.ts.map +0 -1
  134. package/dist/glInvertEffect.js +0 -24
  135. package/dist/glInvertEffect.js.map +0 -1
  136. package/dist/glLiftGammaGainEffect.d.ts +0 -4
  137. package/dist/glLiftGammaGainEffect.d.ts.map +0 -1
  138. package/dist/glLiftGammaGainEffect.js +0 -44
  139. package/dist/glLiftGammaGainEffect.js.map +0 -1
  140. package/dist/glLookupTableGradeEffect.d.ts +0 -4
  141. package/dist/glLookupTableGradeEffect.d.ts.map +0 -1
  142. package/dist/glLookupTableGradeEffect.js +0 -28
  143. package/dist/glLookupTableGradeEffect.js.map +0 -1
  144. package/dist/glSepiaEffect.d.ts +0 -4
  145. package/dist/glSepiaEffect.d.ts.map +0 -1
  146. package/dist/glSepiaEffect.js +0 -29
  147. package/dist/glSepiaEffect.js.map +0 -1
  148. package/src/glBrightnessContrastEffect.test.ts +0 -16
  149. package/src/glChannelMixerEffect.test.ts +0 -13
  150. package/src/glColorGradeEffect.test.ts +0 -13
  151. package/src/glExposureEffect.test.ts +0 -13
  152. package/src/glGrayscaleEffect.test.ts +0 -13
  153. package/src/glHueSaturationEffect.test.ts +0 -13
  154. package/src/glInvertEffect.test.ts +0 -13
  155. package/src/glLiftGammaGainEffect.test.ts +0 -13
  156. package/src/glLookupTableGradeEffect.test.ts +0 -13
  157. package/src/glSepiaEffect.test.ts +0 -13
@@ -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,CAQN;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,CAQN"}
@@ -0,0 +1,82 @@
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
+ gl.blendFunc(gl.ONE, gl.ZERO);
40
+ });
41
+ }
42
+ /** Tints the source alpha with color, outputs a premultiplied mask into dest. */
43
+ export function applyGlEffectTintPass(state, source, dest, color, alpha, strength) {
44
+ const loc = getGlTintShader(state);
45
+ drawGlFullscreenPass(state, loc, [source.texture], dest, (gl) => {
46
+ gl.uniform3f(loc.locColor, ((color >> 16) & 0xff) / 255, ((color >> 8) & 0xff) / 255, (color & 0xff) / 255);
47
+ gl.uniform1f(loc.locAlpha, alpha);
48
+ gl.uniform1f(loc.locStrength, strength);
49
+ gl.blendFunc(gl.ONE, gl.ZERO);
50
+ });
51
+ }
52
+ function getGlInvertTintShader(state) {
53
+ let loc = invertTintShaders.get(state);
54
+ if (loc === undefined) {
55
+ const gl = state.gl;
56
+ const base = compileGlFullscreenProgram(gl, INVERT_TINT_FRAGMENT_SRC);
57
+ loc = {
58
+ ...base,
59
+ locColor: gl.getUniformLocation(base.program, 'u_color'),
60
+ locAlpha: gl.getUniformLocation(base.program, 'u_alpha'),
61
+ locStrength: gl.getUniformLocation(base.program, 'u_strength'),
62
+ };
63
+ invertTintShaders.set(state, loc);
64
+ }
65
+ return loc;
66
+ }
67
+ function getGlTintShader(state) {
68
+ let loc = tintShaders.get(state);
69
+ if (loc === undefined) {
70
+ const gl = state.gl;
71
+ const base = compileGlFullscreenProgram(gl, TINT_FRAGMENT_SRC);
72
+ loc = {
73
+ ...base,
74
+ locColor: gl.getUniformLocation(base.program, 'u_color'),
75
+ locAlpha: gl.getUniformLocation(base.program, 'u_alpha'),
76
+ locStrength: gl.getUniformLocation(base.program, 'u_strength'),
77
+ };
78
+ tintShaders.set(state, loc);
79
+ }
80
+ return loc;
81
+ }
82
+ //# 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,CA6CN;AAED,eAAO,MAAM,kCAAkC,EAAE,oBAEhD,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { acquireGlRenderTarget, clearGlRenderTarget, compileGlFullscreenProgram, drawGlFullscreenPass, releaseGlRenderTarget, } from '@flighthq/render-gl';
2
+ import { applyGlEffectBlitPass, applyGlEffectErasePass } 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 sourceMode = effect.sourceMode ?? 'draw';
54
+ const gl = state.gl;
55
+ // Build blur basis → s1
56
+ applyGlEffectTintPass(state, src, s0, 0xffffff, 1, Math.min(1, strength));
57
+ applyGlEffectBoxBlur(state, s0, s1, s2, { blurX: effect.blurX ?? 4, blurY: effect.blurY ?? 4, passes: quality });
58
+ // Encode bevel value from blurred alpha offset samples → s0.
59
+ // The Y offset is negated because render targets are bottom-left origin (V-flipped vs image space),
60
+ // so an image-space downward light direction maps to a negative texel-V offset — matching glBevelEffect.
61
+ const dx = Math.cos(angle) * distance;
62
+ const dy = Math.sin(angle) * distance;
63
+ applyBevelEncodePass(state, s1, s0, dx / s1.width, -dy / s1.height);
64
+ // Build gradient ramp, apply to encoded bevel value clipped to source alpha → s1
65
+ const ramp = createGlEffectGradientRampTexture(gl, effect.colors, effect.alphas, effect.ratios);
66
+ applyBevelApplyPass(state, s0, ramp, src, s1);
67
+ gl.deleteTexture(ramp);
68
+ clearGlRenderTarget(state, dst);
69
+ if (sourceMode === 'draw') {
70
+ applyGlEffectBlitPass(state, src, dst);
71
+ }
72
+ applyGlEffectBlitPass(state, s1, dst);
73
+ if (sourceMode === 'knockout') {
74
+ applyGlEffectErasePass(state, src, dst);
75
+ }
76
+ releaseGlRenderTarget(pool, s0);
77
+ releaseGlRenderTarget(pool, s1);
78
+ releaseGlRenderTarget(pool, s2);
79
+ }
80
+ export const defaultGlGradientBevelEffectRunner = (ctx, effect) => {
81
+ applyGradientBevelEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
82
+ };
83
+ function applyBevelApplyPass(state, encoded, ramp, source, dest) {
84
+ const loc = getApplyShader(state);
85
+ drawGlFullscreenPass(state, loc, [encoded.texture], dest, (gl) => {
86
+ gl.activeTexture(gl.TEXTURE1);
87
+ gl.bindTexture(gl.TEXTURE_2D, ramp);
88
+ gl.uniform1i(loc.locRamp, 1);
89
+ gl.activeTexture(gl.TEXTURE2);
90
+ gl.bindTexture(gl.TEXTURE_2D, source.texture);
91
+ gl.uniform1i(loc.locSource, 2);
92
+ gl.activeTexture(gl.TEXTURE0);
93
+ gl.blendFunc(gl.ONE, gl.ZERO);
94
+ });
95
+ }
96
+ function applyBevelEncodePass(state, blurred, dest, dx, dy) {
97
+ const loc = getEncodeShader(state);
98
+ drawGlFullscreenPass(state, loc, [blurred.texture], dest, (gl) => {
99
+ gl.uniform2f(loc.locOffset, dx, dy);
100
+ gl.blendFunc(gl.ONE, gl.ZERO);
101
+ });
102
+ }
103
+ function getApplyShader(state) {
104
+ let loc = applyShaders.get(state);
105
+ if (loc === undefined) {
106
+ const gl = state.gl;
107
+ const base = compileGlFullscreenProgram(gl, BEVEL_APPLY_FRAGMENT_SRC);
108
+ loc = {
109
+ ...base,
110
+ locRamp: gl.getUniformLocation(base.program, 'u_ramp'),
111
+ locSource: gl.getUniformLocation(base.program, 'u_source'),
112
+ };
113
+ applyShaders.set(state, loc);
114
+ }
115
+ return loc;
116
+ }
117
+ function getEncodeShader(state) {
118
+ let loc = encodeShaders.get(state);
119
+ if (loc === undefined) {
120
+ const gl = state.gl;
121
+ const base = compileGlFullscreenProgram(gl, BEVEL_ENCODE_FRAGMENT_SRC);
122
+ loc = { ...base, locOffset: gl.getUniformLocation(base.program, 'u_offset') };
123
+ encodeShaders.set(state, loc);
124
+ }
125
+ return loc;
126
+ }
127
+ //# 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,CAmCN;AAED,eAAO,MAAM,iCAAiC,EAAE,oBAE/C,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { acquireGlRenderTarget, clearGlRenderTarget, compileGlFullscreenProgram, drawGlFullscreenPass, releaseGlRenderTarget, } from '@flighthq/render-gl';
2
+ import { applyGlEffectBlitPass, applyGlEffectErasePass } 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 follows `sourceMode`: gradient glow, then source draw/hide/knockout treatment.
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 sourceMode = effect.sourceMode ?? 'draw';
35
+ const gl = state.gl;
36
+ // Extract alpha as a neutral (white) mask, then blur → s1
37
+ applyGlEffectTintPass(state, src, s0, 0xffffff, 1, Math.min(1, strength));
38
+ applyGlEffectBoxBlur(state, s0, s1, s2, { blurX: effect.blurX ?? 6, blurY: effect.blurY ?? 6, passes: quality });
39
+ // Build gradient ramp texture and look up the blurred alpha → s0
40
+ const ramp = createGlEffectGradientRampTexture(gl, effect.colors, effect.alphas, effect.ratios);
41
+ applyGradientLookupPass(state, s1, ramp, s0);
42
+ gl.deleteTexture(ramp);
43
+ clearGlRenderTarget(state, dst);
44
+ applyGlEffectBlitPass(state, s0, dst);
45
+ if (sourceMode === 'knockout') {
46
+ applyGlEffectErasePass(state, src, dst);
47
+ }
48
+ else if (sourceMode === 'draw') {
49
+ applyGlEffectBlitPass(state, src, dst);
50
+ }
51
+ releaseGlRenderTarget(pool, s0);
52
+ releaseGlRenderTarget(pool, s1);
53
+ releaseGlRenderTarget(pool, s2);
54
+ }
55
+ export const defaultGlGradientGlowEffectRunner = (ctx, effect) => {
56
+ applyGradientGlowEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
57
+ };
58
+ function applyGradientLookupPass(state, blurred, ramp, dest) {
59
+ const loc = getLookupShader(state);
60
+ drawGlFullscreenPass(state, loc, [blurred.texture], dest, (gl) => {
61
+ gl.activeTexture(gl.TEXTURE1);
62
+ gl.bindTexture(gl.TEXTURE_2D, ramp);
63
+ gl.uniform1i(loc.locRamp, 1);
64
+ gl.activeTexture(gl.TEXTURE0);
65
+ gl.blendFunc(gl.ONE, gl.ZERO);
66
+ });
67
+ }
68
+ function getLookupShader(state) {
69
+ let loc = lookupShaders.get(state);
70
+ if (loc === undefined) {
71
+ const gl = state.gl;
72
+ const base = compileGlFullscreenProgram(gl, GRADIENT_LOOKUP_FRAGMENT_SRC);
73
+ loc = { ...base, locRamp: gl.getUniformLocation(base.program, 'u_ramp') };
74
+ lookupShaders.set(state, loc);
75
+ }
76
+ return loc;
77
+ }
78
+ //# 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,CAyCN;AAED,eAAO,MAAM,8BAA8B,EAAE,oBAE5C,CAAC"}
@@ -0,0 +1,96 @@
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 (unless sourceMode is 'hide') + 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
+ const sourceMode = effect.sourceMode ?? 'draw';
45
+ // Pass 1: invert source alpha and tint with glow color → s0
46
+ applyGlEffectInvertTintPass(state, src, s0, color, alpha, strength);
47
+ // Pass 2: blur → s1 (s2 is ping-pong temp)
48
+ applyGlEffectBoxBlur(state, s0, s1, s2, {
49
+ blurX: effect.blurX ?? 6,
50
+ blurY: effect.blurY ?? 6,
51
+ edgeColor: getInvertTintEdgeColor(color, alpha, strength),
52
+ passes: quality,
53
+ });
54
+ // Pass 3: clip blurred glow (s1) to source alpha, output to s0 (s1 no longer needed).
55
+ // s0 still holds pass-1 content; clear it so the blend doesn't retain the exterior red.
56
+ clearGlRenderTarget(state, s0);
57
+ applyGlInnerClipPass(state, s1, src, s0);
58
+ // Final composite: source first, unless hidden, then clipped glow on top.
59
+ clearGlRenderTarget(state, dst);
60
+ if (sourceMode === 'draw') {
61
+ applyGlEffectBlitPass(state, src, dst);
62
+ }
63
+ applyGlEffectBlitPass(state, s0, dst);
64
+ releaseGlRenderTarget(pool, s0);
65
+ releaseGlRenderTarget(pool, s1);
66
+ releaseGlRenderTarget(pool, s2);
67
+ }
68
+ export const defaultGlInnerGlowEffectRunner = (ctx, effect) => {
69
+ applyInnerGlowEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
70
+ };
71
+ function applyGlInnerClipPass(state, glow, source, dest) {
72
+ const loc = getClipShader(state);
73
+ drawGlFullscreenPass(state, loc, [glow.texture, source.texture], dest, (gl) => {
74
+ gl.blendFunc(gl.ONE, gl.ZERO);
75
+ });
76
+ }
77
+ function getClipShader(state) {
78
+ let loc = clipShaders.get(state);
79
+ if (loc === undefined) {
80
+ const gl = state.gl;
81
+ const base = compileGlFullscreenProgram(gl, INNER_CLIP_FRAGMENT_SRC);
82
+ loc = { ...base };
83
+ clipShaders.set(state, loc);
84
+ }
85
+ return loc;
86
+ }
87
+ function getInvertTintEdgeColor(color, alpha, strength) {
88
+ const edgeAlpha = Math.min(1, alpha * strength);
89
+ return [
90
+ (((color >> 16) & 0xff) / 255) * edgeAlpha,
91
+ (((color >> 8) & 0xff) / 255) * edgeAlpha,
92
+ ((color & 0xff) / 255) * edgeAlpha,
93
+ edgeAlpha,
94
+ ];
95
+ }
96
+ //# 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,CAkDN;AAED,eAAO,MAAM,gCAAgC,EAAE,oBAE9C,CAAC"}
@@ -0,0 +1,103 @@
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 (unless sourceMode is 'hide') + 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
+ const sourceMode = effect.sourceMode ?? 'draw';
48
+ // Pass 1: invert source alpha and tint with shadow color → s0
49
+ applyGlEffectInvertTintPass(state, src, s0, color, alpha, strength);
50
+ // Pass 2: blur → s1 (s2 is ping-pong temp)
51
+ applyGlEffectBoxBlur(state, s0, s1, s2, {
52
+ blurX: effect.blurX ?? 4,
53
+ blurY: effect.blurY ?? 4,
54
+ edgeColor: getInvertTintEdgeColor(color, alpha, strength),
55
+ passes: quality,
56
+ });
57
+ // Pass 3: shift the blurred shadow by the offset → s0 (s1 no longer needed).
58
+ // s0 still holds pass-1 content; clear it so the offset blit doesn't blend on top of it.
59
+ clearGlRenderTarget(state, s0);
60
+ applyGlEffectBlitOffsetPass(state, s1, s0, dx, dy);
61
+ // Pass 4: clip offset shadow (s0) to source alpha → s1.
62
+ // s1 still holds pass-2 blur content; clear it before the clip blit.
63
+ clearGlRenderTarget(state, s1);
64
+ applyGlInnerClipPass(state, s0, src, s1);
65
+ // Final composite: source first, unless hidden, then clipped shadow on top.
66
+ clearGlRenderTarget(state, dst);
67
+ if (sourceMode === 'draw') {
68
+ applyGlEffectBlitPass(state, src, dst);
69
+ }
70
+ applyGlEffectBlitPass(state, s1, dst);
71
+ releaseGlRenderTarget(pool, s0);
72
+ releaseGlRenderTarget(pool, s1);
73
+ releaseGlRenderTarget(pool, s2);
74
+ }
75
+ export const defaultGlInnerShadowEffectRunner = (ctx, effect) => {
76
+ applyInnerShadowEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
77
+ };
78
+ function applyGlInnerClipPass(state, shadow, source, dest) {
79
+ const loc = getClipShader(state);
80
+ drawGlFullscreenPass(state, loc, [shadow.texture, source.texture], dest, (gl) => {
81
+ gl.blendFunc(gl.ONE, gl.ZERO);
82
+ });
83
+ }
84
+ function getClipShader(state) {
85
+ let loc = clipShaders.get(state);
86
+ if (loc === undefined) {
87
+ const gl = state.gl;
88
+ const base = compileGlFullscreenProgram(gl, INNER_CLIP_FRAGMENT_SRC);
89
+ loc = { ...base };
90
+ clipShaders.set(state, loc);
91
+ }
92
+ return loc;
93
+ }
94
+ function getInvertTintEdgeColor(color, alpha, strength) {
95
+ const edgeAlpha = Math.min(1, alpha * strength);
96
+ return [
97
+ (((color >> 16) & 0xff) / 255) * edgeAlpha,
98
+ (((color >> 8) & 0xff) / 255) * edgeAlpha,
99
+ ((color & 0xff) / 255) * edgeAlpha,
100
+ edgeAlpha,
101
+ ];
102
+ }
103
+ //# 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"}