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.
- package/NOTICE.md +8 -8
- package/README.md +185 -56
- package/android/build.gradle +13 -0
- package/android/src/main/java/com/simiancraft/kaleidoscope/CompositeLayers.kt +127 -0
- package/android/src/main/java/com/simiancraft/kaleidoscope/EffectTuning.kt +69 -69
- package/android/src/main/java/com/simiancraft/kaleidoscope/KaleidoscopeModule.kt +86 -33
- package/android/src/main/java/com/simiancraft/kaleidoscope/Registration.kt +23 -64
- package/android/src/main/java/com/simiancraft/kaleidoscope/effects/CompositeFactory.kt +691 -0
- package/android/src/main/java/com/simiancraft/kaleidoscope/effects/LayerShaders.kt +30 -0
- package/android/src/main/java/com/simiancraft/kaleidoscope/effects/TransformFactory.kt +248 -200
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Egl.kt +82 -70
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Fbo.kt +50 -47
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/FramePipeline.kt +106 -105
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlDebug.kt +23 -23
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/GlProgram.kt +76 -57
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Ingest.kt +92 -71
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Orientation.kt +25 -25
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/Shaders.kt +57 -76
- package/android/src/main/java/com/simiancraft/kaleidoscope/gpu/ShadersGenerated.kt +1162 -25
- package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/Mask.kt +254 -242
- package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/MaskTuning.kt +28 -25
- package/android/src/main/java/com/simiancraft/kaleidoscope/segmentation/SegmentationEngine.kt +104 -98
- package/android/src/test/java/com/simiancraft/kaleidoscope/CompositeLayersTest.kt +165 -0
- package/app.plugin.js +9 -255
- package/catalog/composites/clouds/clouds.controls.tsx +19 -0
- package/catalog/composites/clouds/clouds.ts +32 -0
- package/catalog/composites/corporate-blobs/corporate-blobs.controls.tsx +24 -0
- package/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
- package/catalog/composites/corporate-blobs/corporate-blobs.ts +51 -0
- package/catalog/composites/corporate-blobs/corporate-blobs.web.ts +42 -0
- package/catalog/composites/fairy-cave/fairy-cave.controls.tsx +33 -0
- package/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
- package/catalog/composites/fairy-cave/fairy-cave.ts +53 -0
- package/catalog/composites/fairy-cave/fairy-cave.web.ts +47 -0
- package/catalog/composites/fairy-grotto/fairy-grotto.controls.tsx +34 -0
- package/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
- package/catalog/composites/fairy-grotto/fairy-grotto.ts +54 -0
- package/catalog/composites/fairy-grotto/fairy-grotto.web.ts +47 -0
- package/catalog/composites/fairy-hollow/fairy-hollow.controls.tsx +34 -0
- package/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
- package/catalog/composites/fairy-hollow/fairy-hollow.ts +55 -0
- package/catalog/composites/fairy-hollow/fairy-hollow.web.ts +47 -0
- package/catalog/composites/nebula/nebula.controls.tsx +19 -0
- package/catalog/composites/nebula/nebula.thumb.webp +0 -0
- package/catalog/composites/nebula/nebula.ts +37 -0
- package/catalog/composites/nebula/nebula.web.ts +30 -0
- package/catalog/composites/observation-deck/observation-deck.controls.tsx +28 -0
- package/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
- package/catalog/composites/observation-deck/observation-deck.ts +59 -0
- package/catalog/composites/observation-deck/observation-deck.web.ts +50 -0
- package/catalog/composites/simianlights/simianlights.controls.tsx +19 -0
- package/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
- package/catalog/composites/simianlights/simianlights.ts +34 -0
- package/catalog/composites/simianlights/simianlights.web.ts +29 -0
- package/catalog/composites/underwater/underwater.controls.tsx +19 -0
- package/catalog/composites/underwater/underwater.thumb.webp +0 -0
- package/catalog/composites/underwater/underwater.ts +42 -0
- package/catalog/composites/underwater/underwater.web.ts +36 -0
- package/catalog/composites/wizard-tower/wizard-tower.controls.tsx +23 -0
- package/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
- package/catalog/composites/wizard-tower/wizard-tower.ts +44 -0
- package/catalog/composites/wizard-tower/wizard-tower.web.ts +35 -0
- package/catalog/composites/wizard-tower-night/wizard-tower-night.controls.tsx +22 -0
- package/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
- package/catalog/composites/wizard-tower-night/wizard-tower-night.ts +43 -0
- package/catalog/composites/wizard-tower-night/wizard-tower-night.web.ts +35 -0
- package/catalog/images/README.md +188 -0
- package/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
- package/catalog/images/corporate/corporate-logo.ts +6 -0
- package/catalog/images/corporate/corporate-logo.web.ts +7 -0
- package/catalog/images/corporate/corporate-logo.webp +0 -0
- package/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
- package/catalog/images/debug/debug-resolutions.ts +6 -0
- package/catalog/images/debug/debug-resolutions.web.ts +7 -0
- package/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
- package/catalog/images/fairy-caves/grotto.ts +6 -0
- package/catalog/images/fairy-caves/grotto.web.ts +7 -0
- package/catalog/images/fairy-caves/grotto.webp +0 -0
- package/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
- package/catalog/images/fairy-caves/hollow.ts +6 -0
- package/catalog/images/fairy-caves/hollow.web.ts +7 -0
- package/catalog/images/fairy-caves/hollow.webp +0 -0
- package/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
- package/catalog/images/fairy-caves/treehouse-2.ts +6 -0
- package/catalog/images/fairy-caves/treehouse-2.web.ts +7 -0
- package/catalog/images/fairy-caves/treehouse-2.webp +0 -0
- package/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
- package/catalog/images/fairy-caves/treehouse-3.ts +6 -0
- package/catalog/images/fairy-caves/treehouse-3.web.ts +7 -0
- package/catalog/images/fairy-caves/treehouse-3.webp +0 -0
- package/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
- package/catalog/images/fairy-caves/treehouse.ts +6 -0
- package/catalog/images/fairy-caves/treehouse.web.ts +7 -0
- package/catalog/images/fairy-caves/treehouse.webp +0 -0
- package/catalog/images/home/home-dark.thumb.webp +0 -0
- package/catalog/images/home/home-dark.ts +6 -0
- package/catalog/images/home/home-dark.web.ts +7 -0
- package/catalog/images/home/home-light.thumb.webp +0 -0
- package/catalog/images/home/home-light.ts +6 -0
- package/catalog/images/home/home-light.web.ts +7 -0
- package/catalog/images/image-ids.ts +42 -0
- package/catalog/images/image.types.ts +5 -0
- package/catalog/images/index.ts +7 -0
- package/catalog/images/nature/landscape-dark.thumb.webp +0 -0
- package/catalog/images/nature/landscape-dark.ts +6 -0
- package/catalog/images/nature/landscape-dark.web.ts +7 -0
- package/catalog/images/nature/landscape-light.thumb.webp +0 -0
- package/catalog/images/nature/landscape-light.ts +6 -0
- package/catalog/images/nature/landscape-light.web.ts +7 -0
- package/catalog/images/office/office-dark.thumb.webp +0 -0
- package/catalog/images/office/office-dark.ts +6 -0
- package/catalog/images/office/office-dark.web.ts +7 -0
- package/catalog/images/office/office-light.thumb.webp +0 -0
- package/catalog/images/office/office-light.ts +6 -0
- package/catalog/images/office/office-light.web.ts +7 -0
- package/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
- package/catalog/images/sci-fi/sci-fi-light.ts +6 -0
- package/catalog/images/sci-fi/sci-fi-light.web.ts +7 -0
- package/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
- package/catalog/images/simiancraft/simiancraft-dark-transparency.ts +6 -0
- package/catalog/images/simiancraft/simiancraft-dark-transparency.web.ts +9 -0
- package/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
- package/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
- package/catalog/images/simiancraft/simiancraft-dark.ts +6 -0
- package/catalog/images/simiancraft/simiancraft-dark.web.ts +7 -0
- package/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
- package/catalog/images/simiancraft/simiancraft-light-transparency.ts +6 -0
- package/catalog/images/simiancraft/simiancraft-light-transparency.web.ts +9 -0
- package/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
- package/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
- package/catalog/images/simiancraft/simiancraft-light.ts +6 -0
- package/catalog/images/simiancraft/simiancraft-light.web.ts +7 -0
- package/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
- package/catalog/images/spaceship/observation-deck.ts +6 -0
- package/catalog/images/spaceship/observation-deck.web.ts +7 -0
- package/catalog/images/spaceship/observation-deck.webp +0 -0
- package/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
- package/catalog/images/underwater/oceanscape-dark.ts +6 -0
- package/catalog/images/underwater/oceanscape-dark.web.ts +7 -0
- package/catalog/images/underwater/oceanscape-dark.webp +0 -0
- package/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
- package/catalog/images/wizard-tower/wizard-tower-1.ts +6 -0
- package/catalog/images/wizard-tower/wizard-tower-1.web.ts +7 -0
- package/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
- package/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
- package/catalog/images/wizard-tower/wizard-tower-2.ts +6 -0
- package/catalog/images/wizard-tower/wizard-tower-2.web.ts +7 -0
- package/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
- package/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
- package/catalog/images/wizard-tower/wizard-tower-night.ts +6 -0
- package/catalog/images/wizard-tower/wizard-tower-night.web.ts +7 -0
- package/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
- package/catalog/shaders/README.md +114 -0
- package/catalog/shaders/_shared/composite-blit.frag +26 -0
- package/catalog/shaders/_shared/composite-camera.frag +17 -0
- package/catalog/shaders/_shared/composite-image.frag +23 -0
- package/catalog/shaders/_shared/composite-masked.frag +26 -0
- package/catalog/shaders/_shared/composite-subject.frag +27 -0
- package/catalog/shaders/_shared/passthrough.vert +27 -0
- package/catalog/shaders/_shared/transform.frag +27 -0
- package/catalog/shaders/_shared/types.ts +63 -0
- package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.tsx +37 -0
- package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.frag +123 -0
- package/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.ts +106 -0
- package/catalog/shaders/blur/blur.form.tsx +29 -0
- package/catalog/shaders/blur/blur.ts +32 -0
- package/catalog/shaders/blur/composite-blur.frag +42 -0
- package/catalog/shaders/clouds/clouds.form.tsx +39 -0
- package/catalog/shaders/clouds/clouds.frag +128 -0
- package/catalog/shaders/clouds/clouds.presets.md +37 -0
- package/catalog/shaders/clouds/clouds.ts +124 -0
- package/catalog/shaders/corporate-blobs/corporate-blobs.form.tsx +44 -0
- package/catalog/shaders/corporate-blobs/corporate-blobs.frag +224 -0
- package/catalog/shaders/corporate-blobs/corporate-blobs.ts +136 -0
- package/catalog/shaders/fireflies/fireflies.form.tsx +33 -0
- package/catalog/shaders/fireflies/fireflies.frag +68 -0
- package/catalog/shaders/fireflies/fireflies.ts +61 -0
- package/catalog/shaders/godrays/godrays.form.tsx +37 -0
- package/catalog/shaders/godrays/godrays.frag +85 -0
- package/catalog/shaders/godrays/godrays.ts +105 -0
- package/catalog/shaders/index.ts +78 -0
- package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.tsx +55 -0
- package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.frag +262 -0
- package/catalog/shaders/light-beams-and-motes/light-beams-and-motes.ts +137 -0
- package/catalog/shaders/nebula/nebula.form.tsx +34 -0
- package/catalog/shaders/nebula/nebula.frag +151 -0
- package/catalog/shaders/nebula/nebula.ts +74 -0
- package/catalog/shaders/plasma/plasma.form.tsx +32 -0
- package/catalog/shaders/plasma/plasma.frag +55 -0
- package/catalog/shaders/plasma/plasma.ts +44 -0
- package/catalog/shaders/simianlights/simianlights.form.tsx +34 -0
- package/catalog/shaders/simianlights/simianlights.frag +151 -0
- package/catalog/shaders/simianlights/simianlights.ts +73 -0
- package/dist/catalog/composites/clouds/clouds.controls.d.ts +3 -0
- package/dist/catalog/composites/clouds/clouds.controls.d.ts.map +1 -0
- package/dist/catalog/composites/clouds/clouds.controls.js +11 -0
- package/dist/catalog/composites/clouds/clouds.controls.js.map +1 -0
- package/dist/catalog/composites/clouds/clouds.d.ts +26 -0
- package/dist/catalog/composites/clouds/clouds.d.ts.map +1 -0
- package/dist/catalog/composites/clouds/clouds.js +33 -0
- package/dist/catalog/composites/clouds/clouds.js.map +1 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts +3 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.d.ts.map +1 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js +13 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.controls.js.map +1 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts +37 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.d.ts.map +1 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.js +52 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.js.map +1 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.thumb.webp +0 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts +37 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.d.ts.map +1 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js +46 -0
- package/dist/catalog/composites/corporate-blobs/corporate-blobs.web.js.map +1 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts +3 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.controls.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js +13 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.controls.js.map +1 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts +42 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.js +54 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.js.map +1 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.thumb.webp +0 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts +42 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.web.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.web.js +51 -0
- package/dist/catalog/composites/fairy-cave/fairy-cave.web.js.map +1 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts +3 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js +14 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.controls.js.map +1 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts +42 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.js +55 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.js.map +1 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.thumb.webp +0 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts +42 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js +51 -0
- package/dist/catalog/composites/fairy-grotto/fairy-grotto.web.js.map +1 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts +3 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js +14 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.controls.js.map +1 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts +42 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.js +56 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.js.map +1 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.thumb.webp +0 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts +42 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.d.ts.map +1 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js +51 -0
- package/dist/catalog/composites/fairy-hollow/fairy-hollow.web.js.map +1 -0
- package/dist/catalog/composites/nebula/nebula.controls.d.ts +3 -0
- package/dist/catalog/composites/nebula/nebula.controls.d.ts.map +1 -0
- package/dist/catalog/composites/nebula/nebula.controls.js +11 -0
- package/dist/catalog/composites/nebula/nebula.controls.js.map +1 -0
- package/dist/catalog/composites/nebula/nebula.d.ts +22 -0
- package/dist/catalog/composites/nebula/nebula.d.ts.map +1 -0
- package/dist/catalog/composites/nebula/nebula.js +38 -0
- package/dist/catalog/composites/nebula/nebula.js.map +1 -0
- package/dist/catalog/composites/nebula/nebula.thumb.webp +0 -0
- package/dist/catalog/composites/nebula/nebula.web.d.ts +22 -0
- package/dist/catalog/composites/nebula/nebula.web.d.ts.map +1 -0
- package/dist/catalog/composites/nebula/nebula.web.js +34 -0
- package/dist/catalog/composites/nebula/nebula.web.js.map +1 -0
- package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts +3 -0
- package/dist/catalog/composites/observation-deck/observation-deck.controls.d.ts.map +1 -0
- package/dist/catalog/composites/observation-deck/observation-deck.controls.js +13 -0
- package/dist/catalog/composites/observation-deck/observation-deck.controls.js.map +1 -0
- package/dist/catalog/composites/observation-deck/observation-deck.d.ts +41 -0
- package/dist/catalog/composites/observation-deck/observation-deck.d.ts.map +1 -0
- package/dist/catalog/composites/observation-deck/observation-deck.js +60 -0
- package/dist/catalog/composites/observation-deck/observation-deck.js.map +1 -0
- package/dist/catalog/composites/observation-deck/observation-deck.thumb.webp +0 -0
- package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts +41 -0
- package/dist/catalog/composites/observation-deck/observation-deck.web.d.ts.map +1 -0
- package/dist/catalog/composites/observation-deck/observation-deck.web.js +54 -0
- package/dist/catalog/composites/observation-deck/observation-deck.web.js.map +1 -0
- package/dist/catalog/composites/simianlights/simianlights.controls.d.ts +3 -0
- package/dist/catalog/composites/simianlights/simianlights.controls.d.ts.map +1 -0
- package/dist/catalog/composites/simianlights/simianlights.controls.js +11 -0
- package/dist/catalog/composites/simianlights/simianlights.controls.js.map +1 -0
- package/dist/catalog/composites/simianlights/simianlights.d.ts +22 -0
- package/dist/catalog/composites/simianlights/simianlights.d.ts.map +1 -0
- package/dist/catalog/composites/simianlights/simianlights.js +30 -0
- package/dist/catalog/composites/simianlights/simianlights.js.map +1 -0
- package/dist/catalog/composites/simianlights/simianlights.thumb.webp +0 -0
- package/dist/catalog/composites/simianlights/simianlights.web.d.ts +22 -0
- package/dist/catalog/composites/simianlights/simianlights.web.d.ts.map +1 -0
- package/dist/catalog/composites/simianlights/simianlights.web.js +33 -0
- package/dist/catalog/composites/simianlights/simianlights.web.js.map +1 -0
- package/dist/catalog/composites/underwater/underwater.controls.d.ts +3 -0
- package/dist/catalog/composites/underwater/underwater.controls.d.ts.map +1 -0
- package/dist/catalog/composites/underwater/underwater.controls.js +11 -0
- package/dist/catalog/composites/underwater/underwater.controls.js.map +1 -0
- package/dist/catalog/composites/underwater/underwater.d.ts +30 -0
- package/dist/catalog/composites/underwater/underwater.d.ts.map +1 -0
- package/dist/catalog/composites/underwater/underwater.js +43 -0
- package/dist/catalog/composites/underwater/underwater.js.map +1 -0
- package/dist/catalog/composites/underwater/underwater.thumb.webp +0 -0
- package/dist/catalog/composites/underwater/underwater.web.d.ts +30 -0
- package/dist/catalog/composites/underwater/underwater.web.d.ts.map +1 -0
- package/dist/catalog/composites/underwater/underwater.web.js +40 -0
- package/dist/catalog/composites/underwater/underwater.web.js.map +1 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts +3 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.controls.d.ts.map +1 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js +15 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.controls.js.map +1 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts +31 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.d.ts.map +1 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.js +45 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.js.map +1 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.thumb.webp +0 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts +31 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.web.d.ts.map +1 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.web.js +39 -0
- package/dist/catalog/composites/wizard-tower/wizard-tower.web.js.map +1 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts +3 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.d.ts.map +1 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js +14 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.controls.js.map +1 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts +31 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.d.ts.map +1 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js +44 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.js.map +1 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.thumb.webp +0 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts +31 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.d.ts.map +1 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js +39 -0
- package/dist/catalog/composites/wizard-tower-night/wizard-tower-night.web.js.map +1 -0
- package/dist/catalog/images/corporate/corporate-logo.d.ts +3 -0
- package/dist/catalog/images/corporate/corporate-logo.d.ts.map +1 -0
- package/dist/catalog/images/corporate/corporate-logo.js +8 -0
- package/dist/catalog/images/corporate/corporate-logo.js.map +1 -0
- package/dist/catalog/images/corporate/corporate-logo.thumb.webp +0 -0
- package/dist/catalog/images/corporate/corporate-logo.web.d.ts +3 -0
- package/dist/catalog/images/corporate/corporate-logo.web.d.ts.map +1 -0
- package/dist/catalog/images/corporate/corporate-logo.web.js +12 -0
- package/dist/catalog/images/corporate/corporate-logo.web.js.map +1 -0
- package/dist/catalog/images/corporate/corporate-logo.webp +0 -0
- package/dist/catalog/images/debug/debug-resolutions.d.ts +3 -0
- package/dist/catalog/images/debug/debug-resolutions.d.ts.map +1 -0
- package/dist/catalog/images/debug/debug-resolutions.js +8 -0
- package/dist/catalog/images/debug/debug-resolutions.js.map +1 -0
- package/dist/catalog/images/debug/debug-resolutions.thumb.webp +0 -0
- package/dist/catalog/images/debug/debug-resolutions.web.d.ts +3 -0
- package/dist/catalog/images/debug/debug-resolutions.web.d.ts.map +1 -0
- package/dist/catalog/images/debug/debug-resolutions.web.js +12 -0
- package/dist/catalog/images/debug/debug-resolutions.web.js.map +1 -0
- package/dist/catalog/images/fairy-caves/grotto.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/grotto.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/grotto.js +8 -0
- package/dist/catalog/images/fairy-caves/grotto.js.map +1 -0
- package/dist/catalog/images/fairy-caves/grotto.thumb.webp +0 -0
- package/dist/catalog/images/fairy-caves/grotto.web.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/grotto.web.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/grotto.web.js +12 -0
- package/dist/catalog/images/fairy-caves/grotto.web.js.map +1 -0
- package/dist/catalog/images/fairy-caves/grotto.webp +0 -0
- package/dist/catalog/images/fairy-caves/hollow.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/hollow.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/hollow.js +8 -0
- package/dist/catalog/images/fairy-caves/hollow.js.map +1 -0
- package/dist/catalog/images/fairy-caves/hollow.thumb.webp +0 -0
- package/dist/catalog/images/fairy-caves/hollow.web.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/hollow.web.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/hollow.web.js +12 -0
- package/dist/catalog/images/fairy-caves/hollow.web.js.map +1 -0
- package/dist/catalog/images/fairy-caves/hollow.webp +0 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.js +8 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.js.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.thumb.webp +0 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.web.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.web.js +12 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.web.js.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse-2.webp +0 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.js +8 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.js.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.thumb.webp +0 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.web.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.web.js +12 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.web.js.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse-3.webp +0 -0
- package/dist/catalog/images/fairy-caves/treehouse.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/treehouse.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse.js +8 -0
- package/dist/catalog/images/fairy-caves/treehouse.js.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse.thumb.webp +0 -0
- package/dist/catalog/images/fairy-caves/treehouse.web.d.ts +3 -0
- package/dist/catalog/images/fairy-caves/treehouse.web.d.ts.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse.web.js +12 -0
- package/dist/catalog/images/fairy-caves/treehouse.web.js.map +1 -0
- package/dist/catalog/images/fairy-caves/treehouse.webp +0 -0
- package/dist/catalog/images/home/home-dark.d.ts +3 -0
- package/dist/catalog/images/home/home-dark.d.ts.map +1 -0
- package/dist/catalog/images/home/home-dark.js +8 -0
- package/dist/catalog/images/home/home-dark.js.map +1 -0
- package/dist/catalog/images/home/home-dark.thumb.webp +0 -0
- package/dist/catalog/images/home/home-dark.web.d.ts +3 -0
- package/dist/catalog/images/home/home-dark.web.d.ts.map +1 -0
- package/dist/catalog/images/home/home-dark.web.js +12 -0
- package/dist/catalog/images/home/home-dark.web.js.map +1 -0
- package/dist/catalog/images/home/home-light.d.ts +3 -0
- package/dist/catalog/images/home/home-light.d.ts.map +1 -0
- package/dist/catalog/images/home/home-light.js +8 -0
- package/dist/catalog/images/home/home-light.js.map +1 -0
- package/dist/catalog/images/home/home-light.thumb.webp +0 -0
- package/dist/catalog/images/home/home-light.web.d.ts +3 -0
- package/dist/catalog/images/home/home-light.web.d.ts.map +1 -0
- package/dist/catalog/images/home/home-light.web.js +12 -0
- package/dist/catalog/images/home/home-light.web.js.map +1 -0
- package/dist/catalog/images/image-ids.d.ts +3 -0
- package/dist/catalog/images/image-ids.d.ts.map +1 -0
- package/dist/catalog/images/image-ids.js +43 -0
- package/dist/catalog/images/image-ids.js.map +1 -0
- package/dist/catalog/images/image.types.d.ts +2 -0
- package/dist/catalog/images/image.types.d.ts.map +1 -0
- package/dist/catalog/images/image.types.js +3 -0
- package/dist/catalog/images/image.types.js.map +1 -0
- package/dist/catalog/images/index.d.ts +3 -0
- package/dist/catalog/images/index.d.ts.map +1 -0
- package/dist/catalog/images/index.js +10 -0
- package/dist/catalog/images/index.js.map +1 -0
- package/dist/catalog/images/nature/landscape-dark.d.ts +3 -0
- package/dist/catalog/images/nature/landscape-dark.d.ts.map +1 -0
- package/dist/catalog/images/nature/landscape-dark.js +8 -0
- package/dist/catalog/images/nature/landscape-dark.js.map +1 -0
- package/dist/catalog/images/nature/landscape-dark.thumb.webp +0 -0
- package/dist/catalog/images/nature/landscape-dark.web.d.ts +3 -0
- package/dist/catalog/images/nature/landscape-dark.web.d.ts.map +1 -0
- package/dist/catalog/images/nature/landscape-dark.web.js +12 -0
- package/dist/catalog/images/nature/landscape-dark.web.js.map +1 -0
- package/dist/catalog/images/nature/landscape-light.d.ts +3 -0
- package/dist/catalog/images/nature/landscape-light.d.ts.map +1 -0
- package/dist/catalog/images/nature/landscape-light.js +8 -0
- package/dist/catalog/images/nature/landscape-light.js.map +1 -0
- package/dist/catalog/images/nature/landscape-light.thumb.webp +0 -0
- package/dist/catalog/images/nature/landscape-light.web.d.ts +3 -0
- package/dist/catalog/images/nature/landscape-light.web.d.ts.map +1 -0
- package/dist/catalog/images/nature/landscape-light.web.js +12 -0
- package/dist/catalog/images/nature/landscape-light.web.js.map +1 -0
- package/dist/catalog/images/office/office-dark.d.ts +3 -0
- package/dist/catalog/images/office/office-dark.d.ts.map +1 -0
- package/dist/catalog/images/office/office-dark.js +8 -0
- package/dist/catalog/images/office/office-dark.js.map +1 -0
- package/dist/catalog/images/office/office-dark.thumb.webp +0 -0
- package/dist/catalog/images/office/office-dark.web.d.ts +3 -0
- package/dist/catalog/images/office/office-dark.web.d.ts.map +1 -0
- package/dist/catalog/images/office/office-dark.web.js +12 -0
- package/dist/catalog/images/office/office-dark.web.js.map +1 -0
- package/dist/catalog/images/office/office-light.d.ts +3 -0
- package/dist/catalog/images/office/office-light.d.ts.map +1 -0
- package/dist/catalog/images/office/office-light.js +8 -0
- package/dist/catalog/images/office/office-light.js.map +1 -0
- package/dist/catalog/images/office/office-light.thumb.webp +0 -0
- package/dist/catalog/images/office/office-light.web.d.ts +3 -0
- package/dist/catalog/images/office/office-light.web.d.ts.map +1 -0
- package/dist/catalog/images/office/office-light.web.js +12 -0
- package/dist/catalog/images/office/office-light.web.js.map +1 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.d.ts +3 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.d.ts.map +1 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.js +8 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.js.map +1 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.thumb.webp +0 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts +3 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.web.d.ts.map +1 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.web.js +12 -0
- package/dist/catalog/images/sci-fi/sci-fi-light.web.js.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts +3 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.d.ts.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js +8 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.js.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.thumb.webp +0 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts +3 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.d.ts.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js +12 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.web.js.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark-transparency.webp +0 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts +3 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.d.ts.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.js +8 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.js.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.thumb.webp +0 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts +3 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.web.d.ts.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.web.js +12 -0
- package/dist/catalog/images/simiancraft/simiancraft-dark.web.js.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts +3 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.d.ts.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js +8 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.js.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.thumb.webp +0 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts +3 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.d.ts.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js +12 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.web.js.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-light-transparency.webp +0 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.d.ts +3 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.d.ts.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.js +8 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.js.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.thumb.webp +0 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts +3 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.web.d.ts.map +1 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.web.js +12 -0
- package/dist/catalog/images/simiancraft/simiancraft-light.web.js.map +1 -0
- package/dist/catalog/images/spaceship/observation-deck.d.ts +3 -0
- package/dist/catalog/images/spaceship/observation-deck.d.ts.map +1 -0
- package/dist/catalog/images/spaceship/observation-deck.js +8 -0
- package/dist/catalog/images/spaceship/observation-deck.js.map +1 -0
- package/dist/catalog/images/spaceship/observation-deck.thumb.webp +0 -0
- package/dist/catalog/images/spaceship/observation-deck.web.d.ts +3 -0
- package/dist/catalog/images/spaceship/observation-deck.web.d.ts.map +1 -0
- package/dist/catalog/images/spaceship/observation-deck.web.js +12 -0
- package/dist/catalog/images/spaceship/observation-deck.web.js.map +1 -0
- package/dist/catalog/images/spaceship/observation-deck.webp +0 -0
- package/dist/catalog/images/underwater/oceanscape-dark.d.ts +3 -0
- package/dist/catalog/images/underwater/oceanscape-dark.d.ts.map +1 -0
- package/dist/catalog/images/underwater/oceanscape-dark.js +8 -0
- package/dist/catalog/images/underwater/oceanscape-dark.js.map +1 -0
- package/dist/catalog/images/underwater/oceanscape-dark.thumb.webp +0 -0
- package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts +3 -0
- package/dist/catalog/images/underwater/oceanscape-dark.web.d.ts.map +1 -0
- package/dist/catalog/images/underwater/oceanscape-dark.web.js +12 -0
- package/dist/catalog/images/underwater/oceanscape-dark.web.js.map +1 -0
- package/dist/catalog/images/underwater/oceanscape-dark.webp +0 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts +3 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.d.ts.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.js +8 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.js.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.thumb.webp +0 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts +3 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.web.d.ts.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js +12 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.web.js.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-1.webp +0 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts +3 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.d.ts.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.js +8 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.js.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.thumb.webp +0 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts +3 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.web.d.ts.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js +12 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.web.js.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-2.webp +0 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts +3 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.d.ts.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.js +8 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.js.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.thumb.webp +0 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts +3 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.web.d.ts.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js +12 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.web.js.map +1 -0
- package/dist/catalog/images/wizard-tower/wizard-tower-night.webp +0 -0
- package/dist/catalog/shaders/_shared/types.d.ts +38 -0
- package/dist/catalog/shaders/_shared/types.d.ts.map +1 -0
- package/dist/catalog/shaders/_shared/types.js +15 -0
- package/dist/catalog/shaders/_shared/types.js.map +1 -0
- package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts +26 -0
- package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.d.ts.map +1 -0
- package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts +3 -0
- package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.d.ts.map +1 -0
- package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js +15 -0
- package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.form.js.map +1 -0
- package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js +84 -0
- package/dist/catalog/shaders/anamorphic-lensflare/anamorphic-lensflare.js.map +1 -0
- package/dist/catalog/shaders/blur/blur.d.ts +15 -0
- package/dist/catalog/shaders/blur/blur.d.ts.map +1 -0
- package/dist/catalog/shaders/blur/blur.form.d.ts +3 -0
- package/dist/catalog/shaders/blur/blur.form.d.ts.map +1 -0
- package/dist/catalog/shaders/blur/blur.form.js +15 -0
- package/dist/catalog/shaders/blur/blur.form.js.map +1 -0
- package/dist/catalog/shaders/blur/blur.js +27 -0
- package/dist/catalog/shaders/blur/blur.js.map +1 -0
- package/dist/catalog/shaders/clouds/clouds.d.ts +34 -0
- package/dist/catalog/shaders/clouds/clouds.d.ts.map +1 -0
- package/dist/catalog/shaders/clouds/clouds.form.d.ts +3 -0
- package/dist/catalog/shaders/clouds/clouds.form.d.ts.map +1 -0
- package/dist/catalog/shaders/clouds/clouds.form.js +15 -0
- package/dist/catalog/shaders/clouds/clouds.form.js.map +1 -0
- package/dist/catalog/shaders/clouds/clouds.js +98 -0
- package/dist/catalog/shaders/clouds/clouds.js.map +1 -0
- package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts +40 -0
- package/dist/catalog/shaders/corporate-blobs/corporate-blobs.d.ts.map +1 -0
- package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts +3 -0
- package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.d.ts.map +1 -0
- package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js +15 -0
- package/dist/catalog/shaders/corporate-blobs/corporate-blobs.form.js.map +1 -0
- package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js +100 -0
- package/dist/catalog/shaders/corporate-blobs/corporate-blobs.js.map +1 -0
- package/dist/catalog/shaders/fireflies/fireflies.d.ts +18 -0
- package/dist/catalog/shaders/fireflies/fireflies.d.ts.map +1 -0
- package/dist/catalog/shaders/fireflies/fireflies.form.d.ts +3 -0
- package/dist/catalog/shaders/fireflies/fireflies.form.d.ts.map +1 -0
- package/dist/catalog/shaders/fireflies/fireflies.form.js +15 -0
- package/dist/catalog/shaders/fireflies/fireflies.form.js.map +1 -0
- package/dist/catalog/shaders/fireflies/fireflies.js +47 -0
- package/dist/catalog/shaders/fireflies/fireflies.js.map +1 -0
- package/dist/catalog/shaders/godrays/godrays.d.ts +26 -0
- package/dist/catalog/shaders/godrays/godrays.d.ts.map +1 -0
- package/dist/catalog/shaders/godrays/godrays.form.d.ts +3 -0
- package/dist/catalog/shaders/godrays/godrays.form.d.ts.map +1 -0
- package/dist/catalog/shaders/godrays/godrays.form.js +15 -0
- package/dist/catalog/shaders/godrays/godrays.form.js.map +1 -0
- package/dist/catalog/shaders/godrays/godrays.js +83 -0
- package/dist/catalog/shaders/godrays/godrays.js.map +1 -0
- package/dist/catalog/shaders/index.d.ts +73 -0
- package/dist/catalog/shaders/index.d.ts.map +1 -0
- package/dist/catalog/shaders/index.js +30 -0
- package/dist/catalog/shaders/index.js.map +1 -0
- package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts +44 -0
- package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.d.ts.map +1 -0
- package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts +3 -0
- package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.d.ts.map +1 -0
- package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js +16 -0
- package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.form.js.map +1 -0
- package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js +91 -0
- package/dist/catalog/shaders/light-beams-and-motes/light-beams-and-motes.js.map +1 -0
- package/dist/catalog/shaders/nebula/nebula.d.ts +20 -0
- package/dist/catalog/shaders/nebula/nebula.d.ts.map +1 -0
- package/dist/catalog/shaders/nebula/nebula.form.d.ts +3 -0
- package/dist/catalog/shaders/nebula/nebula.form.d.ts.map +1 -0
- package/dist/catalog/shaders/nebula/nebula.form.js +15 -0
- package/dist/catalog/shaders/nebula/nebula.form.js.map +1 -0
- package/dist/catalog/shaders/nebula/nebula.js +58 -0
- package/dist/catalog/shaders/nebula/nebula.js.map +1 -0
- package/dist/catalog/shaders/plasma/plasma.d.ts +16 -0
- package/dist/catalog/shaders/plasma/plasma.d.ts.map +1 -0
- package/dist/catalog/shaders/plasma/plasma.form.d.ts +3 -0
- package/dist/catalog/shaders/plasma/plasma.form.d.ts.map +1 -0
- package/dist/catalog/shaders/plasma/plasma.form.js +15 -0
- package/dist/catalog/shaders/plasma/plasma.form.js.map +1 -0
- package/dist/catalog/shaders/plasma/plasma.js +32 -0
- package/dist/catalog/shaders/plasma/plasma.js.map +1 -0
- package/dist/catalog/shaders/simianlights/simianlights.d.ts +20 -0
- package/dist/catalog/shaders/simianlights/simianlights.d.ts.map +1 -0
- package/dist/catalog/shaders/simianlights/simianlights.form.d.ts +3 -0
- package/dist/catalog/shaders/simianlights/simianlights.form.d.ts.map +1 -0
- package/dist/catalog/shaders/simianlights/simianlights.form.js +15 -0
- package/dist/catalog/shaders/simianlights/simianlights.form.js.map +1 -0
- package/dist/catalog/shaders/simianlights/simianlights.js +57 -0
- package/dist/catalog/shaders/simianlights/simianlights.js.map +1 -0
- package/dist/src/components/form/control-form.d.ts +37 -0
- package/dist/src/components/form/control-form.d.ts.map +1 -0
- package/dist/src/components/form/control-form.js +55 -0
- package/dist/src/components/form/control-form.js.map +1 -0
- package/dist/src/components/form/make-controls.d.ts +22 -0
- package/dist/src/components/form/make-controls.d.ts.map +1 -0
- package/dist/src/components/form/make-controls.js +19 -0
- package/dist/src/components/form/make-controls.js.map +1 -0
- package/dist/src/components/form/scope.d.ts +2 -0
- package/dist/src/components/form/scope.d.ts.map +1 -0
- package/dist/src/components/form/scope.js +11 -0
- package/dist/src/components/form/scope.js.map +1 -0
- package/dist/src/components/form/use-field.d.ts +10 -0
- package/dist/src/components/form/use-field.d.ts.map +1 -0
- package/dist/src/components/form/use-field.js +27 -0
- package/dist/src/components/form/use-field.js.map +1 -0
- package/dist/src/components/preset-book-menu/index.d.ts +52 -0
- package/dist/src/components/preset-book-menu/index.d.ts.map +1 -0
- package/dist/src/components/preset-book-menu/index.js +152 -0
- package/dist/src/components/preset-book-menu/index.js.map +1 -0
- package/dist/src/components/preset-book-menu/layout.d.ts +25 -0
- package/dist/src/components/preset-book-menu/layout.d.ts.map +1 -0
- package/dist/src/components/preset-book-menu/layout.js +19 -0
- package/dist/src/components/preset-book-menu/layout.js.map +1 -0
- package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts +88 -0
- package/dist/src/components/preset-book-menu/preset-book-menu.types.d.ts.map +1 -0
- package/dist/src/components/preset-book-menu/preset-book-menu.types.js +14 -0
- package/dist/src/components/preset-book-menu/preset-book-menu.types.js.map +1 -0
- package/dist/src/components/preset-book-menu/preset-grid.d.ts +16 -0
- package/dist/src/components/preset-book-menu/preset-grid.d.ts.map +1 -0
- package/dist/src/components/preset-book-menu/preset-grid.js +49 -0
- package/dist/src/components/preset-book-menu/preset-grid.js.map +1 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts +3 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.d.ts.map +1 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.js +28 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.js.map +1 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts +13 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.types.d.ts.map +1 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.types.js +5 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.types.js.map +1 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts +3 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.web.d.ts.map +1 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.web.js +17 -0
- package/dist/src/components/preset-book-menu/resolve-image-uri.web.js.map +1 -0
- package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts +14 -0
- package/dist/src/components/preset-control-panel/composite-layer-control-panel.d.ts.map +1 -0
- package/dist/src/components/preset-control-panel/composite-layer-control-panel.js +36 -0
- package/dist/src/components/preset-control-panel/composite-layer-control-panel.js.map +1 -0
- package/dist/src/components/preset-control-panel/control-section.d.ts +9 -0
- package/dist/src/components/preset-control-panel/control-section.d.ts.map +1 -0
- package/dist/src/components/preset-control-panel/control-section.js +47 -0
- package/dist/src/components/preset-control-panel/control-section.js.map +1 -0
- package/dist/src/components/preset-control-panel/control.d.ts +10 -0
- package/dist/src/components/preset-control-panel/control.d.ts.map +1 -0
- package/dist/src/components/preset-control-panel/control.js +35 -0
- package/dist/src/components/preset-control-panel/control.js.map +1 -0
- package/dist/src/components/preset-control-panel/index.d.ts +14 -0
- package/dist/src/components/preset-control-panel/index.d.ts.map +1 -0
- package/dist/src/components/preset-control-panel/index.js +49 -0
- package/dist/src/components/preset-control-panel/index.js.map +1 -0
- package/dist/src/components/preset-control-panel/mask-control-panel.d.ts +11 -0
- package/dist/src/components/preset-control-panel/mask-control-panel.d.ts.map +1 -0
- package/dist/src/components/preset-control-panel/mask-control-panel.js +34 -0
- package/dist/src/components/preset-control-panel/mask-control-panel.js.map +1 -0
- package/dist/src/components/preset-control-panel/preset-control-panel.d.ts +12 -0
- package/dist/src/components/preset-control-panel/preset-control-panel.d.ts.map +1 -0
- package/dist/src/components/preset-control-panel/preset-control-panel.js +23 -0
- package/dist/src/components/preset-control-panel/preset-control-panel.js.map +1 -0
- package/dist/src/components/preset-control-panel/transform-control-panel.d.ts +14 -0
- package/dist/src/components/preset-control-panel/transform-control-panel.d.ts.map +1 -0
- package/dist/src/components/preset-control-panel/transform-control-panel.js +58 -0
- package/dist/src/components/preset-control-panel/transform-control-panel.js.map +1 -0
- package/dist/src/components/preset-tile/index.d.ts +24 -0
- package/dist/src/components/preset-tile/index.d.ts.map +1 -0
- package/dist/src/components/preset-tile/index.js +98 -0
- package/dist/src/components/preset-tile/index.js.map +1 -0
- package/dist/src/components/theme/provider.d.ts +18 -0
- package/dist/src/components/theme/provider.d.ts.map +1 -0
- package/dist/src/components/theme/provider.js +29 -0
- package/dist/src/components/theme/provider.js.map +1 -0
- package/dist/src/components/theme/slots.d.ts +17 -0
- package/dist/src/components/theme/slots.d.ts.map +1 -0
- package/dist/src/components/theme/slots.js +9 -0
- package/dist/src/components/theme/slots.js.map +1 -0
- package/dist/src/components/ui/button.d.ts +14 -0
- package/dist/src/components/ui/button.d.ts.map +1 -0
- package/dist/src/components/ui/button.js +29 -0
- package/dist/src/components/ui/button.js.map +1 -0
- package/dist/src/components/ui/color-picker.d.ts +12 -0
- package/dist/src/components/ui/color-picker.d.ts.map +1 -0
- package/dist/src/components/ui/color-picker.js +43 -0
- package/dist/src/components/ui/color-picker.js.map +1 -0
- package/dist/src/components/ui/index.d.ts +6 -0
- package/dist/src/components/ui/index.d.ts.map +1 -0
- package/dist/src/components/ui/index.js +18 -0
- package/dist/src/components/ui/index.js.map +1 -0
- package/dist/src/components/ui/label.d.ts +10 -0
- package/dist/src/components/ui/label.d.ts.map +1 -0
- package/dist/src/components/ui/label.js +14 -0
- package/dist/src/components/ui/label.js.map +1 -0
- package/dist/src/components/ui/point.d.ts +19 -0
- package/dist/src/components/ui/point.d.ts.map +1 -0
- package/dist/src/components/ui/point.js +52 -0
- package/dist/src/components/ui/point.js.map +1 -0
- package/dist/src/components/ui/polygon-field.d.ts +10 -0
- package/dist/src/components/ui/polygon-field.d.ts.map +1 -0
- package/dist/src/components/ui/polygon-field.js +50 -0
- package/dist/src/components/ui/polygon-field.js.map +1 -0
- package/dist/src/components/ui/readout.d.ts +10 -0
- package/dist/src/components/ui/readout.d.ts.map +1 -0
- package/dist/src/components/ui/readout.js +14 -0
- package/dist/src/components/ui/readout.js.map +1 -0
- package/dist/src/components/ui/slider-value.d.ts +8 -0
- package/dist/src/components/ui/slider-value.d.ts.map +1 -0
- package/dist/src/components/ui/slider-value.js +17 -0
- package/dist/src/components/ui/slider-value.js.map +1 -0
- package/dist/src/components/ui/slider.d.ts +15 -0
- package/dist/src/components/ui/slider.d.ts.map +1 -0
- package/dist/src/components/ui/slider.js +58 -0
- package/dist/src/components/ui/slider.js.map +1 -0
- package/dist/src/components/ui/switch.d.ts +8 -0
- package/dist/src/components/ui/switch.d.ts.map +1 -0
- package/dist/src/components/ui/switch.js +24 -0
- package/dist/src/components/ui/switch.js.map +1 -0
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +187 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.web.d.ts +32 -0
- package/dist/src/index.web.d.ts.map +1 -0
- package/dist/src/index.web.js +119 -0
- package/dist/src/index.web.js.map +1 -0
- package/dist/src/kaleidoscope/controls.d.ts +24 -0
- package/dist/src/kaleidoscope/controls.d.ts.map +1 -0
- package/dist/src/kaleidoscope/controls.js +92 -0
- package/dist/src/kaleidoscope/controls.js.map +1 -0
- package/dist/src/kaleidoscope/effect.d.ts +4 -0
- package/dist/src/kaleidoscope/effect.d.ts.map +1 -0
- package/dist/src/kaleidoscope/effect.js +7 -0
- package/dist/src/kaleidoscope/effect.js.map +1 -0
- package/dist/src/kaleidoscope/effect.types.d.ts +47 -0
- package/dist/src/kaleidoscope/effect.types.d.ts.map +1 -0
- package/dist/src/kaleidoscope/effect.types.js +9 -0
- package/dist/src/kaleidoscope/effect.types.js.map +1 -0
- package/dist/src/kaleidoscope/shader-to-spec.d.ts +4 -0
- package/dist/src/kaleidoscope/shader-to-spec.d.ts.map +1 -0
- package/dist/src/kaleidoscope/shader-to-spec.js +17 -0
- package/dist/src/kaleidoscope/shader-to-spec.js.map +1 -0
- package/dist/src/kaleidoscope/types.d.ts +79 -0
- package/dist/src/kaleidoscope/types.d.ts.map +1 -0
- package/dist/src/kaleidoscope/types.js +18 -0
- package/dist/src/kaleidoscope/types.js.map +1 -0
- package/dist/src/kaleidoscope.preset-book.types.d.ts +86 -0
- package/dist/src/kaleidoscope.preset-book.types.d.ts.map +1 -0
- package/dist/src/kaleidoscope.preset-book.types.js +16 -0
- package/dist/src/kaleidoscope.preset-book.types.js.map +1 -0
- package/dist/src/lib/primitives.types.d.ts +3 -0
- package/dist/src/lib/primitives.types.d.ts.map +1 -0
- package/dist/src/lib/primitives.types.js +5 -0
- package/dist/src/lib/primitives.types.js.map +1 -0
- package/dist/src/lib/test-id.d.ts +30 -0
- package/dist/src/lib/test-id.d.ts.map +1 -0
- package/dist/src/lib/test-id.js +81 -0
- package/dist/src/lib/test-id.js.map +1 -0
- package/dist/src/livekit.d.ts +24 -0
- package/dist/src/livekit.d.ts.map +1 -0
- package/dist/src/livekit.js +63 -0
- package/dist/src/livekit.js.map +1 -0
- package/dist/src/nativewind.d.ts +7 -0
- package/dist/src/nativewind.d.ts.map +1 -0
- package/dist/src/nativewind.js +43 -0
- package/dist/src/nativewind.js.map +1 -0
- package/dist/web-driver/effects/composite.d.ts +14 -0
- package/dist/web-driver/effects/composite.d.ts.map +1 -0
- package/dist/web-driver/effects/composite.js +576 -0
- package/dist/web-driver/effects/composite.js.map +1 -0
- package/dist/web-driver/effects/layer-shaders.d.ts +2 -0
- package/dist/web-driver/effects/layer-shaders.d.ts.map +1 -0
- package/dist/web-driver/effects/layer-shaders.js +11 -0
- package/dist/web-driver/effects/layer-shaders.js.map +1 -0
- package/dist/web-driver/effects/transform.d.ts +4 -0
- package/dist/web-driver/effects/transform.d.ts.map +1 -0
- package/dist/web-driver/effects/transform.js +66 -0
- package/dist/web-driver/effects/transform.js.map +1 -0
- package/dist/web-driver/index.d.ts +6 -0
- package/dist/web-driver/index.d.ts.map +1 -0
- package/dist/web-driver/index.js +21 -0
- package/dist/web-driver/index.js.map +1 -0
- package/dist/web-driver/insertable-streams.d.ts.map +1 -0
- package/dist/web-driver/insertable-streams.js +68 -0
- package/dist/web-driver/insertable-streams.js.map +1 -0
- package/dist/web-driver/segmenter.d.ts.map +1 -0
- package/dist/web-driver/segmenter.js +89 -0
- package/dist/web-driver/segmenter.js.map +1 -0
- package/dist/web-driver/shaders.d.ts +2 -0
- package/dist/web-driver/shaders.d.ts.map +1 -0
- package/dist/web-driver/shaders.generated.d.ts +17 -0
- package/dist/web-driver/shaders.generated.d.ts.map +1 -0
- package/dist/web-driver/shaders.generated.js +1180 -0
- package/dist/web-driver/shaders.generated.js.map +1 -0
- package/dist/web-driver/shaders.js +28 -0
- package/dist/web-driver/shaders.js.map +1 -0
- package/dist/web-driver/tuning.d.ts.map +1 -0
- package/dist/web-driver/tuning.js +61 -0
- package/dist/web-driver/tuning.js.map +1 -0
- package/ios/Kaleidoscope.podspec +22 -15
- package/ios/KaleidoscopeModule/BundledImage.swift +39 -0
- package/ios/KaleidoscopeModule/CompositeLayers.swift +142 -0
- package/ios/KaleidoscopeModule/EffectTuning.swift +86 -86
- package/ios/KaleidoscopeModule/KaleidoscopeModule.swift +55 -27
- package/ios/KaleidoscopeModule/Registration.swift +36 -57
- package/ios/KaleidoscopeModule/effects/CompositeProcessor.swift +906 -0
- package/ios/KaleidoscopeModule/effects/FrameBridge.swift +25 -25
- package/ios/KaleidoscopeModule/effects/TransformProcessor.swift +127 -126
- package/ios/KaleidoscopeModule/gpu/CompositeRendering.swift +352 -0
- package/ios/KaleidoscopeModule/gpu/Ingest.swift +104 -102
- package/ios/KaleidoscopeModule/gpu/MetalRenderer.swift +473 -544
- package/ios/KaleidoscopeModule/gpu/Orientation.swift +41 -41
- package/ios/KaleidoscopeModule/gpu/ShaderLibrary.swift +100 -54
- package/ios/KaleidoscopeModule/gpu/TextureBridge.swift +245 -244
- package/ios/KaleidoscopeModule/segmentation/MaskTuning.swift +11 -11
- package/ios/KaleidoscopeModule/segmentation/Segmenter.swift +360 -359
- package/ios/KaleidoscopeModule/shaders/GENERATIVE.txt +9 -0
- package/ios/KaleidoscopeModule/shaders/SHADERS.txt +13 -2
- package/ios/KaleidoscopeModule/shaders/anamorphic-lensflare.metalsrc +47 -0
- package/ios/KaleidoscopeModule/shaders/clouds.metalsrc +185 -0
- package/ios/KaleidoscopeModule/shaders/composite-blit.metalsrc +22 -0
- package/ios/KaleidoscopeModule/shaders/composite-blur.metalsrc +93 -0
- package/ios/KaleidoscopeModule/shaders/composite-camera.metalsrc +22 -0
- package/ios/KaleidoscopeModule/shaders/composite-image.metalsrc +24 -0
- package/ios/KaleidoscopeModule/shaders/composite-masked.metalsrc +22 -0
- package/ios/KaleidoscopeModule/shaders/composite-subject.metalsrc +23 -0
- package/ios/KaleidoscopeModule/shaders/corporate-blobs.metalsrc +221 -0
- package/ios/KaleidoscopeModule/shaders/fireflies.metalsrc +44 -0
- package/ios/KaleidoscopeModule/shaders/godrays.metalsrc +46 -0
- package/ios/KaleidoscopeModule/shaders/light-beams-and-motes.metalsrc +316 -0
- package/ios/KaleidoscopeModule/shaders/nebula.metalsrc +45 -45
- package/ios/KaleidoscopeModule/shaders/plasma.metalsrc +26 -0
- package/ios/KaleidoscopeModule/shaders/simianlights.metalsrc +45 -45
- package/package.json +485 -115
- package/plugin/build/android/assets.js +45 -0
- package/plugin/build/android/index.js +34 -0
- package/plugin/build/index.js +39 -0
- package/plugin/build/ios/assets.js +110 -0
- package/plugin/build/ios/deployment-target.js +105 -0
- package/plugin/build/ios/index.js +63 -0
- package/plugin/build/ios/pods.js +73 -0
- package/plugin/build/lib/constants.js +15 -0
- package/plugin/build/lib/file-manipulation.js +57 -0
- package/plugin/build/lib/mods.js +36 -0
- package/plugin/build/lib/preset-book.js +215 -0
- package/plugin/build/lib/types.js +16 -0
- package/src/components/form/control-form.tsx +112 -0
- package/src/components/form/make-controls.ts +33 -0
- package/src/components/form/scope.ts +9 -0
- package/src/components/form/use-field.ts +35 -0
- package/src/components/preset-book-menu/index.tsx +286 -0
- package/src/components/preset-book-menu/layout.tsx +63 -0
- package/src/components/preset-book-menu/preset-book-menu.types.ts +112 -0
- package/src/components/preset-book-menu/preset-grid.tsx +80 -0
- package/src/components/preset-book-menu/resolve-image-uri.ts +31 -0
- package/src/components/preset-book-menu/resolve-image-uri.types.ts +18 -0
- package/src/components/preset-book-menu/resolve-image-uri.web.ts +15 -0
- package/src/components/preset-control-panel/composite-layer-control-panel.tsx +56 -0
- package/src/components/preset-control-panel/control-section.tsx +84 -0
- package/src/components/preset-control-panel/control.tsx +50 -0
- package/src/components/preset-control-panel/index.ts +31 -0
- package/src/components/preset-control-panel/mask-control-panel.tsx +93 -0
- package/src/components/preset-control-panel/preset-control-panel.tsx +48 -0
- package/src/components/preset-control-panel/transform-control-panel.tsx +146 -0
- package/src/components/preset-tile/index.tsx +160 -0
- package/src/components/theme/provider.tsx +50 -0
- package/src/components/theme/slots.ts +37 -0
- package/src/components/ui/button.tsx +54 -0
- package/src/components/ui/color-picker.tsx +74 -0
- package/src/components/ui/index.ts +10 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/point.tsx +116 -0
- package/src/components/ui/polygon-field.tsx +84 -0
- package/src/components/ui/readout.tsx +25 -0
- package/src/components/ui/slider-value.ts +15 -0
- package/src/components/ui/slider.tsx +98 -0
- package/src/components/ui/switch.tsx +40 -0
- package/src/index.ts +176 -95
- package/src/index.web.ts +126 -74
- package/src/kaleidoscope/controls.ts +127 -0
- package/src/kaleidoscope/effect.ts +5 -0
- package/src/kaleidoscope/effect.types.ts +63 -0
- package/src/kaleidoscope/shader-to-spec.ts +16 -0
- package/src/kaleidoscope/types.ts +101 -0
- package/src/kaleidoscope.preset-book.types.ts +105 -0
- package/src/lib/primitives.types.ts +5 -0
- package/src/lib/test-id.ts +81 -0
- package/src/livekit.ts +6 -4
- package/src/nativewind.ts +41 -0
- package/android/src/main/assets/backgrounds/stylized-dark.webp +0 -0
- package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BackgroundImageFactory.kt +0 -365
- package/android/src/main/java/com/simiancraft/kaleidoscope/effects/BlurFactory.kt +0 -400
- package/dist/backgrounds/dark-office.d.ts +0 -3
- package/dist/backgrounds/dark-office.d.ts.map +0 -1
- package/dist/backgrounds/dark-office.js +0 -5
- package/dist/backgrounds/dark-office.js.map +0 -1
- package/dist/backgrounds/dark-office.web.d.ts +0 -3
- package/dist/backgrounds/dark-office.web.d.ts.map +0 -1
- package/dist/backgrounds/dark-office.web.js +0 -8
- package/dist/backgrounds/dark-office.web.js.map +0 -1
- package/dist/backgrounds/debug-resolutions.d.ts +0 -3
- package/dist/backgrounds/debug-resolutions.d.ts.map +0 -1
- package/dist/backgrounds/debug-resolutions.js +0 -6
- package/dist/backgrounds/debug-resolutions.js.map +0 -1
- package/dist/backgrounds/debug-resolutions.web.d.ts +0 -3
- package/dist/backgrounds/debug-resolutions.web.d.ts.map +0 -1
- package/dist/backgrounds/debug-resolutions.web.js +0 -8
- package/dist/backgrounds/debug-resolutions.web.js.map +0 -1
- package/dist/backgrounds/home-dark.d.ts +0 -3
- package/dist/backgrounds/home-dark.d.ts.map +0 -1
- package/dist/backgrounds/home-dark.js +0 -5
- package/dist/backgrounds/home-dark.js.map +0 -1
- package/dist/backgrounds/home-dark.web.d.ts +0 -3
- package/dist/backgrounds/home-dark.web.d.ts.map +0 -1
- package/dist/backgrounds/home-dark.web.js +0 -6
- package/dist/backgrounds/home-dark.web.js.map +0 -1
- package/dist/backgrounds/home-light.d.ts +0 -3
- package/dist/backgrounds/home-light.d.ts.map +0 -1
- package/dist/backgrounds/home-light.js +0 -5
- package/dist/backgrounds/home-light.js.map +0 -1
- package/dist/backgrounds/home-light.web.d.ts +0 -3
- package/dist/backgrounds/home-light.web.d.ts.map +0 -1
- package/dist/backgrounds/home-light.web.js +0 -6
- package/dist/backgrounds/home-light.web.js.map +0 -1
- package/dist/backgrounds/index.d.ts +0 -3
- package/dist/backgrounds/index.d.ts.map +0 -1
- package/dist/backgrounds/index.js +0 -6
- package/dist/backgrounds/index.js.map +0 -1
- package/dist/backgrounds/light-office.d.ts +0 -3
- package/dist/backgrounds/light-office.d.ts.map +0 -1
- package/dist/backgrounds/light-office.js +0 -5
- package/dist/backgrounds/light-office.js.map +0 -1
- package/dist/backgrounds/light-office.web.d.ts +0 -3
- package/dist/backgrounds/light-office.web.d.ts.map +0 -1
- package/dist/backgrounds/light-office.web.js +0 -8
- package/dist/backgrounds/light-office.web.js.map +0 -1
- package/dist/backgrounds/nature-dark.d.ts +0 -3
- package/dist/backgrounds/nature-dark.d.ts.map +0 -1
- package/dist/backgrounds/nature-dark.js +0 -5
- package/dist/backgrounds/nature-dark.js.map +0 -1
- package/dist/backgrounds/nature-dark.web.d.ts +0 -3
- package/dist/backgrounds/nature-dark.web.d.ts.map +0 -1
- package/dist/backgrounds/nature-dark.web.js +0 -6
- package/dist/backgrounds/nature-dark.web.js.map +0 -1
- package/dist/backgrounds/nature-light.d.ts +0 -3
- package/dist/backgrounds/nature-light.d.ts.map +0 -1
- package/dist/backgrounds/nature-light.js +0 -5
- package/dist/backgrounds/nature-light.js.map +0 -1
- package/dist/backgrounds/nature-light.web.d.ts +0 -3
- package/dist/backgrounds/nature-light.web.d.ts.map +0 -1
- package/dist/backgrounds/nature-light.web.js +0 -6
- package/dist/backgrounds/nature-light.web.js.map +0 -1
- package/dist/backgrounds/preset-source.types.d.ts +0 -2
- package/dist/backgrounds/preset-source.types.d.ts.map +0 -1
- package/dist/backgrounds/preset-source.types.js +0 -2
- package/dist/backgrounds/preset-source.types.js.map +0 -1
- package/dist/backgrounds/presets.d.ts +0 -3
- package/dist/backgrounds/presets.d.ts.map +0 -1
- package/dist/backgrounds/presets.js +0 -34
- package/dist/backgrounds/presets.js.map +0 -1
- package/dist/backgrounds/simiancraft-dark.d.ts +0 -3
- package/dist/backgrounds/simiancraft-dark.d.ts.map +0 -1
- package/dist/backgrounds/simiancraft-dark.js +0 -5
- package/dist/backgrounds/simiancraft-dark.js.map +0 -1
- package/dist/backgrounds/simiancraft-dark.web.d.ts +0 -3
- package/dist/backgrounds/simiancraft-dark.web.d.ts.map +0 -1
- package/dist/backgrounds/simiancraft-dark.web.js +0 -6
- package/dist/backgrounds/simiancraft-dark.web.js.map +0 -1
- package/dist/backgrounds/simiancraft-light.d.ts +0 -3
- package/dist/backgrounds/simiancraft-light.d.ts.map +0 -1
- package/dist/backgrounds/simiancraft-light.js +0 -5
- package/dist/backgrounds/simiancraft-light.js.map +0 -1
- package/dist/backgrounds/simiancraft-light.web.d.ts +0 -3
- package/dist/backgrounds/simiancraft-light.web.d.ts.map +0 -1
- package/dist/backgrounds/simiancraft-light.web.js +0 -6
- package/dist/backgrounds/simiancraft-light.web.js.map +0 -1
- package/dist/backgrounds/stylized-dark.d.ts +0 -3
- package/dist/backgrounds/stylized-dark.d.ts.map +0 -1
- package/dist/backgrounds/stylized-dark.js +0 -5
- package/dist/backgrounds/stylized-dark.js.map +0 -1
- package/dist/backgrounds/stylized-dark.web.d.ts +0 -3
- package/dist/backgrounds/stylized-dark.web.d.ts.map +0 -1
- package/dist/backgrounds/stylized-dark.web.js +0 -6
- package/dist/backgrounds/stylized-dark.web.js.map +0 -1
- package/dist/backgrounds/stylized-dark.webp +0 -0
- package/dist/backgrounds/stylized-light.d.ts +0 -3
- package/dist/backgrounds/stylized-light.d.ts.map +0 -1
- package/dist/backgrounds/stylized-light.js +0 -5
- package/dist/backgrounds/stylized-light.js.map +0 -1
- package/dist/backgrounds/stylized-light.web.d.ts +0 -3
- package/dist/backgrounds/stylized-light.web.d.ts.map +0 -1
- package/dist/backgrounds/stylized-light.web.js +0 -6
- package/dist/backgrounds/stylized-light.web.js.map +0 -1
- package/dist/index.d.ts +0 -42
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -155
- package/dist/index.js.map +0 -1
- package/dist/index.web.d.ts +0 -49
- package/dist/index.web.d.ts.map +0 -1
- package/dist/index.web.js +0 -113
- package/dist/index.web.js.map +0 -1
- package/dist/livekit.d.ts +0 -24
- package/dist/livekit.d.ts.map +0 -1
- package/dist/livekit.js +0 -57
- package/dist/livekit.js.map +0 -1
- package/dist/types.d.ts +0 -74
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -10
- package/dist/types.js.map +0 -1
- package/dist/web/blur-kernel.d.ts +0 -6
- package/dist/web/blur-kernel.d.ts.map +0 -1
- package/dist/web/blur-kernel.js +0 -41
- package/dist/web/blur-kernel.js.map +0 -1
- package/dist/web/effects/background-image.d.ts +0 -3
- package/dist/web/effects/background-image.d.ts.map +0 -1
- package/dist/web/effects/background-image.js +0 -284
- package/dist/web/effects/background-image.js.map +0 -1
- package/dist/web/effects/blur.d.ts +0 -3
- package/dist/web/effects/blur.d.ts.map +0 -1
- package/dist/web/effects/blur.js +0 -339
- package/dist/web/effects/blur.js.map +0 -1
- package/dist/web/effects/transform.d.ts +0 -4
- package/dist/web/effects/transform.d.ts.map +0 -1
- package/dist/web/effects/transform.js +0 -62
- package/dist/web/effects/transform.js.map +0 -1
- package/dist/web/insertable-streams.d.ts.map +0 -1
- package/dist/web/insertable-streams.js +0 -64
- package/dist/web/insertable-streams.js.map +0 -1
- package/dist/web/segmenter.d.ts.map +0 -1
- package/dist/web/segmenter.js +0 -83
- package/dist/web/segmenter.js.map +0 -1
- package/dist/web/shaders.d.ts +0 -2
- package/dist/web/shaders.d.ts.map +0 -1
- package/dist/web/shaders.generated.d.ts +0 -4
- package/dist/web/shaders.generated.d.ts.map +0 -1
- package/dist/web/shaders.generated.js +0 -54
- package/dist/web/shaders.generated.js.map +0 -1
- package/dist/web/shaders.js +0 -32
- package/dist/web/shaders.js.map +0 -1
- package/dist/web/tuning.d.ts.map +0 -1
- package/dist/web/tuning.js +0 -55
- package/dist/web/tuning.js.map +0 -1
- package/ios/KaleidoscopeModule/effects/BackgroundImageProcessor.swift +0 -293
- package/ios/KaleidoscopeModule/effects/BlurProcessor.swift +0 -238
- package/ios/KaleidoscopeModule/resources/backgrounds/dark-office.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/debug-resolutions.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/home-dark.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/home-light.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/light-office.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/nature-dark.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/nature-light.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/simiancraft-dark.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/simiancraft-light.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/stylized-dark.webp +0 -0
- package/ios/KaleidoscopeModule/resources/backgrounds/stylized-light.webp +0 -0
- package/ios/KaleidoscopeModule/shaders/blur.metalsrc +0 -72
- package/ios/KaleidoscopeModule/shaders/composite.metalsrc +0 -22
- package/src/backgrounds/README.md +0 -83
- package/src/backgrounds/dark-office.ts +0 -6
- package/src/backgrounds/dark-office.web.ts +0 -9
- package/src/backgrounds/dark-office.webp +0 -0
- package/src/backgrounds/debug-resolutions.ts +0 -7
- package/src/backgrounds/debug-resolutions.web.ts +0 -9
- package/src/backgrounds/debug-resolutions.webp +0 -0
- package/src/backgrounds/home-dark.ts +0 -6
- package/src/backgrounds/home-dark.web.ts +0 -7
- package/src/backgrounds/home-dark.webp +0 -0
- package/src/backgrounds/home-light.ts +0 -6
- package/src/backgrounds/home-light.web.ts +0 -7
- package/src/backgrounds/home-light.webp +0 -0
- package/src/backgrounds/index.ts +0 -7
- package/src/backgrounds/light-office.ts +0 -6
- package/src/backgrounds/light-office.web.ts +0 -9
- package/src/backgrounds/light-office.webp +0 -0
- package/src/backgrounds/nature-dark.ts +0 -6
- package/src/backgrounds/nature-dark.web.ts +0 -7
- package/src/backgrounds/nature-dark.webp +0 -0
- package/src/backgrounds/nature-light.ts +0 -6
- package/src/backgrounds/nature-light.web.ts +0 -7
- package/src/backgrounds/nature-light.webp +0 -0
- package/src/backgrounds/preset-source.types.ts +0 -5
- package/src/backgrounds/presets.ts +0 -36
- package/src/backgrounds/simiancraft-dark.ts +0 -6
- package/src/backgrounds/simiancraft-dark.web.ts +0 -7
- package/src/backgrounds/simiancraft-dark.webp +0 -0
- package/src/backgrounds/simiancraft-light.ts +0 -6
- package/src/backgrounds/simiancraft-light.web.ts +0 -7
- package/src/backgrounds/simiancraft-light.webp +0 -0
- package/src/backgrounds/stylized-dark.ts +0 -6
- package/src/backgrounds/stylized-dark.web.ts +0 -7
- package/src/backgrounds/stylized-dark.webp +0 -0
- package/src/backgrounds/stylized-light.ts +0 -6
- package/src/backgrounds/stylized-light.web.ts +0 -7
- package/src/backgrounds/stylized-light.webp +0 -0
- package/src/types.ts +0 -89
- package/src/web/blur-kernel.ts +0 -44
- package/src/web/effects/background-image.ts +0 -364
- package/src/web/effects/blur.ts +0 -430
- package/src/web/effects/transform.ts +0 -69
- package/src/web/insertable-streams.ts +0 -112
- package/src/web/segmenter.ts +0 -107
- package/src/web/shaders.generated.ts +0 -56
- package/src/web/shaders.ts +0 -31
- package/src/web/tuning.ts +0 -67
- /package/{src/backgrounds → catalog/images}/assets.d.ts +0 -0
- /package/{android/src/main/assets/backgrounds → catalog/images/debug}/debug-resolutions.webp +0 -0
- /package/{android/src/main/assets/backgrounds → catalog/images/home}/home-dark.webp +0 -0
- /package/{android/src/main/assets/backgrounds → catalog/images/home}/home-light.webp +0 -0
- /package/{android/src/main/assets/backgrounds/nature-dark.webp → catalog/images/nature/landscape-dark.webp} +0 -0
- /package/{android/src/main/assets/backgrounds/nature-light.webp → catalog/images/nature/landscape-light.webp} +0 -0
- /package/{android/src/main/assets/backgrounds/dark-office.webp → catalog/images/office/office-dark.webp} +0 -0
- /package/{android/src/main/assets/backgrounds/light-office.webp → catalog/images/office/office-light.webp} +0 -0
- /package/{android/src/main/assets/backgrounds/stylized-light.webp → catalog/images/sci-fi/sci-fi-light.webp} +0 -0
- /package/{android/src/main/assets/backgrounds → catalog/images/simiancraft}/simiancraft-dark.webp +0 -0
- /package/{android/src/main/assets/backgrounds → catalog/images/simiancraft}/simiancraft-light.webp +0 -0
- /package/dist/{backgrounds → catalog/images/debug}/debug-resolutions.webp +0 -0
- /package/dist/{backgrounds → catalog/images/home}/home-dark.webp +0 -0
- /package/dist/{backgrounds → catalog/images/home}/home-light.webp +0 -0
- /package/dist/{backgrounds/nature-dark.webp → catalog/images/nature/landscape-dark.webp} +0 -0
- /package/dist/{backgrounds/nature-light.webp → catalog/images/nature/landscape-light.webp} +0 -0
- /package/dist/{backgrounds/dark-office.webp → catalog/images/office/office-dark.webp} +0 -0
- /package/dist/{backgrounds/light-office.webp → catalog/images/office/office-light.webp} +0 -0
- /package/dist/{backgrounds/stylized-light.webp → catalog/images/sci-fi/sci-fi-light.webp} +0 -0
- /package/dist/{backgrounds → catalog/images/simiancraft}/simiancraft-dark.webp +0 -0
- /package/dist/{backgrounds → catalog/images/simiancraft}/simiancraft-light.webp +0 -0
- /package/dist/{web → web-driver}/insertable-streams.d.ts +0 -0
- /package/dist/{web → web-driver}/segmenter.d.ts +0 -0
- /package/dist/{web → web-driver}/tuning.d.ts +0 -0
package/dist/web/effects/blur.js
DELETED
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
// Web blur effect, WebGL2 pipeline.
|
|
2
|
-
//
|
|
3
|
-
// Same shape as the Android GLES 3.0 path: separable Gaussian blur into a
|
|
4
|
-
// ping-pong FBO, then a composite pass that mixes blurred and original via
|
|
5
|
-
// a segmentation mask. The mask still comes from MediaPipe Selfie
|
|
6
|
-
// Segmentation loaded from CDN; there is no GPU-resident segmenter for
|
|
7
|
-
// the web yet.
|
|
8
|
-
//
|
|
9
|
-
// Shader source lives in src/web/shaders.ts; MediaPipe loader in
|
|
10
|
-
// src/web/segmenter.ts. This file owns only the per-effect GL state and
|
|
11
|
-
// the per-frame transform.
|
|
12
|
-
import { computeBlurKernel } from '../blur-kernel';
|
|
13
|
-
import { getLatestMask, loadSegmenter, requestMaskIfIdle } from '../segmenter';
|
|
14
|
-
import { BLUR_FRAG_SRC, COMPOSITE_FRAG_SRC, PASSTHROUGH_VERT_SRC } from '../shaders';
|
|
15
|
-
import { maskSmoothstepRange, tuning } from '../tuning';
|
|
16
|
-
// Cache the kernel by sigma; the pure math lives in ../blur-kernel. Recomputed
|
|
17
|
-
// only when the blur slider (setBlurSigma) moves, not per frame.
|
|
18
|
-
let cachedKernelSigma = Number.NaN;
|
|
19
|
-
let cachedKernel = null;
|
|
20
|
-
const blurKernel = (sigma) => {
|
|
21
|
-
if (sigma !== cachedKernelSigma || cachedKernel === null) {
|
|
22
|
-
cachedKernel = computeBlurKernel(sigma);
|
|
23
|
-
cachedKernelSigma = sigma;
|
|
24
|
-
}
|
|
25
|
-
return cachedKernel;
|
|
26
|
-
};
|
|
27
|
-
let state = null;
|
|
28
|
-
// MediaPipe needs a 2D canvas as input; we stage the VideoFrame there each
|
|
29
|
-
// frame, then point both MediaPipe and the GL upload at it.
|
|
30
|
-
let inputCanvas2D = null;
|
|
31
|
-
let inputCtx2D = null;
|
|
32
|
-
const compileShader = (gl, type, source) => {
|
|
33
|
-
const shader = gl.createShader(type);
|
|
34
|
-
if (!shader)
|
|
35
|
-
throw new Error('kaleidoscope: gl.createShader returned null');
|
|
36
|
-
gl.shaderSource(shader, source);
|
|
37
|
-
gl.compileShader(shader);
|
|
38
|
-
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
39
|
-
const log = gl.getShaderInfoLog(shader) ?? '(no info log)';
|
|
40
|
-
gl.deleteShader(shader);
|
|
41
|
-
throw new Error(`kaleidoscope: shader compile failed: ${log}\n---\n${source}`);
|
|
42
|
-
}
|
|
43
|
-
return shader;
|
|
44
|
-
};
|
|
45
|
-
const linkProgram = (gl, vertSrc, fragSrc) => {
|
|
46
|
-
const vs = compileShader(gl, gl.VERTEX_SHADER, vertSrc);
|
|
47
|
-
const fs = compileShader(gl, gl.FRAGMENT_SHADER, fragSrc);
|
|
48
|
-
const prog = gl.createProgram();
|
|
49
|
-
if (!prog)
|
|
50
|
-
throw new Error('kaleidoscope: gl.createProgram returned null');
|
|
51
|
-
gl.attachShader(prog, vs);
|
|
52
|
-
gl.attachShader(prog, fs);
|
|
53
|
-
gl.linkProgram(prog);
|
|
54
|
-
gl.detachShader(prog, vs);
|
|
55
|
-
gl.detachShader(prog, fs);
|
|
56
|
-
gl.deleteShader(vs);
|
|
57
|
-
gl.deleteShader(fs);
|
|
58
|
-
if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {
|
|
59
|
-
const log = gl.getProgramInfoLog(prog) ?? '(no info log)';
|
|
60
|
-
gl.deleteProgram(prog);
|
|
61
|
-
throw new Error(`kaleidoscope: program link failed: ${log}`);
|
|
62
|
-
}
|
|
63
|
-
return prog;
|
|
64
|
-
};
|
|
65
|
-
const linkBlurProgram = (gl) => {
|
|
66
|
-
const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, BLUR_FRAG_SRC);
|
|
67
|
-
return {
|
|
68
|
-
prog,
|
|
69
|
-
uTex: gl.getUniformLocation(prog, 'uTex'),
|
|
70
|
-
uAxis: gl.getUniformLocation(prog, 'uAxis'),
|
|
71
|
-
uWeights: gl.getUniformLocation(prog, 'uWeights'),
|
|
72
|
-
uOffsets: gl.getUniformLocation(prog, 'uOffsets'),
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
const linkCompositeProgram = (gl) => {
|
|
76
|
-
const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, COMPOSITE_FRAG_SRC);
|
|
77
|
-
return {
|
|
78
|
-
prog,
|
|
79
|
-
uOriginal: gl.getUniformLocation(prog, 'uOriginal'),
|
|
80
|
-
uBackground: gl.getUniformLocation(prog, 'uBackground'),
|
|
81
|
-
uMask: gl.getUniformLocation(prog, 'uMask'),
|
|
82
|
-
uBgUvScale: gl.getUniformLocation(prog, 'uBgUvScale'),
|
|
83
|
-
uBgUvOffset: gl.getUniformLocation(prog, 'uBgUvOffset'),
|
|
84
|
-
uMaskUvScale: gl.getUniformLocation(prog, 'uMaskUvScale'),
|
|
85
|
-
uMaskUvOffset: gl.getUniformLocation(prog, 'uMaskUvOffset'),
|
|
86
|
-
uMaskLo: gl.getUniformLocation(prog, 'uMaskLo'),
|
|
87
|
-
uMaskHi: gl.getUniformLocation(prog, 'uMaskHi'),
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
|
-
// Per-pass GPU timing (dev only). Set
|
|
91
|
-
// `globalThis.__KALEIDOSCOPE_DEBUG_TIMING__ = true` before the first blur frame
|
|
92
|
-
// to log per-pass GPU time via EXT_disjoint_timer_query_webgl2. Results read
|
|
93
|
-
// back one frame late (the query is async); a no-op when the flag/ext is absent.
|
|
94
|
-
const TIMING_ENABLED = globalThis.__KALEIDOSCOPE_DEBUG_TIMING__ ===
|
|
95
|
-
true;
|
|
96
|
-
const makePassTimer = (gl) => ({
|
|
97
|
-
ext: TIMING_ENABLED
|
|
98
|
-
? gl.getExtension('EXT_disjoint_timer_query_webgl2')
|
|
99
|
-
: null,
|
|
100
|
-
pending: new Map(),
|
|
101
|
-
});
|
|
102
|
-
const timePass = (gl, timer, label, draw) => {
|
|
103
|
-
const ext = timer.ext;
|
|
104
|
-
if (!ext) {
|
|
105
|
-
draw();
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
const inFlight = timer.pending.get(label);
|
|
109
|
-
if (inFlight) {
|
|
110
|
-
const available = gl.getQueryParameter(inFlight, gl.QUERY_RESULT_AVAILABLE);
|
|
111
|
-
const disjoint = gl.getParameter(ext.GPU_DISJOINT_EXT);
|
|
112
|
-
if (available && !disjoint) {
|
|
113
|
-
const ns = gl.getQueryParameter(inFlight, gl.QUERY_RESULT);
|
|
114
|
-
console.debug(`[kaleidoscope] blur ${label}: ${(ns / 1e6).toFixed(3)} ms`);
|
|
115
|
-
}
|
|
116
|
-
if (available || disjoint) {
|
|
117
|
-
gl.deleteQuery(inFlight);
|
|
118
|
-
timer.pending.delete(label);
|
|
119
|
-
}
|
|
120
|
-
// A query is still in flight for this label; just draw, don't stack another.
|
|
121
|
-
draw();
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
const query = gl.createQuery();
|
|
125
|
-
if (!query) {
|
|
126
|
-
draw();
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
gl.beginQuery(ext.TIME_ELAPSED_EXT, query);
|
|
130
|
-
draw();
|
|
131
|
-
gl.endQuery(ext.TIME_ELAPSED_EXT);
|
|
132
|
-
timer.pending.set(label, query);
|
|
133
|
-
};
|
|
134
|
-
const createTexture = (gl, width, height) => {
|
|
135
|
-
const tex = gl.createTexture();
|
|
136
|
-
if (!tex)
|
|
137
|
-
throw new Error('kaleidoscope: gl.createTexture returned null');
|
|
138
|
-
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
139
|
-
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
140
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
141
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
142
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
143
|
-
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
144
|
-
return tex;
|
|
145
|
-
};
|
|
146
|
-
const createFbo = (gl, tex) => {
|
|
147
|
-
const fbo = gl.createFramebuffer();
|
|
148
|
-
if (!fbo)
|
|
149
|
-
throw new Error('kaleidoscope: gl.createFramebuffer returned null');
|
|
150
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
|
|
151
|
-
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
|
|
152
|
-
const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
|
|
153
|
-
if (status !== gl.FRAMEBUFFER_COMPLETE) {
|
|
154
|
-
throw new Error(`kaleidoscope: FBO incomplete: 0x${status.toString(16)}`);
|
|
155
|
-
}
|
|
156
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
157
|
-
return fbo;
|
|
158
|
-
};
|
|
159
|
-
// Quarter-area downscale for the blur ping-pong buffers: half each axis, short
|
|
160
|
-
// side floored at 256px so small inputs don't degrade; never upscales. Shared
|
|
161
|
-
// rule with the Android/iOS R1 commits.
|
|
162
|
-
const blurDownscale = (w, h) => {
|
|
163
|
-
const shortTarget = Math.max(256, Math.round(Math.min(w, h) * 0.5));
|
|
164
|
-
const scale = Math.min(1, shortTarget / Math.min(w, h));
|
|
165
|
-
return { downW: Math.max(1, Math.round(w * scale)), downH: Math.max(1, Math.round(h * scale)) };
|
|
166
|
-
};
|
|
167
|
-
const ensureState = (width, height) => {
|
|
168
|
-
if (state && state.width === width && state.height === height)
|
|
169
|
-
return state;
|
|
170
|
-
// Tear down previous state if dimensions changed.
|
|
171
|
-
if (state) {
|
|
172
|
-
const { gl } = state;
|
|
173
|
-
gl.deleteProgram(state.programs.blur.prog);
|
|
174
|
-
gl.deleteProgram(state.programs.composite.prog);
|
|
175
|
-
for (const q of state.timer.pending.values())
|
|
176
|
-
gl.deleteQuery(q);
|
|
177
|
-
gl.deleteTexture(state.textures.original);
|
|
178
|
-
gl.deleteTexture(state.textures.mask);
|
|
179
|
-
gl.deleteTexture(state.textures.blurA);
|
|
180
|
-
gl.deleteTexture(state.textures.blurB);
|
|
181
|
-
gl.deleteFramebuffer(state.fbos.blurA);
|
|
182
|
-
gl.deleteFramebuffer(state.fbos.blurB);
|
|
183
|
-
}
|
|
184
|
-
const canvas = state?.canvas ?? new OffscreenCanvas(width, height);
|
|
185
|
-
canvas.width = width;
|
|
186
|
-
canvas.height = height;
|
|
187
|
-
const gl = canvas.getContext('webgl2');
|
|
188
|
-
if (!gl) {
|
|
189
|
-
throw new Error('kaleidoscope: WebGL2 not available; blur requires a WebGL2-capable browser');
|
|
190
|
-
}
|
|
191
|
-
const programs = {
|
|
192
|
-
blur: linkBlurProgram(gl),
|
|
193
|
-
composite: linkCompositeProgram(gl),
|
|
194
|
-
};
|
|
195
|
-
const { downW, downH } = blurDownscale(width, height);
|
|
196
|
-
const textures = {
|
|
197
|
-
original: createTexture(gl, width, height),
|
|
198
|
-
mask: createTexture(gl, width, height),
|
|
199
|
-
blurA: createTexture(gl, downW, downH),
|
|
200
|
-
blurB: createTexture(gl, downW, downH),
|
|
201
|
-
};
|
|
202
|
-
const fbos = {
|
|
203
|
-
blurA: createFbo(gl, textures.blurA),
|
|
204
|
-
blurB: createFbo(gl, textures.blurB),
|
|
205
|
-
};
|
|
206
|
-
state = {
|
|
207
|
-
gl,
|
|
208
|
-
canvas,
|
|
209
|
-
width,
|
|
210
|
-
height,
|
|
211
|
-
downW,
|
|
212
|
-
downH,
|
|
213
|
-
programs,
|
|
214
|
-
timer: makePassTimer(gl),
|
|
215
|
-
textures,
|
|
216
|
-
fbos,
|
|
217
|
-
};
|
|
218
|
-
return state;
|
|
219
|
-
};
|
|
220
|
-
const ensureInputCanvas = (width, height) => {
|
|
221
|
-
if (!inputCanvas2D || inputCanvas2D.width !== width || inputCanvas2D.height !== height) {
|
|
222
|
-
inputCanvas2D = new OffscreenCanvas(width, height);
|
|
223
|
-
inputCtx2D = inputCanvas2D.getContext('2d');
|
|
224
|
-
if (!inputCtx2D)
|
|
225
|
-
throw new Error('kaleidoscope: OffscreenCanvas 2D context unavailable');
|
|
226
|
-
}
|
|
227
|
-
return inputCtx2D;
|
|
228
|
-
};
|
|
229
|
-
const uploadTexture = (gl, tex, source, flipY) => {
|
|
230
|
-
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
231
|
-
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipY);
|
|
232
|
-
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
233
|
-
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
234
|
-
};
|
|
235
|
-
export const blur = async (frame) => {
|
|
236
|
-
await loadSegmenter(); // ensure the segmenter is loaded; cached after first call.
|
|
237
|
-
const w = frame.displayWidth;
|
|
238
|
-
const h = frame.displayHeight;
|
|
239
|
-
// Stage on a 2D canvas so MediaPipe can ingest it (and so the GL upload below
|
|
240
|
-
// has a flippable source).
|
|
241
|
-
const inputCtx = ensureInputCanvas(w, h);
|
|
242
|
-
inputCtx.drawImage(frame, 0, 0, w, h);
|
|
243
|
-
const inputCanvas = inputCanvas2D;
|
|
244
|
-
// Decoupled segmentation (mirrors native): never block the render on the
|
|
245
|
-
// segmenter. Kick a fresh mask only when idle and draw with the most recent
|
|
246
|
-
// one. drawImage is atomic w.r.t. the event loop, so MediaPipe reading the
|
|
247
|
-
// canvas between tasks sees at most a ~1-frame-newer image — within the
|
|
248
|
-
// staleness the mask already tolerates. Before the first mask lands, forward
|
|
249
|
-
// the original frame (matches native's fall-through).
|
|
250
|
-
requestMaskIfIdle(inputCanvas);
|
|
251
|
-
const results = getLatestMask();
|
|
252
|
-
if (!results) {
|
|
253
|
-
const passthrough = new VideoFrame(inputCanvas2D, {
|
|
254
|
-
timestamp: frame.timestamp,
|
|
255
|
-
...(frame.duration != null ? { duration: frame.duration } : {}),
|
|
256
|
-
});
|
|
257
|
-
frame.close();
|
|
258
|
-
return passthrough;
|
|
259
|
-
}
|
|
260
|
-
// Run the GPU pipeline.
|
|
261
|
-
const s = ensureState(w, h);
|
|
262
|
-
const { gl, canvas, programs, timer, textures, fbos, downW, downH } = s;
|
|
263
|
-
// Upload original with flipY=true (DOM-coord source → GL v=1 = top).
|
|
264
|
-
// Upload mask with flipY=false: UNPACK_FLIP_Y_WEBGL is a no-op on
|
|
265
|
-
// MediaPipe's segmentationMask (also on ImageBitmaps in general), so the
|
|
266
|
-
// mask lands in its natural orientation. The composite shader compensates
|
|
267
|
-
// with the uMaskUvScale=(1,-1) / uMaskUvOffset=(0,1) V-flip uniforms set
|
|
268
|
-
// below; this also avoids the canvas-premultiplied-alpha problem that
|
|
269
|
-
// collapses soft confidence values and makes the mask binary.
|
|
270
|
-
uploadTexture(gl, textures.original, inputCanvas, true);
|
|
271
|
-
uploadTexture(gl, textures.mask, results.segmentationMask, false);
|
|
272
|
-
gl.disable(gl.BLEND);
|
|
273
|
-
gl.disable(gl.DEPTH_TEST);
|
|
274
|
-
// Pass 0: downsample the full-res original into blurA. uAxis=0 collapses the
|
|
275
|
-
// kernel to its center tap (weights sum to 1), so this is a plain bilinear
|
|
276
|
-
// box-average into the downscaled target. Both blur passes must then run IN
|
|
277
|
-
// downscaled space: sampling the full-res original directly with the
|
|
278
|
-
// downscaled-spaced kernel offsets skips source columns and produces a
|
|
279
|
-
// serrated, one-directional smear.
|
|
280
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, fbos.blurA);
|
|
281
|
-
gl.viewport(0, 0, downW, downH);
|
|
282
|
-
// biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook (the early return above tripped the use* heuristic).
|
|
283
|
-
gl.useProgram(programs.blur.prog);
|
|
284
|
-
gl.activeTexture(gl.TEXTURE0);
|
|
285
|
-
gl.bindTexture(gl.TEXTURE_2D, textures.original);
|
|
286
|
-
gl.uniform1i(programs.blur.uTex, 0);
|
|
287
|
-
const { weights, offsets } = blurKernel(tuning.blurSigma);
|
|
288
|
-
gl.uniform1fv(programs.blur.uWeights, weights);
|
|
289
|
-
gl.uniform1fv(programs.blur.uOffsets, offsets);
|
|
290
|
-
gl.uniform2f(programs.blur.uAxis, 0, 0);
|
|
291
|
-
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
292
|
-
// Pass 1: horizontal blur of the downscaled copy: blurA -> blurB.
|
|
293
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, fbos.blurB);
|
|
294
|
-
gl.viewport(0, 0, downW, downH);
|
|
295
|
-
gl.bindTexture(gl.TEXTURE_2D, textures.blurA);
|
|
296
|
-
gl.uniform2f(programs.blur.uAxis, 1 / downW, 0);
|
|
297
|
-
timePass(gl, timer, 'h', () => gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4));
|
|
298
|
-
// Pass 2: vertical blur: blurB -> blurA.
|
|
299
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, fbos.blurA);
|
|
300
|
-
gl.viewport(0, 0, downW, downH);
|
|
301
|
-
gl.bindTexture(gl.TEXTURE_2D, textures.blurB);
|
|
302
|
-
gl.uniform2f(programs.blur.uAxis, 0, 1 / downH);
|
|
303
|
-
timePass(gl, timer, 'v', () => gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4));
|
|
304
|
-
// Pass 3: composite original + blurB + mask -> default framebuffer (canvas)
|
|
305
|
-
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
306
|
-
gl.viewport(0, 0, w, h);
|
|
307
|
-
// biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook (the early return above tripped the use* heuristic).
|
|
308
|
-
gl.useProgram(programs.composite.prog);
|
|
309
|
-
gl.activeTexture(gl.TEXTURE0);
|
|
310
|
-
gl.bindTexture(gl.TEXTURE_2D, textures.original);
|
|
311
|
-
gl.uniform1i(programs.composite.uOriginal, 0);
|
|
312
|
-
gl.activeTexture(gl.TEXTURE1);
|
|
313
|
-
// Final blurred result lives in blurA after the V pass (pass 2).
|
|
314
|
-
gl.bindTexture(gl.TEXTURE_2D, textures.blurA);
|
|
315
|
-
gl.uniform1i(programs.composite.uBackground, 1);
|
|
316
|
-
gl.activeTexture(gl.TEXTURE2);
|
|
317
|
-
gl.bindTexture(gl.TEXTURE_2D, textures.mask);
|
|
318
|
-
gl.uniform1i(programs.composite.uMask, 2);
|
|
319
|
-
// Blurred background is full-size; identity UV transform.
|
|
320
|
-
gl.uniform2f(programs.composite.uBgUvScale, 1, 1);
|
|
321
|
-
gl.uniform2f(programs.composite.uBgUvOffset, 0, 0);
|
|
322
|
-
// Mask V-flip: direct upload with flipY=false leaves mask Y-inverted
|
|
323
|
-
// relative to the original. Encode the flip in the sampling uniforms so
|
|
324
|
-
// the shader stays byte-identical with Android (which uses identity here).
|
|
325
|
-
gl.uniform2f(programs.composite.uMaskUvScale, 1, -1);
|
|
326
|
-
gl.uniform2f(programs.composite.uMaskUvOffset, 0, 1);
|
|
327
|
-
const [maskLo, maskHi] = maskSmoothstepRange(tuning.maskHardness, tuning.maskThreshold);
|
|
328
|
-
gl.uniform1f(programs.composite.uMaskLo, maskLo);
|
|
329
|
-
gl.uniform1f(programs.composite.uMaskHi, maskHi);
|
|
330
|
-
timePass(gl, timer, 'composite', () => gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4));
|
|
331
|
-
// Wrap the canvas as an output VideoFrame.
|
|
332
|
-
const out = new VideoFrame(canvas, {
|
|
333
|
-
timestamp: frame.timestamp,
|
|
334
|
-
...(frame.duration != null ? { duration: frame.duration } : {}),
|
|
335
|
-
});
|
|
336
|
-
frame.close();
|
|
337
|
-
return out;
|
|
338
|
-
};
|
|
339
|
-
//# sourceMappingURL=blur.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blur.js","sourceRoot":"","sources":["../../../src/web/effects/blur.ts"],"names":[],"mappings":"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","sourcesContent":["// Web blur effect, WebGL2 pipeline.\n//\n// Same shape as the Android GLES 3.0 path: separable Gaussian blur into a\n// ping-pong FBO, then a composite pass that mixes blurred and original via\n// a segmentation mask. The mask still comes from MediaPipe Selfie\n// Segmentation loaded from CDN; there is no GPU-resident segmenter for\n// the web yet.\n//\n// Shader source lives in src/web/shaders.ts; MediaPipe loader in\n// src/web/segmenter.ts. This file owns only the per-effect GL state and\n// the per-frame transform.\n\nimport { computeBlurKernel } from '../blur-kernel';\nimport type { FrameTransform } from '../insertable-streams';\nimport { getLatestMask, loadSegmenter, requestMaskIfIdle } from '../segmenter';\nimport { BLUR_FRAG_SRC, COMPOSITE_FRAG_SRC, PASSTHROUGH_VERT_SRC } from '../shaders';\nimport { maskSmoothstepRange, tuning } from '../tuning';\n\n// Cache the kernel by sigma; the pure math lives in ../blur-kernel. Recomputed\n// only when the blur slider (setBlurSigma) moves, not per frame.\nlet cachedKernelSigma = Number.NaN;\nlet cachedKernel: { weights: Float32Array; offsets: Float32Array } | null = null;\n\nconst blurKernel = (sigma: number): { weights: Float32Array; offsets: Float32Array } => {\n if (sigma !== cachedKernelSigma || cachedKernel === null) {\n cachedKernel = computeBlurKernel(sigma);\n cachedKernelSigma = sigma;\n }\n return cachedKernel;\n};\n\ntype GpuState = {\n gl: WebGL2RenderingContext;\n canvas: OffscreenCanvas;\n width: number;\n height: number;\n // Blur ping-pong buffers run at quarter area (half each axis, short side\n // floored at 256px); the composite's LINEAR sampler upscales for free.\n downW: number;\n downH: number;\n programs: {\n blur: BlurProgram;\n composite: CompositeProgram;\n };\n timer: PassTimer;\n textures: {\n original: WebGLTexture;\n mask: WebGLTexture;\n blurA: WebGLTexture;\n blurB: WebGLTexture;\n };\n fbos: {\n blurA: WebGLFramebuffer;\n blurB: WebGLFramebuffer;\n };\n};\n\nlet state: GpuState | null = null;\n\n// MediaPipe needs a 2D canvas as input; we stage the VideoFrame there each\n// frame, then point both MediaPipe and the GL upload at it.\nlet inputCanvas2D: OffscreenCanvas | null = null;\nlet inputCtx2D: OffscreenCanvasRenderingContext2D | null = null;\n\nconst compileShader = (gl: WebGL2RenderingContext, type: number, source: string): WebGLShader => {\n const shader = gl.createShader(type);\n if (!shader) throw new Error('kaleidoscope: gl.createShader returned null');\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader) ?? '(no info log)';\n gl.deleteShader(shader);\n throw new Error(`kaleidoscope: shader compile failed: ${log}\\n---\\n${source}`);\n }\n return shader;\n};\n\nconst linkProgram = (\n gl: WebGL2RenderingContext,\n vertSrc: string,\n fragSrc: string,\n): WebGLProgram => {\n const vs = compileShader(gl, gl.VERTEX_SHADER, vertSrc);\n const fs = compileShader(gl, gl.FRAGMENT_SHADER, fragSrc);\n const prog = gl.createProgram();\n if (!prog) throw new Error('kaleidoscope: gl.createProgram returned null');\n gl.attachShader(prog, vs);\n gl.attachShader(prog, fs);\n gl.linkProgram(prog);\n gl.detachShader(prog, vs);\n gl.detachShader(prog, fs);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(prog) ?? '(no info log)';\n gl.deleteProgram(prog);\n throw new Error(`kaleidoscope: program link failed: ${log}`);\n }\n return prog;\n};\n\n// Uniform locations queried once at link, not via getUniformLocation per frame.\ntype BlurProgram = {\n prog: WebGLProgram;\n uTex: WebGLUniformLocation | null;\n uAxis: WebGLUniformLocation | null;\n uWeights: WebGLUniformLocation | null;\n uOffsets: WebGLUniformLocation | null;\n};\ntype CompositeProgram = {\n prog: WebGLProgram;\n uOriginal: WebGLUniformLocation | null;\n uBackground: WebGLUniformLocation | null;\n uMask: WebGLUniformLocation | null;\n uBgUvScale: WebGLUniformLocation | null;\n uBgUvOffset: WebGLUniformLocation | null;\n uMaskUvScale: WebGLUniformLocation | null;\n uMaskUvOffset: WebGLUniformLocation | null;\n uMaskLo: WebGLUniformLocation | null;\n uMaskHi: WebGLUniformLocation | null;\n};\n\nconst linkBlurProgram = (gl: WebGL2RenderingContext): BlurProgram => {\n const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, BLUR_FRAG_SRC);\n return {\n prog,\n uTex: gl.getUniformLocation(prog, 'uTex'),\n uAxis: gl.getUniformLocation(prog, 'uAxis'),\n uWeights: gl.getUniformLocation(prog, 'uWeights'),\n uOffsets: gl.getUniformLocation(prog, 'uOffsets'),\n };\n};\n\nconst linkCompositeProgram = (gl: WebGL2RenderingContext): CompositeProgram => {\n const prog = linkProgram(gl, PASSTHROUGH_VERT_SRC, COMPOSITE_FRAG_SRC);\n return {\n prog,\n uOriginal: gl.getUniformLocation(prog, 'uOriginal'),\n uBackground: gl.getUniformLocation(prog, 'uBackground'),\n uMask: gl.getUniformLocation(prog, 'uMask'),\n uBgUvScale: gl.getUniformLocation(prog, 'uBgUvScale'),\n uBgUvOffset: gl.getUniformLocation(prog, 'uBgUvOffset'),\n uMaskUvScale: gl.getUniformLocation(prog, 'uMaskUvScale'),\n uMaskUvOffset: gl.getUniformLocation(prog, 'uMaskUvOffset'),\n uMaskLo: gl.getUniformLocation(prog, 'uMaskLo'),\n uMaskHi: gl.getUniformLocation(prog, 'uMaskHi'),\n };\n};\n\n// Per-pass GPU timing (dev only). Set\n// `globalThis.__KALEIDOSCOPE_DEBUG_TIMING__ = true` before the first blur frame\n// to log per-pass GPU time via EXT_disjoint_timer_query_webgl2. Results read\n// back one frame late (the query is async); a no-op when the flag/ext is absent.\nconst TIMING_ENABLED =\n (globalThis as { __KALEIDOSCOPE_DEBUG_TIMING__?: boolean }).__KALEIDOSCOPE_DEBUG_TIMING__ ===\n true;\n\ntype TimerExt = { TIME_ELAPSED_EXT: number; GPU_DISJOINT_EXT: number };\ntype PassTimer = { ext: TimerExt | null; pending: Map<string, WebGLQuery> };\n\nconst makePassTimer = (gl: WebGL2RenderingContext): PassTimer => ({\n ext: TIMING_ENABLED\n ? (gl.getExtension('EXT_disjoint_timer_query_webgl2') as TimerExt | null)\n : null,\n pending: new Map(),\n});\n\nconst timePass = (\n gl: WebGL2RenderingContext,\n timer: PassTimer,\n label: string,\n draw: () => void,\n): void => {\n const ext = timer.ext;\n if (!ext) {\n draw();\n return;\n }\n const inFlight = timer.pending.get(label);\n if (inFlight) {\n const available = gl.getQueryParameter(inFlight, gl.QUERY_RESULT_AVAILABLE) as boolean;\n const disjoint = gl.getParameter(ext.GPU_DISJOINT_EXT) as boolean;\n if (available && !disjoint) {\n const ns = gl.getQueryParameter(inFlight, gl.QUERY_RESULT) as number;\n console.debug(`[kaleidoscope] blur ${label}: ${(ns / 1e6).toFixed(3)} ms`);\n }\n if (available || disjoint) {\n gl.deleteQuery(inFlight);\n timer.pending.delete(label);\n }\n // A query is still in flight for this label; just draw, don't stack another.\n draw();\n return;\n }\n const query = gl.createQuery();\n if (!query) {\n draw();\n return;\n }\n gl.beginQuery(ext.TIME_ELAPSED_EXT, query);\n draw();\n gl.endQuery(ext.TIME_ELAPSED_EXT);\n timer.pending.set(label, query);\n};\n\nconst createTexture = (gl: WebGL2RenderingContext, width: number, height: number): WebGLTexture => {\n const tex = gl.createTexture();\n if (!tex) throw new Error('kaleidoscope: gl.createTexture returned null');\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return tex;\n};\n\nconst createFbo = (gl: WebGL2RenderingContext, tex: WebGLTexture): WebGLFramebuffer => {\n const fbo = gl.createFramebuffer();\n if (!fbo) throw new Error('kaleidoscope: gl.createFramebuffer returned null');\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n if (status !== gl.FRAMEBUFFER_COMPLETE) {\n throw new Error(`kaleidoscope: FBO incomplete: 0x${status.toString(16)}`);\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return fbo;\n};\n\n// Quarter-area downscale for the blur ping-pong buffers: half each axis, short\n// side floored at 256px so small inputs don't degrade; never upscales. Shared\n// rule with the Android/iOS R1 commits.\nconst blurDownscale = (w: number, h: number): { downW: number; downH: number } => {\n const shortTarget = Math.max(256, Math.round(Math.min(w, h) * 0.5));\n const scale = Math.min(1, shortTarget / Math.min(w, h));\n return { downW: Math.max(1, Math.round(w * scale)), downH: Math.max(1, Math.round(h * scale)) };\n};\n\nconst ensureState = (width: number, height: number): GpuState => {\n if (state && state.width === width && state.height === height) return state;\n\n // Tear down previous state if dimensions changed.\n if (state) {\n const { gl } = state;\n gl.deleteProgram(state.programs.blur.prog);\n gl.deleteProgram(state.programs.composite.prog);\n for (const q of state.timer.pending.values()) gl.deleteQuery(q);\n gl.deleteTexture(state.textures.original);\n gl.deleteTexture(state.textures.mask);\n gl.deleteTexture(state.textures.blurA);\n gl.deleteTexture(state.textures.blurB);\n gl.deleteFramebuffer(state.fbos.blurA);\n gl.deleteFramebuffer(state.fbos.blurB);\n }\n\n const canvas = state?.canvas ?? new OffscreenCanvas(width, height);\n canvas.width = width;\n canvas.height = height;\n const gl = canvas.getContext('webgl2');\n if (!gl) {\n throw new Error('kaleidoscope: WebGL2 not available; blur requires a WebGL2-capable browser');\n }\n\n const programs = {\n blur: linkBlurProgram(gl),\n composite: linkCompositeProgram(gl),\n };\n const { downW, downH } = blurDownscale(width, height);\n const textures = {\n original: createTexture(gl, width, height),\n mask: createTexture(gl, width, height),\n blurA: createTexture(gl, downW, downH),\n blurB: createTexture(gl, downW, downH),\n };\n const fbos = {\n blurA: createFbo(gl, textures.blurA),\n blurB: createFbo(gl, textures.blurB),\n };\n\n state = {\n gl,\n canvas,\n width,\n height,\n downW,\n downH,\n programs,\n timer: makePassTimer(gl),\n textures,\n fbos,\n };\n return state;\n};\n\nconst ensureInputCanvas = (width: number, height: number): OffscreenCanvasRenderingContext2D => {\n if (!inputCanvas2D || inputCanvas2D.width !== width || inputCanvas2D.height !== height) {\n inputCanvas2D = new OffscreenCanvas(width, height);\n inputCtx2D = inputCanvas2D.getContext('2d');\n if (!inputCtx2D) throw new Error('kaleidoscope: OffscreenCanvas 2D context unavailable');\n }\n return inputCtx2D as OffscreenCanvasRenderingContext2D;\n};\n\nconst uploadTexture = (\n gl: WebGL2RenderingContext,\n tex: WebGLTexture,\n source: TexImageSource,\n flipY: boolean,\n): void => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipY);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n};\n\nexport const blur: FrameTransform = async (frame) => {\n await loadSegmenter(); // ensure the segmenter is loaded; cached after first call.\n const w = frame.displayWidth;\n const h = frame.displayHeight;\n\n // Stage on a 2D canvas so MediaPipe can ingest it (and so the GL upload below\n // has a flippable source).\n const inputCtx = ensureInputCanvas(w, h);\n inputCtx.drawImage(frame, 0, 0, w, h);\n const inputCanvas = inputCanvas2D as unknown as CanvasImageSource;\n\n // Decoupled segmentation (mirrors native): never block the render on the\n // segmenter. Kick a fresh mask only when idle and draw with the most recent\n // one. drawImage is atomic w.r.t. the event loop, so MediaPipe reading the\n // canvas between tasks sees at most a ~1-frame-newer image — within the\n // staleness the mask already tolerates. Before the first mask lands, forward\n // the original frame (matches native's fall-through).\n requestMaskIfIdle(inputCanvas);\n const results = getLatestMask();\n if (!results) {\n const passthrough = new VideoFrame(inputCanvas2D as unknown as CanvasImageSource, {\n timestamp: frame.timestamp,\n ...(frame.duration != null ? { duration: frame.duration } : {}),\n });\n frame.close();\n return passthrough;\n }\n\n // Run the GPU pipeline.\n const s = ensureState(w, h);\n const { gl, canvas, programs, timer, textures, fbos, downW, downH } = s;\n\n // Upload original with flipY=true (DOM-coord source → GL v=1 = top).\n // Upload mask with flipY=false: UNPACK_FLIP_Y_WEBGL is a no-op on\n // MediaPipe's segmentationMask (also on ImageBitmaps in general), so the\n // mask lands in its natural orientation. The composite shader compensates\n // with the uMaskUvScale=(1,-1) / uMaskUvOffset=(0,1) V-flip uniforms set\n // below; this also avoids the canvas-premultiplied-alpha problem that\n // collapses soft confidence values and makes the mask binary.\n uploadTexture(gl, textures.original, inputCanvas as unknown as TexImageSource, true);\n uploadTexture(gl, textures.mask, results.segmentationMask as unknown as TexImageSource, false);\n\n gl.disable(gl.BLEND);\n gl.disable(gl.DEPTH_TEST);\n\n // Pass 0: downsample the full-res original into blurA. uAxis=0 collapses the\n // kernel to its center tap (weights sum to 1), so this is a plain bilinear\n // box-average into the downscaled target. Both blur passes must then run IN\n // downscaled space: sampling the full-res original directly with the\n // downscaled-spaced kernel offsets skips source columns and produces a\n // serrated, one-directional smear.\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbos.blurA);\n gl.viewport(0, 0, downW, downH);\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook (the early return above tripped the use* heuristic).\n gl.useProgram(programs.blur.prog);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, textures.original);\n gl.uniform1i(programs.blur.uTex, 0);\n const { weights, offsets } = blurKernel(tuning.blurSigma);\n gl.uniform1fv(programs.blur.uWeights, weights);\n gl.uniform1fv(programs.blur.uOffsets, offsets);\n gl.uniform2f(programs.blur.uAxis, 0, 0);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n // Pass 1: horizontal blur of the downscaled copy: blurA -> blurB.\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbos.blurB);\n gl.viewport(0, 0, downW, downH);\n gl.bindTexture(gl.TEXTURE_2D, textures.blurA);\n gl.uniform2f(programs.blur.uAxis, 1 / downW, 0);\n timePass(gl, timer, 'h', () => gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4));\n\n // Pass 2: vertical blur: blurB -> blurA.\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbos.blurA);\n gl.viewport(0, 0, downW, downH);\n gl.bindTexture(gl.TEXTURE_2D, textures.blurB);\n gl.uniform2f(programs.blur.uAxis, 0, 1 / downH);\n timePass(gl, timer, 'v', () => gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4));\n\n // Pass 3: composite original + blurB + mask -> default framebuffer (canvas)\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, w, h);\n // biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL call, not a React hook (the early return above tripped the use* heuristic).\n gl.useProgram(programs.composite.prog);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, textures.original);\n gl.uniform1i(programs.composite.uOriginal, 0);\n gl.activeTexture(gl.TEXTURE1);\n // Final blurred result lives in blurA after the V pass (pass 2).\n gl.bindTexture(gl.TEXTURE_2D, textures.blurA);\n gl.uniform1i(programs.composite.uBackground, 1);\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, textures.mask);\n gl.uniform1i(programs.composite.uMask, 2);\n // Blurred background is full-size; identity UV transform.\n gl.uniform2f(programs.composite.uBgUvScale, 1, 1);\n gl.uniform2f(programs.composite.uBgUvOffset, 0, 0);\n // Mask V-flip: direct upload with flipY=false leaves mask Y-inverted\n // relative to the original. Encode the flip in the sampling uniforms so\n // the shader stays byte-identical with Android (which uses identity here).\n gl.uniform2f(programs.composite.uMaskUvScale, 1, -1);\n gl.uniform2f(programs.composite.uMaskUvOffset, 0, 1);\n const [maskLo, maskHi] = maskSmoothstepRange(tuning.maskHardness, tuning.maskThreshold);\n gl.uniform1f(programs.composite.uMaskLo, maskLo);\n gl.uniform1f(programs.composite.uMaskHi, maskHi);\n timePass(gl, timer, 'composite', () => gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4));\n\n // Wrap the canvas as an output VideoFrame.\n const out = new VideoFrame(canvas as unknown as CanvasImageSource, {\n timestamp: frame.timestamp,\n ...(frame.duration != null ? { duration: frame.duration } : {}),\n });\n frame.close();\n return out;\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/web/effects/transform.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,aAAa,OAAQ,aAAa,KAAG,cAmDjD,CAAC","sourcesContent":["// Web transform effects: pure geometric reorientations of the frame (axis\n// flips and 90-degree rotations). Each draws the incoming VideoFrame to an\n// OffscreenCanvas with the matching 2D transform, then re-encodes the canvas as\n// a new VideoFrame preserving timestamp and duration.\n//\n// On web the frame is already in display space, so a flip on the canvas X axis\n// is a flip on the screen's horizontal axis with no rotation correction. These\n// are therefore the platform-reference behavior for the demo's calibration\n// toggles; the native pipelines have to correct for the landscape camera\n// buffer's rotation to land on the same on-screen result.\n//\n// makeTransform closes over its own canvas (one per pipeline stage) so two\n// stacked transform stages never fight over a shared scratch buffer.\n\nimport type { TransformName } from '../../types';\nimport type { FrameTransform } from '../insertable-streams';\n\nexport const makeTransform = (op: TransformName): FrameTransform => {\n let canvas: OffscreenCanvas | null = null;\n let ctx: OffscreenCanvasRenderingContext2D | null = null;\n\n const ensureCanvas = (width: number, height: number): OffscreenCanvasRenderingContext2D => {\n if (!canvas || canvas.width !== width || canvas.height !== height) {\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('kaleidoscope: OffscreenCanvas 2D context unavailable');\n }\n }\n return ctx as OffscreenCanvasRenderingContext2D;\n };\n\n return async (frame) => {\n const w = frame.displayWidth;\n const h = frame.displayHeight;\n // 90-degree rotations swap the output dimensions.\n const rotated = op === 'rotate-cw' || op === 'rotate-ccw';\n const c = ensureCanvas(rotated ? h : w, rotated ? w : h);\n\n c.save();\n switch (op) {\n case 'flip-x':\n // Mirror about the vertical centerline: x -> w - x.\n c.setTransform(-1, 0, 0, 1, w, 0);\n break;\n case 'flip-y':\n // Mirror about the horizontal centerline: y -> h - y.\n c.setTransform(1, 0, 0, -1, 0, h);\n break;\n case 'rotate-cw':\n // 90 deg clockwise into the h x w canvas.\n c.setTransform(0, 1, -1, 0, h, 0);\n break;\n case 'rotate-ccw':\n // 90 deg counter-clockwise into the h x w canvas.\n c.setTransform(0, -1, 1, 0, 0, w);\n break;\n }\n c.drawImage(frame, 0, 0, w, h);\n c.restore();\n\n const out = new VideoFrame(canvas as unknown as CanvasImageSource, {\n timestamp: frame.timestamp,\n ...(frame.duration != null ? { duration: frame.duration } : {}),\n });\n frame.close();\n return out;\n };\n};\n"]}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
// Web transform effects: pure geometric reorientations of the frame (axis
|
|
2
|
-
// flips and 90-degree rotations). Each draws the incoming VideoFrame to an
|
|
3
|
-
// OffscreenCanvas with the matching 2D transform, then re-encodes the canvas as
|
|
4
|
-
// a new VideoFrame preserving timestamp and duration.
|
|
5
|
-
//
|
|
6
|
-
// On web the frame is already in display space, so a flip on the canvas X axis
|
|
7
|
-
// is a flip on the screen's horizontal axis with no rotation correction. These
|
|
8
|
-
// are therefore the platform-reference behavior for the demo's calibration
|
|
9
|
-
// toggles; the native pipelines have to correct for the landscape camera
|
|
10
|
-
// buffer's rotation to land on the same on-screen result.
|
|
11
|
-
//
|
|
12
|
-
// makeTransform closes over its own canvas (one per pipeline stage) so two
|
|
13
|
-
// stacked transform stages never fight over a shared scratch buffer.
|
|
14
|
-
export const makeTransform = (op) => {
|
|
15
|
-
let canvas = null;
|
|
16
|
-
let ctx = null;
|
|
17
|
-
const ensureCanvas = (width, height) => {
|
|
18
|
-
if (!canvas || canvas.width !== width || canvas.height !== height) {
|
|
19
|
-
canvas = new OffscreenCanvas(width, height);
|
|
20
|
-
ctx = canvas.getContext('2d');
|
|
21
|
-
if (!ctx) {
|
|
22
|
-
throw new Error('kaleidoscope: OffscreenCanvas 2D context unavailable');
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return ctx;
|
|
26
|
-
};
|
|
27
|
-
return async (frame) => {
|
|
28
|
-
const w = frame.displayWidth;
|
|
29
|
-
const h = frame.displayHeight;
|
|
30
|
-
// 90-degree rotations swap the output dimensions.
|
|
31
|
-
const rotated = op === 'rotate-cw' || op === 'rotate-ccw';
|
|
32
|
-
const c = ensureCanvas(rotated ? h : w, rotated ? w : h);
|
|
33
|
-
c.save();
|
|
34
|
-
switch (op) {
|
|
35
|
-
case 'flip-x':
|
|
36
|
-
// Mirror about the vertical centerline: x -> w - x.
|
|
37
|
-
c.setTransform(-1, 0, 0, 1, w, 0);
|
|
38
|
-
break;
|
|
39
|
-
case 'flip-y':
|
|
40
|
-
// Mirror about the horizontal centerline: y -> h - y.
|
|
41
|
-
c.setTransform(1, 0, 0, -1, 0, h);
|
|
42
|
-
break;
|
|
43
|
-
case 'rotate-cw':
|
|
44
|
-
// 90 deg clockwise into the h x w canvas.
|
|
45
|
-
c.setTransform(0, 1, -1, 0, h, 0);
|
|
46
|
-
break;
|
|
47
|
-
case 'rotate-ccw':
|
|
48
|
-
// 90 deg counter-clockwise into the h x w canvas.
|
|
49
|
-
c.setTransform(0, -1, 1, 0, 0, w);
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
c.drawImage(frame, 0, 0, w, h);
|
|
53
|
-
c.restore();
|
|
54
|
-
const out = new VideoFrame(canvas, {
|
|
55
|
-
timestamp: frame.timestamp,
|
|
56
|
-
...(frame.duration != null ? { duration: frame.duration } : {}),
|
|
57
|
-
});
|
|
58
|
-
frame.close();
|
|
59
|
-
return out;
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
//# sourceMappingURL=transform.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/web/effects/transform.ts"],"names":[],"mappings":"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","sourcesContent":["// Web transform effects: pure geometric reorientations of the frame (axis\n// flips and 90-degree rotations). Each draws the incoming VideoFrame to an\n// OffscreenCanvas with the matching 2D transform, then re-encodes the canvas as\n// a new VideoFrame preserving timestamp and duration.\n//\n// On web the frame is already in display space, so a flip on the canvas X axis\n// is a flip on the screen's horizontal axis with no rotation correction. These\n// are therefore the platform-reference behavior for the demo's calibration\n// toggles; the native pipelines have to correct for the landscape camera\n// buffer's rotation to land on the same on-screen result.\n//\n// makeTransform closes over its own canvas (one per pipeline stage) so two\n// stacked transform stages never fight over a shared scratch buffer.\n\nimport type { TransformName } from '../../types';\nimport type { FrameTransform } from '../insertable-streams';\n\nexport const makeTransform = (op: TransformName): FrameTransform => {\n let canvas: OffscreenCanvas | null = null;\n let ctx: OffscreenCanvasRenderingContext2D | null = null;\n\n const ensureCanvas = (width: number, height: number): OffscreenCanvasRenderingContext2D => {\n if (!canvas || canvas.width !== width || canvas.height !== height) {\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('kaleidoscope: OffscreenCanvas 2D context unavailable');\n }\n }\n return ctx as OffscreenCanvasRenderingContext2D;\n };\n\n return async (frame) => {\n const w = frame.displayWidth;\n const h = frame.displayHeight;\n // 90-degree rotations swap the output dimensions.\n const rotated = op === 'rotate-cw' || op === 'rotate-ccw';\n const c = ensureCanvas(rotated ? h : w, rotated ? w : h);\n\n c.save();\n switch (op) {\n case 'flip-x':\n // Mirror about the vertical centerline: x -> w - x.\n c.setTransform(-1, 0, 0, 1, w, 0);\n break;\n case 'flip-y':\n // Mirror about the horizontal centerline: y -> h - y.\n c.setTransform(1, 0, 0, -1, 0, h);\n break;\n case 'rotate-cw':\n // 90 deg clockwise into the h x w canvas.\n c.setTransform(0, 1, -1, 0, h, 0);\n break;\n case 'rotate-ccw':\n // 90 deg counter-clockwise into the h x w canvas.\n c.setTransform(0, -1, 1, 0, 0, w);\n break;\n }\n c.drawImage(frame, 0, 0, w, h);\n c.restore();\n\n const out = new VideoFrame(canvas as unknown as CanvasImageSource, {\n timestamp: frame.timestamp,\n ...(frame.duration != null ? { duration: frame.duration } : {}),\n });\n frame.close();\n return out;\n };\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"insertable-streams.d.ts","sourceRoot":"","sources":["../../src/web/insertable-streams.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAIxE,OAAO,CAAC,MAAM,CAAC,CAAC;IACd,UAAU,6BAA6B;QACrC,KAAK,EAAE,gBAAgB,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;IACD,UAAU,yBAAyB;QACjC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;KAC/C;IACD,IAAI,yBAAyB,EAAE;QAC7B,SAAS,EAAE,yBAAyB,CAAC;QACrC,KAAK,IAAI,EAAE,6BAA6B,GAAG,yBAAyB,CAAC;KACtE,CAAC;IAEF,UAAU,6BAA6B;QACrC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;KACzB;IACD,UAAU,yBAA0B,SAAQ,gBAAgB;QAC1D,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;KAC/C;IACD,IAAI,yBAAyB,EAAE;QAC7B,SAAS,EAAE,yBAAyB,CAAC;QACrC,KAAK,IAAI,EAAE,6BAA6B,GAAG,yBAAyB,CAAC;KACtE,CAAC;CACH;AAMD;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,kBAAkB,UACtB,gBAAgB,aACZ,cAAc,KACxB,kBAuDF,CAAC","sourcesContent":["// Insertable-Streams pipeline factory. Wires\n// MediaStreamTrackProcessor → TransformStream(transform) → MediaStreamTrackGenerator\n// and returns the generator track. Caller hands the new track to a `<video>`\n// element for preview, or to `RTCRtpSender.replaceTrack(...)` for a peer connection.\n//\n// Spec: https://www.w3.org/TR/mediacapture-transform/\n// Browsers: Chrome / Edge ship it. Safari and Firefox do not as of 2026-05;\n// we capability-check at call time and throw a typed error.\n\nexport type FrameTransform = (frame: VideoFrame) => Promise<VideoFrame>;\n\n// Insertable-Streams APIs are not yet in TypeScript's lib.dom.d.ts.\n// Local ambient declarations until they land upstream.\ndeclare global {\n interface MediaStreamTrackProcessorInit {\n track: MediaStreamTrack;\n maxBufferSize?: number;\n }\n interface MediaStreamTrackProcessor {\n readonly readable: ReadableStream<VideoFrame>;\n }\n var MediaStreamTrackProcessor: {\n prototype: MediaStreamTrackProcessor;\n new (init: MediaStreamTrackProcessorInit): MediaStreamTrackProcessor;\n };\n\n interface MediaStreamTrackGeneratorInit {\n kind: 'video' | 'audio';\n }\n interface MediaStreamTrackGenerator extends MediaStreamTrack {\n readonly writable: WritableStream<VideoFrame>;\n }\n var MediaStreamTrackGenerator: {\n prototype: MediaStreamTrackGenerator;\n new (init: MediaStreamTrackGeneratorInit): MediaStreamTrackGenerator;\n };\n}\n\nconst hasInsertableStreams = (): boolean =>\n typeof globalThis.MediaStreamTrackProcessor !== 'undefined' &&\n typeof globalThis.MediaStreamTrackGenerator !== 'undefined';\n\n/**\n * A running Insertable-Streams stage. `track` is the generator track carrying\n * transformed frames; `dispose` aborts the pipe and stops the generator so the\n * stage can be torn down (e.g. on a LiveKit camera flip) without leaking the\n * generator and its pull on the source track.\n */\nexport type DisposablePipeline = {\n track: MediaStreamTrack;\n dispose: () => void;\n};\n\nexport const applyEffectToTrack = (\n track: MediaStreamTrack,\n transform: FrameTransform,\n): DisposablePipeline => {\n if (!hasInsertableStreams()) {\n throw new Error(\n 'kaleidoscope: this browser lacks MediaStreamTrackProcessor / MediaStreamTrackGenerator (Insertable Streams). Effects require Chrome or Edge.',\n );\n }\n\n const processor = new MediaStreamTrackProcessor({ track });\n const generator = new MediaStreamTrackGenerator({ kind: 'video' });\n\n const transformer = new TransformStream<VideoFrame, VideoFrame>({\n async transform(frame, controller) {\n try {\n const out = await transform(frame);\n controller.enqueue(out);\n } catch (err) {\n try {\n frame.close();\n } catch {\n // already closed\n }\n controller.error(err);\n }\n },\n });\n\n // Abort signal lets `dispose()` cancel the pipe: aborting cancels the\n // readable (which stops the processor pulling from the source) and errors the\n // writable, ending the generator.\n const abort = new AbortController();\n processor.readable\n .pipeThrough(transformer)\n .pipeTo(generator.writable, { signal: abort.signal })\n .catch((err) => {\n // Pipeline aborts when the source track ends, is replaced, or dispose()\n // is called; not an error.\n if (err?.name !== 'AbortError') {\n console.error('kaleidoscope: pipeline error', err);\n }\n });\n\n const dispose = (): void => {\n try {\n abort.abort();\n } catch {\n // already aborted\n }\n try {\n generator.stop();\n } catch {\n // already stopped\n }\n };\n\n return { track: generator, dispose };\n};\n"]}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// Insertable-Streams pipeline factory. Wires
|
|
2
|
-
// MediaStreamTrackProcessor → TransformStream(transform) → MediaStreamTrackGenerator
|
|
3
|
-
// and returns the generator track. Caller hands the new track to a `<video>`
|
|
4
|
-
// element for preview, or to `RTCRtpSender.replaceTrack(...)` for a peer connection.
|
|
5
|
-
//
|
|
6
|
-
// Spec: https://www.w3.org/TR/mediacapture-transform/
|
|
7
|
-
// Browsers: Chrome / Edge ship it. Safari and Firefox do not as of 2026-05;
|
|
8
|
-
// we capability-check at call time and throw a typed error.
|
|
9
|
-
const hasInsertableStreams = () => typeof globalThis.MediaStreamTrackProcessor !== 'undefined' &&
|
|
10
|
-
typeof globalThis.MediaStreamTrackGenerator !== 'undefined';
|
|
11
|
-
export const applyEffectToTrack = (track, transform) => {
|
|
12
|
-
if (!hasInsertableStreams()) {
|
|
13
|
-
throw new Error('kaleidoscope: this browser lacks MediaStreamTrackProcessor / MediaStreamTrackGenerator (Insertable Streams). Effects require Chrome or Edge.');
|
|
14
|
-
}
|
|
15
|
-
const processor = new MediaStreamTrackProcessor({ track });
|
|
16
|
-
const generator = new MediaStreamTrackGenerator({ kind: 'video' });
|
|
17
|
-
const transformer = new TransformStream({
|
|
18
|
-
async transform(frame, controller) {
|
|
19
|
-
try {
|
|
20
|
-
const out = await transform(frame);
|
|
21
|
-
controller.enqueue(out);
|
|
22
|
-
}
|
|
23
|
-
catch (err) {
|
|
24
|
-
try {
|
|
25
|
-
frame.close();
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
// already closed
|
|
29
|
-
}
|
|
30
|
-
controller.error(err);
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
});
|
|
34
|
-
// Abort signal lets `dispose()` cancel the pipe: aborting cancels the
|
|
35
|
-
// readable (which stops the processor pulling from the source) and errors the
|
|
36
|
-
// writable, ending the generator.
|
|
37
|
-
const abort = new AbortController();
|
|
38
|
-
processor.readable
|
|
39
|
-
.pipeThrough(transformer)
|
|
40
|
-
.pipeTo(generator.writable, { signal: abort.signal })
|
|
41
|
-
.catch((err) => {
|
|
42
|
-
// Pipeline aborts when the source track ends, is replaced, or dispose()
|
|
43
|
-
// is called; not an error.
|
|
44
|
-
if (err?.name !== 'AbortError') {
|
|
45
|
-
console.error('kaleidoscope: pipeline error', err);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
const dispose = () => {
|
|
49
|
-
try {
|
|
50
|
-
abort.abort();
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
// already aborted
|
|
54
|
-
}
|
|
55
|
-
try {
|
|
56
|
-
generator.stop();
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
// already stopped
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
return { track: generator, dispose };
|
|
63
|
-
};
|
|
64
|
-
//# sourceMappingURL=insertable-streams.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"insertable-streams.js","sourceRoot":"","sources":["../../src/web/insertable-streams.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,uFAAuF;AACvF,6EAA6E;AAC7E,qFAAqF;AACrF,EAAE;AACF,sDAAsD;AACtD,4EAA4E;AAC5E,4DAA4D;AA+B5D,MAAM,oBAAoB,GAAG,GAAY,EAAE,CACzC,OAAO,UAAU,CAAC,yBAAyB,KAAK,WAAW;IAC3D,OAAO,UAAU,CAAC,yBAAyB,KAAK,WAAW,CAAC;AAa9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAuB,EACvB,SAAyB,EACL,EAAE;IACtB,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,8IAA8I,CAC/I,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,yBAAyB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnE,MAAM,WAAW,GAAG,IAAI,eAAe,CAAyB;QAC9D,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU;YAC/B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;gBACnC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACP,iBAAiB;gBACnB,CAAC;gBACD,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,sEAAsE;IACtE,8EAA8E;IAC9E,kCAAkC;IAClC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,SAAS,CAAC,QAAQ;SACf,WAAW,CAAC,WAAW,CAAC;SACxB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;SACpD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,wEAAwE;QACxE,2BAA2B;QAC3B,IAAI,GAAG,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QACD,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC,CAAC","sourcesContent":["// Insertable-Streams pipeline factory. Wires\n// MediaStreamTrackProcessor → TransformStream(transform) → MediaStreamTrackGenerator\n// and returns the generator track. Caller hands the new track to a `<video>`\n// element for preview, or to `RTCRtpSender.replaceTrack(...)` for a peer connection.\n//\n// Spec: https://www.w3.org/TR/mediacapture-transform/\n// Browsers: Chrome / Edge ship it. Safari and Firefox do not as of 2026-05;\n// we capability-check at call time and throw a typed error.\n\nexport type FrameTransform = (frame: VideoFrame) => Promise<VideoFrame>;\n\n// Insertable-Streams APIs are not yet in TypeScript's lib.dom.d.ts.\n// Local ambient declarations until they land upstream.\ndeclare global {\n interface MediaStreamTrackProcessorInit {\n track: MediaStreamTrack;\n maxBufferSize?: number;\n }\n interface MediaStreamTrackProcessor {\n readonly readable: ReadableStream<VideoFrame>;\n }\n var MediaStreamTrackProcessor: {\n prototype: MediaStreamTrackProcessor;\n new (init: MediaStreamTrackProcessorInit): MediaStreamTrackProcessor;\n };\n\n interface MediaStreamTrackGeneratorInit {\n kind: 'video' | 'audio';\n }\n interface MediaStreamTrackGenerator extends MediaStreamTrack {\n readonly writable: WritableStream<VideoFrame>;\n }\n var MediaStreamTrackGenerator: {\n prototype: MediaStreamTrackGenerator;\n new (init: MediaStreamTrackGeneratorInit): MediaStreamTrackGenerator;\n };\n}\n\nconst hasInsertableStreams = (): boolean =>\n typeof globalThis.MediaStreamTrackProcessor !== 'undefined' &&\n typeof globalThis.MediaStreamTrackGenerator !== 'undefined';\n\n/**\n * A running Insertable-Streams stage. `track` is the generator track carrying\n * transformed frames; `dispose` aborts the pipe and stops the generator so the\n * stage can be torn down (e.g. on a LiveKit camera flip) without leaking the\n * generator and its pull on the source track.\n */\nexport type DisposablePipeline = {\n track: MediaStreamTrack;\n dispose: () => void;\n};\n\nexport const applyEffectToTrack = (\n track: MediaStreamTrack,\n transform: FrameTransform,\n): DisposablePipeline => {\n if (!hasInsertableStreams()) {\n throw new Error(\n 'kaleidoscope: this browser lacks MediaStreamTrackProcessor / MediaStreamTrackGenerator (Insertable Streams). Effects require Chrome or Edge.',\n );\n }\n\n const processor = new MediaStreamTrackProcessor({ track });\n const generator = new MediaStreamTrackGenerator({ kind: 'video' });\n\n const transformer = new TransformStream<VideoFrame, VideoFrame>({\n async transform(frame, controller) {\n try {\n const out = await transform(frame);\n controller.enqueue(out);\n } catch (err) {\n try {\n frame.close();\n } catch {\n // already closed\n }\n controller.error(err);\n }\n },\n });\n\n // Abort signal lets `dispose()` cancel the pipe: aborting cancels the\n // readable (which stops the processor pulling from the source) and errors the\n // writable, ending the generator.\n const abort = new AbortController();\n processor.readable\n .pipeThrough(transformer)\n .pipeTo(generator.writable, { signal: abort.signal })\n .catch((err) => {\n // Pipeline aborts when the source track ends, is replaced, or dispose()\n // is called; not an error.\n if (err?.name !== 'AbortError') {\n console.error('kaleidoscope: pipeline error', err);\n }\n });\n\n const dispose = (): void => {\n try {\n abort.abort();\n } catch {\n // already aborted\n }\n try {\n generator.stop();\n } catch {\n // already stopped\n }\n };\n\n return { track: generator, dispose };\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"segmenter.d.ts","sourceRoot":"","sources":["../../src/web/segmenter.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,iBAAiB,CAAC;IACzB,gBAAgB,EAAE,iBAAiB,CAAC;CACrC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,iBAAiB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAuCF,eAAO,MAAM,aAAa,QAAO,OAAO,CAAC,SAAS,CAsBjD,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,aAAa,QAAO,gBAAgB,GAAG,IAAqB,CAAC;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,UAAW,iBAAiB,KAAG,IAU5D,CAAC","sourcesContent":["// MediaPipe Selfie Segmentation loader. Single shared instance across every\n// web effect that needs a person mask (blur, 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"]}
|