react-native-webrtc-kaleidoscope 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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":"shaders.generated.js","sourceRoot":"","sources":["../../web-driver/shaders.generated.ts"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,6CAA6C;;;AAEhC,QAAA,oBAAoB,GAAG;;;;;;;;CAQnC,CAAC;AAEW,QAAA,yBAAyB,GAAG;;;;;;;;CAQxC,CAAC;AAEW,QAAA,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBtC,CAAC;AAEW,QAAA,wBAAwB,GAAG;;;;;;;;;;;CAWvC,CAAC;AAEW,QAAA,0BAA0B,GAAG;;;;;;;;;;;;;;;;;CAiBzC,CAAC;AAEW,QAAA,yBAAyB,GAAG;;;;;;;;;;;;;;;;;CAiBxC,CAAC;AAEW,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC9B,CAAC;AAEW,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuG9B,CAAC;AAEW,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiI9B,CAAC;AAEW,QAAA,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyE/B,CAAC;AAEW,QAAA,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDjC,CAAC;AAEW,QAAA,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiIpC,CAAC;AAEW,QAAA,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4G5C,CAAC;AAEW,QAAA,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2O7C,CAAC;AAEW,QAAA,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsMvC,CAAC;AAEF,+EAA+E;AAC/E,uEAAuE;AAC1D,QAAA,cAAc,GAAqC;IAC9D,QAAQ,EAAE,QAAA,eAAe;IACzB,QAAQ,EAAE,QAAA,eAAe;IACzB,QAAQ,EAAE,QAAA,eAAe;IACzB,SAAS,EAAE,QAAA,gBAAgB;IAC3B,WAAW,EAAE,QAAA,kBAAkB;IAC/B,cAAc,EAAE,QAAA,qBAAqB;IACrC,sBAAsB,EAAE,QAAA,6BAA6B;IACrD,uBAAuB,EAAE,QAAA,8BAA8B;IACvD,iBAAiB,EAAE,QAAA,wBAAwB;CACnC,CAAC","sourcesContent":["// @generated by scripts/build-shaders.ts from shaders/. DO NOT EDIT.\n// Run `bun run build:shaders` to regenerate.\n\nexport const PASSTHROUGH_VERT_SRC = `#version 300 es\nprecision highp float;\nout highp vec2 vUv;\nvoid main() {\n vec2 p = vec2(float((gl_VertexID & 1) << 1), float(gl_VertexID & 2));\n vUv = p * 0.5;\n gl_Position = vec4(p - 1.0, 0.0, 1.0);\n}\n`;\n\nexport const COMPOSITE_CAMERA_FRAG_SRC = `#version 300 es\nprecision highp float;\nuniform sampler2D uCamera;\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n oColor = vec4(texture(uCamera, vUv).rgb, 1.0);\n}\n`;\n\nexport const COMPOSITE_BLUR_FRAG_SRC = `#version 300 es\nprecision highp float;\nuniform sampler2D uTex;\nuniform vec2 uDir;\nuniform float uSigma;\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n float s2 = 2.0 * uSigma * uSigma;\n float w[7];\n float sum = 0.0;\n for (int i = 0; i < 7; i++) {\n w[i] = exp(-(float(i) * float(i)) / s2);\n sum += (i == 0) ? w[i] : 2.0 * w[i];\n }\n float spread = uSigma * 0.25;\n vec4 acc = texture(uTex, vUv) * (w[0] / sum);\n for (int i = 1; i < 7; i++) {\n vec2 off = uDir * float(i) * spread;\n acc += texture(uTex, vUv + off) * (w[i] / sum);\n acc += texture(uTex, vUv - off) * (w[i] / sum);\n }\n oColor = acc;\n}\n`;\n\nexport const COMPOSITE_IMAGE_FRAG_SRC = `#version 300 es\nprecision highp float;\nuniform sampler2D uTex;\nuniform vec2 uCoverScale;\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec2 uv = (vUv - 0.5) * uCoverScale + 0.5;\n vec4 c = texture(uTex, uv);\n oColor = vec4(c.rgb * c.a, c.a);\n}\n`;\n\nexport const COMPOSITE_SUBJECT_FRAG_SRC = `#version 300 es\nprecision highp float;\nuniform sampler2D uCamera;\nuniform sampler2D uMask;\nuniform vec2 uMaskUvScale;\nuniform vec2 uMaskUvOffset;\nuniform float uMaskLo;\nuniform float uMaskHi;\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec3 cam = texture(uCamera, vUv).rgb;\n float raw = texture(uMask, vUv * uMaskUvScale + uMaskUvOffset).r;\n float safeHi = max(uMaskHi, uMaskLo + 0.001);\n float a = clamp(smoothstep(uMaskLo, safeHi, raw), 0.0, 1.0);\n oColor = vec4(cam * a, a);\n}\n`;\n\nexport const COMPOSITE_MASKED_FRAG_SRC = `#version 300 es\nprecision highp float;\nuniform sampler2D uTex;\nuniform sampler2D uMask;\nuniform vec2 uMaskUvScale;\nuniform vec2 uMaskUvOffset;\nuniform float uMaskLo;\nuniform float uMaskHi;\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec4 c = texture(uTex, vUv);\n float raw = texture(uMask, vUv * uMaskUvScale + uMaskUvOffset).r;\n float safeHi = max(uMaskHi, uMaskLo + 0.001);\n float a = clamp(smoothstep(uMaskLo, safeHi, raw), 0.0, 1.0);\n oColor = c * a;\n}\n`;\n\nexport const PLASMA_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime; // seconds, monotonically increasing; range [0, inf)\nuniform vec2 uResolution; // framebuffer size in pixels; both components > 0\nuniform vec3 uColorA; // first palette color, linear-ish RGB in [0, 1]\nuniform vec3 uColorB; // second palette color, linear-ish RGB in [0, 1]\nuniform float uSpeed; // animation rate multiplier; 0 freezes the field\nuniform float uScale; // spatial frequency; higher = more, tighter cells\n\nin highp vec2 vUv;\nout vec4 oColor;\n\nvoid main() {\n // Aspect-correct, screen-centered coordinates (matches nebula.frag): divide\n // by the height so uScale reads the same regardless of aspect ratio.\n vec2 fragCoord = vUv * uResolution;\n vec2 uv = (fragCoord - 0.5 * uResolution) / uResolution.y;\n\n float t = uTime * uSpeed;\n\n // Classic demoscene plasma: a few sines of position and time. The radial\n // term (length(uv)) gives the field an organic, non-grid-aligned drift.\n float v = sin(uv.x * uScale + t);\n v += sin(uv.y * uScale + t * 0.8);\n v += sin((uv.x + uv.y) * uScale * 0.7 + t * 1.3);\n v += sin(length(uv) * uScale * 1.2 - t);\n\n // v ranges roughly [-4, 4]; fold through sin to a smooth [0, 1] mix factor.\n float mixT = 0.5 + 0.5 * sin(v);\n\n // Opaque procedural background; the person is composited over it downstream.\n oColor = vec4(mix(uColorA, uColorB, mixT), 1.0);\n}\n`;\n\nexport const CLOUDS_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime;\nuniform vec2 uResolution;\nuniform vec3 uSkyLowColor;\nuniform vec3 uSkyHighColor;\nuniform vec3 uCloudLightColor;\nuniform vec3 uCloudDarkColor;\nuniform float uExposure;\nuniform float uStepSize;\nuniform float uCloudSpeed;\nuniform float uCloudScale;\nuniform float uDensity;\nuniform float uCoverage;\nuniform float uSoftness;\n\nin highp vec2 vUv;\nout vec4 oColor;\n\n// STEPS must stay a compile-time constant (GLSL ES loop bound).\n#define STEPS 48\n\nfloat hash(vec3 p) {\n p = fract(p * 0.3183099 + 0.1);\n p *= 17.0;\n return fract(p.x * p.y * p.z * (p.x + p.y + p.z));\n}\n\nfloat rand(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nfloat noise(vec3 p) {\n vec3 i = floor(p);\n vec3 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(\n mix(hash(i + vec3(0,0,0)), hash(i + vec3(1,0,0)), f.x),\n mix(hash(i + vec3(0,1,0)), hash(i + vec3(1,1,0)), f.x),\n f.y),\n mix(\n mix(hash(i + vec3(0,0,1)), hash(i + vec3(1,0,1)), f.x),\n mix(hash(i + vec3(0,1,1)), hash(i + vec3(1,1,1)), f.x),\n f.y),\n f.z);\n}\n\nfloat fbm(vec3 p) {\n float v = 0.0;\n float a = 0.5;\n for (int i = 0; i < 5; i++) {\n v += a * noise(p);\n p *= 2.03;\n a *= 0.5;\n }\n return v;\n}\n\nfloat cloudDensity(vec3 p) {\n p += vec3(uTime * uCloudSpeed, 0.0, uTime * uCloudSpeed * 0.35);\n // Outside the slab the height mask is 0, so the sample is 0; bail before fbm.\n if (p.y <= 0.0 || p.y >= 3.0) return 0.0;\n float n = fbm(p * uCloudScale);\n float bottom = smoothstep(0.0, 0.7, p.y);\n float top = smoothstep(3.0, 1.2, p.y);\n float heightMask = bottom * top;\n float cloud = smoothstep(uCoverage, uCoverage + uSoftness, n);\n return cloud * heightMask;\n}\n\nvoid main() {\n vec2 fragCoord = vUv * uResolution;\n vec2 uv = (fragCoord - 0.5 * uResolution) / uResolution.y;\n vec3 ro = vec3(0.0, 1.2, -4.0);\n vec3 rd = normalize(vec3(uv, 1.5));\n float skyGradient = clamp(rd.y * 0.5 + 0.5, 0.0, 1.0);\n vec3 skyColor = mix(uSkyLowColor, uSkyHighColor, skyGradient);\n vec3 accum = vec3(0.0);\n float alpha = 0.0;\n float t = rand(fragCoord) * uStepSize;\n for (int i = 0; i < STEPS; i++) {\n vec3 p = ro + rd * t;\n // The slab is crossed monotonically in t; once past it, all samples are 0.\n if (rd.y > 0.0 && p.y >= 3.0) break;\n if (rd.y < 0.0 && p.y <= 0.0) break;\n float d = cloudDensity(p);\n if (d > 0.01) {\n float light = smoothstep(0.4, 2.8, p.y);\n vec3 sampleColor = mix(uCloudDarkColor, uCloudLightColor, light);\n float a = d * uDensity;\n accum += (1.0 - alpha) * sampleColor * a;\n alpha += (1.0 - alpha) * a;\n }\n t += uStepSize;\n if (alpha > 0.95) break;\n }\n vec3 color = mix(skyColor, accum, alpha);\n color *= uExposure;\n color = pow(color, vec3(0.9));\n oColor = vec4(color, 1.0);\n}\n`;\n\nexport const NEBULA_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime; // seconds, monotonically increasing; range [0, inf)\nuniform vec2 uResolution; // framebuffer size in pixels; both components > 0\nuniform vec3 uColor; // overall tint / color grade; [1,1,1] = untinted\nuniform float uBrightness; // final glow multiplier; 1.0 = stock\nuniform float uSpeed; // drift + rotation rate; 1.0 = stock, 0 freezes\nuniform float uTwinkleSpeed; // star color-cycle rate; 1.0 = stock\nuniform float uScale; // starfield zoom / density; >1 = more, smaller stars\nuniform float uStarGlow; // star-core size; 1.0 = stock\n\nin highp vec2 vUv;\nout vec4 oColor;\n\nconst float PI = 3.14159265;\nconst float MIN_DIVIDE = 64.0;\nconst float MAX_DIVIDE = 0.01;\n// Number of stacked starfield layers. Compile-time constant so the layer\n// loop has a fixed integer bound (cross-compile-safe; no float loop counter).\nconst int STARFIELD_LAYERS_COUNT = 12;\n\nmat2 Rotate(float angle) {\n float s = sin(angle);\n float c = cos(angle);\n return mat2(c, -s, s, c);\n}\n\nfloat Star(vec2 uv, float flaresize, float rotAngle, float randomN) {\n float d = length(uv);\n // Star core. Guard the division: length(uv) can be exactly 0 at a cell\n // center, which yields inf/NaN under Metal. max(d, 1e-4) caps the core\n // brightness without visibly changing the look (the concentric\n // smoothstep fade below already clamps it).\n float starcore = 0.05 * uStarGlow / max(d, 1e-4);\n uv *= Rotate(-2.0 * PI * rotAngle);\n float flareMax = 1.0;\n\n // flares\n float starflares = max(0.0, flareMax - abs(uv.x * uv.y * 3000.0));\n starcore += starflares * flaresize;\n uv *= Rotate(PI * 0.25);\n starflares = max(0.0, flareMax - abs(uv.x * uv.y * 3000.0));\n starcore += starflares * 0.3 * flaresize;\n // light can't go forever, fade it concentrically.\n starcore *= smoothstep(1.0, 0.05, d);\n return starcore;\n}\n\nfloat PseudoRandomizer(vec2 p) {\n // not really random, but it looks random.\n p = fract(p * vec2(123.45, 345.67));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nvec3 StarFieldLayer(vec2 uv, float rotAngle) {\n vec3 col = vec3(0.0);\n\n vec2 gv = fract(uv) - 0.5;\n vec2 id = floor(uv);\n\n float deltaTimeTwinkle = uTime * 0.35 * uTwinkleSpeed;\n\n // sweep the 8 neighbors plus the home cell so stars are not clipped at\n // cell borders. Constant 3x3 bounds.\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 offset = vec2(float(x), float(y));\n\n float randomN = PseudoRandomizer(id + offset); // 0..1\n float randoX = randomN - 0.5;\n float randoY = fract(randomN * 45.0) - 0.5;\n vec2 randomPosition = gv - offset - vec2(randoX, randoY);\n // fract trick: random sizes\n float size = fract(randomN * 1356.33);\n float flareSwitch = smoothstep(0.9, 1.0, size);\n float star = Star(randomPosition, flareSwitch, rotAngle, randomN);\n\n // fract trick: random colors\n float randomStarColorSeed = fract(randomN * 2150.0) * (3.0 * PI) * deltaTimeTwinkle;\n vec3 color = sin(vec3(0.7, 0.3, 0.9) * randomStarColorSeed);\n\n // compress\n color = color * (0.4 * sin(deltaTimeTwinkle)) + 0.6;\n // filter\n color = color * vec3(1.0, 0.1, 0.9 + size);\n float dimByDensity = 15.0 / float(STARFIELD_LAYERS_COUNT);\n col += star * size * color * dimByDensity;\n }\n }\n\n return col;\n}\n\nvoid main() {\n // ShaderToy fragCoord, reconstructed from vUv (see header).\n vec2 fragCoord = vUv * uResolution;\n\n // Normalized pixel coordinates centered at screen middle.\n vec2 uv = (fragCoord - 0.5 * uResolution.xy) / uResolution.y;\n\n float deltaTime = uTime * 0.01 * uSpeed;\n\n vec3 col = vec3(0.0);\n\n float rotAngle = deltaTime * 0.09;\n\n // Layer accumulation. Integer-counted loop replacing the original\n // \\`for (float i = 0.0; i < 1.0; i += 1.0/COUNT)\\`. With n in [0, COUNT),\n // i = n/COUNT reproduces the exact same {0, 1/N, 2/N, ...} sequence and\n // the same iteration count, so visual output is unchanged; only the loop\n // form is cross-compile-safe.\n for (int n = 0; n < STARFIELD_LAYERS_COUNT; n++) {\n float i = float(n) / float(STARFIELD_LAYERS_COUNT);\n float layerDepth = fract(i + deltaTime);\n float layerScale = mix(MIN_DIVIDE, MAX_DIVIDE, layerDepth);\n float layerFader = layerDepth * smoothstep(0.1, 1.1, layerDepth);\n float layerOffset = i * (3430.0 + fract(i));\n mat2 layerRot = Rotate(rotAngle * i * -10.0);\n uv *= layerRot;\n vec2 starfieldUv = uv * layerScale * uScale + layerOffset;\n col += StarFieldLayer(starfieldUv, rotAngle) * layerFader;\n }\n\n // Glow + color grade, then opaque procedural background.\n col *= uBrightness * uColor;\n oColor = vec4(col, 1.0);\n}\n`;\n\nexport const GODRAYS_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime; // seconds, monotonically increasing\nuniform vec2 uResolution; // framebuffer size in pixels\nuniform vec3 uLightColor; // ray tint (linear-ish RGB, 0..1)\nuniform float uRayCount; // number of ray bands\nuniform float uRaySpeed; // drift speed\nuniform float uRayIntensity; // overall brightness / additive strength\nuniform float uRaySoftness; // edge falloff exponent (higher = crisper shafts)\nuniform float uTopGlow; // extra glow concentrated near the top\nuniform float uFadeDistance; // vertical falloff from the top\nuniform float uWobbleAmount; // horizontal wobble magnitude\nuniform float uWobbleSpeed; // wobble animation speed\n\nin highp vec2 vUv;\nout vec4 oColor;\n\nfloat hash(float n) {\n return fract(sin(n) * 43758.5453123);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n\n f = f * f * (3.0 - 2.0 * f);\n\n float a = hash(i.x + i.y * 57.0);\n float b = hash(i.x + 1.0 + i.y * 57.0);\n float c = hash(i.x + (i.y + 1.0) * 57.0);\n float d = hash(i.x + 1.0 + (i.y + 1.0) * 57.0);\n\n return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nvoid main() {\n // vUv is already 0..1 with bottom-left origin; this is the Shadertoy \\`uv\\`.\n vec2 uv = vUv;\n\n float aspect = uResolution.x / uResolution.y;\n vec2 p = uv;\n p.x = (p.x - 0.5) * aspect + 0.5;\n\n float t = uTime;\n float fromTop = 1.0 - uv.y;\n\n float verticalFade = exp(-fromTop * uFadeDistance);\n float topGlow = exp(-fromTop * 8.0) * uTopGlow;\n\n float wobble =\n (noise(vec2(uv.y * 3.0, t * uWobbleSpeed)) - 0.5) * uWobbleAmount;\n\n float rayCoord = (p.x + wobble) * uRayCount;\n\n float raysA = sin(rayCoord + t * uRaySpeed);\n float raysB = sin(rayCoord * 1.73 - t * uRaySpeed * 0.7);\n\n float rays = raysA * 0.65 + raysB * 0.35;\n rays = rays * 0.5 + 0.5;\n rays = pow(rays, uRaySoftness);\n\n float shimmer = noise(vec2(uv.x * 10.0, uv.y * 4.0 - t * 0.3));\n rays *= mix(0.75, 1.25, shimmer);\n\n float alpha = rays * verticalFade * uRayIntensity;\n alpha += topGlow * uRayIntensity;\n alpha = clamp(alpha, 0.0, 1.0);\n\n // Premultiplied additive output: rgb already scaled by alpha.\n vec3 rayColor = uLightColor * alpha;\n oColor = vec4(rayColor, alpha);\n}\n`;\n\nexport const FIREFLIES_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime;\nuniform vec2 uResolution;\nuniform float uGlowSize;\nuniform float uDotSize;\nuniform float uSpeed;\nuniform float uTwinkle;\nuniform vec3 uColor;\n\nin highp vec2 vUv;\nout vec4 oColor;\n\n#define FIREFLY_COUNT 36\n\nfloat hash(float n) {\n return fract(sin(n) * 43758.5453123);\n}\n\nvec2 fireflyPos(float id, float t) {\n vec2 base = vec2(hash(id * 12.7), hash(id * 31.3));\n float a = hash(id * 5.1) * 6.28318;\n float b = hash(id * 9.7) * 6.28318;\n vec2 drift = vec2(sin(t * uSpeed + a), cos(t * uSpeed * 0.73 + b)) * 0.12;\n return fract(base + drift);\n}\n\nvoid main() {\n vec2 uv = vUv;\n vec2 p = uv;\n p.x *= uResolution.x / uResolution.y;\n vec3 color = vec3(0.0);\n float alpha = 0.0;\n for (int i = 0; i < FIREFLY_COUNT; i++) {\n float id = float(i);\n vec2 pos = fireflyPos(id, uTime);\n pos.x *= uResolution.x / uResolution.y;\n float d = length(p - pos);\n float phase = hash(id * 17.1) * 6.28318;\n float pulse = 0.5 + 0.5 * sin(uTime * uTwinkle + phase);\n pulse = pulse * pulse * sqrt(pulse); // pow(pulse, 2.5): a non-integer pow is ~2 transcendentals on mobile; this is 1 sqrt + 2 muls\n float glow = exp(-d * d / (uGlowSize * uGlowSize));\n float core = smoothstep(uDotSize, 0.0, d);\n float intensity = pulse * (glow * 0.55 + core * 1.4);\n color += uColor * intensity;\n alpha += intensity * 0.55;\n }\n alpha = clamp(alpha, 0.0, 1.0);\n color = clamp(color, 0.0, 1.0);\n oColor = vec4(color, alpha);\n}\n`;\n\nexport const SIMIANLIGHTS_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime; // seconds, monotonically increasing; range [0, inf)\nuniform vec2 uResolution; // framebuffer size in pixels; both components > 0\nuniform vec3 uColor; // overall tint / color grade; [1,1,1] = untinted\nuniform float uBrightness; // final glow multiplier; 1.0 = stock\nuniform float uSpeed; // drift + rotation rate; 1.0 = stock, 0 freezes\nuniform float uTwinkleSpeed; // star color-cycle rate; 1.0 = stock\nuniform float uScale; // starfield zoom / density; >1 = more, smaller stars\nuniform float uStarGlow; // star-core size; 1.0 = stock\n\nin highp vec2 vUv;\nout vec4 oColor;\n\nconst float PI = 3.14159265;\nconst float MIN_DIVIDE = 3.0;\nconst float MAX_DIVIDE = 0.01;\n// Number of stacked starfield layers. Compile-time constant so the layer\n// loop has a fixed integer bound (cross-compile-safe; no float loop counter).\nconst int STARFIELD_LAYERS_COUNT = 4;\n\nmat2 Rotate(float angle) {\n float s = sin(angle);\n float c = cos(angle);\n return mat2(c, -s, s, c);\n}\n\nfloat Star(vec2 uv, float flaresize, float rotAngle, float randomN) {\n float d = length(uv);\n // Star core. Guard the division: length(uv) can be exactly 0 at a cell\n // center, which yields inf/NaN under Metal. max(d, 1e-4) caps the core\n // brightness without visibly changing the look (the concentric\n // smoothstep fade below already clamps it).\n float starcore = 0.09 * uStarGlow / max(d, 1e-4);\n uv *= Rotate(-2.0 * PI * rotAngle);\n float flareMax = 1.0;\n\n // flares\n float starflares = max(0.0, flareMax - abs(uv.x * uv.y * 3000.0));\n starcore += starflares * flaresize;\n uv *= Rotate(PI * 0.25);\n starflares = max(0.0, flareMax - abs(uv.x * uv.y * 3000.0));\n starcore += starflares * 0.3 * flaresize;\n // light can't go forever, fade it concentrically.\n starcore *= smoothstep(1.0, 0.05, d);\n return starcore;\n}\n\nfloat PseudoRandomizer(vec2 p) {\n // not really random, but it looks random.\n p = fract(p * vec2(123.45, 345.67));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nvec3 StarFieldLayer(vec2 uv, float rotAngle) {\n vec3 col = vec3(0.0);\n\n vec2 gv = fract(uv) - 0.5;\n vec2 id = floor(uv);\n\n float deltaTimeTwinkle = uTime * 0.35 * uTwinkleSpeed;\n\n // sweep the 8 neighbors plus the home cell so stars are not clipped at\n // cell borders. Constant 3x3 bounds.\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 offset = vec2(float(x), float(y));\n\n float randomN = PseudoRandomizer(id + offset); // 0..1\n float randoX = randomN - 0.5;\n float randoY = fract(randomN * 45.0) - 0.5;\n vec2 randomPosition = gv - offset - vec2(randoX, randoY);\n // fract trick: random sizes\n float size = fract(randomN * 1356.33);\n float flareSwitch = smoothstep(0.9, 1.0, size);\n float star = Star(randomPosition, flareSwitch, rotAngle, randomN);\n\n // fract trick: random colors\n float randomStarColorSeed = fract(randomN * 2150.0) * (3.0 * PI) * deltaTimeTwinkle;\n vec3 color = sin(vec3(0.7, 0.3, 0.9) * randomStarColorSeed);\n\n // compress\n color = color * (0.4 * sin(deltaTimeTwinkle)) + 0.6;\n // filter\n color = color * vec3(1.0, 0.1, 0.9 + size);\n float dimByDensity = 15.0 / float(STARFIELD_LAYERS_COUNT);\n col += star * size * color * dimByDensity;\n }\n }\n\n return col;\n}\n\nvoid main() {\n // ShaderToy fragCoord, reconstructed from vUv (see header).\n vec2 fragCoord = vUv * uResolution;\n\n // Normalized pixel coordinates centered at screen middle.\n vec2 uv = (fragCoord - 0.5 * uResolution.xy) / uResolution.y;\n\n float deltaTime = uTime * 0.01 * uSpeed;\n\n vec3 col = vec3(0.0);\n\n float rotAngle = deltaTime * 0.09;\n\n // Layer accumulation. Integer-counted loop replacing the original\n // \\`for (float i = 0.0; i < 1.0; i += 1.0/COUNT)\\`. With n in [0, COUNT),\n // i = n/COUNT reproduces the exact same {0, 1/N, 2/N, ...} sequence and\n // the same iteration count, so visual output is unchanged; only the loop\n // form is cross-compile-safe.\n for (int n = 0; n < STARFIELD_LAYERS_COUNT; n++) {\n float i = float(n) / float(STARFIELD_LAYERS_COUNT);\n float layerDepth = fract(i + deltaTime);\n float layerScale = mix(MIN_DIVIDE, MAX_DIVIDE, layerDepth);\n float layerFader = layerDepth * smoothstep(0.1, 1.1, layerDepth);\n float layerOffset = i * (3430.0 + fract(i));\n mat2 layerRot = Rotate(rotAngle * i * -10.0);\n uv *= layerRot;\n vec2 starfieldUv = uv * layerScale * uScale + layerOffset;\n col += StarFieldLayer(starfieldUv, rotAngle) * layerFader;\n }\n\n // Glow + color grade, then opaque procedural background.\n col *= uBrightness * uColor;\n oColor = vec4(col, 1.0);\n}\n`;\n\nexport const ANAMORPHIC_LENSFLARE_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime; // seconds, monotonically increasing; range [0, inf)\nuniform float uFlareX; // flare X position, 0..1 (drifts slowly around this)\nuniform float uFlareY; // flare Y position, 0..1 (0 = bottom)\nuniform float uIntensity; // overall brightness multiplier\nuniform float uStreakLength; // horizontal streak reach; higher = longer\nuniform float uStreakWidth; // main streak vertical tightness; higher = thinner\nuniform float uGhostStrength; // optical-ghost strength along the flare axis\nuniform vec3 uWarmColor; // core / warm streak tint\nuniform vec3 uBlueColor; // halo / wide-streak tint\nuniform vec3 uPinkColor; // secondary streak / ghost tint\n\nin highp vec2 vUv;\nout vec4 oColor;\n\nfloat softOrb(vec2 uv, vec2 center, float radius) {\n float d = length(uv - center);\n float q = d / radius; // pow(q, 2.0) -> q*q; spirv-opt does not strength-reduce it\n return exp(-q * q);\n}\n\nfloat softStreak(vec2 uv, vec2 center, float width, float length) {\n float yFalloff = exp(-abs(uv.y - center.y) * width);\n float xFalloff = exp(-abs(uv.x - center.x) * length);\n return yFalloff * xFalloff;\n}\n\nvoid main() {\n // ShaderToy uv = fragCoord / iResolution; identical to vUv here.\n vec2 uv = vUv;\n\n // Slow horizontal drift.\n float horizontalDrift = sin(uTime * 0.18) * 0.10;\n vec2 flarePos = vec2(uFlareX + horizontalDrift, uFlareY);\n\n vec3 col = vec3(0.0);\n float alpha = 0.0;\n\n // Main source.\n float core = softOrb(uv, flarePos, 0.022);\n float bloom = softOrb(uv, flarePos, 0.095);\n float outerHalo = softOrb(uv, flarePos, 0.28);\n\n col += vec3(1.0) * core * 1.8;\n col += uWarmColor * bloom * 0.95;\n col += uBlueColor * outerHalo * 0.16;\n\n alpha += core * 0.45;\n alpha += bloom * 0.22;\n alpha += outerHalo * 0.045;\n\n // Moving streak intensity.\n float sweepGlow = 0.85 + 0.15 * sin(uTime * 0.7 + uv.x * 8.0);\n\n // Main + wide anamorphic streaks.\n float mainStreak = softStreak(uv, flarePos, uStreakWidth, uStreakLength);\n float wideStreak = softStreak(uv, flarePos, 70.0, uStreakLength * 0.65);\n\n col += uWarmColor * mainStreak * 1.15 * sweepGlow;\n col += uBlueColor * wideStreak * 0.26 * sweepGlow;\n\n alpha += mainStreak * 0.18;\n alpha += wideStreak * 0.055;\n\n // Secondary colored streaks.\n float upperLine = softStreak(uv, flarePos + vec2(0.0, 0.012), 260.0, uStreakLength * 0.7);\n float lowerLine = softStreak(uv, flarePos - vec2(0.0, 0.010), 240.0, uStreakLength * 0.8);\n\n col += uBlueColor * upperLine * 0.22;\n col += uPinkColor * lowerLine * 0.16;\n\n alpha += (upperLine + lowerLine) * 0.035;\n\n // Optical ghosts along the line from the flare through screen center.\n vec2 center = vec2(0.5);\n vec2 axis = center - flarePos;\n\n vec2 ghost1 = flarePos + axis * 0.45;\n vec2 ghost2 = flarePos + axis * 0.85;\n vec2 ghost3 = flarePos + axis * 1.28;\n vec2 ghost4 = flarePos - axis * 0.35;\n\n float g1 = softOrb(uv, ghost1, 0.070);\n float g2 = softOrb(uv, ghost2, 0.115);\n float g3 = softOrb(uv, ghost3, 0.055);\n float g4 = softOrb(uv, ghost4, 0.095);\n\n col += uPinkColor * g1 * 0.18 * uGhostStrength;\n col += uBlueColor * g2 * 0.15 * uGhostStrength;\n col += uWarmColor * g3 * 0.22 * uGhostStrength;\n col += uBlueColor * g4 * 0.10 * uGhostStrength;\n\n alpha += g1 * 0.040 * uGhostStrength;\n alpha += g2 * 0.035 * uGhostStrength;\n alpha += g3 * 0.050 * uGhostStrength;\n alpha += g4 * 0.030 * uGhostStrength;\n\n // Tiny shimmer to keep it alive.\n float shimmer = 0.97 + 0.03 * sin(uTime * 2.1);\n\n col *= uIntensity * shimmer;\n alpha *= uIntensity * shimmer;\n\n alpha = clamp(alpha, 0.0, 1.0);\n oColor = vec4(col, alpha);\n}\n`;\n\nexport const LIGHT_BEAMS_AND_MOTES_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime; // seconds, monotonically increasing; range [0, inf)\nuniform float uSpeed; // animation rate; 1.0 = stock, 0 freezes the field\nuniform float uBeamSoftness; // beam polygon edge softness\nuniform float uOverlayAlpha; // overall overlay opacity, applied to final alpha\n\n// Per-beam: a row-major quad (TL, TR, BL, BR; y-up), a color, a fill strength\n// (absolute), and an on/off flag. A disabled beam's quadMask + sins do not execute\n// at all (the flag is uniform, so the branch is coherent across every fragment) --\n// that is how you stop paying for beams you are not using.\nuniform vec2 uBeam1Poly[4];\nuniform vec3 uBeam1Color;\nuniform float uBeam1Alpha;\nuniform float uBeam1On;\nuniform vec2 uBeam2Poly[4];\nuniform vec3 uBeam2Color;\nuniform float uBeam2Alpha;\nuniform float uBeam2On;\nuniform vec2 uBeam3Poly[4];\nuniform vec3 uBeam3Color;\nuniform float uBeam3Alpha;\nuniform float uBeam3On;\n\nuniform float uMoteAlpha; // mote brightness (absolute)\nuniform float uGlowSize; // mote glow radius, in mote-size multiples\nuniform float uMoteCount; // active motes (<= MOTE_COUNT); a coherent break trims the loop\n\nin highp vec2 vUv;\nout vec4 oColor;\n\n// ---------- Mote controls (internal constants) ----------\n#define MOTE_COUNT 128 // loop bound: compile-time constant, not a uniform\n#define DRIFT_SPEED 0.060\n#define FALL_SPEED 0.012\n#define SWIRL_AMOUNT 0.065\n#define TURBULENCE 0.030\n#define MOTE_SIZE_MIN 0.0013\n#define MOTE_SIZE_MAX 0.0048\n\nfloat hash1(float n) {\n return fract(sin(n) * 43758.5453123);\n}\n\nvec2 hash2(float n) {\n return vec2(hash1(n + 11.17), hash1(n + 47.83));\n}\n\nfloat softMote(vec2 uv, vec2 center, float radius) {\n float d = length(uv - center);\n float q = d / radius; // pow(q, 2.0) -> q*q; spirv-opt does not strength-reduce it\n return exp(-q * q);\n}\n\n// Soft convex quad mask, winding-AGNOSTIC: the corners are user-draggable, so the\n// perimeter can wind either way. A point is inside when it is on the same side of\n// all four edges, whichever side that is; product the positive-side smoothsteps and\n// the negative-side ones and keep the larger.\nfloat quadMask(vec2 p, vec2 a, vec2 b, vec2 c, vec2 d, float softness) {\n vec2 e0 = b - a;\n vec2 e1 = c - b;\n vec2 e2 = d - c;\n vec2 e3 = a - d;\n float s0 = e0.x * (p.y - a.y) - e0.y * (p.x - a.x);\n float s1 = e1.x * (p.y - b.y) - e1.y * (p.x - b.x);\n float s2 = e2.x * (p.y - c.y) - e2.y * (p.x - c.x);\n float s3 = e3.x * (p.y - d.y) - e3.y * (p.x - d.x);\n float inNeg =\n smoothstep(-softness, softness, -s0) *\n smoothstep(-softness, softness, -s1) *\n smoothstep(-softness, softness, -s2) *\n smoothstep(-softness, softness, -s3);\n float inPos =\n smoothstep(-softness, softness, s0) *\n smoothstep(-softness, softness, s1) *\n smoothstep(-softness, softness, s2) *\n smoothstep(-softness, softness, s3);\n return max(inNeg, inPos);\n}\n\n// Subtle animated variation inside each beam.\nfloat beamTexture(vec2 uv, float seed) {\n float t = uTime * uSpeed;\n float broadBands = 0.55 + 0.45 * sin(uv.x * 7.0 + uv.y * 4.0 + t * 0.06 + seed);\n float fineBands = 0.75 + 0.25 * sin(uv.x * 23.0 - uv.y * 11.0 + t * 0.11 + seed * 2.7);\n return mix(0.65, 1.0, broadBands * fineBands);\n}\n\n// Geometric coverage of one row-major beam quad at uv (mask * texture, 0..~1), with\n// the row-major -> perimeter reorder folded in. Independent of the beam's alpha.\nfloat beamShape(vec2 uv, vec2 poly[4], float seed) {\n return quadMask(uv, poly[0], poly[1], poly[3], poly[2], uBeamSoftness) * beamTexture(uv, seed);\n}\n\n// Evaluate the three beams once. Returns the GEOMETRIC coverage sum (used to gate +\n// brighten motes and to drive the haze, so per-beam alpha never dims the motes);\n// writes \\`color\\` (the geometry-weighted beam hue, for fill and motes) and \\`litSum\\`\n// (the alpha-weighted amount, the actual fill brightness/opacity).\nfloat evalBeams(vec2 uv, out vec3 color, out float litSum) {\n float a1 = 0.0;\n float a2 = 0.0;\n float a3 = 0.0;\n if (uBeam1On > 0.5) a1 = beamShape(uv, uBeam1Poly, 1.0);\n if (uBeam2On > 0.5) a2 = beamShape(uv, uBeam2Poly, 8.0);\n if (uBeam3On > 0.5) a3 = beamShape(uv, uBeam3Poly, 14.0);\n\n float geomSum = a1 + a2 + a3;\n color = (uBeam1Color * a1 + uBeam2Color * a2 + uBeam3Color * a3) / max(geomSum, 0.0001);\n litSum = a1 * uBeam1Alpha + a2 * uBeam2Alpha + a3 * uBeam3Alpha;\n return geomSum;\n}\n\n// Accumulate the dust motes for ALL on beams in ONE loop. Each mote is round-\n// robined to an on beam (mote n -> the (n mod nActive)-th on beam) and spawned in\n// THAT beam's (u,v) space: every mote lands in a beam, takes the beam's color, and\n// gets a cheap (u,v) edge falloff -- no screen-space scatter to cull, no per-mote\n// quadMask. n and nActive are uniform across fragments, so the beam pick is\n// COHERENT (same for every pixel), not a divergent per-pixel branch. Motes drift\n// ALONG the beam (fall in v, swirl in u) and wrap, fading at the boundaries so the\n// wrap is never a visible pop. Total mote count is uMoteCount regardless of how\n// many beams are on -- the on beams share the budget.\nvoid addMotes(vec2 uv, inout vec3 col, inout float alpha) {\n float nActive = uBeam1On + uBeam2On + uBeam3On; // on-flags are 0/1\n if (nActive < 0.5) return; // no beams -> no motes\n\n // Motes may spill past the polygon edge by ~softness so the soft fringe is\n // populated; the (u,v) falloff dims them there.\n float fuzz = clamp(uBeamSoftness * 2.0, 0.03, 0.35);\n float slot = 0.0; // round-robin cursor over the on beams (a wrapped counter, no per-mote mod)\n\n for (int n = 0; n < MOTE_COUNT; n++) {\n if (float(n) >= uMoteCount) break; // runtime-tunable mote count (coherent break)\n float seed = float(n) * 91.73;\n\n // Round-robin: this mote goes to the slot-th on beam. Walk the beams,\n // counting on ones; the slot-th match wins.\n float picked = 0.0;\n vec2 tl = vec2(0.0);\n vec2 tr = vec2(0.0);\n vec2 bl = vec2(0.0);\n vec2 br = vec2(0.0);\n vec3 color = vec3(0.0);\n if (uBeam1On > 0.5) {\n if (abs(picked - slot) < 0.5) {\n tl = uBeam1Poly[0]; tr = uBeam1Poly[1]; bl = uBeam1Poly[2]; br = uBeam1Poly[3];\n color = uBeam1Color;\n }\n picked += 1.0;\n }\n if (uBeam2On > 0.5) {\n if (abs(picked - slot) < 0.5) {\n tl = uBeam2Poly[0]; tr = uBeam2Poly[1]; bl = uBeam2Poly[2]; br = uBeam2Poly[3];\n color = uBeam2Color;\n }\n picked += 1.0;\n }\n if (uBeam3On > 0.5) {\n if (abs(picked - slot) < 0.5) {\n tl = uBeam3Poly[0]; tr = uBeam3Poly[1]; bl = uBeam3Poly[2]; br = uBeam3Poly[3];\n color = uBeam3Color;\n }\n picked += 1.0;\n }\n\n float depth = hash1(seed + 3.0);\n float size = mix(MOTE_SIZE_MIN, MOTE_SIZE_MAX, depth);\n float speed = mix(0.45, 1.35, hash1(seed + 5.0));\n float t = uTime * uSpeed * speed;\n\n // (u,v) in beam space; drift = swirl in u, fall in v. fract wraps within\n // the beam, so a mote that falls out the spread end reappears at the source.\n vec2 g = hash2(seed);\n g.x += sin(t * DRIFT_SPEED * 1.7 + seed) * SWIRL_AMOUNT;\n g.x += sin(t * DRIFT_SPEED * 3.9 + seed * 0.41) * TURBULENCE;\n g.y += uTime * uSpeed * FALL_SPEED * speed * 6.0;\n g.y += sin(t * DRIFT_SPEED * 2.4 + seed * 0.37) * SWIRL_AMOUNT * 0.55;\n g = fract(g);\n\n // Expand to [-fuzz, 1+fuzz] so motes populate the soft fringe, then map\n // bilinearly onto the quad.\n vec2 q = g * (1.0 + 2.0 * fuzz) - fuzz;\n vec2 pos = mix(mix(tl, tr, q.x), mix(bl, br, q.x), q.y);\n\n // Cheap soft-edge falloff in (u,v), replacing the per-mote quadMask.\n float edge =\n smoothstep(0.0, fuzz, q.x) * smoothstep(0.0, fuzz, 1.0 - q.x) *\n smoothstep(0.0, fuzz, q.y) * smoothstep(0.0, fuzz, 1.0 - q.y);\n\n float mote = softMote(uv, pos, size);\n float core = softMote(uv, pos, size * 0.42);\n float glow = softMote(uv, pos, size * uGlowSize);\n\n float shimmer =\n 0.72 + 0.28 * sin(uTime * uSpeed * mix(0.22, 0.95, hash1(seed + 9.0)) + seed);\n float strength = mix(0.15, 1.0, depth) * shimmer * edge * uMoteAlpha;\n\n col += color * glow * strength * 0.12;\n col += color * mote * strength * 0.36;\n col += vec3(1.0) * core * strength * 0.10;\n\n alpha += glow * strength * 0.030;\n alpha += mote * strength * 0.105;\n alpha += core * strength * 0.110;\n\n slot += 1.0;\n if (slot >= nActive) slot = 0.0; // wrap the round-robin cursor\n }\n}\n\nvoid main() {\n // vUv is already 0..1 with bottom-left origin; this is the Shadertoy uv.\n vec2 uv = vUv;\n\n vec3 col = vec3(0.0);\n float alpha = 0.0;\n\n vec3 beamColor;\n float litSum;\n float cover = evalBeams(uv, beamColor, litSum);\n\n col += beamColor * litSum; // litSum carries each beam's per-beam alpha\n alpha += litSum * 0.45;\n\n // One loop; each mote is round-robined into an on beam and spawned there.\n addMotes(uv, col, alpha);\n\n float haze =\n cover * cover * (0.6 + 0.4 * sin(uv.x * 8.0 + uv.y * 5.0 + uTime * uSpeed * 0.08));\n col += beamColor * haze * 0.018;\n alpha += haze * 0.010;\n\n alpha = clamp(alpha * uOverlayAlpha, 0.0, 1.0);\n oColor = vec4(col, alpha);\n}\n`;\n\nexport const CORPORATE_BLOBS_FRAG_SRC = `#version 300 es\nprecision highp float;\n\nuniform float uTime; // seconds, monotonically increasing; range [0, inf)\nuniform vec2 uResolution; // framebuffer size in pixels; both components > 0\nuniform vec3 uColor; // overall tint / color grade; [1,1,1] = stock colors\nuniform float uGlobalAlpha; // overall blob opacity; stock 0.58\nuniform float uScale; // global blob size multiplier; stock 2.55\nuniform float uEdgePull; // pushes blobs outward from center; stock 0.32\nuniform float uCenterClear; // radius around center that repels blobs; stock 0.42\nuniform float uMotionAmount; // positional drift magnitude; 1.0 = stock, 0 = still\nuniform float uMotionSpeed; // drift + morph rate; 1.0 = stock, 0 freezes motion\nuniform float uEdgeSoftness; // blob edge falloff; stock 0.024\n// Per-blob base colors, multiplied by uColor at output. Defaults (the stock\n// brand palette) live in CORPORATE_BLOBS_CONTROLS.\nuniform vec3 uBlobColor1; // stock: light blue\nuniform vec3 uBlobColor2; // stock: dark green\nuniform vec3 uBlobColor3; // stock: yellow\nuniform vec3 uBlobColor4; // stock: orange\nuniform vec3 uBlobColor5; // stock: light green\nuniform vec3 uBlobColor6; // stock: magenta\nuniform vec3 uBlobColor7; // stock: brown\nuniform vec3 uBlobColor8; // stock: dark blue\n\nin highp vec2 vUv;\nout vec4 oColor;\n\n// BLOB_COUNT must stay a compile-time constant (GLSL ES loop bound).\n#define BLOB_COUNT 8\n\n// Internal animation constants (not tunable; keep the look coherent).\n#define CENTER_CLEAR_PUSH 0.34\n#define SCALE_PULSE_AMOUNT 0.10\n#define SCALE_PULSE_SPEED 0.42\n#define ROTATION_SWAY_AMOUNT 0.12\n#define ROTATION_SWAY_SPEED 0.11\n#define SHAPE_MORPH_SPEED 1.00\n\nstruct Blob {\n vec2 pos;\n float scale;\n float opacity;\n float speed;\n float drift;\n float rotation;\n float variant;\n vec3 color;\n};\n\nBlob getBlob(float i) {\n if (i < 0.5) return Blob(vec2(-1.18, -0.55), 0.62, 0.48, 0.22, 0.14, 0.10, 0.0, uBlobColor1);\n if (i < 1.5) return Blob(vec2( 1.12, -0.35), 0.66, 0.40, 0.18, 0.13, 1.00, 1.0, uBlobColor2);\n if (i < 2.5) return Blob(vec2( 0.95, 0.88), 0.58, 0.44, 0.20, 0.14, 2.20, 2.0, uBlobColor3);\n if (i < 3.5) return Blob(vec2(-0.98, 0.82), 0.56, 0.38, 0.16, 0.12, 0.70, 3.0, uBlobColor4);\n if (i < 4.5) return Blob(vec2( 1.28, 0.28), 0.50, 0.34, 0.24, 0.11, 1.80, 4.0, uBlobColor5);\n if (i < 5.5) return Blob(vec2(-0.25, -1.12), 0.54, 0.36, 0.19, 0.11, 2.60, 5.0, uBlobColor6);\n if (i < 6.5) return Blob(vec2(-1.30, 0.10), 0.48, 0.30, 0.17, 0.12, 0.40, 6.0, uBlobColor7);\n return Blob(vec2( 0.28, 1.18), 0.52, 0.30, 0.14, 0.10, 0.90, 7.0, uBlobColor8);\n}\n\nmat2 rotate2d(float a) {\n float s = sin(a);\n float c = cos(a);\n return mat2(c, -s, s, c);\n}\n\nfloat variantRadius(float angle, float variant, float phase) {\n float r = 1.0;\n\n if (variant < 0.5) {\n r += 0.115 * sin(angle * 2.0 + 0.20 + phase * 0.20);\n r += 0.075 * sin(angle * 3.0 - 1.10 - phase * 0.13);\n r += 0.035 * sin(angle * 5.0 + 2.00 + phase * 0.09);\n } else if (variant < 1.5) {\n r += 0.090 * sin(angle * 2.0 - 0.80 + phase * 0.18);\n r += 0.105 * sin(angle * 3.0 + 0.70 - phase * 0.10);\n r += 0.030 * sin(angle * 6.0 - 1.50 + phase * 0.08);\n } else if (variant < 2.5) {\n r += 0.130 * sin(angle * 2.0 + 1.10 + phase * 0.16);\n r += 0.060 * sin(angle * 4.0 - 0.30 - phase * 0.12);\n r += 0.045 * sin(angle * 5.0 + 2.80 + phase * 0.07);\n } else if (variant < 3.5) {\n r += 0.080 * sin(angle * 2.0 + 2.30 + phase * 0.14);\n r += 0.120 * sin(angle * 3.0 - 0.40 - phase * 0.11);\n r += 0.040 * sin(angle * 7.0 + 1.10 + phase * 0.06);\n } else if (variant < 4.5) {\n r += 0.035 * sin(angle * 2.0 + 0.10 + phase * 0.12);\n r += 0.030 * sin(angle * 3.0 + 1.80 - phase * 0.09);\n r += 0.020 * sin(angle * 5.0 - 0.90 + phase * 0.05);\n } else if (variant < 5.5) {\n r += 0.145 * sin(angle * 2.0 - 1.30 + phase * 0.17);\n r += 0.070 * sin(angle * 3.0 + 2.40 - phase * 0.11);\n r += 0.035 * sin(angle * 5.0 + 0.20 + phase * 0.08);\n } else if (variant < 6.5) {\n r += 0.045 * sin(angle * 2.0 + 1.70 + phase * 0.10);\n r += 0.035 * sin(angle * 4.0 - 2.10 - phase * 0.08);\n r += 0.025 * sin(angle * 6.0 + 0.50 + phase * 0.05);\n } else {\n r += 0.170 * sin(angle * 2.0 + 2.80 + phase * 0.20);\n r += 0.090 * sin(angle * 3.0 - 1.90 - phase * 0.15);\n r += 0.055 * sin(angle * 5.0 + 0.80 + phase * 0.09);\n }\n\n return r;\n}\n\nvec2 applyCenterRepulsor(vec2 center) {\n float d = length(center);\n vec2 dir = normalize(center + vec2(0.0001, 0.0001));\n\n center += dir * uEdgePull;\n\n float centerInfluence = 1.0 - smoothstep(uCenterClear, uCenterClear + 0.35, d);\n center += dir * centerInfluence * CENTER_CLEAR_PUSH;\n\n return center;\n}\n\nfloat animatedScale(float baseScale, float blobIndex, float blobSpeed) {\n float localPhase =\n uTime * SCALE_PULSE_SPEED * (0.65 + blobSpeed * 1.35) +\n blobIndex * 2.731;\n\n float pulseA = sin(localPhase);\n float pulseB = sin(localPhase * 0.47 + blobIndex * 5.13) * 0.45;\n\n float scaleMultiplier = 1.0 + (pulseA + pulseB) * SCALE_PULSE_AMOUNT;\n\n return baseScale * max(0.05, scaleMultiplier);\n}\n\nfloat blobMask(vec2 p, vec2 center, Blob b, float phase, float liveScale) {\n vec2 q = p - center;\n\n vec2 squash = vec2(\n 1.0 + 0.14 * sin(b.variant * 1.91),\n 1.0 + 0.14 * cos(b.variant * 2.37)\n );\n\n float rotationSway =\n sin(uTime * ROTATION_SWAY_SPEED * (0.6 + b.speed) + b.variant * 3.0) *\n ROTATION_SWAY_AMOUNT;\n\n q = rotate2d(b.rotation + rotationSway) * q;\n q /= squash;\n\n float angle = atan(q.y, q.x);\n float dist = length(q);\n\n float r = liveScale * uScale * 0.5 * variantRadius(angle, b.variant, phase);\n\n return 1.0 - smoothstep(r, r + uEdgeSoftness, dist);\n}\n\nvoid main() {\n vec2 uv = vUv;\n\n vec2 p = uv * 2.0 - 1.0;\n p.x *= uResolution.x / uResolution.y;\n\n vec3 blobCol = vec3(0.0);\n float blobAlpha = 0.0;\n\n // Integer-counted loop over a compile-time bound; i is reconstructed as\n // float(n), so the per-blob lookups and phases match the prototype.\n for (int n = 0; n < BLOB_COUNT; n++) {\n float i = float(n);\n Blob b = getBlob(i);\n\n float phase =\n uTime * b.speed * uMotionSpeed * SHAPE_MORPH_SPEED +\n i * 4.137;\n\n vec2 center = b.pos;\n\n center.x += sin(phase * 0.41 + i * 1.70) * b.drift * uMotionAmount;\n center.x += sin(phase * 0.19 + i * 3.10) * b.drift * uMotionAmount * 0.45;\n center.y += cos(phase * 0.33 + i * 2.30) * b.drift * uMotionAmount * 0.75;\n center.y += sin(phase * 0.17 + i * 4.40) * b.drift * uMotionAmount * 0.35;\n\n center = applyCenterRepulsor(center);\n\n float liveScale = animatedScale(b.scale, i, b.speed);\n float mask = blobMask(p, center, b, phase, liveScale);\n\n float inner = pow(mask, 1.35);\n float rim = mask * (1.0 - smoothstep(0.45, 1.0, mask));\n\n vec3 gelColor = b.color * inner + b.color * rim * 0.18;\n float a = mask * b.opacity * uGlobalAlpha;\n\n blobCol += gelColor * a * (1.0 - blobAlpha);\n blobAlpha += a * (1.0 - blobAlpha);\n }\n\n // Premultiplied output; tint grades the (premultiplied) color, not alpha.\n oColor = vec4(blobCol * uColor, blobAlpha);\n}\n`;\n\n// Generative background shaders, by name. The generic shader processor and the\n// dispatch iterate this; adding a generative .frag adds an entry here.\nexport const SHADER_SOURCES: Readonly<Record<string, string>> = {\n 'plasma': PLASMA_FRAG_SRC,\n 'clouds': CLOUDS_FRAG_SRC,\n 'nebula': NEBULA_FRAG_SRC,\n 'godrays': GODRAYS_FRAG_SRC,\n 'fireflies': FIREFLIES_FRAG_SRC,\n 'simianlights': SIMIANLIGHTS_FRAG_SRC,\n 'anamorphic-lensflare': ANAMORPHIC_LENSFLARE_FRAG_SRC,\n 'light-beams-and-motes': LIGHT_BEAMS_AND_MOTES_FRAG_SRC,\n 'corporate-blobs': CORPORATE_BLOBS_FRAG_SRC,\n} as const;\n"]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PASSTHROUGH_VERT_SRC = exports.COMPOSITE_SUBJECT_FRAG_SRC = exports.COMPOSITE_MASKED_FRAG_SRC = exports.COMPOSITE_IMAGE_FRAG_SRC = exports.COMPOSITE_CAMERA_FRAG_SRC = exports.COMPOSITE_BLUR_FRAG_SRC = void 0;
4
+ // Web GLSL entry point. The shader source is generated from the canonical
5
+ // `shaders/*.frag` / `*.vert` by `bun run build:shaders` into
6
+ // `./shaders.generated`; this module re-exports it so web effect code imports
7
+ // from one stable path. Do not hand-edit the generated file.
8
+ //
9
+ // The compositor folds every effect into one layered stage (see
10
+ // web-driver/effects/composite.ts). The shared sources the runtime imports from here:
11
+ // - PASSTHROUGH_VERT_SRC: full-screen quad via gl_VertexID (no VAO/VBO);
12
+ // caller does gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4).
13
+ // - COMPOSITE_CAMERA_FRAG_SRC: the camera/direct layer (canonical
14
+ // shaders/_shared/composite-camera.frag).
15
+ // - COMPOSITE_BLUR_FRAG_SRC: the camera-sampling blur layer (canonical
16
+ // shaders/blur/composite-blur.frag).
17
+ // - COMPOSITE_IMAGE_FRAG_SRC: cover-fit image layer, also the scratch blit
18
+ // (canonical shaders/_shared/composite-image.frag).
19
+ // - COMPOSITE_SUBJECT_FRAG_SRC / COMPOSITE_MASKED_FRAG_SRC: the masked person
20
+ // and the masked-scratch stencil (canonical shaders/_shared/composite-*.frag).
21
+ var shaders_generated_1 = require("./shaders.generated");
22
+ Object.defineProperty(exports, "COMPOSITE_BLUR_FRAG_SRC", { enumerable: true, get: function () { return shaders_generated_1.COMPOSITE_BLUR_FRAG_SRC; } });
23
+ Object.defineProperty(exports, "COMPOSITE_CAMERA_FRAG_SRC", { enumerable: true, get: function () { return shaders_generated_1.COMPOSITE_CAMERA_FRAG_SRC; } });
24
+ Object.defineProperty(exports, "COMPOSITE_IMAGE_FRAG_SRC", { enumerable: true, get: function () { return shaders_generated_1.COMPOSITE_IMAGE_FRAG_SRC; } });
25
+ Object.defineProperty(exports, "COMPOSITE_MASKED_FRAG_SRC", { enumerable: true, get: function () { return shaders_generated_1.COMPOSITE_MASKED_FRAG_SRC; } });
26
+ Object.defineProperty(exports, "COMPOSITE_SUBJECT_FRAG_SRC", { enumerable: true, get: function () { return shaders_generated_1.COMPOSITE_SUBJECT_FRAG_SRC; } });
27
+ Object.defineProperty(exports, "PASSTHROUGH_VERT_SRC", { enumerable: true, get: function () { return shaders_generated_1.PASSTHROUGH_VERT_SRC; } });
28
+ //# sourceMappingURL=shaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shaders.js","sourceRoot":"","sources":["../../web-driver/shaders.ts"],"names":[],"mappings":";;;AAAA,0EAA0E;AAC1E,8DAA8D;AAC9D,8EAA8E;AAC9E,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,sFAAsF;AACtF,2EAA2E;AAC3E,0DAA0D;AAC1D,oEAAoE;AACpE,8CAA8C;AAC9C,yEAAyE;AACzE,yCAAyC;AACzC,6EAA6E;AAC7E,wDAAwD;AACxD,gFAAgF;AAChF,mFAAmF;AACnF,yDAO6B;AAN3B,4HAAA,uBAAuB,OAAA;AACvB,8HAAA,yBAAyB,OAAA;AACzB,6HAAA,wBAAwB,OAAA;AACxB,8HAAA,yBAAyB,OAAA;AACzB,+HAAA,0BAA0B,OAAA;AAC1B,yHAAA,oBAAoB,OAAA","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"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuning.d.ts","sourceRoot":"","sources":["../../web-driver/tuning.ts"],"names":[],"mappings":"AAWA,cAAM,iBAAiB;IACrB,SAAS,SAAK;IACd,YAAY,SAAO;IACnB,aAAa,SAAO;IAGpB,2BAA2B,SAAO;IAClC,WAAW,UAAS;IAEpB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEhC;IAED,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEnC;IAED,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEpC;IAED,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAElD;IAED,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEnC;IAED,KAAK,IAAI,IAAI,CAMZ;CACF;AAED,eAAO,MAAM,MAAM,mBAA0B,CAAC;AAE9C;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,aACpB,MAAM,aACL,MAAM,KAChB,SAAS,CAAC,MAAM,EAAE,MAAM,CAK1B,CAAC","sourcesContent":["// Mutable runtime state for the web GLSL effects. Mirrors\n// android/.../EffectTuning.kt and ios/.../EffectTuning.swift.\n//\n// There are no global set* exports anymore; the mask edge (hardness/threshold)\n// is written here through the setMask closure that `bindKaleidoscope`\n// (src/index.web.ts) wires up, and the composite compositor in\n// `web-driver/effects/*.ts` reads it when uploading uniforms. Writes take effect on\n// the next frame.\n\nconst clamp = (value: number, lo: number, hi: number): number => Math.min(Math.max(value, lo), hi);\n\nclass EffectTuningState {\n blurSigma = 5;\n maskHardness = 0.5;\n maskThreshold = 0.5;\n // Native-only knobs stored here for cross-platform API parity; the web\n // MediaPipe pipeline does not currently consume them.\n segmentationTargetShortSide = 384;\n debugTiming = false;\n\n setBlurSigma(value: number): void {\n this.blurSigma = clamp(value, 0.5, 7);\n }\n\n setMaskHardness(value: number): void {\n this.maskHardness = clamp(value, 0, 1);\n }\n\n setMaskThreshold(value: number): void {\n this.maskThreshold = clamp(value, 0.05, 0.95);\n }\n\n setSegmentationTargetShortSide(value: number): void {\n this.segmentationTargetShortSide = clamp(value, 128, 1080);\n }\n\n setDebugTiming(value: boolean): void {\n this.debugTiming = value;\n }\n\n reset(): void {\n this.blurSigma = 5;\n this.maskHardness = 0.5;\n this.maskThreshold = 0.5;\n this.segmentationTargetShortSide = 384;\n this.debugTiming = false;\n }\n}\n\nexport const tuning = new EffectTuningState();\n\n/**\n * Derive a smoothstep (lo, hi) range from a hardness factor in [0, 1] and\n * a threshold in [0.05, 0.95]. Matches `MaskTuning.smoothstepRange` on the\n * Android side; keep in sync.\n *\n * hardness controls width: 0 = soft halo (wide transition), 1 = near-step.\n * threshold controls the center: 0.5 = neutral, higher = reject low-\n * confidence pixels (rejects chair-edge regions), lower = more inclusive.\n */\nexport const maskSmoothstepRange = (\n hardness: number,\n threshold: number,\n): readonly [number, number] => {\n const clampedHardness = clamp(hardness, 0, 1);\n const clampedThreshold = clamp(threshold, 0.05, 0.95);\n const width = 0.6 * (1 - clampedHardness) + 0.02;\n return [clampedThreshold - width * 0.5, clampedThreshold + width * 0.5] as const;\n};\n"]}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ // Mutable runtime state for the web GLSL effects. Mirrors
3
+ // android/.../EffectTuning.kt and ios/.../EffectTuning.swift.
4
+ //
5
+ // There are no global set* exports anymore; the mask edge (hardness/threshold)
6
+ // is written here through the setMask closure that `bindKaleidoscope`
7
+ // (src/index.web.ts) wires up, and the composite compositor in
8
+ // `web-driver/effects/*.ts` reads it when uploading uniforms. Writes take effect on
9
+ // the next frame.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.maskSmoothstepRange = exports.tuning = void 0;
12
+ const clamp = (value, lo, hi) => Math.min(Math.max(value, lo), hi);
13
+ class EffectTuningState {
14
+ blurSigma = 5;
15
+ maskHardness = 0.5;
16
+ maskThreshold = 0.5;
17
+ // Native-only knobs stored here for cross-platform API parity; the web
18
+ // MediaPipe pipeline does not currently consume them.
19
+ segmentationTargetShortSide = 384;
20
+ debugTiming = false;
21
+ setBlurSigma(value) {
22
+ this.blurSigma = clamp(value, 0.5, 7);
23
+ }
24
+ setMaskHardness(value) {
25
+ this.maskHardness = clamp(value, 0, 1);
26
+ }
27
+ setMaskThreshold(value) {
28
+ this.maskThreshold = clamp(value, 0.05, 0.95);
29
+ }
30
+ setSegmentationTargetShortSide(value) {
31
+ this.segmentationTargetShortSide = clamp(value, 128, 1080);
32
+ }
33
+ setDebugTiming(value) {
34
+ this.debugTiming = value;
35
+ }
36
+ reset() {
37
+ this.blurSigma = 5;
38
+ this.maskHardness = 0.5;
39
+ this.maskThreshold = 0.5;
40
+ this.segmentationTargetShortSide = 384;
41
+ this.debugTiming = false;
42
+ }
43
+ }
44
+ exports.tuning = new EffectTuningState();
45
+ /**
46
+ * Derive a smoothstep (lo, hi) range from a hardness factor in [0, 1] and
47
+ * a threshold in [0.05, 0.95]. Matches `MaskTuning.smoothstepRange` on the
48
+ * Android side; keep in sync.
49
+ *
50
+ * hardness controls width: 0 = soft halo (wide transition), 1 = near-step.
51
+ * threshold controls the center: 0.5 = neutral, higher = reject low-
52
+ * confidence pixels (rejects chair-edge regions), lower = more inclusive.
53
+ */
54
+ const maskSmoothstepRange = (hardness, threshold) => {
55
+ const clampedHardness = clamp(hardness, 0, 1);
56
+ const clampedThreshold = clamp(threshold, 0.05, 0.95);
57
+ const width = 0.6 * (1 - clampedHardness) + 0.02;
58
+ return [clampedThreshold - width * 0.5, clampedThreshold + width * 0.5];
59
+ };
60
+ exports.maskSmoothstepRange = maskSmoothstepRange;
61
+ //# sourceMappingURL=tuning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuning.js","sourceRoot":"","sources":["../../web-driver/tuning.ts"],"names":[],"mappings":";AAAA,0DAA0D;AAC1D,8DAA8D;AAC9D,EAAE;AACF,+EAA+E;AAC/E,sEAAsE;AACtE,+DAA+D;AAC/D,oFAAoF;AACpF,kBAAkB;;;AAElB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAU,EAAE,EAAU,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAEnG,MAAM,iBAAiB;IACrB,SAAS,GAAG,CAAC,CAAC;IACd,YAAY,GAAG,GAAG,CAAC;IACnB,aAAa,GAAG,GAAG,CAAC;IACpB,uEAAuE;IACvE,sDAAsD;IACtD,2BAA2B,GAAG,GAAG,CAAC;IAClC,WAAW,GAAG,KAAK,CAAC;IAEpB,YAAY,CAAC,KAAa;QACxB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,eAAe,CAAC,KAAa;QAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,8BAA8B,CAAC,KAAa;QAC1C,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,cAAc,CAAC,KAAc;QAC3B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;QACzB,IAAI,CAAC,2BAA2B,GAAG,GAAG,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CACF;AAEY,QAAA,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAE9C;;;;;;;;GAQG;AACI,MAAM,mBAAmB,GAAG,CACjC,QAAgB,EAChB,SAAiB,EACU,EAAE;IAC7B,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC;IACjD,OAAO,CAAC,gBAAgB,GAAG,KAAK,GAAG,GAAG,EAAE,gBAAgB,GAAG,KAAK,GAAG,GAAG,CAAU,CAAC;AACnF,CAAC,CAAC;AARW,QAAA,mBAAmB,GAAnB,mBAAmB,CAQ9B","sourcesContent":["// Mutable runtime state for the web GLSL effects. Mirrors\n// android/.../EffectTuning.kt and ios/.../EffectTuning.swift.\n//\n// There are no global set* exports anymore; the mask edge (hardness/threshold)\n// is written here through the setMask closure that `bindKaleidoscope`\n// (src/index.web.ts) wires up, and the composite compositor in\n// `web-driver/effects/*.ts` reads it when uploading uniforms. Writes take effect on\n// the next frame.\n\nconst clamp = (value: number, lo: number, hi: number): number => Math.min(Math.max(value, lo), hi);\n\nclass EffectTuningState {\n blurSigma = 5;\n maskHardness = 0.5;\n maskThreshold = 0.5;\n // Native-only knobs stored here for cross-platform API parity; the web\n // MediaPipe pipeline does not currently consume them.\n segmentationTargetShortSide = 384;\n debugTiming = false;\n\n setBlurSigma(value: number): void {\n this.blurSigma = clamp(value, 0.5, 7);\n }\n\n setMaskHardness(value: number): void {\n this.maskHardness = clamp(value, 0, 1);\n }\n\n setMaskThreshold(value: number): void {\n this.maskThreshold = clamp(value, 0.05, 0.95);\n }\n\n setSegmentationTargetShortSide(value: number): void {\n this.segmentationTargetShortSide = clamp(value, 128, 1080);\n }\n\n setDebugTiming(value: boolean): void {\n this.debugTiming = value;\n }\n\n reset(): void {\n this.blurSigma = 5;\n this.maskHardness = 0.5;\n this.maskThreshold = 0.5;\n this.segmentationTargetShortSide = 384;\n this.debugTiming = false;\n }\n}\n\nexport const tuning = new EffectTuningState();\n\n/**\n * Derive a smoothstep (lo, hi) range from a hardness factor in [0, 1] and\n * a threshold in [0.05, 0.95]. Matches `MaskTuning.smoothstepRange` on the\n * Android side; keep in sync.\n *\n * hardness controls width: 0 = soft halo (wide transition), 1 = near-step.\n * threshold controls the center: 0.5 = neutral, higher = reject low-\n * confidence pixels (rejects chair-edge regions), lower = more inclusive.\n */\nexport const maskSmoothstepRange = (\n hardness: number,\n threshold: number,\n): readonly [number, number] => {\n const clampedHardness = clamp(hardness, 0, 1);\n const clampedThreshold = clamp(threshold, 0.05, 0.95);\n const width = 0.6 * (1 - clampedHardness) + 0.02;\n return [clampedThreshold - width * 0.5, clampedThreshold + width * 0.5] as const;\n};\n"]}
@@ -17,9 +17,9 @@ Pod::Spec.new do |s|
17
17
  # source_files, AND they use a custom `.metalsrc` extension instead of
18
18
  # `.metal`. Both halves of that constraint are load-bearing:
19
19
  #
20
- # (a) All three transpiled shaders (passthrough, blur, composite) export
21
- # the entry point `main0` because spirv-cross emits `main0` for every
22
- # stage. Three identical symbols cannot coexist in one metallib.
20
+ # (a) Every transpiled shader exports the entry point `main0` because
21
+ # spirv-cross emits `main0` for every stage. Identical symbols cannot
22
+ # coexist in one metallib.
23
23
  # (b) Excluding them from source_files prevents the main target's default
24
24
  # metallib from compiling and colliding on `main0`.
25
25
  # (c) Renaming the extension from `.metal` to `.metalsrc` prevents Xcode's
@@ -34,12 +34,13 @@ Pod::Spec.new do |s|
34
34
  # so each `main0` stays in its own namespace.
35
35
  s.source_files = 'KaleidoscopeModule/**/*.{h,m,swift}'
36
36
 
37
- # Bundled background-image presets (mirrors android/src/main/assets/
38
- # backgrounds/) plus the transpiled Metal shader SOURCE. Both are loaded at
39
- # runtime from the Kaleidoscope.bundle:
40
- # - BackgroundImageProcessor resolves "dark-office" -> dark-office.webp.
41
- # - ShaderLibrary reads passthrough/blur/composite.metalsrc as TEXT and
42
- # compiles each into its own MTLLibrary via makeLibrary(source:). The
37
+ # Bundled images (mirrors android/src/main/assets/images/) plus the
38
+ # transpiled Metal shader SOURCE. Both are loaded at runtime from the
39
+ # Kaleidoscope.bundle:
40
+ # - BundledImage resolves "dark-office" -> dark-office.webp (shared by
41
+ # resolveImageUri and the composite's image layers).
42
+ # - ShaderLibrary reads each `.metalsrc` as TEXT and compiles it into its
43
+ # own MTLLibrary via makeLibrary(source:). The
43
44
  # `.metalsrc` extension (not `.metal`) is required so Xcode's
44
45
  # MetalCompile build phase does not auto-compile them into a
45
46
  # `default.metallib` inside the bundle and hit the same `main0`
@@ -50,18 +51,24 @@ Pod::Spec.new do |s|
50
51
  'Kaleidoscope' => [
51
52
  'KaleidoscopeModule/resources/**/*',
52
53
  'KaleidoscopeModule/shaders/*.metalsrc',
54
+ # The generative-shader name list (codegen) so registration is data-driven.
55
+ 'KaleidoscopeModule/shaders/GENERATIVE.txt',
53
56
  ]
54
57
  }
55
58
 
56
59
  s.dependency 'ExpoModulesCore'
57
60
 
58
61
  # Person segmentation via MediaPipe Tasks ImageSegmenter, replacing Apple
59
- # Vision. Pinned to the 0.10 line to track Android's
62
+ # Vision. Pinned to EXACTLY 0.10.14 to match Android's
60
63
  # com.google.mediapipe:tasks-vision:0.10.14 (same model family, same
61
64
  # confidence-mask API shape) so all three platforms run identical
62
- # segmentation. The selfie_segmenter.tflite model ships in the
63
- # Kaleidoscope.bundle resource_bundles glob below (resources/**/*).
64
- s.dependency 'MediaPipeTasksVision', '~> 0.10'
65
+ # segmentation. The exact pin (not `~> 0.10`) is deliberate: the pessimistic
66
+ # range floats to the newest 0.10.x, and MediaPipeTasksVision 0.10.33+ ships
67
+ # an XCFramework structure with known CocoaPods linking problems; 0.10.14 is
68
+ # the known-good version the RN ecosystem standardizes on. The
69
+ # selfie_segmenter.tflite model ships in the Kaleidoscope.bundle
70
+ # resource_bundles glob below (resources/**/*).
71
+ s.dependency 'MediaPipeTasksVision', '0.10.14'
65
72
 
66
73
  # Fork-resolving dependency on react-native-webrtc. The Kaleidoscope target
67
74
  # needs FRAMEWORK_SEARCH_PATHS pointing at WebRTC.framework so the Swift
@@ -79,7 +86,7 @@ Pod::Spec.new do |s|
79
86
  # `#if canImport(livekit_react_native_webrtc)` chains in Registration.swift
80
87
  # and the three Processor files. Android's build.gradle is upstream-first
81
88
  # (pre-existing inconsistency, tracked separately); do NOT mirror Android
82
- # here the iOS Swift code unconditionally imports the LiveKit module first
89
+ # here; the iOS Swift code unconditionally imports the LiveKit module first
83
90
  # when present, and the chosen dependency must match what Swift imports.
84
91
  #
85
92
  # The plugin's `pod ... :modular_headers => true` Podfile patch
@@ -90,7 +97,7 @@ Pod::Spec.new do |s|
90
97
  #
91
98
  # `__dir__` here is `<consumer>/node_modules/react-native-webrtc-kaleidoscope/
92
99
  # ios/` at pod-install time, so `../../@livekit/react-native-webrtc`
93
- # resolves to `<consumer>/node_modules/@livekit/react-native-webrtc` —
100
+ # resolves to `<consumer>/node_modules/@livekit/react-native-webrtc`;
94
101
  # the same probe app.plugin.js performs at `:117`.
95
102
  livekit_fork_path = File.expand_path('../../@livekit/react-native-webrtc', __dir__)
96
103
  if File.directory?(livekit_fork_path)
@@ -0,0 +1,39 @@
1
+ // Bundled-image URL resolution, kept after the per-effect art processors were
2
+ // folded into the composite compositor (Phase C of the effect-unification plan).
3
+ //
4
+ // The standalone BackgroundImageProcessor / ShaderProcessor / BlurProcessor are
5
+ // gone; their work now lives in CompositeProcessor (the one "composite" compositor).
6
+ // Two small responsibilities those files used to host outlived them and live
7
+ // here so nothing else has to reach into a deleted type:
8
+ //
9
+ // - bundledURL(for:): resolve a bundled background `<id>.webp` for the picker's
10
+ // native thumbnail (the Expo `resolveImageUri` function in
11
+ // KaleidoscopeModule). Same lookup the old BackgroundImageProcessor used, so
12
+ // the thumbnail still resolves to the exact file the compositor would load.
13
+ // - the `Bundle(for:)` anchor: a stable class whose framework/app bundle the
14
+ // ShaderLibrary / GENERATIVE.txt lookups resolve relative to (was
15
+ // `Bundle(for: BackgroundImageProcessor.self)`).
16
+ //
17
+ // `BundleAnchor` is an empty NSObject solely so `Bundle(for:)` has a type that
18
+ // lives in this module's binary; an enum cannot be passed to `Bundle(for:)`.
19
+
20
+ import Foundation
21
+
22
+ /// Stable type whose containing bundle anchors the Kaleidoscope resource-bundle
23
+ /// lookups (ShaderLibrary, GENERATIVE.txt, background thumbnails). Empty by design.
24
+ final class BundleAnchor: NSObject {}
25
+
26
+ enum BundledImage {
27
+ /// Resolve a bundled image `<id>.webp`, searching the app bundle first
28
+ /// (the prebuild plugin copies every referenced image into the app target, so
29
+ /// they land flattened in `Bundle.main`) or, as a fallback, the Kaleidoscope
30
+ /// resource bundle and its `images/` subdir. The compositor loads the
31
+ /// same images; shared by the JS thumbnail resolver (`resolveImageUri`).
32
+ static func bundledURL(for id: String) -> URL? {
33
+ let containing = Bundle(for: BundleAnchor.self)
34
+ let resourceBundle = Bundle.kaleidoscopeResources(relativeTo: containing) ?? containing
35
+ return Bundle.main.url(forResource: id, withExtension: "webp")
36
+ ?? resourceBundle.url(forResource: id, withExtension: "webp", subdirectory: "images")
37
+ ?? resourceBundle.url(forResource: id, withExtension: "webp")
38
+ }
39
+ }
@@ -0,0 +1,142 @@
1
+ // Composite-layer spec side-channel for the iOS composite compositor. Direct port of
2
+ // android/.../CompositeLayers.kt.
3
+ //
4
+ // The Expo Module's setCompositeLayers(json) JS function writes here; CompositeProcessor
5
+ // reads the current layer stack each frame and composites it. This delivers the
6
+ // spec without re-registering, and carries the
7
+ // whole ordered layer stack (the compositor is one registered effect name,
8
+ // "composite", whose contents JS swaps as the active composite changes).
9
+ //
10
+ // The wire shape is a JSON array of layer objects (see parse()). JS sends it as a
11
+ // String across the Expo bridge; we parse it once at set() time into immutable
12
+ // value-type models the capture thread can read under a cheap lock. set() runs
13
+ // on the JS/Expo thread; get() on the capture thread. An os_unfair_lock around
14
+ // the snapshot reference is the memory barrier (the Swift analogue of Android's
15
+ // @Volatile + immutable List), matching EffectTuning on iOS.
16
+ //
17
+ // A malformed layer is skipped with a log rather than crashing the render thread;
18
+ // an unparseable whole payload leaves the previous composite in place.
19
+
20
+ import Foundation
21
+ import os.log
22
+
23
+ /// One parsed composite layer. The `shader` discriminant decides which fields matter.
24
+ /// A value type, so a `CompositeLayers.get()` snapshot the capture thread reads is an
25
+ /// immutable copy that a concurrent set() cannot mutate underneath it.
26
+ struct CompositeLayer {
27
+ let id: String // unique within a composite; the live-tuning / patch address
28
+ let shader: String
29
+ let target: String // "background" | "subject"
30
+ let blend: String? // "normal" | "additive" | nil (base = opaque)
31
+ let source: String? // image id for an `image` layer; nil otherwise
32
+ let uniforms: [String: [Float]] // generative-layer uniforms, by name
33
+ }
34
+
35
+ enum CompositeLayers {
36
+ private static let log = OSLog(subsystem: "com.simiancraft.kaleidoscope", category: "CompositeLayers")
37
+
38
+ private static var unsafeLock = os_unfair_lock_s()
39
+ private static var layers: [CompositeLayer] = []
40
+
41
+ /// The current parsed layer stack; a stable snapshot safe to read on the
42
+ /// capture thread. Returns a value-type array copy.
43
+ static func get() -> [CompositeLayer] {
44
+ os_unfair_lock_lock(&unsafeLock)
45
+ defer { os_unfair_lock_unlock(&unsafeLock) }
46
+ return layers
47
+ }
48
+
49
+ /// Parse and store the composite layer stack from the JS-supplied JSON string.
50
+ /// Called on the Expo module thread (JS-driven), not the capture thread.
51
+ /// Leaves the previous composite in place on a whole-payload parse failure.
52
+ static func set(_ json: String) {
53
+ guard let parsed = parse(json) else {
54
+ os_log("failed to parse composite layers; keeping previous composite",
55
+ log: log, type: .error)
56
+ return
57
+ }
58
+ os_unfair_lock_lock(&unsafeLock)
59
+ layers = parsed
60
+ os_unfair_lock_unlock(&unsafeLock)
61
+ os_log("composite layers set: %d layer(s) [%{public}@]",
62
+ log: log, type: .info,
63
+ parsed.count, parsed.map(\.shader).joined(separator: ","))
64
+ }
65
+
66
+ /// Clear the active composite (used when a non-composite effect takes over).
67
+ static func clear() {
68
+ os_unfair_lock_lock(&unsafeLock)
69
+ layers = []
70
+ os_unfair_lock_unlock(&unsafeLock)
71
+ }
72
+
73
+ /// Parse the JSON array into value-type models. Returns nil on a whole-payload
74
+ /// failure (not an array, not valid JSON); a single malformed layer is skipped
75
+ /// with a log, mirroring CompositeLayers.kt.
76
+ private static func parse(_ json: String) -> [CompositeLayer]? {
77
+ guard let data = json.data(using: .utf8) else { return nil }
78
+ let root: Any
79
+ do {
80
+ root = try JSONSerialization.jsonObject(with: data)
81
+ } catch {
82
+ return nil
83
+ }
84
+ guard let array = root as? [Any] else { return nil }
85
+ var out = [CompositeLayer]()
86
+ out.reserveCapacity(array.count)
87
+ for (index, element) in array.enumerated() {
88
+ guard let obj = element as? [String: Any] else { continue }
89
+ guard let shader = obj["shader"] as? String, !shader.isEmpty else {
90
+ os_log("layer %d has no shader; skipping", log: log, type: .info, index)
91
+ continue
92
+ }
93
+ // `id` is always present on the wire now (serializeCompositeLayers emits it);
94
+ // fall back to the array index so a malformed payload missing it still
95
+ // yields a stable, unique-per-stack address rather than a collision.
96
+ // Mirrors CompositeLayers.kt's id fallback.
97
+ let id = (obj["id"] as? String) ?? String(index)
98
+ let target = (obj["target"] as? String) ?? "background"
99
+ let blend = obj["blend"] as? String
100
+ let source = obj["source"] as? String
101
+ let uniforms = parseUniforms(obj["uniforms"])
102
+ out.append(CompositeLayer(id: id, shader: shader, target: target, blend: blend,
103
+ source: source, uniforms: uniforms))
104
+ }
105
+ return out
106
+ }
107
+
108
+ /// name -> [Float]. A JSON number -> [f]; a JSON array of numbers -> [Float].
109
+ /// A non-numeric or malformed value is skipped with a log (the shader keeps its
110
+ /// MSL default for that name). NSNumber covers JSON's number type across the
111
+ /// Foundation deserializer; bool-typed NSNumbers are accepted as 0/1 (harmless
112
+ /// for a uniform channel). Mirrors CompositeLayers.parseUniforms.
113
+ private static func parseUniforms(_ value: Any?) -> [String: [Float]] {
114
+ guard let obj = value as? [String: Any] else { return [:] }
115
+ var out = [String: [Float]]()
116
+ out.reserveCapacity(obj.count)
117
+ for (key, raw) in obj {
118
+ if let floats = normalize(raw) {
119
+ out[key] = floats
120
+ } else {
121
+ os_log("skipping uniform %{public}@: unsupported type", log: log, type: .info, key)
122
+ }
123
+ }
124
+ return out
125
+ }
126
+
127
+ private static func normalize(_ value: Any) -> [Float]? {
128
+ if let number = value as? NSNumber {
129
+ return [number.floatValue]
130
+ }
131
+ if let array = value as? [Any] {
132
+ var out = [Float]()
133
+ out.reserveCapacity(array.count)
134
+ for element in array {
135
+ guard let number = element as? NSNumber else { return nil }
136
+ out.append(number.floatValue)
137
+ }
138
+ return out
139
+ }
140
+ return nil
141
+ }
142
+ }