@flighthq/effects-gl 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/dist/glBloomEffect.d.ts +4 -0
  2. package/dist/glBloomEffect.d.ts.map +1 -0
  3. package/dist/glBloomEffect.js +56 -0
  4. package/dist/glBloomEffect.js.map +1 -0
  5. package/dist/glBokehDepthOfFieldEffect.d.ts +4 -0
  6. package/dist/glBokehDepthOfFieldEffect.d.ts.map +1 -0
  7. package/dist/glBokehDepthOfFieldEffect.js +55 -0
  8. package/dist/glBokehDepthOfFieldEffect.js.map +1 -0
  9. package/dist/glBrightnessContrastEffect.d.ts +4 -0
  10. package/dist/glBrightnessContrastEffect.d.ts.map +1 -0
  11. package/dist/glBrightnessContrastEffect.js +28 -0
  12. package/dist/glBrightnessContrastEffect.js.map +1 -0
  13. package/dist/glCameraMotionBlurEffect.d.ts +4 -0
  14. package/dist/glCameraMotionBlurEffect.d.ts.map +1 -0
  15. package/dist/glCameraMotionBlurEffect.js +41 -0
  16. package/dist/glCameraMotionBlurEffect.js.map +1 -0
  17. package/dist/glChannelMixerEffect.d.ts +4 -0
  18. package/dist/glChannelMixerEffect.d.ts.map +1 -0
  19. package/dist/glChannelMixerEffect.js +30 -0
  20. package/dist/glChannelMixerEffect.js.map +1 -0
  21. package/dist/glChromaticAberrationEffect.d.ts +4 -0
  22. package/dist/glChromaticAberrationEffect.d.ts.map +1 -0
  23. package/dist/glChromaticAberrationEffect.js +36 -0
  24. package/dist/glChromaticAberrationEffect.js.map +1 -0
  25. package/dist/glColorGradeEffect.d.ts +4 -0
  26. package/dist/glColorGradeEffect.d.ts.map +1 -0
  27. package/dist/glColorGradeEffect.js +46 -0
  28. package/dist/glColorGradeEffect.js.map +1 -0
  29. package/dist/glCrtEffect.d.ts +4 -0
  30. package/dist/glCrtEffect.d.ts.map +1 -0
  31. package/dist/glCrtEffect.js +55 -0
  32. package/dist/glCrtEffect.js.map +1 -0
  33. package/dist/glCustomShaderEffect.d.ts +6 -0
  34. package/dist/glCustomShaderEffect.d.ts.map +1 -0
  35. package/dist/glCustomShaderEffect.js +87 -0
  36. package/dist/glCustomShaderEffect.js.map +1 -0
  37. package/dist/glDirectionalBlurEffect.d.ts +4 -0
  38. package/dist/glDirectionalBlurEffect.d.ts.map +1 -0
  39. package/dist/glDirectionalBlurEffect.js +44 -0
  40. package/dist/glDirectionalBlurEffect.js.map +1 -0
  41. package/dist/glDisplacementEffect.d.ts +4 -0
  42. package/dist/glDisplacementEffect.d.ts.map +1 -0
  43. package/dist/glDisplacementEffect.js +37 -0
  44. package/dist/glDisplacementEffect.js.map +1 -0
  45. package/dist/glDitherEffect.d.ts +4 -0
  46. package/dist/glDitherEffect.d.ts.map +1 -0
  47. package/dist/glDitherEffect.js +37 -0
  48. package/dist/glDitherEffect.js.map +1 -0
  49. package/dist/glEffectProgramCache.d.ts +4 -0
  50. package/dist/glEffectProgramCache.d.ts.map +1 -0
  51. package/dist/glEffectProgramCache.js +42 -0
  52. package/dist/glEffectProgramCache.js.map +1 -0
  53. package/dist/glExposureEffect.d.ts +4 -0
  54. package/dist/glExposureEffect.d.ts.map +1 -0
  55. package/dist/glExposureEffect.js +24 -0
  56. package/dist/glExposureEffect.js.map +1 -0
  57. package/dist/glFilmGrainEffect.d.ts +4 -0
  58. package/dist/glFilmGrainEffect.d.ts.map +1 -0
  59. package/dist/glFilmGrainEffect.js +36 -0
  60. package/dist/glFilmGrainEffect.js.map +1 -0
  61. package/dist/glFxaaEffect.d.ts +4 -0
  62. package/dist/glFxaaEffect.d.ts.map +1 -0
  63. package/dist/glFxaaEffect.js +61 -0
  64. package/dist/glFxaaEffect.js.map +1 -0
  65. package/dist/glGlitchEffect.d.ts +4 -0
  66. package/dist/glGlitchEffect.d.ts.map +1 -0
  67. package/dist/glGlitchEffect.js +50 -0
  68. package/dist/glGlitchEffect.js.map +1 -0
  69. package/dist/glGodRaysEffect.d.ts +4 -0
  70. package/dist/glGodRaysEffect.d.ts.map +1 -0
  71. package/dist/glGodRaysEffect.js +59 -0
  72. package/dist/glGodRaysEffect.js.map +1 -0
  73. package/dist/glGrayscaleEffect.d.ts +4 -0
  74. package/dist/glGrayscaleEffect.d.ts.map +1 -0
  75. package/dist/glGrayscaleEffect.js +25 -0
  76. package/dist/glGrayscaleEffect.js.map +1 -0
  77. package/dist/glHalftoneEffect.d.ts +4 -0
  78. package/dist/glHalftoneEffect.d.ts.map +1 -0
  79. package/dist/glHalftoneEffect.js +38 -0
  80. package/dist/glHalftoneEffect.js.map +1 -0
  81. package/dist/glHueSaturationEffect.d.ts +4 -0
  82. package/dist/glHueSaturationEffect.d.ts.map +1 -0
  83. package/dist/glHueSaturationEffect.js +67 -0
  84. package/dist/glHueSaturationEffect.js.map +1 -0
  85. package/dist/glInvertEffect.d.ts +4 -0
  86. package/dist/glInvertEffect.d.ts.map +1 -0
  87. package/dist/glInvertEffect.js +24 -0
  88. package/dist/glInvertEffect.js.map +1 -0
  89. package/dist/glKuwaharaEffect.d.ts +4 -0
  90. package/dist/glKuwaharaEffect.d.ts.map +1 -0
  91. package/dist/glKuwaharaEffect.js +61 -0
  92. package/dist/glKuwaharaEffect.js.map +1 -0
  93. package/dist/glLensDirtEffect.d.ts +4 -0
  94. package/dist/glLensDirtEffect.d.ts.map +1 -0
  95. package/dist/glLensDirtEffect.js +45 -0
  96. package/dist/glLensDirtEffect.js.map +1 -0
  97. package/dist/glLensDistortionEffect.d.ts +4 -0
  98. package/dist/glLensDistortionEffect.d.ts.map +1 -0
  99. package/dist/glLensDistortionEffect.js +34 -0
  100. package/dist/glLensDistortionEffect.js.map +1 -0
  101. package/dist/glLensFlareEffect.d.ts +4 -0
  102. package/dist/glLensFlareEffect.d.ts.map +1 -0
  103. package/dist/glLensFlareEffect.js +56 -0
  104. package/dist/glLensFlareEffect.js.map +1 -0
  105. package/dist/glLiftGammaGainEffect.d.ts +4 -0
  106. package/dist/glLiftGammaGainEffect.d.ts.map +1 -0
  107. package/dist/glLiftGammaGainEffect.js +44 -0
  108. package/dist/glLiftGammaGainEffect.js.map +1 -0
  109. package/dist/glLookupTableGradeEffect.d.ts +4 -0
  110. package/dist/glLookupTableGradeEffect.d.ts.map +1 -0
  111. package/dist/glLookupTableGradeEffect.js +28 -0
  112. package/dist/glLookupTableGradeEffect.js.map +1 -0
  113. package/dist/glMotionBlurEffect.d.ts +4 -0
  114. package/dist/glMotionBlurEffect.d.ts.map +1 -0
  115. package/dist/glMotionBlurEffect.js +61 -0
  116. package/dist/glMotionBlurEffect.js.map +1 -0
  117. package/dist/glOutlineEffect.d.ts +4 -0
  118. package/dist/glOutlineEffect.d.ts.map +1 -0
  119. package/dist/glOutlineEffect.js +49 -0
  120. package/dist/glOutlineEffect.js.map +1 -0
  121. package/dist/glPixelateEffect.d.ts +4 -0
  122. package/dist/glPixelateEffect.d.ts.map +1 -0
  123. package/dist/glPixelateEffect.js +27 -0
  124. package/dist/glPixelateEffect.js.map +1 -0
  125. package/dist/glPosterizeEffect.d.ts +4 -0
  126. package/dist/glPosterizeEffect.d.ts.map +1 -0
  127. package/dist/glPosterizeEffect.js +25 -0
  128. package/dist/glPosterizeEffect.js.map +1 -0
  129. package/dist/glRadialBlurEffect.d.ts +4 -0
  130. package/dist/glRadialBlurEffect.d.ts.map +1 -0
  131. package/dist/glRadialBlurEffect.js +43 -0
  132. package/dist/glRadialBlurEffect.js.map +1 -0
  133. package/dist/glRenderEffectPipeline.d.ts +7 -0
  134. package/dist/glRenderEffectPipeline.d.ts.map +1 -0
  135. package/dist/glRenderEffectPipeline.js +86 -0
  136. package/dist/glRenderEffectPipeline.js.map +1 -0
  137. package/dist/glRenderEffectRegistrar.d.ts +13 -0
  138. package/dist/glRenderEffectRegistrar.d.ts.map +1 -0
  139. package/dist/glRenderEffectRegistrar.js +222 -0
  140. package/dist/glRenderEffectRegistrar.js.map +1 -0
  141. package/dist/glRenderEffectRegistry.d.ts +5 -0
  142. package/dist/glRenderEffectRegistry.d.ts.map +1 -0
  143. package/dist/glRenderEffectRegistry.js +23 -0
  144. package/dist/glRenderEffectRegistry.js.map +1 -0
  145. package/dist/glScanlinesEffect.d.ts +4 -0
  146. package/dist/glScanlinesEffect.d.ts.map +1 -0
  147. package/dist/glScanlinesEffect.js +28 -0
  148. package/dist/glScanlinesEffect.js.map +1 -0
  149. package/dist/glScreenSpaceFogEffect.d.ts +4 -0
  150. package/dist/glScreenSpaceFogEffect.d.ts.map +1 -0
  151. package/dist/glScreenSpaceFogEffect.js +55 -0
  152. package/dist/glScreenSpaceFogEffect.js.map +1 -0
  153. package/dist/glSepiaEffect.d.ts +4 -0
  154. package/dist/glSepiaEffect.d.ts.map +1 -0
  155. package/dist/glSepiaEffect.js +29 -0
  156. package/dist/glSepiaEffect.js.map +1 -0
  157. package/dist/glSharpenEffect.d.ts +4 -0
  158. package/dist/glSharpenEffect.d.ts.map +1 -0
  159. package/dist/glSharpenEffect.js +33 -0
  160. package/dist/glSharpenEffect.js.map +1 -0
  161. package/dist/glSketchEffect.d.ts +4 -0
  162. package/dist/glSketchEffect.d.ts.map +1 -0
  163. package/dist/glSketchEffect.js +43 -0
  164. package/dist/glSketchEffect.js.map +1 -0
  165. package/dist/glSmaaEffect.d.ts +4 -0
  166. package/dist/glSmaaEffect.d.ts.map +1 -0
  167. package/dist/glSmaaEffect.js +48 -0
  168. package/dist/glSmaaEffect.js.map +1 -0
  169. package/dist/glSsaoEffect.d.ts +4 -0
  170. package/dist/glSsaoEffect.d.ts.map +1 -0
  171. package/dist/glSsaoEffect.js +45 -0
  172. package/dist/glSsaoEffect.js.map +1 -0
  173. package/dist/glSsrEffect.d.ts +4 -0
  174. package/dist/glSsrEffect.d.ts.map +1 -0
  175. package/dist/glSsrEffect.js +24 -0
  176. package/dist/glSsrEffect.js.map +1 -0
  177. package/dist/glTaaEffect.d.ts +4 -0
  178. package/dist/glTaaEffect.d.ts.map +1 -0
  179. package/dist/glTaaEffect.js +22 -0
  180. package/dist/glTaaEffect.js.map +1 -0
  181. package/dist/glTiltShiftEffect.d.ts +4 -0
  182. package/dist/glTiltShiftEffect.d.ts.map +1 -0
  183. package/dist/glTiltShiftEffect.js +45 -0
  184. package/dist/glTiltShiftEffect.js.map +1 -0
  185. package/dist/glToneMapEffect.d.ts +4 -0
  186. package/dist/glToneMapEffect.d.ts.map +1 -0
  187. package/dist/glToneMapEffect.js +51 -0
  188. package/dist/glToneMapEffect.js.map +1 -0
  189. package/dist/glVignetteEffect.d.ts +4 -0
  190. package/dist/glVignetteEffect.d.ts.map +1 -0
  191. package/dist/glVignetteEffect.js +42 -0
  192. package/dist/glVignetteEffect.js.map +1 -0
  193. package/dist/glWhiteBalanceEffect.d.ts +4 -0
  194. package/dist/glWhiteBalanceEffect.d.ts.map +1 -0
  195. package/dist/glWhiteBalanceEffect.js +31 -0
  196. package/dist/glWhiteBalanceEffect.js.map +1 -0
  197. package/dist/index.d.ts +50 -0
  198. package/dist/index.d.ts.map +1 -0
  199. package/dist/index.js +50 -0
  200. package/dist/index.js.map +1 -0
  201. package/package.json +41 -0
  202. package/src/glBloomEffect.test.ts +13 -0
  203. package/src/glBokehDepthOfFieldEffect.test.ts +13 -0
  204. package/src/glBrightnessContrastEffect.test.ts +16 -0
  205. package/src/glCameraMotionBlurEffect.test.ts +13 -0
  206. package/src/glChannelMixerEffect.test.ts +13 -0
  207. package/src/glChromaticAberrationEffect.test.ts +16 -0
  208. package/src/glColorGradeEffect.test.ts +13 -0
  209. package/src/glCrtEffect.test.ts +13 -0
  210. package/src/glCustomShaderEffect.test.ts +68 -0
  211. package/src/glDirectionalBlurEffect.test.ts +13 -0
  212. package/src/glDisplacementEffect.test.ts +13 -0
  213. package/src/glDitherEffect.test.ts +13 -0
  214. package/src/glEffectProgramCache.test.ts +13 -0
  215. package/src/glExposureEffect.test.ts +13 -0
  216. package/src/glFilmGrainEffect.test.ts +13 -0
  217. package/src/glFxaaEffect.test.ts +13 -0
  218. package/src/glGlitchEffect.test.ts +13 -0
  219. package/src/glGodRaysEffect.test.ts +13 -0
  220. package/src/glGrayscaleEffect.test.ts +13 -0
  221. package/src/glHalftoneEffect.test.ts +13 -0
  222. package/src/glHueSaturationEffect.test.ts +13 -0
  223. package/src/glInvertEffect.test.ts +13 -0
  224. package/src/glKuwaharaEffect.test.ts +13 -0
  225. package/src/glLensDirtEffect.test.ts +13 -0
  226. package/src/glLensDistortionEffect.test.ts +13 -0
  227. package/src/glLensFlareEffect.test.ts +13 -0
  228. package/src/glLiftGammaGainEffect.test.ts +13 -0
  229. package/src/glLookupTableGradeEffect.test.ts +13 -0
  230. package/src/glMotionBlurEffect.test.ts +13 -0
  231. package/src/glOutlineEffect.test.ts +13 -0
  232. package/src/glPixelateEffect.test.ts +13 -0
  233. package/src/glPosterizeEffect.test.ts +13 -0
  234. package/src/glRadialBlurEffect.test.ts +13 -0
  235. package/src/glRenderEffectPipeline.test.ts +37 -0
  236. package/src/glRenderEffectRegistrar.test.ts +187 -0
  237. package/src/glRenderEffectRegistry.test.ts +52 -0
  238. package/src/glScanlinesEffect.test.ts +13 -0
  239. package/src/glScreenSpaceFogEffect.test.ts +13 -0
  240. package/src/glSepiaEffect.test.ts +13 -0
  241. package/src/glSharpenEffect.test.ts +13 -0
  242. package/src/glSketchEffect.test.ts +13 -0
  243. package/src/glSmaaEffect.test.ts +13 -0
  244. package/src/glSsaoEffect.test.ts +13 -0
  245. package/src/glSsrEffect.test.ts +13 -0
  246. package/src/glTaaEffect.test.ts +13 -0
  247. package/src/glTiltShiftEffect.test.ts +13 -0
  248. package/src/glToneMapEffect.test.ts +13 -0
  249. package/src/glVignetteEffect.test.ts +13 -0
  250. package/src/glWhiteBalanceEffect.test.ts +13 -0
@@ -0,0 +1,4 @@
1
+ import type { BloomEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget, GlRenderTargetPool } from '@flighthq/types';
2
+ export declare function applyBloomEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, pool: GlRenderTargetPool, effect: Readonly<BloomEffect>): void;
3
+ export declare const defaultGlBloomEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glBloomEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glBloomEffect.d.ts","sourceRoot":"","sources":["../src/glBloomEffect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAOzB,wBAAgB,oBAAoB,CAClC,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,WAAW,CAAC,GAC5B,IAAI,CAyBN;AAED,eAAO,MAAM,0BAA0B,EAAE,oBAExC,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { computeBloomBlurRadius, computeBloomIntensity, computeBloomThreshold } from '@flighthq/effects';
2
+ import { applyGaussianBlurFilterToGl } from '@flighthq/filters-gl';
3
+ import { acquireGlRenderTarget, drawGlFullscreenPass, releaseGlRenderTarget } from '@flighthq/render-gl';
4
+ import { getGlEffectProgram } from './glEffectProgramCache';
5
+ // Bloom: bright-pass → blur the bright branch (reusing the Tier-1 gaussian blur filter) → additively
6
+ // composite back. The multi-pass reference recipe — it acquires intermediate targets from the pool
7
+ // and releases them, branches, and reuses a filter, which is what makes it an effect and not a filter.
8
+ export function applyBloomEffectToGl(state, source, dest, pool, effect) {
9
+ const threshold = computeBloomThreshold(effect);
10
+ const intensity = computeBloomIntensity(effect);
11
+ const radius = computeBloomBlurRadius(effect);
12
+ const descriptor = { width: source.width, height: source.height, format: source.format };
13
+ const bright = acquireGlRenderTarget(state, pool, descriptor);
14
+ const blurred = acquireGlRenderTarget(state, pool, descriptor);
15
+ const temp = acquireGlRenderTarget(state, pool, descriptor);
16
+ const brightProgram = getGlEffectProgram(state, 'bloom.bright', BLOOM_BRIGHT_FRAGMENT_SRC);
17
+ drawGlFullscreenPass(state, brightProgram, [source.texture], bright, (gl, program) => {
18
+ gl.uniform1f(gl.getUniformLocation(program.program, 'u_threshold'), threshold);
19
+ });
20
+ applyGaussianBlurFilterToGl(state, bright, blurred, temp, { blurX: radius, blurY: radius });
21
+ const compositeProgram = getGlEffectProgram(state, 'bloom.composite', BLOOM_COMPOSITE_FRAGMENT_SRC);
22
+ drawGlFullscreenPass(state, compositeProgram, [source.texture, blurred.texture], dest, (gl, program) => {
23
+ gl.uniform1f(gl.getUniformLocation(program.program, 'u_intensity'), intensity);
24
+ });
25
+ releaseGlRenderTarget(pool, bright);
26
+ releaseGlRenderTarget(pool, blurred);
27
+ releaseGlRenderTarget(pool, temp);
28
+ }
29
+ export const defaultGlBloomEffectRunner = (ctx, effect) => {
30
+ applyBloomEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.pool, effect);
31
+ };
32
+ const BLOOM_BRIGHT_FRAGMENT_SRC = `#version 300 es
33
+ precision highp float;
34
+ in vec2 v_texCoord;
35
+ uniform sampler2D u_texture0;
36
+ uniform float u_threshold;
37
+ out vec4 o_color;
38
+ void main() {
39
+ vec4 c = texture(u_texture0, v_texCoord);
40
+ float l = dot(c.rgb, vec3(0.2126, 0.7152, 0.0722));
41
+ float k = step(u_threshold, l);
42
+ o_color = vec4(c.rgb * k, c.a);
43
+ }`;
44
+ const BLOOM_COMPOSITE_FRAGMENT_SRC = `#version 300 es
45
+ precision highp float;
46
+ in vec2 v_texCoord;
47
+ uniform sampler2D u_texture0;
48
+ uniform sampler2D u_texture1;
49
+ uniform float u_intensity;
50
+ out vec4 o_color;
51
+ void main() {
52
+ vec4 scene = texture(u_texture0, v_texCoord);
53
+ vec4 bloom = texture(u_texture1, v_texCoord);
54
+ o_color = vec4(scene.rgb + bloom.rgb * u_intensity, scene.a);
55
+ }`;
56
+ //# sourceMappingURL=glBloomEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glBloomEffect.js","sourceRoot":"","sources":["../src/glBloomEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AASzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,qGAAqG;AACrG,mGAAmG;AACnG,uGAAuG;AACvG,MAAM,UAAU,oBAAoB,CAClC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,IAAwB,EACxB,MAA6B;IAE7B,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAEzF,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAE5D,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,yBAAyB,CAAC,CAAC;IAC3F,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;QACnF,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5F,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,4BAA4B,CAAC,CAAC;IACpG,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;QACrG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC9E,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAqB,CAAC,CAAC;AACzF,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG;;;;;;;;;;;EAWhC,CAAC;AAEH,MAAM,4BAA4B,GAAG;;;;;;;;;;;EAWnC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { BokehDepthOfFieldEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyBokehDepthOfFieldEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, depthTexture: WebGLTexture | null, effect: Readonly<BokehDepthOfFieldEffect>): void;
3
+ export declare const defaultGlBokehDepthOfFieldEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glBokehDepthOfFieldEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glBokehDepthOfFieldEffect.d.ts","sourceRoot":"","sources":["../src/glBokehDepthOfFieldEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAQpH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,MAAM,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GACxC,IAAI,CAaN;AAED,eAAO,MAAM,sCAAsC,EAAE,oBAQpD,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Bokeh depth-of-field: a disc-shaped blur. When the scene supplied a sampleable depth texture
4
+ // (ctx.sceneDepthTexture), it computes a per-pixel circle of confusion from focusDistance/focusRange and
5
+ // scales the disc radius by it (the real DoF). When depth is absent it falls back to a uniform disc blur
6
+ // of radius maxBlur. The second real consumer of the depth seam, alongside screen-space fog.
7
+ export function applyBokehDepthOfFieldEffectToGl(state, source, dest, depthTexture, effect) {
8
+ const maxBlur = effect.maxBlur ?? 4;
9
+ const focusDistance = effect.focusDistance ?? 0.5;
10
+ const focusRange = effect.focusRange ?? 0.2;
11
+ const program = getGlEffectProgram(state, 'lens.bokehDoF', BOKEH_DOF_FRAGMENT_SRC);
12
+ const inputs = depthTexture ? [source.texture, depthTexture] : [source.texture];
13
+ drawGlFullscreenPass(state, program, inputs, dest, (gl, p) => {
14
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_maxBlur'), maxBlur);
15
+ gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
16
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_focusDistance'), focusDistance);
17
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_focusRange'), focusRange);
18
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_hasDepth'), depthTexture ? 1 : 0);
19
+ });
20
+ }
21
+ export const defaultGlBokehDepthOfFieldEffectRunner = (ctx, effect) => {
22
+ applyBokehDepthOfFieldEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.sceneDepthTexture, effect);
23
+ };
24
+ const BOKEH_DOF_FRAGMENT_SRC = `#version 300 es
25
+ precision highp float;
26
+ in vec2 v_texCoord;
27
+ uniform sampler2D u_texture0;
28
+ uniform sampler2D u_texture1;
29
+ uniform float u_maxBlur;
30
+ uniform vec2 u_resolution;
31
+ uniform float u_focusDistance;
32
+ uniform float u_focusRange;
33
+ uniform float u_hasDepth;
34
+ out vec4 o_color;
35
+ void main() {
36
+ vec2 texel = 1.0 / u_resolution;
37
+ // Circle of confusion: with depth, blur scales by distance from the focus plane; without, full blur.
38
+ float coc = 1.0;
39
+ if (u_hasDepth > 0.5) {
40
+ float depth = texture(u_texture1, v_texCoord).r;
41
+ coc = clamp(abs(depth - u_focusDistance) / max(u_focusRange, 1e-4), 0.0, 1.0);
42
+ }
43
+ float blur = u_maxBlur * coc;
44
+ vec4 sum = vec4(0.0);
45
+ float total = 0.0;
46
+ for (int i = 0; i < 16; i++) {
47
+ float a = float(i) * 0.39269908; // golden-ish angular step over the disc
48
+ float r = (float(i % 4) + 1.0) * 0.25;
49
+ vec2 offset = vec2(cos(a), sin(a)) * r * blur * texel;
50
+ sum += texture(u_texture0, v_texCoord + offset);
51
+ total += 1.0;
52
+ }
53
+ o_color = sum / total;
54
+ }`;
55
+ //# sourceMappingURL=glBokehDepthOfFieldEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glBokehDepthOfFieldEffect.js","sourceRoot":"","sources":["../src/glBokehDepthOfFieldEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,+FAA+F;AAC/F,yGAAyG;AACzG,yGAAyG;AACzG,6FAA6F;AAC7F,MAAM,UAAU,gCAAgC,CAC9C,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,YAAiC,EACjC,MAAyC;IAEzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IACpC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;IAC5C,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,sBAAsB,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QAC3D,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5F,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,aAAa,CAAC,CAAC;QACjF,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3E,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,sCAAsC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC1F,gCAAgC,CAC9B,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,iBAAiB,EACrB,MAAiC,CAClC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8B7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { BrightnessContrastEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyBrightnessContrastEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<BrightnessContrastEffect>): void;
3
+ export declare const defaultGlBrightnessContrastEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glBrightnessContrastEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glBrightnessContrastEffect.d.ts","sourceRoot":"","sources":["../src/glBrightnessContrastEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKrH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,wBAAwB,CAAC,GACzC,IAAI,CAQN;AAED,eAAO,MAAM,uCAAuC,EAAE,oBAErD,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Brightness/contrast: shift then scale about mid-grey.
4
+ export function applyBrightnessContrastEffectToGl(state, source, dest, effect) {
5
+ const brightness = effect.brightness ?? 0;
6
+ const contrast = effect.contrast ?? 1;
7
+ const program = getGlEffectProgram(state, 'colorGrade.brightnessContrast', BRIGHTNESS_CONTRAST_FRAGMENT_SRC);
8
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
9
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_brightness'), brightness);
10
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_contrast'), contrast);
11
+ });
12
+ }
13
+ export const defaultGlBrightnessContrastEffectRunner = (ctx, effect) => {
14
+ applyBrightnessContrastEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
15
+ };
16
+ const BRIGHTNESS_CONTRAST_FRAGMENT_SRC = `#version 300 es
17
+ precision highp float;
18
+ in vec2 v_texCoord;
19
+ uniform sampler2D u_texture0;
20
+ uniform float u_brightness;
21
+ uniform float u_contrast;
22
+ out vec4 o_color;
23
+ void main() {
24
+ vec4 c = texture(u_texture0, v_texCoord);
25
+ vec3 rgb = (c.rgb + u_brightness - 0.5) * u_contrast + 0.5;
26
+ o_color = vec4(clamp(rgb, 0.0, 1.0), c.a);
27
+ }`;
28
+ //# sourceMappingURL=glBrightnessContrastEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glBrightnessContrastEffect.js","sourceRoot":"","sources":["../src/glBrightnessContrastEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,wDAAwD;AACxD,MAAM,UAAU,iCAAiC,CAC/C,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA0C;IAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,+BAA+B,EAAE,gCAAgC,CAAC,CAAC;IAC7G,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,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3E,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,uCAAuC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC3F,iCAAiC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAkC,CAAC,CAAC;AACzG,CAAC,CAAC;AAEF,MAAM,gCAAgC,GAAG;;;;;;;;;;;EAWvC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CameraMotionBlurEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyCameraMotionBlurEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<CameraMotionBlurEffect>): void;
3
+ export declare const defaultGlCameraMotionBlurEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glCameraMotionBlurEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glCameraMotionBlurEffect.d.ts","sourceRoot":"","sources":["../src/glCameraMotionBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAQnH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACvC,IAAI,CAQN;AAED,eAAO,MAAM,qCAAqC,EAAE,oBAEnD,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Camera motion blur: a real single-pass radial/zoom blur scaled by intensity — smears each sample
4
+ // toward the screen center. A legitimate 2D effect on its own. Two richer variants are 2D-native
5
+ // follow-ups, not 3D-gated: feeding the actual camera/root transform delta as the smear vector (global
6
+ // velocity), and per-object motion blur reading ctx.sceneVelocityTexture (per-node prev-transform delta).
7
+ export function applyCameraMotionBlurEffectToGl(state, source, dest, effect) {
8
+ const intensity = effect.intensity ?? 0.5;
9
+ const samples = effect.samples ?? 16;
10
+ const program = getGlEffectProgram(state, 'cameraMotionBlur', CAMERA_MOTION_BLUR_FRAGMENT_SRC);
11
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
12
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
13
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_samples'), samples);
14
+ });
15
+ }
16
+ export const defaultGlCameraMotionBlurEffectRunner = (ctx, effect) => {
17
+ applyCameraMotionBlurEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
18
+ };
19
+ const CAMERA_MOTION_BLUR_FRAGMENT_SRC = `#version 300 es
20
+ precision highp float;
21
+ in vec2 v_texCoord;
22
+ uniform sampler2D u_texture0;
23
+ uniform float u_intensity;
24
+ uniform float u_samples;
25
+ out vec4 o_color;
26
+ const int SAMPLES = 16;
27
+ void main() {
28
+ vec2 toCenter = vec2(0.5) - v_texCoord;
29
+ float count = min(u_samples, 16.0);
30
+ vec4 sum = vec4(0.0);
31
+ float taken = 0.0;
32
+ for (int i = 0; i < SAMPLES; i++) {
33
+ if (float(i) >= count) break;
34
+ float t = count > 1.0 ? float(i) / (count - 1.0) : 0.0;
35
+ vec2 uv = v_texCoord + toCenter * (t * u_intensity);
36
+ sum += texture(u_texture0, uv);
37
+ taken += 1.0;
38
+ }
39
+ o_color = sum / max(taken, 1.0);
40
+ }`;
41
+ //# sourceMappingURL=glCameraMotionBlurEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glCameraMotionBlurEffect.js","sourceRoot":"","sources":["../src/glCameraMotionBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,mGAAmG;AACnG,iGAAiG;AACjG,uGAAuG;AACvG,0GAA0G;AAC1G,MAAM,UAAU,+BAA+B,CAC7C,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAwC;IAExC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,+BAA+B,CAAC,CAAC;IAC/F,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,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,qCAAqC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACzF,+BAA+B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAgC,CAAC,CAAC;AACrG,CAAC,CAAC;AAEF,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;EAqBtC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ChannelMixerEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyChannelMixerEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<ChannelMixerEffect>): void;
3
+ export declare const defaultGlChannelMixerEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glChannelMixerEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glChannelMixerEffect.d.ts","sourceRoot":"","sources":["../src/glChannelMixerEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAK/G,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACnC,IAAI,CAON;AAED,eAAO,MAAM,iCAAiC,EAAE,oBAE/C,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Channel mixer: apply a 3x4 row-major RGB->RGB matrix plus per-row offset, uploaded as 12 floats.
4
+ export function applyChannelMixerEffectToGl(state, source, dest, effect) {
5
+ const matrix = new Float32Array(12);
6
+ for (let i = 0; i < 12; i++)
7
+ matrix[i] = effect.matrix[i] ?? IDENTITY_CHANNEL_MIXER[i];
8
+ const program = getGlEffectProgram(state, 'colorGrade.channelMixer', CHANNEL_MIXER_FRAGMENT_SRC);
9
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
10
+ gl.uniform1fv(gl.getUniformLocation(p.program, 'u_matrix'), matrix);
11
+ });
12
+ }
13
+ export const defaultGlChannelMixerEffectRunner = (ctx, effect) => {
14
+ applyChannelMixerEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
15
+ };
16
+ const IDENTITY_CHANNEL_MIXER = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0];
17
+ const CHANNEL_MIXER_FRAGMENT_SRC = `#version 300 es
18
+ precision highp float;
19
+ in vec2 v_texCoord;
20
+ uniform sampler2D u_texture0;
21
+ uniform float u_matrix[12];
22
+ out vec4 o_color;
23
+ void main() {
24
+ vec4 c = texture(u_texture0, v_texCoord);
25
+ float r = u_matrix[0] * c.r + u_matrix[1] * c.g + u_matrix[2] * c.b + u_matrix[3];
26
+ float g = u_matrix[4] * c.r + u_matrix[5] * c.g + u_matrix[6] * c.b + u_matrix[7];
27
+ float b = u_matrix[8] * c.r + u_matrix[9] * c.g + u_matrix[10] * c.b + u_matrix[11];
28
+ o_color = vec4(clamp(vec3(r, g, b), 0.0, 1.0), c.a);
29
+ }`;
30
+ //# sourceMappingURL=glChannelMixerEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glChannelMixerEffect.js","sourceRoot":"","sources":["../src/glChannelMixerEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,mGAAmG;AACnG,MAAM,UAAU,2BAA2B,CACzC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAoC;IAEpC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,yBAAyB,EAAE,0BAA0B,CAAC,CAAC;IACjG,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,iCAAiC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,2BAA2B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA4B,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEvF,MAAM,0BAA0B,GAAG;;;;;;;;;;;;EAYjC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ChromaticAberrationEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyChromaticAberrationEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<ChromaticAberrationEffect>): void;
3
+ export declare const defaultGlChromaticAberrationEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glChromaticAberrationEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glChromaticAberrationEffect.d.ts","sourceRoot":"","sources":["../src/glChromaticAberrationEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOtH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAC1C,IAAI,CAQN;AAED,eAAO,MAAM,wCAAwC,EAAE,oBAEtD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Chromatic aberration: sample the R/G/B channels at progressively larger offsets so colors fringe
4
+ // apart. When radial, the offset scales with distance from the optical center (true lens behavior);
5
+ // otherwise it is a uniform horizontal split.
6
+ export function applyChromaticAberrationEffectToGl(state, source, dest, effect) {
7
+ const intensity = effect.intensity ?? 0.005;
8
+ const radial = effect.radial ?? true;
9
+ const program = getGlEffectProgram(state, 'lens.chromaticAberration', CHROMATIC_ABERRATION_FRAGMENT_SRC);
10
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
11
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
12
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_radial'), radial ? 1 : 0);
13
+ });
14
+ }
15
+ export const defaultGlChromaticAberrationEffectRunner = (ctx, effect) => {
16
+ applyChromaticAberrationEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
17
+ };
18
+ const CHROMATIC_ABERRATION_FRAGMENT_SRC = `#version 300 es
19
+ precision highp float;
20
+ in vec2 v_texCoord;
21
+ uniform sampler2D u_texture0;
22
+ uniform float u_intensity;
23
+ uniform float u_radial;
24
+ out vec4 o_color;
25
+ void main() {
26
+ vec2 centered = v_texCoord - 0.5;
27
+ float scale = mix(1.0, length(centered) * 2.0, u_radial);
28
+ vec2 dir = mix(vec2(1.0, 0.0), normalize(centered + vec2(1e-5)), u_radial);
29
+ vec2 offset = dir * u_intensity * scale;
30
+ float r = texture(u_texture0, v_texCoord + offset).r;
31
+ float g = texture(u_texture0, v_texCoord).g;
32
+ float b = texture(u_texture0, v_texCoord - offset).b;
33
+ float a = texture(u_texture0, v_texCoord).a;
34
+ o_color = vec4(r, g, b, a);
35
+ }`;
36
+ //# sourceMappingURL=glChromaticAberrationEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glChromaticAberrationEffect.js","sourceRoot":"","sources":["../src/glChromaticAberrationEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,mGAAmG;AACnG,oGAAoG;AACpG,8CAA8C;AAC9C,MAAM,UAAU,kCAAkC,CAChD,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA2C;IAE3C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,iCAAiC,CAAC,CAAC;IACzG,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,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,wCAAwC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5F,kCAAkC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmC,CAAC,CAAC;AAC3G,CAAC,CAAC;AAEF,MAAM,iCAAiC,GAAG;;;;;;;;;;;;;;;;;EAiBxC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ColorGradeEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyColorGradeEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<ColorGradeEffect>): void;
3
+ export declare const defaultGlColorGradeEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glColorGradeEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glColorGradeEffect.d.ts","sourceRoot":"","sources":["../src/glColorGradeEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAK7G,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CAgBN;AAED,eAAO,MAAM,+BAA+B,EAAE,oBAE7C,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Color grade: combined exposure, brightness, contrast, saturation, and temperature/tint shift.
4
+ export function applyColorGradeEffectToGl(state, source, dest, effect) {
5
+ const exposure = effect.exposure ?? 0;
6
+ const contrast = effect.contrast ?? 1;
7
+ const saturation = effect.saturation ?? 1;
8
+ const temperature = effect.temperature ?? 0;
9
+ const tint = effect.tint ?? 0;
10
+ const brightness = effect.brightness ?? 0;
11
+ const program = getGlEffectProgram(state, 'colorGrade.colorGrade', COLOR_GRADE_FRAGMENT_SRC);
12
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
13
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_exposure'), Math.pow(2, exposure));
14
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_contrast'), contrast);
15
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_saturation'), saturation);
16
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_temperature'), temperature);
17
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_tint'), tint);
18
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_brightness'), brightness);
19
+ });
20
+ }
21
+ export const defaultGlColorGradeEffectRunner = (ctx, effect) => {
22
+ applyColorGradeEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
23
+ };
24
+ const COLOR_GRADE_FRAGMENT_SRC = `#version 300 es
25
+ precision highp float;
26
+ in vec2 v_texCoord;
27
+ uniform sampler2D u_texture0;
28
+ uniform float u_exposure;
29
+ uniform float u_contrast;
30
+ uniform float u_saturation;
31
+ uniform float u_temperature;
32
+ uniform float u_tint;
33
+ uniform float u_brightness;
34
+ out vec4 o_color;
35
+ void main() {
36
+ vec4 c = texture(u_texture0, v_texCoord);
37
+ vec3 rgb = c.rgb * u_exposure + u_brightness;
38
+ rgb.r += u_temperature * 0.5;
39
+ rgb.b -= u_temperature * 0.5;
40
+ rgb.g += u_tint * 0.5;
41
+ float l = dot(rgb, vec3(0.2126, 0.7152, 0.0722));
42
+ rgb = mix(vec3(l), rgb, u_saturation);
43
+ rgb = (rgb - 0.5) * u_contrast + 0.5;
44
+ o_color = vec4(clamp(rgb, 0.0, 1.0), c.a);
45
+ }`;
46
+ //# sourceMappingURL=glColorGradeEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glColorGradeEffect.js","sourceRoot":"","sources":["../src/glColorGradeEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,gGAAgG;AAChG,MAAM,UAAU,yBAAyB,CACvC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAkC;IAElC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,CAAC,CAAC;IAC7F,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,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3E,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,WAAW,CAAC,CAAC;QAC7E,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/D,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA0B,CAAC,CAAC;AACzF,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;EAqB/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CrtEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyCrtEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<CrtEffect>): void;
3
+ export declare const defaultGlCrtEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glCrtEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glCrtEffect.d.ts","sourceRoot":"","sources":["../src/glCrtEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtG,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC1B,IAAI,CAaN;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAEtC,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // CRT: barrel-distort the uv (curvature), darken alternating scanlines, vignette the edges, and split
4
+ // the channels outward (chromatic aberration) for a tube-monitor look.
5
+ export function applyCrtEffectToGl(state, source, dest, effect) {
6
+ const curvature = effect.curvature ?? 0.1;
7
+ const scanlineIntensity = effect.scanlineIntensity ?? 0.3;
8
+ const vignette = effect.vignette ?? 0.3;
9
+ const aberration = effect.aberration ?? 0.005;
10
+ const program = getGlEffectProgram(state, 'stylization.crt', CRT_FRAGMENT_SRC);
11
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
12
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_curvature'), curvature);
13
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_scanlineIntensity'), scanlineIntensity);
14
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_vignette'), vignette);
15
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_aberration'), aberration);
16
+ gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
17
+ });
18
+ }
19
+ export const defaultGlCrtEffectRunner = (ctx, effect) => {
20
+ applyCrtEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
21
+ };
22
+ const CRT_FRAGMENT_SRC = `#version 300 es
23
+ precision highp float;
24
+ in vec2 v_texCoord;
25
+ uniform sampler2D u_texture0;
26
+ uniform float u_curvature;
27
+ uniform float u_scanlineIntensity;
28
+ uniform float u_vignette;
29
+ uniform float u_aberration;
30
+ uniform vec2 u_resolution;
31
+ out vec4 o_color;
32
+ vec2 barrel(vec2 uv) {
33
+ vec2 c = uv * 2.0 - 1.0;
34
+ c += c * u_curvature * dot(c, c);
35
+ return c * 0.5 + 0.5;
36
+ }
37
+ void main() {
38
+ vec2 uv = barrel(v_texCoord);
39
+ if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
40
+ o_color = vec4(0.0, 0.0, 0.0, 1.0);
41
+ return;
42
+ }
43
+ vec2 off = vec2(u_aberration, 0.0);
44
+ float r = texture(u_texture0, uv + off).r;
45
+ float g = texture(u_texture0, uv).g;
46
+ float b = texture(u_texture0, uv - off).b;
47
+ float a = texture(u_texture0, uv).a;
48
+ vec3 col = vec3(r, g, b);
49
+ float line = sin(uv.y * u_resolution.y * 3.14159265) * 0.5 + 0.5;
50
+ col *= 1.0 - u_scanlineIntensity * (1.0 - line);
51
+ vec2 vc = uv * 2.0 - 1.0;
52
+ col *= 1.0 - u_vignette * dot(vc, vc);
53
+ o_color = vec4(col, a);
54
+ }`;
55
+ //# sourceMappingURL=glCrtEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glCrtEffect.js","sourceRoot":"","sources":["../src/glCrtEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,sGAAsG;AACtG,uEAAuE;AACvE,MAAM,UAAU,kBAAkB,CAChC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA2B;IAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IAC9C,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC/E,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACzF,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3E,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5E,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCvB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CustomShaderEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyCustomShaderEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<CustomShaderEffect>): void;
3
+ export declare const defaultGlCustomShaderEffectRunner: GlRenderEffectRunner;
4
+ export declare function getGlCustomShaderSource(state: GlRenderState, shaderKey: string): string | null;
5
+ export declare function registerGlCustomShaderSource(state: GlRenderState, shaderKey: string, fragmentSource: string): void;
6
+ //# sourceMappingURL=glCustomShaderEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glCustomShaderEffect.d.ts","sourceRoot":"","sources":["../src/glCustomShaderEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAU/G,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACnC,IAAI,CA0CN;AAED,eAAO,MAAM,iCAAiC,EAAE,oBAE/C,CAAC;AAKF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE9F;AASD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAOlH"}
@@ -0,0 +1,87 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram, getGlEffectUniformLocation } from './glEffectProgramCache';
3
+ // Runs a user-authored fragment shader as a fullscreen post-process pass. The descriptor carries a
4
+ // `shaderKey` — a reference into the per-state custom-shader registry populated by
5
+ // registerGlCustomShaderSource — plus a flat `uniforms` bag. The referenced fragment source reads the
6
+ // input as `u_texture0` and writes `o_color`, matching the built-in effect shaders. If the key is
7
+ // unregistered the pass copies the input through unchanged, so a missing shader degrades to identity
8
+ // rather than a blank or a GL error.
9
+ export function applyCustomShaderEffectToGl(state, source, dest, effect) {
10
+ const fragmentSource = getGlCustomShaderSource(state, effect.shaderKey);
11
+ if (fragmentSource === null) {
12
+ const passthrough = getGlEffectProgram(state, 'custom.passthrough', PASSTHROUGH_FRAGMENT_SRC);
13
+ drawGlFullscreenPass(state, passthrough, [source.texture], dest, NO_UNIFORMS);
14
+ return;
15
+ }
16
+ const program = getGlEffectProgram(state, 'custom.' + effect.shaderKey, fragmentSource);
17
+ const uniforms = effect.uniforms;
18
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
19
+ if (uniforms === undefined)
20
+ return;
21
+ for (const name of Object.keys(uniforms)) {
22
+ const location = getGlEffectUniformLocation(state, p, name);
23
+ if (location === null)
24
+ continue;
25
+ const value = uniforms[name];
26
+ if (typeof value === 'number') {
27
+ gl.uniform1f(location, value);
28
+ continue;
29
+ }
30
+ // Vector uniforms by component count; any other length uploads as a float array (float[]).
31
+ // Matrix uniforms are intentionally out of scope for this dynamic path — a mat3/mat4 needs a
32
+ // uniformMatrix upload, so author a dedicated effect for those rather than passing 9/16 floats.
33
+ switch (value.length) {
34
+ case 1:
35
+ gl.uniform1f(location, value[0]);
36
+ break;
37
+ case 2:
38
+ gl.uniform2fv(location, value);
39
+ break;
40
+ case 3:
41
+ gl.uniform3fv(location, value);
42
+ break;
43
+ case 4:
44
+ gl.uniform4fv(location, value);
45
+ break;
46
+ default:
47
+ gl.uniform1fv(location, value);
48
+ break;
49
+ }
50
+ }
51
+ });
52
+ }
53
+ export const defaultGlCustomShaderEffectRunner = (ctx, effect) => {
54
+ applyCustomShaderEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
55
+ };
56
+ // Returns the fragment source registered under `shaderKey` for this state, or null when none is
57
+ // registered. Doubles as the introspection query for the identity-passthrough fallback in
58
+ // applyCustomShaderEffectToGl.
59
+ export function getGlCustomShaderSource(state, shaderKey) {
60
+ return _customShaders.get(state)?.get(shaderKey) ?? null;
61
+ }
62
+ // Registers a fragment shader source under `shaderKey` for this state, so a CustomShaderEffect naming
63
+ // that key runs it. The source is a complete WebGL2 fragment shader: it declares `uniform sampler2D
64
+ // u_texture0;` for the input, reads texcoords from `in vec2 v_texCoord;`, writes `out vec4 o_color;`,
65
+ // and may declare any float/vec uniforms it wants supplied through the effect's `uniforms` bag.
66
+ // Last write wins for the source lookup, but the compiled program is cached by the shaderKey, so
67
+ // re-registering a *different* source under the same key keeps running the already-compiled program.
68
+ // Register edited source under a new key (and point the effect at it) to force a recompile.
69
+ export function registerGlCustomShaderSource(state, shaderKey, fragmentSource) {
70
+ let registry = _customShaders.get(state);
71
+ if (registry === undefined) {
72
+ registry = new Map();
73
+ _customShaders.set(state, registry);
74
+ }
75
+ registry.set(shaderKey, fragmentSource);
76
+ }
77
+ const NO_UNIFORMS = () => { };
78
+ const PASSTHROUGH_FRAGMENT_SRC = `#version 300 es
79
+ precision highp float;
80
+ in vec2 v_texCoord;
81
+ uniform sampler2D u_texture0;
82
+ out vec4 o_color;
83
+ void main() {
84
+ o_color = texture(u_texture0, v_texCoord);
85
+ }`;
86
+ const _customShaders = new WeakMap();
87
+ //# sourceMappingURL=glCustomShaderEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glCustomShaderEffect.js","sourceRoot":"","sources":["../src/glCustomShaderEffect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DirectionalBlurEffect, GlRenderEffectRunner, GlRenderState, GlRenderTarget } from '@flighthq/types';
2
+ export declare function applyDirectionalBlurEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<DirectionalBlurEffect>): void;
3
+ export declare const defaultGlDirectionalBlurEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glDirectionalBlurEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glDirectionalBlurEffect.d.ts","sourceRoot":"","sources":["../src/glDirectionalBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMlH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACtC,IAAI,CAWN;AAED,eAAO,MAAM,oCAAoC,EAAE,oBAElD,CAAC"}