@3driseai/3drise-viewer 0.1.28 → 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 +1 -1
- package/dist/components/ApollonianGrid.d.ts.map +1 -1
- package/dist/components/ApollonianGrid.js +3 -28
- 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 +1 -1
- package/dist/components/ConformalGrid.d.ts.map +1 -1
- package/dist/components/ConformalGrid.js +3 -34
- 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/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 +1 -1
- package/dist/components/HilbertGrid.d.ts.map +1 -1
- package/dist/components/HilbertGrid.js +3 -30
- 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 +1 -1
- package/dist/components/LensingGrid.d.ts.map +1 -1
- package/dist/components/LensingGrid.js +3 -29
- 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 +1 -1
- package/dist/components/ParastichyGrid.d.ts.map +1 -1
- package/dist/components/ParastichyGrid.js +3 -30
- package/dist/components/PhyllotaxisGrid.d.ts +1 -1
- package/dist/components/PhyllotaxisGrid.d.ts.map +1 -1
- package/dist/components/PhyllotaxisGrid.js +3 -32
- 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 +1 -1
- package/dist/components/TruchetGrid.d.ts.map +1 -1
- package/dist/components/TruchetGrid.js +3 -30
- 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 +10 -10
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +8 -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.map +1 -1
- package/dist/constants.js +4 -0
- 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 +18 -23
- package/dist/types/gridConfigs.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,655 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { prepare, applyAnim, DRAW_METHODS, ERASE_METHODS } from '../methods.js';
|
|
3
|
+
import { setReveal, uniformsBase } from '../ribbon.js';
|
|
4
|
+
import { buildField, fieldFrag } from '../fieldkit.js';
|
|
5
|
+
// =========================================================================================
|
|
6
|
+
// liquidMetal — mercury / chrome lettering.
|
|
7
|
+
//
|
|
8
|
+
// THE MATHS
|
|
9
|
+
// * Height field. Every letter is a puddle of liquid metal held by surface tension. With d = inside distance (-signed
|
|
10
|
+
// distance of the field kit) the free surface is a circular arc meeting the substrate at 90 degrees:
|
|
11
|
+
// h(d) = sqrt(R^2 - (R - min(d,R))^2) (R = thickness knob; shrinks with the metal when it is thinner than R)
|
|
12
|
+
// so the interior is flat-topped and the rim is a rounded meniscus. The normal of that arc is analytic:
|
|
13
|
+
// n = ( (min(d,R) - R)/R * grad d , h/R ) (grad d = unit gradient of the distance field)
|
|
14
|
+
// A tiny broad crown (~ (w-d)/w) and slow surface waves (three travelling swells + a few capillary ring-wave packets
|
|
15
|
+
// that spread from seeded points, all closed form in time) tilt the normal: that is the idle life of the metal.
|
|
16
|
+
// * Shading is a pure mirror: the normal reflects the view ray into a procedural studio environment (horizon gradient,
|
|
17
|
+
// warm key softbox, cool fill softbox, top strip, a thin strip light that slowly sweeps = the travelling streak, back
|
|
18
|
+
// rims). Colour comes from physics: Schlick Fresnel between the metal's own normal-incidence reflectance (colour) and
|
|
19
|
+
// its grazing tint (colour2), never from a diffuse colour. Grazing pixels blur the environment along the contour
|
|
20
|
+
// (anisotropic taps), and the metal meets the surface with a dark contact line.
|
|
21
|
+
// * Geometry that is not in the distance field (where the stroke runs, how wide it is locally) is baked once into a
|
|
22
|
+
// second texture: a geodesic (eikonal) distance s along each glyph from one end, its normalised value, and the local
|
|
23
|
+
// half width w. Draw 'flow' uses it to run a bulb of metal along each stroke; erase 'beads' uses it for a
|
|
24
|
+
// Rayleigh-Plateau jet: radius r(s) = w (1 - m (1 - cos(2 pi s/lambda))/2), lambda = 9 w, m grows until the necks
|
|
25
|
+
// pinch, the beads relax into round drops that evaporate.
|
|
26
|
+
// =========================================================================================
|
|
27
|
+
const hex = (h) => new THREE.Color(h);
|
|
28
|
+
function mulberry32(a) { return function () { a |= 0; a = (a + 0x6D2B79F5) | 0; let t = Math.imul(a ^ (a >>> 15), 1 | a); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; }
|
|
29
|
+
// ---- bake: geodesic coordinate s, local half width w, u = s/smax, component phase -------------------------------------
|
|
30
|
+
function bakeAux(field) {
|
|
31
|
+
const f0 = field.f0.image.data, [W, H] = field.size, fh = THREE.DataUtils.fromHalfFloat;
|
|
32
|
+
const w2 = Math.ceil(W / 2), h2 = Math.ceil(H / 2), N = w2 * h2, cell = field.ext.z / w2;
|
|
33
|
+
const hf = THREE.DataUtils.toHalfFloat;
|
|
34
|
+
const dIn = new Float32Array(N), mask = new Uint8Array(N);
|
|
35
|
+
for (let j = 0; j < h2; j++)
|
|
36
|
+
for (let i = 0; i < w2; i++) {
|
|
37
|
+
const k = j * w2 + i;
|
|
38
|
+
const x = Math.min(W - 1, 2 * i), y = Math.min(H - 1, 2 * j);
|
|
39
|
+
const d = -fh(f0[(y * W + x) * 4]);
|
|
40
|
+
dIn[k] = d;
|
|
41
|
+
mask[k] = d > 0 ? 1 : 0;
|
|
42
|
+
}
|
|
43
|
+
// connected components (4-neighbourhood)
|
|
44
|
+
const comp = new Int32Array(N).fill(-1);
|
|
45
|
+
let nc = 0;
|
|
46
|
+
const stack = [];
|
|
47
|
+
const firstOf = [];
|
|
48
|
+
for (let k0 = 0; k0 < N; k0++) {
|
|
49
|
+
if (!mask[k0] || comp[k0] >= 0)
|
|
50
|
+
continue;
|
|
51
|
+
comp[k0] = nc;
|
|
52
|
+
firstOf.push(k0);
|
|
53
|
+
stack.push(k0);
|
|
54
|
+
while (stack.length) {
|
|
55
|
+
const k = stack.pop(), i = k % w2, j = (k - i) / w2;
|
|
56
|
+
if (i > 0 && mask[k - 1] && comp[k - 1] < 0) {
|
|
57
|
+
comp[k - 1] = nc;
|
|
58
|
+
stack.push(k - 1);
|
|
59
|
+
}
|
|
60
|
+
if (i < w2 - 1 && mask[k + 1] && comp[k + 1] < 0) {
|
|
61
|
+
comp[k + 1] = nc;
|
|
62
|
+
stack.push(k + 1);
|
|
63
|
+
}
|
|
64
|
+
if (j > 0 && mask[k - w2] && comp[k - w2] < 0) {
|
|
65
|
+
comp[k - w2] = nc;
|
|
66
|
+
stack.push(k - w2);
|
|
67
|
+
}
|
|
68
|
+
if (j < h2 - 1 && mask[k + w2] && comp[k + w2] < 0) {
|
|
69
|
+
comp[k + w2] = nc;
|
|
70
|
+
stack.push(k + w2);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
nc++;
|
|
74
|
+
}
|
|
75
|
+
// fast-sweeping eikonal solver |grad u| = 1 inside the mask (geodesic distance from the seeds)
|
|
76
|
+
const INF = 1e9, u = new Float32Array(N);
|
|
77
|
+
const solve = () => {
|
|
78
|
+
for (let it = 0; it < 14; it++) {
|
|
79
|
+
let ch = false;
|
|
80
|
+
for (let sw = 0; sw < 4; sw++) {
|
|
81
|
+
const j0 = sw & 1 ? h2 - 1 : 0, j1 = sw & 1 ? -1 : h2, dj = sw & 1 ? -1 : 1, i0 = sw & 2 ? w2 - 1 : 0, i1 = sw & 2 ? -1 : w2, di = sw & 2 ? -1 : 1;
|
|
82
|
+
for (let j = j0; j !== j1; j += dj)
|
|
83
|
+
for (let i = i0; i !== i1; i += di) {
|
|
84
|
+
const k = j * w2 + i;
|
|
85
|
+
if (!mask[k])
|
|
86
|
+
continue;
|
|
87
|
+
let a = INF, b = INF;
|
|
88
|
+
if (i > 0)
|
|
89
|
+
a = u[k - 1];
|
|
90
|
+
if (i < w2 - 1 && u[k + 1] < a)
|
|
91
|
+
a = u[k + 1];
|
|
92
|
+
if (j > 0)
|
|
93
|
+
b = u[k - w2];
|
|
94
|
+
if (j < h2 - 1 && u[k + w2] < b)
|
|
95
|
+
b = u[k + w2];
|
|
96
|
+
if (a >= INF && b >= INF)
|
|
97
|
+
continue;
|
|
98
|
+
let nu;
|
|
99
|
+
if (a >= INF)
|
|
100
|
+
nu = b + cell;
|
|
101
|
+
else if (b >= INF)
|
|
102
|
+
nu = a + cell;
|
|
103
|
+
else if (Math.abs(a - b) >= cell)
|
|
104
|
+
nu = Math.min(a, b) + cell;
|
|
105
|
+
else
|
|
106
|
+
nu = (a + b + Math.sqrt(2 * cell * cell - (a - b) * (a - b))) / 2;
|
|
107
|
+
if (nu < u[k] - 1e-6) {
|
|
108
|
+
u[k] = nu;
|
|
109
|
+
ch = true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!ch)
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
u.fill(INF);
|
|
118
|
+
for (const k of firstOf)
|
|
119
|
+
u[k] = 0;
|
|
120
|
+
solve();
|
|
121
|
+
const far = new Int32Array(nc).fill(-1);
|
|
122
|
+
for (let k = 0; k < N; k++)
|
|
123
|
+
if (mask[k] && u[k] < INF && (far[comp[k]] < 0 || u[k] > u[far[comp[k]]]))
|
|
124
|
+
far[comp[k]] = k;
|
|
125
|
+
u.fill(INF);
|
|
126
|
+
for (let c = 0; c < nc; c++)
|
|
127
|
+
if (far[c] >= 0)
|
|
128
|
+
u[far[c]] = 0;
|
|
129
|
+
solve();
|
|
130
|
+
const smax = new Float32Array(nc).fill(1e-3);
|
|
131
|
+
for (let k = 0; k < N; k++)
|
|
132
|
+
if (mask[k] && u[k] < INF)
|
|
133
|
+
smax[comp[k]] = Math.max(smax[comp[k]], u[k]);
|
|
134
|
+
// local half width: max inside distance in each slice of constant s (binned), dilated and blurred along s
|
|
135
|
+
const BIN = 0.02, nb = new Int32Array(nc), off = new Int32Array(nc + 1);
|
|
136
|
+
for (let c = 0; c < nc; c++) {
|
|
137
|
+
nb[c] = Math.floor(smax[c] / BIN) + 3;
|
|
138
|
+
off[c + 1] = off[c] + nb[c];
|
|
139
|
+
}
|
|
140
|
+
const bm = new Float32Array(off[nc] + 1);
|
|
141
|
+
for (let k = 0; k < N; k++)
|
|
142
|
+
if (mask[k] && u[k] < INF) {
|
|
143
|
+
const c = comp[k], b = off[c] + Math.floor(u[k] / BIN);
|
|
144
|
+
if (dIn[k] > bm[b])
|
|
145
|
+
bm[b] = dIn[k];
|
|
146
|
+
}
|
|
147
|
+
const bs = new Float32Array(bm.length), bt = new Float32Array(bm.length);
|
|
148
|
+
for (let c = 0; c < nc; c++) {
|
|
149
|
+
const o = off[c], n = nb[c];
|
|
150
|
+
for (let b = 0; b < n; b++) {
|
|
151
|
+
let m = 0;
|
|
152
|
+
for (let q = -3; q <= 3; q++) {
|
|
153
|
+
const bb = b + q;
|
|
154
|
+
if (bb >= 0 && bb < n)
|
|
155
|
+
m = Math.max(m, bm[o + bb]);
|
|
156
|
+
}
|
|
157
|
+
bs[o + b] = m;
|
|
158
|
+
}
|
|
159
|
+
for (let b = 0; b < n; b++) {
|
|
160
|
+
let a = 0, cnt = 0;
|
|
161
|
+
for (let q = -3; q <= 3; q++) {
|
|
162
|
+
const bb = b + q;
|
|
163
|
+
if (bb >= 0 && bb < n) {
|
|
164
|
+
a += bs[o + bb];
|
|
165
|
+
cnt++;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
bt[o + b] = a / cnt;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const rnd = mulberry32(7);
|
|
172
|
+
const phase = [];
|
|
173
|
+
for (let c = 0; c < nc; c++)
|
|
174
|
+
phase.push(rnd() * Math.PI * 2);
|
|
175
|
+
const S = new Float32Array(N), Wd = new Float32Array(N), U = new Float32Array(N), P = new Float32Array(N), has = new Uint8Array(N);
|
|
176
|
+
for (let k = 0; k < N; k++)
|
|
177
|
+
if (mask[k] && u[k] < INF) {
|
|
178
|
+
const c = comp[k], f = u[k] / BIN, b0 = Math.floor(f), fr = f - b0, o = off[c];
|
|
179
|
+
S[k] = u[k];
|
|
180
|
+
Wd[k] = Math.max(0.006, bt[o + b0] * (1 - fr) + bt[o + Math.min(nb[c] - 1, b0 + 1)] * fr);
|
|
181
|
+
U[k] = u[k] / smax[c];
|
|
182
|
+
P[k] = phase[c];
|
|
183
|
+
has[k] = 1;
|
|
184
|
+
}
|
|
185
|
+
// dilate outward a few texels so bilinear sampling at and just beyond the contour stays valid
|
|
186
|
+
for (let it = 0; it < 8; it++) {
|
|
187
|
+
const add = [];
|
|
188
|
+
for (let j = 0; j < h2; j++)
|
|
189
|
+
for (let i = 0; i < w2; i++) {
|
|
190
|
+
const k = j * w2 + i;
|
|
191
|
+
if (has[k])
|
|
192
|
+
continue;
|
|
193
|
+
let q = -1;
|
|
194
|
+
if (i > 0 && has[k - 1])
|
|
195
|
+
q = k - 1;
|
|
196
|
+
else if (i < w2 - 1 && has[k + 1])
|
|
197
|
+
q = k + 1;
|
|
198
|
+
else if (j > 0 && has[k - w2])
|
|
199
|
+
q = k - w2;
|
|
200
|
+
else if (j < h2 - 1 && has[k + w2])
|
|
201
|
+
q = k + w2;
|
|
202
|
+
if (q >= 0)
|
|
203
|
+
add.push(k, q);
|
|
204
|
+
}
|
|
205
|
+
for (let a = 0; a < add.length; a += 2) {
|
|
206
|
+
const k = add[a], q = add[a + 1];
|
|
207
|
+
S[k] = S[q];
|
|
208
|
+
Wd[k] = Wd[q];
|
|
209
|
+
U[k] = U[q];
|
|
210
|
+
P[k] = P[q];
|
|
211
|
+
}
|
|
212
|
+
for (let a = 0; a < add.length; a += 2)
|
|
213
|
+
has[add[a]] = 1;
|
|
214
|
+
}
|
|
215
|
+
// gradients: of a Gaussian-smoothed distance (soft mitres at corners, ridge-fade on the medial axis) and of s (stroke direction)
|
|
216
|
+
const sg = 0.022 / cell, rad = Math.ceil(3 * sg), ker = [];
|
|
217
|
+
let ksum = 0;
|
|
218
|
+
for (let q = -rad; q <= rad; q++) {
|
|
219
|
+
const v = Math.exp(-0.5 * q * q / (sg * sg));
|
|
220
|
+
ker.push(v);
|
|
221
|
+
ksum += v;
|
|
222
|
+
}
|
|
223
|
+
for (let q = 0; q < ker.length; q++)
|
|
224
|
+
ker[q] /= ksum;
|
|
225
|
+
const tmp = new Float32Array(N), bl = new Float32Array(N);
|
|
226
|
+
for (let j = 0; j < h2; j++)
|
|
227
|
+
for (let i = 0; i < w2; i++) {
|
|
228
|
+
let a = 0;
|
|
229
|
+
for (let q = -rad; q <= rad; q++)
|
|
230
|
+
a += ker[q + rad] * dIn[j * w2 + Math.min(w2 - 1, Math.max(0, i + q))];
|
|
231
|
+
tmp[j * w2 + i] = a;
|
|
232
|
+
}
|
|
233
|
+
for (let j = 0; j < h2; j++)
|
|
234
|
+
for (let i = 0; i < w2; i++) {
|
|
235
|
+
let a = 0;
|
|
236
|
+
for (let q = -rad; q <= rad; q++)
|
|
237
|
+
a += ker[q + rad] * tmp[Math.min(h2 - 1, Math.max(0, j + q)) * w2 + i];
|
|
238
|
+
bl[j * w2 + i] = a;
|
|
239
|
+
}
|
|
240
|
+
const GD = new Uint16Array(N * 4), at = (a, i, j) => a[Math.min(h2 - 1, Math.max(0, j)) * w2 + Math.min(w2 - 1, Math.max(0, i))];
|
|
241
|
+
for (let j = 0; j < h2; j++)
|
|
242
|
+
for (let i = 0; i < w2; i++) {
|
|
243
|
+
const k = j * w2 + i, o = 4 * k;
|
|
244
|
+
GD[o] = hf((at(bl, i + 1, j) - at(bl, i - 1, j)) / (2 * cell));
|
|
245
|
+
GD[o + 1] = hf((at(bl, i, j + 1) - at(bl, i, j - 1)) / (2 * cell));
|
|
246
|
+
GD[o + 2] = hf((at(S, i + 1, j) - at(S, i - 1, j)) / (2 * cell));
|
|
247
|
+
GD[o + 3] = hf((at(S, i, j + 1) - at(S, i, j - 1)) / (2 * cell));
|
|
248
|
+
}
|
|
249
|
+
const gtex = new THREE.DataTexture(GD, w2, h2, THREE.RGBAFormat, THREE.HalfFloatType);
|
|
250
|
+
gtex.minFilter = gtex.magFilter = THREE.LinearFilter;
|
|
251
|
+
gtex.wrapS = gtex.wrapT = THREE.ClampToEdgeWrapping;
|
|
252
|
+
gtex.generateMipmaps = false;
|
|
253
|
+
gtex.needsUpdate = true;
|
|
254
|
+
// drip sources: for every texel, the y of the bottom edge of the metal run at or above it (outside texels only within 0.9 em
|
|
255
|
+
// below the run), so a pixel anywhere under a stroke knows where gravity-fed rivulets start. Sampled with NEAREST.
|
|
256
|
+
const DRD = new Uint16Array(N * 4), cy = field.ext.w / h2, MAXD = 0.9;
|
|
257
|
+
for (let i = 0; i < w2; i++) {
|
|
258
|
+
let bottom = -99, last = -1;
|
|
259
|
+
for (let j = h2 - 1; j >= 0; j--) {
|
|
260
|
+
const k = j * w2 + i;
|
|
261
|
+
if (mask[k]) {
|
|
262
|
+
let jb = j;
|
|
263
|
+
while (jb > 0 && mask[(jb - 1) * w2 + i])
|
|
264
|
+
jb--;
|
|
265
|
+
const yb = field.ext.y + jb * cy;
|
|
266
|
+
for (let q = j; q >= jb; q--) {
|
|
267
|
+
DRD[4 * (q * w2 + i)] = hf(yb);
|
|
268
|
+
}
|
|
269
|
+
bottom = yb;
|
|
270
|
+
last = jb;
|
|
271
|
+
j = jb;
|
|
272
|
+
}
|
|
273
|
+
else if (last >= 0 && (field.ext.y + (j + 0.5) * cy) > bottom - MAXD)
|
|
274
|
+
DRD[4 * k] = hf(bottom);
|
|
275
|
+
else
|
|
276
|
+
DRD[4 * k] = hf(-99);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const drtex = new THREE.DataTexture(DRD, w2, h2, THREE.RGBAFormat, THREE.HalfFloatType);
|
|
280
|
+
drtex.minFilter = drtex.magFilter = THREE.NearestFilter;
|
|
281
|
+
drtex.wrapS = drtex.wrapT = THREE.ClampToEdgeWrapping;
|
|
282
|
+
drtex.generateMipmaps = false;
|
|
283
|
+
drtex.needsUpdate = true;
|
|
284
|
+
const D = new Uint16Array(N * 4);
|
|
285
|
+
for (let k = 0; k < N; k++) {
|
|
286
|
+
D[4 * k] = hf(S[k]);
|
|
287
|
+
D[4 * k + 1] = hf(Wd[k]);
|
|
288
|
+
D[4 * k + 2] = hf(U[k]);
|
|
289
|
+
D[4 * k + 3] = hf(P[k]);
|
|
290
|
+
}
|
|
291
|
+
const tex = new THREE.DataTexture(D, w2, h2, THREE.RGBAFormat, THREE.HalfFloatType);
|
|
292
|
+
tex.minFilter = tex.magFilter = THREE.LinearFilter;
|
|
293
|
+
tex.wrapS = tex.wrapT = THREE.ClampToEdgeWrapping;
|
|
294
|
+
tex.generateMipmaps = false;
|
|
295
|
+
tex.needsUpdate = true;
|
|
296
|
+
// seeds for the capillary ripple sources: points well inside the metal
|
|
297
|
+
const cand = [];
|
|
298
|
+
for (const thr of [0.035, 0.02, 0.008]) {
|
|
299
|
+
for (let k = 0; k < N; k++)
|
|
300
|
+
if (dIn[k] > thr)
|
|
301
|
+
cand.push(k);
|
|
302
|
+
if (cand.length > 40)
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
const r2 = mulberry32(31), src = [];
|
|
306
|
+
for (let i = 0; i < 6; i++) {
|
|
307
|
+
const k = cand.length ? cand[Math.floor(r2() * cand.length)] : 0, ix = k % w2, iy = (k - ix) / w2;
|
|
308
|
+
src.push(new THREE.Vector4(field.ext.x + (ix + 0.5) * cell, field.ext.y + (iy + 0.5) * (field.ext.w / h2), r2(), 10 + 6 * r2()));
|
|
309
|
+
}
|
|
310
|
+
return { tex, gtex, drtex, src, dispose() { tex.dispose(); gtex.dispose(); drtex.dispose(); } };
|
|
311
|
+
}
|
|
312
|
+
// ---- shader -----------------------------------------------------------------------------------------------------------
|
|
313
|
+
const VERT = /* glsl */ `varying vec2 vPos; varying vec3 vView; varying vec3 vE0; varying vec3 vE1; varying vec3 vE2;
|
|
314
|
+
void main(){ vPos = position.xy; vec4 mv = modelViewMatrix*vec4(position, 1.0); vView = mv.xyz;
|
|
315
|
+
vE0 = mat3(modelViewMatrix)[0]; vE1 = mat3(modelViewMatrix)[1]; vE2 = mat3(modelViewMatrix)[2];
|
|
316
|
+
gl_Position = projectionMatrix*mv; }`;
|
|
317
|
+
const FRAG = /* glsl */ `
|
|
318
|
+
uniform sampler2D uM; uniform sampler2D uGt; uniform sampler2D uDr; uniform float uTexel; uniform float uMeltOn; uniform float uMelt; uniform float uDrips;
|
|
319
|
+
uniform float uOxide; uniform float uSpike;
|
|
320
|
+
uniform float uR; uniform float uRough; uniform float uRefl; uniform float uEnv; uniform float uTint; uniform float uSpeed; uniform float uOpacity;
|
|
321
|
+
uniform vec3 uCol; uniform vec3 uCol2;
|
|
322
|
+
uniform float uFlow; uniform float uBeads; uniform float uNG; uniform float uSt; uniform float uWin;
|
|
323
|
+
uniform vec4 uSrc[6]; uniform vec4 uWv[3];
|
|
324
|
+
varying vec3 vView; varying vec3 vE0; varying vec3 vE1; varying vec3 vE2;
|
|
325
|
+
const float PI = 3.14159265;
|
|
326
|
+
float dIn(vec2 p){ return -fieldA(p).x; }
|
|
327
|
+
vec4 mtex(vec2 p){ return texture2D(uM, fieldUV(p)); }
|
|
328
|
+
|
|
329
|
+
// --- procedural studio (view space: +z towards the viewer, +y up). Features get softer with 'blur' (rough / grazing) ---
|
|
330
|
+
float boxM(vec2 q, vec2 c, vec2 hs, float soft){ vec2 d = abs(q - c) - hs; float sd = length(max(d, 0.0)) + min(max(d.x, d.y), 0.0); return 1.0 - smoothstep(-soft, soft, sd); }
|
|
331
|
+
float wrapA(float a){ return mod(a + PI, 2.0*PI) - PI; }
|
|
332
|
+
vec3 studio(vec3 r, float blur, float te){
|
|
333
|
+
float az = atan(r.x, r.z) + 0.30*sin(te*0.043); // the whole studio slowly swings: the light moves, not the text
|
|
334
|
+
float el = asin(clamp(r.y, -1.0, 1.0));
|
|
335
|
+
float hz = el + 0.07 - 0.05*sin(te*0.061);
|
|
336
|
+
float wd = 0.03 + 0.7*blur;
|
|
337
|
+
vec3 sky = mix(vec3(0.52, 0.56, 0.62), vec3(0.025, 0.032, 0.055), smoothstep(0.0, 0.85, hz));
|
|
338
|
+
vec3 gnd = mix(vec3(0.17, 0.13, 0.10), vec3(0.008, 0.009, 0.012), smoothstep(0.0, 0.55, -hz));
|
|
339
|
+
vec3 c = mix(gnd, sky, smoothstep(-wd, wd, hz));
|
|
340
|
+
c += vec3(0.20, 0.19, 0.17)*exp(-hz*hz/(wd*wd + 0.002))*0.55; // bright horizon line
|
|
341
|
+
float bs = blur;
|
|
342
|
+
c = mix(c, vec3(1.00, 0.80, 0.58)*0.92, boxM(vec2(wrapA(az + 0.62), el), vec2(0.0, 0.40), vec2(0.20, 0.17), 0.12 + bs)*0.95); // warm key
|
|
343
|
+
c = mix(c, vec3(0.66, 0.82, 1.00)*0.82, boxM(vec2(wrapA(az - 0.66), el), vec2(0.0, 0.24), vec2(0.17, 0.30), 0.12 + bs)*0.92); // cool fill
|
|
344
|
+
c = mix(c, vec3(0.92, 0.94, 1.00)*0.88, boxM(vec2(wrapA(az), el), vec2(0.0, 1.02), vec2(1.1, 0.07), 0.07 + bs)*0.9); // top strip
|
|
345
|
+
float sa = 0.65*sin(te*0.115 + 0.8); // the strip light sweeping across
|
|
346
|
+
c = mix(c, vec3(1.0, 0.98, 0.94)*1.15, boxM(vec2(wrapA(az - sa), el), vec2(0.0, 0.25), vec2(0.02, 0.85), 0.03 + 0.6*bs)*0.95);
|
|
347
|
+
c = mix(c, vec3(0.85, 0.88, 0.95)*0.60, boxM(vec2(wrapA(az - PI), el), vec2(0.0, 0.10), vec2(0.55, 0.28), 0.2 + bs)*0.85); // back rim
|
|
348
|
+
c = mix(c, vec3(1.00, 0.86, 0.70)*0.55, boxM(vec2(wrapA(az + 2.3), el), vec2(0.0, -0.05), vec2(0.15, 0.35), 0.15 + bs)*0.8);
|
|
349
|
+
return c;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// --- slow surface motion: slope (gradient of the free-surface height) of three travelling swells + capillary ring packets ---
|
|
353
|
+
vec2 surfSlope(vec2 p, float t){
|
|
354
|
+
vec2 sl = vec2(0.0);
|
|
355
|
+
for (int i = 0; i < 3; i++) { vec4 w = uWv[i]; float th = w.z*dot(w.xy, p) - w.w*t + float(i)*2.1; sl += w.xy*(-0.032*sin(th)); }
|
|
356
|
+
for (int i = 0; i < 6; i++) {
|
|
357
|
+
vec4 sc = uSrc[i]; vec2 dv = p - sc.xy; float r = length(dv) + 1e-3; float T = sc.w; float tau = mod(t + sc.z*T, T);
|
|
358
|
+
float rf = 0.05*tau, sg = 0.09, q = (r - rf)/sg, env = exp(-q*q);
|
|
359
|
+
float life = smoothstep(0.0, 1.5, tau)*(1.0 - smoothstep(0.5*T, T, tau));
|
|
360
|
+
float k = 2.0*PI/0.07, ph = k*(r - rf);
|
|
361
|
+
float dU = env*(-2.0*q/sg*cos(ph)/k - sin(ph)); // d/dr of (env cos(ph)/k)
|
|
362
|
+
sl += (dv/r)*(0.045*life*dU);
|
|
363
|
+
}
|
|
364
|
+
return sl;
|
|
365
|
+
}
|
|
366
|
+
float vnz(vec2 q){ vec2 i = floor(q), f = fract(q); f = f*f*(3.0 - 2.0*f);
|
|
367
|
+
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); }
|
|
368
|
+
// smooth min / max of two signed-distance fields together with their inward gradients (liquids merge with a meniscus)
|
|
369
|
+
void smin2(inout float a, inout vec2 ga, float b, vec2 gb, float k){ float h = clamp(0.5 + 0.5*(b - a)/k, 0.0, 1.0); float r = mix(b, a, h) - k*h*(1.0 - h); ga = mix(gb, ga, h); a = r; }
|
|
370
|
+
void smax2(inout float a, inout vec2 ga, float b, vec2 gb, float k){ float h = clamp(0.5 + 0.5*(a - b)/k, 0.0, 1.0); float r = mix(b, a, h) + k*h*(1.0 - h); ga = mix(gb, ga, h); a = r; }
|
|
371
|
+
float fillAge(float a){ return a <= 0.0 ? 0.0 : (1.0 - exp(-a/0.05))*(1.0 + 0.34*exp(-a/0.5)*cos(6.2832*a/0.75)); } // bead overshoot, damped settling
|
|
372
|
+
|
|
373
|
+
void main(){
|
|
374
|
+
vec2 p = vPos;
|
|
375
|
+
vec4 A = fieldA(p); vec4 B = fieldB(p); vec4 M = mtex(p);
|
|
376
|
+
float d = -A.x, s = M.x, w = max(M.y, 0.006), un = M.z, ph0 = M.w;
|
|
377
|
+
vec4 GT = texture2D(uGt, fieldUV(p));
|
|
378
|
+
vec2 gv = GT.xy; vec2 g = gv/max(length(gv), 1e-4); float gm = min(length(gv), 1.0);
|
|
379
|
+
vec2 gs = GT.zw; vec2 ts = gs/max(length(gs), 1e-4);
|
|
380
|
+
|
|
381
|
+
// --- reveal: how much of the local half width is filled (gIn) and whether the erase has taken it (visOut)
|
|
382
|
+
float gIn, visOut = 1.0;
|
|
383
|
+
float gh = floor(B.x*max(uNG - 1.0, 0.0) + 0.5);
|
|
384
|
+
if (uFlow > 0.5) { float ga = gh*uSt + uWin*un; gIn = fillAge((uHead - ga)*uDur + uSince); }
|
|
385
|
+
else gIn = revealInG(A.y);
|
|
386
|
+
if (uBeads < 0.5 && uMeltOn < 0.5) visOut = revealOutG(A.z);
|
|
387
|
+
float gT = gIn*visOut;
|
|
388
|
+
float eIn = w*(1.0 - gT);
|
|
389
|
+
|
|
390
|
+
// --- beads (Rayleigh-Plateau): lambda = 9 w, growth m, pinch-off then round drops that evaporate
|
|
391
|
+
float phi = 0.0;
|
|
392
|
+
if (uBeads > 0.5) phi = clamp((uE - 0.25*h21(vec2(gh, 3.7)))/0.75, 0.0, 1.0);
|
|
393
|
+
float m = 1.15*pow(clamp((phi - 0.04)/0.36, 0.0, 1.0), 1.6);
|
|
394
|
+
float Phi = 2.0*PI*s/(9.0*w) + ph0;
|
|
395
|
+
float eB = w*m*(0.5 - 0.5*cos(Phi));
|
|
396
|
+
float dStr = d - eIn - eB, wStr = w - eIn - eB;
|
|
397
|
+
vec2 gStr = gv - (m*PI/9.0*sin(Phi))*ts;
|
|
398
|
+
float pm0 = 0.0; float dEff = dStr, wEff = wStr; vec2 gEff = gStr; float kill = 1.0;
|
|
399
|
+
if (uBeads > 0.5 && phi > 0.0) {
|
|
400
|
+
float kk = floor(Phi/(2.0*PI) + 0.5), ds = (Phi - 2.0*PI*kk)*9.0*w/(2.0*PI);
|
|
401
|
+
vec2 rel = ts*ds + g*(d - w); float rr = length(rel);
|
|
402
|
+
float Rd = w*1.05*sqrt(clamp(1.0 - smoothstep(0.56, 1.0, phi), 0.0, 1.0));
|
|
403
|
+
float pm = smoothstep(0.36, 0.5, phi); pm0 = pm;
|
|
404
|
+
dEff = mix(dStr, Rd - rr, pm); wEff = mix(wStr, Rd, pm); gEff = mix(gStr, -rel/max(rr, 1e-4), pm);
|
|
405
|
+
kill = smoothstep(0.0, 0.07, 1.0 - phi);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// --- MELT (erase): liquefy -> gravity-fed rivulets and drops -> dewetting holes -> evaporating beads. All closed form in (p, e).
|
|
409
|
+
float Lm = 0.0, thin = 0.0, uEv = 0.0, dripWin = 0.0, dripMask = 0.0, sagE = 0.0;
|
|
410
|
+
if (uMeltOn > 0.5) {
|
|
411
|
+
float tL = 0.18 + 0.2*uMelt, tD0 = 0.2 + 0.2*uMelt;
|
|
412
|
+
Lm = smoothstep(0.0, tL, uE);
|
|
413
|
+
float eEv = 0.7 + 0.08*h21(vec2(gh, 9.1));
|
|
414
|
+
uEv = clamp((uE - eEv)/(1.0 - eEv), 0.0, 1.0);
|
|
415
|
+
float evap = w*(1.0 - sqrt(1.0 - uEv)); // radius^2 falls linearly: ends exactly at e = 1
|
|
416
|
+
// slump: the contact line at lower edges thickens and sags, upper edges drain (local flow, not a transform)
|
|
417
|
+
float lump = 0.55 + 0.9*vnz(vec2(p.x*16.0, 4.2));
|
|
418
|
+
sagE = 0.024*Lm*lump*(1.0 - uEv);
|
|
419
|
+
dEff += sagE*max(g.y, 0.0) - 0.35*sagE*max(-g.y, 0.0) - evap;
|
|
420
|
+
wEff += 0.5*sagE - evap;
|
|
421
|
+
thin = smoothstep(tD0, 1.0, uE);
|
|
422
|
+
// dewetting: a hole opens in each Voronoi cell of the film and grows radially; the metal left between holes is a network
|
|
423
|
+
// of strips that breaks into beads
|
|
424
|
+
float cD = 0.15; vec2 ci = floor(p/cD);
|
|
425
|
+
float dHole = 1e3; vec2 gHole = vec2(0.0, 1.0);
|
|
426
|
+
for (int j = -1; j <= 1; j++) for (int i = -1; i <= 1; i++) {
|
|
427
|
+
vec2 cc = ci + vec2(float(i), float(j));
|
|
428
|
+
vec2 c = (cc + 0.15 + 0.7*vec2(h21(cc + 11.0), h21(cc + 37.0)))*cD;
|
|
429
|
+
float tn = tD0 + 0.55*(1.0 - tD0)*h21(cc + 5.0);
|
|
430
|
+
float rad = 0.18*max(uE - tn, 0.0)/(1.0 - tD0);
|
|
431
|
+
vec2 rv = p - c; float rl = max(length(rv), 1e-4);
|
|
432
|
+
float dd = uE > tn ? rl - rad : 1e3;
|
|
433
|
+
smin2(dHole, gHole, dd, rv/rl, 0.01);
|
|
434
|
+
}
|
|
435
|
+
smin2(dEff, gEff, dHole, gHole, 0.012);
|
|
436
|
+
// rivulets: a hashed column cell under a bottom edge may feed a drip: thread with a bead at its head (accelerates, slows),
|
|
437
|
+
// necks and pinches (Plateau-Rayleigh), the bead falls as y = 0.5 g t^2 and evaporates, the thread recoils into the edge
|
|
438
|
+
float cw = 0.075, kx = floor(p.x/cw);
|
|
439
|
+
float x0 = (kx + 0.5 + 0.3*(h21(vec2(kx, 7.7)) - 0.5))*cw;
|
|
440
|
+
float ye = texture2D(uDr, fieldUV(vec2(x0, p.y))).x;
|
|
441
|
+
float hk = h21(vec2(kx*1.37 + floor(ye/0.06)*7.1, 2.9));
|
|
442
|
+
if (ye > -50.0 && hk < uDrips*0.55 && uE > 0.04) {
|
|
443
|
+
float h1 = h21(vec2(hk*91.7, 1.0)), h2 = h21(vec2(hk*91.7, 2.0)), h3 = h21(vec2(hk*91.7, 3.0)), h4 = h21(vec2(hk*91.7, 4.0));
|
|
444
|
+
float e0 = 0.05 + 0.30*h1, Tr = 0.14 + 0.12*h2, ep = e0 + Tr;
|
|
445
|
+
float Lmax = 0.12 + 0.36*h3*h3, rt = 0.010 + 0.006*h4, rb = 1.75*rt + 0.004;
|
|
446
|
+
float q = ye - p.y;
|
|
447
|
+
float tau = clamp((uE - e0)/Tr, 0.0, 1.0);
|
|
448
|
+
float att = uE < ep ? 1.0 : 0.0, tf = max(uE - ep, 0.0);
|
|
449
|
+
float hq = Lmax*tau*tau*(3.0 - 2.0*tau)*mix(1.0 - smoothstep(0.0, 0.07, tf), 1.0, att);
|
|
450
|
+
float neck = smoothstep(ep - 0.07, ep, uE)*att;
|
|
451
|
+
float dx = p.x - (x0 + 0.003*sin(q*45.0 + hk*30.0));
|
|
452
|
+
float nq = (q - 0.85*hq)/0.035;
|
|
453
|
+
float rth = rt*(1.0 + 1.3*exp(-max(q, 0.0)/0.04))*(1.0 - 0.95*neck*exp(-nq*nq));
|
|
454
|
+
float on = step(e0, uE);
|
|
455
|
+
float dT = min(rth - abs(dx), min(q + 0.02, hq - q + rb*0.5));
|
|
456
|
+
dT = (att > 0.5 || tf < 0.085) ? dT : -1.0;
|
|
457
|
+
vec2 gT = vec2(-sign(dx), 0.0);
|
|
458
|
+
float rH = att > 0.5 ? rb*(0.4 + 0.6*smoothstep(0.0, 0.2, tau)) : 0.6*rb*(1.0 - smoothstep(0.03, 0.09, tf));
|
|
459
|
+
vec2 cH = vec2(x0, ye - hq), rvH = p - cH; float lH = max(length(rvH), 1e-4);
|
|
460
|
+
float dB = rH - lH; vec2 gB = -rvH/lH;
|
|
461
|
+
float dD = dT; vec2 gD = gT;
|
|
462
|
+
smax2(dD, gD, dB, gB, 0.008);
|
|
463
|
+
float rd = rb*sqrt(max(0.0, 1.0 - tf/0.2)); // falling drop evaporates before it leaves the extent
|
|
464
|
+
vec2 cF = vec2(x0, ye - Lmax - 0.5*25.0*tf*tf); vec2 rvF = p - cF; rvF.y /= 1.0 + 5.0*min(tf, 0.1);
|
|
465
|
+
float lF = max(length(rvF), 1e-4);
|
|
466
|
+
float dF = att > 0.5 ? -1.0 : rd - lF; vec2 gF = -rvF/lF;
|
|
467
|
+
smax2(dD, gD, dF, gF, 0.008);
|
|
468
|
+
dD = on > 0.5 ? dD : -1.0;
|
|
469
|
+
float dBefore = dEff;
|
|
470
|
+
smax2(dEff, gEff, dD, gD, 0.012);
|
|
471
|
+
dripWin = smoothstep(-0.004, 0.004, dD - dBefore);
|
|
472
|
+
dripMask = smoothstep(-0.03, -0.01, dD);
|
|
473
|
+
wEff = mix(wEff, 0.014, dripWin);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// --- free surface: circular-arc meniscus, analytic normal
|
|
478
|
+
float fw = max(fwidth(dEff), 1e-5);
|
|
479
|
+
float shr = max(clamp((eIn + eB)/w, 0.0, 1.0), pm0);
|
|
480
|
+
shr = max(shr, uEv);
|
|
481
|
+
float Re = max(mix(uR, min(uR, max(wEff, 0.004)), smoothstep(0.0, 0.2, shr)), 1e-3);
|
|
482
|
+
Re = mix(Re, min(Re, 0.016), dripWin);
|
|
483
|
+
Re *= 1.0 + 0.8*Lm; // meniscus relaxes: a wider, rounder rim
|
|
484
|
+
float dC = clamp(dEff, 0.0, Re);
|
|
485
|
+
vec2 nxy = -pow(1.0 - dC/Re, mix(1.6, 1.15, Lm))*gEff;
|
|
486
|
+
float nz = sqrt(max(0.0, 1.0 - dot(nxy, nxy)));
|
|
487
|
+
float crown = 0.30*clamp((wEff - dEff)/max(wEff, 1e-3), 0.0, 1.0);
|
|
488
|
+
nxy -= gEff*crown;
|
|
489
|
+
float te = uTime*uIdleSpeed;
|
|
490
|
+
nxy -= surfSlope(p, te*uSpeed)*(uRough*uIdle*(1.0 + 2.2*Lm));
|
|
491
|
+
float rimE = clamp(length(nxy)*1.4, 0.0, 1.0); // how fast the thickness changes here
|
|
492
|
+
vec2 tg = vec2(-gEff.y, gEff.x);
|
|
493
|
+
|
|
494
|
+
// --- oxide skin: the film is stiff, so where the metal is compressed (rim, fast thickness change) it creases in folds
|
|
495
|
+
// parallel to the contour (slow value-noise warp keeps them from being a regular grating)
|
|
496
|
+
float dcl = max(dEff, 0.0);
|
|
497
|
+
float vnA = vnz(p*23.0), vnB = vnz(p*9.0 + 7.3);
|
|
498
|
+
float wph = 6.2832*dcl/0.028 + 5.0*vnA + 3.0*vnB;
|
|
499
|
+
float wph2 = 6.2832*dot(p, tg)/0.045 + 6.0*vnB;
|
|
500
|
+
float aaW = (1.0 - smoothstep(0.30, 0.60, fwidth(wph)/6.2832))*(1.0 - smoothstep(0.30, 0.60, fwidth(wph2)/6.2832));
|
|
501
|
+
float envW = (0.25 + 0.75*rimE)*exp(-dcl/(1.3*Re + 0.01))*aaW*uOxide;
|
|
502
|
+
nxy -= gEff*(cos(wph)*0.04*envW) + tg*(sin(wph2)*0.015*envW);
|
|
503
|
+
|
|
504
|
+
// --- ferrofluid (Rosensweig): hexagonal lattice of cones, anchored to the page (three plane waves at 120 degrees).
|
|
505
|
+
// cone height h = 1 - sqrt(1 - c), c = (cos+cos+cos+1.5)/4.5: linear flanks, sharp tips; amplitude swells along the strokes
|
|
506
|
+
float Lam = 0.03 + 0.3*uR, kS = 4.0*PI/(1.7320508*Lam);
|
|
507
|
+
vec2 q2 = vec2(-0.5, 0.8660254), q3 = vec2(-0.5, -0.8660254);
|
|
508
|
+
float f1 = kS*p.x, f2 = kS*dot(q2, p), f3 = kS*dot(q3, p);
|
|
509
|
+
float cs = clamp((cos(f1) + cos(f2) + cos(f3) + 1.5)/4.5, 0.0, 1.0);
|
|
510
|
+
vec2 gcs = -kS*(vec2(1.0, 0.0)*sin(f1) + q2*sin(f2) + q3*sin(f3))/4.5;
|
|
511
|
+
vec2 gsp = gcs/(2.0*sqrt(max(1.0 - cs, 2e-3)));
|
|
512
|
+
float swell = 0.62 + 0.38*sin(6.2832*s/0.8 - te*0.9*uSpeed + ph0);
|
|
513
|
+
float envS = smoothstep(0.08*wEff, 0.4*wEff, dEff)*uSpike*swell;
|
|
514
|
+
nxy -= gsp*(0.2*Lam)*envS*(0.3 + 0.7*nz);
|
|
515
|
+
float aoS = mix(1.0, 0.62 + 0.38*pow(cs, 0.6), clamp(envS*1.4, 0.0, 1.0));
|
|
516
|
+
vec3 n = normalize(vec3(nxy, nz + 0.02));
|
|
517
|
+
vec3 nV = normalize(vE0*n.x + vE1*n.y + vE2*n.z);
|
|
518
|
+
vec3 V = normalize(-vView);
|
|
519
|
+
float ndv = clamp(dot(nV, V), 0.0, 1.0);
|
|
520
|
+
vec3 r = reflect(-V, nV);
|
|
521
|
+
|
|
522
|
+
// --- environment with anisotropic blur along the contour at grazing angles
|
|
523
|
+
vec3 T = normalize(vE0*tg.x + vE1*tg.y + vec3(1e-5));
|
|
524
|
+
float gz = pow(1.0 - ndv, 2.0);
|
|
525
|
+
float rw = length(fwidth(r)); // screen-space footprint of the reflection: no sub-pixel highlights
|
|
526
|
+
float matt = smoothstep(0.0, 0.8, uEv);
|
|
527
|
+
float dl = 0.012 + 0.016*uRough + 0.22*gz + 0.05*Lm + 0.25*matt;
|
|
528
|
+
vec3 env = vec3(0.0); float ws = 0.0;
|
|
529
|
+
for (int i = -2; i <= 2; i++) { float f = float(i); float wk = exp(-0.5*f*f/1.3); vec3 rk = normalize(r + T*(f*dl*0.55)); env += studio(rk, 0.02 + 0.5*dl + 0.8*rw, te)*wk; ws += wk; }
|
|
530
|
+
env /= ws;
|
|
531
|
+
env = max(mix(vec3(0.20), env, uEnv), 0.0);
|
|
532
|
+
|
|
533
|
+
// --- Fresnel (Schlick) between the metal's own reflectance and its grazing tint
|
|
534
|
+
vec3 c1 = uCol/max(max(uCol.r, uCol.g), max(uCol.b, 1e-3)), c2 = uCol2/max(max(uCol2.r, uCol2.g), max(uCol2.b, 1e-3));
|
|
535
|
+
vec3 F0 = uRefl*mix(vec3(1.0), c1, uTint), F90 = mix(vec3(1.0), c2, uTint);
|
|
536
|
+
float f5 = pow(1.0 - ndv, 5.0), edgeT = 1.0 - smoothstep(0.0, Re, dEff);
|
|
537
|
+
vec3 F = mix(F0, F90*0.97, clamp(f5 + 0.22*edgeT, 0.0, 1.0))*(1.0 - 0.35*thin); // a thinning film reflects less
|
|
538
|
+
// thin-film interference of the oxide: phase = 4 pi n t cos(theta_t)/lambda for three wavelengths; film thickness follows
|
|
539
|
+
// the height (dC/Re), the rim and a slow patchiness. Only the deviation from the mean is applied: hue shift, no brightening.
|
|
540
|
+
float hN = dC/Re;
|
|
541
|
+
float tnm = (140.0 + 420.0*hN + 160.0*vnz(p*2.7 + te*0.02) + 200.0*rimE)*(1.0 - 0.6*thin); // thinner film: fringes sweep
|
|
542
|
+
float ct = sqrt(max(1.0 - (1.0 - ndv*ndv)/3.24, 0.0));
|
|
543
|
+
vec3 mo = cos(4.0*PI*1.8*tnm*ct/vec3(650.0, 550.0, 450.0));
|
|
544
|
+
vec3 col = env*F*(1.0 + 0.13*(uOxide + 1.6*thin)*(mo - vec3((mo.x + mo.y + mo.z)/3.0)))*aoS*(1.0 + 1.1*clamp(envS*1.4, 0.0, 1.0)*pow(cs, 9.0)); // sharp tips catch a pin-point of the sky
|
|
545
|
+
col *= mix(vec3(1.0), vec3(1.07, 0.93, 0.80)*0.8, 0.9*thin); // warms and darkens as it thins
|
|
546
|
+
col = mix(col, vec3(dot(col, vec3(0.3333)))*0.55*vec3(1.0, 0.95, 0.9), 0.8*matt); // last beads go matte
|
|
547
|
+
col *= mix(0.10, 1.0, smoothstep(0.0, 1.0, dEff/(0.006 + 1.8*fw))); // dark contact line where metal meets the surface
|
|
548
|
+
|
|
549
|
+
float cov = clamp(0.5 + dEff/fw, 0.0, 1.0)*max(1.0 - smoothstep(0.30*w + 0.03*Lm, 0.36*w + 0.004 + 0.03*Lm, -d), dripMask); // metal never strays beyond the bead overshoot
|
|
550
|
+
float tiny = uBeads > 0.5 ? mix(1.0, smoothstep(0.8, 2.2, wEff/fw), pm0) : 1.0; // drops under ~2 px dissolve instead of speckling
|
|
551
|
+
float tinyM = uMeltOn > 0.5 ? mix(1.0, smoothstep(0.8, 2.2, wEff/fw), smoothstep(0.0, 0.3, uEv)) : 1.0;
|
|
552
|
+
float melta = uMeltOn > 0.5 ? mix(1.0, 0.75, 0.8*thin)*(1.0 - smoothstep(0.985, 1.0, uE)) : 1.0;
|
|
553
|
+
float a = cov*uOpacity*kill*tiny*tinyM*melta*smoothstep(0.0, 0.06, gT);
|
|
554
|
+
vec3 outc = col*a;
|
|
555
|
+
gl_FragColor = vec4(outc, a);
|
|
556
|
+
#include <tonemapping_fragment>
|
|
557
|
+
#include <colorspace_fragment>
|
|
558
|
+
float nz2 = fract(52.9829189*fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715))));
|
|
559
|
+
gl_FragColor.rgb += (nz2 - 0.5)*(1.0/255.0)*a; // static dither: no banding in the gradients
|
|
560
|
+
}`;
|
|
561
|
+
// ---- variant ------------------------------------------------------------------------------------------------------------
|
|
562
|
+
const ROWS = {
|
|
563
|
+
thickness: { name: 'thickness', label: 'Thickness', description: 'Puddle depth: the radius of the rounded meniscus at the rim of every letter.', type: 'number', min: 0.01, max: 0.2, step: 0.005, unit: 'em' },
|
|
564
|
+
reflectivity: { name: 'reflectivity', label: 'Reflectivity', description: 'Normal-incidence reflectance of the metal (mercury and chrome are ~0.6-0.9).', type: 'number', min: 0.3, max: 1, step: 0.01 },
|
|
565
|
+
environment: { name: 'environment', label: 'Environment', description: 'Contrast and brightness of the studio the metal mirrors.', type: 'number', min: 0.2, max: 1.5, step: 0.01 },
|
|
566
|
+
tint: { name: 'tint', label: 'Metal tint', description: 'How strongly the metal colours its reflection (0 = neutral chrome, 1 = full colour).', type: 'number', min: 0, max: 1, step: 0.01 },
|
|
567
|
+
color: { name: 'color', label: 'Metal colour', description: 'Colour of the metal at normal incidence (silver, gold, copper, blue-steel).', type: 'color' },
|
|
568
|
+
color2: { name: 'color2', label: 'Edge tint', description: 'Colour of the reflection at grazing angles and on the rim.', type: 'color' },
|
|
569
|
+
roughness: { name: 'roughness', label: 'Ripples', description: 'Amplitude of the surface swells and capillary ripples that tilt the mirror.', type: 'number', min: 0, max: 2, step: 0.01 },
|
|
570
|
+
rippleSpeed: { name: 'rippleSpeed', label: 'Ripple speed', description: 'Speed of the travelling surface waves.', type: 'number', min: 0, max: 3, step: 0.01 },
|
|
571
|
+
oxide: { name: 'oxide', label: 'Oxide skin', description: 'Nanometre oxide film: thin-film interference tint and fine creases where the skin is compressed.', type: 'number', min: 0, max: 1, step: 0.01 },
|
|
572
|
+
spikes: { name: 'spikes', label: 'Spikes', description: 'Magnetic field: the pool breaks into a hexagonal lattice of sharp cones (Rosensweig instability).', type: 'number', min: 0, max: 1, step: 0.01 },
|
|
573
|
+
melt: { name: 'melt', label: 'Melt', description: 'Erase: how long the metal stays liquid and runs before it dewets (0 = dewets early, 1 = long liquid phase).', type: 'number', min: 0, max: 1, step: 0.01 },
|
|
574
|
+
drips: { name: 'drips', label: 'Drips', description: 'Erase: density of gravity-fed rivulets and falling drops under the strokes.', type: 'number', min: 0, max: 1, step: 0.01 },
|
|
575
|
+
opacity: { name: 'opacity', label: 'Opacity', description: 'Overall opacity.', type: 'number', min: 0, max: 1, step: 0.01 },
|
|
576
|
+
};
|
|
577
|
+
export default {
|
|
578
|
+
key: 'liquidMetal', source: 'outline',
|
|
579
|
+
drawMethods: ['flow', ...DRAW_METHODS], eraseMethods: ['melt', 'beads', ...ERASE_METHODS], drawDefault: 'flow', eraseDefault: 'melt',
|
|
580
|
+
animDefaults: { eraseDuration: 4.5, eraseEase: 'linear' },
|
|
581
|
+
methodInfo: {
|
|
582
|
+
melt: { label: 'Melt', hint: 'The metal liquefies, runs down in drips, dewets into beads and evaporates.' },
|
|
583
|
+
flow: { label: 'Flow', hint: 'Metal runs along each stroke with a bulbous head that overshoots and settles.' },
|
|
584
|
+
beads: { label: 'Beads', hint: 'Strokes break into drops (Rayleigh-Plateau) that shrink away.' },
|
|
585
|
+
},
|
|
586
|
+
catalog: { name: 'Liquid Metal', description: 'Letters as puddles of mercury: a surface-tension meniscus mirrors a drifting studio with Fresnel chrome reflections and slow ripples. Use for premium logos, tech and product titles.', tags: ['metal', 'chrome', 'mercury', 'liquid', 'reflection', 'fresnel', 'luxury'] },
|
|
587
|
+
defaults: { thickness: 0.06, roughness: 1, reflectivity: 0.8, environment: 1.15, tint: 0.7, rippleSpeed: 1, oxide: 0.4, spikes: 0, melt: 0.5, drips: 0.6, color: '#cdd5df', color2: '#f4f7ff', opacity: 1 },
|
|
588
|
+
ui: {
|
|
589
|
+
main: [ROWS.thickness, ROWS.environment, ROWS.color, ROWS.tint],
|
|
590
|
+
more: [ROWS.melt, ROWS.drips, ROWS.spikes, ROWS.oxide, ROWS.reflectivity, ROWS.roughness, ROWS.rippleSpeed, ROWS.color2, ROWS.opacity],
|
|
591
|
+
},
|
|
592
|
+
structural: [],
|
|
593
|
+
presets: [
|
|
594
|
+
{ name: 'Mercury', description: 'Cold silver chrome.', patch: {} },
|
|
595
|
+
{ name: 'Gold', description: 'Warm polished gold.', patch: { color: '#e0a93a', color2: '#fff1c4', tint: 0.9, reflectivity: 0.85 } },
|
|
596
|
+
{ name: 'Copper', description: 'Burnished copper.', patch: { color: '#d9774a', color2: '#ffd9bd', tint: 0.9, reflectivity: 0.75, environment: 1.1 } },
|
|
597
|
+
{ name: 'Blue steel', description: 'Dark blue steel, calm surface.', patch: { color: '#7d9cc4', color2: '#d4e6ff', tint: 1, reflectivity: 0.7, roughness: 0.5, environment: 0.9 } },
|
|
598
|
+
{ name: 'Ferrofluid', description: 'Black magnetic fluid pulled into a lattice of spikes.', patch: { color: '#58606c', color2: '#b8c8e0', tint: 0.6, reflectivity: 0.62, environment: 1.35, spikes: 0.9, oxide: 0.2, thickness: 0.07 } },
|
|
599
|
+
],
|
|
600
|
+
build(layout, cfg, anim) {
|
|
601
|
+
const strokes = layout.strokes;
|
|
602
|
+
prepare(strokes, 'outline');
|
|
603
|
+
const G = layout.glyphs.length;
|
|
604
|
+
strokes.forEach((s) => { s.glyphN = s.glyph / Math.max(1, G - 1); });
|
|
605
|
+
const flow = anim.draw.method === 'flow', beads = anim.erase.method === 'beads', melt = anim.erase.method === 'melt';
|
|
606
|
+
const a2 = { ...anim, draw: { ...anim.draw, method: flow ? 'trace' : anim.draw.method }, erase: { ...anim.erase, method: beads || melt ? 'fade' : anim.erase.method } };
|
|
607
|
+
const { infoD, infoE } = applyAnim(strokes, a2, G);
|
|
608
|
+
const field = buildField(strokes, { source: 'outline', texels: 1024, pad: 0.3, maxDist: 0.4 });
|
|
609
|
+
const aux = bakeAux(field);
|
|
610
|
+
const st = (anim.draw.stagger ?? 0.6) / Math.max(1, G);
|
|
611
|
+
const wv = [[0.5, 1.4, 0.34], [2.3, 0.95, 0.43], [3.9, 1.9, 0.27]].map(([a, lam, om]) => new THREE.Vector4(Math.cos(a), Math.sin(a), (2 * Math.PI) / lam, om));
|
|
612
|
+
const uniforms = {
|
|
613
|
+
...uniformsBase(), uF0: { value: field.f0 }, uF1: { value: field.f1 }, uFExt: { value: field.ext }, uFMax: { value: field.maxDist },
|
|
614
|
+
uM: { value: aux.tex }, uDr: { value: aux.drtex }, uMeltOn: { value: melt ? 1 : 0 }, uMelt: { value: 0.5 }, uDrips: { value: 0.6 }, uGt: { value: aux.gtex }, uTexel: { value: field.texel }, uR: { value: cfg.thickness }, uRough: { value: 1 }, uRefl: { value: 0.8 }, uEnv: { value: 1 }, uTint: { value: 0.7 }, uSpeed: { value: 1 }, uOpacity: { value: 1 }, uOxide: { value: 0.4 }, uSpike: { value: 0 },
|
|
615
|
+
uCol: { value: hex(cfg.color) }, uCol2: { value: hex(cfg.color2) },
|
|
616
|
+
uFlow: { value: flow ? 1 : 0 }, uBeads: { value: beads ? 1 : 0 }, uNG: { value: G }, uSt: { value: st }, uWin: { value: 1 - (G - 1) * st },
|
|
617
|
+
uSrc: { value: aux.src }, uWv: { value: wv },
|
|
618
|
+
};
|
|
619
|
+
const mat = new THREE.ShaderMaterial({
|
|
620
|
+
uniforms, vertexShader: VERT, fragmentShader: fieldFrag(FRAG), transparent: true, depthWrite: false, side: THREE.DoubleSide,
|
|
621
|
+
blending: THREE.CustomBlending, blendEquation: THREE.AddEquation, blendSrc: THREE.OneFactor, blendDst: THREE.OneMinusSrcAlphaFactor,
|
|
622
|
+
});
|
|
623
|
+
const e = field.ext;
|
|
624
|
+
const geo = new THREE.PlaneGeometry(e.z, e.w);
|
|
625
|
+
geo.translate(e.x + e.z / 2, e.y + e.w / 2, 0);
|
|
626
|
+
const mesh = new THREE.Mesh(geo, mat);
|
|
627
|
+
mesh.frustumCulled = false;
|
|
628
|
+
const group = new THREE.Group();
|
|
629
|
+
group.add(mesh);
|
|
630
|
+
const api = {
|
|
631
|
+
object: group,
|
|
632
|
+
apply(c) {
|
|
633
|
+
const u = mat.uniforms;
|
|
634
|
+
u.uR.value = c.thickness;
|
|
635
|
+
u.uRough.value = c.roughness;
|
|
636
|
+
u.uRefl.value = c.reflectivity;
|
|
637
|
+
u.uEnv.value = c.environment;
|
|
638
|
+
u.uTint.value = c.tint;
|
|
639
|
+
u.uSpeed.value = c.rippleSpeed;
|
|
640
|
+
u.uOpacity.value = c.opacity;
|
|
641
|
+
u.uOxide.value = c.oxide;
|
|
642
|
+
u.uMelt.value = c.melt;
|
|
643
|
+
u.uDrips.value = c.drips;
|
|
644
|
+
u.uSpike.value = c.spikes;
|
|
645
|
+
u.uCol.value.set(c.color);
|
|
646
|
+
u.uCol2.value.set(c.color2);
|
|
647
|
+
api.c = c;
|
|
648
|
+
},
|
|
649
|
+
update(S, time) { setReveal(mat.uniforms, S, infoD, infoE, anim.draw.duration, time); },
|
|
650
|
+
dispose() { geo.dispose(); mat.dispose(); field.dispose(); aux.dispose(); },
|
|
651
|
+
};
|
|
652
|
+
api.apply(cfg);
|
|
653
|
+
return api;
|
|
654
|
+
},
|
|
655
|
+
};
|