@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,28 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Scanlines: darken by a vertical sine band; `count` sets the line density, `intensity` the darkening.
4
+ export function applyScanlinesEffectToGl(state, source, dest, effect) {
5
+ const count = effect.count ?? 240;
6
+ const intensity = effect.intensity ?? 0.3;
7
+ const program = getGlEffectProgram(state, 'stylization.scanlines', SCANLINES_FRAGMENT_SRC);
8
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
9
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_count'), count);
10
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
11
+ });
12
+ }
13
+ export const defaultGlScanlinesEffectRunner = (ctx, effect) => {
14
+ applyScanlinesEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
15
+ };
16
+ const SCANLINES_FRAGMENT_SRC = `#version 300 es
17
+ precision highp float;
18
+ in vec2 v_texCoord;
19
+ uniform sampler2D u_texture0;
20
+ uniform float u_count;
21
+ uniform float u_intensity;
22
+ out vec4 o_color;
23
+ void main() {
24
+ vec4 c = texture(u_texture0, v_texCoord);
25
+ float line = sin(v_texCoord.y * u_count * 3.14159265) * 0.5 + 0.5;
26
+ o_color = vec4(c.rgb * (1.0 - u_intensity * (1.0 - line)), c.a);
27
+ }`;
28
+ //# sourceMappingURL=glScanlinesEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glScanlinesEffect.js","sourceRoot":"","sources":["../src/glScanlinesEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,uGAAuG;AACvG,MAAM,UAAU,wBAAwB,CACtC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAiC;IAEjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;IAC3F,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,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QACjE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAClF,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG;;;;;;;;;;;EAW7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, ScreenSpaceFogEffect } from '@flighthq/types';
2
+ export declare function applyScreenSpaceFogEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, depthTexture: WebGLTexture | null, effect: Readonly<ScreenSpaceFogEffect>): void;
3
+ export declare const defaultGlScreenSpaceFogEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glScreenSpaceFogEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glScreenSpaceFogEffect.d.ts","sourceRoot":"","sources":["../src/glScreenSpaceFogEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAUjH,wBAAgB,6BAA6B,CAC3C,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,oBAAoB,CAAC,GACrC,IAAI,CAiBN;AAED,eAAO,MAAM,mCAAmC,EAAE,oBAEjD,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Screen-space fog: blends the scene toward an unpacked fog color by distance. When the scene supplied a
4
+ // sampleable DEPTH texture (`depthTexture`), this is the real recipe — fog factor = 1 - exp(-density *
5
+ // depth) over the [near, far] window, read per fragment. When depth is absent (a flat 2D scene that did
6
+ // not write depth), it falls back to the screen-Y gradient as a depth proxy (bottom of frame reads as
7
+ // "far"). color is a packed RGBA int unpacked to 0..1 floats on the JS side. Demonstrates the
8
+ // ctx.sceneDepthTexture seam: real depth path when present, sentinel proxy when null.
9
+ export function applyScreenSpaceFogEffectToGl(state, source, dest, depthTexture, effect) {
10
+ const packed = effect.color ?? 0xc8d2dcff;
11
+ const r = ((packed >>> 24) & 0xff) / 255;
12
+ const g = ((packed >>> 16) & 0xff) / 255;
13
+ const b = ((packed >>> 8) & 0xff) / 255;
14
+ const density = effect.density ?? 1;
15
+ const near = effect.near ?? 0;
16
+ const far = effect.far ?? 1;
17
+ const program = getGlEffectProgram(state, 'atmospheric.screenSpaceFog', SCREEN_SPACE_FOG_FRAGMENT_SRC);
18
+ const inputs = depthTexture ? [source.texture, depthTexture] : [source.texture];
19
+ drawGlFullscreenPass(state, program, inputs, dest, (gl, p) => {
20
+ gl.uniform3f(gl.getUniformLocation(p.program, 'u_fogColor'), r, g, b);
21
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_density'), density);
22
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_near'), near);
23
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_far'), far);
24
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_hasDepth'), depthTexture ? 1 : 0);
25
+ });
26
+ }
27
+ export const defaultGlScreenSpaceFogEffectRunner = (ctx, effect) => {
28
+ applyScreenSpaceFogEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.sceneDepthTexture, effect);
29
+ };
30
+ const SCREEN_SPACE_FOG_FRAGMENT_SRC = `#version 300 es
31
+ precision highp float;
32
+ in vec2 v_texCoord;
33
+ uniform sampler2D u_texture0;
34
+ uniform sampler2D u_texture1;
35
+ uniform vec3 u_fogColor;
36
+ uniform float u_density;
37
+ uniform float u_near;
38
+ uniform float u_far;
39
+ uniform float u_hasDepth;
40
+ out vec4 o_color;
41
+ void main() {
42
+ vec4 c = texture(u_texture0, v_texCoord);
43
+ float fog;
44
+ if (u_hasDepth > 0.5) {
45
+ // Real depth path: window-space depth remapped over [near, far], exponential fog by density.
46
+ float depth = texture(u_texture1, v_texCoord).r;
47
+ float d = clamp((depth - u_near) / max(u_far - u_near, 1e-4), 0.0, 1.0);
48
+ fog = clamp(1.0 - exp(-u_density * d), 0.0, 1.0);
49
+ } else {
50
+ // Sentinel path: no depth written (flat 2D scene) — screen-Y gradient as a depth proxy.
51
+ fog = clamp((1.0 - v_texCoord.y) * u_density, 0.0, 1.0);
52
+ }
53
+ o_color = vec4(mix(c.rgb, u_fogColor, fog), c.a);
54
+ }`;
55
+ //# sourceMappingURL=glScreenSpaceFogEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glScreenSpaceFogEffect.js","sourceRoot":"","sources":["../src/glScreenSpaceFogEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,yGAAyG;AACzG,uGAAuG;AACvG,wGAAwG;AACxG,sGAAsG;AACtG,8FAA8F;AAC9F,sFAAsF;AACtF,MAAM,UAAU,6BAA6B,CAC3C,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,YAAiC,EACjC,MAAsC;IAEtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,4BAA4B,EAAE,6BAA6B,CAAC,CAAC;IACvG,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,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,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,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/D,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7D,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,mCAAmC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACvF,6BAA6B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,iBAAiB,EAAE,MAA8B,CAAC,CAAC;AACxH,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;EAwBpC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, SepiaEffect } from '@flighthq/types';
2
+ export declare function applySepiaEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<SepiaEffect>): void;
3
+ export declare const defaultGlSepiaEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glSepiaEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSepiaEffect.d.ts","sourceRoot":"","sources":["../src/glSepiaEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAKxG,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC5B,IAAI,CAMN;AAED,eAAO,MAAM,0BAA0B,EAAE,oBAExC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Sepia: mix toward a sepia matrix transform by intensity.
4
+ export function applySepiaEffectToGl(state, source, dest, effect) {
5
+ const intensity = effect.intensity ?? 1;
6
+ const program = getGlEffectProgram(state, 'colorGrade.sepia', SEPIA_FRAGMENT_SRC);
7
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
8
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
9
+ });
10
+ }
11
+ export const defaultGlSepiaEffectRunner = (ctx, effect) => {
12
+ applySepiaEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
13
+ };
14
+ const SEPIA_FRAGMENT_SRC = `#version 300 es
15
+ precision highp float;
16
+ in vec2 v_texCoord;
17
+ uniform sampler2D u_texture0;
18
+ uniform float u_intensity;
19
+ out vec4 o_color;
20
+ void main() {
21
+ vec4 c = texture(u_texture0, v_texCoord);
22
+ vec3 sepia = vec3(
23
+ dot(c.rgb, vec3(0.393, 0.769, 0.189)),
24
+ dot(c.rgb, vec3(0.349, 0.686, 0.168)),
25
+ dot(c.rgb, vec3(0.272, 0.534, 0.131))
26
+ );
27
+ o_color = vec4(mix(c.rgb, sepia, u_intensity), c.a);
28
+ }`;
29
+ //# sourceMappingURL=glSepiaEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSepiaEffect.js","sourceRoot":"","sources":["../src/glSepiaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,2DAA2D;AAC3D,MAAM,UAAU,oBAAoB,CAClC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAClF,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;IAC3E,CAAC,CAAC,CAAC;AACL,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,MAAqB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;EAczB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, SharpenEffect } from '@flighthq/types';
2
+ export declare function applySharpenEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<SharpenEffect>): void;
3
+ export declare const defaultGlSharpenEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glSharpenEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSharpenEffect.d.ts","sourceRoot":"","sources":["../src/glSharpenEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAK1G,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC9B,IAAI,CAON;AAED,eAAO,MAAM,4BAA4B,EAAE,oBAE1C,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Sharpen: unsharp mask via a 3x3 Laplacian kernel; `amount` scales the high-frequency boost.
4
+ export function applySharpenEffectToGl(state, source, dest, effect) {
5
+ const amount = effect.amount ?? 0.5;
6
+ const program = getGlEffectProgram(state, 'stylization.sharpen', SHARPEN_FRAGMENT_SRC);
7
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
8
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_amount'), amount);
9
+ gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
10
+ });
11
+ }
12
+ export const defaultGlSharpenEffectRunner = (ctx, effect) => {
13
+ applySharpenEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
14
+ };
15
+ const SHARPEN_FRAGMENT_SRC = `#version 300 es
16
+ precision highp float;
17
+ in vec2 v_texCoord;
18
+ uniform sampler2D u_texture0;
19
+ uniform float u_amount;
20
+ uniform vec2 u_resolution;
21
+ out vec4 o_color;
22
+ void main() {
23
+ vec2 texel = 1.0 / u_resolution;
24
+ vec3 c = texture(u_texture0, v_texCoord).rgb;
25
+ vec3 n = texture(u_texture0, v_texCoord + vec2(0.0, -texel.y)).rgb;
26
+ vec3 s = texture(u_texture0, v_texCoord + vec2(0.0, texel.y)).rgb;
27
+ vec3 e = texture(u_texture0, v_texCoord + vec2(texel.x, 0.0)).rgb;
28
+ vec3 w = texture(u_texture0, v_texCoord + vec2(-texel.x, 0.0)).rgb;
29
+ vec3 high = c * 4.0 - n - s - e - w;
30
+ float a = texture(u_texture0, v_texCoord).a;
31
+ o_color = vec4(clamp(c + high * u_amount, 0.0, 1.0), a);
32
+ }`;
33
+ //# sourceMappingURL=glSharpenEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSharpenEffect.js","sourceRoot":"","sources":["../src/glSharpenEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,8FAA8F;AAC9F,MAAM,UAAU,sBAAsB,CACpC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;IACvF,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,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,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,4BAA4B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAChF,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAuB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;EAiB3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, SketchEffect } from '@flighthq/types';
2
+ export declare function applySketchEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<SketchEffect>): void;
3
+ export declare const defaultGlSketchEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glSketchEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSketchEffect.d.ts","sourceRoot":"","sources":["../src/glSketchEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMzG,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAON;AAED,eAAO,MAAM,2BAA2B,EAAE,oBAEzC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Sketch: detect luminance edges and invert them into dark pencil strokes over a light page; `strength`
4
+ // scales how dark the strokes get.
5
+ export function applySketchEffectToGl(state, source, dest, effect) {
6
+ const strength = effect.strength ?? 1;
7
+ const program = getGlEffectProgram(state, 'stylization.sketch', SKETCH_FRAGMENT_SRC);
8
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
9
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_strength'), strength);
10
+ gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
11
+ });
12
+ }
13
+ export const defaultGlSketchEffectRunner = (ctx, effect) => {
14
+ applySketchEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
15
+ };
16
+ const SKETCH_FRAGMENT_SRC = `#version 300 es
17
+ precision highp float;
18
+ in vec2 v_texCoord;
19
+ uniform sampler2D u_texture0;
20
+ uniform float u_strength;
21
+ uniform vec2 u_resolution;
22
+ out vec4 o_color;
23
+ float lum(vec2 uv) {
24
+ return dot(texture(u_texture0, uv).rgb, vec3(0.2126, 0.7152, 0.0722));
25
+ }
26
+ void main() {
27
+ vec2 texel = 1.0 / u_resolution;
28
+ float tl = lum(v_texCoord + texel * vec2(-1.0, -1.0));
29
+ float t = lum(v_texCoord + texel * vec2(0.0, -1.0));
30
+ float tr = lum(v_texCoord + texel * vec2(1.0, -1.0));
31
+ float l = lum(v_texCoord + texel * vec2(-1.0, 0.0));
32
+ float rr = lum(v_texCoord + texel * vec2(1.0, 0.0));
33
+ float bl = lum(v_texCoord + texel * vec2(-1.0, 1.0));
34
+ float b = lum(v_texCoord + texel * vec2(0.0, 1.0));
35
+ float br = lum(v_texCoord + texel * vec2(1.0, 1.0));
36
+ float gx = -tl - 2.0 * l - bl + tr + 2.0 * rr + br;
37
+ float gy = -tl - 2.0 * t - tr + bl + 2.0 * b + br;
38
+ float edge = sqrt(gx * gx + gy * gy);
39
+ float pencil = clamp(1.0 - edge * u_strength, 0.0, 1.0);
40
+ float a = texture(u_texture0, v_texCoord).a;
41
+ o_color = vec4(vec3(pencil), a);
42
+ }`;
43
+ //# sourceMappingURL=glSketchEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSketchEffect.js","sourceRoot":"","sources":["../src/glSketchEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,wGAAwG;AACxG,mCAAmC;AACnC,MAAM,UAAU,qBAAqB,CACnC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA8B;IAE9B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IACrF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvE,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,2BAA2B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC/E,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B1B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, SmaaEffect } from '@flighthq/types';
2
+ export declare function applySmaaEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<SmaaEffect>): void;
3
+ export declare const defaultGlSmaaEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glSmaaEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSmaaEffect.d.ts","sourceRoot":"","sources":["../src/glSmaaEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOvG,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAON;AAED,eAAO,MAAM,yBAAyB,EAAE,oBAEvC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // SMAA: a single-pass edge-aware blur approximation. Full SMAA needs separate edge-detection and
4
+ // blend-weight passes against precomputed area/search lookup textures; this single-pass approximation
5
+ // softens detected edges only and is acceptable until the multi-pass recipe lands.
6
+ export function applySmaaEffectToGl(state, source, dest, effect) {
7
+ const threshold = effect.threshold ?? 0.1;
8
+ const program = getGlEffectProgram(state, 'antialiasing.smaa', SMAA_FRAGMENT_SRC);
9
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
10
+ gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
11
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_threshold'), threshold);
12
+ });
13
+ }
14
+ export const defaultGlSmaaEffectRunner = (ctx, effect) => {
15
+ applySmaaEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
16
+ };
17
+ const SMAA_FRAGMENT_SRC = `#version 300 es
18
+ precision highp float;
19
+ in vec2 v_texCoord;
20
+ uniform sampler2D u_texture0;
21
+ uniform vec2 u_resolution;
22
+ uniform float u_threshold;
23
+ out vec4 o_color;
24
+ float luma(vec3 c) {
25
+ return dot(c, vec3(0.299, 0.587, 0.114));
26
+ }
27
+ void main() {
28
+ vec2 texel = 1.0 / u_resolution;
29
+ vec4 center = texture(u_texture0, v_texCoord);
30
+ float lumaC = luma(center.rgb);
31
+ float lumaL = luma(texture(u_texture0, v_texCoord + vec2(-1.0, 0.0) * texel).rgb);
32
+ float lumaR = luma(texture(u_texture0, v_texCoord + vec2(1.0, 0.0) * texel).rgb);
33
+ float lumaT = luma(texture(u_texture0, v_texCoord + vec2(0.0, -1.0) * texel).rgb);
34
+ float lumaB = luma(texture(u_texture0, v_texCoord + vec2(0.0, 1.0) * texel).rgb);
35
+ float edge = max(abs(lumaC - lumaL), max(abs(lumaC - lumaR), max(abs(lumaC - lumaT), abs(lumaC - lumaB))));
36
+ if (edge < u_threshold) {
37
+ o_color = center;
38
+ return;
39
+ }
40
+ vec3 blurred = (
41
+ texture(u_texture0, v_texCoord + vec2(-1.0, 0.0) * texel).rgb +
42
+ texture(u_texture0, v_texCoord + vec2(1.0, 0.0) * texel).rgb +
43
+ texture(u_texture0, v_texCoord + vec2(0.0, -1.0) * texel).rgb +
44
+ texture(u_texture0, v_texCoord + vec2(0.0, 1.0) * texel).rgb +
45
+ center.rgb) / 5.0;
46
+ o_color = vec4(blurred, center.a);
47
+ }`;
48
+ //# sourceMappingURL=glSmaaEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSmaaEffect.js","sourceRoot":"","sources":["../src/glSmaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,iGAAiG;AACjG,sGAAsG;AACtG,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CACjC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA4B;IAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAClF,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,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5F,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC7E,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BxB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, SsaoEffect } from '@flighthq/types';
2
+ export declare function applySsaoEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<SsaoEffect>): void;
3
+ export declare const defaultGlSsaoEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glSsaoEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSsaoEffect.d.ts","sourceRoot":"","sources":["../src/glSsaoEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AASvG,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CASN;AAED,eAAO,MAAM,yBAAyB,EAAE,oBAEvC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // SSAO: ambient-occlusion approximation. Real SSAO reconstructs view-space position/normals from a
4
+ // sampleable DEPTH texture and accumulates occlusion over `samples` kernel offsets within `radius`,
5
+ // gated by `bias`; none of that depth data exists in the color-only context. This stand-in darkens
6
+ // fragments by local luminance variation (high-contrast neighborhoods read as creases/contact) scaled
7
+ // by intensity, sampling neighbors via u_resolution-derived texel steps.
8
+ export function applySsaoEffectToGl(state, source, dest, effect) {
9
+ const radius = effect.radius ?? 1;
10
+ const intensity = effect.intensity ?? 1;
11
+ const program = getGlEffectProgram(state, 'atmospheric.ssao', SSAO_FRAGMENT_SRC);
12
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
13
+ gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
14
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_radius'), radius);
15
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
16
+ });
17
+ }
18
+ export const defaultGlSsaoEffectRunner = (ctx, effect) => {
19
+ applySsaoEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
20
+ };
21
+ const SSAO_FRAGMENT_SRC = `#version 300 es
22
+ precision highp float;
23
+ in vec2 v_texCoord;
24
+ uniform sampler2D u_texture0;
25
+ uniform vec2 u_resolution;
26
+ uniform float u_radius;
27
+ uniform float u_intensity;
28
+ out vec4 o_color;
29
+ float luma(vec3 c) {
30
+ return dot(c, vec3(0.299, 0.587, 0.114));
31
+ }
32
+ void main() {
33
+ vec2 texel = (1.0 / u_resolution) * max(u_radius, 1.0);
34
+ vec4 center = texture(u_texture0, v_texCoord);
35
+ float lc = luma(center.rgb);
36
+ float variation = 0.0;
37
+ variation += abs(lc - luma(texture(u_texture0, v_texCoord + vec2(-1.0, 0.0) * texel).rgb));
38
+ variation += abs(lc - luma(texture(u_texture0, v_texCoord + vec2(1.0, 0.0) * texel).rgb));
39
+ variation += abs(lc - luma(texture(u_texture0, v_texCoord + vec2(0.0, -1.0) * texel).rgb));
40
+ variation += abs(lc - luma(texture(u_texture0, v_texCoord + vec2(0.0, 1.0) * texel).rgb));
41
+ variation *= 0.25;
42
+ float occlusion = clamp(variation * u_intensity, 0.0, 1.0);
43
+ o_color = vec4(center.rgb * (1.0 - occlusion), center.a);
44
+ }`;
45
+ //# sourceMappingURL=glSsaoEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSsaoEffect.js","sourceRoot":"","sources":["../src/glSsaoEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,mGAAmG;AACnG,oGAAoG;AACpG,mGAAmG;AACnG,sGAAsG;AACtG,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CACjC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IACjF,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,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5F,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC7E,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;EAuBxB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, SsrEffect } from '@flighthq/types';
2
+ export declare function applySsrEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<SsrEffect>): void;
3
+ export declare const defaultGlSsrEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glSsrEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSsrEffect.d.ts","sourceRoot":"","sources":["../src/glSsrEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQtG,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAE9B,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC1B,IAAI,CAGN;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAEtC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // SSR: screen-space reflections. The real recipe ray-marches reflected rays against a sampleable DEPTH
4
+ // buffer using view-space normals, walking `steps` increments up to `maxDistance` at the given
5
+ // `resolution`; depth and normals are absent in the color-only context, so this is a passthrough copy
6
+ // that preserves the pipeline stage. maxDistance/resolution/steps are reserved for the depth-driven recipe.
7
+ export function applySsrEffectToGl(state, source, dest,
8
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
9
+ effect) {
10
+ const program = getGlEffectProgram(state, 'atmospheric.ssr', SSR_FRAGMENT_SRC);
11
+ drawGlFullscreenPass(state, program, [source.texture], dest, () => { });
12
+ }
13
+ export const defaultGlSsrEffectRunner = (ctx, effect) => {
14
+ applySsrEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
15
+ };
16
+ const SSR_FRAGMENT_SRC = `#version 300 es
17
+ precision highp float;
18
+ in vec2 v_texCoord;
19
+ uniform sampler2D u_texture0;
20
+ out vec4 o_color;
21
+ void main() {
22
+ o_color = texture(u_texture0, v_texCoord);
23
+ }`;
24
+ //# sourceMappingURL=glSsrEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSsrEffect.js","sourceRoot":"","sources":["../src/glSsrEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,uGAAuG;AACvG,+FAA+F;AAC/F,sGAAsG;AACtG,4GAA4G;AAC5G,MAAM,UAAU,kBAAkB,CAChC,KAAoB,EACpB,MAAgC,EAChC,IAA8B;AAC9B,6DAA6D;AAC7D,MAA2B;IAE3B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAC/E,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5E,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;EAOvB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, TaaEffect } from '@flighthq/types';
2
+ export declare function applyTaaEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, _effect: Readonly<TaaEffect>): void;
3
+ export declare const defaultGlTaaEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glTaaEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glTaaEffect.d.ts","sourceRoot":"","sources":["../src/glTaaEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOtG,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC3B,IAAI,CAGN;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAEtC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // TAA: passthrough copy of source → dest. Real temporal AA needs a history buffer + motion vectors to
4
+ // reproject and accumulate prior frames; neither is available in the single-frame effect context, so
5
+ // this is a placeholder that preserves the pipeline stage without altering the image.
6
+ export function applyTaaEffectToGl(state, source, dest, _effect) {
7
+ const program = getGlEffectProgram(state, 'antialiasing.taa', TAA_FRAGMENT_SRC);
8
+ drawGlFullscreenPass(state, program, [source.texture], dest, _noopSetUniforms);
9
+ }
10
+ export const defaultGlTaaEffectRunner = (ctx, effect) => {
11
+ applyTaaEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
12
+ };
13
+ function _noopSetUniforms() { }
14
+ const TAA_FRAGMENT_SRC = `#version 300 es
15
+ precision highp float;
16
+ in vec2 v_texCoord;
17
+ uniform sampler2D u_texture0;
18
+ out vec4 o_color;
19
+ void main() {
20
+ o_color = texture(u_texture0, v_texCoord);
21
+ }`;
22
+ //# sourceMappingURL=glTaaEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glTaaEffect.js","sourceRoot":"","sources":["../src/glTaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,sGAAsG;AACtG,qGAAqG;AACrG,sFAAsF;AACtF,MAAM,UAAU,kBAAkB,CAChC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,OAA4B;IAE5B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;IAChF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5E,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,SAAS,gBAAgB,KAAU,CAAC;AAEpC,MAAM,gBAAgB,GAAG;;;;;;;EAOvB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, TiltShiftEffect } from '@flighthq/types';
2
+ export declare function applyTiltShiftEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<TiltShiftEffect>): void;
3
+ export declare const defaultGlTiltShiftEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glTiltShiftEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glTiltShiftEffect.d.ts","sourceRoot":"","sources":["../src/glTiltShiftEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAO5G,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAWN;AAED,eAAO,MAAM,8BAA8B,EAAE,oBAE5C,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Tilt-shift: keep a horizontal focus band sharp and blur above and below it. The band is centered at
4
+ // `center` on Y with height `width`; blur strength ramps with distance outside the band. Blur is
5
+ // approximated by averaging a few neighbor taps using the pixel size from u_resolution.
6
+ export function applyTiltShiftEffectToGl(state, source, dest, effect) {
7
+ const center = effect.center ?? 0.5;
8
+ const width = effect.width ?? 0.3;
9
+ const blur = effect.blur ?? 4;
10
+ const program = getGlEffectProgram(state, 'lens.tiltShift', TILT_SHIFT_FRAGMENT_SRC);
11
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
12
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_center'), center);
13
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_width'), width);
14
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_blur'), blur);
15
+ gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
16
+ });
17
+ }
18
+ export const defaultGlTiltShiftEffectRunner = (ctx, effect) => {
19
+ applyTiltShiftEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
20
+ };
21
+ const TILT_SHIFT_FRAGMENT_SRC = `#version 300 es
22
+ precision highp float;
23
+ in vec2 v_texCoord;
24
+ uniform sampler2D u_texture0;
25
+ uniform float u_center;
26
+ uniform float u_width;
27
+ uniform float u_blur;
28
+ uniform vec2 u_resolution;
29
+ out vec4 o_color;
30
+ void main() {
31
+ vec2 texel = 1.0 / u_resolution;
32
+ float dist = abs(v_texCoord.y - u_center);
33
+ float edge = u_width * 0.5;
34
+ float amount = smoothstep(edge, edge + u_width, dist);
35
+ float radius = amount * u_blur;
36
+ vec4 sum = vec4(0.0);
37
+ float total = 0.0;
38
+ for (int i = -3; i <= 3; i++) {
39
+ vec2 offset = vec2(0.0, float(i)) * radius * texel;
40
+ sum += texture(u_texture0, v_texCoord + offset);
41
+ total += 1.0;
42
+ }
43
+ o_color = sum / total;
44
+ }`;
45
+ //# sourceMappingURL=glTiltShiftEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glTiltShiftEffect.js","sourceRoot":"","sources":["../src/glTiltShiftEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,sGAAsG;AACtG,iGAAiG;AACjG,wFAAwF;AACxF,MAAM,UAAU,wBAAwB,CACtC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAiC;IAEjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,CAAC;IACrF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QACjE,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,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAClF,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;EAuB9B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, ToneMapEffect } from '@flighthq/types';
2
+ export declare function applyToneMapEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<ToneMapEffect>): void;
3
+ export declare const defaultGlToneMapEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glToneMapEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glToneMapEffect.d.ts","sourceRoot":"","sources":["../src/glToneMapEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAK1G,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC9B,IAAI,CAQN;AAED,eAAO,MAAM,4BAA4B,EAAE,oBAE1C,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { drawGlFullscreenPass } from '@flighthq/render-gl';
2
+ import { getGlEffectProgram } from './glEffectProgramCache';
3
+ // Tone map: compress HDR to displayable range via the selected operator. Single-pass reference recipe.
4
+ export function applyToneMapEffectToGl(state, source, dest, effect) {
5
+ const operator = effect.operator ?? 'aces';
6
+ const exposure = effect.exposure ?? 1;
7
+ const program = getGlEffectProgram(state, `toneMap.${operator}`, buildToneMapFragment(operator));
8
+ drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
9
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_exposure'), exposure);
10
+ gl.uniform1f(gl.getUniformLocation(p.program, 'u_white'), effect.white ?? 1);
11
+ });
12
+ }
13
+ export const defaultGlToneMapEffectRunner = (ctx, effect) => {
14
+ applyToneMapEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
15
+ };
16
+ function buildToneMapFragment(operator) {
17
+ return TONEMAP_FRAGMENT_HEAD + (TONEMAP_OPERATORS[operator] ?? TONEMAP_OPERATORS.aces) + TONEMAP_FRAGMENT_TAIL;
18
+ }
19
+ const TONEMAP_FRAGMENT_HEAD = `#version 300 es
20
+ precision highp float;
21
+ in vec2 v_texCoord;
22
+ uniform sampler2D u_texture0;
23
+ uniform float u_exposure;
24
+ uniform float u_white;
25
+ out vec4 o_color;
26
+ vec3 tonemap(vec3 x) {`;
27
+ const TONEMAP_FRAGMENT_TAIL = `}
28
+ void main() {
29
+ vec4 c = texture(u_texture0, v_texCoord);
30
+ vec3 mapped = tonemap(c.rgb * u_exposure);
31
+ o_color = vec4(clamp(mapped, 0.0, 1.0), c.a);
32
+ }`;
33
+ const TONEMAP_OPERATORS = {
34
+ aces: `
35
+ vec3 a = x * (2.51 * x + 0.03);
36
+ vec3 b = x * (2.43 * x + 0.59) + 0.14;
37
+ return a / b;`,
38
+ reinhard: `
39
+ return x / (1.0 + x / (u_white * u_white));`,
40
+ filmic: `
41
+ vec3 X = max(vec3(0.0), x - 0.004);
42
+ return (X * (6.2 * X + 0.5)) / (X * (6.2 * X + 1.7) + 0.06);`,
43
+ uncharted2: `
44
+ float A = 0.15, B = 0.50, C = 0.10, D = 0.20, E = 0.02, F = 0.30;
45
+ vec3 v = ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;
46
+ return v;`,
47
+ agx: `
48
+ vec3 v = clamp((x - 0.004) / (1.0 + x), 0.0, 1.0);
49
+ return pow(v, vec3(0.8));`,
50
+ };
51
+ //# sourceMappingURL=glToneMapEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glToneMapEffect.js","sourceRoot":"","sources":["../src/glToneMapEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,uGAAuG;AACvG,MAAM,UAAU,sBAAsB,CACpC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA+B;IAE/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,WAAW,QAAQ,EAAE,EAAE,oBAAoB,CAAC,QAAQ,CAAC,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,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,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAChF,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAuB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,OAAO,qBAAqB,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC;AACjH,CAAC;AAED,MAAM,qBAAqB,GAAG;;;;;;;uBAOP,CAAC;AAExB,MAAM,qBAAqB,GAAG;;;;;EAK5B,CAAC;AAEH,MAAM,iBAAiB,GAA2B;IAChD,IAAI,EAAE;;;gBAGQ;IACd,QAAQ,EAAE;8CACkC;IAC5C,MAAM,EAAE;;+DAEqD;IAC7D,UAAU,EAAE;;;YAGF;IACV,GAAG,EAAE;;4BAEqB;CAC3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, VignetteEffect } from '@flighthq/types';
2
+ export declare function applyVignetteEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<VignetteEffect>): void;
3
+ export declare const defaultGlVignetteEffectRunner: GlRenderEffectRunner;
4
+ //# sourceMappingURL=glVignetteEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glVignetteEffect.d.ts","sourceRoot":"","sources":["../src/glVignetteEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAM3G,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CAgBN;AAED,eAAO,MAAM,6BAA6B,EAAE,oBAE3C,CAAC"}