@3driseai/3drise-viewer 0.1.27 → 0.1.29
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/dist/animationsV2/ClipPlayer.d.ts.map +1 -1
- package/dist/animationsV2/ClipPlayer.js +13 -9
- package/dist/animationsV2/ClipsRuntime.d.ts +44 -3
- package/dist/animationsV2/ClipsRuntime.d.ts.map +1 -1
- package/dist/animationsV2/ClipsRuntime.js +173 -55
- package/dist/animationsV2/appliers.d.ts.map +1 -1
- package/dist/animationsV2/appliers.js +21 -5
- package/dist/animationsV2/index.d.ts +1 -1
- package/dist/animationsV2/index.d.ts.map +1 -1
- package/dist/animationsV2/normalize.d.ts.map +1 -1
- package/dist/animationsV2/normalize.js +7 -3
- package/dist/animationsV2/sequenceUtils.d.ts +44 -6
- package/dist/animationsV2/sequenceUtils.d.ts.map +1 -1
- package/dist/animationsV2/sequenceUtils.js +58 -12
- package/dist/animationsV2/types.d.ts +22 -12
- package/dist/animationsV2/types.d.ts.map +1 -1
- package/dist/api/sceneHandle.d.ts +35 -1
- package/dist/api/sceneHandle.d.ts.map +1 -1
- package/dist/api/sceneHandle.js +88 -17
- package/dist/components/AdvancedGrid.d.ts +1 -5
- package/dist/components/AdvancedGrid.d.ts.map +1 -1
- package/dist/components/AdvancedGrid.js +6 -35
- package/dist/components/AnimatedObject.d.ts.map +1 -1
- package/dist/components/AnimatedObject.js +9 -4
- package/dist/components/ApollonianGrid.d.ts +25 -0
- package/dist/components/ApollonianGrid.d.ts.map +1 -0
- package/dist/components/ApollonianGrid.js +55 -0
- package/dist/components/ChladniGrid.d.ts +1 -1
- package/dist/components/ChladniGrid.d.ts.map +1 -1
- package/dist/components/ChladniGrid.js +6 -35
- package/dist/components/CircuitGrid.d.ts +1 -1
- package/dist/components/CircuitGrid.d.ts.map +1 -1
- package/dist/components/CircuitGrid.js +6 -34
- package/dist/components/ConformalGrid.d.ts +25 -0
- package/dist/components/ConformalGrid.d.ts.map +1 -0
- package/dist/components/ConformalGrid.js +66 -0
- package/dist/components/ContourGrid.d.ts +1 -1
- package/dist/components/ContourGrid.d.ts.map +1 -1
- package/dist/components/ContourGrid.js +6 -34
- package/dist/components/CustomPrimitive.js +1 -1
- package/dist/components/EnvironmentObject.d.ts.map +1 -1
- package/dist/components/EnvironmentObject.js +9 -7
- package/dist/components/FlowNetGrid.d.ts +1 -1
- package/dist/components/FlowNetGrid.d.ts.map +1 -1
- package/dist/components/FlowNetGrid.js +6 -34
- package/dist/components/FractalGrid.d.ts +1 -1
- package/dist/components/FractalGrid.d.ts.map +1 -1
- package/dist/components/FractalGrid.js +6 -37
- package/dist/components/Galaxy.d.ts.map +1 -1
- package/dist/components/Galaxy.js +9 -23
- package/dist/components/GirihGrid.d.ts +1 -1
- package/dist/components/GirihGrid.d.ts.map +1 -1
- package/dist/components/GirihGrid.js +6 -35
- package/dist/components/GravWaveGrid.d.ts +1 -1
- package/dist/components/GravWaveGrid.d.ts.map +1 -1
- package/dist/components/GravWaveGrid.js +6 -35
- package/dist/components/GridsGenerator.d.ts +2 -2
- package/dist/components/GridsGenerator.d.ts.map +1 -1
- package/dist/components/GridsGenerator.js +21 -0
- package/dist/components/HexGrid.d.ts +1 -5
- package/dist/components/HexGrid.d.ts.map +1 -1
- package/dist/components/HexGrid.js +6 -36
- package/dist/components/HilbertGrid.d.ts +25 -0
- package/dist/components/HilbertGrid.d.ts.map +1 -0
- package/dist/components/HilbertGrid.js +66 -0
- package/dist/components/HyperbolicGrid.d.ts +1 -1
- package/dist/components/HyperbolicGrid.d.ts.map +1 -1
- package/dist/components/HyperbolicGrid.js +6 -34
- package/dist/components/LandObject.d.ts +9 -0
- package/dist/components/LandObject.d.ts.map +1 -0
- package/dist/components/LandObject.js +15 -0
- package/dist/components/LensingGrid.d.ts +25 -0
- package/dist/components/LensingGrid.d.ts.map +1 -0
- package/dist/components/LensingGrid.js +55 -0
- package/dist/components/LightsManager.d.ts.map +1 -1
- package/dist/components/LightsManager.js +8 -0
- package/dist/components/ModelBoundary.d.ts +2 -0
- package/dist/components/ModelBoundary.d.ts.map +1 -1
- package/dist/components/ModelBoundary.js +3 -0
- package/dist/components/ModelPrimitive.d.ts.map +1 -1
- package/dist/components/ModelPrimitive.js +6 -0
- package/dist/components/MoireGrid.d.ts +1 -1
- package/dist/components/MoireGrid.d.ts.map +1 -1
- package/dist/components/MoireGrid.js +6 -35
- package/dist/components/MoonDisc.d.ts +11 -0
- package/dist/components/MoonDisc.d.ts.map +1 -0
- package/dist/components/MoonDisc.js +128 -0
- package/dist/components/ObjectNode.d.ts.map +1 -1
- package/dist/components/ObjectNode.js +15 -4
- package/dist/components/ObjectsRenderer.d.ts.map +1 -1
- package/dist/components/ObjectsRenderer.js +7 -5
- package/dist/components/OceanBuilder.d.ts.map +1 -1
- package/dist/components/OceanBuilder.js +2 -0
- package/dist/components/ParastichyGrid.d.ts +25 -0
- package/dist/components/ParastichyGrid.d.ts.map +1 -0
- package/dist/components/ParastichyGrid.js +55 -0
- package/dist/components/PhyllotaxisGrid.d.ts +25 -0
- package/dist/components/PhyllotaxisGrid.d.ts.map +1 -0
- package/dist/components/PhyllotaxisGrid.js +66 -0
- package/dist/components/ProjectLoader.d.ts +5 -3
- package/dist/components/ProjectLoader.d.ts.map +1 -1
- package/dist/components/ProjectLoader.js +6 -3
- package/dist/components/QuasiGrid.d.ts +1 -1
- package/dist/components/QuasiGrid.d.ts.map +1 -1
- package/dist/components/QuasiGrid.js +6 -33
- package/dist/components/RadarGrid.d.ts +1 -1
- package/dist/components/RadarGrid.d.ts.map +1 -1
- package/dist/components/RadarGrid.js +6 -34
- package/dist/components/ReactionDiffusionGrid.d.ts +1 -1
- package/dist/components/ReactionDiffusionGrid.d.ts.map +1 -1
- package/dist/components/ReactionDiffusionGrid.js +6 -35
- package/dist/components/SceneBuilder.d.ts +25 -3
- package/dist/components/SceneBuilder.d.ts.map +1 -1
- package/dist/components/SceneBuilder.js +68 -38
- package/dist/components/SkyController.d.ts +25 -1
- package/dist/components/SkyController.d.ts.map +1 -1
- package/dist/components/SkyController.js +189 -130
- package/dist/components/SkyMesh.d.ts.map +1 -1
- package/dist/components/SkyMesh.js +26 -1
- package/dist/components/SkyStars.d.ts +11 -0
- package/dist/components/SkyStars.d.ts.map +1 -0
- package/dist/components/SkyStars.js +187 -0
- package/dist/components/SkySystem.d.ts +3 -3
- package/dist/components/SkySystem.d.ts.map +1 -1
- package/dist/components/SkySystem.js +8 -2
- package/dist/components/Sun.d.ts +15 -1
- package/dist/components/Sun.d.ts.map +1 -1
- package/dist/components/Sun.js +64 -3
- package/dist/components/SunLight.d.ts +6 -1
- package/dist/components/SunLight.d.ts.map +1 -1
- package/dist/components/SunLight.js +96 -44
- package/dist/components/TerrainBuilder.d.ts.map +1 -1
- package/dist/components/TerrainBuilder.js +2 -0
- package/dist/components/TextGenerator.d.ts +9 -0
- package/dist/components/TextGenerator.d.ts.map +1 -0
- package/dist/components/TextGenerator.js +29 -0
- package/dist/components/TruchetGrid.d.ts +25 -0
- package/dist/components/TruchetGrid.d.ts.map +1 -0
- package/dist/components/TruchetGrid.js +55 -0
- package/dist/components/VoronoiGrid.d.ts +1 -1
- package/dist/components/VoronoiGrid.d.ts.map +1 -1
- package/dist/components/VoronoiGrid.js +6 -33
- package/dist/components/WallpaperGrid.d.ts +1 -1
- package/dist/components/WallpaperGrid.d.ts.map +1 -1
- package/dist/components/WallpaperGrid.js +6 -35
- package/dist/components/environment/Rain.d.ts +15 -0
- package/dist/components/environment/Rain.d.ts.map +1 -0
- package/dist/components/environment/Rain.js +110 -0
- package/dist/components/environment/Rainbow.d.ts +20 -0
- package/dist/components/environment/Rainbow.d.ts.map +1 -0
- package/dist/components/environment/Rainbow.js +974 -0
- package/dist/components/environment/Sandstorm.d.ts +20 -0
- package/dist/components/environment/Sandstorm.d.ts.map +1 -0
- package/dist/components/environment/Sandstorm.js +776 -0
- package/dist/components/environment/Snow.d.ts +20 -0
- package/dist/components/environment/Snow.d.ts.map +1 -0
- package/dist/components/environment/Snow.js +609 -0
- package/dist/components/environment/Thunderstorm.d.ts +20 -0
- package/dist/components/environment/Thunderstorm.d.ts.map +1 -0
- package/dist/components/environment/Thunderstorm.js +731 -0
- package/dist/components/environment/Tornado.d.ts +20 -0
- package/dist/components/environment/Tornado.d.ts.map +1 -0
- package/dist/components/environment/Tornado.js +762 -0
- package/dist/components/environment/index.d.ts +13 -0
- package/dist/components/environment/index.d.ts.map +1 -0
- package/dist/components/environment/index.js +7 -0
- package/dist/components/index.d.ts +24 -10
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +15 -6
- package/dist/components/land/LandPatch.d.ts +15 -0
- package/dist/components/land/LandPatch.d.ts.map +1 -0
- package/dist/components/land/LandPatch.js +170 -0
- package/dist/components/land/index.d.ts +3 -0
- package/dist/components/land/index.d.ts.map +1 -0
- package/dist/components/land/index.js +1 -0
- package/dist/components/space/Earth.d.ts +16 -0
- package/dist/components/space/Earth.d.ts.map +1 -0
- package/dist/components/space/Earth.js +75 -0
- package/dist/components/space/ShootingStar.d.ts +21 -0
- package/dist/components/space/ShootingStar.d.ts.map +1 -0
- package/dist/components/space/ShootingStar.js +101 -0
- package/dist/components/space/ShootingStars.d.ts +16 -0
- package/dist/components/space/ShootingStars.d.ts.map +1 -0
- package/dist/components/space/ShootingStars.js +71 -0
- package/dist/components/space/SolarSystem.d.ts +16 -0
- package/dist/components/space/SolarSystem.d.ts.map +1 -0
- package/dist/components/space/SolarSystem.js +141 -0
- package/dist/components/space/Stars.d.ts +20 -0
- package/dist/components/space/Stars.d.ts.map +1 -0
- package/dist/components/space/Stars.js +160 -0
- package/dist/components/space/index.d.ts +11 -0
- package/dist/components/space/index.d.ts.map +1 -0
- package/dist/components/space/index.js +8 -0
- package/dist/components/terrain/TerrainSurface.d.ts.map +1 -1
- package/dist/components/terrain/TerrainSurface.js +27 -3
- package/dist/components/terrain/types.d.ts +5 -1
- package/dist/components/terrain/types.d.ts.map +1 -1
- package/dist/components/text/BurnAwayText.d.ts +15 -0
- package/dist/components/text/BurnAwayText.d.ts.map +1 -0
- package/dist/components/text/BurnAwayText.js +4 -0
- package/dist/components/text/ChalkboardText.d.ts +15 -0
- package/dist/components/text/ChalkboardText.d.ts.map +1 -0
- package/dist/components/text/ChalkboardText.js +4 -0
- package/dist/components/text/ConstellationText.d.ts +15 -0
- package/dist/components/text/ConstellationText.d.ts.map +1 -0
- package/dist/components/text/ConstellationText.js +4 -0
- package/dist/components/text/EmbroideryText.d.ts +15 -0
- package/dist/components/text/EmbroideryText.d.ts.map +1 -0
- package/dist/components/text/EmbroideryText.js +4 -0
- package/dist/components/text/FourierSketchText.d.ts +15 -0
- package/dist/components/text/FourierSketchText.d.ts.map +1 -0
- package/dist/components/text/FourierSketchText.js +4 -0
- package/dist/components/text/FrostGrowthText.d.ts +15 -0
- package/dist/components/text/FrostGrowthText.d.ts.map +1 -0
- package/dist/components/text/FrostGrowthText.js +4 -0
- package/dist/components/text/HandwritingText.d.ts +15 -0
- package/dist/components/text/HandwritingText.d.ts.map +1 -0
- package/dist/components/text/HandwritingText.js +4 -0
- package/dist/components/text/InkBleedText.d.ts +15 -0
- package/dist/components/text/InkBleedText.d.ts.map +1 -0
- package/dist/components/text/InkBleedText.js +4 -0
- package/dist/components/text/LightPaintingText.d.ts +15 -0
- package/dist/components/text/LightPaintingText.d.ts.map +1 -0
- package/dist/components/text/LightPaintingText.js +4 -0
- package/dist/components/text/LiquidMetalText.d.ts +15 -0
- package/dist/components/text/LiquidMetalText.d.ts.map +1 -0
- package/dist/components/text/LiquidMetalText.js +4 -0
- package/dist/components/text/NeonTubeText.d.ts +15 -0
- package/dist/components/text/NeonTubeText.d.ts.map +1 -0
- package/dist/components/text/NeonTubeText.js +4 -0
- package/dist/components/text/PlasmaDischargeText.d.ts +15 -0
- package/dist/components/text/PlasmaDischargeText.d.ts.map +1 -0
- package/dist/components/text/PlasmaDischargeText.js +4 -0
- package/dist/components/text/TextObjectView.d.ts +12 -0
- package/dist/components/text/TextObjectView.d.ts.map +1 -0
- package/dist/components/text/TextObjectView.js +11 -0
- package/dist/components/text/engine/fieldkit.d.ts +24 -0
- package/dist/components/text/engine/fieldkit.d.ts.map +1 -0
- package/dist/components/text/engine/fieldkit.js +201 -0
- package/dist/components/text/engine/glyphs.d.ts +19 -0
- package/dist/components/text/engine/glyphs.d.ts.map +1 -0
- package/dist/components/text/engine/glyphs.js +269 -0
- package/dist/components/text/engine/looks/burnAway.d.ts +144 -0
- package/dist/components/text/engine/looks/burnAway.d.ts.map +1 -0
- package/dist/components/text/engine/looks/burnAway.js +593 -0
- package/dist/components/text/engine/looks/chalkboard.d.ts +135 -0
- package/dist/components/text/engine/looks/chalkboard.d.ts.map +1 -0
- package/dist/components/text/engine/looks/chalkboard.js +426 -0
- package/dist/components/text/engine/looks/constellation.d.ts +111 -0
- package/dist/components/text/engine/looks/constellation.d.ts.map +1 -0
- package/dist/components/text/engine/looks/constellation.js +496 -0
- package/dist/components/text/engine/looks/embroidery.d.ts +165 -0
- package/dist/components/text/engine/looks/embroidery.d.ts.map +1 -0
- package/dist/components/text/engine/looks/embroidery.js +645 -0
- package/dist/components/text/engine/looks/frostGrowth.d.ts +109 -0
- package/dist/components/text/engine/looks/frostGrowth.d.ts.map +1 -0
- package/dist/components/text/engine/looks/frostGrowth.js +727 -0
- package/dist/components/text/engine/looks/index.d.ts +2 -0
- package/dist/components/text/engine/looks/index.d.ts.map +1 -0
- package/dist/components/text/engine/looks/index.js +48 -0
- package/dist/components/text/engine/looks/inkBleed.d.ts +103 -0
- package/dist/components/text/engine/looks/inkBleed.d.ts.map +1 -0
- package/dist/components/text/engine/looks/inkBleed.js +590 -0
- package/dist/components/text/engine/looks/lightPainting.d.ts +132 -0
- package/dist/components/text/engine/looks/lightPainting.d.ts.map +1 -0
- package/dist/components/text/engine/looks/lightPainting.js +567 -0
- package/dist/components/text/engine/looks/liquidMetal.d.ts +135 -0
- package/dist/components/text/engine/looks/liquidMetal.d.ts.map +1 -0
- package/dist/components/text/engine/looks/liquidMetal.js +655 -0
- package/dist/components/text/engine/looks/plasmaDischarge.d.ts +126 -0
- package/dist/components/text/engine/looks/plasmaDischarge.d.ts.map +1 -0
- package/dist/components/text/engine/looks/plasmaDischarge.js +763 -0
- package/dist/components/text/engine/methods.d.ts +19 -0
- package/dist/components/text/engine/methods.d.ts.map +1 -0
- package/dist/components/text/engine/methods.js +126 -0
- package/dist/components/text/engine/playback.d.ts +40 -0
- package/dist/components/text/engine/playback.d.ts.map +1 -0
- package/dist/components/text/engine/playback.js +114 -0
- package/dist/components/text/engine/ribbon.d.ts +58 -0
- package/dist/components/text/engine/ribbon.d.ts.map +1 -0
- package/dist/components/text/engine/ribbon.js +250 -0
- package/dist/components/text/engine/variants.d.ts +159 -0
- package/dist/components/text/engine/variants.d.ts.map +1 -0
- package/dist/components/text/engine/variants.js +378 -0
- package/dist/components/text/fonts/architects-daughter.outline.d.ts +3 -0
- package/dist/components/text/fonts/architects-daughter.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/architects-daughter.outline.js +4 -0
- package/dist/components/text/fonts/architects-daughter.strokes.d.ts +3 -0
- package/dist/components/text/fonts/architects-daughter.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/architects-daughter.strokes.js +4 -0
- package/dist/components/text/fonts/caveat.outline.d.ts +3 -0
- package/dist/components/text/fonts/caveat.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/caveat.outline.js +4 -0
- package/dist/components/text/fonts/caveat.strokes.d.ts +3 -0
- package/dist/components/text/fonts/caveat.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/caveat.strokes.js +4 -0
- package/dist/components/text/fonts/courgette.outline.d.ts +3 -0
- package/dist/components/text/fonts/courgette.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/courgette.outline.js +4 -0
- package/dist/components/text/fonts/courgette.strokes.d.ts +3 -0
- package/dist/components/text/fonts/courgette.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/courgette.strokes.js +4 -0
- package/dist/components/text/fonts/dancing-script.outline.d.ts +3 -0
- package/dist/components/text/fonts/dancing-script.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/dancing-script.outline.js +4 -0
- package/dist/components/text/fonts/dancing-script.strokes.d.ts +3 -0
- package/dist/components/text/fonts/dancing-script.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/dancing-script.strokes.js +4 -0
- package/dist/components/text/fonts/gochi-hand.outline.d.ts +3 -0
- package/dist/components/text/fonts/gochi-hand.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/gochi-hand.outline.js +4 -0
- package/dist/components/text/fonts/gochi-hand.strokes.d.ts +3 -0
- package/dist/components/text/fonts/gochi-hand.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/gochi-hand.strokes.js +4 -0
- package/dist/components/text/fonts/handlee.outline.d.ts +3 -0
- package/dist/components/text/fonts/handlee.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/handlee.outline.js +4 -0
- package/dist/components/text/fonts/handlee.strokes.d.ts +3 -0
- package/dist/components/text/fonts/handlee.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/handlee.strokes.js +4 -0
- package/dist/components/text/fonts/index.d.ts +5 -0
- package/dist/components/text/fonts/index.d.ts.map +1 -0
- package/dist/components/text/fonts/index.js +44 -0
- package/dist/components/text/fonts/indie-flower.outline.d.ts +3 -0
- package/dist/components/text/fonts/indie-flower.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/indie-flower.outline.js +4 -0
- package/dist/components/text/fonts/indie-flower.strokes.d.ts +3 -0
- package/dist/components/text/fonts/indie-flower.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/indie-flower.strokes.js +4 -0
- package/dist/components/text/fonts/kalam.outline.d.ts +3 -0
- package/dist/components/text/fonts/kalam.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/kalam.outline.js +4 -0
- package/dist/components/text/fonts/kalam.strokes.d.ts +3 -0
- package/dist/components/text/fonts/kalam.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/kalam.strokes.js +4 -0
- package/dist/components/text/fonts/kaushan-script.outline.d.ts +3 -0
- package/dist/components/text/fonts/kaushan-script.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/kaushan-script.outline.js +4 -0
- package/dist/components/text/fonts/kaushan-script.strokes.d.ts +3 -0
- package/dist/components/text/fonts/kaushan-script.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/kaushan-script.strokes.js +4 -0
- package/dist/components/text/fonts/mynerve.outline.d.ts +3 -0
- package/dist/components/text/fonts/mynerve.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/mynerve.outline.js +4 -0
- package/dist/components/text/fonts/mynerve.strokes.d.ts +3 -0
- package/dist/components/text/fonts/mynerve.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/mynerve.strokes.js +4 -0
- package/dist/components/text/fonts/nanum-pen-script.outline.d.ts +3 -0
- package/dist/components/text/fonts/nanum-pen-script.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/nanum-pen-script.outline.js +4 -0
- package/dist/components/text/fonts/nanum-pen-script.strokes.d.ts +3 -0
- package/dist/components/text/fonts/nanum-pen-script.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/nanum-pen-script.strokes.js +4 -0
- package/dist/components/text/fonts/pacifico.outline.d.ts +3 -0
- package/dist/components/text/fonts/pacifico.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/pacifico.outline.js +4 -0
- package/dist/components/text/fonts/pacifico.strokes.d.ts +3 -0
- package/dist/components/text/fonts/pacifico.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/pacifico.strokes.js +4 -0
- package/dist/components/text/fonts/patrick-hand.outline.d.ts +3 -0
- package/dist/components/text/fonts/patrick-hand.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/patrick-hand.outline.js +4 -0
- package/dist/components/text/fonts/patrick-hand.strokes.d.ts +3 -0
- package/dist/components/text/fonts/patrick-hand.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/patrick-hand.strokes.js +4 -0
- package/dist/components/text/fonts/poppins.outline.d.ts +3 -0
- package/dist/components/text/fonts/poppins.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/poppins.outline.js +4 -0
- package/dist/components/text/fonts/poppins.strokes.d.ts +3 -0
- package/dist/components/text/fonts/poppins.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/poppins.strokes.js +4 -0
- package/dist/components/text/fonts/satisfy.outline.d.ts +3 -0
- package/dist/components/text/fonts/satisfy.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/satisfy.outline.js +4 -0
- package/dist/components/text/fonts/satisfy.strokes.d.ts +3 -0
- package/dist/components/text/fonts/satisfy.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/satisfy.strokes.js +4 -0
- package/dist/components/text/fonts/sriracha.outline.d.ts +3 -0
- package/dist/components/text/fonts/sriracha.outline.d.ts.map +1 -0
- package/dist/components/text/fonts/sriracha.outline.js +4 -0
- package/dist/components/text/fonts/sriracha.strokes.d.ts +3 -0
- package/dist/components/text/fonts/sriracha.strokes.d.ts.map +1 -0
- package/dist/components/text/fonts/sriracha.strokes.js +4 -0
- package/dist/components/text/index.d.ts +27 -0
- package/dist/components/text/index.d.ts.map +1 -0
- package/dist/components/text/index.js +13 -0
- package/dist/components/text/useTextObject.d.ts +21 -0
- package/dist/components/text/useTextObject.d.ts.map +1 -0
- package/dist/components/text/useTextObject.js +118 -0
- package/dist/components/water/OceanSurface.d.ts.map +1 -1
- package/dist/components/water/OceanSurface.js +3 -1
- package/dist/components/water/WaterBody.d.ts.map +1 -1
- package/dist/components/water/WaterBody.js +3 -1
- package/dist/components/water/types.d.ts +5 -1
- package/dist/components/water/types.d.ts.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +5 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useCloudSun.d.ts +9 -4
- package/dist/hooks/useCloudSun.d.ts.map +1 -1
- package/dist/hooks/useCloudSun.js +17 -7
- package/dist/hooks/useConfigLive.d.ts +3 -2
- package/dist/hooks/useConfigLive.d.ts.map +1 -1
- package/dist/hooks/useContinuousEffects.d.ts.map +1 -1
- package/dist/hooks/useContinuousEffects.js +4 -10
- package/dist/hooks/useEnvironmentProbe.d.ts +3 -22
- package/dist/hooks/useEnvironmentProbe.d.ts.map +1 -1
- package/dist/hooks/useEnvironmentProbe.js +47 -8
- package/dist/hooks/useGridSurface.d.ts +3 -10
- package/dist/hooks/useGridSurface.d.ts.map +1 -1
- package/dist/hooks/useGridSurface.js +5 -31
- package/dist/hooks/useInteraction.d.ts.map +1 -1
- package/dist/hooks/useInteraction.js +19 -72
- package/dist/hooks/useLightConfig.d.ts +2 -1
- package/dist/hooks/useLightConfig.d.ts.map +1 -1
- package/dist/hooks/useOceanMaterial.d.ts +6 -2
- package/dist/hooks/useOceanMaterial.d.ts.map +1 -1
- package/dist/hooks/useOceanMaterial.js +37 -2
- package/dist/hooks/useSkyLive.d.ts +23 -0
- package/dist/hooks/useSkyLive.d.ts.map +1 -0
- package/dist/hooks/useSkyLive.js +30 -0
- package/dist/hooks/useSkyUniforms.d.ts.map +1 -1
- package/dist/hooks/useSkyUniforms.js +2 -10
- package/dist/hooks/useTerrainLive.d.ts +3 -1
- package/dist/hooks/useTerrainLive.d.ts.map +1 -1
- package/dist/hooks/useTerrainTextures.d.ts +38 -0
- package/dist/hooks/useTerrainTextures.d.ts.map +1 -0
- package/dist/hooks/useTerrainTextures.js +149 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/operations/catalogue/blastOff.d.ts +3 -0
- package/dist/operations/catalogue/blastOff.d.ts.map +1 -0
- package/dist/operations/catalogue/blastOff.js +118 -0
- package/dist/operations/catalogue/bounce.d.ts +3 -0
- package/dist/operations/catalogue/bounce.d.ts.map +1 -0
- package/dist/operations/catalogue/bounce.js +34 -0
- package/dist/operations/catalogue/curlSmoke.d.ts.map +1 -1
- package/dist/operations/catalogue/curlSmoke.js +3 -1
- package/dist/operations/catalogue/dissolve.d.ts.map +1 -1
- package/dist/operations/catalogue/dissolve.js +2 -1
- package/dist/operations/catalogue/driftUp.d.ts +3 -0
- package/dist/operations/catalogue/driftUp.d.ts.map +1 -0
- package/dist/operations/catalogue/driftUp.js +57 -0
- package/dist/operations/catalogue/emberAsh.d.ts.map +1 -1
- package/dist/operations/catalogue/emberAsh.js +2 -1
- package/dist/operations/catalogue/flip.d.ts.map +1 -1
- package/dist/operations/catalogue/flip.js +19 -9
- package/dist/operations/catalogue/float.d.ts +3 -0
- package/dist/operations/catalogue/float.d.ts.map +1 -0
- package/dist/operations/catalogue/float.js +39 -0
- package/dist/operations/catalogue/flyBy.d.ts +3 -0
- package/dist/operations/catalogue/flyBy.d.ts.map +1 -0
- package/dist/operations/catalogue/flyBy.js +79 -0
- package/dist/operations/catalogue/frost.d.ts.map +1 -1
- package/dist/operations/catalogue/frost.js +10 -3
- package/dist/operations/catalogue/grow.d.ts +3 -0
- package/dist/operations/catalogue/grow.d.ts.map +1 -0
- package/dist/operations/catalogue/grow.js +19 -0
- package/dist/operations/catalogue/hologram.d.ts.map +1 -1
- package/dist/operations/catalogue/hologram.js +11 -5
- package/dist/operations/catalogue/jelly.d.ts.map +1 -1
- package/dist/operations/catalogue/jelly.js +18 -8
- package/dist/operations/catalogue/knockAway.d.ts +3 -0
- package/dist/operations/catalogue/knockAway.d.ts.map +1 -0
- package/dist/operations/catalogue/knockAway.js +74 -0
- package/dist/operations/catalogue/leafFall.d.ts +3 -0
- package/dist/operations/catalogue/leafFall.d.ts.map +1 -0
- package/dist/operations/catalogue/leafFall.js +74 -0
- package/dist/operations/catalogue/lidarScan.d.ts.map +1 -1
- package/dist/operations/catalogue/lidarScan.js +4 -1
- package/dist/operations/catalogue/metalize.d.ts.map +1 -1
- package/dist/operations/catalogue/metalize.js +8 -2
- package/dist/operations/catalogue/motionTrail.d.ts +6 -0
- package/dist/operations/catalogue/motionTrail.d.ts.map +1 -0
- package/dist/operations/catalogue/motionTrail.js +221 -0
- package/dist/operations/catalogue/petrify.d.ts.map +1 -1
- package/dist/operations/catalogue/petrify.js +9 -3
- package/dist/operations/catalogue/physicalExit.d.ts +55 -0
- package/dist/operations/catalogue/physicalExit.d.ts.map +1 -0
- package/dist/operations/catalogue/physicalExit.js +165 -0
- package/dist/operations/catalogue/physicalHeld.d.ts +41 -0
- package/dist/operations/catalogue/physicalHeld.d.ts.map +1 -0
- package/dist/operations/catalogue/physicalHeld.js +78 -0
- package/dist/operations/catalogue/physicalMix.d.ts +45 -0
- package/dist/operations/catalogue/physicalMix.d.ts.map +1 -0
- package/dist/operations/catalogue/physicalMix.js +144 -0
- package/dist/operations/catalogue/pop.d.ts +3 -0
- package/dist/operations/catalogue/pop.d.ts.map +1 -0
- package/dist/operations/catalogue/pop.js +44 -0
- package/dist/operations/catalogue/print3d.d.ts.map +1 -1
- package/dist/operations/catalogue/print3d.js +5 -1
- package/dist/operations/catalogue/pulse.d.ts +3 -0
- package/dist/operations/catalogue/pulse.d.ts.map +1 -0
- package/dist/operations/catalogue/pulse.js +29 -0
- package/dist/operations/catalogue/restPose.d.ts +5 -7
- package/dist/operations/catalogue/restPose.d.ts.map +1 -1
- package/dist/operations/catalogue/restPose.js +18 -48
- package/dist/operations/catalogue/rotate.d.ts +3 -0
- package/dist/operations/catalogue/rotate.d.ts.map +1 -0
- package/dist/operations/catalogue/rotate.js +49 -0
- package/dist/operations/catalogue/shake.d.ts +3 -0
- package/dist/operations/catalogue/shake.d.ts.map +1 -0
- package/dist/operations/catalogue/shake.js +31 -0
- package/dist/operations/catalogue/shatter.d.ts.map +1 -1
- package/dist/operations/catalogue/shatter.js +5 -1
- package/dist/operations/catalogue/slam.d.ts +3 -0
- package/dist/operations/catalogue/slam.d.ts.map +1 -0
- package/dist/operations/catalogue/slam.js +89 -0
- package/dist/operations/catalogue/slingshot.d.ts +3 -0
- package/dist/operations/catalogue/slingshot.d.ts.map +1 -0
- package/dist/operations/catalogue/slingshot.js +88 -0
- package/dist/operations/catalogue/spin.d.ts.map +1 -1
- package/dist/operations/catalogue/spin.js +24 -13
- package/dist/operations/catalogue/sway.d.ts +3 -0
- package/dist/operations/catalogue/sway.d.ts.map +1 -0
- package/dist/operations/catalogue/sway.js +23 -0
- package/dist/operations/catalogue/swirl.d.ts.map +1 -1
- package/dist/operations/catalogue/swirl.js +6 -5
- package/dist/operations/catalogue/trailCore.d.ts +89 -0
- package/dist/operations/catalogue/trailCore.d.ts.map +1 -0
- package/dist/operations/catalogue/trailCore.js +190 -0
- package/dist/operations/catalogue/trailGhosts.d.ts +5 -0
- package/dist/operations/catalogue/trailGhosts.d.ts.map +1 -0
- package/dist/operations/catalogue/trailGhosts.js +179 -0
- package/dist/operations/catalogue/trailStampStyles.d.ts +11 -0
- package/dist/operations/catalogue/trailStampStyles.d.ts.map +1 -0
- package/dist/operations/catalogue/trailStampStyles.js +479 -0
- package/dist/operations/catalogue/trailStamps.d.ts +57 -0
- package/dist/operations/catalogue/trailStamps.d.ts.map +1 -0
- package/dist/operations/catalogue/trailStamps.js +349 -0
- package/dist/operations/catalogue/trailStreaks.d.ts +3 -0
- package/dist/operations/catalogue/trailStreaks.d.ts.map +1 -0
- package/dist/operations/catalogue/trailStreaks.js +147 -0
- package/dist/operations/catalogue/transitionField.d.ts +30 -0
- package/dist/operations/catalogue/transitionField.d.ts.map +1 -1
- package/dist/operations/catalogue/transitionField.js +21 -0
- package/dist/operations/catalogue/turnAway.d.ts +3 -0
- package/dist/operations/catalogue/turnAway.d.ts.map +1 -0
- package/dist/operations/catalogue/turnAway.js +54 -0
- package/dist/operations/catalogue/vortexDrain.d.ts +3 -0
- package/dist/operations/catalogue/vortexDrain.d.ts.map +1 -0
- package/dist/operations/catalogue/vortexDrain.js +68 -0
- package/dist/operations/catalogue/warp.d.ts +3 -0
- package/dist/operations/catalogue/warp.d.ts.map +1 -0
- package/dist/operations/catalogue/warp.js +73 -0
- package/dist/operations/catalogue/whoosh.d.ts +3 -0
- package/dist/operations/catalogue/whoosh.d.ts.map +1 -0
- package/dist/operations/catalogue/whoosh.js +84 -0
- package/dist/operations/catalogue/wobble.d.ts +3 -0
- package/dist/operations/catalogue/wobble.d.ts.map +1 -0
- package/dist/operations/catalogue/wobble.js +23 -0
- package/dist/operations/clipPreview.d.ts +3 -0
- package/dist/operations/clipPreview.d.ts.map +1 -0
- package/dist/operations/clipPreview.js +20 -0
- package/dist/operations/groupFanout.d.ts +96 -0
- package/dist/operations/groupFanout.d.ts.map +1 -0
- package/dist/operations/groupFanout.js +365 -0
- package/dist/operations/groups.d.ts +20 -0
- package/dist/operations/groups.d.ts.map +1 -0
- package/dist/operations/groups.js +66 -0
- package/dist/operations/index.d.ts +5 -2
- package/dist/operations/index.d.ts.map +1 -1
- package/dist/operations/index.js +5 -2
- package/dist/operations/objectEffects.d.ts +161 -6
- package/dist/operations/objectEffects.d.ts.map +1 -1
- package/dist/operations/objectEffects.js +1091 -17
- package/dist/operations/registry.d.ts.map +1 -1
- package/dist/operations/registry.js +24 -2
- package/dist/operations/runtime.d.ts +57 -2
- package/dist/operations/runtime.d.ts.map +1 -1
- package/dist/operations/runtime.js +161 -18
- package/dist/operations/types.d.ts +60 -3
- package/dist/operations/types.d.ts.map +1 -1
- package/dist/operations/types.js +5 -1
- package/dist/operations/useObjectEffectLayers.d.ts +2 -2
- package/dist/operations/useObjectEffectLayers.d.ts.map +1 -1
- package/dist/operations/useObjectEffectLayers.js +31 -10
- package/dist/operations/usePresentedVisibility.d.ts +10 -0
- package/dist/operations/usePresentedVisibility.d.ts.map +1 -0
- package/dist/operations/usePresentedVisibility.js +53 -0
- package/dist/presets/terrainBiomes.d.ts +67 -0
- package/dist/presets/terrainBiomes.d.ts.map +1 -0
- package/dist/presets/terrainBiomes.js +294 -0
- package/dist/presets/terrainPresets.d.ts +6 -0
- package/dist/presets/terrainPresets.d.ts.map +1 -1
- package/dist/presets/terrainPresets.js +26 -38
- package/dist/shaders/glsl/oceanCore.glsl.d.ts +2 -2
- package/dist/shaders/glsl/oceanCore.glsl.d.ts.map +1 -1
- package/dist/shaders/glsl/oceanCore.glsl.js +17 -0
- package/dist/shaders/glsl/surfaceCore.glsl.d.ts +21 -0
- package/dist/shaders/glsl/surfaceCore.glsl.d.ts.map +1 -0
- package/dist/shaders/glsl/surfaceCore.glsl.js +120 -0
- package/dist/shaders/glsl/terrainCore.glsl.d.ts +16 -3
- package/dist/shaders/glsl/terrainCore.glsl.d.ts.map +1 -1
- package/dist/shaders/glsl/terrainCore.glsl.js +266 -20
- package/dist/shaders/ocean/OceanSurfaceMaterial.d.ts +2 -0
- package/dist/shaders/ocean/OceanSurfaceMaterial.d.ts.map +1 -1
- package/dist/shaders/ocean/OceanSurfaceMaterial.js +3 -0
- package/dist/shaders/terrain/TerrainMaterial.d.ts +17 -0
- package/dist/shaders/terrain/TerrainMaterial.d.ts.map +1 -1
- package/dist/shaders/terrain/TerrainMaterial.js +107 -8
- package/dist/triggers/engine.d.ts +44 -0
- package/dist/triggers/engine.d.ts.map +1 -0
- package/dist/triggers/engine.js +165 -0
- package/dist/triggers/hosts/actions.d.ts +8 -0
- package/dist/triggers/hosts/actions.d.ts.map +1 -0
- package/dist/triggers/hosts/actions.js +22 -0
- package/dist/triggers/hosts/interactions.d.ts +6 -0
- package/dist/triggers/hosts/interactions.d.ts.map +1 -0
- package/dist/triggers/hosts/interactions.js +4 -0
- package/dist/triggers/hosts/timelineCues.d.ts +2 -0
- package/dist/triggers/hosts/timelineCues.d.ts.map +1 -0
- package/dist/triggers/hosts/timelineCues.js +22 -0
- package/dist/triggers/index.d.ts +13 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +9 -0
- package/dist/triggers/kinds/action.d.ts +2 -0
- package/dist/triggers/kinds/action.d.ts.map +1 -0
- package/dist/triggers/kinds/action.js +31 -0
- package/dist/triggers/kinds/animations.d.ts +2 -0
- package/dist/triggers/kinds/animations.d.ts.map +1 -0
- package/dist/triggers/kinds/animations.js +75 -0
- package/dist/triggers/kinds/effects.d.ts +2 -0
- package/dist/triggers/kinds/effects.d.ts.map +1 -0
- package/dist/triggers/kinds/effects.js +27 -0
- package/dist/triggers/kinds/index.d.ts +4 -0
- package/dist/triggers/kinds/index.d.ts.map +1 -0
- package/dist/triggers/kinds/index.js +4 -0
- package/dist/triggers/log.d.ts +21 -0
- package/dist/triggers/log.d.ts.map +1 -0
- package/dist/triggers/log.js +43 -0
- package/dist/triggers/readiness.d.ts +40 -0
- package/dist/triggers/readiness.d.ts.map +1 -0
- package/dist/triggers/readiness.js +158 -0
- package/dist/triggers/registry.d.ts +41 -0
- package/dist/triggers/registry.d.ts.map +1 -0
- package/dist/triggers/registry.js +7 -0
- package/dist/types/gridConfigs.d.ts +117 -19
- package/dist/types/gridConfigs.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/UiAnchorUpdater.d.ts +10 -0
- package/dist/ui/UiAnchorUpdater.d.ts.map +1 -0
- package/dist/ui/UiAnchorUpdater.js +111 -0
- package/dist/ui/UiLayers.d.ts +20 -0
- package/dist/ui/UiLayers.d.ts.map +1 -0
- package/dist/ui/UiLayers.js +57 -0
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +6 -0
- package/dist/ui/uiAnchors.d.ts +21 -0
- package/dist/ui/uiAnchors.d.ts.map +1 -0
- package/dist/ui/uiAnchors.js +22 -0
- package/dist/ui/uiBaseStyles.d.ts +2 -0
- package/dist/ui/uiBaseStyles.d.ts.map +1 -0
- package/dist/ui/uiBaseStyles.js +100 -0
- package/dist/ui/uiBinder.d.ts +30 -0
- package/dist/ui/uiBinder.d.ts.map +1 -0
- package/dist/ui/uiBinder.js +344 -0
- package/dist/utils/configAnimations.d.ts.map +1 -1
- package/dist/utils/configAnimations.js +5 -1
- package/dist/utils/gridConfig.d.ts +1 -1
- package/dist/utils/gridConfig.d.ts.map +1 -1
- package/dist/utils/gridConfig.js +1 -1
- package/dist/utils/landPatch.d.ts +33 -0
- package/dist/utils/landPatch.d.ts.map +1 -0
- package/dist/utils/landPatch.js +114 -0
- package/dist/utils/renderedSky.d.ts +32 -0
- package/dist/utils/renderedSky.d.ts.map +1 -0
- package/dist/utils/renderedSky.js +57 -0
- package/dist/utils/skyMoon.d.ts +35 -0
- package/dist/utils/skyMoon.d.ts.map +1 -0
- package/dist/utils/skyMoon.js +41 -0
- package/dist/utils/terrainHeight.d.ts +4 -0
- package/dist/utils/terrainHeight.d.ts.map +1 -0
- package/dist/utils/terrainHeight.js +150 -0
- package/dist/utils/terrainTextureResolver.d.ts +18 -0
- package/dist/utils/terrainTextureResolver.d.ts.map +1 -0
- package/dist/utils/terrainTextureResolver.js +17 -0
- package/dist/utils/terrainUniforms.d.ts +17 -0
- package/dist/utils/terrainUniforms.d.ts.map +1 -1
- package/dist/utils/terrainUniforms.js +84 -0
- package/dist/utils/textureArrays.d.ts +29 -0
- package/dist/utils/textureArrays.d.ts.map +1 -0
- package/dist/utils/textureArrays.js +140 -0
- package/package.json +2 -2
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { buildCapsules, setReveal, REVEAL_UNIFORMS, uniformsBase, frag } from '../ribbon.js';
|
|
3
|
+
import { prepare, applyAnim, extentOf, DRAW_METHODS, ERASE_METHODS } from '../methods.js';
|
|
4
|
+
// =========================================================================================
|
|
5
|
+
// lightPainting - a long-exposure photograph of someone writing in the dark with a small light.
|
|
6
|
+
//
|
|
7
|
+
// THE MATHS
|
|
8
|
+
// * The pen tip is a moving point source. A camera shutter that stays open integrates its light: the exposure a trail
|
|
9
|
+
// point receives is H = L * dwell with dwell = ds / speed (time the tip spent over that bit of path), so
|
|
10
|
+
// brightness ~ 1/speed. Speed comes from the same 2/3 power-law pen timing the pen draw method uses (slow in tight
|
|
11
|
+
// curves) and is further slowed at stroke starts / ends (the hand dwells there), so those become bright blobs.
|
|
12
|
+
// The CPU rewrites the pen clock from that speed (s.pt / s.ptime), so what you see the tip do and what the trail
|
|
13
|
+
// recorded are the same quantity: exposure e = (1/speed) / median(1/speed).
|
|
14
|
+
// * Film does not add linearly forever: it saturates per channel out_c = peak * (1 - exp(-K * H * tint_c)).
|
|
15
|
+
// Heavy exposure therefore clips towards WHITE in the core while the thin halo keeps its hue - the typical
|
|
16
|
+
// blown-out centre / coloured fringe of light painting - with no hand-made colour tricks. peak < 1 keeps every
|
|
17
|
+
// sustained pixel below 1.0; only the tip bloom may exceed it.
|
|
18
|
+
// * Colour from temperature: tint = ramp(colour2 -> colour, h) * blackbody(Tk) / blackbody(6500K), with the source
|
|
19
|
+
// temperature Tk = T * (1 + 0.85 h) and h = exp(-age/tau) (age = seconds since the tip passed). A fresh trail
|
|
20
|
+
// is hot (near white), then cools to the resting colour of the 'photo'. Brightness decays gently with the same age
|
|
21
|
+
// and settles on a held level.
|
|
22
|
+
// * Sparkler: closed-form ballistic sparks. Spark i of slot s is born at progress g_e = (e + jitter)/R at the pen
|
|
23
|
+
// position P(g_e) (a CPU path lookup built from the strokes' schedule seg / t, baked into a float texture, one row
|
|
24
|
+
// per concurrently active pen), and then p(a) = o + (v0 - vinf)(1 - e^(-k a))/k + vinf a (linear drag k, gravity
|
|
25
|
+
// giving terminal velocity vinf), a = age. Drawn as a short additive streak along v(a), cooling white -> orange ->
|
|
26
|
+
// red by blackbody. No state: everything is a function of (head progress, seconds since).
|
|
27
|
+
// =========================================================================================
|
|
28
|
+
const hex = (h) => new THREE.Color(h);
|
|
29
|
+
const clamp = (x, a, b) => Math.max(a, Math.min(b, x));
|
|
30
|
+
const MAX_ROWS = 10, TIP_BINS = 4096, MAX_SPARKS = 2000;
|
|
31
|
+
// ---- exposure: rewrite pen timing with dwell at stroke ends, derive e = 1/speed -----------------
|
|
32
|
+
function shapeExposure(strokes) {
|
|
33
|
+
const all = [];
|
|
34
|
+
for (const s of strokes) {
|
|
35
|
+
const n = s.pts.length / 2;
|
|
36
|
+
const sp = new Float32Array(n);
|
|
37
|
+
const vv = new Float32Array(n);
|
|
38
|
+
const P = s.ptime || 1;
|
|
39
|
+
for (let i = 0; i < n - 1; i++) {
|
|
40
|
+
const dt = Math.max(1e-7, (s.pt[i + 1] - s.pt[i]) * P);
|
|
41
|
+
sp[i] = (s.cum[i + 1] - s.cum[i]) / dt;
|
|
42
|
+
}
|
|
43
|
+
for (let i = 0; i < n; i++)
|
|
44
|
+
vv[i] = n > 1 ? 0.5 * (sp[Math.max(0, i - 1)] + sp[Math.min(n - 2, i)]) : 1;
|
|
45
|
+
let vmean = 0;
|
|
46
|
+
for (let i = 0; i < n; i++)
|
|
47
|
+
vmean += vv[i];
|
|
48
|
+
vmean = vmean / n || 1;
|
|
49
|
+
const t = new Float32Array(n);
|
|
50
|
+
const e = new Float32Array(n);
|
|
51
|
+
for (let i = 0; i < n; i++) {
|
|
52
|
+
const x = Math.min(s.cum[i], s.len - s.cum[i]) / 0.05;
|
|
53
|
+
const q = clamp(x, 0, 1);
|
|
54
|
+
const k = 0.4 + 0.6 * q * q * (3 - 2 * q); // hand dwells at stroke ends
|
|
55
|
+
vv[i] = Math.max(1e-4, (vv[i] / vmean) * k);
|
|
56
|
+
}
|
|
57
|
+
for (let i = 1; i < n; i++)
|
|
58
|
+
t[i] = t[i - 1] + (s.cum[i] - s.cum[i - 1]) / Math.max(1e-6, 0.5 * (vv[i] + vv[i - 1]));
|
|
59
|
+
const T = Math.max(1e-6, t[n - 1]);
|
|
60
|
+
for (let i = 0; i < n; i++) {
|
|
61
|
+
s.pt[i] = t[i] / T;
|
|
62
|
+
e[i] = 1 / vv[i];
|
|
63
|
+
}
|
|
64
|
+
s.pt = Float32Array.from(s.pt);
|
|
65
|
+
s.ptime = T;
|
|
66
|
+
s._e = e;
|
|
67
|
+
for (let i = 0; i < n; i++)
|
|
68
|
+
all.push(e[i]);
|
|
69
|
+
}
|
|
70
|
+
all.sort((a, b) => a - b);
|
|
71
|
+
const med = all[Math.floor(all.length / 2)] || 1;
|
|
72
|
+
for (const s of strokes) {
|
|
73
|
+
const n = s._e.length;
|
|
74
|
+
let a = s._e;
|
|
75
|
+
for (let i = 0; i < n; i++)
|
|
76
|
+
a[i] = clamp(Math.pow(a[i] / med, 2.0), 0.25, 2.8);
|
|
77
|
+
for (let pass = 0; pass < 2; pass++) {
|
|
78
|
+
const q = new Float32Array(n);
|
|
79
|
+
for (let i = 0; i < n; i++) {
|
|
80
|
+
let m = 0, c = 0;
|
|
81
|
+
for (let j = Math.max(0, i - 3); j <= Math.min(n - 1, i + 3); j++) {
|
|
82
|
+
m += a[j];
|
|
83
|
+
c++;
|
|
84
|
+
}
|
|
85
|
+
q[i] = m / c;
|
|
86
|
+
}
|
|
87
|
+
a = q;
|
|
88
|
+
}
|
|
89
|
+
s.pressure = a;
|
|
90
|
+
delete s._e;
|
|
91
|
+
}
|
|
92
|
+
// total pen time is rescaled so the sum of all strokes keeps the schedule proportions (pen method uses s.ptime)
|
|
93
|
+
}
|
|
94
|
+
// ---- pen clock (same proportions as the 'pen' draw method, independent of the chosen method) ------
|
|
95
|
+
// gives every point a time in seconds (tsec, for tremor) and a strobe phase in pulse cycles (cyc)
|
|
96
|
+
function penClock(strokes, dur) {
|
|
97
|
+
const avg = strokes.reduce((a, s) => a + s.ptime, 0) / Math.max(1, strokes.length), gap = 0.2 * avg;
|
|
98
|
+
const total = strokes.reduce((a, s) => a + s.ptime + gap, 0) || 1;
|
|
99
|
+
const len = strokes.reduce((a, s) => a + s.len, 0);
|
|
100
|
+
const ksec = Math.max(0.5, dur) / total, kcyc = (len / 0.06) / total;
|
|
101
|
+
let c = 0;
|
|
102
|
+
for (const s of strokes) {
|
|
103
|
+
const n = s.pts.length / 2;
|
|
104
|
+
s.tsec = new Float32Array(n);
|
|
105
|
+
s.cyc = new Float32Array(n);
|
|
106
|
+
for (let i = 0; i < n; i++) {
|
|
107
|
+
const tp = c + s.pt[i] * s.ptime;
|
|
108
|
+
s.tsec[i] = tp * ksec;
|
|
109
|
+
s.cyc[i] = tp * kcyc;
|
|
110
|
+
}
|
|
111
|
+
c += s.ptime + gap;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// physiological hand tremor: band-limited (8-12 Hz) noise in pen time, smaller where the pen is slow. Local deviation of the
|
|
115
|
+
// trail path only (baked, deterministic) - never a transform of the text.
|
|
116
|
+
function applyTremor(strokes, amount) {
|
|
117
|
+
if (amount <= 0)
|
|
118
|
+
return;
|
|
119
|
+
const A = 0.008 * amount;
|
|
120
|
+
strokes.forEach((s, si) => {
|
|
121
|
+
const n = s.pts.length / 2;
|
|
122
|
+
const P = s.pts;
|
|
123
|
+
const out = new Float32Array(P.length);
|
|
124
|
+
const hs = (a, b) => { const x = Math.sin((si * 97 + a) * 127.1 + b * 311.7) * 43758.5453; return x - Math.floor(x); };
|
|
125
|
+
const F = [], PH = [], PT = [];
|
|
126
|
+
for (let j = 0; j < 5; j++) {
|
|
127
|
+
F.push(8 + 4 * hs(j, 1));
|
|
128
|
+
PH.push(6.2831 * hs(j, 2));
|
|
129
|
+
PT.push(6.2831 * hs(j, 3));
|
|
130
|
+
}
|
|
131
|
+
const env0 = 6.2831 * hs(9, 4);
|
|
132
|
+
for (let i = 0; i < n; i++) {
|
|
133
|
+
const a = Math.max(0, i - 1), b = Math.min(n - 1, i + 1);
|
|
134
|
+
let tx = P[2 * b] - P[2 * a], ty = P[2 * b + 1] - P[2 * a + 1];
|
|
135
|
+
const tl = Math.hypot(tx, ty) || 1;
|
|
136
|
+
tx /= tl;
|
|
137
|
+
ty /= tl;
|
|
138
|
+
const dt = Math.max(1e-4, (s.tsec[b] - s.tsec[a]));
|
|
139
|
+
const v = tl / dt; // em / s
|
|
140
|
+
const q = clamp((v - 0.1) / 0.9, 0, 1);
|
|
141
|
+
const w = 0.12 + 0.88 * q * q * (3 - 2 * q);
|
|
142
|
+
const t = s.tsec[i];
|
|
143
|
+
let dn = 0, dtn = 0;
|
|
144
|
+
for (let j = 0; j < 5; j++) {
|
|
145
|
+
dn += Math.sin(6.2831 * F[j] * t + PH[j]);
|
|
146
|
+
dtn += Math.sin(6.2831 * F[j] * t + PT[j]);
|
|
147
|
+
}
|
|
148
|
+
const env = 0.65 + 0.35 * Math.sin(6.2831 * 0.8 * t + env0);
|
|
149
|
+
const k = A * w * env / Math.sqrt(5);
|
|
150
|
+
out[2 * i] = P[2 * i] + (-ty * dn + tx * dtn * 0.3) * k;
|
|
151
|
+
out[2 * i + 1] = P[2 * i + 1] + (tx * dn + ty * dtn * 0.3) * k;
|
|
152
|
+
}
|
|
153
|
+
s.pts = out;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// ---- CPU path-position lookup from the schedule (seg window + per-point t) ------------------------
|
|
157
|
+
function packRows(strokes) {
|
|
158
|
+
const order = strokes.slice().sort((a, b) => a.seg[0] - b.seg[0]);
|
|
159
|
+
const rows = [];
|
|
160
|
+
for (const s of order) {
|
|
161
|
+
let r = rows.find((row) => row[row.length - 1].seg[1] <= s.seg[0] + 1e-9);
|
|
162
|
+
if (!r) {
|
|
163
|
+
if (rows.length >= MAX_ROWS)
|
|
164
|
+
continue;
|
|
165
|
+
r = [];
|
|
166
|
+
rows.push(r);
|
|
167
|
+
}
|
|
168
|
+
r.push(s);
|
|
169
|
+
}
|
|
170
|
+
return rows;
|
|
171
|
+
}
|
|
172
|
+
// tip of pen row `r` at global progress g -> out = [x, y, fade, exposure]; returns false when the pen is not down
|
|
173
|
+
function tipAt(rows, r, g, out) {
|
|
174
|
+
const row = rows[r];
|
|
175
|
+
let lo = 0, hi = row.length - 1;
|
|
176
|
+
while (lo < hi) {
|
|
177
|
+
const m = (lo + hi + 1) >> 1;
|
|
178
|
+
if (row[m].seg[0] <= g)
|
|
179
|
+
lo = m;
|
|
180
|
+
else
|
|
181
|
+
hi = m - 1;
|
|
182
|
+
}
|
|
183
|
+
const s = row[lo];
|
|
184
|
+
if (g < s.seg[0] || g > s.seg[1])
|
|
185
|
+
return false;
|
|
186
|
+
const span = Math.max(1e-6, s.seg[1] - s.seg[0]);
|
|
187
|
+
const u = (g - s.seg[0]) / span;
|
|
188
|
+
const n = s.pts.length / 2;
|
|
189
|
+
const T = s.t;
|
|
190
|
+
let a = 0, b = n - 1;
|
|
191
|
+
while (b - a > 1) {
|
|
192
|
+
const m = (a + b) >> 1;
|
|
193
|
+
if (T[m] <= u)
|
|
194
|
+
a = m;
|
|
195
|
+
else
|
|
196
|
+
b = m;
|
|
197
|
+
}
|
|
198
|
+
const f = clamp((u - T[a]) / Math.max(1e-9, T[b] - T[a]), 0, 1);
|
|
199
|
+
out[0] = s.pts[2 * a] + (s.pts[2 * b] - s.pts[2 * a]) * f;
|
|
200
|
+
out[1] = s.pts[2 * a + 1] + (s.pts[2 * b + 1] - s.pts[2 * a + 1]) * f;
|
|
201
|
+
out[2] = Math.min(1, u / 0.04, (1 - u) / 0.04);
|
|
202
|
+
out[3] = s.pressure[a] + (s.pressure[b] - s.pressure[a]) * f;
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
// ---- shared GLSL ------------------------------------------------------------------------------
|
|
206
|
+
const GLSL_BB = /* glsl */ `
|
|
207
|
+
// blackbody colour (Tanner Helland fit, sRGB) -> linear
|
|
208
|
+
vec3 bbLin(float T){
|
|
209
|
+
float t = clamp(T, 1000.0, 12000.0)/100.0; vec3 c;
|
|
210
|
+
c.r = t <= 66.0 ? 1.0 : 1.29293*pow(max(t - 60.0, 1e-3), -0.1332);
|
|
211
|
+
c.g = t <= 66.0 ? 0.390083*log(t) - 0.631841 : 1.129891*pow(max(t - 60.0, 1e-3), -0.0755);
|
|
212
|
+
c.b = t >= 66.0 ? 1.0 : (t <= 19.0 ? 0.0 : 0.543205*log(max(t - 10.0, 1e-3)) - 1.196254);
|
|
213
|
+
return pow(clamp(c, 0.0, 1.0), vec3(2.2));
|
|
214
|
+
}
|
|
215
|
+
vec3 bbRel(float T){ return bbLin(T)/bbLin(6500.0); }
|
|
216
|
+
`;
|
|
217
|
+
const VARYINGS = /* glsl */ `
|
|
218
|
+
varying float vSide; varying vec2 vUU; varying vec4 vTT; varying vec2 vLL; varying vec2 vSI; varying float vVar; varying float vGlyph; varying float vSeed; varying vec2 vPos;
|
|
219
|
+
`;
|
|
220
|
+
// ---- trail: capsule field (MAX blended = exact function of the distance to the polyline) -----------
|
|
221
|
+
const TRAIL_VERT = /* glsl */ `
|
|
222
|
+
attribute vec2 aq; attribute vec2 iA; attribute vec2 iB; attribute vec2 iT; attribute vec2 iTO; attribute vec2 iArc; attribute float iLen;
|
|
223
|
+
attribute vec2 iSeg; attribute vec2 iSegO; attribute vec2 iVar; attribute vec2 iPC;
|
|
224
|
+
${REVEAL_UNIFORMS}${VARYINGS}
|
|
225
|
+
varying vec2 vXY; varying float vHL; varying float vLen; varying vec2 vPC; varying float vSpacing;
|
|
226
|
+
void main(){
|
|
227
|
+
vec2 d = iB - iA; float l = max(length(d), 1e-6); vec2 dir = d / l; vec2 perp = vec2(-dir.y, dir.x);
|
|
228
|
+
float hl = 0.5*l; float R = uHalf;
|
|
229
|
+
vec2 loc = vec2(aq.x*(hl + R), aq.y*R);
|
|
230
|
+
vec2 w = 0.5*(iA + iB) + dir*loc.x + perp*loc.y;
|
|
231
|
+
gl_Position = projectionMatrix*modelViewMatrix*vec4(w, 0.0, 1.0);
|
|
232
|
+
float sp = max(iSeg.y - iSeg.x, 1e-4), so = max(iSegO.y - iSegO.x, 1e-4);
|
|
233
|
+
vXY = loc; vHL = hl; vLen = iLen; vPC = iPC; vSpacing = min(l/max(iPC.y - iPC.x, 1e-6), 0.6); vSide = 0.0; vVar = iVar.x; vGlyph = iVar.y; vPos = w;
|
|
234
|
+
vTT = vec4(iT, iTO); vUU = iArc / iLen; vSI = vec2(iSeg.x, sp);
|
|
235
|
+
vLL = vec2((uHead - iSeg.x)/sp, (uErase - iSegO.x)/so);
|
|
236
|
+
vSeed = iSeg.x*91.7 + iVar.y*13.1;
|
|
237
|
+
}`;
|
|
238
|
+
const TRAIL_FRAG = /* glsl */ `
|
|
239
|
+
uniform vec3 uColor; uniform vec3 uColor2; uniform float uOpacity; uniform float uExposure; uniform float uTemp; uniform float uWidth; uniform float uStrobe; uniform float uHalation;
|
|
240
|
+
varying vec2 vXY; varying float vHL; varying float vLen; varying vec2 vPC; varying float vSpacing;
|
|
241
|
+
${GLSL_BB}
|
|
242
|
+
float vn(vec2 p){ vec2 i = floor(p); vec2 f = fract(p); f = f*f*(3.0 - 2.0*f);
|
|
243
|
+
return mix(mix(h21(i), h21(i + vec2(1.0, 0.0)), f.x), mix(h21(i + vec2(0.0, 1.0)), h21(i + vec2(1.0, 1.0)), f.x), f.y); }
|
|
244
|
+
void main(){
|
|
245
|
+
float dd = length(vec2(max(abs(vXY.x) - vHL, 0.0), vXY.y));
|
|
246
|
+
float fwd = max(fwidth(dd), 1e-5); // derivatives before any discard
|
|
247
|
+
float lat = vXY.y;
|
|
248
|
+
float f = clamp((vXY.x + vHL)/(2.0*max(vHL, 1e-6)), 0.0, 1.0);
|
|
249
|
+
float sAbs = mix(vUU.x, vUU.y, f)*vLen; float uArc = mix(vUU.x, vUU.y, f);
|
|
250
|
+
float fwl = fwidth(lat);
|
|
251
|
+
float inR = revealIn(f);
|
|
252
|
+
float age = ageAt(f);
|
|
253
|
+
float e = clamp(vVar, 0.3, 3.5);
|
|
254
|
+
|
|
255
|
+
// --- erase: the trail cools and dims ahead of the erase front (oldest end first)
|
|
256
|
+
float tO = mix(vTT.z, vTT.w, f); float rem = tO - vLL.y;
|
|
257
|
+
float lead = uFadeOut > 0.5 ? 1.0 : smoothstep(0.0, uSoftOut + 0.2, rem);
|
|
258
|
+
float dimF = mix(1.0, lead, smoothstep(0.0, 0.05, uE))*revealOut(f);
|
|
259
|
+
|
|
260
|
+
// --- exposure profile: tight source image + soft scattering tail + faint wide airglow (all sized by the pen dwell)
|
|
261
|
+
float sig = max(uWidth*(0.8 + 0.2*min(e, 1.8)), 0.8*fwd);
|
|
262
|
+
float x = dd/sig;
|
|
263
|
+
float P = 0.92*exp(-0.5*x*x) + 0.05*exp(-0.5*x*x/5.0) + 0.008*sqrt(e)*exp(-0.5*x*x/40.0);
|
|
264
|
+
float edgeF = 1.0 - smoothstep(0.6*uHalf, uHalf, dd);
|
|
265
|
+
P *= edgeF;
|
|
266
|
+
|
|
267
|
+
// --- strobe: the LED pulses at constant pen-clock intervals, so dot spacing = pen speed; slow stretches merge into continuous light
|
|
268
|
+
float ph = fract(mix(vPC.x, vPC.y, f)); float dsd = (ph - 0.5)*vSpacing;
|
|
269
|
+
float mrg = 1.0 - smoothstep(3.0*sig, 6.5*sig, vSpacing);
|
|
270
|
+
float dotA = mix(0.04 + 0.96*exp(-0.5*dsd*dsd/(1.21*sig*sig)), 1.0, mrg);
|
|
271
|
+
float along = mix(1.0, dotA, uStrobe); float boost = mix(1.0, 1.0 + 0.6*(1.0 - mrg), uStrobe);
|
|
272
|
+
|
|
273
|
+
// --- fibre grain of the exposure (film), elongated along the trail; shimmer is slow real time
|
|
274
|
+
float aa = 1.0 - smoothstep(0.35, 0.9, fwl*95.0);
|
|
275
|
+
vec2 gc = vec2(sAbs*22.0, lat*85.0 + vGlyph*17.0);
|
|
276
|
+
float fib = vn(gc)*0.65 + vn(vec2(sAbs*61.0, lat*210.0 + vGlyph*5.0))*0.35*(1.0 - smoothstep(0.3, 0.8, fwl*210.0));
|
|
277
|
+
float tw = 0.5 + 0.5*sin(uTime*0.55*uIdleSpeed + 6.2831*h21(floor(gc)));
|
|
278
|
+
float capK = 1.0 - smoothstep(0.0, 0.012, max(abs(vXY.x) - vHL, 0.0));
|
|
279
|
+
float grain = 1.0 + 0.2*(fib - 0.5)*2.0*(0.55 + 0.45*tw)*aa*capK;
|
|
280
|
+
|
|
281
|
+
// --- a few slow glints drifting along the finished strokes
|
|
282
|
+
float sd = vSeed; float on = step(0.38, h21(vec2(sd, 3.0)));
|
|
283
|
+
float gp = fract(uTime*0.03*uIdleSpeed*(0.6 + 0.8*h21(vec2(sd, 1.0))) + h21(vec2(sd, 2.0)));
|
|
284
|
+
float du = abs(fract(uArc - gp + 0.5) - 0.5)*vLen;
|
|
285
|
+
float env = pow(0.5 + 0.5*sin(uTime*0.11*uIdleSpeed + 6.2831*h21(vec2(sd, 4.0))), 3.0);
|
|
286
|
+
float glint = on*env*exp(-du*du/0.0225 - 0.5*dd*dd/(2.0*sig*sig))*smoothstep(0.8, 2.0, age)*uIdle;
|
|
287
|
+
|
|
288
|
+
// --- film response
|
|
289
|
+
float h = exp(-age/1.0) * dimF;
|
|
290
|
+
h = clamp(h + 0.25*glint, 0.0, 1.0);
|
|
291
|
+
float lvl = 0.62 + 0.38*exp(-age/1.7);
|
|
292
|
+
float H = uExposure*e*lvl*P*grain*(1.0 + 0.5*glint)*dimF*dimF*along*boost;
|
|
293
|
+
// film halation: light scattered in the film base bleeds a wide dim red-orange glow around the strongest exposure
|
|
294
|
+
float Hh = uHalation*0.011*pow(uExposure*lvl, 1.4)*sqrt(e)*exp(-0.5*dd*dd/(18.0*sig*sig))*edgeF*dimF*dimF*mix(1.0, 0.35 + 0.65*along, uStrobe);
|
|
295
|
+
float Tk = uTemp*(1.0 + 0.85*h)*mix(0.6, 1.0, dimF);
|
|
296
|
+
vec3 tint = mix(uColor, uColor2, h)*bbRel(Tk);
|
|
297
|
+
tint /= max(max(tint.r, tint.g), max(tint.b, 1e-3));
|
|
298
|
+
vec3 col = 0.94*(1.0 - exp(-(3.0*H*tint + 3.0*Hh*vec3(1.0, 0.30, 0.08))))*inR*uOpacity;
|
|
299
|
+
if (max(col.r, max(col.g, col.b)) < 0.0015) discard;
|
|
300
|
+
gl_FragColor = vec4(col, 1.0);
|
|
301
|
+
#include <tonemapping_fragment>
|
|
302
|
+
#include <colorspace_fragment>
|
|
303
|
+
}`;
|
|
304
|
+
// ---- pen-tip bloom (additive instanced quad per active pen) ------------------------------------------
|
|
305
|
+
const BLOOM_VERT = /* glsl */ `
|
|
306
|
+
attribute vec2 aq; attribute vec4 iC; uniform float uBloom; uniform float uQ;
|
|
307
|
+
varying vec2 vP; varying vec2 vQ; varying float vA; varying float vE;
|
|
308
|
+
void main(){ float s = 0.5 + 0.5*uBloom; vQ = aq; vP = aq*uQ*s; vA = iC.z; vE = iC.w;
|
|
309
|
+
gl_Position = projectionMatrix*modelViewMatrix*vec4(iC.xy + vP, 0.0, 1.0); }`;
|
|
310
|
+
const BLOOM_FRAG = /* glsl */ `
|
|
311
|
+
precision highp float;
|
|
312
|
+
uniform vec3 uColor; uniform vec3 uColor2; uniform float uOpacity; uniform float uTemp; uniform float uBloom;
|
|
313
|
+
varying vec2 vP; varying vec2 vQ; varying float vA; varying float vE;
|
|
314
|
+
${GLSL_BB}
|
|
315
|
+
void main(){
|
|
316
|
+
float s = 0.5 + 0.5*uBloom; vec2 p = vP/s;
|
|
317
|
+
float fwy = max(fwidth(p.y), fwidth(p.x));
|
|
318
|
+
float r = length(p);
|
|
319
|
+
float core = exp(-pow(r/0.017, 2.0));
|
|
320
|
+
float halo = 0.38/pow(1.0 + pow(r/0.045, 2.0), 1.3);
|
|
321
|
+
float glow = 0.09*exp(-r/0.1);
|
|
322
|
+
float ws = max(0.0045, 1.3*fwy);
|
|
323
|
+
float streak = exp(-abs(p.x)/0.08)*exp(-pow(p.y/ws, 2.0)) + exp(-abs(p.y)/0.08)*exp(-pow(p.x/ws, 2.0));
|
|
324
|
+
float edge = (1.0 - smoothstep(0.55, 1.0, max(abs(vQ.x), abs(vQ.y))))*(1.0 - smoothstep(0.3, 1.0, length(vQ)));
|
|
325
|
+
vec3 hot = bbRel(uTemp*1.9)*uColor2; vec3 warm = bbRel(uTemp*1.25)*uColor;
|
|
326
|
+
hot /= max(max(hot.r, hot.g), max(hot.b, 1e-3)); warm /= max(max(warm.r, warm.g), max(warm.b, 1e-3));
|
|
327
|
+
vec3 col = hot*(core*1.15 + halo*0.7) + warm*(glow + halo*0.5) + mix(hot, warm, 0.5)*streak*0.22;
|
|
328
|
+
col *= edge*vA*uOpacity*uBloom*(0.75 + 0.25*vE);
|
|
329
|
+
gl_FragColor = vec4(col, 1.0);
|
|
330
|
+
#include <tonemapping_fragment>
|
|
331
|
+
#include <colorspace_fragment>
|
|
332
|
+
}`;
|
|
333
|
+
// ---- sparks: closed-form ballistic streaks ---------------------------------------------------------
|
|
334
|
+
const SPARK_VERT = /* glsl */ `
|
|
335
|
+
attribute vec2 aq;
|
|
336
|
+
uniform sampler2D uTip; uniform float uNB; uniform float uJ; uniform float uNs; uniform float uRate; uniform float uSpread; uniform float uTemp;
|
|
337
|
+
uniform float uPx; uniform float uHead; uniform float uDur; uniform float uSince; uniform float uOpacity; uniform float uLife;
|
|
338
|
+
varying vec2 vQ; varying vec3 vCol; varying float vI;
|
|
339
|
+
${GLSL_BB}
|
|
340
|
+
float hh(float a, float b){ return fract(sin(a*127.1 + b*311.7)*43758.5453); }
|
|
341
|
+
void main(){
|
|
342
|
+
vQ = aq; vI = 0.0; vCol = vec3(0.0);
|
|
343
|
+
gl_Position = vec4(2.0, 2.0, 2.0, 1.0);
|
|
344
|
+
float id = float(gl_InstanceID); float J = max(uJ, 1.0); float row = mod(id, J); float slot = floor(id/J);
|
|
345
|
+
float Rg = max(uRate*uDur, 1e-3);
|
|
346
|
+
float m = floor((uHead*Rg - slot)/uNs); if (m < 0.0) return;
|
|
347
|
+
float jit = hh(id, m); float g = (slot + m*uNs + jit)/Rg;
|
|
348
|
+
if (g > uHead) { m -= 1.0; if (m < 0.0) return; jit = hh(id, m); g = (slot + m*uNs + jit)/Rg; }
|
|
349
|
+
float age = (uHead - g)*uDur + uSince;
|
|
350
|
+
float h1 = hh(id + 17.0, m), h2 = hh(id + 31.0, m), h3 = hh(id + 53.0, m);
|
|
351
|
+
float life = uLife*(0.55 + 0.45*h1);
|
|
352
|
+
if (age >= life || age < 0.0) return;
|
|
353
|
+
float bf = g*(uNB - 1.0); float b0 = floor(bf); float fr = bf - b0;
|
|
354
|
+
vec4 t0 = texelFetch(uTip, ivec2(int(b0), int(row)), 0);
|
|
355
|
+
vec4 t1 = texelFetch(uTip, ivec2(int(min(b0 + 1.0, uNB - 1.0)), int(row)), 0);
|
|
356
|
+
float act = t0.z*t1.z; if (act < 0.002) return;
|
|
357
|
+
vec2 o = mix(t0.xy, t1.xy, fr); vec2 pv = (t1.xy - t0.xy)*(uNB - 1.0)/uDur;
|
|
358
|
+
float ang = 6.2831853*h2; float sp = uSpread*(0.15 + 1.25*h3*h3);
|
|
359
|
+
vec2 v0 = vec2(cos(ang), sin(ang))*sp + pv*0.2;
|
|
360
|
+
float k = 1.9; vec2 vinf = vec2(0.0, -0.95/k); float ek = exp(-k*age);
|
|
361
|
+
vec2 p = o + (v0 - vinf)*((1.0 - ek)/k) + vinf*age; // origin + v age + 1/2 g age^2, with linear drag
|
|
362
|
+
vec2 vel = (v0 - vinf)*ek + vinf;
|
|
363
|
+
float speed = length(vel); vec2 dir = vel/max(speed, 1e-4); vec2 perp = vec2(-dir.y, dir.x); // (dir, perp) is right-handed
|
|
364
|
+
vec4 mv = modelViewMatrix*vec4(p, 0.0, 1.0);
|
|
365
|
+
float wpp = -mv.z/uPx; float w0 = 0.0038; float w = max(w0, 1.1*wpp); float comp = w0/w;
|
|
366
|
+
float L = 0.5*max(speed*0.085, 2.0*w) + 1.5*w; float W = 2.6*w;
|
|
367
|
+
vec2 q = p + dir*(aq.x*L) + perp*(aq.y*W);
|
|
368
|
+
gl_Position = projectionMatrix*modelViewMatrix*vec4(q, 0.0, 1.0);
|
|
369
|
+
float a = age/life;
|
|
370
|
+
float Ts = mix(clamp(uTemp*2.0, 3800.0, 8500.0), 1300.0, pow(a, 0.6));
|
|
371
|
+
vCol = bbLin(Ts);
|
|
372
|
+
vI = 1.8*comp*pow(1.0 - a, 1.1)*smoothstep(0.0, 0.025, age)*(0.55 + 0.7*h1)*(0.8 + 0.2*sin(age*38.0 + h2*6.28))*act*uOpacity*(1.0 - smoothstep(0.0, 0.35, uSince));
|
|
373
|
+
}`;
|
|
374
|
+
const SPARK_FRAG = /* glsl */ `
|
|
375
|
+
precision highp float;
|
|
376
|
+
varying vec2 vQ; varying vec3 vCol; varying float vI;
|
|
377
|
+
void main(){
|
|
378
|
+
float along = pow(smoothstep(-1.0, 0.6, vQ.x), 2.0)*(1.0 - smoothstep(0.6, 1.0, vQ.x));
|
|
379
|
+
float yw = vQ.y*2.6; float lat = exp(-yw*yw*0.7)*(1.0 - smoothstep(0.75, 1.0, abs(vQ.y)));
|
|
380
|
+
float a = along*lat*vI; if (a < 0.002) discard;
|
|
381
|
+
gl_FragColor = vec4(vCol*a, 1.0);
|
|
382
|
+
#include <tonemapping_fragment>
|
|
383
|
+
#include <colorspace_fragment>
|
|
384
|
+
}`;
|
|
385
|
+
const quadIndex = [0, 1, 2, 0, 2, 3];
|
|
386
|
+
function extentPosition(g, strokes, pad) {
|
|
387
|
+
const e = extentOf(strokes);
|
|
388
|
+
const x0 = e.x0 - pad, x1 = e.x1 + pad, y0 = e.y0 - pad, y1 = e.y1 + pad;
|
|
389
|
+
g.setAttribute('position', new THREE.BufferAttribute(new Float32Array([x0, y0, 0, x1, y0, 0, x1, y1, 0, x0, y1, 0]), 3)); // selection bounds only, never read by the shaders
|
|
390
|
+
}
|
|
391
|
+
const num = (name, label, description, min, max, step, unit) => ({ name, label, description, type: 'number', min, max, step, ...(unit ? { unit } : {}) });
|
|
392
|
+
const col = (name, label, description) => ({ name, label, description, type: 'color' });
|
|
393
|
+
export default {
|
|
394
|
+
key: 'lightPainting', source: 'hand', drawMethods: DRAW_METHODS, eraseMethods: ERASE_METHODS, drawDefault: 'pen', eraseDefault: 'pen',
|
|
395
|
+
catalog: {
|
|
396
|
+
name: 'Light Painting',
|
|
397
|
+
description: 'A long-exposure photograph of a handheld light writing in the dark: trail brightness follows 1/pen speed, colour cools from hot to warm, and a sparkler throws ballistic sparks. Use for night-photo titles, signatures and festive reveals.',
|
|
398
|
+
tags: ['light-painting', 'long-exposure', 'sparkler', 'handwriting', 'night', 'glow', 'photo'],
|
|
399
|
+
},
|
|
400
|
+
defaults: { exposure: 1, temperature: 3000, sparks: 110, spread: 0.7, bloom: 1, width: 0.012, strobe: 0, halation: 0.55, tremor: 0.5, color: '#ffe0b0', color2: '#ffffff', opacity: 1 },
|
|
401
|
+
ui: {
|
|
402
|
+
main: [
|
|
403
|
+
num('exposure', 'Exposure', 'How long the shutter stayed open: trail brightness, bleaching towards white and persistence.', 0.2, 2.5, 0.01),
|
|
404
|
+
num('temperature', 'Temperature', 'Colour temperature of the light source: low is ember red, high is cold white. Fresh trail is hotter and cools to this.', 1200, 9000, 10, 'K'),
|
|
405
|
+
num('strobe', 'Strobe', 'The light pulses while writing: the trail becomes dots whose spacing shows pen speed (dense where slow). 0 is continuous.', 0, 1, 0.01),
|
|
406
|
+
num('sparks', 'Sparks', 'Sparkler mode: sparks thrown per second by the pen tip while writing. 0 is a plain LED torch.', 0, 400, 1, '/s'),
|
|
407
|
+
],
|
|
408
|
+
more: [
|
|
409
|
+
num('width', 'Trail width', 'Width of the light trail (the source image on the sensor).', 0.004, 0.03, 0.0005, 'em'),
|
|
410
|
+
num('halation', 'Halation', 'Film halation: a wide dim red-orange glow bleeding around the brightest exposure.', 0, 2, 0.01),
|
|
411
|
+
num('tremor', 'Hand tremor', 'Physiological 8-12 Hz tremor of the hand: a faint fine ripple on the lines, smaller where the pen is slow.', 0, 1, 0.01),
|
|
412
|
+
num('spread', 'Spread', 'How violently the sparks are thrown out; low sparks drip, high sparks fan out wide.', 0, 1.6, 0.01),
|
|
413
|
+
num('bloom', 'Bloom', 'Lens bloom and thin streak cross on the glowing pen tip.', 0, 2, 0.01),
|
|
414
|
+
col('color', 'Colour', 'Resting colour of the trail (gel over the source), balanced by the temperature.'),
|
|
415
|
+
col('color2', 'Hot core', 'Colour of the fresh, hot trail and the tip.'),
|
|
416
|
+
num('opacity', 'Opacity', 'Overall opacity of the light.', 0, 1, 0.01),
|
|
417
|
+
],
|
|
418
|
+
},
|
|
419
|
+
structural: ['tremor'],
|
|
420
|
+
presets: [
|
|
421
|
+
{ name: 'Warm LED', description: 'Warm torch trail, a light shower of sparks.', patch: {} },
|
|
422
|
+
{ name: 'Sparkler', description: 'Hot white sparkler: dense, wide spark shower.', patch: { temperature: 3600, sparks: 200, spread: 1.1, exposure: 0.9, bloom: 1.2, color: '#ffcf8a' } },
|
|
423
|
+
{ name: 'Cold Torch', description: 'Cold white LED, no sparks, crisp tip.', patch: { temperature: 6800, sparks: 0, bloom: 0.8, width: 0.01, color: '#cfe6ff', color2: '#ffffff', exposure: 1.1 } },
|
|
424
|
+
{ name: 'Ember', description: 'Glowing red coal drawn slowly: deep exposure, few sparks.', patch: { temperature: 1700, sparks: 25, spread: 0.45, exposure: 1.5, width: 0.016, bloom: 0.7, color: '#ff8a50', color2: '#ffe6c8' } },
|
|
425
|
+
{ name: 'Strobe Gel', description: 'Pulsing magenta-gel LED: dotted trail, spacing shows pen speed.', patch: { temperature: 6500, sparks: 0, strobe: 1, exposure: 1.3, color: '#ff3fb4', color2: '#ffe2f6', width: 0.013, halation: 1.1 } },
|
|
426
|
+
],
|
|
427
|
+
build(layout, cfg, anim) {
|
|
428
|
+
const strokes = layout.strokes;
|
|
429
|
+
prepare(strokes, 'hand');
|
|
430
|
+
const G = layout.glyphs.length;
|
|
431
|
+
strokes.forEach((s) => { s.glyphN = s.glyph / Math.max(1, G - 1); });
|
|
432
|
+
shapeExposure(strokes);
|
|
433
|
+
penClock(strokes, anim.draw.duration);
|
|
434
|
+
applyTremor(strokes, cfg.tremor);
|
|
435
|
+
const { infoD, infoE } = applyAnim(strokes, anim, G);
|
|
436
|
+
const tipMode = !!infoD.tip;
|
|
437
|
+
// trail
|
|
438
|
+
const geo = buildCapsules(strokes);
|
|
439
|
+
extentPosition(geo, strokes, 0.3);
|
|
440
|
+
{
|
|
441
|
+
let nseg = 0;
|
|
442
|
+
for (const s of strokes)
|
|
443
|
+
nseg += s.pts.length / 2 - 1;
|
|
444
|
+
const pc = new Float32Array(nseg * 2);
|
|
445
|
+
let k = 0;
|
|
446
|
+
for (const s of strokes)
|
|
447
|
+
for (let i = 0; i < s.pts.length / 2 - 1; i++) {
|
|
448
|
+
pc[2 * k] = s.cyc[i];
|
|
449
|
+
pc[2 * k + 1] = s.cyc[i + 1];
|
|
450
|
+
k++;
|
|
451
|
+
}
|
|
452
|
+
geo.setAttribute('iPC', new THREE.InstancedBufferAttribute(pc, 2));
|
|
453
|
+
}
|
|
454
|
+
const U = uniformsBase();
|
|
455
|
+
const mat = new THREE.ShaderMaterial({
|
|
456
|
+
uniforms: { ...U, uColor: { value: hex(cfg.color) }, uColor2: { value: hex(cfg.color2) }, uOpacity: { value: 1 }, uExposure: { value: 1 }, uTemp: { value: 3000 }, uWidth: { value: 0.012 }, uStrobe: { value: 0 }, uHalation: { value: 0.55 } },
|
|
457
|
+
vertexShader: TRAIL_VERT, fragmentShader: frag(TRAIL_FRAG),
|
|
458
|
+
transparent: true, depthWrite: false, side: THREE.DoubleSide,
|
|
459
|
+
blending: THREE.CustomBlending, blendEquation: THREE.MaxEquation, blendSrc: THREE.OneFactor, blendDst: THREE.OneFactor,
|
|
460
|
+
});
|
|
461
|
+
const mesh = new THREE.Mesh(geo, mat);
|
|
462
|
+
mesh.frustumCulled = false;
|
|
463
|
+
mesh.renderOrder = 0;
|
|
464
|
+
// pen rows + baked tip table
|
|
465
|
+
const rows = tipMode ? packRows(strokes) : [];
|
|
466
|
+
const J = Math.max(1, rows.length);
|
|
467
|
+
const tipData = new Float32Array(TIP_BINS * J * 4);
|
|
468
|
+
const tmp = [0, 0, 0, 0];
|
|
469
|
+
rows.forEach((row, r) => { for (let b = 0; b < TIP_BINS; b++) {
|
|
470
|
+
const o = (r * TIP_BINS + b) * 4;
|
|
471
|
+
if (tipAt(rows, r, b / (TIP_BINS - 1), tmp)) {
|
|
472
|
+
tipData[o] = tmp[0];
|
|
473
|
+
tipData[o + 1] = tmp[1];
|
|
474
|
+
tipData[o + 2] = tmp[2];
|
|
475
|
+
}
|
|
476
|
+
} });
|
|
477
|
+
const tipTex = new THREE.DataTexture(tipData, TIP_BINS, J, THREE.RGBAFormat, THREE.FloatType);
|
|
478
|
+
tipTex.minFilter = tipTex.magFilter = THREE.NearestFilter;
|
|
479
|
+
tipTex.generateMipmaps = false;
|
|
480
|
+
tipTex.needsUpdate = true;
|
|
481
|
+
// sparks
|
|
482
|
+
const sg = new THREE.InstancedBufferGeometry();
|
|
483
|
+
sg.setAttribute('aq', new THREE.BufferAttribute(new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]), 2));
|
|
484
|
+
sg.setIndex(quadIndex);
|
|
485
|
+
extentPosition(sg, strokes, 0.6);
|
|
486
|
+
sg.instanceCount = 0;
|
|
487
|
+
sg.boundingSphere = new THREE.Sphere(new THREE.Vector3(), 1e3);
|
|
488
|
+
const smat = new THREE.ShaderMaterial({
|
|
489
|
+
uniforms: { ...U, uTip: { value: tipTex }, uNB: { value: TIP_BINS }, uJ: { value: J }, uNs: { value: 1 }, uRate: { value: 0 }, uSpread: { value: 0.7 }, uTemp: { value: 3000 }, uPx: { value: 800 }, uOpacity: { value: 1 }, uLife: { value: 1.3 } },
|
|
490
|
+
vertexShader: SPARK_VERT, fragmentShader: SPARK_FRAG, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide,
|
|
491
|
+
});
|
|
492
|
+
const sparks = new THREE.Mesh(sg, smat);
|
|
493
|
+
sparks.frustumCulled = false;
|
|
494
|
+
sparks.renderOrder = 1;
|
|
495
|
+
// bloom
|
|
496
|
+
const bg = new THREE.InstancedBufferGeometry();
|
|
497
|
+
bg.setAttribute('aq', new THREE.BufferAttribute(new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]), 2));
|
|
498
|
+
bg.setIndex(quadIndex);
|
|
499
|
+
const iC = new THREE.InstancedBufferAttribute(new Float32Array(J * 4), 4);
|
|
500
|
+
iC.setUsage(THREE.DynamicDrawUsage);
|
|
501
|
+
bg.setAttribute('iC', iC);
|
|
502
|
+
extentPosition(bg, strokes, 0.6);
|
|
503
|
+
bg.instanceCount = J;
|
|
504
|
+
bg.boundingSphere = new THREE.Sphere(new THREE.Vector3(), 1e3);
|
|
505
|
+
const bmat = new THREE.ShaderMaterial({
|
|
506
|
+
uniforms: { uColor: { value: hex(cfg.color) }, uColor2: { value: hex(cfg.color2) }, uOpacity: { value: 1 }, uTemp: { value: 3000 }, uBloom: { value: 1 }, uQ: { value: 0.9 } },
|
|
507
|
+
vertexShader: BLOOM_VERT, fragmentShader: BLOOM_FRAG, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide,
|
|
508
|
+
});
|
|
509
|
+
const bloom = new THREE.Mesh(bg, bmat);
|
|
510
|
+
bloom.frustumCulled = false;
|
|
511
|
+
bloom.renderOrder = 2;
|
|
512
|
+
const group = new THREE.Group();
|
|
513
|
+
group.add(mesh, sparks, bloom);
|
|
514
|
+
const api = {
|
|
515
|
+
object: group, c: cfg,
|
|
516
|
+
apply(c) {
|
|
517
|
+
const u = mat.uniforms;
|
|
518
|
+
u.uColor.value.set(c.color);
|
|
519
|
+
u.uColor2.value.set(c.color2);
|
|
520
|
+
u.uOpacity.value = c.opacity;
|
|
521
|
+
u.uExposure.value = c.exposure;
|
|
522
|
+
u.uTemp.value = c.temperature;
|
|
523
|
+
u.uWidth.value = c.width;
|
|
524
|
+
u.uStrobe.value = c.strobe;
|
|
525
|
+
u.uHalation.value = c.halation;
|
|
526
|
+
u.uHalf.value = c.width * 15;
|
|
527
|
+
const su = smat.uniforms;
|
|
528
|
+
su.uRate.value = c.sparks;
|
|
529
|
+
su.uSpread.value = c.spread;
|
|
530
|
+
su.uTemp.value = c.temperature;
|
|
531
|
+
su.uOpacity.value = c.opacity;
|
|
532
|
+
const ns = clamp(Math.ceil(c.sparks * su.uLife.value * 1.3), 1, Math.floor(MAX_SPARKS / J));
|
|
533
|
+
su.uNs.value = ns;
|
|
534
|
+
sg.instanceCount = ns * J;
|
|
535
|
+
sparks.visible = tipMode && c.sparks > 0.01;
|
|
536
|
+
const bu = bmat.uniforms;
|
|
537
|
+
bu.uColor.value.set(c.color);
|
|
538
|
+
bu.uColor2.value.set(c.color2);
|
|
539
|
+
bu.uOpacity.value = c.opacity;
|
|
540
|
+
bu.uTemp.value = c.temperature;
|
|
541
|
+
bu.uBloom.value = c.bloom;
|
|
542
|
+
bloom.visible = tipMode && c.bloom > 0.01;
|
|
543
|
+
api.c = c;
|
|
544
|
+
},
|
|
545
|
+
update(S, time, px) {
|
|
546
|
+
setReveal(U, S, infoD, infoE, anim.draw.duration, time);
|
|
547
|
+
smat.uniforms.uPx.value = px;
|
|
548
|
+
if (bloom.visible) {
|
|
549
|
+
const head = U.uHead.value;
|
|
550
|
+
const pen = tipMode && S.d > 0 && S.d < 1 && S.e <= 0;
|
|
551
|
+
const a = iC.array;
|
|
552
|
+
for (let r = 0; r < J; r++) {
|
|
553
|
+
const on = pen && tipAt(rows, r, head, tmp);
|
|
554
|
+
a[4 * r] = on ? tmp[0] : 0;
|
|
555
|
+
a[4 * r + 1] = on ? tmp[1] : 0;
|
|
556
|
+
a[4 * r + 2] = on ? tmp[2] : 0;
|
|
557
|
+
a[4 * r + 3] = on ? tmp[3] : 0;
|
|
558
|
+
}
|
|
559
|
+
iC.needsUpdate = true;
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
dispose() { geo.dispose(); mat.dispose(); sg.dispose(); smat.dispose(); bg.dispose(); bmat.dispose(); tipTex.dispose(); },
|
|
563
|
+
};
|
|
564
|
+
api.apply(cfg);
|
|
565
|
+
return api;
|
|
566
|
+
},
|
|
567
|
+
};
|