react-native-webrtc-kaleidoscope 2.0.0 → 2.1.1

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 (1185) hide show
  1. package/NOTICE.md +8 -8
  2. package/README.md +185 -56
  3. package/android/build.gradle +13 -0
  4. package/android/src/main/java/com/simiancraft/kaleidoscope/CompositeLayers.kt +127 -0
  5. package/android/src/main/java/com/simiancraft/kaleidoscope/EffectTuning.kt +69 -69
  6. package/android/src/main/java/com/simiancraft/kaleidoscope/KaleidoscopeModule.kt +86 -33
  7. package/android/src/main/java/com/simiancraft/kaleidoscope/Registration.kt +23 -64
  8. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/CompositeFactory.kt +691 -0
  9. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/LayerShaders.kt +30 -0
  10. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/TransformFactory.kt +248 -200
  11. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Egl.kt +82 -70
  12. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Fbo.kt +50 -47
  13. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/FramePipeline.kt +106 -105
  14. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlDebug.kt +23 -23
  15. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlProgram.kt +76 -57
  16. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Ingest.kt +92 -71
  17. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Orientation.kt +25 -25
  18. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Shaders.kt +57 -76
  19. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/ShadersGenerated.kt +1162 -25
  20. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/Mask.kt +254 -242
  21. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/MaskTuning.kt +28 -25
  22. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/SegmentationEngine.kt +104 -98
  23. package/android/src/test/java/com/simiancraft/kaleidoscope/CompositeLayersTest.kt +165 -0
  24. package/app.plugin.js +9 -255
  25. package/catalog/composites/clouds/clouds.controls.tsx +19 -0
  26. package/catalog/composites/clouds/clouds.ts +32 -0
  27. package/catalog/composites/corporate-blobs/corporate-blobs.controls.tsx +24 -0
  28. package/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
  29. package/catalog/composites/corporate-blobs/corporate-blobs.ts +51 -0
  30. package/catalog/composites/corporate-blobs/corporate-blobs.web.ts +42 -0
  31. package/catalog/composites/fairy-cave/fairy-cave.controls.tsx +33 -0
  32. package/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
  33. package/catalog/composites/fairy-cave/fairy-cave.ts +53 -0
  34. package/catalog/composites/fairy-cave/fairy-cave.web.ts +47 -0
  35. package/catalog/composites/fairy-grotto/fairy-grotto.controls.tsx +34 -0
  36. package/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
  37. package/catalog/composites/fairy-grotto/fairy-grotto.ts +54 -0
  38. package/catalog/composites/fairy-grotto/fairy-grotto.web.ts +47 -0
  39. package/catalog/composites/fairy-hollow/fairy-hollow.controls.tsx +34 -0
  40. package/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
  41. package/catalog/composites/fairy-hollow/fairy-hollow.ts +55 -0
  42. package/catalog/composites/fairy-hollow/fairy-hollow.web.ts +47 -0
  43. package/catalog/composites/nebula/nebula.controls.tsx +19 -0
  44. package/catalog/composites/nebula/nebula.thumb.webp +0 -0
  45. package/catalog/composites/nebula/nebula.ts +37 -0
  46. package/catalog/composites/nebula/nebula.web.ts +30 -0
  47. package/catalog/composites/observation-deck/observation-deck.controls.tsx +28 -0
  48. package/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
  49. package/catalog/composites/observation-deck/observation-deck.ts +59 -0
  50. package/catalog/composites/observation-deck/observation-deck.web.ts +50 -0
  51. package/catalog/composites/simianlights/simianlights.controls.tsx +19 -0
  52. package/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
  53. package/catalog/composites/simianlights/simianlights.ts +34 -0
  54. package/catalog/composites/simianlights/simianlights.web.ts +29 -0
  55. package/catalog/composites/underwater/underwater.controls.tsx +19 -0
  56. package/catalog/composites/underwater/underwater.thumb.webp +0 -0
  57. package/catalog/composites/underwater/underwater.ts +42 -0
  58. package/catalog/composites/underwater/underwater.web.ts +36 -0
  59. package/catalog/composites/wizard-tower/wizard-tower.controls.tsx +23 -0
  60. package/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
  61. package/catalog/composites/wizard-tower/wizard-tower.ts +44 -0
  62. package/catalog/composites/wizard-tower/wizard-tower.web.ts +35 -0
  63. package/catalog/composites/wizard-tower-night/wizard-tower-night.controls.tsx +22 -0
  64. package/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
  65. package/catalog/composites/wizard-tower-night/wizard-tower-night.ts +43 -0
  66. package/catalog/composites/wizard-tower-night/wizard-tower-night.web.ts +35 -0
  67. package/catalog/images/README.md +188 -0
  68. package/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
  69. package/catalog/images/corporate/corporate-logo.ts +6 -0
  70. package/catalog/images/corporate/corporate-logo.web.ts +7 -0
  71. package/catalog/images/corporate/corporate-logo.webp +0 -0
  72. package/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
  73. package/catalog/images/debug/debug-resolutions.ts +6 -0
  74. package/catalog/images/debug/debug-resolutions.web.ts +7 -0
  75. package/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
  76. package/catalog/images/fairy-caves/grotto.ts +6 -0
  77. package/catalog/images/fairy-caves/grotto.web.ts +7 -0
  78. package/catalog/images/fairy-caves/grotto.webp +0 -0
  79. package/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
  80. package/catalog/images/fairy-caves/hollow.ts +6 -0
  81. package/catalog/images/fairy-caves/hollow.web.ts +7 -0
  82. package/catalog/images/fairy-caves/hollow.webp +0 -0
  83. package/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
  84. package/catalog/images/fairy-caves/treehouse-2.ts +6 -0
  85. package/catalog/images/fairy-caves/treehouse-2.web.ts +7 -0
  86. package/catalog/images/fairy-caves/treehouse-2.webp +0 -0
  87. package/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
  88. package/catalog/images/fairy-caves/treehouse-3.ts +6 -0
  89. package/catalog/images/fairy-caves/treehouse-3.web.ts +7 -0
  90. package/catalog/images/fairy-caves/treehouse-3.webp +0 -0
  91. package/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
  92. package/catalog/images/fairy-caves/treehouse.ts +6 -0
  93. package/catalog/images/fairy-caves/treehouse.web.ts +7 -0
  94. package/catalog/images/fairy-caves/treehouse.webp +0 -0
  95. package/catalog/images/home/home-dark.thumb.webp +0 -0
  96. package/catalog/images/home/home-dark.ts +6 -0
  97. package/catalog/images/home/home-dark.web.ts +7 -0
  98. package/catalog/images/home/home-light.thumb.webp +0 -0
  99. package/catalog/images/home/home-light.ts +6 -0
  100. package/catalog/images/home/home-light.web.ts +7 -0
  101. package/catalog/images/image-ids.ts +42 -0
  102. package/catalog/images/image.types.ts +5 -0
  103. package/catalog/images/index.ts +7 -0
  104. package/catalog/images/nature/landscape-dark.thumb.webp +0 -0
  105. package/catalog/images/nature/landscape-dark.ts +6 -0
  106. package/catalog/images/nature/landscape-dark.web.ts +7 -0
  107. package/catalog/images/nature/landscape-light.thumb.webp +0 -0
  108. package/catalog/images/nature/landscape-light.ts +6 -0
  109. package/catalog/images/nature/landscape-light.web.ts +7 -0
  110. package/catalog/images/office/office-dark.thumb.webp +0 -0
  111. package/catalog/images/office/office-dark.ts +6 -0
  112. package/catalog/images/office/office-dark.web.ts +7 -0
  113. package/catalog/images/office/office-light.thumb.webp +0 -0
  114. package/catalog/images/office/office-light.ts +6 -0
  115. package/catalog/images/office/office-light.web.ts +7 -0
  116. package/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
  117. package/catalog/images/sci-fi/sci-fi-light.ts +6 -0
  118. package/catalog/images/sci-fi/sci-fi-light.web.ts +7 -0
  119. package/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
  120. package/catalog/images/simiancraft/simiancraft-dark-transparency.ts +6 -0
  121. package/catalog/images/simiancraft/simiancraft-dark-transparency.web.ts +9 -0
  122. package/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
  123. package/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
  124. package/catalog/images/simiancraft/simiancraft-dark.ts +6 -0
  125. package/catalog/images/simiancraft/simiancraft-dark.web.ts +7 -0
  126. package/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
  127. package/catalog/images/simiancraft/simiancraft-light-transparency.ts +6 -0
  128. package/catalog/images/simiancraft/simiancraft-light-transparency.web.ts +9 -0
  129. package/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
  130. package/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
  131. package/catalog/images/simiancraft/simiancraft-light.ts +6 -0
  132. package/catalog/images/simiancraft/simiancraft-light.web.ts +7 -0
  133. package/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
  134. package/catalog/images/spaceship/observation-deck.ts +6 -0
  135. package/catalog/images/spaceship/observation-deck.web.ts +7 -0
  136. package/catalog/images/spaceship/observation-deck.webp +0 -0
  137. package/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
  138. package/catalog/images/underwater/oceanscape-dark.ts +6 -0
  139. package/catalog/images/underwater/oceanscape-dark.web.ts +7 -0
  140. package/catalog/images/underwater/oceanscape-dark.webp +0 -0
  141. package/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
  142. package/catalog/images/wizard-tower/wizard-tower-1.ts +6 -0
  143. package/catalog/images/wizard-tower/wizard-tower-1.web.ts +7 -0
  144. package/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
  145. package/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
  146. package/catalog/images/wizard-tower/wizard-tower-2.ts +6 -0
  147. package/catalog/images/wizard-tower/wizard-tower-2.web.ts +7 -0
  148. package/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
  149. package/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
  150. package/catalog/images/wizard-tower/wizard-tower-night.ts +6 -0
  151. package/catalog/images/wizard-tower/wizard-tower-night.web.ts +7 -0
  152. package/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
  153. package/catalog/shaders/README.md +114 -0
  154. package/catalog/shaders/_shared/composite-blit.frag +26 -0
  155. package/catalog/shaders/_shared/composite-camera.frag +17 -0
  156. package/catalog/shaders/_shared/composite-image.frag +23 -0
  157. package/catalog/shaders/_shared/composite-masked.frag +26 -0
  158. package/catalog/shaders/_shared/composite-subject.frag +27 -0
  159. package/catalog/shaders/_shared/passthrough.vert +27 -0
  160. package/catalog/shaders/_shared/transform.frag +27 -0
  161. package/catalog/shaders/_shared/types.ts +63 -0
  162. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.tsx +37 -0
  163. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.frag +123 -0
  164. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.ts +106 -0
  165. package/catalog/shaders/blur/blur.form.tsx +29 -0
  166. package/catalog/shaders/blur/blur.ts +32 -0
  167. package/catalog/shaders/blur/composite-blur.frag +42 -0
  168. package/catalog/shaders/clouds/clouds.form.tsx +39 -0
  169. package/catalog/shaders/clouds/clouds.frag +128 -0
  170. package/catalog/shaders/clouds/clouds.presets.md +37 -0
  171. package/catalog/shaders/clouds/clouds.ts +124 -0
  172. package/catalog/shaders/corporate-blobs/corporate-blobs.form.tsx +44 -0
  173. package/catalog/shaders/corporate-blobs/corporate-blobs.frag +224 -0
  174. package/catalog/shaders/corporate-blobs/corporate-blobs.ts +136 -0
  175. package/catalog/shaders/fireflies/fireflies.form.tsx +33 -0
  176. package/catalog/shaders/fireflies/fireflies.frag +68 -0
  177. package/catalog/shaders/fireflies/fireflies.ts +61 -0
  178. package/catalog/shaders/godrays/godrays.form.tsx +37 -0
  179. package/catalog/shaders/godrays/godrays.frag +85 -0
  180. package/catalog/shaders/godrays/godrays.ts +105 -0
  181. package/catalog/shaders/index.ts +78 -0
  182. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.tsx +55 -0
  183. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.frag +262 -0
  184. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.ts +137 -0
  185. package/catalog/shaders/nebula/nebula.form.tsx +34 -0
  186. package/catalog/shaders/nebula/nebula.frag +151 -0
  187. package/catalog/shaders/nebula/nebula.ts +74 -0
  188. package/catalog/shaders/plasma/plasma.form.tsx +32 -0
  189. package/catalog/shaders/plasma/plasma.frag +55 -0
  190. package/catalog/shaders/plasma/plasma.ts +44 -0
  191. package/catalog/shaders/simianlights/simianlights.form.tsx +34 -0
  192. package/catalog/shaders/simianlights/simianlights.frag +151 -0
  193. package/catalog/shaders/simianlights/simianlights.ts +73 -0
  194. package/dist/catalog/composites/clouds/clouds.controls.d.ts +3 -0
  195. package/dist/catalog/composites/clouds/clouds.controls.d.ts.map +1 -0
  196. package/dist/catalog/composites/clouds/clouds.controls.js +11 -0
  197. package/dist/catalog/composites/clouds/clouds.controls.js.map +1 -0
  198. package/dist/catalog/composites/clouds/clouds.d.ts +26 -0
  199. package/dist/catalog/composites/clouds/clouds.d.ts.map +1 -0
  200. package/dist/catalog/composites/clouds/clouds.js +33 -0
  201. package/dist/catalog/composites/clouds/clouds.js.map +1 -0
  202. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts +3 -0
  203. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts.map +1 -0
  204. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js +13 -0
  205. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js.map +1 -0
  206. package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts +37 -0
  207. package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts.map +1 -0
  208. package/dist/catalog/composites/corporate-blobs/corporate-blobs.js +52 -0
  209. package/dist/catalog/composites/corporate-blobs/corporate-blobs.js.map +1 -0
  210. package/dist/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
  211. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts +37 -0
  212. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts.map +1 -0
  213. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js +46 -0
  214. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js.map +1 -0
  215. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts +3 -0
  216. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts.map +1 -0
  217. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js +13 -0
  218. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js.map +1 -0
  219. package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts +42 -0
  220. package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts.map +1 -0
  221. package/dist/catalog/composites/fairy-cave/fairy-cave.js +54 -0
  222. package/dist/catalog/composites/fairy-cave/fairy-cave.js.map +1 -0
  223. package/dist/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
  224. package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts +42 -0
  225. package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts.map +1 -0
  226. package/dist/catalog/composites/fairy-cave/fairy-cave.web.js +51 -0
  227. package/dist/catalog/composites/fairy-cave/fairy-cave.web.js.map +1 -0
  228. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts +3 -0
  229. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts.map +1 -0
  230. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js +14 -0
  231. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js.map +1 -0
  232. package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts +42 -0
  233. package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts.map +1 -0
  234. package/dist/catalog/composites/fairy-grotto/fairy-grotto.js +55 -0
  235. package/dist/catalog/composites/fairy-grotto/fairy-grotto.js.map +1 -0
  236. package/dist/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
  237. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts +42 -0
  238. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts.map +1 -0
  239. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js +51 -0
  240. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js.map +1 -0
  241. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts +3 -0
  242. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts.map +1 -0
  243. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js +14 -0
  244. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js.map +1 -0
  245. package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts +42 -0
  246. package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts.map +1 -0
  247. package/dist/catalog/composites/fairy-hollow/fairy-hollow.js +56 -0
  248. package/dist/catalog/composites/fairy-hollow/fairy-hollow.js.map +1 -0
  249. package/dist/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
  250. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts +42 -0
  251. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts.map +1 -0
  252. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js +51 -0
  253. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js.map +1 -0
  254. package/dist/catalog/composites/nebula/nebula.controls.d.ts +3 -0
  255. package/dist/catalog/composites/nebula/nebula.controls.d.ts.map +1 -0
  256. package/dist/catalog/composites/nebula/nebula.controls.js +11 -0
  257. package/dist/catalog/composites/nebula/nebula.controls.js.map +1 -0
  258. package/dist/catalog/composites/nebula/nebula.d.ts +22 -0
  259. package/dist/catalog/composites/nebula/nebula.d.ts.map +1 -0
  260. package/dist/catalog/composites/nebula/nebula.js +38 -0
  261. package/dist/catalog/composites/nebula/nebula.js.map +1 -0
  262. package/dist/catalog/composites/nebula/nebula.thumb.webp +0 -0
  263. package/dist/catalog/composites/nebula/nebula.web.d.ts +22 -0
  264. package/dist/catalog/composites/nebula/nebula.web.d.ts.map +1 -0
  265. package/dist/catalog/composites/nebula/nebula.web.js +34 -0
  266. package/dist/catalog/composites/nebula/nebula.web.js.map +1 -0
  267. package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts +3 -0
  268. package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts.map +1 -0
  269. package/dist/catalog/composites/observation-deck/observation-deck.controls.js +13 -0
  270. package/dist/catalog/composites/observation-deck/observation-deck.controls.js.map +1 -0
  271. package/dist/catalog/composites/observation-deck/observation-deck.d.ts +41 -0
  272. package/dist/catalog/composites/observation-deck/observation-deck.d.ts.map +1 -0
  273. package/dist/catalog/composites/observation-deck/observation-deck.js +60 -0
  274. package/dist/catalog/composites/observation-deck/observation-deck.js.map +1 -0
  275. package/dist/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
  276. package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts +41 -0
  277. package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts.map +1 -0
  278. package/dist/catalog/composites/observation-deck/observation-deck.web.js +54 -0
  279. package/dist/catalog/composites/observation-deck/observation-deck.web.js.map +1 -0
  280. package/dist/catalog/composites/simianlights/simianlights.controls.d.ts +3 -0
  281. package/dist/catalog/composites/simianlights/simianlights.controls.d.ts.map +1 -0
  282. package/dist/catalog/composites/simianlights/simianlights.controls.js +11 -0
  283. package/dist/catalog/composites/simianlights/simianlights.controls.js.map +1 -0
  284. package/dist/catalog/composites/simianlights/simianlights.d.ts +22 -0
  285. package/dist/catalog/composites/simianlights/simianlights.d.ts.map +1 -0
  286. package/dist/catalog/composites/simianlights/simianlights.js +30 -0
  287. package/dist/catalog/composites/simianlights/simianlights.js.map +1 -0
  288. package/dist/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
  289. package/dist/catalog/composites/simianlights/simianlights.web.d.ts +22 -0
  290. package/dist/catalog/composites/simianlights/simianlights.web.d.ts.map +1 -0
  291. package/dist/catalog/composites/simianlights/simianlights.web.js +33 -0
  292. package/dist/catalog/composites/simianlights/simianlights.web.js.map +1 -0
  293. package/dist/catalog/composites/underwater/underwater.controls.d.ts +3 -0
  294. package/dist/catalog/composites/underwater/underwater.controls.d.ts.map +1 -0
  295. package/dist/catalog/composites/underwater/underwater.controls.js +11 -0
  296. package/dist/catalog/composites/underwater/underwater.controls.js.map +1 -0
  297. package/dist/catalog/composites/underwater/underwater.d.ts +30 -0
  298. package/dist/catalog/composites/underwater/underwater.d.ts.map +1 -0
  299. package/dist/catalog/composites/underwater/underwater.js +43 -0
  300. package/dist/catalog/composites/underwater/underwater.js.map +1 -0
  301. package/dist/catalog/composites/underwater/underwater.thumb.webp +0 -0
  302. package/dist/catalog/composites/underwater/underwater.web.d.ts +30 -0
  303. package/dist/catalog/composites/underwater/underwater.web.d.ts.map +1 -0
  304. package/dist/catalog/composites/underwater/underwater.web.js +40 -0
  305. package/dist/catalog/composites/underwater/underwater.web.js.map +1 -0
  306. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts +3 -0
  307. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts.map +1 -0
  308. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js +15 -0
  309. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js.map +1 -0
  310. package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts +31 -0
  311. package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts.map +1 -0
  312. package/dist/catalog/composites/wizard-tower/wizard-tower.js +45 -0
  313. package/dist/catalog/composites/wizard-tower/wizard-tower.js.map +1 -0
  314. package/dist/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
  315. package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts +31 -0
  316. package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts.map +1 -0
  317. package/dist/catalog/composites/wizard-tower/wizard-tower.web.js +39 -0
  318. package/dist/catalog/composites/wizard-tower/wizard-tower.web.js.map +1 -0
  319. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts +3 -0
  320. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts.map +1 -0
  321. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js +14 -0
  322. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js.map +1 -0
  323. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts +31 -0
  324. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts.map +1 -0
  325. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js +44 -0
  326. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js.map +1 -0
  327. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
  328. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts +31 -0
  329. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts.map +1 -0
  330. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js +39 -0
  331. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js.map +1 -0
  332. package/dist/catalog/images/corporate/corporate-logo.d.ts +3 -0
  333. package/dist/catalog/images/corporate/corporate-logo.d.ts.map +1 -0
  334. package/dist/catalog/images/corporate/corporate-logo.js +8 -0
  335. package/dist/catalog/images/corporate/corporate-logo.js.map +1 -0
  336. package/dist/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
  337. package/dist/catalog/images/corporate/corporate-logo.web.d.ts +3 -0
  338. package/dist/catalog/images/corporate/corporate-logo.web.d.ts.map +1 -0
  339. package/dist/catalog/images/corporate/corporate-logo.web.js +12 -0
  340. package/dist/catalog/images/corporate/corporate-logo.web.js.map +1 -0
  341. package/dist/catalog/images/corporate/corporate-logo.webp +0 -0
  342. package/dist/catalog/images/debug/debug-resolutions.d.ts +3 -0
  343. package/dist/catalog/images/debug/debug-resolutions.d.ts.map +1 -0
  344. package/dist/catalog/images/debug/debug-resolutions.js +8 -0
  345. package/dist/catalog/images/debug/debug-resolutions.js.map +1 -0
  346. package/dist/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
  347. package/dist/catalog/images/debug/debug-resolutions.web.d.ts +3 -0
  348. package/dist/catalog/images/debug/debug-resolutions.web.d.ts.map +1 -0
  349. package/dist/catalog/images/debug/debug-resolutions.web.js +12 -0
  350. package/dist/catalog/images/debug/debug-resolutions.web.js.map +1 -0
  351. package/dist/catalog/images/fairy-caves/grotto.d.ts +3 -0
  352. package/dist/catalog/images/fairy-caves/grotto.d.ts.map +1 -0
  353. package/dist/catalog/images/fairy-caves/grotto.js +8 -0
  354. package/dist/catalog/images/fairy-caves/grotto.js.map +1 -0
  355. package/dist/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
  356. package/dist/catalog/images/fairy-caves/grotto.web.d.ts +3 -0
  357. package/dist/catalog/images/fairy-caves/grotto.web.d.ts.map +1 -0
  358. package/dist/catalog/images/fairy-caves/grotto.web.js +12 -0
  359. package/dist/catalog/images/fairy-caves/grotto.web.js.map +1 -0
  360. package/dist/catalog/images/fairy-caves/grotto.webp +0 -0
  361. package/dist/catalog/images/fairy-caves/hollow.d.ts +3 -0
  362. package/dist/catalog/images/fairy-caves/hollow.d.ts.map +1 -0
  363. package/dist/catalog/images/fairy-caves/hollow.js +8 -0
  364. package/dist/catalog/images/fairy-caves/hollow.js.map +1 -0
  365. package/dist/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
  366. package/dist/catalog/images/fairy-caves/hollow.web.d.ts +3 -0
  367. package/dist/catalog/images/fairy-caves/hollow.web.d.ts.map +1 -0
  368. package/dist/catalog/images/fairy-caves/hollow.web.js +12 -0
  369. package/dist/catalog/images/fairy-caves/hollow.web.js.map +1 -0
  370. package/dist/catalog/images/fairy-caves/hollow.webp +0 -0
  371. package/dist/catalog/images/fairy-caves/treehouse-2.d.ts +3 -0
  372. package/dist/catalog/images/fairy-caves/treehouse-2.d.ts.map +1 -0
  373. package/dist/catalog/images/fairy-caves/treehouse-2.js +8 -0
  374. package/dist/catalog/images/fairy-caves/treehouse-2.js.map +1 -0
  375. package/dist/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
  376. package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts +3 -0
  377. package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts.map +1 -0
  378. package/dist/catalog/images/fairy-caves/treehouse-2.web.js +12 -0
  379. package/dist/catalog/images/fairy-caves/treehouse-2.web.js.map +1 -0
  380. package/dist/catalog/images/fairy-caves/treehouse-2.webp +0 -0
  381. package/dist/catalog/images/fairy-caves/treehouse-3.d.ts +3 -0
  382. package/dist/catalog/images/fairy-caves/treehouse-3.d.ts.map +1 -0
  383. package/dist/catalog/images/fairy-caves/treehouse-3.js +8 -0
  384. package/dist/catalog/images/fairy-caves/treehouse-3.js.map +1 -0
  385. package/dist/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
  386. package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts +3 -0
  387. package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts.map +1 -0
  388. package/dist/catalog/images/fairy-caves/treehouse-3.web.js +12 -0
  389. package/dist/catalog/images/fairy-caves/treehouse-3.web.js.map +1 -0
  390. package/dist/catalog/images/fairy-caves/treehouse-3.webp +0 -0
  391. package/dist/catalog/images/fairy-caves/treehouse.d.ts +3 -0
  392. package/dist/catalog/images/fairy-caves/treehouse.d.ts.map +1 -0
  393. package/dist/catalog/images/fairy-caves/treehouse.js +8 -0
  394. package/dist/catalog/images/fairy-caves/treehouse.js.map +1 -0
  395. package/dist/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
  396. package/dist/catalog/images/fairy-caves/treehouse.web.d.ts +3 -0
  397. package/dist/catalog/images/fairy-caves/treehouse.web.d.ts.map +1 -0
  398. package/dist/catalog/images/fairy-caves/treehouse.web.js +12 -0
  399. package/dist/catalog/images/fairy-caves/treehouse.web.js.map +1 -0
  400. package/dist/catalog/images/fairy-caves/treehouse.webp +0 -0
  401. package/dist/catalog/images/home/home-dark.d.ts +3 -0
  402. package/dist/catalog/images/home/home-dark.d.ts.map +1 -0
  403. package/dist/catalog/images/home/home-dark.js +8 -0
  404. package/dist/catalog/images/home/home-dark.js.map +1 -0
  405. package/dist/catalog/images/home/home-dark.thumb.webp +0 -0
  406. package/dist/catalog/images/home/home-dark.web.d.ts +3 -0
  407. package/dist/catalog/images/home/home-dark.web.d.ts.map +1 -0
  408. package/dist/catalog/images/home/home-dark.web.js +12 -0
  409. package/dist/catalog/images/home/home-dark.web.js.map +1 -0
  410. package/dist/catalog/images/home/home-light.d.ts +3 -0
  411. package/dist/catalog/images/home/home-light.d.ts.map +1 -0
  412. package/dist/catalog/images/home/home-light.js +8 -0
  413. package/dist/catalog/images/home/home-light.js.map +1 -0
  414. package/dist/catalog/images/home/home-light.thumb.webp +0 -0
  415. package/dist/catalog/images/home/home-light.web.d.ts +3 -0
  416. package/dist/catalog/images/home/home-light.web.d.ts.map +1 -0
  417. package/dist/catalog/images/home/home-light.web.js +12 -0
  418. package/dist/catalog/images/home/home-light.web.js.map +1 -0
  419. package/dist/catalog/images/image-ids.d.ts +3 -0
  420. package/dist/catalog/images/image-ids.d.ts.map +1 -0
  421. package/dist/catalog/images/image-ids.js +43 -0
  422. package/dist/catalog/images/image-ids.js.map +1 -0
  423. package/dist/catalog/images/image.types.d.ts +2 -0
  424. package/dist/catalog/images/image.types.d.ts.map +1 -0
  425. package/dist/catalog/images/image.types.js +3 -0
  426. package/dist/catalog/images/image.types.js.map +1 -0
  427. package/dist/catalog/images/index.d.ts +3 -0
  428. package/dist/catalog/images/index.d.ts.map +1 -0
  429. package/dist/catalog/images/index.js +10 -0
  430. package/dist/catalog/images/index.js.map +1 -0
  431. package/dist/catalog/images/nature/landscape-dark.d.ts +3 -0
  432. package/dist/catalog/images/nature/landscape-dark.d.ts.map +1 -0
  433. package/dist/catalog/images/nature/landscape-dark.js +8 -0
  434. package/dist/catalog/images/nature/landscape-dark.js.map +1 -0
  435. package/dist/catalog/images/nature/landscape-dark.thumb.webp +0 -0
  436. package/dist/catalog/images/nature/landscape-dark.web.d.ts +3 -0
  437. package/dist/catalog/images/nature/landscape-dark.web.d.ts.map +1 -0
  438. package/dist/catalog/images/nature/landscape-dark.web.js +12 -0
  439. package/dist/catalog/images/nature/landscape-dark.web.js.map +1 -0
  440. package/dist/catalog/images/nature/landscape-light.d.ts +3 -0
  441. package/dist/catalog/images/nature/landscape-light.d.ts.map +1 -0
  442. package/dist/catalog/images/nature/landscape-light.js +8 -0
  443. package/dist/catalog/images/nature/landscape-light.js.map +1 -0
  444. package/dist/catalog/images/nature/landscape-light.thumb.webp +0 -0
  445. package/dist/catalog/images/nature/landscape-light.web.d.ts +3 -0
  446. package/dist/catalog/images/nature/landscape-light.web.d.ts.map +1 -0
  447. package/dist/catalog/images/nature/landscape-light.web.js +12 -0
  448. package/dist/catalog/images/nature/landscape-light.web.js.map +1 -0
  449. package/dist/catalog/images/office/office-dark.d.ts +3 -0
  450. package/dist/catalog/images/office/office-dark.d.ts.map +1 -0
  451. package/dist/catalog/images/office/office-dark.js +8 -0
  452. package/dist/catalog/images/office/office-dark.js.map +1 -0
  453. package/dist/catalog/images/office/office-dark.thumb.webp +0 -0
  454. package/dist/catalog/images/office/office-dark.web.d.ts +3 -0
  455. package/dist/catalog/images/office/office-dark.web.d.ts.map +1 -0
  456. package/dist/catalog/images/office/office-dark.web.js +12 -0
  457. package/dist/catalog/images/office/office-dark.web.js.map +1 -0
  458. package/dist/catalog/images/office/office-light.d.ts +3 -0
  459. package/dist/catalog/images/office/office-light.d.ts.map +1 -0
  460. package/dist/catalog/images/office/office-light.js +8 -0
  461. package/dist/catalog/images/office/office-light.js.map +1 -0
  462. package/dist/catalog/images/office/office-light.thumb.webp +0 -0
  463. package/dist/catalog/images/office/office-light.web.d.ts +3 -0
  464. package/dist/catalog/images/office/office-light.web.d.ts.map +1 -0
  465. package/dist/catalog/images/office/office-light.web.js +12 -0
  466. package/dist/catalog/images/office/office-light.web.js.map +1 -0
  467. package/dist/catalog/images/sci-fi/sci-fi-light.d.ts +3 -0
  468. package/dist/catalog/images/sci-fi/sci-fi-light.d.ts.map +1 -0
  469. package/dist/catalog/images/sci-fi/sci-fi-light.js +8 -0
  470. package/dist/catalog/images/sci-fi/sci-fi-light.js.map +1 -0
  471. package/dist/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
  472. package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts +3 -0
  473. package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts.map +1 -0
  474. package/dist/catalog/images/sci-fi/sci-fi-light.web.js +12 -0
  475. package/dist/catalog/images/sci-fi/sci-fi-light.web.js.map +1 -0
  476. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts +3 -0
  477. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts.map +1 -0
  478. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js +8 -0
  479. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js.map +1 -0
  480. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
  481. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts +3 -0
  482. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts.map +1 -0
  483. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js +12 -0
  484. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js.map +1 -0
  485. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
  486. package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts +3 -0
  487. package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts.map +1 -0
  488. package/dist/catalog/images/simiancraft/simiancraft-dark.js +8 -0
  489. package/dist/catalog/images/simiancraft/simiancraft-dark.js.map +1 -0
  490. package/dist/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
  491. package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts +3 -0
  492. package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts.map +1 -0
  493. package/dist/catalog/images/simiancraft/simiancraft-dark.web.js +12 -0
  494. package/dist/catalog/images/simiancraft/simiancraft-dark.web.js.map +1 -0
  495. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts +3 -0
  496. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts.map +1 -0
  497. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js +8 -0
  498. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js.map +1 -0
  499. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
  500. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts +3 -0
  501. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts.map +1 -0
  502. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js +12 -0
  503. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js.map +1 -0
  504. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
  505. package/dist/catalog/images/simiancraft/simiancraft-light.d.ts +3 -0
  506. package/dist/catalog/images/simiancraft/simiancraft-light.d.ts.map +1 -0
  507. package/dist/catalog/images/simiancraft/simiancraft-light.js +8 -0
  508. package/dist/catalog/images/simiancraft/simiancraft-light.js.map +1 -0
  509. package/dist/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
  510. package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts +3 -0
  511. package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts.map +1 -0
  512. package/dist/catalog/images/simiancraft/simiancraft-light.web.js +12 -0
  513. package/dist/catalog/images/simiancraft/simiancraft-light.web.js.map +1 -0
  514. package/dist/catalog/images/spaceship/observation-deck.d.ts +3 -0
  515. package/dist/catalog/images/spaceship/observation-deck.d.ts.map +1 -0
  516. package/dist/catalog/images/spaceship/observation-deck.js +8 -0
  517. package/dist/catalog/images/spaceship/observation-deck.js.map +1 -0
  518. package/dist/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
  519. package/dist/catalog/images/spaceship/observation-deck.web.d.ts +3 -0
  520. package/dist/catalog/images/spaceship/observation-deck.web.d.ts.map +1 -0
  521. package/dist/catalog/images/spaceship/observation-deck.web.js +12 -0
  522. package/dist/catalog/images/spaceship/observation-deck.web.js.map +1 -0
  523. package/dist/catalog/images/spaceship/observation-deck.webp +0 -0
  524. package/dist/catalog/images/underwater/oceanscape-dark.d.ts +3 -0
  525. package/dist/catalog/images/underwater/oceanscape-dark.d.ts.map +1 -0
  526. package/dist/catalog/images/underwater/oceanscape-dark.js +8 -0
  527. package/dist/catalog/images/underwater/oceanscape-dark.js.map +1 -0
  528. package/dist/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
  529. package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts +3 -0
  530. package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts.map +1 -0
  531. package/dist/catalog/images/underwater/oceanscape-dark.web.js +12 -0
  532. package/dist/catalog/images/underwater/oceanscape-dark.web.js.map +1 -0
  533. package/dist/catalog/images/underwater/oceanscape-dark.webp +0 -0
  534. package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts +3 -0
  535. package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts.map +1 -0
  536. package/dist/catalog/images/wizard-tower/wizard-tower-1.js +8 -0
  537. package/dist/catalog/images/wizard-tower/wizard-tower-1.js.map +1 -0
  538. package/dist/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
  539. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts +3 -0
  540. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts.map +1 -0
  541. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js +12 -0
  542. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js.map +1 -0
  543. package/dist/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
  544. package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts +3 -0
  545. package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts.map +1 -0
  546. package/dist/catalog/images/wizard-tower/wizard-tower-2.js +8 -0
  547. package/dist/catalog/images/wizard-tower/wizard-tower-2.js.map +1 -0
  548. package/dist/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
  549. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts +3 -0
  550. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts.map +1 -0
  551. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js +12 -0
  552. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js.map +1 -0
  553. package/dist/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
  554. package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts +3 -0
  555. package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts.map +1 -0
  556. package/dist/catalog/images/wizard-tower/wizard-tower-night.js +8 -0
  557. package/dist/catalog/images/wizard-tower/wizard-tower-night.js.map +1 -0
  558. package/dist/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
  559. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts +3 -0
  560. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts.map +1 -0
  561. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js +12 -0
  562. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js.map +1 -0
  563. package/dist/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
  564. package/dist/catalog/shaders/_shared/types.d.ts +38 -0
  565. package/dist/catalog/shaders/_shared/types.d.ts.map +1 -0
  566. package/dist/catalog/shaders/_shared/types.js +15 -0
  567. package/dist/catalog/shaders/_shared/types.js.map +1 -0
  568. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts +26 -0
  569. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts.map +1 -0
  570. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts +3 -0
  571. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts.map +1 -0
  572. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js +15 -0
  573. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js.map +1 -0
  574. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js +84 -0
  575. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js.map +1 -0
  576. package/dist/catalog/shaders/blur/blur.d.ts +15 -0
  577. package/dist/catalog/shaders/blur/blur.d.ts.map +1 -0
  578. package/dist/catalog/shaders/blur/blur.form.d.ts +3 -0
  579. package/dist/catalog/shaders/blur/blur.form.d.ts.map +1 -0
  580. package/dist/catalog/shaders/blur/blur.form.js +15 -0
  581. package/dist/catalog/shaders/blur/blur.form.js.map +1 -0
  582. package/dist/catalog/shaders/blur/blur.js +27 -0
  583. package/dist/catalog/shaders/blur/blur.js.map +1 -0
  584. package/dist/catalog/shaders/clouds/clouds.d.ts +34 -0
  585. package/dist/catalog/shaders/clouds/clouds.d.ts.map +1 -0
  586. package/dist/catalog/shaders/clouds/clouds.form.d.ts +3 -0
  587. package/dist/catalog/shaders/clouds/clouds.form.d.ts.map +1 -0
  588. package/dist/catalog/shaders/clouds/clouds.form.js +15 -0
  589. package/dist/catalog/shaders/clouds/clouds.form.js.map +1 -0
  590. package/dist/catalog/shaders/clouds/clouds.js +98 -0
  591. package/dist/catalog/shaders/clouds/clouds.js.map +1 -0
  592. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts +40 -0
  593. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts.map +1 -0
  594. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts +3 -0
  595. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts.map +1 -0
  596. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js +15 -0
  597. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js.map +1 -0
  598. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js +100 -0
  599. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js.map +1 -0
  600. package/dist/catalog/shaders/fireflies/fireflies.d.ts +18 -0
  601. package/dist/catalog/shaders/fireflies/fireflies.d.ts.map +1 -0
  602. package/dist/catalog/shaders/fireflies/fireflies.form.d.ts +3 -0
  603. package/dist/catalog/shaders/fireflies/fireflies.form.d.ts.map +1 -0
  604. package/dist/catalog/shaders/fireflies/fireflies.form.js +15 -0
  605. package/dist/catalog/shaders/fireflies/fireflies.form.js.map +1 -0
  606. package/dist/catalog/shaders/fireflies/fireflies.js +47 -0
  607. package/dist/catalog/shaders/fireflies/fireflies.js.map +1 -0
  608. package/dist/catalog/shaders/godrays/godrays.d.ts +26 -0
  609. package/dist/catalog/shaders/godrays/godrays.d.ts.map +1 -0
  610. package/dist/catalog/shaders/godrays/godrays.form.d.ts +3 -0
  611. package/dist/catalog/shaders/godrays/godrays.form.d.ts.map +1 -0
  612. package/dist/catalog/shaders/godrays/godrays.form.js +15 -0
  613. package/dist/catalog/shaders/godrays/godrays.form.js.map +1 -0
  614. package/dist/catalog/shaders/godrays/godrays.js +83 -0
  615. package/dist/catalog/shaders/godrays/godrays.js.map +1 -0
  616. package/dist/catalog/shaders/index.d.ts +73 -0
  617. package/dist/catalog/shaders/index.d.ts.map +1 -0
  618. package/dist/catalog/shaders/index.js +30 -0
  619. package/dist/catalog/shaders/index.js.map +1 -0
  620. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts +44 -0
  621. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts.map +1 -0
  622. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts +3 -0
  623. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts.map +1 -0
  624. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js +16 -0
  625. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js.map +1 -0
  626. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js +91 -0
  627. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js.map +1 -0
  628. package/dist/catalog/shaders/nebula/nebula.d.ts +20 -0
  629. package/dist/catalog/shaders/nebula/nebula.d.ts.map +1 -0
  630. package/dist/catalog/shaders/nebula/nebula.form.d.ts +3 -0
  631. package/dist/catalog/shaders/nebula/nebula.form.d.ts.map +1 -0
  632. package/dist/catalog/shaders/nebula/nebula.form.js +15 -0
  633. package/dist/catalog/shaders/nebula/nebula.form.js.map +1 -0
  634. package/dist/catalog/shaders/nebula/nebula.js +58 -0
  635. package/dist/catalog/shaders/nebula/nebula.js.map +1 -0
  636. package/dist/catalog/shaders/plasma/plasma.d.ts +16 -0
  637. package/dist/catalog/shaders/plasma/plasma.d.ts.map +1 -0
  638. package/dist/catalog/shaders/plasma/plasma.form.d.ts +3 -0
  639. package/dist/catalog/shaders/plasma/plasma.form.d.ts.map +1 -0
  640. package/dist/catalog/shaders/plasma/plasma.form.js +15 -0
  641. package/dist/catalog/shaders/plasma/plasma.form.js.map +1 -0
  642. package/dist/catalog/shaders/plasma/plasma.js +32 -0
  643. package/dist/catalog/shaders/plasma/plasma.js.map +1 -0
  644. package/dist/catalog/shaders/simianlights/simianlights.d.ts +20 -0
  645. package/dist/catalog/shaders/simianlights/simianlights.d.ts.map +1 -0
  646. package/dist/catalog/shaders/simianlights/simianlights.form.d.ts +3 -0
  647. package/dist/catalog/shaders/simianlights/simianlights.form.d.ts.map +1 -0
  648. package/dist/catalog/shaders/simianlights/simianlights.form.js +15 -0
  649. package/dist/catalog/shaders/simianlights/simianlights.form.js.map +1 -0
  650. package/dist/catalog/shaders/simianlights/simianlights.js +57 -0
  651. package/dist/catalog/shaders/simianlights/simianlights.js.map +1 -0
  652. package/dist/src/components/form/control-form.d.ts +37 -0
  653. package/dist/src/components/form/control-form.d.ts.map +1 -0
  654. package/dist/src/components/form/control-form.js +55 -0
  655. package/dist/src/components/form/control-form.js.map +1 -0
  656. package/dist/src/components/form/make-controls.d.ts +22 -0
  657. package/dist/src/components/form/make-controls.d.ts.map +1 -0
  658. package/dist/src/components/form/make-controls.js +19 -0
  659. package/dist/src/components/form/make-controls.js.map +1 -0
  660. package/dist/src/components/form/scope.d.ts +2 -0
  661. package/dist/src/components/form/scope.d.ts.map +1 -0
  662. package/dist/src/components/form/scope.js +11 -0
  663. package/dist/src/components/form/scope.js.map +1 -0
  664. package/dist/src/components/form/use-field.d.ts +10 -0
  665. package/dist/src/components/form/use-field.d.ts.map +1 -0
  666. package/dist/src/components/form/use-field.js +27 -0
  667. package/dist/src/components/form/use-field.js.map +1 -0
  668. package/dist/src/components/preset-book-menu/index.d.ts +52 -0
  669. package/dist/src/components/preset-book-menu/index.d.ts.map +1 -0
  670. package/dist/src/components/preset-book-menu/index.js +152 -0
  671. package/dist/src/components/preset-book-menu/index.js.map +1 -0
  672. package/dist/src/components/preset-book-menu/layout.d.ts +25 -0
  673. package/dist/src/components/preset-book-menu/layout.d.ts.map +1 -0
  674. package/dist/src/components/preset-book-menu/layout.js +19 -0
  675. package/dist/src/components/preset-book-menu/layout.js.map +1 -0
  676. package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts +88 -0
  677. package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts.map +1 -0
  678. package/dist/src/components/preset-book-menu/preset-book-menu.types.js +14 -0
  679. package/dist/src/components/preset-book-menu/preset-book-menu.types.js.map +1 -0
  680. package/dist/src/components/preset-book-menu/preset-grid.d.ts +16 -0
  681. package/dist/src/components/preset-book-menu/preset-grid.d.ts.map +1 -0
  682. package/dist/src/components/preset-book-menu/preset-grid.js +49 -0
  683. package/dist/src/components/preset-book-menu/preset-grid.js.map +1 -0
  684. package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts +3 -0
  685. package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts.map +1 -0
  686. package/dist/src/components/preset-book-menu/resolve-image-uri.js +28 -0
  687. package/dist/src/components/preset-book-menu/resolve-image-uri.js.map +1 -0
  688. package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts +13 -0
  689. package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts.map +1 -0
  690. package/dist/src/components/preset-book-menu/resolve-image-uri.types.js +5 -0
  691. package/dist/src/components/preset-book-menu/resolve-image-uri.types.js.map +1 -0
  692. package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts +3 -0
  693. package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts.map +1 -0
  694. package/dist/src/components/preset-book-menu/resolve-image-uri.web.js +17 -0
  695. package/dist/src/components/preset-book-menu/resolve-image-uri.web.js.map +1 -0
  696. package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts +14 -0
  697. package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts.map +1 -0
  698. package/dist/src/components/preset-control-panel/composite-layer-control-panel.js +36 -0
  699. package/dist/src/components/preset-control-panel/composite-layer-control-panel.js.map +1 -0
  700. package/dist/src/components/preset-control-panel/control-section.d.ts +9 -0
  701. package/dist/src/components/preset-control-panel/control-section.d.ts.map +1 -0
  702. package/dist/src/components/preset-control-panel/control-section.js +47 -0
  703. package/dist/src/components/preset-control-panel/control-section.js.map +1 -0
  704. package/dist/src/components/preset-control-panel/control.d.ts +10 -0
  705. package/dist/src/components/preset-control-panel/control.d.ts.map +1 -0
  706. package/dist/src/components/preset-control-panel/control.js +35 -0
  707. package/dist/src/components/preset-control-panel/control.js.map +1 -0
  708. package/dist/src/components/preset-control-panel/index.d.ts +14 -0
  709. package/dist/src/components/preset-control-panel/index.d.ts.map +1 -0
  710. package/dist/src/components/preset-control-panel/index.js +49 -0
  711. package/dist/src/components/preset-control-panel/index.js.map +1 -0
  712. package/dist/src/components/preset-control-panel/mask-control-panel.d.ts +11 -0
  713. package/dist/src/components/preset-control-panel/mask-control-panel.d.ts.map +1 -0
  714. package/dist/src/components/preset-control-panel/mask-control-panel.js +34 -0
  715. package/dist/src/components/preset-control-panel/mask-control-panel.js.map +1 -0
  716. package/dist/src/components/preset-control-panel/preset-control-panel.d.ts +12 -0
  717. package/dist/src/components/preset-control-panel/preset-control-panel.d.ts.map +1 -0
  718. package/dist/src/components/preset-control-panel/preset-control-panel.js +23 -0
  719. package/dist/src/components/preset-control-panel/preset-control-panel.js.map +1 -0
  720. package/dist/src/components/preset-control-panel/transform-control-panel.d.ts +14 -0
  721. package/dist/src/components/preset-control-panel/transform-control-panel.d.ts.map +1 -0
  722. package/dist/src/components/preset-control-panel/transform-control-panel.js +58 -0
  723. package/dist/src/components/preset-control-panel/transform-control-panel.js.map +1 -0
  724. package/dist/src/components/preset-tile/index.d.ts +24 -0
  725. package/dist/src/components/preset-tile/index.d.ts.map +1 -0
  726. package/dist/src/components/preset-tile/index.js +98 -0
  727. package/dist/src/components/preset-tile/index.js.map +1 -0
  728. package/dist/src/components/theme/provider.d.ts +18 -0
  729. package/dist/src/components/theme/provider.d.ts.map +1 -0
  730. package/dist/src/components/theme/provider.js +29 -0
  731. package/dist/src/components/theme/provider.js.map +1 -0
  732. package/dist/src/components/theme/slots.d.ts +17 -0
  733. package/dist/src/components/theme/slots.d.ts.map +1 -0
  734. package/dist/src/components/theme/slots.js +9 -0
  735. package/dist/src/components/theme/slots.js.map +1 -0
  736. package/dist/src/components/ui/button.d.ts +14 -0
  737. package/dist/src/components/ui/button.d.ts.map +1 -0
  738. package/dist/src/components/ui/button.js +29 -0
  739. package/dist/src/components/ui/button.js.map +1 -0
  740. package/dist/src/components/ui/color-picker.d.ts +12 -0
  741. package/dist/src/components/ui/color-picker.d.ts.map +1 -0
  742. package/dist/src/components/ui/color-picker.js +43 -0
  743. package/dist/src/components/ui/color-picker.js.map +1 -0
  744. package/dist/src/components/ui/index.d.ts +6 -0
  745. package/dist/src/components/ui/index.d.ts.map +1 -0
  746. package/dist/src/components/ui/index.js +18 -0
  747. package/dist/src/components/ui/index.js.map +1 -0
  748. package/dist/src/components/ui/label.d.ts +10 -0
  749. package/dist/src/components/ui/label.d.ts.map +1 -0
  750. package/dist/src/components/ui/label.js +14 -0
  751. package/dist/src/components/ui/label.js.map +1 -0
  752. package/dist/src/components/ui/point.d.ts +19 -0
  753. package/dist/src/components/ui/point.d.ts.map +1 -0
  754. package/dist/src/components/ui/point.js +52 -0
  755. package/dist/src/components/ui/point.js.map +1 -0
  756. package/dist/src/components/ui/polygon-field.d.ts +10 -0
  757. package/dist/src/components/ui/polygon-field.d.ts.map +1 -0
  758. package/dist/src/components/ui/polygon-field.js +50 -0
  759. package/dist/src/components/ui/polygon-field.js.map +1 -0
  760. package/dist/src/components/ui/readout.d.ts +10 -0
  761. package/dist/src/components/ui/readout.d.ts.map +1 -0
  762. package/dist/src/components/ui/readout.js +14 -0
  763. package/dist/src/components/ui/readout.js.map +1 -0
  764. package/dist/src/components/ui/slider-value.d.ts +8 -0
  765. package/dist/src/components/ui/slider-value.d.ts.map +1 -0
  766. package/dist/src/components/ui/slider-value.js +17 -0
  767. package/dist/src/components/ui/slider-value.js.map +1 -0
  768. package/dist/src/components/ui/slider.d.ts +15 -0
  769. package/dist/src/components/ui/slider.d.ts.map +1 -0
  770. package/dist/src/components/ui/slider.js +58 -0
  771. package/dist/src/components/ui/slider.js.map +1 -0
  772. package/dist/src/components/ui/switch.d.ts +8 -0
  773. package/dist/src/components/ui/switch.d.ts.map +1 -0
  774. package/dist/src/components/ui/switch.js +24 -0
  775. package/dist/src/components/ui/switch.js.map +1 -0
  776. package/dist/src/index.d.ts +18 -0
  777. package/dist/src/index.d.ts.map +1 -0
  778. package/dist/src/index.js +187 -0
  779. package/dist/src/index.js.map +1 -0
  780. package/dist/src/index.web.d.ts +32 -0
  781. package/dist/src/index.web.d.ts.map +1 -0
  782. package/dist/src/index.web.js +119 -0
  783. package/dist/src/index.web.js.map +1 -0
  784. package/dist/src/kaleidoscope/controls.d.ts +24 -0
  785. package/dist/src/kaleidoscope/controls.d.ts.map +1 -0
  786. package/dist/src/kaleidoscope/controls.js +92 -0
  787. package/dist/src/kaleidoscope/controls.js.map +1 -0
  788. package/dist/src/kaleidoscope/effect.d.ts +4 -0
  789. package/dist/src/kaleidoscope/effect.d.ts.map +1 -0
  790. package/dist/src/kaleidoscope/effect.js +7 -0
  791. package/dist/src/kaleidoscope/effect.js.map +1 -0
  792. package/dist/src/kaleidoscope/effect.types.d.ts +47 -0
  793. package/dist/src/kaleidoscope/effect.types.d.ts.map +1 -0
  794. package/dist/src/kaleidoscope/effect.types.js +9 -0
  795. package/dist/src/kaleidoscope/effect.types.js.map +1 -0
  796. package/dist/src/kaleidoscope/shader-to-spec.d.ts +4 -0
  797. package/dist/src/kaleidoscope/shader-to-spec.d.ts.map +1 -0
  798. package/dist/src/kaleidoscope/shader-to-spec.js +17 -0
  799. package/dist/src/kaleidoscope/shader-to-spec.js.map +1 -0
  800. package/dist/src/kaleidoscope/types.d.ts +79 -0
  801. package/dist/src/kaleidoscope/types.d.ts.map +1 -0
  802. package/dist/src/kaleidoscope/types.js +18 -0
  803. package/dist/src/kaleidoscope/types.js.map +1 -0
  804. package/dist/src/kaleidoscope.preset-book.types.d.ts +86 -0
  805. package/dist/src/kaleidoscope.preset-book.types.d.ts.map +1 -0
  806. package/dist/src/kaleidoscope.preset-book.types.js +16 -0
  807. package/dist/src/kaleidoscope.preset-book.types.js.map +1 -0
  808. package/dist/src/lib/primitives.types.d.ts +3 -0
  809. package/dist/src/lib/primitives.types.d.ts.map +1 -0
  810. package/dist/src/lib/primitives.types.js +5 -0
  811. package/dist/src/lib/primitives.types.js.map +1 -0
  812. package/dist/src/lib/test-id.d.ts +30 -0
  813. package/dist/src/lib/test-id.d.ts.map +1 -0
  814. package/dist/src/lib/test-id.js +81 -0
  815. package/dist/src/lib/test-id.js.map +1 -0
  816. package/dist/src/livekit.d.ts +24 -0
  817. package/dist/src/livekit.d.ts.map +1 -0
  818. package/dist/src/livekit.js +63 -0
  819. package/dist/src/livekit.js.map +1 -0
  820. package/dist/src/nativewind.d.ts +7 -0
  821. package/dist/src/nativewind.d.ts.map +1 -0
  822. package/dist/src/nativewind.js +43 -0
  823. package/dist/src/nativewind.js.map +1 -0
  824. package/dist/web-driver/effects/composite.d.ts +14 -0
  825. package/dist/web-driver/effects/composite.d.ts.map +1 -0
  826. package/dist/web-driver/effects/composite.js +576 -0
  827. package/dist/web-driver/effects/composite.js.map +1 -0
  828. package/dist/web-driver/effects/layer-shaders.d.ts +2 -0
  829. package/dist/web-driver/effects/layer-shaders.d.ts.map +1 -0
  830. package/dist/web-driver/effects/layer-shaders.js +11 -0
  831. package/dist/web-driver/effects/layer-shaders.js.map +1 -0
  832. package/dist/web-driver/effects/transform.d.ts +4 -0
  833. package/dist/web-driver/effects/transform.d.ts.map +1 -0
  834. package/dist/web-driver/effects/transform.js +66 -0
  835. package/dist/web-driver/effects/transform.js.map +1 -0
  836. package/dist/web-driver/index.d.ts +6 -0
  837. package/dist/web-driver/index.d.ts.map +1 -0
  838. package/dist/web-driver/index.js +21 -0
  839. package/dist/web-driver/index.js.map +1 -0
  840. package/dist/web-driver/insertable-streams.d.ts.map +1 -0
  841. package/dist/web-driver/insertable-streams.js +68 -0
  842. package/dist/web-driver/insertable-streams.js.map +1 -0
  843. package/dist/web-driver/segmenter.d.ts.map +1 -0
  844. package/dist/web-driver/segmenter.js +89 -0
  845. package/dist/web-driver/segmenter.js.map +1 -0
  846. package/dist/web-driver/shaders.d.ts +2 -0
  847. package/dist/web-driver/shaders.d.ts.map +1 -0
  848. package/dist/web-driver/shaders.generated.d.ts +17 -0
  849. package/dist/web-driver/shaders.generated.d.ts.map +1 -0
  850. package/dist/web-driver/shaders.generated.js +1180 -0
  851. package/dist/web-driver/shaders.generated.js.map +1 -0
  852. package/dist/web-driver/shaders.js +28 -0
  853. package/dist/web-driver/shaders.js.map +1 -0
  854. package/dist/web-driver/tuning.d.ts.map +1 -0
  855. package/dist/web-driver/tuning.js +61 -0
  856. package/dist/web-driver/tuning.js.map +1 -0
  857. package/ios/Kaleidoscope.podspec +22 -15
  858. package/ios/KaleidoscopeModule/BundledImage.swift +39 -0
  859. package/ios/KaleidoscopeModule/CompositeLayers.swift +142 -0
  860. package/ios/KaleidoscopeModule/EffectTuning.swift +86 -86
  861. package/ios/KaleidoscopeModule/KaleidoscopeModule.swift +55 -27
  862. package/ios/KaleidoscopeModule/Registration.swift +36 -57
  863. package/ios/KaleidoscopeModule/effects/CompositeProcessor.swift +906 -0
  864. package/ios/KaleidoscopeModule/effects/FrameBridge.swift +25 -25
  865. package/ios/KaleidoscopeModule/effects/TransformProcessor.swift +127 -126
  866. package/ios/KaleidoscopeModule/gpu/CompositeRendering.swift +352 -0
  867. package/ios/KaleidoscopeModule/gpu/Ingest.swift +104 -102
  868. package/ios/KaleidoscopeModule/gpu/MetalRenderer.swift +473 -544
  869. package/ios/KaleidoscopeModule/gpu/Orientation.swift +41 -41
  870. package/ios/KaleidoscopeModule/gpu/ShaderLibrary.swift +100 -54
  871. package/ios/KaleidoscopeModule/gpu/TextureBridge.swift +245 -244
  872. package/ios/KaleidoscopeModule/segmentation/MaskTuning.swift +11 -11
  873. package/ios/KaleidoscopeModule/segmentation/Segmenter.swift +360 -359
  874. package/ios/KaleidoscopeModule/shaders/GENERATIVE.txt +9 -0
  875. package/ios/KaleidoscopeModule/shaders/SHADERS.txt +13 -2
  876. package/ios/KaleidoscopeModule/shaders/anamorphic-lensflare.metalsrc +47 -0
  877. package/ios/KaleidoscopeModule/shaders/clouds.metalsrc +185 -0
  878. package/ios/KaleidoscopeModule/shaders/composite-blit.metalsrc +22 -0
  879. package/ios/KaleidoscopeModule/shaders/composite-blur.metalsrc +93 -0
  880. package/ios/KaleidoscopeModule/shaders/composite-camera.metalsrc +22 -0
  881. package/ios/KaleidoscopeModule/shaders/composite-image.metalsrc +24 -0
  882. package/ios/KaleidoscopeModule/shaders/composite-masked.metalsrc +22 -0
  883. package/ios/KaleidoscopeModule/shaders/composite-subject.metalsrc +23 -0
  884. package/ios/KaleidoscopeModule/shaders/corporate-blobs.metalsrc +221 -0
  885. package/ios/KaleidoscopeModule/shaders/fireflies.metalsrc +44 -0
  886. package/ios/KaleidoscopeModule/shaders/godrays.metalsrc +46 -0
  887. package/ios/KaleidoscopeModule/shaders/light-beams-and-motes.metalsrc +316 -0
  888. package/ios/KaleidoscopeModule/shaders/nebula.metalsrc +45 -45
  889. package/ios/KaleidoscopeModule/shaders/plasma.metalsrc +26 -0
  890. package/ios/KaleidoscopeModule/shaders/simianlights.metalsrc +45 -45
  891. package/package.json +485 -115
  892. package/plugin/build/android/assets.js +45 -0
  893. package/plugin/build/android/index.js +34 -0
  894. package/plugin/build/index.js +39 -0
  895. package/plugin/build/ios/assets.js +110 -0
  896. package/plugin/build/ios/deployment-target.js +105 -0
  897. package/plugin/build/ios/index.js +63 -0
  898. package/plugin/build/ios/pods.js +73 -0
  899. package/plugin/build/lib/constants.js +15 -0
  900. package/plugin/build/lib/file-manipulation.js +57 -0
  901. package/plugin/build/lib/mods.js +36 -0
  902. package/plugin/build/lib/preset-book.js +215 -0
  903. package/plugin/build/lib/types.js +16 -0
  904. package/src/components/form/control-form.tsx +112 -0
  905. package/src/components/form/make-controls.ts +33 -0
  906. package/src/components/form/scope.ts +9 -0
  907. package/src/components/form/use-field.ts +35 -0
  908. package/src/components/preset-book-menu/index.tsx +286 -0
  909. package/src/components/preset-book-menu/layout.tsx +63 -0
  910. package/src/components/preset-book-menu/preset-book-menu.types.ts +112 -0
  911. package/src/components/preset-book-menu/preset-grid.tsx +80 -0
  912. package/src/components/preset-book-menu/resolve-image-uri.ts +31 -0
  913. package/src/components/preset-book-menu/resolve-image-uri.types.ts +18 -0
  914. package/src/components/preset-book-menu/resolve-image-uri.web.ts +15 -0
  915. package/src/components/preset-control-panel/composite-layer-control-panel.tsx +56 -0
  916. package/src/components/preset-control-panel/control-section.tsx +84 -0
  917. package/src/components/preset-control-panel/control.tsx +50 -0
  918. package/src/components/preset-control-panel/index.ts +31 -0
  919. package/src/components/preset-control-panel/mask-control-panel.tsx +93 -0
  920. package/src/components/preset-control-panel/preset-control-panel.tsx +48 -0
  921. package/src/components/preset-control-panel/transform-control-panel.tsx +146 -0
  922. package/src/components/preset-tile/index.tsx +160 -0
  923. package/src/components/theme/provider.tsx +50 -0
  924. package/src/components/theme/slots.ts +37 -0
  925. package/src/components/ui/button.tsx +54 -0
  926. package/src/components/ui/color-picker.tsx +74 -0
  927. package/src/components/ui/index.ts +10 -0
  928. package/src/components/ui/label.tsx +24 -0
  929. package/src/components/ui/point.tsx +116 -0
  930. package/src/components/ui/polygon-field.tsx +84 -0
  931. package/src/components/ui/readout.tsx +25 -0
  932. package/src/components/ui/slider-value.ts +15 -0
  933. package/src/components/ui/slider.tsx +98 -0
  934. package/src/components/ui/switch.tsx +40 -0
  935. package/src/index.ts +176 -95
  936. package/src/index.web.ts +126 -74
  937. package/src/kaleidoscope/controls.ts +127 -0
  938. package/src/kaleidoscope/effect.ts +5 -0
  939. package/src/kaleidoscope/effect.types.ts +63 -0
  940. package/src/kaleidoscope/shader-to-spec.ts +16 -0
  941. package/src/kaleidoscope/types.ts +101 -0
  942. package/src/kaleidoscope.preset-book.types.ts +105 -0
  943. package/src/lib/primitives.types.ts +5 -0
  944. package/src/lib/test-id.ts +81 -0
  945. package/src/livekit.ts +6 -4
  946. package/src/nativewind.ts +41 -0
  947. package/android/src/main/assets/backgrounds/stylized-dark.webp +0 -0
  948. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BackgroundImageFactory.kt +0 -365
  949. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BlurFactory.kt +0 -400
  950. package/dist/backgrounds/dark-office.d.ts +0 -3
  951. package/dist/backgrounds/dark-office.d.ts.map +0 -1
  952. package/dist/backgrounds/dark-office.js +0 -5
  953. package/dist/backgrounds/dark-office.js.map +0 -1
  954. package/dist/backgrounds/dark-office.web.d.ts +0 -3
  955. package/dist/backgrounds/dark-office.web.d.ts.map +0 -1
  956. package/dist/backgrounds/dark-office.web.js +0 -8
  957. package/dist/backgrounds/dark-office.web.js.map +0 -1
  958. package/dist/backgrounds/debug-resolutions.d.ts +0 -3
  959. package/dist/backgrounds/debug-resolutions.d.ts.map +0 -1
  960. package/dist/backgrounds/debug-resolutions.js +0 -6
  961. package/dist/backgrounds/debug-resolutions.js.map +0 -1
  962. package/dist/backgrounds/debug-resolutions.web.d.ts +0 -3
  963. package/dist/backgrounds/debug-resolutions.web.d.ts.map +0 -1
  964. package/dist/backgrounds/debug-resolutions.web.js +0 -8
  965. package/dist/backgrounds/debug-resolutions.web.js.map +0 -1
  966. package/dist/backgrounds/home-dark.d.ts +0 -3
  967. package/dist/backgrounds/home-dark.d.ts.map +0 -1
  968. package/dist/backgrounds/home-dark.js +0 -5
  969. package/dist/backgrounds/home-dark.js.map +0 -1
  970. package/dist/backgrounds/home-dark.web.d.ts +0 -3
  971. package/dist/backgrounds/home-dark.web.d.ts.map +0 -1
  972. package/dist/backgrounds/home-dark.web.js +0 -6
  973. package/dist/backgrounds/home-dark.web.js.map +0 -1
  974. package/dist/backgrounds/home-light.d.ts +0 -3
  975. package/dist/backgrounds/home-light.d.ts.map +0 -1
  976. package/dist/backgrounds/home-light.js +0 -5
  977. package/dist/backgrounds/home-light.js.map +0 -1
  978. package/dist/backgrounds/home-light.web.d.ts +0 -3
  979. package/dist/backgrounds/home-light.web.d.ts.map +0 -1
  980. package/dist/backgrounds/home-light.web.js +0 -6
  981. package/dist/backgrounds/home-light.web.js.map +0 -1
  982. package/dist/backgrounds/index.d.ts +0 -3
  983. package/dist/backgrounds/index.d.ts.map +0 -1
  984. package/dist/backgrounds/index.js +0 -6
  985. package/dist/backgrounds/index.js.map +0 -1
  986. package/dist/backgrounds/light-office.d.ts +0 -3
  987. package/dist/backgrounds/light-office.d.ts.map +0 -1
  988. package/dist/backgrounds/light-office.js +0 -5
  989. package/dist/backgrounds/light-office.js.map +0 -1
  990. package/dist/backgrounds/light-office.web.d.ts +0 -3
  991. package/dist/backgrounds/light-office.web.d.ts.map +0 -1
  992. package/dist/backgrounds/light-office.web.js +0 -8
  993. package/dist/backgrounds/light-office.web.js.map +0 -1
  994. package/dist/backgrounds/nature-dark.d.ts +0 -3
  995. package/dist/backgrounds/nature-dark.d.ts.map +0 -1
  996. package/dist/backgrounds/nature-dark.js +0 -5
  997. package/dist/backgrounds/nature-dark.js.map +0 -1
  998. package/dist/backgrounds/nature-dark.web.d.ts +0 -3
  999. package/dist/backgrounds/nature-dark.web.d.ts.map +0 -1
  1000. package/dist/backgrounds/nature-dark.web.js +0 -6
  1001. package/dist/backgrounds/nature-dark.web.js.map +0 -1
  1002. package/dist/backgrounds/nature-light.d.ts +0 -3
  1003. package/dist/backgrounds/nature-light.d.ts.map +0 -1
  1004. package/dist/backgrounds/nature-light.js +0 -5
  1005. package/dist/backgrounds/nature-light.js.map +0 -1
  1006. package/dist/backgrounds/nature-light.web.d.ts +0 -3
  1007. package/dist/backgrounds/nature-light.web.d.ts.map +0 -1
  1008. package/dist/backgrounds/nature-light.web.js +0 -6
  1009. package/dist/backgrounds/nature-light.web.js.map +0 -1
  1010. package/dist/backgrounds/preset-source.types.d.ts +0 -2
  1011. package/dist/backgrounds/preset-source.types.d.ts.map +0 -1
  1012. package/dist/backgrounds/preset-source.types.js +0 -2
  1013. package/dist/backgrounds/preset-source.types.js.map +0 -1
  1014. package/dist/backgrounds/presets.d.ts +0 -3
  1015. package/dist/backgrounds/presets.d.ts.map +0 -1
  1016. package/dist/backgrounds/presets.js +0 -34
  1017. package/dist/backgrounds/presets.js.map +0 -1
  1018. package/dist/backgrounds/simiancraft-dark.d.ts +0 -3
  1019. package/dist/backgrounds/simiancraft-dark.d.ts.map +0 -1
  1020. package/dist/backgrounds/simiancraft-dark.js +0 -5
  1021. package/dist/backgrounds/simiancraft-dark.js.map +0 -1
  1022. package/dist/backgrounds/simiancraft-dark.web.d.ts +0 -3
  1023. package/dist/backgrounds/simiancraft-dark.web.d.ts.map +0 -1
  1024. package/dist/backgrounds/simiancraft-dark.web.js +0 -6
  1025. package/dist/backgrounds/simiancraft-dark.web.js.map +0 -1
  1026. package/dist/backgrounds/simiancraft-light.d.ts +0 -3
  1027. package/dist/backgrounds/simiancraft-light.d.ts.map +0 -1
  1028. package/dist/backgrounds/simiancraft-light.js +0 -5
  1029. package/dist/backgrounds/simiancraft-light.js.map +0 -1
  1030. package/dist/backgrounds/simiancraft-light.web.d.ts +0 -3
  1031. package/dist/backgrounds/simiancraft-light.web.d.ts.map +0 -1
  1032. package/dist/backgrounds/simiancraft-light.web.js +0 -6
  1033. package/dist/backgrounds/simiancraft-light.web.js.map +0 -1
  1034. package/dist/backgrounds/stylized-dark.d.ts +0 -3
  1035. package/dist/backgrounds/stylized-dark.d.ts.map +0 -1
  1036. package/dist/backgrounds/stylized-dark.js +0 -5
  1037. package/dist/backgrounds/stylized-dark.js.map +0 -1
  1038. package/dist/backgrounds/stylized-dark.web.d.ts +0 -3
  1039. package/dist/backgrounds/stylized-dark.web.d.ts.map +0 -1
  1040. package/dist/backgrounds/stylized-dark.web.js +0 -6
  1041. package/dist/backgrounds/stylized-dark.web.js.map +0 -1
  1042. package/dist/backgrounds/stylized-dark.webp +0 -0
  1043. package/dist/backgrounds/stylized-light.d.ts +0 -3
  1044. package/dist/backgrounds/stylized-light.d.ts.map +0 -1
  1045. package/dist/backgrounds/stylized-light.js +0 -5
  1046. package/dist/backgrounds/stylized-light.js.map +0 -1
  1047. package/dist/backgrounds/stylized-light.web.d.ts +0 -3
  1048. package/dist/backgrounds/stylized-light.web.d.ts.map +0 -1
  1049. package/dist/backgrounds/stylized-light.web.js +0 -6
  1050. package/dist/backgrounds/stylized-light.web.js.map +0 -1
  1051. package/dist/index.d.ts +0 -42
  1052. package/dist/index.d.ts.map +0 -1
  1053. package/dist/index.js +0 -155
  1054. package/dist/index.js.map +0 -1
  1055. package/dist/index.web.d.ts +0 -49
  1056. package/dist/index.web.d.ts.map +0 -1
  1057. package/dist/index.web.js +0 -113
  1058. package/dist/index.web.js.map +0 -1
  1059. package/dist/livekit.d.ts +0 -24
  1060. package/dist/livekit.d.ts.map +0 -1
  1061. package/dist/livekit.js +0 -57
  1062. package/dist/livekit.js.map +0 -1
  1063. package/dist/types.d.ts +0 -74
  1064. package/dist/types.d.ts.map +0 -1
  1065. package/dist/types.js +0 -10
  1066. package/dist/types.js.map +0 -1
  1067. package/dist/web/blur-kernel.d.ts +0 -6
  1068. package/dist/web/blur-kernel.d.ts.map +0 -1
  1069. package/dist/web/blur-kernel.js +0 -41
  1070. package/dist/web/blur-kernel.js.map +0 -1
  1071. package/dist/web/effects/background-image.d.ts +0 -3
  1072. package/dist/web/effects/background-image.d.ts.map +0 -1
  1073. package/dist/web/effects/background-image.js +0 -284
  1074. package/dist/web/effects/background-image.js.map +0 -1
  1075. package/dist/web/effects/blur.d.ts +0 -3
  1076. package/dist/web/effects/blur.d.ts.map +0 -1
  1077. package/dist/web/effects/blur.js +0 -339
  1078. package/dist/web/effects/blur.js.map +0 -1
  1079. package/dist/web/effects/transform.d.ts +0 -4
  1080. package/dist/web/effects/transform.d.ts.map +0 -1
  1081. package/dist/web/effects/transform.js +0 -62
  1082. package/dist/web/effects/transform.js.map +0 -1
  1083. package/dist/web/insertable-streams.d.ts.map +0 -1
  1084. package/dist/web/insertable-streams.js +0 -64
  1085. package/dist/web/insertable-streams.js.map +0 -1
  1086. package/dist/web/segmenter.d.ts.map +0 -1
  1087. package/dist/web/segmenter.js +0 -83
  1088. package/dist/web/segmenter.js.map +0 -1
  1089. package/dist/web/shaders.d.ts +0 -2
  1090. package/dist/web/shaders.d.ts.map +0 -1
  1091. package/dist/web/shaders.generated.d.ts +0 -4
  1092. package/dist/web/shaders.generated.d.ts.map +0 -1
  1093. package/dist/web/shaders.generated.js +0 -54
  1094. package/dist/web/shaders.generated.js.map +0 -1
  1095. package/dist/web/shaders.js +0 -32
  1096. package/dist/web/shaders.js.map +0 -1
  1097. package/dist/web/tuning.d.ts.map +0 -1
  1098. package/dist/web/tuning.js +0 -55
  1099. package/dist/web/tuning.js.map +0 -1
  1100. package/ios/KaleidoscopeModule/effects/BackgroundImageProcessor.swift +0 -293
  1101. package/ios/KaleidoscopeModule/effects/BlurProcessor.swift +0 -238
  1102. package/ios/KaleidoscopeModule/resources/backgrounds/dark-office.webp +0 -0
  1103. package/ios/KaleidoscopeModule/resources/backgrounds/debug-resolutions.webp +0 -0
  1104. package/ios/KaleidoscopeModule/resources/backgrounds/home-dark.webp +0 -0
  1105. package/ios/KaleidoscopeModule/resources/backgrounds/home-light.webp +0 -0
  1106. package/ios/KaleidoscopeModule/resources/backgrounds/light-office.webp +0 -0
  1107. package/ios/KaleidoscopeModule/resources/backgrounds/nature-dark.webp +0 -0
  1108. package/ios/KaleidoscopeModule/resources/backgrounds/nature-light.webp +0 -0
  1109. package/ios/KaleidoscopeModule/resources/backgrounds/simiancraft-dark.webp +0 -0
  1110. package/ios/KaleidoscopeModule/resources/backgrounds/simiancraft-light.webp +0 -0
  1111. package/ios/KaleidoscopeModule/resources/backgrounds/stylized-dark.webp +0 -0
  1112. package/ios/KaleidoscopeModule/resources/backgrounds/stylized-light.webp +0 -0
  1113. package/ios/KaleidoscopeModule/shaders/blur.metalsrc +0 -72
  1114. package/ios/KaleidoscopeModule/shaders/composite.metalsrc +0 -22
  1115. package/src/backgrounds/README.md +0 -83
  1116. package/src/backgrounds/dark-office.ts +0 -6
  1117. package/src/backgrounds/dark-office.web.ts +0 -9
  1118. package/src/backgrounds/dark-office.webp +0 -0
  1119. package/src/backgrounds/debug-resolutions.ts +0 -7
  1120. package/src/backgrounds/debug-resolutions.web.ts +0 -9
  1121. package/src/backgrounds/debug-resolutions.webp +0 -0
  1122. package/src/backgrounds/home-dark.ts +0 -6
  1123. package/src/backgrounds/home-dark.web.ts +0 -7
  1124. package/src/backgrounds/home-dark.webp +0 -0
  1125. package/src/backgrounds/home-light.ts +0 -6
  1126. package/src/backgrounds/home-light.web.ts +0 -7
  1127. package/src/backgrounds/home-light.webp +0 -0
  1128. package/src/backgrounds/index.ts +0 -7
  1129. package/src/backgrounds/light-office.ts +0 -6
  1130. package/src/backgrounds/light-office.web.ts +0 -9
  1131. package/src/backgrounds/light-office.webp +0 -0
  1132. package/src/backgrounds/nature-dark.ts +0 -6
  1133. package/src/backgrounds/nature-dark.web.ts +0 -7
  1134. package/src/backgrounds/nature-dark.webp +0 -0
  1135. package/src/backgrounds/nature-light.ts +0 -6
  1136. package/src/backgrounds/nature-light.web.ts +0 -7
  1137. package/src/backgrounds/nature-light.webp +0 -0
  1138. package/src/backgrounds/preset-source.types.ts +0 -5
  1139. package/src/backgrounds/presets.ts +0 -36
  1140. package/src/backgrounds/simiancraft-dark.ts +0 -6
  1141. package/src/backgrounds/simiancraft-dark.web.ts +0 -7
  1142. package/src/backgrounds/simiancraft-dark.webp +0 -0
  1143. package/src/backgrounds/simiancraft-light.ts +0 -6
  1144. package/src/backgrounds/simiancraft-light.web.ts +0 -7
  1145. package/src/backgrounds/simiancraft-light.webp +0 -0
  1146. package/src/backgrounds/stylized-dark.ts +0 -6
  1147. package/src/backgrounds/stylized-dark.web.ts +0 -7
  1148. package/src/backgrounds/stylized-dark.webp +0 -0
  1149. package/src/backgrounds/stylized-light.ts +0 -6
  1150. package/src/backgrounds/stylized-light.web.ts +0 -7
  1151. package/src/backgrounds/stylized-light.webp +0 -0
  1152. package/src/types.ts +0 -89
  1153. package/src/web/blur-kernel.ts +0 -44
  1154. package/src/web/effects/background-image.ts +0 -364
  1155. package/src/web/effects/blur.ts +0 -430
  1156. package/src/web/effects/transform.ts +0 -69
  1157. package/src/web/insertable-streams.ts +0 -112
  1158. package/src/web/segmenter.ts +0 -107
  1159. package/src/web/shaders.generated.ts +0 -56
  1160. package/src/web/shaders.ts +0 -31
  1161. package/src/web/tuning.ts +0 -67
  1162. /package/{src/backgrounds → catalog/images}/assets.d.ts +0 -0
  1163. /package/{android/src/main/assets/backgrounds → catalog/images/debug}/debug-resolutions.webp +0 -0
  1164. /package/{android/src/main/assets/backgrounds → catalog/images/home}/home-dark.webp +0 -0
  1165. /package/{android/src/main/assets/backgrounds → catalog/images/home}/home-light.webp +0 -0
  1166. /package/{android/src/main/assets/backgrounds/nature-dark.webp → catalog/images/nature/landscape-dark.webp} +0 -0
  1167. /package/{android/src/main/assets/backgrounds/nature-light.webp → catalog/images/nature/landscape-light.webp} +0 -0
  1168. /package/{android/src/main/assets/backgrounds/dark-office.webp → catalog/images/office/office-dark.webp} +0 -0
  1169. /package/{android/src/main/assets/backgrounds/light-office.webp → catalog/images/office/office-light.webp} +0 -0
  1170. /package/{android/src/main/assets/backgrounds/stylized-light.webp → catalog/images/sci-fi/sci-fi-light.webp} +0 -0
  1171. /package/{android/src/main/assets/backgrounds → catalog/images/simiancraft}/simiancraft-dark.webp +0 -0
  1172. /package/{android/src/main/assets/backgrounds → catalog/images/simiancraft}/simiancraft-light.webp +0 -0
  1173. /package/dist/{backgrounds → catalog/images/debug}/debug-resolutions.webp +0 -0
  1174. /package/dist/{backgrounds → catalog/images/home}/home-dark.webp +0 -0
  1175. /package/dist/{backgrounds → catalog/images/home}/home-light.webp +0 -0
  1176. /package/dist/{backgrounds/nature-dark.webp → catalog/images/nature/landscape-dark.webp} +0 -0
  1177. /package/dist/{backgrounds/nature-light.webp → catalog/images/nature/landscape-light.webp} +0 -0
  1178. /package/dist/{backgrounds/dark-office.webp → catalog/images/office/office-dark.webp} +0 -0
  1179. /package/dist/{backgrounds/light-office.webp → catalog/images/office/office-light.webp} +0 -0
  1180. /package/dist/{backgrounds/stylized-light.webp → catalog/images/sci-fi/sci-fi-light.webp} +0 -0
  1181. /package/dist/{backgrounds → catalog/images/simiancraft}/simiancraft-dark.webp +0 -0
  1182. /package/dist/{backgrounds → catalog/images/simiancraft}/simiancraft-light.webp +0 -0
  1183. /package/dist/{web → web-driver}/insertable-streams.d.ts +0 -0
  1184. /package/dist/{web → web-driver}/segmenter.d.ts +0 -0
  1185. /package/dist/{web → web-driver}/tuning.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite.js","sourceRoot":"","sources":["../../../web-driver/effects/composite.ts"],"names":[],"mappings":"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","sourcesContent":["// Web composite compositor: render a painter's stack of layers into one frame.\n//\n// This is the LAYERED path (distinct from the serial single-effect chain in\n// index.web.ts). A composite is one stage: layer 0 is the opaque base, later layers\n// blend over it in array order. Each layer is `{ shader, target?, blend? }`:\n// - shader 'image' : a still texture (cover-fit), premultiplied.\n// - shader 'direct' : passthrough of its channel. On 'subject' that is the\n// masked camera person; on 'background' it is the raw camera fullscreen.\n// - shader 'blur' : a camera-sampling separable gaussian (its `sigma` uniform).\n// - a generative shader (e.g. 'godrays') : render its frag with `uniforms`.\n// - target defaults to 'background' (fullscreen); 'subject' stencils to the mask.\n//\n// Two pixel sources: camera-sampling layers ('direct', 'blur') read the live\n// frame; content-generating layers ('image', generative) make their own pixels.\n// `target` decides the stencil for either: a 'background' layer draws fullscreen;\n// a 'subject' layer is multiplied by the mask alpha so it shows only over the\n// segmented person. Direct/subject takes a one-pass fast path (cam x mask); every\n// other subject layer renders to a scratch texture and a masked-composite pass\n// stencils it. The mask edge is the shared mask() tuning, so the demo sliders\n// drive composites.\n\nimport type { KaleidoscopeLayer } from '../../src/kaleidoscope.preset-book.types';\nimport type { FrameTransform } from '../insertable-streams';\nimport { getLatestMask, loadSegmenter, requestMaskIfIdle } from '../segmenter';\nimport {\n COMPOSITE_BLUR_FRAG_SRC,\n COMPOSITE_CAMERA_FRAG_SRC,\n COMPOSITE_IMAGE_FRAG_SRC,\n COMPOSITE_MASKED_FRAG_SRC,\n COMPOSITE_SUBJECT_FRAG_SRC,\n PASSTHROUGH_VERT_SRC,\n} from '../shaders';\nimport { maskSmoothstepRange, tuning } from '../tuning';\nimport { LAYER_SHADER_SOURCES } from './layer-shaders';\n\n// The compositor primitives are single-sourced from catalog/shaders/_shared via\n// build:shaders, imported above: COMPOSITE_IMAGE_FRAG_SRC (cover-fit; also reused\n// for scratch blits, at cover scale or 1,1 for a 1:1 blit), COMPOSITE_SUBJECT_FRAG_SRC (the masked camera\n// person), COMPOSITE_MASKED_FRAG_SRC (stencil any layer to the subject), plus\n// COMPOSITE_CAMERA_FRAG_SRC and COMPOSITE_BLUR_FRAG_SRC. iOS carries one extra\n// blit variant (composite-blit) for its texture-origin parity; web reuses the\n// image shader for its blit.\n\ntype Uniform = number | readonly number[];\n\nconst compileShader = (gl: WebGL2RenderingContext, type: number, source: string): WebGLShader => {\n const shader = gl.createShader(type);\n if (!shader) throw new Error('kaleidoscope: gl.createShader returned null');\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader) ?? '(no info log)';\n gl.deleteShader(shader);\n throw new Error(`kaleidoscope: composite shader compile failed: ${log}\\n---\\n${source}`);\n }\n return shader;\n};\n\nconst linkProgram = (\n gl: WebGL2RenderingContext,\n vertSrc: string,\n fragSrc: string,\n): WebGLProgram => {\n const vs = compileShader(gl, gl.VERTEX_SHADER, vertSrc);\n const fs = compileShader(gl, gl.FRAGMENT_SHADER, fragSrc);\n const prog = gl.createProgram();\n if (!prog) throw new Error('kaleidoscope: gl.createProgram returned null');\n gl.attachShader(prog, vs);\n gl.attachShader(prog, fs);\n gl.linkProgram(prog);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(prog) ?? '(no info log)';\n gl.deleteProgram(prog);\n throw new Error(`kaleidoscope: composite program link failed: ${log}`);\n }\n return prog;\n};\n\nconst bindUniform = (\n gl: WebGL2RenderingContext,\n loc: WebGLUniformLocation | null,\n value: Uniform,\n): void => {\n if (loc == null) return;\n if (typeof value === 'number') gl.uniform1f(loc, value);\n else if (value.length === 2) gl.uniform2fv(loc, new Float32Array(value));\n else if (value.length === 3) gl.uniform3fv(loc, new Float32Array(value));\n else if (value.length === 4) gl.uniform4fv(loc, new Float32Array(value));\n // An even length > 4 is a vec2 array (a polygon: flat [x0,y0, ...]).\n else if (value.length % 2 === 0) gl.uniform2fv(loc, new Float32Array(value));\n};\n\nconst createTexture = (gl: WebGL2RenderingContext): WebGLTexture => {\n const tex = gl.createTexture();\n if (!tex) throw new Error('kaleidoscope: gl.createTexture returned null');\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return tex;\n};\n\ntype Fbo = { tex: WebGLTexture; fbo: WebGLFramebuffer };\n\n// A render target sized to the frame: an RGBA texture with a framebuffer bound to\n// it, for the blur ping-pong and the subject-stencil scratch.\nconst createFbo = (gl: WebGL2RenderingContext, width: number, height: number): Fbo => {\n const tex = createTexture(gl);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n const fbo = gl.createFramebuffer();\n if (!fbo) throw new Error('kaleidoscope: gl.createFramebuffer returned null');\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { tex, fbo };\n};\n\nconst uploadTexture = (\n gl: WebGL2RenderingContext,\n tex: WebGLTexture,\n source: TexImageSource,\n flipY: boolean,\n): void => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipY);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n};\n\n// --- image loading (cached per source URL) ---------------------------------\n\ntype LoadedImage = { canvas: OffscreenCanvas; width: number; height: number };\n\nconst imageCache = new Map<string, Promise<LoadedImage>>();\n\nconst loadImage = (source: string): Promise<LoadedImage> => {\n const cached = imageCache.get(source);\n if (cached) return cached;\n const promise = (async (): Promise<LoadedImage> => {\n const res = await fetch(source);\n if (!res.ok) {\n throw new Error(`kaleidoscope: composite image fetch failed (${res.status}) for ${source}`);\n }\n const blob = await res.blob();\n const bitmap = await createImageBitmap(blob);\n // Capture dimensions BEFORE close(): closing an ImageBitmap zeroes its\n // width/height, and reading them after produced a 0x0 size that made the\n // cover-fit UV scale NaN and smeared the texture.\n const width = bitmap.width;\n const height = bitmap.height;\n // Stage onto a 2D canvas so UNPACK_FLIP_Y_WEBGL applies on upload (it is a\n // no-op on ImageBitmap sources).\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('kaleidoscope: composite image 2D context unavailable');\n ctx.drawImage(bitmap, 0, 0);\n bitmap.close();\n return { canvas, width, height };\n })();\n imageCache.set(source, promise);\n return promise;\n};\n\n// --- per-composite GL state (one composite active at a time) -----------------------\n\ntype ShaderLayerGpu = {\n prog: WebGLProgram;\n uTime: WebGLUniformLocation | null;\n uResolution: WebGLUniformLocation | null;\n uniforms: Map<string, WebGLUniformLocation | null>;\n};\n\ntype CameraGpu = {\n prog: WebGLProgram;\n uCamera: WebGLUniformLocation | null;\n tex: WebGLTexture;\n};\n\ntype DirectSubjectGpu = {\n prog: WebGLProgram;\n uCamera: WebGLUniformLocation | null;\n uMask: WebGLUniformLocation | null;\n uMaskUvScale: WebGLUniformLocation | null;\n uMaskUvOffset: WebGLUniformLocation | null;\n uMaskLo: WebGLUniformLocation | null;\n uMaskHi: WebGLUniformLocation | null;\n};\n\ntype BlurGpu = {\n prog: WebGLProgram;\n uTex: WebGLUniformLocation | null;\n uDir: WebGLUniformLocation | null;\n uSigma: WebGLUniformLocation | null;\n};\n\ntype MaskedGpu = {\n prog: WebGLProgram;\n uTex: WebGLUniformLocation | null;\n uMask: WebGLUniformLocation | null;\n uMaskUvScale: WebGLUniformLocation | null;\n uMaskUvOffset: WebGLUniformLocation | null;\n uMaskLo: WebGLUniformLocation | null;\n uMaskHi: WebGLUniformLocation | null;\n};\n\ntype GpuState = {\n gl: WebGL2RenderingContext;\n canvas: OffscreenCanvas;\n width: number;\n height: number;\n blit: {\n prog: WebGLProgram;\n uTex: WebGLUniformLocation | null;\n uCoverScale: WebGLUniformLocation | null;\n };\n imageTextures: Map<string, { tex: WebGLTexture; width: number; height: number }>;\n shaderPrograms: Map<string, ShaderLayerGpu>;\n // Camera-sampling support: staged camera + its passthrough program. Present\n // when any 'direct' or 'blur' layer is in the stack.\n camera: CameraGpu | null;\n // The segmentation mask texture. Present when any layer targets the subject.\n maskTex: WebGLTexture | null;\n // direct/subject one-pass fast path (cam x mask).\n directSubject: DirectSubjectGpu | null;\n // Separable blur program. Present when any 'blur' layer is in the stack.\n blur: BlurGpu | null;\n // Masked-composite (stencil any rendered layer to the subject). Present when a\n // non-direct subject layer is in the stack.\n masked: MaskedGpu | null;\n // Scratch render targets: scratchA holds a layer's rendered content (and the\n // blur's horizontal pass); scratchB holds the blur's vertical pass.\n scratchA: Fbo | null;\n scratchB: Fbo | null;\n // Identity of the layer set this state was built for. Switching composites at the\n // same resolution must rebuild (different shaders/targets, different programs).\n layersSig: string;\n};\n\nlet state: GpuState | null = null;\n\nconst layersSignature = (layers: ReadonlyArray<KaleidoscopeLayer>): string =>\n layers.map((l) => `${l.id}:${l.shader}:${l.target ?? 'background'}`).join('|');\n\nconst disposeState = (s: GpuState): void => {\n const { gl } = s;\n gl.deleteProgram(s.blit.prog);\n for (const p of s.shaderPrograms.values()) gl.deleteProgram(p.prog);\n for (const t of s.imageTextures.values()) gl.deleteTexture(t.tex);\n if (s.camera) {\n gl.deleteProgram(s.camera.prog);\n gl.deleteTexture(s.camera.tex);\n }\n if (s.maskTex) gl.deleteTexture(s.maskTex);\n if (s.directSubject) gl.deleteProgram(s.directSubject.prog);\n if (s.blur) gl.deleteProgram(s.blur.prog);\n if (s.masked) gl.deleteProgram(s.masked.prog);\n for (const f of [s.scratchA, s.scratchB]) {\n if (f) {\n gl.deleteFramebuffer(f.fbo);\n gl.deleteTexture(f.tex);\n }\n }\n};\n\n// Camera frame staged here for both texture upload (flipY actually applies on a\n// canvas source) and as the segmenter input.\nlet inputCanvas2D: OffscreenCanvas | null = null;\nlet inputCtx2D: OffscreenCanvasRenderingContext2D | null = null;\n\nconst ensureInputCanvas = (width: number, height: number): OffscreenCanvasRenderingContext2D => {\n if (!inputCanvas2D || inputCanvas2D.width !== width || inputCanvas2D.height !== height) {\n inputCanvas2D = new OffscreenCanvas(width, height);\n inputCtx2D = inputCanvas2D.getContext('2d');\n if (!inputCtx2D) throw new Error('kaleidoscope: composite input 2D context unavailable');\n }\n return inputCtx2D as OffscreenCanvasRenderingContext2D;\n};\n\nconst isCameraSampler = (shader: string): boolean => shader === 'direct' || shader === 'blur';\n\nconst ensureState = (\n width: number,\n height: number,\n layers: ReadonlyArray<KaleidoscopeLayer>,\n): GpuState => {\n const sig = layersSignature(layers);\n if (state && state.width === width && state.height === height && state.layersSig === sig) {\n return state;\n }\n const prevCanvas = state?.canvas;\n if (state) disposeState(state);\n const canvas = prevCanvas ?? new OffscreenCanvas(width, height);\n canvas.width = width;\n canvas.height = height;\n const gl = canvas.getContext('webgl2');\n if (!gl)\n throw new Error('kaleidoscope: WebGL2 not available; composites require a WebGL2 browser');\n\n const needsCamera = layers.some((l) => isCameraSampler(l.shader));\n const needsMask = layers.some((l) => l.target === 'subject');\n const hasDirectSubject = layers.some((l) => l.shader === 'direct' && l.target === 'subject');\n const hasGenericSubject = layers.some((l) => l.shader !== 'direct' && l.target === 'subject');\n const hasBlur = layers.some((l) => l.shader === 'blur');\n\n const blitProg = linkProgram(gl, PASSTHROUGH_VERT_SRC, COMPOSITE_IMAGE_FRAG_SRC);\n\n const shaderPrograms = new Map<string, ShaderLayerGpu>();\n for (const layer of layers) {\n // Generative layers only: 'image'/'direct' carry no uniforms, and 'blur' has\n // a sigma uniform but is not a generative frag (it runs the blur program).\n if (!(layer.shader in LAYER_SHADER_SOURCES) || shaderPrograms.has(layer.shader)) continue;\n if (!('uniforms' in layer)) continue;\n const src = LAYER_SHADER_SOURCES[layer.shader];\n if (!src) throw new Error(`kaleidoscope: unknown composite layer shader '${layer.shader}'`);\n const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, src);\n const uniforms = new Map<string, WebGLUniformLocation | null>();\n for (const name of Object.keys(layer.uniforms)) {\n uniforms.set(name, gl.getUniformLocation(prog, name));\n }\n shaderPrograms.set(layer.shader, {\n prog,\n uTime: gl.getUniformLocation(prog, 'uTime'),\n uResolution: gl.getUniformLocation(prog, 'uResolution'),\n uniforms,\n });\n }\n\n let camera: CameraGpu | null = null;\n if (needsCamera) {\n const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, COMPOSITE_CAMERA_FRAG_SRC);\n camera = { prog, uCamera: gl.getUniformLocation(prog, 'uCamera'), tex: createTexture(gl) };\n }\n\n const maskTex = needsMask ? createTexture(gl) : null;\n\n let directSubject: DirectSubjectGpu | null = null;\n if (hasDirectSubject) {\n const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, COMPOSITE_SUBJECT_FRAG_SRC);\n directSubject = {\n prog,\n uCamera: gl.getUniformLocation(prog, 'uCamera'),\n uMask: gl.getUniformLocation(prog, 'uMask'),\n uMaskUvScale: gl.getUniformLocation(prog, 'uMaskUvScale'),\n uMaskUvOffset: gl.getUniformLocation(prog, 'uMaskUvOffset'),\n uMaskLo: gl.getUniformLocation(prog, 'uMaskLo'),\n uMaskHi: gl.getUniformLocation(prog, 'uMaskHi'),\n };\n }\n\n let blur: BlurGpu | null = null;\n if (hasBlur) {\n const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, COMPOSITE_BLUR_FRAG_SRC);\n blur = {\n prog,\n uTex: gl.getUniformLocation(prog, 'uTex'),\n uDir: gl.getUniformLocation(prog, 'uDir'),\n uSigma: gl.getUniformLocation(prog, 'uSigma'),\n };\n }\n\n let masked: MaskedGpu | null = null;\n if (hasGenericSubject) {\n const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, COMPOSITE_MASKED_FRAG_SRC);\n masked = {\n prog,\n uTex: gl.getUniformLocation(prog, 'uTex'),\n uMask: gl.getUniformLocation(prog, 'uMask'),\n uMaskUvScale: gl.getUniformLocation(prog, 'uMaskUvScale'),\n uMaskUvOffset: gl.getUniformLocation(prog, 'uMaskUvOffset'),\n uMaskLo: gl.getUniformLocation(prog, 'uMaskLo'),\n uMaskHi: gl.getUniformLocation(prog, 'uMaskHi'),\n };\n }\n\n // scratchA: any subject layer that renders content, or the blur horizontal\n // pass. scratchB: the blur vertical pass result.\n const scratchA = hasGenericSubject || hasBlur ? createFbo(gl, width, height) : null;\n const scratchB = hasBlur ? createFbo(gl, width, height) : null;\n\n state = {\n gl,\n canvas,\n width,\n height,\n blit: {\n prog: blitProg,\n uTex: gl.getUniformLocation(blitProg, 'uTex'),\n uCoverScale: gl.getUniformLocation(blitProg, 'uCoverScale'),\n },\n imageTextures: new Map(),\n shaderPrograms,\n camera,\n maskTex,\n directSubject,\n blur,\n masked,\n scratchA,\n scratchB,\n layersSig: sig,\n };\n return state;\n};\n\nconst coverScale = (outW: number, outH: number, imgW: number, imgH: number): [number, number] => {\n const outAspect = outW / outH;\n const imgAspect = imgW / imgH;\n // Zoom in on the dimension that would otherwise letterbox (cover/center-crop).\n return outAspect > imgAspect ? [1, imgAspect / outAspect] : [outAspect / imgAspect, 1];\n};\n\n// Live tuning channel: per-layer-id uniform overrides the running compositor\n// merges over a layer's baked uniforms each frame, with no pipeline rebuild\n// (mirrors the mask() tuning). The kaleidoscope verb pushes here so a slider drag\n// updates the composite smoothly. Keyed by layer id (unique within a composite), so a\n// patch addresses exactly one layer even when two layers share a shader.\n//\n// These are INTERNAL: the kaleidoscope verb absorbs them (controls.ts injects\n// setLayerUniforms via the web facade). They are not part of the public surface,\n// but stay exported so the facade and controls can drive them.\ntype UniformMap = Readonly<Record<string, number | readonly number[]>>;\nconst layerUniformOverrides: Record<string, UniformMap> = {};\n\n/** Override a layer's uniforms (by layer id) in the running composite; merges. */\nexport const setLayerUniforms = (id: string, uniforms: UniformMap): void => {\n layerUniformOverrides[id] = { ...layerUniformOverrides[id], ...uniforms };\n};\n\n/** Drop a layer's override (by layer id), reverting to its baked uniforms. */\nconst clearLayerUniforms = (id: string): void => {\n delete layerUniformOverrides[id];\n};\n\n/**\n * Drop EVERY layer override. A preset switch calls this so a reused layer id\n * (e.g. 'blur', shared by the low/medium/high blur presets) reverts to the new\n * preset's baked uniforms instead of carrying a stale slider override across.\n */\nexport const resetLayerUniforms = (): void => {\n for (const id of Object.keys(layerUniformOverrides)) delete layerUniformOverrides[id];\n};\n\nconst mergedUniforms = (\n layer: Extract<KaleidoscopeLayer, { uniforms: UniformMap }>,\n): UniformMap => {\n const override = layerUniformOverrides[layer.id];\n return override ? { ...layer.uniforms, ...override } : layer.uniforms;\n};\n\nexport const makeComposite = (layers: ReadonlyArray<KaleidoscopeLayer>): FrameTransform => {\n // A preset switch builds a fresh composite; drop any live overrides whose layer id\n // is not in this stack so a reused id (e.g. 'you') can't carry a stale override\n // from the previous preset into this one.\n const ids = new Set(layers.map((l) => l.id));\n for (const id of Object.keys(layerUniformOverrides)) {\n if (!ids.has(id)) clearLayerUniforms(id);\n }\n const imageSources = layers.filter(\n (l): l is Extract<KaleidoscopeLayer, { shader: 'image' }> => l.shader === 'image',\n );\n const needsSegmentation = layers.some((l) => l.target === 'subject');\n const needsCamera = layers.some((l) => isCameraSampler(l.shader));\n\n return async (frame) => {\n const w = frame.displayWidth;\n const h = frame.displayHeight;\n\n // Ensure all image layers are decoded before the first composite.\n const loaded = await Promise.all(imageSources.map((l) => loadImage(l.source)));\n if (needsSegmentation) await loadSegmenter();\n\n const s = ensureState(w, h, layers);\n const { gl, canvas, blit, imageTextures, shaderPrograms } = s;\n\n // Upload any image textures not yet on the GPU for this state.\n for (let i = 0; i < imageSources.length; i++) {\n const layer = imageSources[i];\n const img = loaded[i];\n if (!layer || !img) continue;\n const src = layer.source;\n if (imageTextures.has(src)) continue;\n const tex = createTexture(gl);\n uploadTexture(gl, tex, img.canvas as unknown as TexImageSource, true);\n imageTextures.set(src, { tex, width: img.width, height: img.height });\n }\n\n // Stage the camera frame: needed for any camera-sampling layer and as the\n // segmenter input. Upload to the shared camera texture; kick segmentation and\n // upload the mask when a subject layer is present.\n let subjectReady = false;\n if (needsCamera || needsSegmentation) {\n const inputCtx = ensureInputCanvas(w, h);\n inputCtx.drawImage(frame, 0, 0, w, h);\n const inputSource = inputCanvas2D as unknown as CanvasImageSource;\n if (needsCamera && s.camera) {\n uploadTexture(gl, s.camera.tex, inputSource as unknown as TexImageSource, true);\n }\n if (needsSegmentation && s.maskTex) {\n requestMaskIfIdle(inputSource);\n const results = getLatestMask();\n if (results) {\n uploadTexture(\n gl,\n s.maskTex,\n results.segmentationMask as unknown as TexImageSource,\n false,\n );\n subjectReady = true;\n }\n }\n }\n\n const now = performance.now() / 1000;\n const [maskLo, maskHi] = maskSmoothstepRange(tuning.maskHardness, tuning.maskThreshold);\n\n // Bind a mask sampler on texture unit 1 for the subject programs (V-flipped in\n // the sampler, matching the single-effect composite path).\n const bindMask = (\n uMask: WebGLUniformLocation | null,\n uScale: WebGLUniformLocation | null,\n uOffset: WebGLUniformLocation | null,\n uLo: WebGLUniformLocation | null,\n uHi: WebGLUniformLocation | null,\n ): void => {\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, s.maskTex);\n gl.uniform1i(uMask, 1);\n gl.uniform2f(uScale, 1, -1);\n gl.uniform2f(uOffset, 0, 1);\n gl.uniform1f(uLo, maskLo);\n gl.uniform1f(uHi, maskHi);\n };\n\n const drawQuad = (): void => gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n // Render a layer's content into scratchA (blend off, cleared), returning the\n // texture that holds it. Blur is special: it runs the separable passes\n // (camera -> scratchA -> scratchB) and returns scratchB.\n const renderContentToScratch = (layer: KaleidoscopeLayer): WebGLTexture | null => {\n gl.disable(gl.BLEND);\n if (layer.shader === 'blur') {\n if (!s.blur || !s.camera || !s.scratchA || !s.scratchB) return null;\n // Read through mergedUniforms so a live slider edit (setLayerUniforms)\n // reaches the blur pass, exactly like the generative layers below.\n const sigmaVal = mergedUniforms(layer).sigma;\n const sigma = typeof sigmaVal === 'number' ? sigmaVal : 4;\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(s.blur.prog);\n gl.uniform1f(s.blur.uSigma, sigma);\n // Horizontal pass: camera -> scratchA.\n gl.bindFramebuffer(gl.FRAMEBUFFER, s.scratchA.fbo);\n gl.viewport(0, 0, w, h);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, s.camera.tex);\n gl.uniform1i(s.blur.uTex, 0);\n gl.uniform2f(s.blur.uDir, 1 / w, 0);\n drawQuad();\n // Vertical pass: scratchA -> scratchB.\n gl.bindFramebuffer(gl.FRAMEBUFFER, s.scratchB.fbo);\n gl.viewport(0, 0, w, h);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, s.scratchA.tex);\n gl.uniform1i(s.blur.uTex, 0);\n gl.uniform2f(s.blur.uDir, 0, 1 / h);\n drawQuad();\n return s.scratchB.tex;\n }\n if (!s.scratchA) return null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, s.scratchA.fbo);\n gl.viewport(0, 0, w, h);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n if (layer.shader === 'image') {\n const img = imageTextures.get(layer.source);\n if (!img) return null;\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(blit.prog);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, img.tex);\n gl.uniform1i(blit.uTex, 0);\n const [sx, sy] = coverScale(w, h, img.width, img.height);\n gl.uniform2f(blit.uCoverScale, sx, sy);\n drawQuad();\n return s.scratchA.tex;\n }\n // Generative.\n const prog = shaderPrograms.get(layer.shader);\n if (!prog || !('uniforms' in layer)) return null;\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(prog.prog);\n gl.uniform1f(prog.uTime, now);\n gl.uniform2f(prog.uResolution, w, h);\n for (const [name, value] of Object.entries(mergedUniforms(layer))) {\n bindUniform(gl, prog.uniforms.get(name) ?? null, value);\n }\n drawQuad();\n return s.scratchA.tex;\n };\n\n gl.disable(gl.DEPTH_TEST);\n\n for (let i = 0; i < layers.length; i++) {\n const layer = layers[i];\n if (!layer) continue;\n const target = layer.target ?? 'background';\n const isBase = i === 0;\n\n const setOutputBlend = (): void => {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, w, h);\n if (isBase) {\n gl.disable(gl.BLEND);\n } else if (layer.blend === 'additive') {\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE); // premultiplied additive\n } else {\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); // premultiplied \"over\"\n }\n };\n\n if (target === 'subject') {\n // Subject layers need the mask; skip until it warms up.\n if (!s.maskTex || !subjectReady) continue;\n if (layer.shader === 'direct') {\n // One-pass fast path: cam x mask.\n if (!s.directSubject || !s.camera) continue;\n setOutputBlend();\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(s.directSubject.prog);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, s.camera.tex);\n gl.uniform1i(s.directSubject.uCamera, 0);\n bindMask(\n s.directSubject.uMask,\n s.directSubject.uMaskUvScale,\n s.directSubject.uMaskUvOffset,\n s.directSubject.uMaskLo,\n s.directSubject.uMaskHi,\n );\n drawQuad();\n } else {\n // Render the layer content to a scratch, then stencil it through the mask.\n if (!s.masked) continue;\n const contentTex = renderContentToScratch(layer);\n if (!contentTex) continue;\n setOutputBlend();\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(s.masked.prog);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, contentTex);\n gl.uniform1i(s.masked.uTex, 0);\n bindMask(\n s.masked.uMask,\n s.masked.uMaskUvScale,\n s.masked.uMaskUvOffset,\n s.masked.uMaskLo,\n s.masked.uMaskHi,\n );\n drawQuad();\n }\n continue;\n }\n\n // Background layers draw fullscreen.\n if (layer.shader === 'image') {\n const img = imageTextures.get(layer.source);\n if (!img) continue;\n setOutputBlend();\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(blit.prog);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, img.tex);\n gl.uniform1i(blit.uTex, 0);\n const [sx, sy] = coverScale(w, h, img.width, img.height);\n gl.uniform2f(blit.uCoverScale, sx, sy);\n drawQuad();\n } else if (layer.shader === 'direct') {\n // Raw camera fullscreen.\n if (!s.camera) continue;\n setOutputBlend();\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(s.camera.prog);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, s.camera.tex);\n gl.uniform1i(s.camera.uCamera, 0);\n drawQuad();\n } else if (layer.shader === 'blur') {\n const contentTex = renderContentToScratch(layer);\n if (!contentTex) continue;\n setOutputBlend();\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(blit.prog);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, contentTex);\n gl.uniform1i(blit.uTex, 0);\n gl.uniform2f(blit.uCoverScale, 1, 1);\n drawQuad();\n } else {\n // Generative background.\n const prog = shaderPrograms.get(layer.shader);\n if (!prog || !('uniforms' in layer)) continue;\n setOutputBlend();\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook.\n gl.useProgram(prog.prog);\n gl.uniform1f(prog.uTime, now);\n gl.uniform2f(prog.uResolution, w, h);\n for (const [name, value] of Object.entries(mergedUniforms(layer))) {\n bindUniform(gl, prog.uniforms.get(name) ?? null, value);\n }\n drawQuad();\n }\n }\n\n const out = new VideoFrame(canvas as unknown as CanvasImageSource, {\n timestamp: frame.timestamp,\n ...(frame.duration != null ? { duration: frame.duration } : {}),\n });\n frame.close();\n return out;\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export { SHADER_SOURCES as LAYER_SHADER_SOURCES } from '../shaders.generated';
2
+ //# sourceMappingURL=layer-shaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-shaders.d.ts","sourceRoot":"","sources":["../../../web-driver/effects/layer-shaders.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["// Generative layer-shader sources for the web composite compositor, keyed by the\n// shader name the compositor dispatches on. Single-sourced from the canonical\n// `shaders/<name>.frag` via `bun run build:shaders`, which emits the name ->\n// source registry. The compositor reads this directly, so adding a generative to\n// GENERATIVE_SHADERS registers it on web with no edit here.\nexport { SHADER_SOURCES as LAYER_SHADER_SOURCES } from '../shaders.generated';\n"]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LAYER_SHADER_SOURCES = void 0;
4
+ // Generative layer-shader sources for the web composite compositor, keyed by the
5
+ // shader name the compositor dispatches on. Single-sourced from the canonical
6
+ // `shaders/<name>.frag` via `bun run build:shaders`, which emits the name ->
7
+ // source registry. The compositor reads this directly, so adding a generative to
8
+ // GENERATIVE_SHADERS registers it on web with no edit here.
9
+ var shaders_generated_1 = require("../shaders.generated");
10
+ Object.defineProperty(exports, "LAYER_SHADER_SOURCES", { enumerable: true, get: function () { return shaders_generated_1.SHADER_SOURCES; } });
11
+ //# sourceMappingURL=layer-shaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-shaders.js","sourceRoot":"","sources":["../../../web-driver/effects/layer-shaders.ts"],"names":[],"mappings":";;;AAAA,iFAAiF;AACjF,8EAA8E;AAC9E,6EAA6E;AAC7E,iFAAiF;AACjF,4DAA4D;AAC5D,0DAA8E;AAArE,yHAAA,cAAc,OAAwB","sourcesContent":["// Generative layer-shader sources for the web composite compositor, keyed by the\n// shader name the compositor dispatches on. Single-sourced from the canonical\n// `shaders/<name>.frag` via `bun run build:shaders`, which emits the name ->\n// source registry. The compositor reads this directly, so adding a generative to\n// GENERATIVE_SHADERS registers it on web with no edit here.\nexport { SHADER_SOURCES as LAYER_SHADER_SOURCES } from '../shaders.generated';\n"]}
@@ -0,0 +1,4 @@
1
+ import type { TransformName } from '../../src/kaleidoscope/effect.types';
2
+ import type { FrameTransform } from '../insertable-streams';
3
+ export declare const makeTransform: (op: TransformName) => FrameTransform;
4
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../web-driver/effects/transform.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,aAAa,OAAQ,aAAa,KAAG,cAmDjD,CAAC","sourcesContent":["// Web transform effects: pure geometric reorientations of the frame (axis\n// flips and 90-degree rotations). Each draws the incoming VideoFrame to an\n// OffscreenCanvas with the matching 2D transform, then re-encodes the canvas as\n// a new VideoFrame preserving timestamp and duration.\n//\n// On web the frame is already in display space, so a flip on the canvas X axis\n// is a flip on the screen's horizontal axis with no rotation correction. These\n// are therefore the platform-reference behavior for the demo's calibration\n// toggles; the native pipelines have to correct for the landscape camera\n// buffer's rotation to land on the same on-screen result.\n//\n// makeTransform closes over its own canvas (one per pipeline stage) so two\n// stacked transform stages never fight over a shared scratch buffer.\n\nimport type { TransformName } from '../../src/kaleidoscope/effect.types';\nimport type { FrameTransform } from '../insertable-streams';\n\nexport const makeTransform = (op: TransformName): FrameTransform => {\n let canvas: OffscreenCanvas | null = null;\n let ctx: OffscreenCanvasRenderingContext2D | null = null;\n\n const ensureCanvas = (width: number, height: number): OffscreenCanvasRenderingContext2D => {\n if (!canvas || canvas.width !== width || canvas.height !== height) {\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('kaleidoscope: OffscreenCanvas 2D context unavailable');\n }\n }\n return ctx as OffscreenCanvasRenderingContext2D;\n };\n\n return async (frame) => {\n const w = frame.displayWidth;\n const h = frame.displayHeight;\n // 90-degree rotations swap the output dimensions.\n const rotated = op === 'rotate-cw' || op === 'rotate-ccw';\n const c = ensureCanvas(rotated ? h : w, rotated ? w : h);\n\n c.save();\n switch (op) {\n case 'flip-x':\n // Mirror about the vertical centerline: x -> w - x.\n c.setTransform(-1, 0, 0, 1, w, 0);\n break;\n case 'flip-y':\n // Mirror about the horizontal centerline: y -> h - y.\n c.setTransform(1, 0, 0, -1, 0, h);\n break;\n case 'rotate-cw':\n // 90 deg clockwise into the h x w canvas.\n c.setTransform(0, 1, -1, 0, h, 0);\n break;\n case 'rotate-ccw':\n // 90 deg counter-clockwise into the h x w canvas.\n c.setTransform(0, -1, 1, 0, 0, w);\n break;\n }\n c.drawImage(frame, 0, 0, w, h);\n c.restore();\n\n const out = new VideoFrame(canvas as unknown as CanvasImageSource, {\n timestamp: frame.timestamp,\n ...(frame.duration != null ? { duration: frame.duration } : {}),\n });\n frame.close();\n return out;\n };\n};\n"]}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ // Web transform effects: pure geometric reorientations of the frame (axis
3
+ // flips and 90-degree rotations). Each draws the incoming VideoFrame to an
4
+ // OffscreenCanvas with the matching 2D transform, then re-encodes the canvas as
5
+ // a new VideoFrame preserving timestamp and duration.
6
+ //
7
+ // On web the frame is already in display space, so a flip on the canvas X axis
8
+ // is a flip on the screen's horizontal axis with no rotation correction. These
9
+ // are therefore the platform-reference behavior for the demo's calibration
10
+ // toggles; the native pipelines have to correct for the landscape camera
11
+ // buffer's rotation to land on the same on-screen result.
12
+ //
13
+ // makeTransform closes over its own canvas (one per pipeline stage) so two
14
+ // stacked transform stages never fight over a shared scratch buffer.
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.makeTransform = void 0;
17
+ const makeTransform = (op) => {
18
+ let canvas = null;
19
+ let ctx = null;
20
+ const ensureCanvas = (width, height) => {
21
+ if (!canvas || canvas.width !== width || canvas.height !== height) {
22
+ canvas = new OffscreenCanvas(width, height);
23
+ ctx = canvas.getContext('2d');
24
+ if (!ctx) {
25
+ throw new Error('kaleidoscope: OffscreenCanvas 2D context unavailable');
26
+ }
27
+ }
28
+ return ctx;
29
+ };
30
+ return async (frame) => {
31
+ const w = frame.displayWidth;
32
+ const h = frame.displayHeight;
33
+ // 90-degree rotations swap the output dimensions.
34
+ const rotated = op === 'rotate-cw' || op === 'rotate-ccw';
35
+ const c = ensureCanvas(rotated ? h : w, rotated ? w : h);
36
+ c.save();
37
+ switch (op) {
38
+ case 'flip-x':
39
+ // Mirror about the vertical centerline: x -> w - x.
40
+ c.setTransform(-1, 0, 0, 1, w, 0);
41
+ break;
42
+ case 'flip-y':
43
+ // Mirror about the horizontal centerline: y -> h - y.
44
+ c.setTransform(1, 0, 0, -1, 0, h);
45
+ break;
46
+ case 'rotate-cw':
47
+ // 90 deg clockwise into the h x w canvas.
48
+ c.setTransform(0, 1, -1, 0, h, 0);
49
+ break;
50
+ case 'rotate-ccw':
51
+ // 90 deg counter-clockwise into the h x w canvas.
52
+ c.setTransform(0, -1, 1, 0, 0, w);
53
+ break;
54
+ }
55
+ c.drawImage(frame, 0, 0, w, h);
56
+ c.restore();
57
+ const out = new VideoFrame(canvas, {
58
+ timestamp: frame.timestamp,
59
+ ...(frame.duration != null ? { duration: frame.duration } : {}),
60
+ });
61
+ frame.close();
62
+ return out;
63
+ };
64
+ };
65
+ exports.makeTransform = makeTransform;
66
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../web-driver/effects/transform.ts"],"names":[],"mappings":"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","sourcesContent":["// Web transform effects: pure geometric reorientations of the frame (axis\n// flips and 90-degree rotations). Each draws the incoming VideoFrame to an\n// OffscreenCanvas with the matching 2D transform, then re-encodes the canvas as\n// a new VideoFrame preserving timestamp and duration.\n//\n// On web the frame is already in display space, so a flip on the canvas X axis\n// is a flip on the screen's horizontal axis with no rotation correction. These\n// are therefore the platform-reference behavior for the demo's calibration\n// toggles; the native pipelines have to correct for the landscape camera\n// buffer's rotation to land on the same on-screen result.\n//\n// makeTransform closes over its own canvas (one per pipeline stage) so two\n// stacked transform stages never fight over a shared scratch buffer.\n\nimport type { TransformName } from '../../src/kaleidoscope/effect.types';\nimport type { FrameTransform } from '../insertable-streams';\n\nexport const makeTransform = (op: TransformName): FrameTransform => {\n let canvas: OffscreenCanvas | null = null;\n let ctx: OffscreenCanvasRenderingContext2D | null = null;\n\n const ensureCanvas = (width: number, height: number): OffscreenCanvasRenderingContext2D => {\n if (!canvas || canvas.width !== width || canvas.height !== height) {\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('kaleidoscope: OffscreenCanvas 2D context unavailable');\n }\n }\n return ctx as OffscreenCanvasRenderingContext2D;\n };\n\n return async (frame) => {\n const w = frame.displayWidth;\n const h = frame.displayHeight;\n // 90-degree rotations swap the output dimensions.\n const rotated = op === 'rotate-cw' || op === 'rotate-ccw';\n const c = ensureCanvas(rotated ? h : w, rotated ? w : h);\n\n c.save();\n switch (op) {\n case 'flip-x':\n // Mirror about the vertical centerline: x -> w - x.\n c.setTransform(-1, 0, 0, 1, w, 0);\n break;\n case 'flip-y':\n // Mirror about the horizontal centerline: y -> h - y.\n c.setTransform(1, 0, 0, -1, 0, h);\n break;\n case 'rotate-cw':\n // 90 deg clockwise into the h x w canvas.\n c.setTransform(0, 1, -1, 0, h, 0);\n break;\n case 'rotate-ccw':\n // 90 deg counter-clockwise into the h x w canvas.\n c.setTransform(0, -1, 1, 0, 0, w);\n break;\n }\n c.drawImage(frame, 0, 0, w, h);\n c.restore();\n\n const out = new VideoFrame(canvas as unknown as CanvasImageSource, {\n timestamp: frame.timestamp,\n ...(frame.duration != null ? { duration: frame.duration } : {}),\n });\n frame.close();\n return out;\n };\n};\n"]}
@@ -0,0 +1,6 @@
1
+ export { makeComposite, resetLayerUniforms, setLayerUniforms } from './effects/composite';
2
+ export { makeTransform } from './effects/transform';
3
+ export type { DisposablePipeline, FrameTransform } from './insertable-streams';
4
+ export { applyEffectToTrack } from './insertable-streams';
5
+ export { tuning } from './tuning';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../web-driver/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC","sourcesContent":["// The web driver's public surface: the JS/WebGL rendering engine, a root-level\n// peer of android/ and ios/ (the three effect drivers; see PATTERNS.md). This\n// barrel is the contract the runtime web entry (src/index.web.ts) consumes; the\n// driver's internals (the segmenter, the generated shader sources, the per-layer\n// shader map) stay private to this folder. Only the composite/transform builders,\n// the Insertable-Streams stage applier, and the mutable tuning state cross the\n// boundary.\n\nexport { makeComposite, resetLayerUniforms, setLayerUniforms } from './effects/composite';\nexport { makeTransform } from './effects/transform';\nexport type { DisposablePipeline, FrameTransform } from './insertable-streams';\nexport { applyEffectToTrack } from './insertable-streams';\nexport { tuning } from './tuning';\n"]}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ // The web driver's public surface: the JS/WebGL rendering engine, a root-level
3
+ // peer of android/ and ios/ (the three effect drivers; see PATTERNS.md). This
4
+ // barrel is the contract the runtime web entry (src/index.web.ts) consumes; the
5
+ // driver's internals (the segmenter, the generated shader sources, the per-layer
6
+ // shader map) stay private to this folder. Only the composite/transform builders,
7
+ // the Insertable-Streams stage applier, and the mutable tuning state cross the
8
+ // boundary.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.tuning = exports.applyEffectToTrack = exports.makeTransform = exports.setLayerUniforms = exports.resetLayerUniforms = exports.makeComposite = void 0;
11
+ var composite_1 = require("./effects/composite");
12
+ Object.defineProperty(exports, "makeComposite", { enumerable: true, get: function () { return composite_1.makeComposite; } });
13
+ Object.defineProperty(exports, "resetLayerUniforms", { enumerable: true, get: function () { return composite_1.resetLayerUniforms; } });
14
+ Object.defineProperty(exports, "setLayerUniforms", { enumerable: true, get: function () { return composite_1.setLayerUniforms; } });
15
+ var transform_1 = require("./effects/transform");
16
+ Object.defineProperty(exports, "makeTransform", { enumerable: true, get: function () { return transform_1.makeTransform; } });
17
+ var insertable_streams_1 = require("./insertable-streams");
18
+ Object.defineProperty(exports, "applyEffectToTrack", { enumerable: true, get: function () { return insertable_streams_1.applyEffectToTrack; } });
19
+ var tuning_1 = require("./tuning");
20
+ Object.defineProperty(exports, "tuning", { enumerable: true, get: function () { return tuning_1.tuning; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../web-driver/index.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,+EAA+E;AAC/E,YAAY;;;AAEZ,iDAA0F;AAAjF,0GAAA,aAAa,OAAA;AAAE,+GAAA,kBAAkB,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAC5D,iDAAoD;AAA3C,0GAAA,aAAa,OAAA;AAEtB,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA;AAC3B,mCAAkC;AAAzB,gGAAA,MAAM,OAAA","sourcesContent":["// The web driver's public surface: the JS/WebGL rendering engine, a root-level\n// peer of android/ and ios/ (the three effect drivers; see PATTERNS.md). This\n// barrel is the contract the runtime web entry (src/index.web.ts) consumes; the\n// driver's internals (the segmenter, the generated shader sources, the per-layer\n// shader map) stay private to this folder. Only the composite/transform builders,\n// the Insertable-Streams stage applier, and the mutable tuning state cross the\n// boundary.\n\nexport { makeComposite, resetLayerUniforms, setLayerUniforms } from './effects/composite';\nexport { makeTransform } from './effects/transform';\nexport type { DisposablePipeline, FrameTransform } from './insertable-streams';\nexport { applyEffectToTrack } from './insertable-streams';\nexport { tuning } from './tuning';\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertable-streams.d.ts","sourceRoot":"","sources":["../../web-driver/insertable-streams.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAIxE,OAAO,CAAC,MAAM,CAAC,CAAC;IACd,UAAU,6BAA6B;QACrC,KAAK,EAAE,gBAAgB,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;IACD,UAAU,yBAAyB;QACjC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;KAC/C;IACD,IAAI,yBAAyB,EAAE;QAC7B,SAAS,EAAE,yBAAyB,CAAC;QACrC,KAAK,IAAI,EAAE,6BAA6B,GAAG,yBAAyB,CAAC;KACtE,CAAC;IAEF,UAAU,6BAA6B;QACrC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;KACzB;IACD,UAAU,yBAA0B,SAAQ,gBAAgB;QAC1D,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;KAC/C;IACD,IAAI,yBAAyB,EAAE;QAC7B,SAAS,EAAE,yBAAyB,CAAC;QACrC,KAAK,IAAI,EAAE,6BAA6B,GAAG,yBAAyB,CAAC;KACtE,CAAC;CACH;AAMD;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,kBAAkB,UACtB,gBAAgB,aACZ,cAAc,KACxB,kBAuDF,CAAC","sourcesContent":["// Insertable-Streams pipeline factory. Wires\n// MediaStreamTrackProcessor → TransformStream(transform) → MediaStreamTrackGenerator\n// and returns the generator track. Caller hands the new track to a `<video>`\n// element for preview, or to `RTCRtpSender.replaceTrack(...)` for a peer connection.\n//\n// Spec: https://www.w3.org/TR/mediacapture-transform/\n// Browsers: Chrome / Edge ship it. Safari and Firefox do not as of 2026-05;\n// we capability-check at call time and throw a typed error.\n\nexport type FrameTransform = (frame: VideoFrame) => Promise<VideoFrame>;\n\n// Insertable-Streams APIs are not yet in TypeScript's lib.dom.d.ts.\n// Local ambient declarations until they land upstream.\ndeclare global {\n interface MediaStreamTrackProcessorInit {\n track: MediaStreamTrack;\n maxBufferSize?: number;\n }\n interface MediaStreamTrackProcessor {\n readonly readable: ReadableStream<VideoFrame>;\n }\n var MediaStreamTrackProcessor: {\n prototype: MediaStreamTrackProcessor;\n new (init: MediaStreamTrackProcessorInit): MediaStreamTrackProcessor;\n };\n\n interface MediaStreamTrackGeneratorInit {\n kind: 'video' | 'audio';\n }\n interface MediaStreamTrackGenerator extends MediaStreamTrack {\n readonly writable: WritableStream<VideoFrame>;\n }\n var MediaStreamTrackGenerator: {\n prototype: MediaStreamTrackGenerator;\n new (init: MediaStreamTrackGeneratorInit): MediaStreamTrackGenerator;\n };\n}\n\nconst hasInsertableStreams = (): boolean =>\n typeof globalThis.MediaStreamTrackProcessor !== 'undefined' &&\n typeof globalThis.MediaStreamTrackGenerator !== 'undefined';\n\n/**\n * A running Insertable-Streams stage. `track` is the generator track carrying\n * transformed frames; `dispose` aborts the pipe and stops the generator so the\n * stage can be torn down (e.g. on a LiveKit camera flip) without leaking the\n * generator and its pull on the source track.\n */\nexport type DisposablePipeline = {\n track: MediaStreamTrack;\n dispose: () => void;\n};\n\nexport const applyEffectToTrack = (\n track: MediaStreamTrack,\n transform: FrameTransform,\n): DisposablePipeline => {\n if (!hasInsertableStreams()) {\n throw new Error(\n 'kaleidoscope: this browser lacks MediaStreamTrackProcessor / MediaStreamTrackGenerator (Insertable Streams). Effects require Chrome or Edge.',\n );\n }\n\n const processor = new MediaStreamTrackProcessor({ track });\n const generator = new MediaStreamTrackGenerator({ kind: 'video' });\n\n const transformer = new TransformStream<VideoFrame, VideoFrame>({\n async transform(frame, controller) {\n try {\n const out = await transform(frame);\n controller.enqueue(out);\n } catch (err) {\n try {\n frame.close();\n } catch {\n // already closed\n }\n controller.error(err);\n }\n },\n });\n\n // Abort signal lets `dispose()` cancel the pipe: aborting cancels the\n // readable (which stops the processor pulling from the source) and errors the\n // writable, ending the generator.\n const abort = new AbortController();\n processor.readable\n .pipeThrough(transformer)\n .pipeTo(generator.writable, { signal: abort.signal })\n .catch((err) => {\n // Pipeline aborts when the source track ends, is replaced, or dispose()\n // is called; not an error.\n if (err?.name !== 'AbortError') {\n console.error('kaleidoscope: pipeline error', err);\n }\n });\n\n const dispose = (): void => {\n try {\n abort.abort();\n } catch {\n // already aborted\n }\n try {\n generator.stop();\n } catch {\n // already stopped\n }\n };\n\n return { track: generator, dispose };\n};\n"]}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ // Insertable-Streams pipeline factory. Wires
3
+ // MediaStreamTrackProcessor → TransformStream(transform) → MediaStreamTrackGenerator
4
+ // and returns the generator track. Caller hands the new track to a `<video>`
5
+ // element for preview, or to `RTCRtpSender.replaceTrack(...)` for a peer connection.
6
+ //
7
+ // Spec: https://www.w3.org/TR/mediacapture-transform/
8
+ // Browsers: Chrome / Edge ship it. Safari and Firefox do not as of 2026-05;
9
+ // we capability-check at call time and throw a typed error.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.applyEffectToTrack = void 0;
12
+ const hasInsertableStreams = () => typeof globalThis.MediaStreamTrackProcessor !== 'undefined' &&
13
+ typeof globalThis.MediaStreamTrackGenerator !== 'undefined';
14
+ const applyEffectToTrack = (track, transform) => {
15
+ if (!hasInsertableStreams()) {
16
+ throw new Error('kaleidoscope: this browser lacks MediaStreamTrackProcessor / MediaStreamTrackGenerator (Insertable Streams). Effects require Chrome or Edge.');
17
+ }
18
+ const processor = new MediaStreamTrackProcessor({ track });
19
+ const generator = new MediaStreamTrackGenerator({ kind: 'video' });
20
+ const transformer = new TransformStream({
21
+ async transform(frame, controller) {
22
+ try {
23
+ const out = await transform(frame);
24
+ controller.enqueue(out);
25
+ }
26
+ catch (err) {
27
+ try {
28
+ frame.close();
29
+ }
30
+ catch {
31
+ // already closed
32
+ }
33
+ controller.error(err);
34
+ }
35
+ },
36
+ });
37
+ // Abort signal lets `dispose()` cancel the pipe: aborting cancels the
38
+ // readable (which stops the processor pulling from the source) and errors the
39
+ // writable, ending the generator.
40
+ const abort = new AbortController();
41
+ processor.readable
42
+ .pipeThrough(transformer)
43
+ .pipeTo(generator.writable, { signal: abort.signal })
44
+ .catch((err) => {
45
+ // Pipeline aborts when the source track ends, is replaced, or dispose()
46
+ // is called; not an error.
47
+ if (err?.name !== 'AbortError') {
48
+ console.error('kaleidoscope: pipeline error', err);
49
+ }
50
+ });
51
+ const dispose = () => {
52
+ try {
53
+ abort.abort();
54
+ }
55
+ catch {
56
+ // already aborted
57
+ }
58
+ try {
59
+ generator.stop();
60
+ }
61
+ catch {
62
+ // already stopped
63
+ }
64
+ };
65
+ return { track: generator, dispose };
66
+ };
67
+ exports.applyEffectToTrack = applyEffectToTrack;
68
+ //# sourceMappingURL=insertable-streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertable-streams.js","sourceRoot":"","sources":["../../web-driver/insertable-streams.ts"],"names":[],"mappings":";AAAA,6CAA6C;AAC7C,uFAAuF;AACvF,6EAA6E;AAC7E,qFAAqF;AACrF,EAAE;AACF,sDAAsD;AACtD,4EAA4E;AAC5E,4DAA4D;;;AA+B5D,MAAM,oBAAoB,GAAG,GAAY,EAAE,CACzC,OAAO,UAAU,CAAC,yBAAyB,KAAK,WAAW;IAC3D,OAAO,UAAU,CAAC,yBAAyB,KAAK,WAAW,CAAC;AAavD,MAAM,kBAAkB,GAAG,CAChC,KAAuB,EACvB,SAAyB,EACL,EAAE;IACtB,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,8IAA8I,CAC/I,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,yBAAyB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnE,MAAM,WAAW,GAAG,IAAI,eAAe,CAAyB;QAC9D,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU;YAC/B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;gBACnC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACP,iBAAiB;gBACnB,CAAC;gBACD,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,sEAAsE;IACtE,8EAA8E;IAC9E,kCAAkC;IAClC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,SAAS,CAAC,QAAQ;SACf,WAAW,CAAC,WAAW,CAAC;SACxB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;SACpD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,wEAAwE;QACxE,2BAA2B;QAC3B,IAAI,GAAG,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QACD,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC,CAAC;AA1DW,QAAA,kBAAkB,GAAlB,kBAAkB,CA0D7B","sourcesContent":["// Insertable-Streams pipeline factory. Wires\n// MediaStreamTrackProcessor → TransformStream(transform) → MediaStreamTrackGenerator\n// and returns the generator track. Caller hands the new track to a `<video>`\n// element for preview, or to `RTCRtpSender.replaceTrack(...)` for a peer connection.\n//\n// Spec: https://www.w3.org/TR/mediacapture-transform/\n// Browsers: Chrome / Edge ship it. Safari and Firefox do not as of 2026-05;\n// we capability-check at call time and throw a typed error.\n\nexport type FrameTransform = (frame: VideoFrame) => Promise<VideoFrame>;\n\n// Insertable-Streams APIs are not yet in TypeScript's lib.dom.d.ts.\n// Local ambient declarations until they land upstream.\ndeclare global {\n interface MediaStreamTrackProcessorInit {\n track: MediaStreamTrack;\n maxBufferSize?: number;\n }\n interface MediaStreamTrackProcessor {\n readonly readable: ReadableStream<VideoFrame>;\n }\n var MediaStreamTrackProcessor: {\n prototype: MediaStreamTrackProcessor;\n new (init: MediaStreamTrackProcessorInit): MediaStreamTrackProcessor;\n };\n\n interface MediaStreamTrackGeneratorInit {\n kind: 'video' | 'audio';\n }\n interface MediaStreamTrackGenerator extends MediaStreamTrack {\n readonly writable: WritableStream<VideoFrame>;\n }\n var MediaStreamTrackGenerator: {\n prototype: MediaStreamTrackGenerator;\n new (init: MediaStreamTrackGeneratorInit): MediaStreamTrackGenerator;\n };\n}\n\nconst hasInsertableStreams = (): boolean =>\n typeof globalThis.MediaStreamTrackProcessor !== 'undefined' &&\n typeof globalThis.MediaStreamTrackGenerator !== 'undefined';\n\n/**\n * A running Insertable-Streams stage. `track` is the generator track carrying\n * transformed frames; `dispose` aborts the pipe and stops the generator so the\n * stage can be torn down (e.g. on a LiveKit camera flip) without leaking the\n * generator and its pull on the source track.\n */\nexport type DisposablePipeline = {\n track: MediaStreamTrack;\n dispose: () => void;\n};\n\nexport const applyEffectToTrack = (\n track: MediaStreamTrack,\n transform: FrameTransform,\n): DisposablePipeline => {\n if (!hasInsertableStreams()) {\n throw new Error(\n 'kaleidoscope: this browser lacks MediaStreamTrackProcessor / MediaStreamTrackGenerator (Insertable Streams). Effects require Chrome or Edge.',\n );\n }\n\n const processor = new MediaStreamTrackProcessor({ track });\n const generator = new MediaStreamTrackGenerator({ kind: 'video' });\n\n const transformer = new TransformStream<VideoFrame, VideoFrame>({\n async transform(frame, controller) {\n try {\n const out = await transform(frame);\n controller.enqueue(out);\n } catch (err) {\n try {\n frame.close();\n } catch {\n // already closed\n }\n controller.error(err);\n }\n },\n });\n\n // Abort signal lets `dispose()` cancel the pipe: aborting cancels the\n // readable (which stops the processor pulling from the source) and errors the\n // writable, ending the generator.\n const abort = new AbortController();\n processor.readable\n .pipeThrough(transformer)\n .pipeTo(generator.writable, { signal: abort.signal })\n .catch((err) => {\n // Pipeline aborts when the source track ends, is replaced, or dispose()\n // is called; not an error.\n if (err?.name !== 'AbortError') {\n console.error('kaleidoscope: pipeline error', err);\n }\n });\n\n const dispose = (): void => {\n try {\n abort.abort();\n } catch {\n // already aborted\n }\n try {\n generator.stop();\n } catch {\n // already stopped\n }\n };\n\n return { track: generator, dispose };\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmenter.d.ts","sourceRoot":"","sources":["../../web-driver/segmenter.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IACzB,gBAAgB,EAAE,iBAAiB,CAAC;CACrC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,iBAAiB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAuCF,eAAO,MAAM,aAAa,QAAO,OAAO,CAAC,SAAS,CAsBjD,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,aAAa,QAAO,gBAAgB,GAAG,IAAqB,CAAC;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,UAAW,iBAAiB,KAAG,IAU5D,CAAC","sourcesContent":["// MediaPipe Selfie Segmentation loader. Single shared instance across every\n// web effect that needs a person mask (blur, a subject-masked layer, future\n// procedural backgrounds). The script is loaded once from a CDN; the\n// segmenter instance is cached for the lifetime of the page.\n//\n// CDN-loaded rather than bundled because @mediapipe/selfie_segmentation\n// ships a WASM blob and asset graph that does not play nicely with Metro;\n// we listed the npm package as an optionalDependency for typing only.\n\nconst CDN_BASE = 'https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation';\n\nexport type SegmenterResults = {\n image: CanvasImageSource;\n segmentationMask: CanvasImageSource;\n};\n\ntype SegmenterOptions = { selfieMode?: boolean; modelSelection?: number };\n\nexport type Segmenter = {\n initialize(): Promise<void>;\n setOptions(opts: SegmenterOptions): void;\n onResults(cb: (r: SegmenterResults) => void): void;\n send(input: { image: CanvasImageSource }): Promise<void>;\n close(): Promise<void>;\n};\n\ntype SegmenterCtor = new (config: { locateFile: (file: string) => string }) => Segmenter;\n\nlet segmenterPromise: Promise<Segmenter> | null = null;\n\n// Decoupled mask source (mirrors Android Mask.kt / iOS Segmenter.swift): the\n// render path reads the most recent mask without ever awaiting a fresh one, and\n// a single in-flight segmentation refreshes it. `onResults` is registered once,\n// at load, below.\nlet latestResults: SegmenterResults | null = null;\nlet inFlight = false;\nlet activeSegmenter: Segmenter | null = null;\n\nconst loadScript = (src: string): Promise<void> =>\n new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[src=\"${src}\"]`);\n if (existing) {\n if (existing.getAttribute('data-loaded') === 'true') {\n resolve();\n return;\n }\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => reject(new Error(`failed to load ${src}`)), {\n once: true,\n });\n return;\n }\n const script = document.createElement('script');\n script.src = src;\n script.crossOrigin = 'anonymous';\n script.addEventListener('load', () => {\n script.setAttribute('data-loaded', 'true');\n resolve();\n });\n script.addEventListener('error', () => reject(new Error(`failed to load ${src}`)));\n document.head.appendChild(script);\n });\n\nexport const loadSegmenter = (): Promise<Segmenter> => {\n if (segmenterPromise) return segmenterPromise;\n segmenterPromise = (async () => {\n await loadScript(`${CDN_BASE}/selfie_segmentation.js`);\n const SegCtor = (globalThis as unknown as { SelfieSegmentation?: SegmenterCtor })\n .SelfieSegmentation;\n if (!SegCtor) {\n throw new Error(\n 'kaleidoscope: MediaPipe Selfie Segmentation script loaded but SelfieSegmentation global is missing',\n );\n }\n const seg = new SegCtor({ locateFile: (file) => `${CDN_BASE}/${file}` });\n seg.setOptions({ modelSelection: 1, selfieMode: false });\n await seg.initialize();\n // Register once; every completed segmentation updates the cache.\n seg.onResults((r) => {\n latestResults = r;\n });\n activeSegmenter = seg;\n return seg;\n })();\n return segmenterPromise;\n};\n\n/** Most recent completed mask, or null before the first result. Non-blocking. */\nexport const getLatestMask = (): SegmenterResults | null => latestResults;\n\n/**\n * Kick a new segmentation if none is in flight; returns immediately. The result\n * lands in `getLatestMask()` via the `onResults` handler registered at load.\n * No-op until the segmenter has finished loading. `inFlight` clears when `send`\n * settles, so a failed call cannot wedge the pipeline.\n */\nexport const requestMaskIfIdle = (image: CanvasImageSource): void => {\n const seg = activeSegmenter;\n if (!seg || inFlight) return;\n inFlight = true;\n seg\n .send({ image })\n .catch(() => {})\n .finally(() => {\n inFlight = false;\n });\n};\n"]}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ // MediaPipe Selfie Segmentation loader. Single shared instance across every
3
+ // web effect that needs a person mask (blur, a subject-masked layer, future
4
+ // procedural backgrounds). The script is loaded once from a CDN; the
5
+ // segmenter instance is cached for the lifetime of the page.
6
+ //
7
+ // CDN-loaded rather than bundled because @mediapipe/selfie_segmentation
8
+ // ships a WASM blob and asset graph that does not play nicely with Metro;
9
+ // we listed the npm package as an optionalDependency for typing only.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.requestMaskIfIdle = exports.getLatestMask = exports.loadSegmenter = void 0;
12
+ const CDN_BASE = 'https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation';
13
+ let segmenterPromise = null;
14
+ // Decoupled mask source (mirrors Android Mask.kt / iOS Segmenter.swift): the
15
+ // render path reads the most recent mask without ever awaiting a fresh one, and
16
+ // a single in-flight segmentation refreshes it. `onResults` is registered once,
17
+ // at load, below.
18
+ let latestResults = null;
19
+ let inFlight = false;
20
+ let activeSegmenter = null;
21
+ const loadScript = (src) => new Promise((resolve, reject) => {
22
+ const existing = document.querySelector(`script[src="${src}"]`);
23
+ if (existing) {
24
+ if (existing.getAttribute('data-loaded') === 'true') {
25
+ resolve();
26
+ return;
27
+ }
28
+ existing.addEventListener('load', () => resolve(), { once: true });
29
+ existing.addEventListener('error', () => reject(new Error(`failed to load ${src}`)), {
30
+ once: true,
31
+ });
32
+ return;
33
+ }
34
+ const script = document.createElement('script');
35
+ script.src = src;
36
+ script.crossOrigin = 'anonymous';
37
+ script.addEventListener('load', () => {
38
+ script.setAttribute('data-loaded', 'true');
39
+ resolve();
40
+ });
41
+ script.addEventListener('error', () => reject(new Error(`failed to load ${src}`)));
42
+ document.head.appendChild(script);
43
+ });
44
+ const loadSegmenter = () => {
45
+ if (segmenterPromise)
46
+ return segmenterPromise;
47
+ segmenterPromise = (async () => {
48
+ await loadScript(`${CDN_BASE}/selfie_segmentation.js`);
49
+ const SegCtor = globalThis
50
+ .SelfieSegmentation;
51
+ if (!SegCtor) {
52
+ throw new Error('kaleidoscope: MediaPipe Selfie Segmentation script loaded but SelfieSegmentation global is missing');
53
+ }
54
+ const seg = new SegCtor({ locateFile: (file) => `${CDN_BASE}/${file}` });
55
+ seg.setOptions({ modelSelection: 1, selfieMode: false });
56
+ await seg.initialize();
57
+ // Register once; every completed segmentation updates the cache.
58
+ seg.onResults((r) => {
59
+ latestResults = r;
60
+ });
61
+ activeSegmenter = seg;
62
+ return seg;
63
+ })();
64
+ return segmenterPromise;
65
+ };
66
+ exports.loadSegmenter = loadSegmenter;
67
+ /** Most recent completed mask, or null before the first result. Non-blocking. */
68
+ const getLatestMask = () => latestResults;
69
+ exports.getLatestMask = getLatestMask;
70
+ /**
71
+ * Kick a new segmentation if none is in flight; returns immediately. The result
72
+ * lands in `getLatestMask()` via the `onResults` handler registered at load.
73
+ * No-op until the segmenter has finished loading. `inFlight` clears when `send`
74
+ * settles, so a failed call cannot wedge the pipeline.
75
+ */
76
+ const requestMaskIfIdle = (image) => {
77
+ const seg = activeSegmenter;
78
+ if (!seg || inFlight)
79
+ return;
80
+ inFlight = true;
81
+ seg
82
+ .send({ image })
83
+ .catch(() => { })
84
+ .finally(() => {
85
+ inFlight = false;
86
+ });
87
+ };
88
+ exports.requestMaskIfIdle = requestMaskIfIdle;
89
+ //# sourceMappingURL=segmenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmenter.js","sourceRoot":"","sources":["../../web-driver/segmenter.ts"],"names":[],"mappings":"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","sourcesContent":["// MediaPipe Selfie Segmentation loader. Single shared instance across every\n// web effect that needs a person mask (blur, a subject-masked layer, future\n// procedural backgrounds). The script is loaded once from a CDN; the\n// segmenter instance is cached for the lifetime of the page.\n//\n// CDN-loaded rather than bundled because @mediapipe/selfie_segmentation\n// ships a WASM blob and asset graph that does not play nicely with Metro;\n// we listed the npm package as an optionalDependency for typing only.\n\nconst CDN_BASE = 'https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation';\n\nexport type SegmenterResults = {\n image: CanvasImageSource;\n segmentationMask: CanvasImageSource;\n};\n\ntype SegmenterOptions = { selfieMode?: boolean; modelSelection?: number };\n\nexport type Segmenter = {\n initialize(): Promise<void>;\n setOptions(opts: SegmenterOptions): void;\n onResults(cb: (r: SegmenterResults) => void): void;\n send(input: { image: CanvasImageSource }): Promise<void>;\n close(): Promise<void>;\n};\n\ntype SegmenterCtor = new (config: { locateFile: (file: string) => string }) => Segmenter;\n\nlet segmenterPromise: Promise<Segmenter> | null = null;\n\n// Decoupled mask source (mirrors Android Mask.kt / iOS Segmenter.swift): the\n// render path reads the most recent mask without ever awaiting a fresh one, and\n// a single in-flight segmentation refreshes it. `onResults` is registered once,\n// at load, below.\nlet latestResults: SegmenterResults | null = null;\nlet inFlight = false;\nlet activeSegmenter: Segmenter | null = null;\n\nconst loadScript = (src: string): Promise<void> =>\n new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[src=\"${src}\"]`);\n if (existing) {\n if (existing.getAttribute('data-loaded') === 'true') {\n resolve();\n return;\n }\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => reject(new Error(`failed to load ${src}`)), {\n once: true,\n });\n return;\n }\n const script = document.createElement('script');\n script.src = src;\n script.crossOrigin = 'anonymous';\n script.addEventListener('load', () => {\n script.setAttribute('data-loaded', 'true');\n resolve();\n });\n script.addEventListener('error', () => reject(new Error(`failed to load ${src}`)));\n document.head.appendChild(script);\n });\n\nexport const loadSegmenter = (): Promise<Segmenter> => {\n if (segmenterPromise) return segmenterPromise;\n segmenterPromise = (async () => {\n await loadScript(`${CDN_BASE}/selfie_segmentation.js`);\n const SegCtor = (globalThis as unknown as { SelfieSegmentation?: SegmenterCtor })\n .SelfieSegmentation;\n if (!SegCtor) {\n throw new Error(\n 'kaleidoscope: MediaPipe Selfie Segmentation script loaded but SelfieSegmentation global is missing',\n );\n }\n const seg = new SegCtor({ locateFile: (file) => `${CDN_BASE}/${file}` });\n seg.setOptions({ modelSelection: 1, selfieMode: false });\n await seg.initialize();\n // Register once; every completed segmentation updates the cache.\n seg.onResults((r) => {\n latestResults = r;\n });\n activeSegmenter = seg;\n return seg;\n })();\n return segmenterPromise;\n};\n\n/** Most recent completed mask, or null before the first result. Non-blocking. */\nexport const getLatestMask = (): SegmenterResults | null => latestResults;\n\n/**\n * Kick a new segmentation if none is in flight; returns immediately. The result\n * lands in `getLatestMask()` via the `onResults` handler registered at load.\n * No-op until the segmenter has finished loading. `inFlight` clears when `send`\n * settles, so a failed call cannot wedge the pipeline.\n */\nexport const requestMaskIfIdle = (image: CanvasImageSource): void => {\n const seg = activeSegmenter;\n if (!seg || inFlight) return;\n inFlight = true;\n seg\n .send({ image })\n .catch(() => {})\n .finally(() => {\n inFlight = false;\n });\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export { COMPOSITE_BLUR_FRAG_SRC, COMPOSITE_CAMERA_FRAG_SRC, COMPOSITE_IMAGE_FRAG_SRC, COMPOSITE_MASKED_FRAG_SRC, COMPOSITE_SUBJECT_FRAG_SRC, PASSTHROUGH_VERT_SRC, } from './shaders.generated';
2
+ //# sourceMappingURL=shaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaders.d.ts","sourceRoot":"","sources":["../../web-driver/shaders.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,qBAAqB,CAAC","sourcesContent":["// Web GLSL entry point. The shader source is generated from the canonical\n// `shaders/*.frag` / `*.vert` by `bun run build:shaders` into\n// `./shaders.generated`; this module re-exports it so web effect code imports\n// from one stable path. Do not hand-edit the generated file.\n//\n// The compositor folds every effect into one layered stage (see\n// web-driver/effects/composite.ts). The shared sources the runtime imports from here:\n// - PASSTHROUGH_VERT_SRC: full-screen quad via gl_VertexID (no VAO/VBO);\n// caller does gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4).\n// - COMPOSITE_CAMERA_FRAG_SRC: the camera/direct layer (canonical\n// shaders/_shared/composite-camera.frag).\n// - COMPOSITE_BLUR_FRAG_SRC: the camera-sampling blur layer (canonical\n// shaders/blur/composite-blur.frag).\n// - COMPOSITE_IMAGE_FRAG_SRC: cover-fit image layer, also the scratch blit\n// (canonical shaders/_shared/composite-image.frag).\n// - COMPOSITE_SUBJECT_FRAG_SRC / COMPOSITE_MASKED_FRAG_SRC: the masked person\n// and the masked-scratch stencil (canonical shaders/_shared/composite-*.frag).\nexport {\n COMPOSITE_BLUR_FRAG_SRC,\n COMPOSITE_CAMERA_FRAG_SRC,\n COMPOSITE_IMAGE_FRAG_SRC,\n COMPOSITE_MASKED_FRAG_SRC,\n COMPOSITE_SUBJECT_FRAG_SRC,\n PASSTHROUGH_VERT_SRC,\n} from './shaders.generated';\n"]}