react-native-webrtc-kaleidoscope 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1185) hide show
  1. package/NOTICE.md +8 -8
  2. package/README.md +185 -56
  3. package/android/build.gradle +13 -0
  4. package/android/src/main/java/com/simiancraft/kaleidoscope/CompositeLayers.kt +127 -0
  5. package/android/src/main/java/com/simiancraft/kaleidoscope/EffectTuning.kt +69 -69
  6. package/android/src/main/java/com/simiancraft/kaleidoscope/KaleidoscopeModule.kt +86 -33
  7. package/android/src/main/java/com/simiancraft/kaleidoscope/Registration.kt +23 -64
  8. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/CompositeFactory.kt +691 -0
  9. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/LayerShaders.kt +30 -0
  10. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/TransformFactory.kt +248 -200
  11. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Egl.kt +82 -70
  12. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Fbo.kt +50 -47
  13. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/FramePipeline.kt +106 -105
  14. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlDebug.kt +23 -23
  15. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlProgram.kt +76 -57
  16. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Ingest.kt +92 -71
  17. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Orientation.kt +25 -25
  18. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Shaders.kt +57 -76
  19. package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/ShadersGenerated.kt +1162 -25
  20. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/Mask.kt +254 -242
  21. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/MaskTuning.kt +28 -25
  22. package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/SegmentationEngine.kt +104 -98
  23. package/android/src/test/java/com/simiancraft/kaleidoscope/CompositeLayersTest.kt +165 -0
  24. package/app.plugin.js +9 -255
  25. package/catalog/composites/clouds/clouds.controls.tsx +19 -0
  26. package/catalog/composites/clouds/clouds.ts +32 -0
  27. package/catalog/composites/corporate-blobs/corporate-blobs.controls.tsx +24 -0
  28. package/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
  29. package/catalog/composites/corporate-blobs/corporate-blobs.ts +51 -0
  30. package/catalog/composites/corporate-blobs/corporate-blobs.web.ts +42 -0
  31. package/catalog/composites/fairy-cave/fairy-cave.controls.tsx +33 -0
  32. package/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
  33. package/catalog/composites/fairy-cave/fairy-cave.ts +53 -0
  34. package/catalog/composites/fairy-cave/fairy-cave.web.ts +47 -0
  35. package/catalog/composites/fairy-grotto/fairy-grotto.controls.tsx +34 -0
  36. package/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
  37. package/catalog/composites/fairy-grotto/fairy-grotto.ts +54 -0
  38. package/catalog/composites/fairy-grotto/fairy-grotto.web.ts +47 -0
  39. package/catalog/composites/fairy-hollow/fairy-hollow.controls.tsx +34 -0
  40. package/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
  41. package/catalog/composites/fairy-hollow/fairy-hollow.ts +55 -0
  42. package/catalog/composites/fairy-hollow/fairy-hollow.web.ts +47 -0
  43. package/catalog/composites/nebula/nebula.controls.tsx +19 -0
  44. package/catalog/composites/nebula/nebula.thumb.webp +0 -0
  45. package/catalog/composites/nebula/nebula.ts +37 -0
  46. package/catalog/composites/nebula/nebula.web.ts +30 -0
  47. package/catalog/composites/observation-deck/observation-deck.controls.tsx +28 -0
  48. package/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
  49. package/catalog/composites/observation-deck/observation-deck.ts +59 -0
  50. package/catalog/composites/observation-deck/observation-deck.web.ts +50 -0
  51. package/catalog/composites/simianlights/simianlights.controls.tsx +19 -0
  52. package/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
  53. package/catalog/composites/simianlights/simianlights.ts +34 -0
  54. package/catalog/composites/simianlights/simianlights.web.ts +29 -0
  55. package/catalog/composites/underwater/underwater.controls.tsx +19 -0
  56. package/catalog/composites/underwater/underwater.thumb.webp +0 -0
  57. package/catalog/composites/underwater/underwater.ts +42 -0
  58. package/catalog/composites/underwater/underwater.web.ts +36 -0
  59. package/catalog/composites/wizard-tower/wizard-tower.controls.tsx +23 -0
  60. package/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
  61. package/catalog/composites/wizard-tower/wizard-tower.ts +44 -0
  62. package/catalog/composites/wizard-tower/wizard-tower.web.ts +35 -0
  63. package/catalog/composites/wizard-tower-night/wizard-tower-night.controls.tsx +22 -0
  64. package/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
  65. package/catalog/composites/wizard-tower-night/wizard-tower-night.ts +43 -0
  66. package/catalog/composites/wizard-tower-night/wizard-tower-night.web.ts +35 -0
  67. package/catalog/images/README.md +188 -0
  68. package/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
  69. package/catalog/images/corporate/corporate-logo.ts +6 -0
  70. package/catalog/images/corporate/corporate-logo.web.ts +7 -0
  71. package/catalog/images/corporate/corporate-logo.webp +0 -0
  72. package/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
  73. package/catalog/images/debug/debug-resolutions.ts +6 -0
  74. package/catalog/images/debug/debug-resolutions.web.ts +7 -0
  75. package/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
  76. package/catalog/images/fairy-caves/grotto.ts +6 -0
  77. package/catalog/images/fairy-caves/grotto.web.ts +7 -0
  78. package/catalog/images/fairy-caves/grotto.webp +0 -0
  79. package/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
  80. package/catalog/images/fairy-caves/hollow.ts +6 -0
  81. package/catalog/images/fairy-caves/hollow.web.ts +7 -0
  82. package/catalog/images/fairy-caves/hollow.webp +0 -0
  83. package/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
  84. package/catalog/images/fairy-caves/treehouse-2.ts +6 -0
  85. package/catalog/images/fairy-caves/treehouse-2.web.ts +7 -0
  86. package/catalog/images/fairy-caves/treehouse-2.webp +0 -0
  87. package/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
  88. package/catalog/images/fairy-caves/treehouse-3.ts +6 -0
  89. package/catalog/images/fairy-caves/treehouse-3.web.ts +7 -0
  90. package/catalog/images/fairy-caves/treehouse-3.webp +0 -0
  91. package/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
  92. package/catalog/images/fairy-caves/treehouse.ts +6 -0
  93. package/catalog/images/fairy-caves/treehouse.web.ts +7 -0
  94. package/catalog/images/fairy-caves/treehouse.webp +0 -0
  95. package/catalog/images/home/home-dark.thumb.webp +0 -0
  96. package/catalog/images/home/home-dark.ts +6 -0
  97. package/catalog/images/home/home-dark.web.ts +7 -0
  98. package/catalog/images/home/home-light.thumb.webp +0 -0
  99. package/catalog/images/home/home-light.ts +6 -0
  100. package/catalog/images/home/home-light.web.ts +7 -0
  101. package/catalog/images/image-ids.ts +42 -0
  102. package/catalog/images/image.types.ts +5 -0
  103. package/catalog/images/index.ts +7 -0
  104. package/catalog/images/nature/landscape-dark.thumb.webp +0 -0
  105. package/catalog/images/nature/landscape-dark.ts +6 -0
  106. package/catalog/images/nature/landscape-dark.web.ts +7 -0
  107. package/catalog/images/nature/landscape-light.thumb.webp +0 -0
  108. package/catalog/images/nature/landscape-light.ts +6 -0
  109. package/catalog/images/nature/landscape-light.web.ts +7 -0
  110. package/catalog/images/office/office-dark.thumb.webp +0 -0
  111. package/catalog/images/office/office-dark.ts +6 -0
  112. package/catalog/images/office/office-dark.web.ts +7 -0
  113. package/catalog/images/office/office-light.thumb.webp +0 -0
  114. package/catalog/images/office/office-light.ts +6 -0
  115. package/catalog/images/office/office-light.web.ts +7 -0
  116. package/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
  117. package/catalog/images/sci-fi/sci-fi-light.ts +6 -0
  118. package/catalog/images/sci-fi/sci-fi-light.web.ts +7 -0
  119. package/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
  120. package/catalog/images/simiancraft/simiancraft-dark-transparency.ts +6 -0
  121. package/catalog/images/simiancraft/simiancraft-dark-transparency.web.ts +9 -0
  122. package/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
  123. package/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
  124. package/catalog/images/simiancraft/simiancraft-dark.ts +6 -0
  125. package/catalog/images/simiancraft/simiancraft-dark.web.ts +7 -0
  126. package/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
  127. package/catalog/images/simiancraft/simiancraft-light-transparency.ts +6 -0
  128. package/catalog/images/simiancraft/simiancraft-light-transparency.web.ts +9 -0
  129. package/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
  130. package/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
  131. package/catalog/images/simiancraft/simiancraft-light.ts +6 -0
  132. package/catalog/images/simiancraft/simiancraft-light.web.ts +7 -0
  133. package/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
  134. package/catalog/images/spaceship/observation-deck.ts +6 -0
  135. package/catalog/images/spaceship/observation-deck.web.ts +7 -0
  136. package/catalog/images/spaceship/observation-deck.webp +0 -0
  137. package/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
  138. package/catalog/images/underwater/oceanscape-dark.ts +6 -0
  139. package/catalog/images/underwater/oceanscape-dark.web.ts +7 -0
  140. package/catalog/images/underwater/oceanscape-dark.webp +0 -0
  141. package/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
  142. package/catalog/images/wizard-tower/wizard-tower-1.ts +6 -0
  143. package/catalog/images/wizard-tower/wizard-tower-1.web.ts +7 -0
  144. package/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
  145. package/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
  146. package/catalog/images/wizard-tower/wizard-tower-2.ts +6 -0
  147. package/catalog/images/wizard-tower/wizard-tower-2.web.ts +7 -0
  148. package/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
  149. package/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
  150. package/catalog/images/wizard-tower/wizard-tower-night.ts +6 -0
  151. package/catalog/images/wizard-tower/wizard-tower-night.web.ts +7 -0
  152. package/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
  153. package/catalog/shaders/README.md +114 -0
  154. package/catalog/shaders/_shared/composite-blit.frag +26 -0
  155. package/catalog/shaders/_shared/composite-camera.frag +17 -0
  156. package/catalog/shaders/_shared/composite-image.frag +23 -0
  157. package/catalog/shaders/_shared/composite-masked.frag +26 -0
  158. package/catalog/shaders/_shared/composite-subject.frag +27 -0
  159. package/catalog/shaders/_shared/passthrough.vert +27 -0
  160. package/catalog/shaders/_shared/transform.frag +27 -0
  161. package/catalog/shaders/_shared/types.ts +63 -0
  162. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.tsx +37 -0
  163. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.frag +123 -0
  164. package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.ts +106 -0
  165. package/catalog/shaders/blur/blur.form.tsx +29 -0
  166. package/catalog/shaders/blur/blur.ts +32 -0
  167. package/catalog/shaders/blur/composite-blur.frag +42 -0
  168. package/catalog/shaders/clouds/clouds.form.tsx +39 -0
  169. package/catalog/shaders/clouds/clouds.frag +128 -0
  170. package/catalog/shaders/clouds/clouds.presets.md +37 -0
  171. package/catalog/shaders/clouds/clouds.ts +124 -0
  172. package/catalog/shaders/corporate-blobs/corporate-blobs.form.tsx +44 -0
  173. package/catalog/shaders/corporate-blobs/corporate-blobs.frag +224 -0
  174. package/catalog/shaders/corporate-blobs/corporate-blobs.ts +136 -0
  175. package/catalog/shaders/fireflies/fireflies.form.tsx +33 -0
  176. package/catalog/shaders/fireflies/fireflies.frag +68 -0
  177. package/catalog/shaders/fireflies/fireflies.ts +61 -0
  178. package/catalog/shaders/godrays/godrays.form.tsx +37 -0
  179. package/catalog/shaders/godrays/godrays.frag +85 -0
  180. package/catalog/shaders/godrays/godrays.ts +105 -0
  181. package/catalog/shaders/index.ts +78 -0
  182. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.tsx +55 -0
  183. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.frag +262 -0
  184. package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.ts +137 -0
  185. package/catalog/shaders/nebula/nebula.form.tsx +34 -0
  186. package/catalog/shaders/nebula/nebula.frag +151 -0
  187. package/catalog/shaders/nebula/nebula.ts +74 -0
  188. package/catalog/shaders/plasma/plasma.form.tsx +32 -0
  189. package/catalog/shaders/plasma/plasma.frag +55 -0
  190. package/catalog/shaders/plasma/plasma.ts +44 -0
  191. package/catalog/shaders/simianlights/simianlights.form.tsx +34 -0
  192. package/catalog/shaders/simianlights/simianlights.frag +151 -0
  193. package/catalog/shaders/simianlights/simianlights.ts +73 -0
  194. package/dist/catalog/composites/clouds/clouds.controls.d.ts +3 -0
  195. package/dist/catalog/composites/clouds/clouds.controls.d.ts.map +1 -0
  196. package/dist/catalog/composites/clouds/clouds.controls.js +11 -0
  197. package/dist/catalog/composites/clouds/clouds.controls.js.map +1 -0
  198. package/dist/catalog/composites/clouds/clouds.d.ts +26 -0
  199. package/dist/catalog/composites/clouds/clouds.d.ts.map +1 -0
  200. package/dist/catalog/composites/clouds/clouds.js +33 -0
  201. package/dist/catalog/composites/clouds/clouds.js.map +1 -0
  202. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts +3 -0
  203. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts.map +1 -0
  204. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js +13 -0
  205. package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js.map +1 -0
  206. package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts +37 -0
  207. package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts.map +1 -0
  208. package/dist/catalog/composites/corporate-blobs/corporate-blobs.js +52 -0
  209. package/dist/catalog/composites/corporate-blobs/corporate-blobs.js.map +1 -0
  210. package/dist/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
  211. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts +37 -0
  212. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts.map +1 -0
  213. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js +46 -0
  214. package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js.map +1 -0
  215. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts +3 -0
  216. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts.map +1 -0
  217. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js +13 -0
  218. package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js.map +1 -0
  219. package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts +42 -0
  220. package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts.map +1 -0
  221. package/dist/catalog/composites/fairy-cave/fairy-cave.js +54 -0
  222. package/dist/catalog/composites/fairy-cave/fairy-cave.js.map +1 -0
  223. package/dist/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
  224. package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts +42 -0
  225. package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts.map +1 -0
  226. package/dist/catalog/composites/fairy-cave/fairy-cave.web.js +51 -0
  227. package/dist/catalog/composites/fairy-cave/fairy-cave.web.js.map +1 -0
  228. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts +3 -0
  229. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts.map +1 -0
  230. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js +14 -0
  231. package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js.map +1 -0
  232. package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts +42 -0
  233. package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts.map +1 -0
  234. package/dist/catalog/composites/fairy-grotto/fairy-grotto.js +55 -0
  235. package/dist/catalog/composites/fairy-grotto/fairy-grotto.js.map +1 -0
  236. package/dist/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
  237. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts +42 -0
  238. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts.map +1 -0
  239. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js +51 -0
  240. package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js.map +1 -0
  241. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts +3 -0
  242. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts.map +1 -0
  243. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js +14 -0
  244. package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js.map +1 -0
  245. package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts +42 -0
  246. package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts.map +1 -0
  247. package/dist/catalog/composites/fairy-hollow/fairy-hollow.js +56 -0
  248. package/dist/catalog/composites/fairy-hollow/fairy-hollow.js.map +1 -0
  249. package/dist/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
  250. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts +42 -0
  251. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts.map +1 -0
  252. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js +51 -0
  253. package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js.map +1 -0
  254. package/dist/catalog/composites/nebula/nebula.controls.d.ts +3 -0
  255. package/dist/catalog/composites/nebula/nebula.controls.d.ts.map +1 -0
  256. package/dist/catalog/composites/nebula/nebula.controls.js +11 -0
  257. package/dist/catalog/composites/nebula/nebula.controls.js.map +1 -0
  258. package/dist/catalog/composites/nebula/nebula.d.ts +22 -0
  259. package/dist/catalog/composites/nebula/nebula.d.ts.map +1 -0
  260. package/dist/catalog/composites/nebula/nebula.js +38 -0
  261. package/dist/catalog/composites/nebula/nebula.js.map +1 -0
  262. package/dist/catalog/composites/nebula/nebula.thumb.webp +0 -0
  263. package/dist/catalog/composites/nebula/nebula.web.d.ts +22 -0
  264. package/dist/catalog/composites/nebula/nebula.web.d.ts.map +1 -0
  265. package/dist/catalog/composites/nebula/nebula.web.js +34 -0
  266. package/dist/catalog/composites/nebula/nebula.web.js.map +1 -0
  267. package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts +3 -0
  268. package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts.map +1 -0
  269. package/dist/catalog/composites/observation-deck/observation-deck.controls.js +13 -0
  270. package/dist/catalog/composites/observation-deck/observation-deck.controls.js.map +1 -0
  271. package/dist/catalog/composites/observation-deck/observation-deck.d.ts +41 -0
  272. package/dist/catalog/composites/observation-deck/observation-deck.d.ts.map +1 -0
  273. package/dist/catalog/composites/observation-deck/observation-deck.js +60 -0
  274. package/dist/catalog/composites/observation-deck/observation-deck.js.map +1 -0
  275. package/dist/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
  276. package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts +41 -0
  277. package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts.map +1 -0
  278. package/dist/catalog/composites/observation-deck/observation-deck.web.js +54 -0
  279. package/dist/catalog/composites/observation-deck/observation-deck.web.js.map +1 -0
  280. package/dist/catalog/composites/simianlights/simianlights.controls.d.ts +3 -0
  281. package/dist/catalog/composites/simianlights/simianlights.controls.d.ts.map +1 -0
  282. package/dist/catalog/composites/simianlights/simianlights.controls.js +11 -0
  283. package/dist/catalog/composites/simianlights/simianlights.controls.js.map +1 -0
  284. package/dist/catalog/composites/simianlights/simianlights.d.ts +22 -0
  285. package/dist/catalog/composites/simianlights/simianlights.d.ts.map +1 -0
  286. package/dist/catalog/composites/simianlights/simianlights.js +30 -0
  287. package/dist/catalog/composites/simianlights/simianlights.js.map +1 -0
  288. package/dist/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
  289. package/dist/catalog/composites/simianlights/simianlights.web.d.ts +22 -0
  290. package/dist/catalog/composites/simianlights/simianlights.web.d.ts.map +1 -0
  291. package/dist/catalog/composites/simianlights/simianlights.web.js +33 -0
  292. package/dist/catalog/composites/simianlights/simianlights.web.js.map +1 -0
  293. package/dist/catalog/composites/underwater/underwater.controls.d.ts +3 -0
  294. package/dist/catalog/composites/underwater/underwater.controls.d.ts.map +1 -0
  295. package/dist/catalog/composites/underwater/underwater.controls.js +11 -0
  296. package/dist/catalog/composites/underwater/underwater.controls.js.map +1 -0
  297. package/dist/catalog/composites/underwater/underwater.d.ts +30 -0
  298. package/dist/catalog/composites/underwater/underwater.d.ts.map +1 -0
  299. package/dist/catalog/composites/underwater/underwater.js +43 -0
  300. package/dist/catalog/composites/underwater/underwater.js.map +1 -0
  301. package/dist/catalog/composites/underwater/underwater.thumb.webp +0 -0
  302. package/dist/catalog/composites/underwater/underwater.web.d.ts +30 -0
  303. package/dist/catalog/composites/underwater/underwater.web.d.ts.map +1 -0
  304. package/dist/catalog/composites/underwater/underwater.web.js +40 -0
  305. package/dist/catalog/composites/underwater/underwater.web.js.map +1 -0
  306. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts +3 -0
  307. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts.map +1 -0
  308. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js +15 -0
  309. package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js.map +1 -0
  310. package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts +31 -0
  311. package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts.map +1 -0
  312. package/dist/catalog/composites/wizard-tower/wizard-tower.js +45 -0
  313. package/dist/catalog/composites/wizard-tower/wizard-tower.js.map +1 -0
  314. package/dist/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
  315. package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts +31 -0
  316. package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts.map +1 -0
  317. package/dist/catalog/composites/wizard-tower/wizard-tower.web.js +39 -0
  318. package/dist/catalog/composites/wizard-tower/wizard-tower.web.js.map +1 -0
  319. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts +3 -0
  320. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts.map +1 -0
  321. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js +14 -0
  322. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js.map +1 -0
  323. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts +31 -0
  324. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts.map +1 -0
  325. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js +44 -0
  326. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js.map +1 -0
  327. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
  328. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts +31 -0
  329. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts.map +1 -0
  330. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js +39 -0
  331. package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js.map +1 -0
  332. package/dist/catalog/images/corporate/corporate-logo.d.ts +3 -0
  333. package/dist/catalog/images/corporate/corporate-logo.d.ts.map +1 -0
  334. package/dist/catalog/images/corporate/corporate-logo.js +8 -0
  335. package/dist/catalog/images/corporate/corporate-logo.js.map +1 -0
  336. package/dist/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
  337. package/dist/catalog/images/corporate/corporate-logo.web.d.ts +3 -0
  338. package/dist/catalog/images/corporate/corporate-logo.web.d.ts.map +1 -0
  339. package/dist/catalog/images/corporate/corporate-logo.web.js +12 -0
  340. package/dist/catalog/images/corporate/corporate-logo.web.js.map +1 -0
  341. package/dist/catalog/images/corporate/corporate-logo.webp +0 -0
  342. package/dist/catalog/images/debug/debug-resolutions.d.ts +3 -0
  343. package/dist/catalog/images/debug/debug-resolutions.d.ts.map +1 -0
  344. package/dist/catalog/images/debug/debug-resolutions.js +8 -0
  345. package/dist/catalog/images/debug/debug-resolutions.js.map +1 -0
  346. package/dist/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
  347. package/dist/catalog/images/debug/debug-resolutions.web.d.ts +3 -0
  348. package/dist/catalog/images/debug/debug-resolutions.web.d.ts.map +1 -0
  349. package/dist/catalog/images/debug/debug-resolutions.web.js +12 -0
  350. package/dist/catalog/images/debug/debug-resolutions.web.js.map +1 -0
  351. package/dist/catalog/images/fairy-caves/grotto.d.ts +3 -0
  352. package/dist/catalog/images/fairy-caves/grotto.d.ts.map +1 -0
  353. package/dist/catalog/images/fairy-caves/grotto.js +8 -0
  354. package/dist/catalog/images/fairy-caves/grotto.js.map +1 -0
  355. package/dist/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
  356. package/dist/catalog/images/fairy-caves/grotto.web.d.ts +3 -0
  357. package/dist/catalog/images/fairy-caves/grotto.web.d.ts.map +1 -0
  358. package/dist/catalog/images/fairy-caves/grotto.web.js +12 -0
  359. package/dist/catalog/images/fairy-caves/grotto.web.js.map +1 -0
  360. package/dist/catalog/images/fairy-caves/grotto.webp +0 -0
  361. package/dist/catalog/images/fairy-caves/hollow.d.ts +3 -0
  362. package/dist/catalog/images/fairy-caves/hollow.d.ts.map +1 -0
  363. package/dist/catalog/images/fairy-caves/hollow.js +8 -0
  364. package/dist/catalog/images/fairy-caves/hollow.js.map +1 -0
  365. package/dist/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
  366. package/dist/catalog/images/fairy-caves/hollow.web.d.ts +3 -0
  367. package/dist/catalog/images/fairy-caves/hollow.web.d.ts.map +1 -0
  368. package/dist/catalog/images/fairy-caves/hollow.web.js +12 -0
  369. package/dist/catalog/images/fairy-caves/hollow.web.js.map +1 -0
  370. package/dist/catalog/images/fairy-caves/hollow.webp +0 -0
  371. package/dist/catalog/images/fairy-caves/treehouse-2.d.ts +3 -0
  372. package/dist/catalog/images/fairy-caves/treehouse-2.d.ts.map +1 -0
  373. package/dist/catalog/images/fairy-caves/treehouse-2.js +8 -0
  374. package/dist/catalog/images/fairy-caves/treehouse-2.js.map +1 -0
  375. package/dist/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
  376. package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts +3 -0
  377. package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts.map +1 -0
  378. package/dist/catalog/images/fairy-caves/treehouse-2.web.js +12 -0
  379. package/dist/catalog/images/fairy-caves/treehouse-2.web.js.map +1 -0
  380. package/dist/catalog/images/fairy-caves/treehouse-2.webp +0 -0
  381. package/dist/catalog/images/fairy-caves/treehouse-3.d.ts +3 -0
  382. package/dist/catalog/images/fairy-caves/treehouse-3.d.ts.map +1 -0
  383. package/dist/catalog/images/fairy-caves/treehouse-3.js +8 -0
  384. package/dist/catalog/images/fairy-caves/treehouse-3.js.map +1 -0
  385. package/dist/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
  386. package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts +3 -0
  387. package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts.map +1 -0
  388. package/dist/catalog/images/fairy-caves/treehouse-3.web.js +12 -0
  389. package/dist/catalog/images/fairy-caves/treehouse-3.web.js.map +1 -0
  390. package/dist/catalog/images/fairy-caves/treehouse-3.webp +0 -0
  391. package/dist/catalog/images/fairy-caves/treehouse.d.ts +3 -0
  392. package/dist/catalog/images/fairy-caves/treehouse.d.ts.map +1 -0
  393. package/dist/catalog/images/fairy-caves/treehouse.js +8 -0
  394. package/dist/catalog/images/fairy-caves/treehouse.js.map +1 -0
  395. package/dist/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
  396. package/dist/catalog/images/fairy-caves/treehouse.web.d.ts +3 -0
  397. package/dist/catalog/images/fairy-caves/treehouse.web.d.ts.map +1 -0
  398. package/dist/catalog/images/fairy-caves/treehouse.web.js +12 -0
  399. package/dist/catalog/images/fairy-caves/treehouse.web.js.map +1 -0
  400. package/dist/catalog/images/fairy-caves/treehouse.webp +0 -0
  401. package/dist/catalog/images/home/home-dark.d.ts +3 -0
  402. package/dist/catalog/images/home/home-dark.d.ts.map +1 -0
  403. package/dist/catalog/images/home/home-dark.js +8 -0
  404. package/dist/catalog/images/home/home-dark.js.map +1 -0
  405. package/dist/catalog/images/home/home-dark.thumb.webp +0 -0
  406. package/dist/catalog/images/home/home-dark.web.d.ts +3 -0
  407. package/dist/catalog/images/home/home-dark.web.d.ts.map +1 -0
  408. package/dist/catalog/images/home/home-dark.web.js +12 -0
  409. package/dist/catalog/images/home/home-dark.web.js.map +1 -0
  410. package/dist/catalog/images/home/home-light.d.ts +3 -0
  411. package/dist/catalog/images/home/home-light.d.ts.map +1 -0
  412. package/dist/catalog/images/home/home-light.js +8 -0
  413. package/dist/catalog/images/home/home-light.js.map +1 -0
  414. package/dist/catalog/images/home/home-light.thumb.webp +0 -0
  415. package/dist/catalog/images/home/home-light.web.d.ts +3 -0
  416. package/dist/catalog/images/home/home-light.web.d.ts.map +1 -0
  417. package/dist/catalog/images/home/home-light.web.js +12 -0
  418. package/dist/catalog/images/home/home-light.web.js.map +1 -0
  419. package/dist/catalog/images/image-ids.d.ts +3 -0
  420. package/dist/catalog/images/image-ids.d.ts.map +1 -0
  421. package/dist/catalog/images/image-ids.js +43 -0
  422. package/dist/catalog/images/image-ids.js.map +1 -0
  423. package/dist/catalog/images/image.types.d.ts +2 -0
  424. package/dist/catalog/images/image.types.d.ts.map +1 -0
  425. package/dist/catalog/images/image.types.js +3 -0
  426. package/dist/catalog/images/image.types.js.map +1 -0
  427. package/dist/catalog/images/index.d.ts +3 -0
  428. package/dist/catalog/images/index.d.ts.map +1 -0
  429. package/dist/catalog/images/index.js +10 -0
  430. package/dist/catalog/images/index.js.map +1 -0
  431. package/dist/catalog/images/nature/landscape-dark.d.ts +3 -0
  432. package/dist/catalog/images/nature/landscape-dark.d.ts.map +1 -0
  433. package/dist/catalog/images/nature/landscape-dark.js +8 -0
  434. package/dist/catalog/images/nature/landscape-dark.js.map +1 -0
  435. package/dist/catalog/images/nature/landscape-dark.thumb.webp +0 -0
  436. package/dist/catalog/images/nature/landscape-dark.web.d.ts +3 -0
  437. package/dist/catalog/images/nature/landscape-dark.web.d.ts.map +1 -0
  438. package/dist/catalog/images/nature/landscape-dark.web.js +12 -0
  439. package/dist/catalog/images/nature/landscape-dark.web.js.map +1 -0
  440. package/dist/catalog/images/nature/landscape-light.d.ts +3 -0
  441. package/dist/catalog/images/nature/landscape-light.d.ts.map +1 -0
  442. package/dist/catalog/images/nature/landscape-light.js +8 -0
  443. package/dist/catalog/images/nature/landscape-light.js.map +1 -0
  444. package/dist/catalog/images/nature/landscape-light.thumb.webp +0 -0
  445. package/dist/catalog/images/nature/landscape-light.web.d.ts +3 -0
  446. package/dist/catalog/images/nature/landscape-light.web.d.ts.map +1 -0
  447. package/dist/catalog/images/nature/landscape-light.web.js +12 -0
  448. package/dist/catalog/images/nature/landscape-light.web.js.map +1 -0
  449. package/dist/catalog/images/office/office-dark.d.ts +3 -0
  450. package/dist/catalog/images/office/office-dark.d.ts.map +1 -0
  451. package/dist/catalog/images/office/office-dark.js +8 -0
  452. package/dist/catalog/images/office/office-dark.js.map +1 -0
  453. package/dist/catalog/images/office/office-dark.thumb.webp +0 -0
  454. package/dist/catalog/images/office/office-dark.web.d.ts +3 -0
  455. package/dist/catalog/images/office/office-dark.web.d.ts.map +1 -0
  456. package/dist/catalog/images/office/office-dark.web.js +12 -0
  457. package/dist/catalog/images/office/office-dark.web.js.map +1 -0
  458. package/dist/catalog/images/office/office-light.d.ts +3 -0
  459. package/dist/catalog/images/office/office-light.d.ts.map +1 -0
  460. package/dist/catalog/images/office/office-light.js +8 -0
  461. package/dist/catalog/images/office/office-light.js.map +1 -0
  462. package/dist/catalog/images/office/office-light.thumb.webp +0 -0
  463. package/dist/catalog/images/office/office-light.web.d.ts +3 -0
  464. package/dist/catalog/images/office/office-light.web.d.ts.map +1 -0
  465. package/dist/catalog/images/office/office-light.web.js +12 -0
  466. package/dist/catalog/images/office/office-light.web.js.map +1 -0
  467. package/dist/catalog/images/sci-fi/sci-fi-light.d.ts +3 -0
  468. package/dist/catalog/images/sci-fi/sci-fi-light.d.ts.map +1 -0
  469. package/dist/catalog/images/sci-fi/sci-fi-light.js +8 -0
  470. package/dist/catalog/images/sci-fi/sci-fi-light.js.map +1 -0
  471. package/dist/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
  472. package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts +3 -0
  473. package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts.map +1 -0
  474. package/dist/catalog/images/sci-fi/sci-fi-light.web.js +12 -0
  475. package/dist/catalog/images/sci-fi/sci-fi-light.web.js.map +1 -0
  476. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts +3 -0
  477. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts.map +1 -0
  478. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js +8 -0
  479. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js.map +1 -0
  480. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
  481. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts +3 -0
  482. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts.map +1 -0
  483. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js +12 -0
  484. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js.map +1 -0
  485. package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
  486. package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts +3 -0
  487. package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts.map +1 -0
  488. package/dist/catalog/images/simiancraft/simiancraft-dark.js +8 -0
  489. package/dist/catalog/images/simiancraft/simiancraft-dark.js.map +1 -0
  490. package/dist/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
  491. package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts +3 -0
  492. package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts.map +1 -0
  493. package/dist/catalog/images/simiancraft/simiancraft-dark.web.js +12 -0
  494. package/dist/catalog/images/simiancraft/simiancraft-dark.web.js.map +1 -0
  495. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts +3 -0
  496. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts.map +1 -0
  497. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js +8 -0
  498. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js.map +1 -0
  499. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
  500. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts +3 -0
  501. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts.map +1 -0
  502. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js +12 -0
  503. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js.map +1 -0
  504. package/dist/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
  505. package/dist/catalog/images/simiancraft/simiancraft-light.d.ts +3 -0
  506. package/dist/catalog/images/simiancraft/simiancraft-light.d.ts.map +1 -0
  507. package/dist/catalog/images/simiancraft/simiancraft-light.js +8 -0
  508. package/dist/catalog/images/simiancraft/simiancraft-light.js.map +1 -0
  509. package/dist/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
  510. package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts +3 -0
  511. package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts.map +1 -0
  512. package/dist/catalog/images/simiancraft/simiancraft-light.web.js +12 -0
  513. package/dist/catalog/images/simiancraft/simiancraft-light.web.js.map +1 -0
  514. package/dist/catalog/images/spaceship/observation-deck.d.ts +3 -0
  515. package/dist/catalog/images/spaceship/observation-deck.d.ts.map +1 -0
  516. package/dist/catalog/images/spaceship/observation-deck.js +8 -0
  517. package/dist/catalog/images/spaceship/observation-deck.js.map +1 -0
  518. package/dist/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
  519. package/dist/catalog/images/spaceship/observation-deck.web.d.ts +3 -0
  520. package/dist/catalog/images/spaceship/observation-deck.web.d.ts.map +1 -0
  521. package/dist/catalog/images/spaceship/observation-deck.web.js +12 -0
  522. package/dist/catalog/images/spaceship/observation-deck.web.js.map +1 -0
  523. package/dist/catalog/images/spaceship/observation-deck.webp +0 -0
  524. package/dist/catalog/images/underwater/oceanscape-dark.d.ts +3 -0
  525. package/dist/catalog/images/underwater/oceanscape-dark.d.ts.map +1 -0
  526. package/dist/catalog/images/underwater/oceanscape-dark.js +8 -0
  527. package/dist/catalog/images/underwater/oceanscape-dark.js.map +1 -0
  528. package/dist/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
  529. package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts +3 -0
  530. package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts.map +1 -0
  531. package/dist/catalog/images/underwater/oceanscape-dark.web.js +12 -0
  532. package/dist/catalog/images/underwater/oceanscape-dark.web.js.map +1 -0
  533. package/dist/catalog/images/underwater/oceanscape-dark.webp +0 -0
  534. package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts +3 -0
  535. package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts.map +1 -0
  536. package/dist/catalog/images/wizard-tower/wizard-tower-1.js +8 -0
  537. package/dist/catalog/images/wizard-tower/wizard-tower-1.js.map +1 -0
  538. package/dist/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
  539. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts +3 -0
  540. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts.map +1 -0
  541. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js +12 -0
  542. package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js.map +1 -0
  543. package/dist/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
  544. package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts +3 -0
  545. package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts.map +1 -0
  546. package/dist/catalog/images/wizard-tower/wizard-tower-2.js +8 -0
  547. package/dist/catalog/images/wizard-tower/wizard-tower-2.js.map +1 -0
  548. package/dist/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
  549. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts +3 -0
  550. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts.map +1 -0
  551. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js +12 -0
  552. package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js.map +1 -0
  553. package/dist/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
  554. package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts +3 -0
  555. package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts.map +1 -0
  556. package/dist/catalog/images/wizard-tower/wizard-tower-night.js +8 -0
  557. package/dist/catalog/images/wizard-tower/wizard-tower-night.js.map +1 -0
  558. package/dist/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
  559. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts +3 -0
  560. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts.map +1 -0
  561. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js +12 -0
  562. package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js.map +1 -0
  563. package/dist/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
  564. package/dist/catalog/shaders/_shared/types.d.ts +38 -0
  565. package/dist/catalog/shaders/_shared/types.d.ts.map +1 -0
  566. package/dist/catalog/shaders/_shared/types.js +15 -0
  567. package/dist/catalog/shaders/_shared/types.js.map +1 -0
  568. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts +26 -0
  569. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts.map +1 -0
  570. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts +3 -0
  571. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts.map +1 -0
  572. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js +15 -0
  573. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js.map +1 -0
  574. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js +84 -0
  575. package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js.map +1 -0
  576. package/dist/catalog/shaders/blur/blur.d.ts +15 -0
  577. package/dist/catalog/shaders/blur/blur.d.ts.map +1 -0
  578. package/dist/catalog/shaders/blur/blur.form.d.ts +3 -0
  579. package/dist/catalog/shaders/blur/blur.form.d.ts.map +1 -0
  580. package/dist/catalog/shaders/blur/blur.form.js +15 -0
  581. package/dist/catalog/shaders/blur/blur.form.js.map +1 -0
  582. package/dist/catalog/shaders/blur/blur.js +27 -0
  583. package/dist/catalog/shaders/blur/blur.js.map +1 -0
  584. package/dist/catalog/shaders/clouds/clouds.d.ts +34 -0
  585. package/dist/catalog/shaders/clouds/clouds.d.ts.map +1 -0
  586. package/dist/catalog/shaders/clouds/clouds.form.d.ts +3 -0
  587. package/dist/catalog/shaders/clouds/clouds.form.d.ts.map +1 -0
  588. package/dist/catalog/shaders/clouds/clouds.form.js +15 -0
  589. package/dist/catalog/shaders/clouds/clouds.form.js.map +1 -0
  590. package/dist/catalog/shaders/clouds/clouds.js +98 -0
  591. package/dist/catalog/shaders/clouds/clouds.js.map +1 -0
  592. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts +40 -0
  593. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts.map +1 -0
  594. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts +3 -0
  595. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts.map +1 -0
  596. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js +15 -0
  597. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js.map +1 -0
  598. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js +100 -0
  599. package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js.map +1 -0
  600. package/dist/catalog/shaders/fireflies/fireflies.d.ts +18 -0
  601. package/dist/catalog/shaders/fireflies/fireflies.d.ts.map +1 -0
  602. package/dist/catalog/shaders/fireflies/fireflies.form.d.ts +3 -0
  603. package/dist/catalog/shaders/fireflies/fireflies.form.d.ts.map +1 -0
  604. package/dist/catalog/shaders/fireflies/fireflies.form.js +15 -0
  605. package/dist/catalog/shaders/fireflies/fireflies.form.js.map +1 -0
  606. package/dist/catalog/shaders/fireflies/fireflies.js +47 -0
  607. package/dist/catalog/shaders/fireflies/fireflies.js.map +1 -0
  608. package/dist/catalog/shaders/godrays/godrays.d.ts +26 -0
  609. package/dist/catalog/shaders/godrays/godrays.d.ts.map +1 -0
  610. package/dist/catalog/shaders/godrays/godrays.form.d.ts +3 -0
  611. package/dist/catalog/shaders/godrays/godrays.form.d.ts.map +1 -0
  612. package/dist/catalog/shaders/godrays/godrays.form.js +15 -0
  613. package/dist/catalog/shaders/godrays/godrays.form.js.map +1 -0
  614. package/dist/catalog/shaders/godrays/godrays.js +83 -0
  615. package/dist/catalog/shaders/godrays/godrays.js.map +1 -0
  616. package/dist/catalog/shaders/index.d.ts +73 -0
  617. package/dist/catalog/shaders/index.d.ts.map +1 -0
  618. package/dist/catalog/shaders/index.js +30 -0
  619. package/dist/catalog/shaders/index.js.map +1 -0
  620. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts +44 -0
  621. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts.map +1 -0
  622. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts +3 -0
  623. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts.map +1 -0
  624. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js +16 -0
  625. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js.map +1 -0
  626. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js +91 -0
  627. package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js.map +1 -0
  628. package/dist/catalog/shaders/nebula/nebula.d.ts +20 -0
  629. package/dist/catalog/shaders/nebula/nebula.d.ts.map +1 -0
  630. package/dist/catalog/shaders/nebula/nebula.form.d.ts +3 -0
  631. package/dist/catalog/shaders/nebula/nebula.form.d.ts.map +1 -0
  632. package/dist/catalog/shaders/nebula/nebula.form.js +15 -0
  633. package/dist/catalog/shaders/nebula/nebula.form.js.map +1 -0
  634. package/dist/catalog/shaders/nebula/nebula.js +58 -0
  635. package/dist/catalog/shaders/nebula/nebula.js.map +1 -0
  636. package/dist/catalog/shaders/plasma/plasma.d.ts +16 -0
  637. package/dist/catalog/shaders/plasma/plasma.d.ts.map +1 -0
  638. package/dist/catalog/shaders/plasma/plasma.form.d.ts +3 -0
  639. package/dist/catalog/shaders/plasma/plasma.form.d.ts.map +1 -0
  640. package/dist/catalog/shaders/plasma/plasma.form.js +15 -0
  641. package/dist/catalog/shaders/plasma/plasma.form.js.map +1 -0
  642. package/dist/catalog/shaders/plasma/plasma.js +32 -0
  643. package/dist/catalog/shaders/plasma/plasma.js.map +1 -0
  644. package/dist/catalog/shaders/simianlights/simianlights.d.ts +20 -0
  645. package/dist/catalog/shaders/simianlights/simianlights.d.ts.map +1 -0
  646. package/dist/catalog/shaders/simianlights/simianlights.form.d.ts +3 -0
  647. package/dist/catalog/shaders/simianlights/simianlights.form.d.ts.map +1 -0
  648. package/dist/catalog/shaders/simianlights/simianlights.form.js +15 -0
  649. package/dist/catalog/shaders/simianlights/simianlights.form.js.map +1 -0
  650. package/dist/catalog/shaders/simianlights/simianlights.js +57 -0
  651. package/dist/catalog/shaders/simianlights/simianlights.js.map +1 -0
  652. package/dist/src/components/form/control-form.d.ts +37 -0
  653. package/dist/src/components/form/control-form.d.ts.map +1 -0
  654. package/dist/src/components/form/control-form.js +55 -0
  655. package/dist/src/components/form/control-form.js.map +1 -0
  656. package/dist/src/components/form/make-controls.d.ts +22 -0
  657. package/dist/src/components/form/make-controls.d.ts.map +1 -0
  658. package/dist/src/components/form/make-controls.js +19 -0
  659. package/dist/src/components/form/make-controls.js.map +1 -0
  660. package/dist/src/components/form/scope.d.ts +2 -0
  661. package/dist/src/components/form/scope.d.ts.map +1 -0
  662. package/dist/src/components/form/scope.js +11 -0
  663. package/dist/src/components/form/scope.js.map +1 -0
  664. package/dist/src/components/form/use-field.d.ts +10 -0
  665. package/dist/src/components/form/use-field.d.ts.map +1 -0
  666. package/dist/src/components/form/use-field.js +27 -0
  667. package/dist/src/components/form/use-field.js.map +1 -0
  668. package/dist/src/components/preset-book-menu/index.d.ts +52 -0
  669. package/dist/src/components/preset-book-menu/index.d.ts.map +1 -0
  670. package/dist/src/components/preset-book-menu/index.js +152 -0
  671. package/dist/src/components/preset-book-menu/index.js.map +1 -0
  672. package/dist/src/components/preset-book-menu/layout.d.ts +25 -0
  673. package/dist/src/components/preset-book-menu/layout.d.ts.map +1 -0
  674. package/dist/src/components/preset-book-menu/layout.js +19 -0
  675. package/dist/src/components/preset-book-menu/layout.js.map +1 -0
  676. package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts +88 -0
  677. package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts.map +1 -0
  678. package/dist/src/components/preset-book-menu/preset-book-menu.types.js +14 -0
  679. package/dist/src/components/preset-book-menu/preset-book-menu.types.js.map +1 -0
  680. package/dist/src/components/preset-book-menu/preset-grid.d.ts +16 -0
  681. package/dist/src/components/preset-book-menu/preset-grid.d.ts.map +1 -0
  682. package/dist/src/components/preset-book-menu/preset-grid.js +49 -0
  683. package/dist/src/components/preset-book-menu/preset-grid.js.map +1 -0
  684. package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts +3 -0
  685. package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts.map +1 -0
  686. package/dist/src/components/preset-book-menu/resolve-image-uri.js +28 -0
  687. package/dist/src/components/preset-book-menu/resolve-image-uri.js.map +1 -0
  688. package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts +13 -0
  689. package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts.map +1 -0
  690. package/dist/src/components/preset-book-menu/resolve-image-uri.types.js +5 -0
  691. package/dist/src/components/preset-book-menu/resolve-image-uri.types.js.map +1 -0
  692. package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts +3 -0
  693. package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts.map +1 -0
  694. package/dist/src/components/preset-book-menu/resolve-image-uri.web.js +17 -0
  695. package/dist/src/components/preset-book-menu/resolve-image-uri.web.js.map +1 -0
  696. package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts +14 -0
  697. package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts.map +1 -0
  698. package/dist/src/components/preset-control-panel/composite-layer-control-panel.js +36 -0
  699. package/dist/src/components/preset-control-panel/composite-layer-control-panel.js.map +1 -0
  700. package/dist/src/components/preset-control-panel/control-section.d.ts +9 -0
  701. package/dist/src/components/preset-control-panel/control-section.d.ts.map +1 -0
  702. package/dist/src/components/preset-control-panel/control-section.js +47 -0
  703. package/dist/src/components/preset-control-panel/control-section.js.map +1 -0
  704. package/dist/src/components/preset-control-panel/control.d.ts +10 -0
  705. package/dist/src/components/preset-control-panel/control.d.ts.map +1 -0
  706. package/dist/src/components/preset-control-panel/control.js +35 -0
  707. package/dist/src/components/preset-control-panel/control.js.map +1 -0
  708. package/dist/src/components/preset-control-panel/index.d.ts +14 -0
  709. package/dist/src/components/preset-control-panel/index.d.ts.map +1 -0
  710. package/dist/src/components/preset-control-panel/index.js +49 -0
  711. package/dist/src/components/preset-control-panel/index.js.map +1 -0
  712. package/dist/src/components/preset-control-panel/mask-control-panel.d.ts +11 -0
  713. package/dist/src/components/preset-control-panel/mask-control-panel.d.ts.map +1 -0
  714. package/dist/src/components/preset-control-panel/mask-control-panel.js +34 -0
  715. package/dist/src/components/preset-control-panel/mask-control-panel.js.map +1 -0
  716. package/dist/src/components/preset-control-panel/preset-control-panel.d.ts +12 -0
  717. package/dist/src/components/preset-control-panel/preset-control-panel.d.ts.map +1 -0
  718. package/dist/src/components/preset-control-panel/preset-control-panel.js +23 -0
  719. package/dist/src/components/preset-control-panel/preset-control-panel.js.map +1 -0
  720. package/dist/src/components/preset-control-panel/transform-control-panel.d.ts +14 -0
  721. package/dist/src/components/preset-control-panel/transform-control-panel.d.ts.map +1 -0
  722. package/dist/src/components/preset-control-panel/transform-control-panel.js +58 -0
  723. package/dist/src/components/preset-control-panel/transform-control-panel.js.map +1 -0
  724. package/dist/src/components/preset-tile/index.d.ts +24 -0
  725. package/dist/src/components/preset-tile/index.d.ts.map +1 -0
  726. package/dist/src/components/preset-tile/index.js +98 -0
  727. package/dist/src/components/preset-tile/index.js.map +1 -0
  728. package/dist/src/components/theme/provider.d.ts +18 -0
  729. package/dist/src/components/theme/provider.d.ts.map +1 -0
  730. package/dist/src/components/theme/provider.js +29 -0
  731. package/dist/src/components/theme/provider.js.map +1 -0
  732. package/dist/src/components/theme/slots.d.ts +17 -0
  733. package/dist/src/components/theme/slots.d.ts.map +1 -0
  734. package/dist/src/components/theme/slots.js +9 -0
  735. package/dist/src/components/theme/slots.js.map +1 -0
  736. package/dist/src/components/ui/button.d.ts +14 -0
  737. package/dist/src/components/ui/button.d.ts.map +1 -0
  738. package/dist/src/components/ui/button.js +29 -0
  739. package/dist/src/components/ui/button.js.map +1 -0
  740. package/dist/src/components/ui/color-picker.d.ts +12 -0
  741. package/dist/src/components/ui/color-picker.d.ts.map +1 -0
  742. package/dist/src/components/ui/color-picker.js +43 -0
  743. package/dist/src/components/ui/color-picker.js.map +1 -0
  744. package/dist/src/components/ui/index.d.ts +6 -0
  745. package/dist/src/components/ui/index.d.ts.map +1 -0
  746. package/dist/src/components/ui/index.js +18 -0
  747. package/dist/src/components/ui/index.js.map +1 -0
  748. package/dist/src/components/ui/label.d.ts +10 -0
  749. package/dist/src/components/ui/label.d.ts.map +1 -0
  750. package/dist/src/components/ui/label.js +14 -0
  751. package/dist/src/components/ui/label.js.map +1 -0
  752. package/dist/src/components/ui/point.d.ts +19 -0
  753. package/dist/src/components/ui/point.d.ts.map +1 -0
  754. package/dist/src/components/ui/point.js +52 -0
  755. package/dist/src/components/ui/point.js.map +1 -0
  756. package/dist/src/components/ui/polygon-field.d.ts +10 -0
  757. package/dist/src/components/ui/polygon-field.d.ts.map +1 -0
  758. package/dist/src/components/ui/polygon-field.js +50 -0
  759. package/dist/src/components/ui/polygon-field.js.map +1 -0
  760. package/dist/src/components/ui/readout.d.ts +10 -0
  761. package/dist/src/components/ui/readout.d.ts.map +1 -0
  762. package/dist/src/components/ui/readout.js +14 -0
  763. package/dist/src/components/ui/readout.js.map +1 -0
  764. package/dist/src/components/ui/slider-value.d.ts +8 -0
  765. package/dist/src/components/ui/slider-value.d.ts.map +1 -0
  766. package/dist/src/components/ui/slider-value.js +17 -0
  767. package/dist/src/components/ui/slider-value.js.map +1 -0
  768. package/dist/src/components/ui/slider.d.ts +15 -0
  769. package/dist/src/components/ui/slider.d.ts.map +1 -0
  770. package/dist/src/components/ui/slider.js +58 -0
  771. package/dist/src/components/ui/slider.js.map +1 -0
  772. package/dist/src/components/ui/switch.d.ts +8 -0
  773. package/dist/src/components/ui/switch.d.ts.map +1 -0
  774. package/dist/src/components/ui/switch.js +24 -0
  775. package/dist/src/components/ui/switch.js.map +1 -0
  776. package/dist/src/index.d.ts +18 -0
  777. package/dist/src/index.d.ts.map +1 -0
  778. package/dist/src/index.js +187 -0
  779. package/dist/src/index.js.map +1 -0
  780. package/dist/src/index.web.d.ts +32 -0
  781. package/dist/src/index.web.d.ts.map +1 -0
  782. package/dist/src/index.web.js +119 -0
  783. package/dist/src/index.web.js.map +1 -0
  784. package/dist/src/kaleidoscope/controls.d.ts +24 -0
  785. package/dist/src/kaleidoscope/controls.d.ts.map +1 -0
  786. package/dist/src/kaleidoscope/controls.js +92 -0
  787. package/dist/src/kaleidoscope/controls.js.map +1 -0
  788. package/dist/src/kaleidoscope/effect.d.ts +4 -0
  789. package/dist/src/kaleidoscope/effect.d.ts.map +1 -0
  790. package/dist/src/kaleidoscope/effect.js +7 -0
  791. package/dist/src/kaleidoscope/effect.js.map +1 -0
  792. package/dist/src/kaleidoscope/effect.types.d.ts +47 -0
  793. package/dist/src/kaleidoscope/effect.types.d.ts.map +1 -0
  794. package/dist/src/kaleidoscope/effect.types.js +9 -0
  795. package/dist/src/kaleidoscope/effect.types.js.map +1 -0
  796. package/dist/src/kaleidoscope/shader-to-spec.d.ts +4 -0
  797. package/dist/src/kaleidoscope/shader-to-spec.d.ts.map +1 -0
  798. package/dist/src/kaleidoscope/shader-to-spec.js +17 -0
  799. package/dist/src/kaleidoscope/shader-to-spec.js.map +1 -0
  800. package/dist/src/kaleidoscope/types.d.ts +79 -0
  801. package/dist/src/kaleidoscope/types.d.ts.map +1 -0
  802. package/dist/src/kaleidoscope/types.js +18 -0
  803. package/dist/src/kaleidoscope/types.js.map +1 -0
  804. package/dist/src/kaleidoscope.preset-book.types.d.ts +86 -0
  805. package/dist/src/kaleidoscope.preset-book.types.d.ts.map +1 -0
  806. package/dist/src/kaleidoscope.preset-book.types.js +16 -0
  807. package/dist/src/kaleidoscope.preset-book.types.js.map +1 -0
  808. package/dist/src/lib/primitives.types.d.ts +3 -0
  809. package/dist/src/lib/primitives.types.d.ts.map +1 -0
  810. package/dist/src/lib/primitives.types.js +5 -0
  811. package/dist/src/lib/primitives.types.js.map +1 -0
  812. package/dist/src/lib/test-id.d.ts +30 -0
  813. package/dist/src/lib/test-id.d.ts.map +1 -0
  814. package/dist/src/lib/test-id.js +81 -0
  815. package/dist/src/lib/test-id.js.map +1 -0
  816. package/dist/src/livekit.d.ts +24 -0
  817. package/dist/src/livekit.d.ts.map +1 -0
  818. package/dist/src/livekit.js +63 -0
  819. package/dist/src/livekit.js.map +1 -0
  820. package/dist/src/nativewind.d.ts +7 -0
  821. package/dist/src/nativewind.d.ts.map +1 -0
  822. package/dist/src/nativewind.js +43 -0
  823. package/dist/src/nativewind.js.map +1 -0
  824. package/dist/web-driver/effects/composite.d.ts +14 -0
  825. package/dist/web-driver/effects/composite.d.ts.map +1 -0
  826. package/dist/web-driver/effects/composite.js +576 -0
  827. package/dist/web-driver/effects/composite.js.map +1 -0
  828. package/dist/web-driver/effects/layer-shaders.d.ts +2 -0
  829. package/dist/web-driver/effects/layer-shaders.d.ts.map +1 -0
  830. package/dist/web-driver/effects/layer-shaders.js +11 -0
  831. package/dist/web-driver/effects/layer-shaders.js.map +1 -0
  832. package/dist/web-driver/effects/transform.d.ts +4 -0
  833. package/dist/web-driver/effects/transform.d.ts.map +1 -0
  834. package/dist/web-driver/effects/transform.js +66 -0
  835. package/dist/web-driver/effects/transform.js.map +1 -0
  836. package/dist/web-driver/index.d.ts +6 -0
  837. package/dist/web-driver/index.d.ts.map +1 -0
  838. package/dist/web-driver/index.js +21 -0
  839. package/dist/web-driver/index.js.map +1 -0
  840. package/dist/web-driver/insertable-streams.d.ts.map +1 -0
  841. package/dist/web-driver/insertable-streams.js +68 -0
  842. package/dist/web-driver/insertable-streams.js.map +1 -0
  843. package/dist/web-driver/segmenter.d.ts.map +1 -0
  844. package/dist/web-driver/segmenter.js +89 -0
  845. package/dist/web-driver/segmenter.js.map +1 -0
  846. package/dist/web-driver/shaders.d.ts +2 -0
  847. package/dist/web-driver/shaders.d.ts.map +1 -0
  848. package/dist/web-driver/shaders.generated.d.ts +17 -0
  849. package/dist/web-driver/shaders.generated.d.ts.map +1 -0
  850. package/dist/web-driver/shaders.generated.js +1180 -0
  851. package/dist/web-driver/shaders.generated.js.map +1 -0
  852. package/dist/web-driver/shaders.js +28 -0
  853. package/dist/web-driver/shaders.js.map +1 -0
  854. package/dist/web-driver/tuning.d.ts.map +1 -0
  855. package/dist/web-driver/tuning.js +61 -0
  856. package/dist/web-driver/tuning.js.map +1 -0
  857. package/ios/Kaleidoscope.podspec +22 -15
  858. package/ios/KaleidoscopeModule/BundledImage.swift +39 -0
  859. package/ios/KaleidoscopeModule/CompositeLayers.swift +142 -0
  860. package/ios/KaleidoscopeModule/EffectTuning.swift +86 -86
  861. package/ios/KaleidoscopeModule/KaleidoscopeModule.swift +55 -27
  862. package/ios/KaleidoscopeModule/Registration.swift +36 -57
  863. package/ios/KaleidoscopeModule/effects/CompositeProcessor.swift +906 -0
  864. package/ios/KaleidoscopeModule/effects/FrameBridge.swift +25 -25
  865. package/ios/KaleidoscopeModule/effects/TransformProcessor.swift +127 -126
  866. package/ios/KaleidoscopeModule/gpu/CompositeRendering.swift +352 -0
  867. package/ios/KaleidoscopeModule/gpu/Ingest.swift +104 -102
  868. package/ios/KaleidoscopeModule/gpu/MetalRenderer.swift +473 -544
  869. package/ios/KaleidoscopeModule/gpu/Orientation.swift +41 -41
  870. package/ios/KaleidoscopeModule/gpu/ShaderLibrary.swift +100 -54
  871. package/ios/KaleidoscopeModule/gpu/TextureBridge.swift +245 -244
  872. package/ios/KaleidoscopeModule/segmentation/MaskTuning.swift +11 -11
  873. package/ios/KaleidoscopeModule/segmentation/Segmenter.swift +360 -359
  874. package/ios/KaleidoscopeModule/shaders/GENERATIVE.txt +9 -0
  875. package/ios/KaleidoscopeModule/shaders/SHADERS.txt +13 -2
  876. package/ios/KaleidoscopeModule/shaders/anamorphic-lensflare.metalsrc +47 -0
  877. package/ios/KaleidoscopeModule/shaders/clouds.metalsrc +185 -0
  878. package/ios/KaleidoscopeModule/shaders/composite-blit.metalsrc +22 -0
  879. package/ios/KaleidoscopeModule/shaders/composite-blur.metalsrc +93 -0
  880. package/ios/KaleidoscopeModule/shaders/composite-camera.metalsrc +22 -0
  881. package/ios/KaleidoscopeModule/shaders/composite-image.metalsrc +24 -0
  882. package/ios/KaleidoscopeModule/shaders/composite-masked.metalsrc +22 -0
  883. package/ios/KaleidoscopeModule/shaders/composite-subject.metalsrc +23 -0
  884. package/ios/KaleidoscopeModule/shaders/corporate-blobs.metalsrc +221 -0
  885. package/ios/KaleidoscopeModule/shaders/fireflies.metalsrc +44 -0
  886. package/ios/KaleidoscopeModule/shaders/godrays.metalsrc +46 -0
  887. package/ios/KaleidoscopeModule/shaders/light-beams-and-motes.metalsrc +316 -0
  888. package/ios/KaleidoscopeModule/shaders/nebula.metalsrc +45 -45
  889. package/ios/KaleidoscopeModule/shaders/plasma.metalsrc +26 -0
  890. package/ios/KaleidoscopeModule/shaders/simianlights.metalsrc +45 -45
  891. package/package.json +485 -115
  892. package/plugin/build/android/assets.js +45 -0
  893. package/plugin/build/android/index.js +34 -0
  894. package/plugin/build/index.js +39 -0
  895. package/plugin/build/ios/assets.js +110 -0
  896. package/plugin/build/ios/deployment-target.js +105 -0
  897. package/plugin/build/ios/index.js +63 -0
  898. package/plugin/build/ios/pods.js +73 -0
  899. package/plugin/build/lib/constants.js +15 -0
  900. package/plugin/build/lib/file-manipulation.js +57 -0
  901. package/plugin/build/lib/mods.js +36 -0
  902. package/plugin/build/lib/preset-book.js +215 -0
  903. package/plugin/build/lib/types.js +16 -0
  904. package/src/components/form/control-form.tsx +112 -0
  905. package/src/components/form/make-controls.ts +33 -0
  906. package/src/components/form/scope.ts +9 -0
  907. package/src/components/form/use-field.ts +35 -0
  908. package/src/components/preset-book-menu/index.tsx +286 -0
  909. package/src/components/preset-book-menu/layout.tsx +63 -0
  910. package/src/components/preset-book-menu/preset-book-menu.types.ts +112 -0
  911. package/src/components/preset-book-menu/preset-grid.tsx +80 -0
  912. package/src/components/preset-book-menu/resolve-image-uri.ts +31 -0
  913. package/src/components/preset-book-menu/resolve-image-uri.types.ts +18 -0
  914. package/src/components/preset-book-menu/resolve-image-uri.web.ts +15 -0
  915. package/src/components/preset-control-panel/composite-layer-control-panel.tsx +56 -0
  916. package/src/components/preset-control-panel/control-section.tsx +84 -0
  917. package/src/components/preset-control-panel/control.tsx +50 -0
  918. package/src/components/preset-control-panel/index.ts +31 -0
  919. package/src/components/preset-control-panel/mask-control-panel.tsx +93 -0
  920. package/src/components/preset-control-panel/preset-control-panel.tsx +48 -0
  921. package/src/components/preset-control-panel/transform-control-panel.tsx +146 -0
  922. package/src/components/preset-tile/index.tsx +160 -0
  923. package/src/components/theme/provider.tsx +50 -0
  924. package/src/components/theme/slots.ts +37 -0
  925. package/src/components/ui/button.tsx +54 -0
  926. package/src/components/ui/color-picker.tsx +74 -0
  927. package/src/components/ui/index.ts +10 -0
  928. package/src/components/ui/label.tsx +24 -0
  929. package/src/components/ui/point.tsx +116 -0
  930. package/src/components/ui/polygon-field.tsx +84 -0
  931. package/src/components/ui/readout.tsx +25 -0
  932. package/src/components/ui/slider-value.ts +15 -0
  933. package/src/components/ui/slider.tsx +98 -0
  934. package/src/components/ui/switch.tsx +40 -0
  935. package/src/index.ts +176 -95
  936. package/src/index.web.ts +126 -74
  937. package/src/kaleidoscope/controls.ts +127 -0
  938. package/src/kaleidoscope/effect.ts +5 -0
  939. package/src/kaleidoscope/effect.types.ts +63 -0
  940. package/src/kaleidoscope/shader-to-spec.ts +16 -0
  941. package/src/kaleidoscope/types.ts +101 -0
  942. package/src/kaleidoscope.preset-book.types.ts +105 -0
  943. package/src/lib/primitives.types.ts +5 -0
  944. package/src/lib/test-id.ts +81 -0
  945. package/src/livekit.ts +6 -4
  946. package/src/nativewind.ts +41 -0
  947. package/android/src/main/assets/backgrounds/stylized-dark.webp +0 -0
  948. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BackgroundImageFactory.kt +0 -365
  949. package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BlurFactory.kt +0 -400
  950. package/dist/backgrounds/dark-office.d.ts +0 -3
  951. package/dist/backgrounds/dark-office.d.ts.map +0 -1
  952. package/dist/backgrounds/dark-office.js +0 -5
  953. package/dist/backgrounds/dark-office.js.map +0 -1
  954. package/dist/backgrounds/dark-office.web.d.ts +0 -3
  955. package/dist/backgrounds/dark-office.web.d.ts.map +0 -1
  956. package/dist/backgrounds/dark-office.web.js +0 -8
  957. package/dist/backgrounds/dark-office.web.js.map +0 -1
  958. package/dist/backgrounds/debug-resolutions.d.ts +0 -3
  959. package/dist/backgrounds/debug-resolutions.d.ts.map +0 -1
  960. package/dist/backgrounds/debug-resolutions.js +0 -6
  961. package/dist/backgrounds/debug-resolutions.js.map +0 -1
  962. package/dist/backgrounds/debug-resolutions.web.d.ts +0 -3
  963. package/dist/backgrounds/debug-resolutions.web.d.ts.map +0 -1
  964. package/dist/backgrounds/debug-resolutions.web.js +0 -8
  965. package/dist/backgrounds/debug-resolutions.web.js.map +0 -1
  966. package/dist/backgrounds/home-dark.d.ts +0 -3
  967. package/dist/backgrounds/home-dark.d.ts.map +0 -1
  968. package/dist/backgrounds/home-dark.js +0 -5
  969. package/dist/backgrounds/home-dark.js.map +0 -1
  970. package/dist/backgrounds/home-dark.web.d.ts +0 -3
  971. package/dist/backgrounds/home-dark.web.d.ts.map +0 -1
  972. package/dist/backgrounds/home-dark.web.js +0 -6
  973. package/dist/backgrounds/home-dark.web.js.map +0 -1
  974. package/dist/backgrounds/home-light.d.ts +0 -3
  975. package/dist/backgrounds/home-light.d.ts.map +0 -1
  976. package/dist/backgrounds/home-light.js +0 -5
  977. package/dist/backgrounds/home-light.js.map +0 -1
  978. package/dist/backgrounds/home-light.web.d.ts +0 -3
  979. package/dist/backgrounds/home-light.web.d.ts.map +0 -1
  980. package/dist/backgrounds/home-light.web.js +0 -6
  981. package/dist/backgrounds/home-light.web.js.map +0 -1
  982. package/dist/backgrounds/index.d.ts +0 -3
  983. package/dist/backgrounds/index.d.ts.map +0 -1
  984. package/dist/backgrounds/index.js +0 -6
  985. package/dist/backgrounds/index.js.map +0 -1
  986. package/dist/backgrounds/light-office.d.ts +0 -3
  987. package/dist/backgrounds/light-office.d.ts.map +0 -1
  988. package/dist/backgrounds/light-office.js +0 -5
  989. package/dist/backgrounds/light-office.js.map +0 -1
  990. package/dist/backgrounds/light-office.web.d.ts +0 -3
  991. package/dist/backgrounds/light-office.web.d.ts.map +0 -1
  992. package/dist/backgrounds/light-office.web.js +0 -8
  993. package/dist/backgrounds/light-office.web.js.map +0 -1
  994. package/dist/backgrounds/nature-dark.d.ts +0 -3
  995. package/dist/backgrounds/nature-dark.d.ts.map +0 -1
  996. package/dist/backgrounds/nature-dark.js +0 -5
  997. package/dist/backgrounds/nature-dark.js.map +0 -1
  998. package/dist/backgrounds/nature-dark.web.d.ts +0 -3
  999. package/dist/backgrounds/nature-dark.web.d.ts.map +0 -1
  1000. package/dist/backgrounds/nature-dark.web.js +0 -6
  1001. package/dist/backgrounds/nature-dark.web.js.map +0 -1
  1002. package/dist/backgrounds/nature-light.d.ts +0 -3
  1003. package/dist/backgrounds/nature-light.d.ts.map +0 -1
  1004. package/dist/backgrounds/nature-light.js +0 -5
  1005. package/dist/backgrounds/nature-light.js.map +0 -1
  1006. package/dist/backgrounds/nature-light.web.d.ts +0 -3
  1007. package/dist/backgrounds/nature-light.web.d.ts.map +0 -1
  1008. package/dist/backgrounds/nature-light.web.js +0 -6
  1009. package/dist/backgrounds/nature-light.web.js.map +0 -1
  1010. package/dist/backgrounds/preset-source.types.d.ts +0 -2
  1011. package/dist/backgrounds/preset-source.types.d.ts.map +0 -1
  1012. package/dist/backgrounds/preset-source.types.js +0 -2
  1013. package/dist/backgrounds/preset-source.types.js.map +0 -1
  1014. package/dist/backgrounds/presets.d.ts +0 -3
  1015. package/dist/backgrounds/presets.d.ts.map +0 -1
  1016. package/dist/backgrounds/presets.js +0 -34
  1017. package/dist/backgrounds/presets.js.map +0 -1
  1018. package/dist/backgrounds/simiancraft-dark.d.ts +0 -3
  1019. package/dist/backgrounds/simiancraft-dark.d.ts.map +0 -1
  1020. package/dist/backgrounds/simiancraft-dark.js +0 -5
  1021. package/dist/backgrounds/simiancraft-dark.js.map +0 -1
  1022. package/dist/backgrounds/simiancraft-dark.web.d.ts +0 -3
  1023. package/dist/backgrounds/simiancraft-dark.web.d.ts.map +0 -1
  1024. package/dist/backgrounds/simiancraft-dark.web.js +0 -6
  1025. package/dist/backgrounds/simiancraft-dark.web.js.map +0 -1
  1026. package/dist/backgrounds/simiancraft-light.d.ts +0 -3
  1027. package/dist/backgrounds/simiancraft-light.d.ts.map +0 -1
  1028. package/dist/backgrounds/simiancraft-light.js +0 -5
  1029. package/dist/backgrounds/simiancraft-light.js.map +0 -1
  1030. package/dist/backgrounds/simiancraft-light.web.d.ts +0 -3
  1031. package/dist/backgrounds/simiancraft-light.web.d.ts.map +0 -1
  1032. package/dist/backgrounds/simiancraft-light.web.js +0 -6
  1033. package/dist/backgrounds/simiancraft-light.web.js.map +0 -1
  1034. package/dist/backgrounds/stylized-dark.d.ts +0 -3
  1035. package/dist/backgrounds/stylized-dark.d.ts.map +0 -1
  1036. package/dist/backgrounds/stylized-dark.js +0 -5
  1037. package/dist/backgrounds/stylized-dark.js.map +0 -1
  1038. package/dist/backgrounds/stylized-dark.web.d.ts +0 -3
  1039. package/dist/backgrounds/stylized-dark.web.d.ts.map +0 -1
  1040. package/dist/backgrounds/stylized-dark.web.js +0 -6
  1041. package/dist/backgrounds/stylized-dark.web.js.map +0 -1
  1042. package/dist/backgrounds/stylized-dark.webp +0 -0
  1043. package/dist/backgrounds/stylized-light.d.ts +0 -3
  1044. package/dist/backgrounds/stylized-light.d.ts.map +0 -1
  1045. package/dist/backgrounds/stylized-light.js +0 -5
  1046. package/dist/backgrounds/stylized-light.js.map +0 -1
  1047. package/dist/backgrounds/stylized-light.web.d.ts +0 -3
  1048. package/dist/backgrounds/stylized-light.web.d.ts.map +0 -1
  1049. package/dist/backgrounds/stylized-light.web.js +0 -6
  1050. package/dist/backgrounds/stylized-light.web.js.map +0 -1
  1051. package/dist/index.d.ts +0 -42
  1052. package/dist/index.d.ts.map +0 -1
  1053. package/dist/index.js +0 -155
  1054. package/dist/index.js.map +0 -1
  1055. package/dist/index.web.d.ts +0 -49
  1056. package/dist/index.web.d.ts.map +0 -1
  1057. package/dist/index.web.js +0 -113
  1058. package/dist/index.web.js.map +0 -1
  1059. package/dist/livekit.d.ts +0 -24
  1060. package/dist/livekit.d.ts.map +0 -1
  1061. package/dist/livekit.js +0 -57
  1062. package/dist/livekit.js.map +0 -1
  1063. package/dist/types.d.ts +0 -74
  1064. package/dist/types.d.ts.map +0 -1
  1065. package/dist/types.js +0 -10
  1066. package/dist/types.js.map +0 -1
  1067. package/dist/web/blur-kernel.d.ts +0 -6
  1068. package/dist/web/blur-kernel.d.ts.map +0 -1
  1069. package/dist/web/blur-kernel.js +0 -41
  1070. package/dist/web/blur-kernel.js.map +0 -1
  1071. package/dist/web/effects/background-image.d.ts +0 -3
  1072. package/dist/web/effects/background-image.d.ts.map +0 -1
  1073. package/dist/web/effects/background-image.js +0 -284
  1074. package/dist/web/effects/background-image.js.map +0 -1
  1075. package/dist/web/effects/blur.d.ts +0 -3
  1076. package/dist/web/effects/blur.d.ts.map +0 -1
  1077. package/dist/web/effects/blur.js +0 -339
  1078. package/dist/web/effects/blur.js.map +0 -1
  1079. package/dist/web/effects/transform.d.ts +0 -4
  1080. package/dist/web/effects/transform.d.ts.map +0 -1
  1081. package/dist/web/effects/transform.js +0 -62
  1082. package/dist/web/effects/transform.js.map +0 -1
  1083. package/dist/web/insertable-streams.d.ts.map +0 -1
  1084. package/dist/web/insertable-streams.js +0 -64
  1085. package/dist/web/insertable-streams.js.map +0 -1
  1086. package/dist/web/segmenter.d.ts.map +0 -1
  1087. package/dist/web/segmenter.js +0 -83
  1088. package/dist/web/segmenter.js.map +0 -1
  1089. package/dist/web/shaders.d.ts +0 -2
  1090. package/dist/web/shaders.d.ts.map +0 -1
  1091. package/dist/web/shaders.generated.d.ts +0 -4
  1092. package/dist/web/shaders.generated.d.ts.map +0 -1
  1093. package/dist/web/shaders.generated.js +0 -54
  1094. package/dist/web/shaders.generated.js.map +0 -1
  1095. package/dist/web/shaders.js +0 -32
  1096. package/dist/web/shaders.js.map +0 -1
  1097. package/dist/web/tuning.d.ts.map +0 -1
  1098. package/dist/web/tuning.js +0 -55
  1099. package/dist/web/tuning.js.map +0 -1
  1100. package/ios/KaleidoscopeModule/effects/BackgroundImageProcessor.swift +0 -293
  1101. package/ios/KaleidoscopeModule/effects/BlurProcessor.swift +0 -238
  1102. package/ios/KaleidoscopeModule/resources/backgrounds/dark-office.webp +0 -0
  1103. package/ios/KaleidoscopeModule/resources/backgrounds/debug-resolutions.webp +0 -0
  1104. package/ios/KaleidoscopeModule/resources/backgrounds/home-dark.webp +0 -0
  1105. package/ios/KaleidoscopeModule/resources/backgrounds/home-light.webp +0 -0
  1106. package/ios/KaleidoscopeModule/resources/backgrounds/light-office.webp +0 -0
  1107. package/ios/KaleidoscopeModule/resources/backgrounds/nature-dark.webp +0 -0
  1108. package/ios/KaleidoscopeModule/resources/backgrounds/nature-light.webp +0 -0
  1109. package/ios/KaleidoscopeModule/resources/backgrounds/simiancraft-dark.webp +0 -0
  1110. package/ios/KaleidoscopeModule/resources/backgrounds/simiancraft-light.webp +0 -0
  1111. package/ios/KaleidoscopeModule/resources/backgrounds/stylized-dark.webp +0 -0
  1112. package/ios/KaleidoscopeModule/resources/backgrounds/stylized-light.webp +0 -0
  1113. package/ios/KaleidoscopeModule/shaders/blur.metalsrc +0 -72
  1114. package/ios/KaleidoscopeModule/shaders/composite.metalsrc +0 -22
  1115. package/src/backgrounds/README.md +0 -83
  1116. package/src/backgrounds/dark-office.ts +0 -6
  1117. package/src/backgrounds/dark-office.web.ts +0 -9
  1118. package/src/backgrounds/dark-office.webp +0 -0
  1119. package/src/backgrounds/debug-resolutions.ts +0 -7
  1120. package/src/backgrounds/debug-resolutions.web.ts +0 -9
  1121. package/src/backgrounds/debug-resolutions.webp +0 -0
  1122. package/src/backgrounds/home-dark.ts +0 -6
  1123. package/src/backgrounds/home-dark.web.ts +0 -7
  1124. package/src/backgrounds/home-dark.webp +0 -0
  1125. package/src/backgrounds/home-light.ts +0 -6
  1126. package/src/backgrounds/home-light.web.ts +0 -7
  1127. package/src/backgrounds/home-light.webp +0 -0
  1128. package/src/backgrounds/index.ts +0 -7
  1129. package/src/backgrounds/light-office.ts +0 -6
  1130. package/src/backgrounds/light-office.web.ts +0 -9
  1131. package/src/backgrounds/light-office.webp +0 -0
  1132. package/src/backgrounds/nature-dark.ts +0 -6
  1133. package/src/backgrounds/nature-dark.web.ts +0 -7
  1134. package/src/backgrounds/nature-dark.webp +0 -0
  1135. package/src/backgrounds/nature-light.ts +0 -6
  1136. package/src/backgrounds/nature-light.web.ts +0 -7
  1137. package/src/backgrounds/nature-light.webp +0 -0
  1138. package/src/backgrounds/preset-source.types.ts +0 -5
  1139. package/src/backgrounds/presets.ts +0 -36
  1140. package/src/backgrounds/simiancraft-dark.ts +0 -6
  1141. package/src/backgrounds/simiancraft-dark.web.ts +0 -7
  1142. package/src/backgrounds/simiancraft-dark.webp +0 -0
  1143. package/src/backgrounds/simiancraft-light.ts +0 -6
  1144. package/src/backgrounds/simiancraft-light.web.ts +0 -7
  1145. package/src/backgrounds/simiancraft-light.webp +0 -0
  1146. package/src/backgrounds/stylized-dark.ts +0 -6
  1147. package/src/backgrounds/stylized-dark.web.ts +0 -7
  1148. package/src/backgrounds/stylized-dark.webp +0 -0
  1149. package/src/backgrounds/stylized-light.ts +0 -6
  1150. package/src/backgrounds/stylized-light.web.ts +0 -7
  1151. package/src/backgrounds/stylized-light.webp +0 -0
  1152. package/src/types.ts +0 -89
  1153. package/src/web/blur-kernel.ts +0 -44
  1154. package/src/web/effects/background-image.ts +0 -364
  1155. package/src/web/effects/blur.ts +0 -430
  1156. package/src/web/effects/transform.ts +0 -69
  1157. package/src/web/insertable-streams.ts +0 -112
  1158. package/src/web/segmenter.ts +0 -107
  1159. package/src/web/shaders.generated.ts +0 -56
  1160. package/src/web/shaders.ts +0 -31
  1161. package/src/web/tuning.ts +0 -67
  1162. /package/{src/backgrounds → catalog/images}/assets.d.ts +0 -0
  1163. /package/{android/src/main/assets/backgrounds → catalog/images/debug}/debug-resolutions.webp +0 -0
  1164. /package/{android/src/main/assets/backgrounds → catalog/images/home}/home-dark.webp +0 -0
  1165. /package/{android/src/main/assets/backgrounds → catalog/images/home}/home-light.webp +0 -0
  1166. /package/{android/src/main/assets/backgrounds/nature-dark.webp → catalog/images/nature/landscape-dark.webp} +0 -0
  1167. /package/{android/src/main/assets/backgrounds/nature-light.webp → catalog/images/nature/landscape-light.webp} +0 -0
  1168. /package/{android/src/main/assets/backgrounds/dark-office.webp → catalog/images/office/office-dark.webp} +0 -0
  1169. /package/{android/src/main/assets/backgrounds/light-office.webp → catalog/images/office/office-light.webp} +0 -0
  1170. /package/{android/src/main/assets/backgrounds/stylized-light.webp → catalog/images/sci-fi/sci-fi-light.webp} +0 -0
  1171. /package/{android/src/main/assets/backgrounds → catalog/images/simiancraft}/simiancraft-dark.webp +0 -0
  1172. /package/{android/src/main/assets/backgrounds → catalog/images/simiancraft}/simiancraft-light.webp +0 -0
  1173. /package/dist/{backgrounds → catalog/images/debug}/debug-resolutions.webp +0 -0
  1174. /package/dist/{backgrounds → catalog/images/home}/home-dark.webp +0 -0
  1175. /package/dist/{backgrounds → catalog/images/home}/home-light.webp +0 -0
  1176. /package/dist/{backgrounds/nature-dark.webp → catalog/images/nature/landscape-dark.webp} +0 -0
  1177. /package/dist/{backgrounds/nature-light.webp → catalog/images/nature/landscape-light.webp} +0 -0
  1178. /package/dist/{backgrounds/dark-office.webp → catalog/images/office/office-dark.webp} +0 -0
  1179. /package/dist/{backgrounds/light-office.webp → catalog/images/office/office-light.webp} +0 -0
  1180. /package/dist/{backgrounds/stylized-light.webp → catalog/images/sci-fi/sci-fi-light.webp} +0 -0
  1181. /package/dist/{backgrounds → catalog/images/simiancraft}/simiancraft-dark.webp +0 -0
  1182. /package/dist/{backgrounds → catalog/images/simiancraft}/simiancraft-light.webp +0 -0
  1183. /package/dist/{web → web-driver}/insertable-streams.d.ts +0 -0
  1184. /package/dist/{web → web-driver}/segmenter.d.ts +0 -0
  1185. /package/dist/{web → web-driver}/tuning.d.ts +0 -0
@@ -1,83 +0,0 @@
1
- // MediaPipe Selfie Segmentation loader. Single shared instance across every
2
- // web effect that needs a person mask (blur, background-image, future
3
- // procedural backgrounds). The script is loaded once from a CDN; the
4
- // segmenter instance is cached for the lifetime of the page.
5
- //
6
- // CDN-loaded rather than bundled because @mediapipe/selfie_segmentation
7
- // ships a WASM blob and asset graph that does not play nicely with Metro;
8
- // we listed the npm package as an optionalDependency for typing only.
9
- const CDN_BASE = 'https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation';
10
- let segmenterPromise = null;
11
- // Decoupled mask source (mirrors Android Mask.kt / iOS Segmenter.swift): the
12
- // render path reads the most recent mask without ever awaiting a fresh one, and
13
- // a single in-flight segmentation refreshes it. `onResults` is registered once,
14
- // at load, below.
15
- let latestResults = null;
16
- let inFlight = false;
17
- let activeSegmenter = null;
18
- const loadScript = (src) => new Promise((resolve, reject) => {
19
- const existing = document.querySelector(`script[src="${src}"]`);
20
- if (existing) {
21
- if (existing.getAttribute('data-loaded') === 'true') {
22
- resolve();
23
- return;
24
- }
25
- existing.addEventListener('load', () => resolve(), { once: true });
26
- existing.addEventListener('error', () => reject(new Error(`failed to load ${src}`)), {
27
- once: true,
28
- });
29
- return;
30
- }
31
- const script = document.createElement('script');
32
- script.src = src;
33
- script.crossOrigin = 'anonymous';
34
- script.addEventListener('load', () => {
35
- script.setAttribute('data-loaded', 'true');
36
- resolve();
37
- });
38
- script.addEventListener('error', () => reject(new Error(`failed to load ${src}`)));
39
- document.head.appendChild(script);
40
- });
41
- export const loadSegmenter = () => {
42
- if (segmenterPromise)
43
- return segmenterPromise;
44
- segmenterPromise = (async () => {
45
- await loadScript(`${CDN_BASE}/selfie_segmentation.js`);
46
- const SegCtor = globalThis
47
- .SelfieSegmentation;
48
- if (!SegCtor) {
49
- throw new Error('kaleidoscope: MediaPipe Selfie Segmentation script loaded but SelfieSegmentation global is missing');
50
- }
51
- const seg = new SegCtor({ locateFile: (file) => `${CDN_BASE}/${file}` });
52
- seg.setOptions({ modelSelection: 1, selfieMode: false });
53
- await seg.initialize();
54
- // Register once; every completed segmentation updates the cache.
55
- seg.onResults((r) => {
56
- latestResults = r;
57
- });
58
- activeSegmenter = seg;
59
- return seg;
60
- })();
61
- return segmenterPromise;
62
- };
63
- /** Most recent completed mask, or null before the first result. Non-blocking. */
64
- export const getLatestMask = () => latestResults;
65
- /**
66
- * Kick a new segmentation if none is in flight; returns immediately. The result
67
- * lands in `getLatestMask()` via the `onResults` handler registered at load.
68
- * No-op until the segmenter has finished loading. `inFlight` clears when `send`
69
- * settles, so a failed call cannot wedge the pipeline.
70
- */
71
- export const requestMaskIfIdle = (image) => {
72
- const seg = activeSegmenter;
73
- if (!seg || inFlight)
74
- return;
75
- inFlight = true;
76
- seg
77
- .send({ image })
78
- .catch(() => { })
79
- .finally(() => {
80
- inFlight = false;
81
- });
82
- };
83
- //# sourceMappingURL=segmenter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"segmenter.js","sourceRoot":"","sources":["../../src/web/segmenter.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,sEAAsE;AACtE,qEAAqE;AACrE,6DAA6D;AAC7D,EAAE;AACF,wEAAwE;AACxE,0EAA0E;AAC1E,sEAAsE;AAEtE,MAAM,QAAQ,GAAG,6DAA6D,CAAC;AAmB/E,IAAI,gBAAgB,GAA8B,IAAI,CAAC;AAEvD,6EAA6E;AAC7E,gFAAgF;AAChF,gFAAgF;AAChF,kBAAkB;AAClB,IAAI,aAAa,GAA4B,IAAI,CAAC;AAClD,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,IAAI,eAAe,GAAqB,IAAI,CAAC;AAE7C,MAAM,UAAU,GAAG,CAAC,GAAW,EAAiB,EAAE,CAChD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAChE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,MAAM,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,EAAE;YACnF,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,aAAa,GAAG,GAAuB,EAAE;IACpD,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC9C,gBAAgB,GAAG,CAAC,KAAK,IAAI,EAAE;QAC7B,MAAM,UAAU,CAAC,GAAG,QAAQ,yBAAyB,CAAC,CAAC;QACvD,MAAM,OAAO,GAAI,UAAgE;aAC9E,kBAAkB,CAAC;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACzE,GAAG,CAAC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;QACvB,iEAAiE;QACjE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;YAClB,aAAa,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,eAAe,GAAG,GAAG,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,aAAa,GAAG,GAA4B,EAAE,CAAC,aAAa,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAwB,EAAQ,EAAE;IAClE,MAAM,GAAG,GAAG,eAAe,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,QAAQ;QAAE,OAAO;IAC7B,QAAQ,GAAG,IAAI,CAAC;IAChB,GAAG;SACA,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;SACf,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SACf,OAAO,CAAC,GAAG,EAAE;QACZ,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC","sourcesContent":["// MediaPipe Selfie Segmentation loader. Single shared instance across every\n// web effect that needs a person mask (blur, background-image, future\n// procedural backgrounds). The script is loaded once from a CDN; the\n// segmenter instance is cached for the lifetime of the page.\n//\n// CDN-loaded rather than bundled because @mediapipe/selfie_segmentation\n// ships a WASM blob and asset graph that does not play nicely with Metro;\n// we listed the npm package as an optionalDependency for typing only.\n\nconst CDN_BASE = 'https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation';\n\nexport type SegmenterResults = {\n image: CanvasImageSource;\n segmentationMask: CanvasImageSource;\n};\n\ntype SegmenterOptions = { selfieMode?: boolean; modelSelection?: number };\n\nexport type Segmenter = {\n initialize(): Promise<void>;\n setOptions(opts: SegmenterOptions): void;\n onResults(cb: (r: SegmenterResults) => void): void;\n send(input: { image: CanvasImageSource }): Promise<void>;\n close(): Promise<void>;\n};\n\ntype SegmenterCtor = new (config: { locateFile: (file: string) => string }) => Segmenter;\n\nlet segmenterPromise: Promise<Segmenter> | null = null;\n\n// Decoupled mask source (mirrors Android Mask.kt / iOS Segmenter.swift): the\n// render path reads the most recent mask without ever awaiting a fresh one, and\n// a single in-flight segmentation refreshes it. `onResults` is registered once,\n// at load, below.\nlet latestResults: SegmenterResults | null = null;\nlet inFlight = false;\nlet activeSegmenter: Segmenter | null = null;\n\nconst loadScript = (src: string): Promise<void> =>\n new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[src=\"${src}\"]`);\n if (existing) {\n if (existing.getAttribute('data-loaded') === 'true') {\n resolve();\n return;\n }\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => reject(new Error(`failed to load ${src}`)), {\n once: true,\n });\n return;\n }\n const script = document.createElement('script');\n script.src = src;\n script.crossOrigin = 'anonymous';\n script.addEventListener('load', () => {\n script.setAttribute('data-loaded', 'true');\n resolve();\n });\n script.addEventListener('error', () => reject(new Error(`failed to load ${src}`)));\n document.head.appendChild(script);\n });\n\nexport const loadSegmenter = (): Promise<Segmenter> => {\n if (segmenterPromise) return segmenterPromise;\n segmenterPromise = (async () => {\n await loadScript(`${CDN_BASE}/selfie_segmentation.js`);\n const SegCtor = (globalThis as unknown as { SelfieSegmentation?: SegmenterCtor })\n .SelfieSegmentation;\n if (!SegCtor) {\n throw new Error(\n 'kaleidoscope: MediaPipe Selfie Segmentation script loaded but SelfieSegmentation global is missing',\n );\n }\n const seg = new SegCtor({ locateFile: (file) => `${CDN_BASE}/${file}` });\n seg.setOptions({ modelSelection: 1, selfieMode: false });\n await seg.initialize();\n // Register once; every completed segmentation updates the cache.\n seg.onResults((r) => {\n latestResults = r;\n });\n activeSegmenter = seg;\n return seg;\n })();\n return segmenterPromise;\n};\n\n/** Most recent completed mask, or null before the first result. Non-blocking. */\nexport const getLatestMask = (): SegmenterResults | null => latestResults;\n\n/**\n * Kick a new segmentation if none is in flight; returns immediately. The result\n * lands in `getLatestMask()` via the `onResults` handler registered at load.\n * No-op until the segmenter has finished loading. `inFlight` clears when `send`\n * settles, so a failed call cannot wedge the pipeline.\n */\nexport const requestMaskIfIdle = (image: CanvasImageSource): void => {\n const seg = activeSegmenter;\n if (!seg || inFlight) return;\n inFlight = true;\n seg\n .send({ image })\n .catch(() => {})\n .finally(() => {\n inFlight = false;\n });\n};\n"]}
@@ -1,2 +0,0 @@
1
- export { BLUR_FRAG_SRC, COMPOSITE_FRAG_SRC, PASSTHROUGH_VERT_SRC } from './shaders.generated';
2
- //# sourceMappingURL=shaders.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shaders.d.ts","sourceRoot":"","sources":["../../src/web/shaders.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["// Web GLSL entry point. The shader source is generated from the canonical\n// `shaders/*.frag` / `*.vert` by `bun run build:shaders` into\n// `./shaders.generated`; this module re-exports it so web effect code imports\n// from one stable path. Do not hand-edit the generated file.\n//\n// The three shared shaders:\n// - PASSTHROUGH_VERT_SRC: full-screen quad via gl_VertexID (no VAO/VBO);\n// caller does gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4).\n// - BLUR_FRAG_SRC: separable 1D Gaussian, 9-tap precomputed kernel\n// (uWeights[9] / uOffsets[9], no per-pixel exp). The caller computes the\n// kernel from sigma on the CPU and uploads the arrays; see\n// src/web/effects/blur.ts (blurKernel).\n// - COMPOSITE_FRAG_SRC: mix(background, original, mask). Identical body\n// across web, Android, and (post-transpile) iOS.\n//\n// Texture-orientation convention (lives in the host uniforms, NOT the shader,\n// so the composite body stays identical across runtimes):\n// - uOriginal / uBackground land with semantic \"top of source\" at GL v=1.\n// Web uploads with UNPACK_FLIP_Y_WEBGL=true (bg staged through an\n// OffscreenCanvas first, since flipY does not apply to ImageBitmap).\n// - uMask is sampled at vUv * uMaskUvScale + uMaskUvOffset. Web direct-uploads\n// the mask with flipY=false and V-flips in the sampling uniforms\n// ((1,-1)/(0,1)); canvas-staging would mangle MediaPipe's soft confidence\n// values via premultiplied alpha and break the hardness slider. Android's\n// readback round-trip leaves the mask aligned, so its uniforms are identity.\n// - uBgUvScale / uBgUvOffset cover-fit center-crop the background when its\n// aspect ratio differs from the output; (1,1)/(0,0) for a full-size bg.\n// - uMaskLo / uMaskHi parameterize the smoothstep, derived from a hardness\n// factor via maskSmoothstepRange in src/web/tuning.ts (mirrors Android's\n// MaskTuning.smoothstepRange).\nexport { BLUR_FRAG_SRC, COMPOSITE_FRAG_SRC, PASSTHROUGH_VERT_SRC } from './shaders.generated';\n"]}
@@ -1,4 +0,0 @@
1
- export declare 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";
2
- export declare const COMPOSITE_FRAG_SRC = "#version 300 es\nprecision mediump float;\nuniform sampler2D uOriginal;\nuniform sampler2D uBackground;\nuniform sampler2D uMask;\nuniform vec2 uBgUvScale;\nuniform vec2 uBgUvOffset;\nuniform vec2 uMaskUvScale;\nuniform vec2 uMaskUvOffset;\nuniform float uMaskLo;\nuniform float uMaskHi;\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec2 maskUv = vUv * uMaskUvScale + uMaskUvOffset;\n float raw = texture(uMask, maskUv).r;\n float safeHi = max(uMaskHi, uMaskLo + 0.001);\n float m = smoothstep(uMaskLo, safeHi, raw);\n vec3 orig = texture(uOriginal, vUv).rgb;\n vec2 bgUv = clamp(vUv * uBgUvScale + uBgUvOffset, 0.0, 1.0);\n vec3 bg = texture(uBackground, bgUv).rgb;\n oColor = vec4(mix(bg, orig, m), 1.0);\n}\n";
3
- export declare const BLUR_FRAG_SRC = "#version 300 es\nprecision mediump float;\nuniform sampler2D uTex;\nuniform vec2 uAxis;\nuniform float uWeights[5];\nuniform float uOffsets[5];\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec4 color = texture(uTex, vUv) * uWeights[0];\n for (int i = 1; i < 5; i++) {\n vec2 off = uAxis * uOffsets[i];\n color += texture(uTex, vUv + off) * uWeights[i];\n color += texture(uTex, vUv - off) * uWeights[i];\n }\n oColor = color;\n}\n";
4
- //# sourceMappingURL=shaders.generated.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shaders.generated.d.ts","sourceRoot":"","sources":["../../src/web/shaders.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,0NAQhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,8tBAuB9B,CAAC;AAEF,eAAO,MAAM,aAAa,0cAiBzB,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_FRAG_SRC = `#version 300 es\nprecision mediump float;\nuniform sampler2D uOriginal;\nuniform sampler2D uBackground;\nuniform sampler2D uMask;\nuniform vec2 uBgUvScale;\nuniform vec2 uBgUvOffset;\nuniform vec2 uMaskUvScale;\nuniform vec2 uMaskUvOffset;\nuniform float uMaskLo;\nuniform float uMaskHi;\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec2 maskUv = vUv * uMaskUvScale + uMaskUvOffset;\n float raw = texture(uMask, maskUv).r;\n float safeHi = max(uMaskHi, uMaskLo + 0.001);\n float m = smoothstep(uMaskLo, safeHi, raw);\n vec3 orig = texture(uOriginal, vUv).rgb;\n vec2 bgUv = clamp(vUv * uBgUvScale + uBgUvOffset, 0.0, 1.0);\n vec3 bg = texture(uBackground, bgUv).rgb;\n oColor = vec4(mix(bg, orig, m), 1.0);\n}\n`;\n\nexport const BLUR_FRAG_SRC = `#version 300 es\nprecision mediump float;\nuniform sampler2D uTex;\nuniform vec2 uAxis;\nuniform float uWeights[5];\nuniform float uOffsets[5];\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec4 color = texture(uTex, vUv) * uWeights[0];\n for (int i = 1; i < 5; i++) {\n vec2 off = uAxis * uOffsets[i];\n color += texture(uTex, vUv + off) * uWeights[i];\n color += texture(uTex, vUv - off) * uWeights[i];\n }\n oColor = color;\n}\n`;\n"]}
@@ -1,54 +0,0 @@
1
- // @generated by scripts/build-shaders.ts from shaders/. DO NOT EDIT.
2
- // Run `bun run build:shaders` to regenerate.
3
- export const PASSTHROUGH_VERT_SRC = `#version 300 es
4
- precision highp float;
5
- out highp vec2 vUv;
6
- void main() {
7
- vec2 p = vec2(float((gl_VertexID & 1) << 1), float(gl_VertexID & 2));
8
- vUv = p * 0.5;
9
- gl_Position = vec4(p - 1.0, 0.0, 1.0);
10
- }
11
- `;
12
- export const COMPOSITE_FRAG_SRC = `#version 300 es
13
- precision mediump float;
14
- uniform sampler2D uOriginal;
15
- uniform sampler2D uBackground;
16
- uniform sampler2D uMask;
17
- uniform vec2 uBgUvScale;
18
- uniform vec2 uBgUvOffset;
19
- uniform vec2 uMaskUvScale;
20
- uniform vec2 uMaskUvOffset;
21
- uniform float uMaskLo;
22
- uniform float uMaskHi;
23
- in highp vec2 vUv;
24
- out vec4 oColor;
25
- void main() {
26
- vec2 maskUv = vUv * uMaskUvScale + uMaskUvOffset;
27
- float raw = texture(uMask, maskUv).r;
28
- float safeHi = max(uMaskHi, uMaskLo + 0.001);
29
- float m = smoothstep(uMaskLo, safeHi, raw);
30
- vec3 orig = texture(uOriginal, vUv).rgb;
31
- vec2 bgUv = clamp(vUv * uBgUvScale + uBgUvOffset, 0.0, 1.0);
32
- vec3 bg = texture(uBackground, bgUv).rgb;
33
- oColor = vec4(mix(bg, orig, m), 1.0);
34
- }
35
- `;
36
- export const BLUR_FRAG_SRC = `#version 300 es
37
- precision mediump float;
38
- uniform sampler2D uTex;
39
- uniform vec2 uAxis;
40
- uniform float uWeights[5];
41
- uniform float uOffsets[5];
42
- in highp vec2 vUv;
43
- out vec4 oColor;
44
- void main() {
45
- vec4 color = texture(uTex, vUv) * uWeights[0];
46
- for (int i = 1; i < 5; i++) {
47
- vec2 off = uAxis * uOffsets[i];
48
- color += texture(uTex, vUv + off) * uWeights[i];
49
- color += texture(uTex, vUv - off) * uWeights[i];
50
- }
51
- oColor = color;
52
- }
53
- `;
54
- //# sourceMappingURL=shaders.generated.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shaders.generated.js","sourceRoot":"","sources":["../../src/web/shaders.generated.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,6CAA6C;AAE7C,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;CAQnC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBjC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;CAiB5B,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_FRAG_SRC = `#version 300 es\nprecision mediump float;\nuniform sampler2D uOriginal;\nuniform sampler2D uBackground;\nuniform sampler2D uMask;\nuniform vec2 uBgUvScale;\nuniform vec2 uBgUvOffset;\nuniform vec2 uMaskUvScale;\nuniform vec2 uMaskUvOffset;\nuniform float uMaskLo;\nuniform float uMaskHi;\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec2 maskUv = vUv * uMaskUvScale + uMaskUvOffset;\n float raw = texture(uMask, maskUv).r;\n float safeHi = max(uMaskHi, uMaskLo + 0.001);\n float m = smoothstep(uMaskLo, safeHi, raw);\n vec3 orig = texture(uOriginal, vUv).rgb;\n vec2 bgUv = clamp(vUv * uBgUvScale + uBgUvOffset, 0.0, 1.0);\n vec3 bg = texture(uBackground, bgUv).rgb;\n oColor = vec4(mix(bg, orig, m), 1.0);\n}\n`;\n\nexport const BLUR_FRAG_SRC = `#version 300 es\nprecision mediump float;\nuniform sampler2D uTex;\nuniform vec2 uAxis;\nuniform float uWeights[5];\nuniform float uOffsets[5];\nin highp vec2 vUv;\nout vec4 oColor;\nvoid main() {\n vec4 color = texture(uTex, vUv) * uWeights[0];\n for (int i = 1; i < 5; i++) {\n vec2 off = uAxis * uOffsets[i];\n color += texture(uTex, vUv + off) * uWeights[i];\n color += texture(uTex, vUv - off) * uWeights[i];\n }\n oColor = color;\n}\n`;\n"]}
@@ -1,32 +0,0 @@
1
- // Web GLSL entry point. The shader source is generated from the canonical
2
- // `shaders/*.frag` / `*.vert` by `bun run build:shaders` into
3
- // `./shaders.generated`; this module re-exports it so web effect code imports
4
- // from one stable path. Do not hand-edit the generated file.
5
- //
6
- // The three shared shaders:
7
- // - PASSTHROUGH_VERT_SRC: full-screen quad via gl_VertexID (no VAO/VBO);
8
- // caller does gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4).
9
- // - BLUR_FRAG_SRC: separable 1D Gaussian, 9-tap precomputed kernel
10
- // (uWeights[9] / uOffsets[9], no per-pixel exp). The caller computes the
11
- // kernel from sigma on the CPU and uploads the arrays; see
12
- // src/web/effects/blur.ts (blurKernel).
13
- // - COMPOSITE_FRAG_SRC: mix(background, original, mask). Identical body
14
- // across web, Android, and (post-transpile) iOS.
15
- //
16
- // Texture-orientation convention (lives in the host uniforms, NOT the shader,
17
- // so the composite body stays identical across runtimes):
18
- // - uOriginal / uBackground land with semantic "top of source" at GL v=1.
19
- // Web uploads with UNPACK_FLIP_Y_WEBGL=true (bg staged through an
20
- // OffscreenCanvas first, since flipY does not apply to ImageBitmap).
21
- // - uMask is sampled at vUv * uMaskUvScale + uMaskUvOffset. Web direct-uploads
22
- // the mask with flipY=false and V-flips in the sampling uniforms
23
- // ((1,-1)/(0,1)); canvas-staging would mangle MediaPipe's soft confidence
24
- // values via premultiplied alpha and break the hardness slider. Android's
25
- // readback round-trip leaves the mask aligned, so its uniforms are identity.
26
- // - uBgUvScale / uBgUvOffset cover-fit center-crop the background when its
27
- // aspect ratio differs from the output; (1,1)/(0,0) for a full-size bg.
28
- // - uMaskLo / uMaskHi parameterize the smoothstep, derived from a hardness
29
- // factor via maskSmoothstepRange in src/web/tuning.ts (mirrors Android's
30
- // MaskTuning.smoothstepRange).
31
- export { BLUR_FRAG_SRC, COMPOSITE_FRAG_SRC, PASSTHROUGH_VERT_SRC } from './shaders.generated';
32
- //# sourceMappingURL=shaders.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shaders.js","sourceRoot":"","sources":["../../src/web/shaders.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8DAA8D;AAC9D,8EAA8E;AAC9E,6DAA6D;AAC7D,EAAE;AACF,4BAA4B;AAC5B,2EAA2E;AAC3E,0DAA0D;AAC1D,qEAAqE;AACrE,6EAA6E;AAC7E,+DAA+D;AAC/D,4CAA4C;AAC5C,0EAA0E;AAC1E,qDAAqD;AACrD,EAAE;AACF,8EAA8E;AAC9E,0DAA0D;AAC1D,4EAA4E;AAC5E,sEAAsE;AACtE,yEAAyE;AACzE,iFAAiF;AACjF,qEAAqE;AACrE,8EAA8E;AAC9E,8EAA8E;AAC9E,iFAAiF;AACjF,6EAA6E;AAC7E,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,mCAAmC;AACnC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["// Web GLSL entry point. The shader source is generated from the canonical\n// `shaders/*.frag` / `*.vert` by `bun run build:shaders` into\n// `./shaders.generated`; this module re-exports it so web effect code imports\n// from one stable path. Do not hand-edit the generated file.\n//\n// The three shared shaders:\n// - PASSTHROUGH_VERT_SRC: full-screen quad via gl_VertexID (no VAO/VBO);\n// caller does gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4).\n// - BLUR_FRAG_SRC: separable 1D Gaussian, 9-tap precomputed kernel\n// (uWeights[9] / uOffsets[9], no per-pixel exp). The caller computes the\n// kernel from sigma on the CPU and uploads the arrays; see\n// src/web/effects/blur.ts (blurKernel).\n// - COMPOSITE_FRAG_SRC: mix(background, original, mask). Identical body\n// across web, Android, and (post-transpile) iOS.\n//\n// Texture-orientation convention (lives in the host uniforms, NOT the shader,\n// so the composite body stays identical across runtimes):\n// - uOriginal / uBackground land with semantic \"top of source\" at GL v=1.\n// Web uploads with UNPACK_FLIP_Y_WEBGL=true (bg staged through an\n// OffscreenCanvas first, since flipY does not apply to ImageBitmap).\n// - uMask is sampled at vUv * uMaskUvScale + uMaskUvOffset. Web direct-uploads\n// the mask with flipY=false and V-flips in the sampling uniforms\n// ((1,-1)/(0,1)); canvas-staging would mangle MediaPipe's soft confidence\n// values via premultiplied alpha and break the hardness slider. Android's\n// readback round-trip leaves the mask aligned, so its uniforms are identity.\n// - uBgUvScale / uBgUvOffset cover-fit center-crop the background when its\n// aspect ratio differs from the output; (1,1)/(0,0) for a full-size bg.\n// - uMaskLo / uMaskHi parameterize the smoothstep, derived from a hardness\n// factor via maskSmoothstepRange in src/web/tuning.ts (mirrors Android's\n// MaskTuning.smoothstepRange).\nexport { BLUR_FRAG_SRC, COMPOSITE_FRAG_SRC, PASSTHROUGH_VERT_SRC } from './shaders.generated';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tuning.d.ts","sourceRoot":"","sources":["../../src/web/tuning.ts"],"names":[],"mappings":"AASA,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// `src/index.web.ts` exports setBlurSigma / setMaskHardness that write\n// here; per-frame transforms in `src/web/effects/*.ts` read here when\n// uploading uniforms. JS calls take effect on 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.7;\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.7;\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"]}
@@ -1,55 +0,0 @@
1
- // Mutable runtime state for the web GLSL effects. Mirrors
2
- // android/.../EffectTuning.kt and ios/.../EffectTuning.swift.
3
- //
4
- // `src/index.web.ts` exports setBlurSigma / setMaskHardness that write
5
- // here; per-frame transforms in `src/web/effects/*.ts` read here when
6
- // uploading uniforms. JS calls take effect on the next frame.
7
- const clamp = (value, lo, hi) => Math.min(Math.max(value, lo), hi);
8
- class EffectTuningState {
9
- blurSigma = 5;
10
- maskHardness = 0.5;
11
- maskThreshold = 0.7;
12
- // Native-only knobs stored here for cross-platform API parity; the web
13
- // MediaPipe pipeline does not currently consume them.
14
- segmentationTargetShortSide = 384;
15
- debugTiming = false;
16
- setBlurSigma(value) {
17
- this.blurSigma = clamp(value, 0.5, 7);
18
- }
19
- setMaskHardness(value) {
20
- this.maskHardness = clamp(value, 0, 1);
21
- }
22
- setMaskThreshold(value) {
23
- this.maskThreshold = clamp(value, 0.05, 0.95);
24
- }
25
- setSegmentationTargetShortSide(value) {
26
- this.segmentationTargetShortSide = clamp(value, 128, 1080);
27
- }
28
- setDebugTiming(value) {
29
- this.debugTiming = value;
30
- }
31
- reset() {
32
- this.blurSigma = 5;
33
- this.maskHardness = 0.5;
34
- this.maskThreshold = 0.7;
35
- this.segmentationTargetShortSide = 384;
36
- this.debugTiming = false;
37
- }
38
- }
39
- export const tuning = new EffectTuningState();
40
- /**
41
- * Derive a smoothstep (lo, hi) range from a hardness factor in [0, 1] and
42
- * a threshold in [0.05, 0.95]. Matches `MaskTuning.smoothstepRange` on the
43
- * Android side; keep in sync.
44
- *
45
- * hardness controls width: 0 = soft halo (wide transition), 1 = near-step.
46
- * threshold controls the center: 0.5 = neutral, higher = reject low-
47
- * confidence pixels (rejects chair-edge regions), lower = more inclusive.
48
- */
49
- export const maskSmoothstepRange = (hardness, threshold) => {
50
- const clampedHardness = clamp(hardness, 0, 1);
51
- const clampedThreshold = clamp(threshold, 0.05, 0.95);
52
- const width = 0.6 * (1 - clampedHardness) + 0.02;
53
- return [clampedThreshold - width * 0.5, clampedThreshold + width * 0.5];
54
- };
55
- //# sourceMappingURL=tuning.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tuning.js","sourceRoot":"","sources":["../../src/web/tuning.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,8DAA8D;AAC9D,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,8DAA8D;AAE9D,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;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,CAAC,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","sourcesContent":["// Mutable runtime state for the web GLSL effects. Mirrors\n// android/.../EffectTuning.kt and ios/.../EffectTuning.swift.\n//\n// `src/index.web.ts` exports setBlurSigma / setMaskHardness that write\n// here; per-frame transforms in `src/web/effects/*.ts` read here when\n// uploading uniforms. JS calls take effect on 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.7;\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.7;\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"]}
@@ -1,293 +0,0 @@
1
- // iOS background-image effect. Mirrors android/.../effects/BackgroundImage-
2
- // Factory.kt.
3
- //
4
- // Per frame:
5
- // 1. Ingest the camera CVPixelBuffer (NV12) into the "original" BGRA Metal
6
- // texture via CoreImage.
7
- // 2. Lazy-load the named WebP ("dark-office"/"light-office") from the Kaleidoscope
8
- // resource bundle as a Metal texture on first frame; cache it; capture
9
- // its aspect ratio.
10
- // 3. Read the latest completed mask; if none yet, forward the ORIGINAL
11
- // frame. Kick a new segmentation if idle.
12
- // 4. Composite original (foreground) over the PNG (background) using the
13
- // mask, with cover-fit on the background UVs.
14
- //
15
- // One instance per registered name ("background-image-dark-office" /
16
- // "background-image-light-office"), each constructed with its asset name. The
17
- // instance is shared across every frame, so all mutable state is guarded by
18
- // an os_unfair_lock. Every failure path logs under Kaleidoscope.BgImage and
19
- // returns the ORIGINAL frame.
20
- //
21
- // BACKGROUND ORIENTATION (V-flip parity; both platforms flip, by different means):
22
- // Android pre-flips the bitmap vertically before upload (OpenGL ES has no
23
- // UNPACK_FLIP_Y and GL texture (0,0) is bottom-left). iOS loads the WebP with
24
- // MTKTextureLoaderOriginTopLeft, then folds a V-flip into uBgUvScale/uBgUvOffset
25
- // at the composite (composed WITH the cover-fit so centering is preserved). The
26
- // flip is required because at Metal sample time the MTKTextureLoader texture's
27
- // top row lands at the opposite V end from the CoreImage-rendered "original"
28
- // foreground (which composites correct on-device); the two standalone-image vs.
29
- // CVPixelBuffer paths do NOT share a V convention despite both being "row 0 =
30
- // top". U is untouched (the background is never mirrored). This is texture-origin
31
- // parity, NOT camera orientation; see shaders/composite.frag header + PATTERNS.md.
32
- //
33
- // CAMERA ORIENTATION:
34
- // The camera rotation is normalized at ingest (Ingest.swift): the "original"
35
- // foreground texture is already DISPLAY-UPRIGHT and sized to the display dims.
36
- // The composite therefore runs entirely in upright screen space, so the static
37
- // PNG composites DIRECTLY with a plain cover-fit against the display aspect.
38
- // The old per-effect pre-orient pass (a transform.metalsrc bake that rotated
39
- // the PNG to undo FrameBridge's preserved frame.rotation) is gone; orientation
40
- // lives only in the ingest now, matching android/.../BackgroundImageFactory.kt.
41
-
42
- import Foundation
43
- import CoreVideo
44
- import Metal
45
- import MetalKit
46
- import os.log
47
- import WebRTC
48
- // Import whichever react-native-webrtc fork is present; both expose the same
49
- // VideoFrameProcessorDelegate / ProcessorProvider symbols. See Registration.swift.
50
- #if canImport(livekit_react_native_webrtc)
51
- import livekit_react_native_webrtc
52
- #elseif canImport(react_native_webrtc)
53
- import react_native_webrtc
54
- #endif
55
-
56
- @objc(KaleidoscopeBackgroundImageProcessor)
57
- public final class BackgroundImageProcessor: NSObject, VideoFrameProcessorDelegate {
58
- private static let log = OSLog(subsystem: "com.simiancraft.kaleidoscope", category: "BgImage")
59
-
60
- private let assetName: String
61
-
62
- private var unsafeLock = os_unfair_lock_s()
63
- private var renderer: MetalRenderer?
64
- private var rendererFailed = false
65
- private let segmenter = Segmenter()
66
-
67
- private var backgroundTexture: MTLTexture?
68
- private var backgroundAspect: Float = 1.0
69
- private var backgroundLoadFailed = false
70
-
71
- @objc public init(assetName: String) {
72
- self.assetName = assetName
73
- super.init()
74
- }
75
-
76
- @objc(capturer:didCaptureVideoFrame:)
77
- public func capturer(
78
- _ capturer: RTCVideoCapturer,
79
- didCapture frame: RTCVideoFrame
80
- ) -> RTCVideoFrame {
81
- os_unfair_lock_lock(&unsafeLock)
82
- defer { os_unfair_lock_unlock(&unsafeLock) }
83
- do {
84
- return try process(frame)
85
- } catch {
86
- os_log("bgImage failed (asset %{public}@); forwarding original. %{public}@",
87
- log: BackgroundImageProcessor.log, type: .error,
88
- assetName, error.localizedDescription)
89
- return frame
90
- }
91
- }
92
-
93
- private func ensureRenderer() throws -> MetalRenderer {
94
- if let renderer = renderer { return renderer }
95
- if rendererFailed { throw RendererError.noMetalDevice }
96
- do {
97
- let created = try MetalRenderer(bundle: Bundle(for: BackgroundImageProcessor.self))
98
- renderer = created
99
- return created
100
- } catch {
101
- rendererFailed = true
102
- throw error
103
- }
104
- }
105
-
106
- /// Lazy-load the WebP from the Kaleidoscope bundle as a Metal texture (decoded
107
- /// via ImageIO, which supports WebP on iOS 14+; the podspec floors iOS 15).
108
- /// Caches success and failure so a missing asset degrades to passthrough
109
- /// without retrying every frame.
110
- private func ensureBackgroundTexture(device: MTLDevice) -> MTLTexture? {
111
- if let tex = backgroundTexture { return tex }
112
- if backgroundLoadFailed { return nil }
113
-
114
- let containing = Bundle(for: BackgroundImageProcessor.self)
115
- let resourceBundle = Bundle.kaleidoscopeResources(relativeTo: containing) ?? containing
116
- guard let url = resourceBundle.url(
117
- forResource: assetName, withExtension: "webp", subdirectory: "backgrounds"
118
- ) ?? resourceBundle.url(forResource: assetName, withExtension: "webp") else {
119
- os_log("background asset %{public}@.webp not found in bundle",
120
- log: BackgroundImageProcessor.log, type: .error, assetName)
121
- backgroundLoadFailed = true
122
- return nil
123
- }
124
-
125
- let loader = MTKTextureLoader(device: device)
126
- let options: [MTKTextureLoader.Option: Any] = [
127
- // Top-left origin so PNG row 0 (top) -> texture row 0; matches the
128
- // composite vUv convention. See the file header.
129
- .origin: MTKTextureLoader.Origin.topLeft,
130
- .SRGB: false,
131
- .textureUsage: NSNumber(value: MTLTextureUsage.shaderRead.rawValue),
132
- .textureStorageMode: NSNumber(value: MTLStorageMode.private.rawValue),
133
- ]
134
- do {
135
- let tex = try loader.newTexture(URL: url, options: options)
136
- backgroundTexture = tex
137
- backgroundAspect = Float(tex.width) / Float(max(tex.height, 1))
138
- os_log("background asset %{public}@ loaded: %dx%d aspect=%.3f",
139
- log: BackgroundImageProcessor.log, type: .info,
140
- assetName, tex.width, tex.height, backgroundAspect)
141
- return tex
142
- } catch {
143
- os_log("background asset %{public}@ load failed: %{public}@",
144
- log: BackgroundImageProcessor.log, type: .error,
145
- assetName, error.localizedDescription)
146
- backgroundLoadFailed = true
147
- return nil
148
- }
149
- }
150
-
151
- private func process(_ frame: RTCVideoFrame) throws -> RTCVideoFrame {
152
- guard let input = FrameBridge.inputPixelBuffer(frame) else {
153
- return frame
154
- }
155
- let bufferW = CVPixelBufferGetWidth(input)
156
- let bufferH = CVPixelBufferGetHeight(input)
157
- guard bufferW > 0, bufferH > 0 else { return frame }
158
-
159
- let renderer = try ensureRenderer()
160
-
161
- guard let backgroundTexture = ensureBackgroundTexture(device: renderer.device) else {
162
- // Asset unavailable; forward original instead of compositing onto
163
- // nothing.
164
- return frame
165
- }
166
-
167
- // Step 1: ingest NV12 -> DISPLAY-UPRIGHT "original" BGRA texture. The display
168
- // rotation is folded in here (Ingest.swift); `width`/`height` are the DISPLAY
169
- // dims (buffer dims swapped on a 90/270 frame). The composite then runs in
170
- // upright screen space and the PNG composites directly.
171
- let rotation = frame.rotation.rawValue
172
- let width = Ingest.displayWidth(bufferWidth: bufferW, bufferHeight: bufferH, rotation: rotation)
173
- let height = Ingest.displayHeight(bufferWidth: bufferW, bufferHeight: bufferH, rotation: rotation)
174
- let (originalBuffer, originalTexture, originalWrapper) = try renderer.originalIngestTarget(
175
- width: width, height: height
176
- )
177
- try TextureBridge.ingest(input: input, into: originalBuffer, frameRotation: rotation)
178
-
179
- // Step 2: latest mask or forward original.
180
- guard let maskBuffer = segmenter.latestMask() else {
181
- segmenter.kickIfIdle(input: originalBuffer)
182
- return frame
183
- }
184
- segmenter.kickIfIdle(input: originalBuffer)
185
-
186
- let (maskTexture, maskWrapper) = try TextureBridge.makeTexture(
187
- from: maskBuffer,
188
- cache: renderer.textureCache,
189
- pixelFormat: .r8Unorm,
190
- planeIndex: 0
191
- )
192
-
193
- // Cover-fit the background UVs against the DISPLAY aspect. The original is
194
- // already display-upright and the composite output is the display dims
195
- // (width x height), so the frame the user sees has aspect width/height with
196
- // no further axis swap; cover-fit the upright PNG against it directly. Port
197
- // of BackgroundImageFactory.kt now that iOS runs in upright screen space.
198
- let outAspect = Float(width) / Float(height)
199
- let bgAspect = backgroundAspect
200
- let bgUvScale: SIMD2<Float>
201
- let bgUvOffset: SIMD2<Float>
202
- if bgAspect > outAspect {
203
- let scaleX = outAspect / bgAspect
204
- bgUvScale = SIMD2<Float>(scaleX, 1.0)
205
- bgUvOffset = SIMD2<Float>((1.0 - scaleX) * 0.5, 0.0)
206
- } else {
207
- let scaleY = bgAspect / outAspect
208
- bgUvScale = SIMD2<Float>(1.0, scaleY)
209
- bgUvOffset = SIMD2<Float>(0.0, (1.0 - scaleY) * 0.5)
210
- }
211
-
212
- // V-flip parity for the MTKTextureLoader-loaded background, composed WITH
213
- // the cover-fit above (do not clobber it). The composite samples every
214
- // texture at plain vUv and the convention is "semantic top of source at
215
- // GL v=1". The CoreImage/CVPixelBuffer "original" foreground lands that way
216
- // and is correct on-device; the MTKTextureLoader texture does NOT match it
217
- // at sample time (its top row lands at vUv.y=0, the opposite end), so the
218
- // background renders vertically inverted without this flip. Folding the
219
- // flip into the cover-fit UVs is the same mechanism iOS blur uses to carry
220
- // its parity flip (uBgUvScale=(1,-1)); see shaders/composite.frag header and
221
- // PATTERNS.md. The composite computes bgUv = vUv*scale + offset, so the
222
- // cover-fit window is bgUv.y in [offset.y, offset.y+scale.y]. To flip V
223
- // while keeping THAT SAME window centered, negate scale.y and set
224
- // offset.y' = offset.y + scale.y (maps vUv.y=0 to the window's far edge and
225
- // vUv.y=1 to its near edge). NB: the common "offset.y = 1 - offset.y"
226
- // shorthand is only exact when scale.y == 1 (the letterbox-on-X branch); in
227
- // the letterbox-on-Y branch scale.y < 1 and that shorthand would shift the
228
- // crop, so use offset.y + scale.y, which is exact for both branches. U is
229
- // untouched: the background never goes through ingest and is not mirrored,
230
- // matching the foreground.
231
- let flippedBgUvScale = SIMD2<Float>(bgUvScale.x, -bgUvScale.y)
232
- let flippedBgUvOffset = SIMD2<Float>(bgUvOffset.x, bgUvOffset.y + bgUvScale.y)
233
-
234
- let (maskLo, maskHi) = MaskTuning.smoothstepRange(
235
- hardness: EffectTuning.maskHardness,
236
- threshold: EffectTuning.maskThreshold
237
- )
238
-
239
- let output = try renderer.dequeueOutputBuffer(width: width, height: height)
240
- let (outputTexture, outputWrapper) = try TextureBridge.makeTexture(
241
- from: output,
242
- cache: renderer.textureCache,
243
- pixelFormat: .bgra8Unorm,
244
- planeIndex: 0
245
- )
246
-
247
- let commandBuffer = try renderer.makeCommandBuffer()
248
- commandBuffer.label = "Kaleidoscope.BgImage"
249
- try renderer.encodeComposite(
250
- commandBuffer: commandBuffer,
251
- target: outputTexture,
252
- original: originalTexture,
253
- // The PNG composites DIRECTLY (no pre-orient bake): it is sampled in the
254
- // same single composite pass as uOriginal. Camera orientation was handled
255
- // at ingest. It still needs a single V-flip parity term on uBgUvScale/
256
- // Offset (folded above) because the MTKTextureLoader texture's top row
257
- // lands at the opposite V end from the CoreImage "original" foreground at
258
- // sample time; that flip is texture-origin parity, NOT camera orientation.
259
- background: backgroundTexture,
260
- mask: maskTexture,
261
- maskUvScale: SIMD2<Float>(1, 1),
262
- maskUvOffset: SIMD2<Float>(0, 0),
263
- maskHi: maskHi,
264
- maskLo: maskLo,
265
- bgUvScale: flippedBgUvScale,
266
- bgUvOffset: flippedBgUvOffset,
267
- label: "bgImage-composite"
268
- )
269
- // R3 frame-pipelining: commit asynchronously and return the PREVIOUS
270
- // frame's completed output (one frame of latency); see BlurProcessor and
271
- // MetalRenderer.commitPipelined. Before any frame has completed, forward
272
- // the original frame.
273
- // Keep the GPU's per-frame inputs alive until the command buffer completes;
274
- // see BlurProcessor for the full rationale. The mask CVPixelBuffer plus the
275
- // mask + output CVMetalTexture wrappers outlive process()'s return under R3.
276
- // The background MTLTexture is loaded once via MTKTextureLoader and cached on
277
- // this instance (not a pool buffer, no CVMetalTexture wrapper), so it needs
278
- // no keep-alive. The original ingest buffer + wrapper are pool-dequeued per
279
- // frame, so they ride the completion handler to keep the pool from recycling
280
- // a buffer the GPU is still sampling.
281
- guard let ready = renderer.commitPipelined(
282
- commandBuffer,
283
- currentOutput: output,
284
- keepAlive: [maskBuffer, maskWrapper, outputWrapper, originalBuffer, originalWrapper],
285
- debugTiming: EffectTuning.debugTiming,
286
- timingLabel: "bgImage"
287
- ) else {
288
- return frame
289
- }
290
-
291
- return FrameBridge.makeOutputFrame(pixelBuffer: ready, like: frame)
292
- }
293
- }