@flighthq/effects-gl 0.3.0-next.906.07cea63 → 0.3.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 (278) hide show
  1. package/dist/contract.d.ts +3 -2
  2. package/dist/contract.d.ts.map +1 -1
  3. package/dist/contract.js +3 -2
  4. package/dist/contract.js.map +1 -1
  5. package/dist/enableGlRenderEffectGuards.d.ts +5 -0
  6. package/dist/enableGlRenderEffectGuards.d.ts.map +1 -0
  7. package/dist/enableGlRenderEffectGuards.js +43 -0
  8. package/dist/enableGlRenderEffectGuards.js.map +1 -0
  9. package/dist/glBevelEffect.d.ts +1 -0
  10. package/dist/glBevelEffect.d.ts.map +1 -1
  11. package/dist/glBevelEffect.js +7 -3
  12. package/dist/glBevelEffect.js.map +1 -1
  13. package/dist/glBlendEffect.d.ts +2 -0
  14. package/dist/glBlendEffect.d.ts.map +1 -1
  15. package/dist/glBlendEffect.js +13 -2
  16. package/dist/glBlendEffect.js.map +1 -1
  17. package/dist/glBloomEffect.d.ts +1 -0
  18. package/dist/glBloomEffect.d.ts.map +1 -1
  19. package/dist/glBloomEffect.js +4 -0
  20. package/dist/glBloomEffect.js.map +1 -1
  21. package/dist/glBlurEffect.d.ts +7 -1
  22. package/dist/glBlurEffect.d.ts.map +1 -1
  23. package/dist/glBlurEffect.js +34 -6
  24. package/dist/glBlurEffect.js.map +1 -1
  25. package/dist/glBokehDepthOfFieldEffect.d.ts +1 -0
  26. package/dist/glBokehDepthOfFieldEffect.d.ts.map +1 -1
  27. package/dist/glBokehDepthOfFieldEffect.js +4 -0
  28. package/dist/glBokehDepthOfFieldEffect.js.map +1 -1
  29. package/dist/glCameraMotionBlurEffect.d.ts +1 -0
  30. package/dist/glCameraMotionBlurEffect.d.ts.map +1 -1
  31. package/dist/glCameraMotionBlurEffect.js +4 -0
  32. package/dist/glCameraMotionBlurEffect.js.map +1 -1
  33. package/dist/glChromaticAberrationEffect.d.ts +1 -0
  34. package/dist/glChromaticAberrationEffect.d.ts.map +1 -1
  35. package/dist/glChromaticAberrationEffect.js +4 -0
  36. package/dist/glChromaticAberrationEffect.js.map +1 -1
  37. package/dist/glCompositeEffect.d.ts +1 -0
  38. package/dist/glCompositeEffect.d.ts.map +1 -1
  39. package/dist/glCompositeEffect.js +4 -0
  40. package/dist/glCompositeEffect.js.map +1 -1
  41. package/dist/glContactShadowsEffect.d.ts +5 -0
  42. package/dist/glContactShadowsEffect.d.ts.map +1 -0
  43. package/dist/glContactShadowsEffect.js +20 -0
  44. package/dist/glContactShadowsEffect.js.map +1 -0
  45. package/dist/glConvolutionEffect.d.ts +1 -0
  46. package/dist/glConvolutionEffect.d.ts.map +1 -1
  47. package/dist/glConvolutionEffect.js +4 -0
  48. package/dist/glConvolutionEffect.js.map +1 -1
  49. package/dist/glCrtEffect.d.ts +1 -0
  50. package/dist/glCrtEffect.d.ts.map +1 -1
  51. package/dist/glCrtEffect.js +4 -0
  52. package/dist/glCrtEffect.js.map +1 -1
  53. package/dist/glCustomShaderEffect.d.ts +1 -0
  54. package/dist/glCustomShaderEffect.d.ts.map +1 -1
  55. package/dist/glCustomShaderEffect.js +4 -0
  56. package/dist/glCustomShaderEffect.js.map +1 -1
  57. package/dist/glDirectionalBlurEffect.d.ts +1 -0
  58. package/dist/glDirectionalBlurEffect.d.ts.map +1 -1
  59. package/dist/glDirectionalBlurEffect.js +4 -0
  60. package/dist/glDirectionalBlurEffect.js.map +1 -1
  61. package/dist/glDisplacementEffect.d.ts +1 -0
  62. package/dist/glDisplacementEffect.d.ts.map +1 -1
  63. package/dist/glDisplacementEffect.js +4 -0
  64. package/dist/glDisplacementEffect.js.map +1 -1
  65. package/dist/glDitherEffect.d.ts +1 -0
  66. package/dist/glDitherEffect.d.ts.map +1 -1
  67. package/dist/glDitherEffect.js +4 -0
  68. package/dist/glDitherEffect.js.map +1 -1
  69. package/dist/glDropShadowEffect.d.ts +1 -0
  70. package/dist/glDropShadowEffect.d.ts.map +1 -1
  71. package/dist/glDropShadowEffect.js +4 -0
  72. package/dist/glDropShadowEffect.js.map +1 -1
  73. package/dist/glEffectBlitShader.js +6 -6
  74. package/dist/glEffectBlitShader.js.map +1 -1
  75. package/dist/glEffectBoxBlur.js +2 -2
  76. package/dist/glEffectBoxBlur.js.map +1 -1
  77. package/dist/glEffectProgramCache.js +5 -5
  78. package/dist/glEffectProgramCache.js.map +1 -1
  79. package/dist/glEffectTintShader.js +4 -4
  80. package/dist/glEffectTintShader.js.map +1 -1
  81. package/dist/glFilmGrainEffect.d.ts +1 -0
  82. package/dist/glFilmGrainEffect.d.ts.map +1 -1
  83. package/dist/glFilmGrainEffect.js +4 -0
  84. package/dist/glFilmGrainEffect.js.map +1 -1
  85. package/dist/glFxaaEffect.d.ts +1 -0
  86. package/dist/glFxaaEffect.d.ts.map +1 -1
  87. package/dist/glFxaaEffect.js +4 -0
  88. package/dist/glFxaaEffect.js.map +1 -1
  89. package/dist/glGlitchEffect.d.ts +1 -0
  90. package/dist/glGlitchEffect.d.ts.map +1 -1
  91. package/dist/glGlitchEffect.js +4 -0
  92. package/dist/glGlitchEffect.js.map +1 -1
  93. package/dist/glGodRaysEffect.d.ts +1 -0
  94. package/dist/glGodRaysEffect.d.ts.map +1 -1
  95. package/dist/glGodRaysEffect.js +4 -0
  96. package/dist/glGodRaysEffect.js.map +1 -1
  97. package/dist/glGradientBevelEffect.d.ts +1 -0
  98. package/dist/glGradientBevelEffect.d.ts.map +1 -1
  99. package/dist/glGradientBevelEffect.js +8 -4
  100. package/dist/glGradientBevelEffect.js.map +1 -1
  101. package/dist/glGradientGlowEffect.d.ts +1 -0
  102. package/dist/glGradientGlowEffect.d.ts.map +1 -1
  103. package/dist/glGradientGlowEffect.js +6 -2
  104. package/dist/glGradientGlowEffect.js.map +1 -1
  105. package/dist/glHalftoneEffect.d.ts +1 -0
  106. package/dist/glHalftoneEffect.d.ts.map +1 -1
  107. package/dist/glHalftoneEffect.js +4 -0
  108. package/dist/glHalftoneEffect.js.map +1 -1
  109. package/dist/glInnerGlowEffect.d.ts +1 -0
  110. package/dist/glInnerGlowEffect.d.ts.map +1 -1
  111. package/dist/glInnerGlowEffect.js +6 -2
  112. package/dist/glInnerGlowEffect.js.map +1 -1
  113. package/dist/glInnerShadowEffect.d.ts +1 -0
  114. package/dist/glInnerShadowEffect.d.ts.map +1 -1
  115. package/dist/glInnerShadowEffect.js +6 -2
  116. package/dist/glInnerShadowEffect.js.map +1 -1
  117. package/dist/glKuwaharaEffect.d.ts +1 -0
  118. package/dist/glKuwaharaEffect.d.ts.map +1 -1
  119. package/dist/glKuwaharaEffect.js +4 -0
  120. package/dist/glKuwaharaEffect.js.map +1 -1
  121. package/dist/glLensDirtEffect.d.ts +1 -0
  122. package/dist/glLensDirtEffect.d.ts.map +1 -1
  123. package/dist/glLensDirtEffect.js +4 -0
  124. package/dist/glLensDirtEffect.js.map +1 -1
  125. package/dist/glLensDistortionEffect.d.ts +1 -0
  126. package/dist/glLensDistortionEffect.d.ts.map +1 -1
  127. package/dist/glLensDistortionEffect.js +4 -0
  128. package/dist/glLensDistortionEffect.js.map +1 -1
  129. package/dist/glLensFlareEffect.d.ts +1 -0
  130. package/dist/glLensFlareEffect.d.ts.map +1 -1
  131. package/dist/glLensFlareEffect.js +4 -0
  132. package/dist/glLensFlareEffect.js.map +1 -1
  133. package/dist/glMedianEffect.d.ts +1 -0
  134. package/dist/glMedianEffect.d.ts.map +1 -1
  135. package/dist/glMedianEffect.js +4 -0
  136. package/dist/glMedianEffect.js.map +1 -1
  137. package/dist/glMotionBlurEffect.d.ts +1 -0
  138. package/dist/glMotionBlurEffect.d.ts.map +1 -1
  139. package/dist/glMotionBlurEffect.js +4 -0
  140. package/dist/glMotionBlurEffect.js.map +1 -1
  141. package/dist/glOuterGlowEffect.d.ts +1 -0
  142. package/dist/glOuterGlowEffect.d.ts.map +1 -1
  143. package/dist/glOuterGlowEffect.js +4 -0
  144. package/dist/glOuterGlowEffect.js.map +1 -1
  145. package/dist/glOutlineEffect.d.ts +1 -0
  146. package/dist/glOutlineEffect.d.ts.map +1 -1
  147. package/dist/glOutlineEffect.js +4 -0
  148. package/dist/glOutlineEffect.js.map +1 -1
  149. package/dist/glPixelateEffect.d.ts +1 -0
  150. package/dist/glPixelateEffect.d.ts.map +1 -1
  151. package/dist/glPixelateEffect.js +4 -0
  152. package/dist/glPixelateEffect.js.map +1 -1
  153. package/dist/glPosterizeEffect.d.ts +1 -0
  154. package/dist/glPosterizeEffect.d.ts.map +1 -1
  155. package/dist/glPosterizeEffect.js +4 -0
  156. package/dist/glPosterizeEffect.js.map +1 -1
  157. package/dist/glRadialBlurEffect.d.ts +1 -0
  158. package/dist/glRadialBlurEffect.d.ts.map +1 -1
  159. package/dist/glRadialBlurEffect.js +4 -0
  160. package/dist/glRadialBlurEffect.js.map +1 -1
  161. package/dist/glRenderEffectPipeline.d.ts +2 -2
  162. package/dist/glRenderEffectPipeline.d.ts.map +1 -1
  163. package/dist/glRenderEffectPipeline.js +14 -7
  164. package/dist/glRenderEffectPipeline.js.map +1 -1
  165. package/dist/glRenderEffectRegistry.d.ts.map +1 -1
  166. package/dist/glRenderEffectRegistry.js +8 -10
  167. package/dist/glRenderEffectRegistry.js.map +1 -1
  168. package/dist/glRenderTextureEffect.d.ts +5 -0
  169. package/dist/glRenderTextureEffect.d.ts.map +1 -0
  170. package/dist/glRenderTextureEffect.js +83 -0
  171. package/dist/glRenderTextureEffect.js.map +1 -0
  172. package/dist/glScanlinesEffect.d.ts +1 -0
  173. package/dist/glScanlinesEffect.d.ts.map +1 -1
  174. package/dist/glScanlinesEffect.js +4 -0
  175. package/dist/glScanlinesEffect.js.map +1 -1
  176. package/dist/glScreenSpaceFogEffect.d.ts +1 -0
  177. package/dist/glScreenSpaceFogEffect.d.ts.map +1 -1
  178. package/dist/glScreenSpaceFogEffect.js +4 -0
  179. package/dist/glScreenSpaceFogEffect.js.map +1 -1
  180. package/dist/glSharpenEffect.d.ts +1 -0
  181. package/dist/glSharpenEffect.d.ts.map +1 -1
  182. package/dist/glSharpenEffect.js +4 -0
  183. package/dist/glSharpenEffect.js.map +1 -1
  184. package/dist/glSketchEffect.d.ts +1 -0
  185. package/dist/glSketchEffect.d.ts.map +1 -1
  186. package/dist/glSketchEffect.js +4 -0
  187. package/dist/glSketchEffect.js.map +1 -1
  188. package/dist/glSmaaEffect.d.ts +1 -0
  189. package/dist/glSmaaEffect.d.ts.map +1 -1
  190. package/dist/glSmaaEffect.js +4 -0
  191. package/dist/glSmaaEffect.js.map +1 -1
  192. package/dist/glSsaoEffect.d.ts +1 -0
  193. package/dist/glSsaoEffect.d.ts.map +1 -1
  194. package/dist/glSsaoEffect.js +4 -0
  195. package/dist/glSsaoEffect.js.map +1 -1
  196. package/dist/glTiltShiftEffect.d.ts +1 -0
  197. package/dist/glTiltShiftEffect.d.ts.map +1 -1
  198. package/dist/glTiltShiftEffect.js +4 -0
  199. package/dist/glTiltShiftEffect.js.map +1 -1
  200. package/dist/glToneMapEffect.d.ts +1 -0
  201. package/dist/glToneMapEffect.d.ts.map +1 -1
  202. package/dist/glToneMapEffect.js +4 -0
  203. package/dist/glToneMapEffect.js.map +1 -1
  204. package/dist/glVignetteEffect.d.ts +1 -0
  205. package/dist/glVignetteEffect.d.ts.map +1 -1
  206. package/dist/glVignetteEffect.js +4 -0
  207. package/dist/glVignetteEffect.js.map +1 -1
  208. package/dist/glWhiteBalanceEffect.d.ts +1 -0
  209. package/dist/glWhiteBalanceEffect.d.ts.map +1 -1
  210. package/dist/glWhiteBalanceEffect.js +4 -0
  211. package/dist/glWhiteBalanceEffect.js.map +1 -1
  212. package/dist/index.d.ts +1 -1
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js +1 -1
  215. package/dist/index.js.map +1 -1
  216. package/package.json +9 -6
  217. package/src/enableGlRenderEffectGuards.test.ts +156 -0
  218. package/src/glBevelEffect.test.ts +7 -1
  219. package/src/glBlendEffect.test.ts +26 -0
  220. package/src/glBloomEffect.test.ts +7 -1
  221. package/src/glBlurEffect.test.ts +69 -1
  222. package/src/glBokehDepthOfFieldEffect.test.ts +11 -1
  223. package/src/glCameraMotionBlurEffect.test.ts +11 -1
  224. package/src/glChromaticAberrationEffect.test.ts +7 -0
  225. package/src/glCompositeEffect.test.ts +7 -0
  226. package/src/glContactShadowsEffect.test.ts +43 -0
  227. package/src/glConvolutionEffect.test.ts +11 -1
  228. package/src/glCrtEffect.test.ts +7 -1
  229. package/src/glCustomShaderEffect.test.ts +7 -0
  230. package/src/glDirectionalBlurEffect.test.ts +11 -1
  231. package/src/glDisplacementEffect.test.ts +11 -1
  232. package/src/glDitherEffect.test.ts +7 -1
  233. package/src/glDropShadowEffect.test.ts +11 -9
  234. package/src/glEffectBoxBlur.test.ts +0 -5
  235. package/src/glFilmGrainEffect.test.ts +11 -1
  236. package/src/glFxaaEffect.test.ts +7 -1
  237. package/src/glGlitchEffect.test.ts +7 -1
  238. package/src/glGodRaysEffect.test.ts +7 -1
  239. package/src/glGradientBevelEffect.test.ts +11 -1
  240. package/src/glGradientGlowEffect.test.ts +11 -1
  241. package/src/glHalftoneEffect.test.ts +7 -1
  242. package/src/glInnerGlowEffect.test.ts +11 -9
  243. package/src/glInnerShadowEffect.test.ts +11 -9
  244. package/src/glKuwaharaEffect.test.ts +7 -1
  245. package/src/glLensDirtEffect.test.ts +7 -1
  246. package/src/glLensDistortionEffect.test.ts +11 -1
  247. package/src/glLensFlareEffect.test.ts +11 -1
  248. package/src/glMedianEffect.test.ts +7 -1
  249. package/src/glMotionBlurEffect.test.ts +11 -1
  250. package/src/glOuterGlowEffect.test.ts +11 -9
  251. package/src/glOutlineEffect.test.ts +7 -1
  252. package/src/glPixelateEffect.test.ts +7 -1
  253. package/src/glPosterizeEffect.test.ts +11 -1
  254. package/src/glRadialBlurEffect.test.ts +11 -1
  255. package/src/glRenderEffectPipeline.test.ts +15 -0
  256. package/src/glRenderEffectRegistry.test.ts +24 -14
  257. package/src/glRenderTextureEffect.test.ts +246 -0
  258. package/src/glScanlinesEffect.test.ts +11 -1
  259. package/src/glScreenSpaceFogEffect.test.ts +11 -1
  260. package/src/glSharpenEffect.test.ts +7 -1
  261. package/src/glSketchEffect.test.ts +7 -1
  262. package/src/glSmaaEffect.test.ts +7 -1
  263. package/src/glSpatialEffectRegistration.test.ts +64 -0
  264. package/src/glSsaoEffect.test.ts +7 -1
  265. package/src/glTiltShiftEffect.test.ts +11 -1
  266. package/src/glToneMapEffect.test.ts +7 -1
  267. package/src/glVignetteEffect.test.ts +7 -1
  268. package/src/glWhiteBalanceEffect.test.ts +11 -1
  269. package/dist/glSsrEffect.d.ts +0 -4
  270. package/dist/glSsrEffect.d.ts.map +0 -1
  271. package/dist/glSsrEffect.js +0 -24
  272. package/dist/glSsrEffect.js.map +0 -1
  273. package/dist/glTaaEffect.d.ts +0 -4
  274. package/dist/glTaaEffect.d.ts.map +0 -1
  275. package/dist/glTaaEffect.js +0 -22
  276. package/dist/glTaaEffect.js.map +0 -1
  277. package/src/glSsrEffect.test.ts +0 -13
  278. package/src/glTaaEffect.test.ts +0 -13
@@ -0,0 +1,246 @@
1
+ import {
2
+ acquireGlRenderTexture,
3
+ clearGlRenderTexture,
4
+ copyGlRenderStateRegistrations,
5
+ createGlOffscreenRenderState,
6
+ createGlRenderState,
7
+ createGlRenderTexturePool,
8
+ getGlRenderTextureTarget,
9
+ isGlRenderTextureReady,
10
+ writeGlRenderTextureTarget,
11
+ } from '@flighthq/render-gl/contract';
12
+ import type { GlRenderEffectRunner, GlRenderState, RenderEffect } from '@flighthq/types/contract';
13
+
14
+ import { applyGaussianBlurToGlRenderTextures } from './glBlurEffect';
15
+ import { getGlRenderEffectRunner, registerGlRenderEffect } from './glRenderEffectRegistry';
16
+ import {
17
+ applyGlRenderEffectsToRenderTexture,
18
+ explainGlRenderEffectApplication,
19
+ setGlRenderEffectApplicationGuard,
20
+ } from './glRenderTextureEffect';
21
+
22
+ describe('applyGaussianBlurToGlRenderTextures', () => {
23
+ it('publishes destination and scratch RenderTextures after the two Gaussian target passes', () => {
24
+ const state = createState();
25
+ const pool = createGlRenderTexturePool();
26
+ const source = acquireGlRenderTexture(state, pool, { width: 16, height: 12 });
27
+ const dest = acquireGlRenderTexture(state, pool, { width: 16, height: 12 });
28
+ const scratch = acquireGlRenderTexture(state, pool, { width: 16, height: 12 });
29
+ writeGlRenderTextureTarget(state, source, () => {});
30
+
31
+ expect(applyGaussianBlurToGlRenderTextures(state, source, dest, scratch, { blurX: 2, blurY: 3 })).toBe(true);
32
+ expect(isGlRenderTextureReady(state, dest)).toBe(true);
33
+ expect(isGlRenderTextureReady(state, scratch)).toBe(true);
34
+ expect(dest.version).toBe(1);
35
+ expect(scratch.version).toBe(1);
36
+ });
37
+ });
38
+
39
+ describe('applyGlRenderEffectsToRenderTexture', () => {
40
+ it('ping-pongs registered effects so an even chain still finishes in the destination lease', () => {
41
+ const state = createState();
42
+ const pool = createGlRenderTexturePool();
43
+ const source = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
44
+ const dest = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
45
+ const scratch = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
46
+ writeGlRenderTextureTarget(state, source, () => {});
47
+ const first: GlRenderEffectRunner = vi.fn();
48
+ const second: GlRenderEffectRunner = vi.fn();
49
+ registerGlRenderEffect(state, 'acme.First', first);
50
+ registerGlRenderEffect(state, 'acme.Second', second);
51
+
52
+ expect(
53
+ applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, [
54
+ { kind: 'acme.First' },
55
+ { kind: 'acme.Second' },
56
+ ]),
57
+ ).toBe(true);
58
+
59
+ expect(first).toHaveBeenCalledOnce();
60
+ expect(second).toHaveBeenCalledOnce();
61
+ expect(vi.mocked(first).mock.calls[0][0].dest).toBe(getGlRenderTextureTarget(state, scratch));
62
+ expect(vi.mocked(second).mock.calls[0][0].dest).toBe(getGlRenderTextureTarget(state, dest));
63
+ expect(isGlRenderTextureReady(state, dest)).toBe(true);
64
+ });
65
+
66
+ it('leaves the destination unpublished when no effect kind is registered', () => {
67
+ const state = createState();
68
+ const pool = createGlRenderTexturePool();
69
+ const source = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
70
+ const dest = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
71
+ const scratch = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
72
+ writeGlRenderTextureTarget(state, source, () => {});
73
+
74
+ expect(applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, [{ kind: 'acme.Missing' }])).toBe(
75
+ false,
76
+ );
77
+ expect(isGlRenderTextureReady(state, dest)).toBe(false);
78
+ });
79
+
80
+ it('is byte-stable across constant-input frames only when reused destinations are cleared', () => {
81
+ const state = createState();
82
+ const pool = createGlRenderTexturePool();
83
+ const source = acquireGlRenderTexture(state, pool, { width: 1, height: 1 });
84
+ const dest = acquireGlRenderTexture(state, pool, { width: 1, height: 1 });
85
+ const scratch = acquireGlRenderTexture(state, pool, { width: 1, height: 1 });
86
+ const constantSource = Uint8Array.from([64, 32, 16, 128]);
87
+ let destinationPixel: Uint8Array = new Uint8Array(4);
88
+ let clearObserved = false;
89
+ vi.mocked(state.gl.clear).mockImplementation(() => {
90
+ clearObserved = true;
91
+ });
92
+ registerGlRenderEffect(state, 'test.constant-frame', () => {
93
+ if (clearObserved) {
94
+ destinationPixel.fill(0);
95
+ clearObserved = false;
96
+ }
97
+ destinationPixel = compositePremultipliedPixel(destinationPixel, constantSource);
98
+ });
99
+ writeGlRenderTextureTarget(state, source, () => {});
100
+ const effect = effects(['test.constant-frame']);
101
+
102
+ const clearedFrames = Array.from({ length: 4 }, () => {
103
+ clearGlRenderTexture(state, dest);
104
+ expect(applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effect)).toBe(true);
105
+ return Array.from(destinationPixel);
106
+ });
107
+
108
+ destinationPixel.fill(0);
109
+ clearObserved = false;
110
+ const accumulatedFrames = Array.from({ length: 4 }, () => {
111
+ expect(applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effect)).toBe(true);
112
+ return Array.from(destinationPixel);
113
+ });
114
+
115
+ expect(clearedFrames).toEqual(Array.from({ length: 4 }, () => [64, 32, 16, 128]));
116
+ expect(accumulatedFrames).toEqual([
117
+ [64, 32, 16, 128],
118
+ [96, 48, 24, 192],
119
+ [112, 56, 28, 224],
120
+ [120, 60, 30, 240],
121
+ ]);
122
+ });
123
+ });
124
+
125
+ describe('explainGlRenderEffectApplication', () => {
126
+ it('separates an empty chain from one whose effects are all unregistered', () => {
127
+ const state = createState();
128
+ // Both return false from the apply path, but only the second is a registration miss.
129
+ expect(explainGlRenderEffectApplication(state, [], true).status).toBe('no-effects');
130
+ expect(explainGlRenderEffectApplication(state, effects(['test.explain-a']), true).status).toBe(
131
+ 'unregistered-effects',
132
+ );
133
+ });
134
+
135
+ it('reports partial registration, the case that SUCCEEDS while dropping effects', () => {
136
+ const state = createState();
137
+ registerGlRenderEffect(state, 'test.explain-b', () => {});
138
+ const explanation = explainGlRenderEffectApplication(state, effects(['test.explain-b', 'test.explain-c']), true);
139
+ expect(explanation).toEqual({
140
+ registeredCount: 1,
141
+ requestedCount: 2,
142
+ status: 'partial-registration',
143
+ unregisteredKinds: ['test.explain-c'],
144
+ });
145
+ });
146
+
147
+ it('blames an unrealized source ahead of registration, since it explains a false return either way', () => {
148
+ const state = createState();
149
+ registerGlRenderEffect(state, 'test.explain-d', () => {});
150
+ expect(explainGlRenderEffectApplication(state, effects(['test.explain-d']), false).status).toBe(
151
+ 'source-unavailable',
152
+ );
153
+ });
154
+
155
+ it('reports a fully registered chain as complete', () => {
156
+ const state = createState();
157
+ registerGlRenderEffect(state, 'test.explain-e', () => {});
158
+ expect(explainGlRenderEffectApplication(state, effects(['test.explain-e']), true).status).toBe('complete');
159
+ });
160
+
161
+ it('reports a ready destination as stale when a failed call cannot replace it', () => {
162
+ const state = createState();
163
+ expect(explainGlRenderEffectApplication(state, effects(['test.explain-f']), true, true).status).toBe(
164
+ 'stale-destination',
165
+ );
166
+ registerGlRenderEffect(state, 'test.explain-g', () => {});
167
+ expect(explainGlRenderEffectApplication(state, effects(['test.explain-g']), false, true).status).toBe(
168
+ 'stale-destination',
169
+ );
170
+ });
171
+ });
172
+
173
+ function createState(): GlRenderState {
174
+ const canvas = document.createElement('canvas');
175
+ canvas.width = 32;
176
+ canvas.height = 24;
177
+ return createGlRenderState(canvas);
178
+ }
179
+
180
+ describe('offscreen effect registration snapshots', () => {
181
+ it('copies registered runners at derivation and requires explicit re-copy for later runners', () => {
182
+ const screen = createState();
183
+ const first: GlRenderEffectRunner = vi.fn();
184
+ const later: GlRenderEffectRunner = vi.fn();
185
+ registerGlRenderEffect(screen, 'acme.First', first);
186
+ const offscreen = createGlOffscreenRenderState(screen);
187
+ registerGlRenderEffect(screen, 'acme.Later', later);
188
+
189
+ expect(getGlRenderEffectRunner(offscreen, 'acme.First')).toBe(first);
190
+ expect(getGlRenderEffectRunner(offscreen, 'acme.Later')).toBeNull();
191
+
192
+ copyGlRenderStateRegistrations(offscreen, screen);
193
+ expect(getGlRenderEffectRunner(offscreen, 'acme.Later')).toBe(later);
194
+ });
195
+ });
196
+
197
+ describe('setGlRenderEffectApplicationGuard', () => {
198
+ it('reports only the sentinel outcomes, and stops once cleared', () => {
199
+ const state = createState();
200
+ const seen: string[] = [];
201
+ setGlRenderEffectApplicationGuard(state, (_s, explanation) => seen.push(explanation.status));
202
+ const pool = createGlRenderTexturePool();
203
+ const source = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
204
+ const dest = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
205
+ const scratch = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
206
+ writeGlRenderTextureTarget(state, source, () => {});
207
+
208
+ applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effects(['test.guard-a']));
209
+ applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, []);
210
+ expect(seen).toEqual(['unregistered-effects']);
211
+
212
+ setGlRenderEffectApplicationGuard(state, null);
213
+ applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effects(['test.guard-b']));
214
+ expect(seen).toEqual(['unregistered-effects']);
215
+ });
216
+
217
+ it('reports a previously published destination as stale when no runner can replace it', () => {
218
+ const state = createState();
219
+ const seen: string[] = [];
220
+ setGlRenderEffectApplicationGuard(state, (_s, explanation) => seen.push(explanation.status));
221
+ const pool = createGlRenderTexturePool();
222
+ const source = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
223
+ const dest = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
224
+ const scratch = acquireGlRenderTexture(state, pool, { width: 8, height: 8 });
225
+ writeGlRenderTextureTarget(state, source, () => {});
226
+ writeGlRenderTextureTarget(state, dest, () => {});
227
+
228
+ expect(applyGlRenderEffectsToRenderTexture(state, pool, source, dest, scratch, effects(['test.guard-stale']))).toBe(
229
+ false,
230
+ );
231
+ expect(seen).toEqual(['stale-destination']);
232
+ });
233
+ });
234
+
235
+ function effects(kinds: readonly string[]): ReadonlyArray<Readonly<RenderEffect>> {
236
+ return kinds.map((kind) => ({ kind }) as unknown as Readonly<RenderEffect>);
237
+ }
238
+
239
+ function compositePremultipliedPixel(destination: Uint8Array, source: Uint8Array): Uint8Array {
240
+ const result = new Uint8Array(4);
241
+ const destinationScale = 1 - source[3] / 255;
242
+ for (let channel = 0; channel < 4; channel++) {
243
+ result[channel] = Math.round(source[channel] + destination[channel] * destinationScale);
244
+ }
245
+ return result;
246
+ }
@@ -1,4 +1,8 @@
1
- import { applyScanlinesEffectToGl, defaultGlScanlinesEffectRunner } from './glScanlinesEffect';
1
+ import {
2
+ applyScanlinesEffectToGl,
3
+ defaultGlScanlinesEffectRunner,
4
+ registerGlScanlinesEffect,
5
+ } from './glScanlinesEffect';
2
6
 
3
7
  describe('applyScanlinesEffectToGl', () => {
4
8
  it('is a function', () => {
@@ -11,3 +15,9 @@ describe('defaultGlScanlinesEffectRunner', () => {
11
15
  expect(typeof defaultGlScanlinesEffectRunner).toBe('function');
12
16
  });
13
17
  });
18
+
19
+ describe('registerGlScanlinesEffect', () => {
20
+ it('is a separately importable registration primitive', () => {
21
+ expect(registerGlScanlinesEffect).toBeTypeOf('function');
22
+ });
23
+ });
@@ -1,4 +1,8 @@
1
- import { applyScreenSpaceFogEffectToGl, defaultGlScreenSpaceFogEffectRunner } from './glScreenSpaceFogEffect';
1
+ import {
2
+ applyScreenSpaceFogEffectToGl,
3
+ defaultGlScreenSpaceFogEffectRunner,
4
+ registerGlScreenSpaceFogEffect,
5
+ } from './glScreenSpaceFogEffect';
2
6
 
3
7
  describe('applyScreenSpaceFogEffectToGl', () => {
4
8
  it('is a function', () => {
@@ -11,3 +15,9 @@ describe('defaultGlScreenSpaceFogEffectRunner', () => {
11
15
  expect(typeof defaultGlScreenSpaceFogEffectRunner).toBe('function');
12
16
  });
13
17
  });
18
+
19
+ describe('registerGlScreenSpaceFogEffect', () => {
20
+ it('is a separately importable registration primitive', () => {
21
+ expect(registerGlScreenSpaceFogEffect).toBeTypeOf('function');
22
+ });
23
+ });
@@ -1,4 +1,4 @@
1
- import { applySharpenEffectToGl, defaultGlSharpenEffectRunner } from './glSharpenEffect';
1
+ import { applySharpenEffectToGl, defaultGlSharpenEffectRunner, registerGlSharpenEffect } from './glSharpenEffect';
2
2
 
3
3
  describe('applySharpenEffectToGl', () => {
4
4
  it('is a function', () => {
@@ -11,3 +11,9 @@ describe('defaultGlSharpenEffectRunner', () => {
11
11
  expect(typeof defaultGlSharpenEffectRunner).toBe('function');
12
12
  });
13
13
  });
14
+
15
+ describe('registerGlSharpenEffect', () => {
16
+ it('is a separately importable registration primitive', () => {
17
+ expect(registerGlSharpenEffect).toBeTypeOf('function');
18
+ });
19
+ });
@@ -1,4 +1,4 @@
1
- import { applySketchEffectToGl, defaultGlSketchEffectRunner } from './glSketchEffect';
1
+ import { applySketchEffectToGl, defaultGlSketchEffectRunner, registerGlSketchEffect } from './glSketchEffect';
2
2
 
3
3
  describe('applySketchEffectToGl', () => {
4
4
  it('is a function', () => {
@@ -11,3 +11,9 @@ describe('defaultGlSketchEffectRunner', () => {
11
11
  expect(typeof defaultGlSketchEffectRunner).toBe('function');
12
12
  });
13
13
  });
14
+
15
+ describe('registerGlSketchEffect', () => {
16
+ it('is a separately importable registration primitive', () => {
17
+ expect(registerGlSketchEffect).toBeTypeOf('function');
18
+ });
19
+ });
@@ -1,4 +1,4 @@
1
- import { applySmaaEffectToGl, defaultGlSmaaEffectRunner } from './glSmaaEffect';
1
+ import { applySmaaEffectToGl, defaultGlSmaaEffectRunner, registerGlSmaaEffect } from './glSmaaEffect';
2
2
 
3
3
  describe('applySmaaEffectToGl', () => {
4
4
  it('is a function', () => {
@@ -11,3 +11,9 @@ describe('defaultGlSmaaEffectRunner', () => {
11
11
  expect(typeof defaultGlSmaaEffectRunner).toBe('function');
12
12
  });
13
13
  });
14
+
15
+ describe('registerGlSmaaEffect', () => {
16
+ it('is a separately importable registration primitive', () => {
17
+ expect(registerGlSmaaEffect).toBeTypeOf('function');
18
+ });
19
+ });
@@ -0,0 +1,64 @@
1
+ import { createGlRenderState } from '@flighthq/render-gl/contract';
2
+
3
+ import * as contractEffects from './contract';
4
+ import { getGlRenderEffectRunner } from './glRenderEffectRegistry';
5
+ import * as publicEffects from './index';
6
+
7
+ describe('GL effect registration', () => {
8
+ it.each([
9
+ ['BevelEffect', 'registerGlBevelEffect', 'defaultGlBevelEffectRunner'],
10
+ ['BlendEffect', 'registerGlBlendEffect', 'defaultGlBlendEffectRunner'],
11
+ ['BloomEffect', 'registerGlBloomEffect', 'defaultGlBloomEffectRunner'],
12
+ ['BlurEffect', 'registerGlBlurEffect', 'defaultGlBlurEffectRunner'],
13
+ ['BokehDepthOfFieldEffect', 'registerGlBokehDepthOfFieldEffect', 'defaultGlBokehDepthOfFieldEffectRunner'],
14
+ ['CameraMotionBlurEffect', 'registerGlCameraMotionBlurEffect', 'defaultGlCameraMotionBlurEffectRunner'],
15
+ ['ChromaticAberrationEffect', 'registerGlChromaticAberrationEffect', 'defaultGlChromaticAberrationEffectRunner'],
16
+ ['CompositeEffect', 'registerGlCompositeEffect', 'defaultGlCompositeEffectRunner'],
17
+ ['ContactShadowsEffect', 'registerGlContactShadowsEffect', 'defaultGlContactShadowsEffectRunner'],
18
+ ['ConvolutionEffect', 'registerGlConvolutionEffect', 'defaultGlConvolutionEffectRunner'],
19
+ ['CrtEffect', 'registerGlCrtEffect', 'defaultGlCrtEffectRunner'],
20
+ ['CustomShaderEffect', 'registerGlCustomShaderEffect', 'defaultGlCustomShaderEffectRunner'],
21
+ ['DirectionalBlurEffect', 'registerGlDirectionalBlurEffect', 'defaultGlDirectionalBlurEffectRunner'],
22
+ ['DisplacementEffect', 'registerGlDisplacementEffect', 'defaultGlDisplacementEffectRunner'],
23
+ ['DitherEffect', 'registerGlDitherEffect', 'defaultGlDitherEffectRunner'],
24
+ ['DropShadowEffect', 'registerGlDropShadowEffect', 'defaultGlDropShadowEffectRunner'],
25
+ ['FilmGrainEffect', 'registerGlFilmGrainEffect', 'defaultGlFilmGrainEffectRunner'],
26
+ ['FxaaEffect', 'registerGlFxaaEffect', 'defaultGlFxaaEffectRunner'],
27
+ ['GlitchEffect', 'registerGlGlitchEffect', 'defaultGlGlitchEffectRunner'],
28
+ ['GodRaysEffect', 'registerGlGodRaysEffect', 'defaultGlGodRaysEffectRunner'],
29
+ ['GradientBevelEffect', 'registerGlGradientBevelEffect', 'defaultGlGradientBevelEffectRunner'],
30
+ ['GradientGlowEffect', 'registerGlGradientGlowEffect', 'defaultGlGradientGlowEffectRunner'],
31
+ ['HalftoneEffect', 'registerGlHalftoneEffect', 'defaultGlHalftoneEffectRunner'],
32
+ ['InnerGlowEffect', 'registerGlInnerGlowEffect', 'defaultGlInnerGlowEffectRunner'],
33
+ ['InnerShadowEffect', 'registerGlInnerShadowEffect', 'defaultGlInnerShadowEffectRunner'],
34
+ ['KuwaharaEffect', 'registerGlKuwaharaEffect', 'defaultGlKuwaharaEffectRunner'],
35
+ ['LensDirtEffect', 'registerGlLensDirtEffect', 'defaultGlLensDirtEffectRunner'],
36
+ ['LensDistortionEffect', 'registerGlLensDistortionEffect', 'defaultGlLensDistortionEffectRunner'],
37
+ ['LensFlareEffect', 'registerGlLensFlareEffect', 'defaultGlLensFlareEffectRunner'],
38
+ ['MedianEffect', 'registerGlMedianEffect', 'defaultGlMedianEffectRunner'],
39
+ ['MotionBlurEffect', 'registerGlMotionBlurEffect', 'defaultGlMotionBlurEffectRunner'],
40
+ ['OuterGlowEffect', 'registerGlOuterGlowEffect', 'defaultGlOuterGlowEffectRunner'],
41
+ ['OutlineEffect', 'registerGlOutlineEffect', 'defaultGlOutlineEffectRunner'],
42
+ ['PixelateEffect', 'registerGlPixelateEffect', 'defaultGlPixelateEffectRunner'],
43
+ ['PosterizeEffect', 'registerGlPosterizeEffect', 'defaultGlPosterizeEffectRunner'],
44
+ ['RadialBlurEffect', 'registerGlRadialBlurEffect', 'defaultGlRadialBlurEffectRunner'],
45
+ ['ScanlinesEffect', 'registerGlScanlinesEffect', 'defaultGlScanlinesEffectRunner'],
46
+ ['ScreenSpaceFogEffect', 'registerGlScreenSpaceFogEffect', 'defaultGlScreenSpaceFogEffectRunner'],
47
+ ['SharpenEffect', 'registerGlSharpenEffect', 'defaultGlSharpenEffectRunner'],
48
+ ['SketchEffect', 'registerGlSketchEffect', 'defaultGlSketchEffectRunner'],
49
+ ['SmaaEffect', 'registerGlSmaaEffect', 'defaultGlSmaaEffectRunner'],
50
+ ['SsaoEffect', 'registerGlSsaoEffect', 'defaultGlSsaoEffectRunner'],
51
+ ['TiltShiftEffect', 'registerGlTiltShiftEffect', 'defaultGlTiltShiftEffectRunner'],
52
+ ['ToneMapEffect', 'registerGlToneMapEffect', 'defaultGlToneMapEffectRunner'],
53
+ ['VignetteEffect', 'registerGlVignetteEffect', 'defaultGlVignetteEffectRunner'],
54
+ ['WhiteBalanceEffect', 'registerGlWhiteBalanceEffect', 'defaultGlWhiteBalanceEffectRunner'],
55
+ ] as const)('registers the public %s runner on only the supplied state', (kind, registerName, runnerName) => {
56
+ const state = createGlRenderState(document.createElement('canvas'));
57
+ const other = createGlRenderState(document.createElement('canvas'));
58
+
59
+ publicEffects[registerName](state);
60
+
61
+ expect(getGlRenderEffectRunner(state, kind)).toBe(contractEffects[runnerName]);
62
+ expect(getGlRenderEffectRunner(other, kind)).toBeNull();
63
+ });
64
+ });
@@ -1,4 +1,4 @@
1
- import { applySsaoEffectToGl, defaultGlSsaoEffectRunner } from './glSsaoEffect';
1
+ import { applySsaoEffectToGl, defaultGlSsaoEffectRunner, registerGlSsaoEffect } from './glSsaoEffect';
2
2
 
3
3
  describe('applySsaoEffectToGl', () => {
4
4
  it('is a function', () => {
@@ -11,3 +11,9 @@ describe('defaultGlSsaoEffectRunner', () => {
11
11
  expect(typeof defaultGlSsaoEffectRunner).toBe('function');
12
12
  });
13
13
  });
14
+
15
+ describe('registerGlSsaoEffect', () => {
16
+ it('is a separately importable registration primitive', () => {
17
+ expect(registerGlSsaoEffect).toBeTypeOf('function');
18
+ });
19
+ });
@@ -1,4 +1,8 @@
1
- import { applyTiltShiftEffectToGl, defaultGlTiltShiftEffectRunner } from './glTiltShiftEffect';
1
+ import {
2
+ applyTiltShiftEffectToGl,
3
+ defaultGlTiltShiftEffectRunner,
4
+ registerGlTiltShiftEffect,
5
+ } from './glTiltShiftEffect';
2
6
 
3
7
  describe('applyTiltShiftEffectToGl', () => {
4
8
  it('is a function', () => {
@@ -11,3 +15,9 @@ describe('defaultGlTiltShiftEffectRunner', () => {
11
15
  expect(typeof defaultGlTiltShiftEffectRunner).toBe('function');
12
16
  });
13
17
  });
18
+
19
+ describe('registerGlTiltShiftEffect', () => {
20
+ it('is a separately importable registration primitive', () => {
21
+ expect(registerGlTiltShiftEffect).toBeTypeOf('function');
22
+ });
23
+ });
@@ -1,4 +1,4 @@
1
- import { applyToneMapEffectToGl, defaultGlToneMapEffectRunner } from './glToneMapEffect';
1
+ import { applyToneMapEffectToGl, defaultGlToneMapEffectRunner, registerGlToneMapEffect } from './glToneMapEffect';
2
2
 
3
3
  describe('applyToneMapEffectToGl', () => {
4
4
  it('is a function', () => {
@@ -11,3 +11,9 @@ describe('defaultGlToneMapEffectRunner', () => {
11
11
  expect(typeof defaultGlToneMapEffectRunner).toBe('function');
12
12
  });
13
13
  });
14
+
15
+ describe('registerGlToneMapEffect', () => {
16
+ it('is a separately importable registration primitive', () => {
17
+ expect(registerGlToneMapEffect).toBeTypeOf('function');
18
+ });
19
+ });
@@ -1,4 +1,4 @@
1
- import { applyVignetteEffectToGl, defaultGlVignetteEffectRunner } from './glVignetteEffect';
1
+ import { applyVignetteEffectToGl, defaultGlVignetteEffectRunner, registerGlVignetteEffect } from './glVignetteEffect';
2
2
 
3
3
  describe('applyVignetteEffectToGl', () => {
4
4
  it('is a function', () => {
@@ -11,3 +11,9 @@ describe('defaultGlVignetteEffectRunner', () => {
11
11
  expect(typeof defaultGlVignetteEffectRunner).toBe('function');
12
12
  });
13
13
  });
14
+
15
+ describe('registerGlVignetteEffect', () => {
16
+ it('is a separately importable registration primitive', () => {
17
+ expect(registerGlVignetteEffect).toBeTypeOf('function');
18
+ });
19
+ });
@@ -1,4 +1,8 @@
1
- import { applyWhiteBalanceEffectToGl, defaultGlWhiteBalanceEffectRunner } from './glWhiteBalanceEffect';
1
+ import {
2
+ applyWhiteBalanceEffectToGl,
3
+ defaultGlWhiteBalanceEffectRunner,
4
+ registerGlWhiteBalanceEffect,
5
+ } from './glWhiteBalanceEffect';
2
6
 
3
7
  describe('applyWhiteBalanceEffectToGl', () => {
4
8
  it('is a function', () => {
@@ -11,3 +15,9 @@ describe('defaultGlWhiteBalanceEffectRunner', () => {
11
15
  expect(typeof defaultGlWhiteBalanceEffectRunner).toBe('function');
12
16
  });
13
17
  });
18
+
19
+ describe('registerGlWhiteBalanceEffect', () => {
20
+ it('is a separately importable registration primitive', () => {
21
+ expect(registerGlWhiteBalanceEffect).toBeTypeOf('function');
22
+ });
23
+ });
@@ -1,4 +0,0 @@
1
- import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, SsrEffect } from '@flighthq/types/contract';
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
@@ -1 +0,0 @@
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,0BAA0B,CAAC;AAQ/G,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"}
@@ -1,24 +0,0 @@
1
- import { drawGlFullscreenPass } from '@flighthq/render-gl/contract';
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 scene2d. 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
@@ -1 +0,0 @@
1
- {"version":3,"file":"glSsrEffect.js","sourceRoot":"","sources":["../src/glSsrEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,uGAAuG;AACvG,+FAA+F;AAC/F,sGAAsG;AACtG,8GAA8G;AAC9G,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"}
@@ -1,4 +0,0 @@
1
- import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, TaaEffect } from '@flighthq/types/contract';
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
@@ -1 +0,0 @@
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,0BAA0B,CAAC;AAO/G,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"}
@@ -1,22 +0,0 @@
1
- import { drawGlFullscreenPass } from '@flighthq/render-gl/contract';
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 scene2d 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
@@ -1 +0,0 @@
1
- {"version":3,"file":"glTaaEffect.js","sourceRoot":"","sources":["../src/glTaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,sGAAsG;AACtG,qGAAqG;AACrG,wFAAwF;AACxF,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"}
@@ -1,13 +0,0 @@
1
- import { applySsrEffectToGl, defaultGlSsrEffectRunner } from './glSsrEffect';
2
-
3
- describe('applySsrEffectToGl', () => {
4
- it('is a function', () => {
5
- expect(typeof applySsrEffectToGl).toBe('function');
6
- });
7
- });
8
-
9
- describe('defaultGlSsrEffectRunner', () => {
10
- it('is a function', () => {
11
- expect(typeof defaultGlSsrEffectRunner).toBe('function');
12
- });
13
- });
@@ -1,13 +0,0 @@
1
- import { applyTaaEffectToGl, defaultGlTaaEffectRunner } from './glTaaEffect';
2
-
3
- describe('applyTaaEffectToGl', () => {
4
- it('is a function', () => {
5
- expect(typeof applyTaaEffectToGl).toBe('function');
6
- });
7
- });
8
-
9
- describe('defaultGlTaaEffectRunner', () => {
10
- it('is a function', () => {
11
- expect(typeof defaultGlTaaEffectRunner).toBe('function');
12
- });
13
- });