@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.
Files changed (684) hide show
  1. package/dist/animationsV2/ClipPlayer.d.ts.map +1 -1
  2. package/dist/animationsV2/ClipPlayer.js +13 -9
  3. package/dist/animationsV2/ClipsRuntime.d.ts +44 -3
  4. package/dist/animationsV2/ClipsRuntime.d.ts.map +1 -1
  5. package/dist/animationsV2/ClipsRuntime.js +173 -55
  6. package/dist/animationsV2/appliers.d.ts.map +1 -1
  7. package/dist/animationsV2/appliers.js +21 -5
  8. package/dist/animationsV2/index.d.ts +1 -1
  9. package/dist/animationsV2/index.d.ts.map +1 -1
  10. package/dist/animationsV2/normalize.d.ts.map +1 -1
  11. package/dist/animationsV2/normalize.js +7 -3
  12. package/dist/animationsV2/sequenceUtils.d.ts +44 -6
  13. package/dist/animationsV2/sequenceUtils.d.ts.map +1 -1
  14. package/dist/animationsV2/sequenceUtils.js +58 -12
  15. package/dist/animationsV2/types.d.ts +22 -12
  16. package/dist/animationsV2/types.d.ts.map +1 -1
  17. package/dist/api/sceneHandle.d.ts +35 -1
  18. package/dist/api/sceneHandle.d.ts.map +1 -1
  19. package/dist/api/sceneHandle.js +88 -17
  20. package/dist/components/AdvancedGrid.d.ts +1 -5
  21. package/dist/components/AdvancedGrid.d.ts.map +1 -1
  22. package/dist/components/AdvancedGrid.js +6 -35
  23. package/dist/components/AnimatedObject.d.ts.map +1 -1
  24. package/dist/components/AnimatedObject.js +9 -4
  25. package/dist/components/ApollonianGrid.d.ts +1 -1
  26. package/dist/components/ApollonianGrid.d.ts.map +1 -1
  27. package/dist/components/ApollonianGrid.js +3 -28
  28. package/dist/components/ChladniGrid.d.ts +1 -1
  29. package/dist/components/ChladniGrid.d.ts.map +1 -1
  30. package/dist/components/ChladniGrid.js +6 -35
  31. package/dist/components/CircuitGrid.d.ts +1 -1
  32. package/dist/components/CircuitGrid.d.ts.map +1 -1
  33. package/dist/components/CircuitGrid.js +6 -34
  34. package/dist/components/ConformalGrid.d.ts +1 -1
  35. package/dist/components/ConformalGrid.d.ts.map +1 -1
  36. package/dist/components/ConformalGrid.js +3 -34
  37. package/dist/components/ContourGrid.d.ts +1 -1
  38. package/dist/components/ContourGrid.d.ts.map +1 -1
  39. package/dist/components/ContourGrid.js +6 -34
  40. package/dist/components/CustomPrimitive.js +1 -1
  41. package/dist/components/EnvironmentObject.d.ts.map +1 -1
  42. package/dist/components/EnvironmentObject.js +9 -7
  43. package/dist/components/FlowNetGrid.d.ts +1 -1
  44. package/dist/components/FlowNetGrid.d.ts.map +1 -1
  45. package/dist/components/FlowNetGrid.js +6 -34
  46. package/dist/components/FractalGrid.d.ts +1 -1
  47. package/dist/components/FractalGrid.d.ts.map +1 -1
  48. package/dist/components/FractalGrid.js +6 -37
  49. package/dist/components/Galaxy.d.ts.map +1 -1
  50. package/dist/components/Galaxy.js +9 -23
  51. package/dist/components/GirihGrid.d.ts +1 -1
  52. package/dist/components/GirihGrid.d.ts.map +1 -1
  53. package/dist/components/GirihGrid.js +6 -35
  54. package/dist/components/GravWaveGrid.d.ts +1 -1
  55. package/dist/components/GravWaveGrid.d.ts.map +1 -1
  56. package/dist/components/GravWaveGrid.js +6 -35
  57. package/dist/components/HexGrid.d.ts +1 -5
  58. package/dist/components/HexGrid.d.ts.map +1 -1
  59. package/dist/components/HexGrid.js +6 -36
  60. package/dist/components/HilbertGrid.d.ts +1 -1
  61. package/dist/components/HilbertGrid.d.ts.map +1 -1
  62. package/dist/components/HilbertGrid.js +3 -30
  63. package/dist/components/HyperbolicGrid.d.ts +1 -1
  64. package/dist/components/HyperbolicGrid.d.ts.map +1 -1
  65. package/dist/components/HyperbolicGrid.js +6 -34
  66. package/dist/components/LandObject.d.ts +9 -0
  67. package/dist/components/LandObject.d.ts.map +1 -0
  68. package/dist/components/LandObject.js +15 -0
  69. package/dist/components/LensingGrid.d.ts +1 -1
  70. package/dist/components/LensingGrid.d.ts.map +1 -1
  71. package/dist/components/LensingGrid.js +3 -29
  72. package/dist/components/LightsManager.d.ts.map +1 -1
  73. package/dist/components/LightsManager.js +8 -0
  74. package/dist/components/ModelBoundary.d.ts +2 -0
  75. package/dist/components/ModelBoundary.d.ts.map +1 -1
  76. package/dist/components/ModelBoundary.js +3 -0
  77. package/dist/components/ModelPrimitive.d.ts.map +1 -1
  78. package/dist/components/ModelPrimitive.js +6 -0
  79. package/dist/components/MoireGrid.d.ts +1 -1
  80. package/dist/components/MoireGrid.d.ts.map +1 -1
  81. package/dist/components/MoireGrid.js +6 -35
  82. package/dist/components/MoonDisc.d.ts +11 -0
  83. package/dist/components/MoonDisc.d.ts.map +1 -0
  84. package/dist/components/MoonDisc.js +128 -0
  85. package/dist/components/ObjectNode.d.ts.map +1 -1
  86. package/dist/components/ObjectNode.js +15 -4
  87. package/dist/components/ObjectsRenderer.d.ts.map +1 -1
  88. package/dist/components/ObjectsRenderer.js +7 -5
  89. package/dist/components/OceanBuilder.d.ts.map +1 -1
  90. package/dist/components/OceanBuilder.js +2 -0
  91. package/dist/components/ParastichyGrid.d.ts +1 -1
  92. package/dist/components/ParastichyGrid.d.ts.map +1 -1
  93. package/dist/components/ParastichyGrid.js +3 -30
  94. package/dist/components/PhyllotaxisGrid.d.ts +1 -1
  95. package/dist/components/PhyllotaxisGrid.d.ts.map +1 -1
  96. package/dist/components/PhyllotaxisGrid.js +3 -32
  97. package/dist/components/ProjectLoader.d.ts +5 -3
  98. package/dist/components/ProjectLoader.d.ts.map +1 -1
  99. package/dist/components/ProjectLoader.js +6 -3
  100. package/dist/components/QuasiGrid.d.ts +1 -1
  101. package/dist/components/QuasiGrid.d.ts.map +1 -1
  102. package/dist/components/QuasiGrid.js +6 -33
  103. package/dist/components/RadarGrid.d.ts +1 -1
  104. package/dist/components/RadarGrid.d.ts.map +1 -1
  105. package/dist/components/RadarGrid.js +6 -34
  106. package/dist/components/ReactionDiffusionGrid.d.ts +1 -1
  107. package/dist/components/ReactionDiffusionGrid.d.ts.map +1 -1
  108. package/dist/components/ReactionDiffusionGrid.js +6 -35
  109. package/dist/components/SceneBuilder.d.ts +25 -3
  110. package/dist/components/SceneBuilder.d.ts.map +1 -1
  111. package/dist/components/SceneBuilder.js +68 -38
  112. package/dist/components/SkyController.d.ts +25 -1
  113. package/dist/components/SkyController.d.ts.map +1 -1
  114. package/dist/components/SkyController.js +189 -130
  115. package/dist/components/SkyMesh.d.ts.map +1 -1
  116. package/dist/components/SkyMesh.js +26 -1
  117. package/dist/components/SkyStars.d.ts +11 -0
  118. package/dist/components/SkyStars.d.ts.map +1 -0
  119. package/dist/components/SkyStars.js +187 -0
  120. package/dist/components/SkySystem.d.ts +3 -3
  121. package/dist/components/SkySystem.d.ts.map +1 -1
  122. package/dist/components/SkySystem.js +8 -2
  123. package/dist/components/Sun.d.ts +15 -1
  124. package/dist/components/Sun.d.ts.map +1 -1
  125. package/dist/components/Sun.js +64 -3
  126. package/dist/components/SunLight.d.ts +6 -1
  127. package/dist/components/SunLight.d.ts.map +1 -1
  128. package/dist/components/SunLight.js +96 -44
  129. package/dist/components/TerrainBuilder.d.ts.map +1 -1
  130. package/dist/components/TerrainBuilder.js +2 -0
  131. package/dist/components/TextGenerator.d.ts +9 -0
  132. package/dist/components/TextGenerator.d.ts.map +1 -0
  133. package/dist/components/TextGenerator.js +29 -0
  134. package/dist/components/TruchetGrid.d.ts +1 -1
  135. package/dist/components/TruchetGrid.d.ts.map +1 -1
  136. package/dist/components/TruchetGrid.js +3 -30
  137. package/dist/components/VoronoiGrid.d.ts +1 -1
  138. package/dist/components/VoronoiGrid.d.ts.map +1 -1
  139. package/dist/components/VoronoiGrid.js +6 -33
  140. package/dist/components/WallpaperGrid.d.ts +1 -1
  141. package/dist/components/WallpaperGrid.d.ts.map +1 -1
  142. package/dist/components/WallpaperGrid.js +6 -35
  143. package/dist/components/environment/Rain.d.ts +15 -0
  144. package/dist/components/environment/Rain.d.ts.map +1 -0
  145. package/dist/components/environment/Rain.js +110 -0
  146. package/dist/components/environment/Rainbow.d.ts +20 -0
  147. package/dist/components/environment/Rainbow.d.ts.map +1 -0
  148. package/dist/components/environment/Rainbow.js +974 -0
  149. package/dist/components/environment/Sandstorm.d.ts +20 -0
  150. package/dist/components/environment/Sandstorm.d.ts.map +1 -0
  151. package/dist/components/environment/Sandstorm.js +776 -0
  152. package/dist/components/environment/Snow.d.ts +20 -0
  153. package/dist/components/environment/Snow.d.ts.map +1 -0
  154. package/dist/components/environment/Snow.js +609 -0
  155. package/dist/components/environment/Thunderstorm.d.ts +20 -0
  156. package/dist/components/environment/Thunderstorm.d.ts.map +1 -0
  157. package/dist/components/environment/Thunderstorm.js +731 -0
  158. package/dist/components/environment/Tornado.d.ts +20 -0
  159. package/dist/components/environment/Tornado.d.ts.map +1 -0
  160. package/dist/components/environment/Tornado.js +762 -0
  161. package/dist/components/environment/index.d.ts +13 -0
  162. package/dist/components/environment/index.d.ts.map +1 -0
  163. package/dist/components/environment/index.js +7 -0
  164. package/dist/components/index.d.ts +10 -10
  165. package/dist/components/index.d.ts.map +1 -1
  166. package/dist/components/index.js +8 -6
  167. package/dist/components/land/LandPatch.d.ts +15 -0
  168. package/dist/components/land/LandPatch.d.ts.map +1 -0
  169. package/dist/components/land/LandPatch.js +170 -0
  170. package/dist/components/land/index.d.ts +3 -0
  171. package/dist/components/land/index.d.ts.map +1 -0
  172. package/dist/components/land/index.js +1 -0
  173. package/dist/components/space/Earth.d.ts +16 -0
  174. package/dist/components/space/Earth.d.ts.map +1 -0
  175. package/dist/components/space/Earth.js +75 -0
  176. package/dist/components/space/ShootingStar.d.ts +21 -0
  177. package/dist/components/space/ShootingStar.d.ts.map +1 -0
  178. package/dist/components/space/ShootingStar.js +101 -0
  179. package/dist/components/space/ShootingStars.d.ts +16 -0
  180. package/dist/components/space/ShootingStars.d.ts.map +1 -0
  181. package/dist/components/space/ShootingStars.js +71 -0
  182. package/dist/components/space/SolarSystem.d.ts +16 -0
  183. package/dist/components/space/SolarSystem.d.ts.map +1 -0
  184. package/dist/components/space/SolarSystem.js +141 -0
  185. package/dist/components/space/Stars.d.ts +20 -0
  186. package/dist/components/space/Stars.d.ts.map +1 -0
  187. package/dist/components/space/Stars.js +160 -0
  188. package/dist/components/space/index.d.ts +11 -0
  189. package/dist/components/space/index.d.ts.map +1 -0
  190. package/dist/components/space/index.js +8 -0
  191. package/dist/components/terrain/TerrainSurface.d.ts.map +1 -1
  192. package/dist/components/terrain/TerrainSurface.js +27 -3
  193. package/dist/components/terrain/types.d.ts +5 -1
  194. package/dist/components/terrain/types.d.ts.map +1 -1
  195. package/dist/components/text/BurnAwayText.d.ts +15 -0
  196. package/dist/components/text/BurnAwayText.d.ts.map +1 -0
  197. package/dist/components/text/BurnAwayText.js +4 -0
  198. package/dist/components/text/ChalkboardText.d.ts +15 -0
  199. package/dist/components/text/ChalkboardText.d.ts.map +1 -0
  200. package/dist/components/text/ChalkboardText.js +4 -0
  201. package/dist/components/text/ConstellationText.d.ts +15 -0
  202. package/dist/components/text/ConstellationText.d.ts.map +1 -0
  203. package/dist/components/text/ConstellationText.js +4 -0
  204. package/dist/components/text/EmbroideryText.d.ts +15 -0
  205. package/dist/components/text/EmbroideryText.d.ts.map +1 -0
  206. package/dist/components/text/EmbroideryText.js +4 -0
  207. package/dist/components/text/FourierSketchText.d.ts +15 -0
  208. package/dist/components/text/FourierSketchText.d.ts.map +1 -0
  209. package/dist/components/text/FourierSketchText.js +4 -0
  210. package/dist/components/text/FrostGrowthText.d.ts +15 -0
  211. package/dist/components/text/FrostGrowthText.d.ts.map +1 -0
  212. package/dist/components/text/FrostGrowthText.js +4 -0
  213. package/dist/components/text/HandwritingText.d.ts +15 -0
  214. package/dist/components/text/HandwritingText.d.ts.map +1 -0
  215. package/dist/components/text/HandwritingText.js +4 -0
  216. package/dist/components/text/InkBleedText.d.ts +15 -0
  217. package/dist/components/text/InkBleedText.d.ts.map +1 -0
  218. package/dist/components/text/InkBleedText.js +4 -0
  219. package/dist/components/text/LightPaintingText.d.ts +15 -0
  220. package/dist/components/text/LightPaintingText.d.ts.map +1 -0
  221. package/dist/components/text/LightPaintingText.js +4 -0
  222. package/dist/components/text/LiquidMetalText.d.ts +15 -0
  223. package/dist/components/text/LiquidMetalText.d.ts.map +1 -0
  224. package/dist/components/text/LiquidMetalText.js +4 -0
  225. package/dist/components/text/NeonTubeText.d.ts +15 -0
  226. package/dist/components/text/NeonTubeText.d.ts.map +1 -0
  227. package/dist/components/text/NeonTubeText.js +4 -0
  228. package/dist/components/text/PlasmaDischargeText.d.ts +15 -0
  229. package/dist/components/text/PlasmaDischargeText.d.ts.map +1 -0
  230. package/dist/components/text/PlasmaDischargeText.js +4 -0
  231. package/dist/components/text/TextObjectView.d.ts +12 -0
  232. package/dist/components/text/TextObjectView.d.ts.map +1 -0
  233. package/dist/components/text/TextObjectView.js +11 -0
  234. package/dist/components/text/engine/fieldkit.d.ts +24 -0
  235. package/dist/components/text/engine/fieldkit.d.ts.map +1 -0
  236. package/dist/components/text/engine/fieldkit.js +201 -0
  237. package/dist/components/text/engine/glyphs.d.ts +19 -0
  238. package/dist/components/text/engine/glyphs.d.ts.map +1 -0
  239. package/dist/components/text/engine/glyphs.js +269 -0
  240. package/dist/components/text/engine/looks/burnAway.d.ts +144 -0
  241. package/dist/components/text/engine/looks/burnAway.d.ts.map +1 -0
  242. package/dist/components/text/engine/looks/burnAway.js +593 -0
  243. package/dist/components/text/engine/looks/chalkboard.d.ts +135 -0
  244. package/dist/components/text/engine/looks/chalkboard.d.ts.map +1 -0
  245. package/dist/components/text/engine/looks/chalkboard.js +426 -0
  246. package/dist/components/text/engine/looks/constellation.d.ts +111 -0
  247. package/dist/components/text/engine/looks/constellation.d.ts.map +1 -0
  248. package/dist/components/text/engine/looks/constellation.js +496 -0
  249. package/dist/components/text/engine/looks/embroidery.d.ts +165 -0
  250. package/dist/components/text/engine/looks/embroidery.d.ts.map +1 -0
  251. package/dist/components/text/engine/looks/embroidery.js +645 -0
  252. package/dist/components/text/engine/looks/frostGrowth.d.ts +109 -0
  253. package/dist/components/text/engine/looks/frostGrowth.d.ts.map +1 -0
  254. package/dist/components/text/engine/looks/frostGrowth.js +727 -0
  255. package/dist/components/text/engine/looks/index.d.ts +2 -0
  256. package/dist/components/text/engine/looks/index.d.ts.map +1 -0
  257. package/dist/components/text/engine/looks/index.js +48 -0
  258. package/dist/components/text/engine/looks/inkBleed.d.ts +103 -0
  259. package/dist/components/text/engine/looks/inkBleed.d.ts.map +1 -0
  260. package/dist/components/text/engine/looks/inkBleed.js +590 -0
  261. package/dist/components/text/engine/looks/lightPainting.d.ts +132 -0
  262. package/dist/components/text/engine/looks/lightPainting.d.ts.map +1 -0
  263. package/dist/components/text/engine/looks/lightPainting.js +567 -0
  264. package/dist/components/text/engine/looks/liquidMetal.d.ts +135 -0
  265. package/dist/components/text/engine/looks/liquidMetal.d.ts.map +1 -0
  266. package/dist/components/text/engine/looks/liquidMetal.js +655 -0
  267. package/dist/components/text/engine/looks/plasmaDischarge.d.ts +126 -0
  268. package/dist/components/text/engine/looks/plasmaDischarge.d.ts.map +1 -0
  269. package/dist/components/text/engine/looks/plasmaDischarge.js +763 -0
  270. package/dist/components/text/engine/methods.d.ts +19 -0
  271. package/dist/components/text/engine/methods.d.ts.map +1 -0
  272. package/dist/components/text/engine/methods.js +126 -0
  273. package/dist/components/text/engine/playback.d.ts +40 -0
  274. package/dist/components/text/engine/playback.d.ts.map +1 -0
  275. package/dist/components/text/engine/playback.js +114 -0
  276. package/dist/components/text/engine/ribbon.d.ts +58 -0
  277. package/dist/components/text/engine/ribbon.d.ts.map +1 -0
  278. package/dist/components/text/engine/ribbon.js +250 -0
  279. package/dist/components/text/engine/variants.d.ts +159 -0
  280. package/dist/components/text/engine/variants.d.ts.map +1 -0
  281. package/dist/components/text/engine/variants.js +378 -0
  282. package/dist/components/text/fonts/architects-daughter.outline.d.ts +3 -0
  283. package/dist/components/text/fonts/architects-daughter.outline.d.ts.map +1 -0
  284. package/dist/components/text/fonts/architects-daughter.outline.js +4 -0
  285. package/dist/components/text/fonts/architects-daughter.strokes.d.ts +3 -0
  286. package/dist/components/text/fonts/architects-daughter.strokes.d.ts.map +1 -0
  287. package/dist/components/text/fonts/architects-daughter.strokes.js +4 -0
  288. package/dist/components/text/fonts/caveat.outline.d.ts +3 -0
  289. package/dist/components/text/fonts/caveat.outline.d.ts.map +1 -0
  290. package/dist/components/text/fonts/caveat.outline.js +4 -0
  291. package/dist/components/text/fonts/caveat.strokes.d.ts +3 -0
  292. package/dist/components/text/fonts/caveat.strokes.d.ts.map +1 -0
  293. package/dist/components/text/fonts/caveat.strokes.js +4 -0
  294. package/dist/components/text/fonts/courgette.outline.d.ts +3 -0
  295. package/dist/components/text/fonts/courgette.outline.d.ts.map +1 -0
  296. package/dist/components/text/fonts/courgette.outline.js +4 -0
  297. package/dist/components/text/fonts/courgette.strokes.d.ts +3 -0
  298. package/dist/components/text/fonts/courgette.strokes.d.ts.map +1 -0
  299. package/dist/components/text/fonts/courgette.strokes.js +4 -0
  300. package/dist/components/text/fonts/dancing-script.outline.d.ts +3 -0
  301. package/dist/components/text/fonts/dancing-script.outline.d.ts.map +1 -0
  302. package/dist/components/text/fonts/dancing-script.outline.js +4 -0
  303. package/dist/components/text/fonts/dancing-script.strokes.d.ts +3 -0
  304. package/dist/components/text/fonts/dancing-script.strokes.d.ts.map +1 -0
  305. package/dist/components/text/fonts/dancing-script.strokes.js +4 -0
  306. package/dist/components/text/fonts/gochi-hand.outline.d.ts +3 -0
  307. package/dist/components/text/fonts/gochi-hand.outline.d.ts.map +1 -0
  308. package/dist/components/text/fonts/gochi-hand.outline.js +4 -0
  309. package/dist/components/text/fonts/gochi-hand.strokes.d.ts +3 -0
  310. package/dist/components/text/fonts/gochi-hand.strokes.d.ts.map +1 -0
  311. package/dist/components/text/fonts/gochi-hand.strokes.js +4 -0
  312. package/dist/components/text/fonts/handlee.outline.d.ts +3 -0
  313. package/dist/components/text/fonts/handlee.outline.d.ts.map +1 -0
  314. package/dist/components/text/fonts/handlee.outline.js +4 -0
  315. package/dist/components/text/fonts/handlee.strokes.d.ts +3 -0
  316. package/dist/components/text/fonts/handlee.strokes.d.ts.map +1 -0
  317. package/dist/components/text/fonts/handlee.strokes.js +4 -0
  318. package/dist/components/text/fonts/index.d.ts +5 -0
  319. package/dist/components/text/fonts/index.d.ts.map +1 -0
  320. package/dist/components/text/fonts/index.js +44 -0
  321. package/dist/components/text/fonts/indie-flower.outline.d.ts +3 -0
  322. package/dist/components/text/fonts/indie-flower.outline.d.ts.map +1 -0
  323. package/dist/components/text/fonts/indie-flower.outline.js +4 -0
  324. package/dist/components/text/fonts/indie-flower.strokes.d.ts +3 -0
  325. package/dist/components/text/fonts/indie-flower.strokes.d.ts.map +1 -0
  326. package/dist/components/text/fonts/indie-flower.strokes.js +4 -0
  327. package/dist/components/text/fonts/kalam.outline.d.ts +3 -0
  328. package/dist/components/text/fonts/kalam.outline.d.ts.map +1 -0
  329. package/dist/components/text/fonts/kalam.outline.js +4 -0
  330. package/dist/components/text/fonts/kalam.strokes.d.ts +3 -0
  331. package/dist/components/text/fonts/kalam.strokes.d.ts.map +1 -0
  332. package/dist/components/text/fonts/kalam.strokes.js +4 -0
  333. package/dist/components/text/fonts/kaushan-script.outline.d.ts +3 -0
  334. package/dist/components/text/fonts/kaushan-script.outline.d.ts.map +1 -0
  335. package/dist/components/text/fonts/kaushan-script.outline.js +4 -0
  336. package/dist/components/text/fonts/kaushan-script.strokes.d.ts +3 -0
  337. package/dist/components/text/fonts/kaushan-script.strokes.d.ts.map +1 -0
  338. package/dist/components/text/fonts/kaushan-script.strokes.js +4 -0
  339. package/dist/components/text/fonts/mynerve.outline.d.ts +3 -0
  340. package/dist/components/text/fonts/mynerve.outline.d.ts.map +1 -0
  341. package/dist/components/text/fonts/mynerve.outline.js +4 -0
  342. package/dist/components/text/fonts/mynerve.strokes.d.ts +3 -0
  343. package/dist/components/text/fonts/mynerve.strokes.d.ts.map +1 -0
  344. package/dist/components/text/fonts/mynerve.strokes.js +4 -0
  345. package/dist/components/text/fonts/nanum-pen-script.outline.d.ts +3 -0
  346. package/dist/components/text/fonts/nanum-pen-script.outline.d.ts.map +1 -0
  347. package/dist/components/text/fonts/nanum-pen-script.outline.js +4 -0
  348. package/dist/components/text/fonts/nanum-pen-script.strokes.d.ts +3 -0
  349. package/dist/components/text/fonts/nanum-pen-script.strokes.d.ts.map +1 -0
  350. package/dist/components/text/fonts/nanum-pen-script.strokes.js +4 -0
  351. package/dist/components/text/fonts/pacifico.outline.d.ts +3 -0
  352. package/dist/components/text/fonts/pacifico.outline.d.ts.map +1 -0
  353. package/dist/components/text/fonts/pacifico.outline.js +4 -0
  354. package/dist/components/text/fonts/pacifico.strokes.d.ts +3 -0
  355. package/dist/components/text/fonts/pacifico.strokes.d.ts.map +1 -0
  356. package/dist/components/text/fonts/pacifico.strokes.js +4 -0
  357. package/dist/components/text/fonts/patrick-hand.outline.d.ts +3 -0
  358. package/dist/components/text/fonts/patrick-hand.outline.d.ts.map +1 -0
  359. package/dist/components/text/fonts/patrick-hand.outline.js +4 -0
  360. package/dist/components/text/fonts/patrick-hand.strokes.d.ts +3 -0
  361. package/dist/components/text/fonts/patrick-hand.strokes.d.ts.map +1 -0
  362. package/dist/components/text/fonts/patrick-hand.strokes.js +4 -0
  363. package/dist/components/text/fonts/poppins.outline.d.ts +3 -0
  364. package/dist/components/text/fonts/poppins.outline.d.ts.map +1 -0
  365. package/dist/components/text/fonts/poppins.outline.js +4 -0
  366. package/dist/components/text/fonts/poppins.strokes.d.ts +3 -0
  367. package/dist/components/text/fonts/poppins.strokes.d.ts.map +1 -0
  368. package/dist/components/text/fonts/poppins.strokes.js +4 -0
  369. package/dist/components/text/fonts/satisfy.outline.d.ts +3 -0
  370. package/dist/components/text/fonts/satisfy.outline.d.ts.map +1 -0
  371. package/dist/components/text/fonts/satisfy.outline.js +4 -0
  372. package/dist/components/text/fonts/satisfy.strokes.d.ts +3 -0
  373. package/dist/components/text/fonts/satisfy.strokes.d.ts.map +1 -0
  374. package/dist/components/text/fonts/satisfy.strokes.js +4 -0
  375. package/dist/components/text/fonts/sriracha.outline.d.ts +3 -0
  376. package/dist/components/text/fonts/sriracha.outline.d.ts.map +1 -0
  377. package/dist/components/text/fonts/sriracha.outline.js +4 -0
  378. package/dist/components/text/fonts/sriracha.strokes.d.ts +3 -0
  379. package/dist/components/text/fonts/sriracha.strokes.d.ts.map +1 -0
  380. package/dist/components/text/fonts/sriracha.strokes.js +4 -0
  381. package/dist/components/text/index.d.ts +27 -0
  382. package/dist/components/text/index.d.ts.map +1 -0
  383. package/dist/components/text/index.js +13 -0
  384. package/dist/components/text/useTextObject.d.ts +21 -0
  385. package/dist/components/text/useTextObject.d.ts.map +1 -0
  386. package/dist/components/text/useTextObject.js +118 -0
  387. package/dist/components/water/OceanSurface.d.ts.map +1 -1
  388. package/dist/components/water/OceanSurface.js +3 -1
  389. package/dist/components/water/WaterBody.d.ts.map +1 -1
  390. package/dist/components/water/WaterBody.js +3 -1
  391. package/dist/components/water/types.d.ts +5 -1
  392. package/dist/components/water/types.d.ts.map +1 -1
  393. package/dist/constants.d.ts.map +1 -1
  394. package/dist/constants.js +4 -0
  395. package/dist/hooks/index.d.ts +2 -0
  396. package/dist/hooks/index.d.ts.map +1 -1
  397. package/dist/hooks/index.js +1 -0
  398. package/dist/hooks/useCloudSun.d.ts +9 -4
  399. package/dist/hooks/useCloudSun.d.ts.map +1 -1
  400. package/dist/hooks/useCloudSun.js +17 -7
  401. package/dist/hooks/useConfigLive.d.ts +3 -2
  402. package/dist/hooks/useConfigLive.d.ts.map +1 -1
  403. package/dist/hooks/useContinuousEffects.d.ts.map +1 -1
  404. package/dist/hooks/useContinuousEffects.js +4 -10
  405. package/dist/hooks/useEnvironmentProbe.d.ts +3 -22
  406. package/dist/hooks/useEnvironmentProbe.d.ts.map +1 -1
  407. package/dist/hooks/useEnvironmentProbe.js +47 -8
  408. package/dist/hooks/useGridSurface.d.ts +3 -10
  409. package/dist/hooks/useGridSurface.d.ts.map +1 -1
  410. package/dist/hooks/useGridSurface.js +5 -31
  411. package/dist/hooks/useInteraction.d.ts.map +1 -1
  412. package/dist/hooks/useInteraction.js +19 -72
  413. package/dist/hooks/useLightConfig.d.ts +2 -1
  414. package/dist/hooks/useLightConfig.d.ts.map +1 -1
  415. package/dist/hooks/useOceanMaterial.d.ts +6 -2
  416. package/dist/hooks/useOceanMaterial.d.ts.map +1 -1
  417. package/dist/hooks/useOceanMaterial.js +37 -2
  418. package/dist/hooks/useSkyLive.d.ts +23 -0
  419. package/dist/hooks/useSkyLive.d.ts.map +1 -0
  420. package/dist/hooks/useSkyLive.js +30 -0
  421. package/dist/hooks/useSkyUniforms.d.ts.map +1 -1
  422. package/dist/hooks/useSkyUniforms.js +2 -10
  423. package/dist/hooks/useTerrainLive.d.ts +3 -1
  424. package/dist/hooks/useTerrainLive.d.ts.map +1 -1
  425. package/dist/hooks/useTerrainTextures.d.ts +38 -0
  426. package/dist/hooks/useTerrainTextures.d.ts.map +1 -0
  427. package/dist/hooks/useTerrainTextures.js +149 -0
  428. package/dist/index.d.ts +11 -2
  429. package/dist/index.d.ts.map +1 -1
  430. package/dist/index.js +8 -1
  431. package/dist/operations/catalogue/blastOff.d.ts +3 -0
  432. package/dist/operations/catalogue/blastOff.d.ts.map +1 -0
  433. package/dist/operations/catalogue/blastOff.js +118 -0
  434. package/dist/operations/catalogue/bounce.d.ts +3 -0
  435. package/dist/operations/catalogue/bounce.d.ts.map +1 -0
  436. package/dist/operations/catalogue/bounce.js +34 -0
  437. package/dist/operations/catalogue/curlSmoke.d.ts.map +1 -1
  438. package/dist/operations/catalogue/curlSmoke.js +3 -1
  439. package/dist/operations/catalogue/dissolve.d.ts.map +1 -1
  440. package/dist/operations/catalogue/dissolve.js +2 -1
  441. package/dist/operations/catalogue/driftUp.d.ts +3 -0
  442. package/dist/operations/catalogue/driftUp.d.ts.map +1 -0
  443. package/dist/operations/catalogue/driftUp.js +57 -0
  444. package/dist/operations/catalogue/emberAsh.d.ts.map +1 -1
  445. package/dist/operations/catalogue/emberAsh.js +2 -1
  446. package/dist/operations/catalogue/flip.d.ts.map +1 -1
  447. package/dist/operations/catalogue/flip.js +19 -9
  448. package/dist/operations/catalogue/float.d.ts +3 -0
  449. package/dist/operations/catalogue/float.d.ts.map +1 -0
  450. package/dist/operations/catalogue/float.js +39 -0
  451. package/dist/operations/catalogue/flyBy.d.ts +3 -0
  452. package/dist/operations/catalogue/flyBy.d.ts.map +1 -0
  453. package/dist/operations/catalogue/flyBy.js +79 -0
  454. package/dist/operations/catalogue/frost.d.ts.map +1 -1
  455. package/dist/operations/catalogue/frost.js +10 -3
  456. package/dist/operations/catalogue/grow.d.ts +3 -0
  457. package/dist/operations/catalogue/grow.d.ts.map +1 -0
  458. package/dist/operations/catalogue/grow.js +19 -0
  459. package/dist/operations/catalogue/hologram.d.ts.map +1 -1
  460. package/dist/operations/catalogue/hologram.js +11 -5
  461. package/dist/operations/catalogue/jelly.d.ts.map +1 -1
  462. package/dist/operations/catalogue/jelly.js +18 -8
  463. package/dist/operations/catalogue/knockAway.d.ts +3 -0
  464. package/dist/operations/catalogue/knockAway.d.ts.map +1 -0
  465. package/dist/operations/catalogue/knockAway.js +74 -0
  466. package/dist/operations/catalogue/leafFall.d.ts +3 -0
  467. package/dist/operations/catalogue/leafFall.d.ts.map +1 -0
  468. package/dist/operations/catalogue/leafFall.js +74 -0
  469. package/dist/operations/catalogue/lidarScan.d.ts.map +1 -1
  470. package/dist/operations/catalogue/lidarScan.js +4 -1
  471. package/dist/operations/catalogue/metalize.d.ts.map +1 -1
  472. package/dist/operations/catalogue/metalize.js +8 -2
  473. package/dist/operations/catalogue/motionTrail.d.ts +6 -0
  474. package/dist/operations/catalogue/motionTrail.d.ts.map +1 -0
  475. package/dist/operations/catalogue/motionTrail.js +221 -0
  476. package/dist/operations/catalogue/petrify.d.ts.map +1 -1
  477. package/dist/operations/catalogue/petrify.js +9 -3
  478. package/dist/operations/catalogue/physicalExit.d.ts +55 -0
  479. package/dist/operations/catalogue/physicalExit.d.ts.map +1 -0
  480. package/dist/operations/catalogue/physicalExit.js +165 -0
  481. package/dist/operations/catalogue/physicalHeld.d.ts +41 -0
  482. package/dist/operations/catalogue/physicalHeld.d.ts.map +1 -0
  483. package/dist/operations/catalogue/physicalHeld.js +78 -0
  484. package/dist/operations/catalogue/physicalMix.d.ts +45 -0
  485. package/dist/operations/catalogue/physicalMix.d.ts.map +1 -0
  486. package/dist/operations/catalogue/physicalMix.js +144 -0
  487. package/dist/operations/catalogue/pop.d.ts +3 -0
  488. package/dist/operations/catalogue/pop.d.ts.map +1 -0
  489. package/dist/operations/catalogue/pop.js +44 -0
  490. package/dist/operations/catalogue/print3d.d.ts.map +1 -1
  491. package/dist/operations/catalogue/print3d.js +5 -1
  492. package/dist/operations/catalogue/pulse.d.ts +3 -0
  493. package/dist/operations/catalogue/pulse.d.ts.map +1 -0
  494. package/dist/operations/catalogue/pulse.js +29 -0
  495. package/dist/operations/catalogue/restPose.d.ts +5 -7
  496. package/dist/operations/catalogue/restPose.d.ts.map +1 -1
  497. package/dist/operations/catalogue/restPose.js +18 -48
  498. package/dist/operations/catalogue/rotate.d.ts +3 -0
  499. package/dist/operations/catalogue/rotate.d.ts.map +1 -0
  500. package/dist/operations/catalogue/rotate.js +49 -0
  501. package/dist/operations/catalogue/shake.d.ts +3 -0
  502. package/dist/operations/catalogue/shake.d.ts.map +1 -0
  503. package/dist/operations/catalogue/shake.js +31 -0
  504. package/dist/operations/catalogue/shatter.d.ts.map +1 -1
  505. package/dist/operations/catalogue/shatter.js +5 -1
  506. package/dist/operations/catalogue/slam.d.ts +3 -0
  507. package/dist/operations/catalogue/slam.d.ts.map +1 -0
  508. package/dist/operations/catalogue/slam.js +89 -0
  509. package/dist/operations/catalogue/slingshot.d.ts +3 -0
  510. package/dist/operations/catalogue/slingshot.d.ts.map +1 -0
  511. package/dist/operations/catalogue/slingshot.js +88 -0
  512. package/dist/operations/catalogue/spin.d.ts.map +1 -1
  513. package/dist/operations/catalogue/spin.js +24 -13
  514. package/dist/operations/catalogue/sway.d.ts +3 -0
  515. package/dist/operations/catalogue/sway.d.ts.map +1 -0
  516. package/dist/operations/catalogue/sway.js +23 -0
  517. package/dist/operations/catalogue/swirl.d.ts.map +1 -1
  518. package/dist/operations/catalogue/swirl.js +6 -5
  519. package/dist/operations/catalogue/trailCore.d.ts +89 -0
  520. package/dist/operations/catalogue/trailCore.d.ts.map +1 -0
  521. package/dist/operations/catalogue/trailCore.js +190 -0
  522. package/dist/operations/catalogue/trailGhosts.d.ts +5 -0
  523. package/dist/operations/catalogue/trailGhosts.d.ts.map +1 -0
  524. package/dist/operations/catalogue/trailGhosts.js +179 -0
  525. package/dist/operations/catalogue/trailStampStyles.d.ts +11 -0
  526. package/dist/operations/catalogue/trailStampStyles.d.ts.map +1 -0
  527. package/dist/operations/catalogue/trailStampStyles.js +479 -0
  528. package/dist/operations/catalogue/trailStamps.d.ts +57 -0
  529. package/dist/operations/catalogue/trailStamps.d.ts.map +1 -0
  530. package/dist/operations/catalogue/trailStamps.js +349 -0
  531. package/dist/operations/catalogue/trailStreaks.d.ts +3 -0
  532. package/dist/operations/catalogue/trailStreaks.d.ts.map +1 -0
  533. package/dist/operations/catalogue/trailStreaks.js +147 -0
  534. package/dist/operations/catalogue/transitionField.d.ts +30 -0
  535. package/dist/operations/catalogue/transitionField.d.ts.map +1 -1
  536. package/dist/operations/catalogue/transitionField.js +21 -0
  537. package/dist/operations/catalogue/turnAway.d.ts +3 -0
  538. package/dist/operations/catalogue/turnAway.d.ts.map +1 -0
  539. package/dist/operations/catalogue/turnAway.js +54 -0
  540. package/dist/operations/catalogue/vortexDrain.d.ts +3 -0
  541. package/dist/operations/catalogue/vortexDrain.d.ts.map +1 -0
  542. package/dist/operations/catalogue/vortexDrain.js +68 -0
  543. package/dist/operations/catalogue/warp.d.ts +3 -0
  544. package/dist/operations/catalogue/warp.d.ts.map +1 -0
  545. package/dist/operations/catalogue/warp.js +73 -0
  546. package/dist/operations/catalogue/whoosh.d.ts +3 -0
  547. package/dist/operations/catalogue/whoosh.d.ts.map +1 -0
  548. package/dist/operations/catalogue/whoosh.js +84 -0
  549. package/dist/operations/catalogue/wobble.d.ts +3 -0
  550. package/dist/operations/catalogue/wobble.d.ts.map +1 -0
  551. package/dist/operations/catalogue/wobble.js +23 -0
  552. package/dist/operations/clipPreview.d.ts +3 -0
  553. package/dist/operations/clipPreview.d.ts.map +1 -0
  554. package/dist/operations/clipPreview.js +20 -0
  555. package/dist/operations/groupFanout.d.ts +96 -0
  556. package/dist/operations/groupFanout.d.ts.map +1 -0
  557. package/dist/operations/groupFanout.js +365 -0
  558. package/dist/operations/groups.d.ts +20 -0
  559. package/dist/operations/groups.d.ts.map +1 -0
  560. package/dist/operations/groups.js +66 -0
  561. package/dist/operations/index.d.ts +5 -2
  562. package/dist/operations/index.d.ts.map +1 -1
  563. package/dist/operations/index.js +5 -2
  564. package/dist/operations/objectEffects.d.ts +161 -6
  565. package/dist/operations/objectEffects.d.ts.map +1 -1
  566. package/dist/operations/objectEffects.js +1091 -17
  567. package/dist/operations/registry.d.ts.map +1 -1
  568. package/dist/operations/registry.js +24 -2
  569. package/dist/operations/runtime.d.ts +57 -2
  570. package/dist/operations/runtime.d.ts.map +1 -1
  571. package/dist/operations/runtime.js +161 -18
  572. package/dist/operations/types.d.ts +60 -3
  573. package/dist/operations/types.d.ts.map +1 -1
  574. package/dist/operations/types.js +5 -1
  575. package/dist/operations/useObjectEffectLayers.d.ts +2 -2
  576. package/dist/operations/useObjectEffectLayers.d.ts.map +1 -1
  577. package/dist/operations/useObjectEffectLayers.js +31 -10
  578. package/dist/operations/usePresentedVisibility.d.ts +10 -0
  579. package/dist/operations/usePresentedVisibility.d.ts.map +1 -0
  580. package/dist/operations/usePresentedVisibility.js +53 -0
  581. package/dist/presets/terrainBiomes.d.ts +67 -0
  582. package/dist/presets/terrainBiomes.d.ts.map +1 -0
  583. package/dist/presets/terrainBiomes.js +294 -0
  584. package/dist/presets/terrainPresets.d.ts +6 -0
  585. package/dist/presets/terrainPresets.d.ts.map +1 -1
  586. package/dist/presets/terrainPresets.js +26 -38
  587. package/dist/shaders/glsl/oceanCore.glsl.d.ts +2 -2
  588. package/dist/shaders/glsl/oceanCore.glsl.d.ts.map +1 -1
  589. package/dist/shaders/glsl/oceanCore.glsl.js +17 -0
  590. package/dist/shaders/glsl/surfaceCore.glsl.d.ts +21 -0
  591. package/dist/shaders/glsl/surfaceCore.glsl.d.ts.map +1 -0
  592. package/dist/shaders/glsl/surfaceCore.glsl.js +120 -0
  593. package/dist/shaders/glsl/terrainCore.glsl.d.ts +16 -3
  594. package/dist/shaders/glsl/terrainCore.glsl.d.ts.map +1 -1
  595. package/dist/shaders/glsl/terrainCore.glsl.js +266 -20
  596. package/dist/shaders/ocean/OceanSurfaceMaterial.d.ts +2 -0
  597. package/dist/shaders/ocean/OceanSurfaceMaterial.d.ts.map +1 -1
  598. package/dist/shaders/ocean/OceanSurfaceMaterial.js +3 -0
  599. package/dist/shaders/terrain/TerrainMaterial.d.ts +17 -0
  600. package/dist/shaders/terrain/TerrainMaterial.d.ts.map +1 -1
  601. package/dist/shaders/terrain/TerrainMaterial.js +107 -8
  602. package/dist/triggers/engine.d.ts +44 -0
  603. package/dist/triggers/engine.d.ts.map +1 -0
  604. package/dist/triggers/engine.js +165 -0
  605. package/dist/triggers/hosts/actions.d.ts +8 -0
  606. package/dist/triggers/hosts/actions.d.ts.map +1 -0
  607. package/dist/triggers/hosts/actions.js +22 -0
  608. package/dist/triggers/hosts/interactions.d.ts +6 -0
  609. package/dist/triggers/hosts/interactions.d.ts.map +1 -0
  610. package/dist/triggers/hosts/interactions.js +4 -0
  611. package/dist/triggers/hosts/timelineCues.d.ts +2 -0
  612. package/dist/triggers/hosts/timelineCues.d.ts.map +1 -0
  613. package/dist/triggers/hosts/timelineCues.js +22 -0
  614. package/dist/triggers/index.d.ts +13 -0
  615. package/dist/triggers/index.d.ts.map +1 -0
  616. package/dist/triggers/index.js +9 -0
  617. package/dist/triggers/kinds/action.d.ts +2 -0
  618. package/dist/triggers/kinds/action.d.ts.map +1 -0
  619. package/dist/triggers/kinds/action.js +31 -0
  620. package/dist/triggers/kinds/animations.d.ts +2 -0
  621. package/dist/triggers/kinds/animations.d.ts.map +1 -0
  622. package/dist/triggers/kinds/animations.js +75 -0
  623. package/dist/triggers/kinds/effects.d.ts +2 -0
  624. package/dist/triggers/kinds/effects.d.ts.map +1 -0
  625. package/dist/triggers/kinds/effects.js +27 -0
  626. package/dist/triggers/kinds/index.d.ts +4 -0
  627. package/dist/triggers/kinds/index.d.ts.map +1 -0
  628. package/dist/triggers/kinds/index.js +4 -0
  629. package/dist/triggers/log.d.ts +21 -0
  630. package/dist/triggers/log.d.ts.map +1 -0
  631. package/dist/triggers/log.js +43 -0
  632. package/dist/triggers/readiness.d.ts +40 -0
  633. package/dist/triggers/readiness.d.ts.map +1 -0
  634. package/dist/triggers/readiness.js +158 -0
  635. package/dist/triggers/registry.d.ts +41 -0
  636. package/dist/triggers/registry.d.ts.map +1 -0
  637. package/dist/triggers/registry.js +7 -0
  638. package/dist/types/gridConfigs.d.ts +18 -23
  639. package/dist/types/gridConfigs.d.ts.map +1 -1
  640. package/dist/ui/UiAnchorUpdater.d.ts +10 -0
  641. package/dist/ui/UiAnchorUpdater.d.ts.map +1 -0
  642. package/dist/ui/UiAnchorUpdater.js +111 -0
  643. package/dist/ui/UiLayers.d.ts +20 -0
  644. package/dist/ui/UiLayers.d.ts.map +1 -0
  645. package/dist/ui/UiLayers.js +57 -0
  646. package/dist/ui/index.d.ts +9 -0
  647. package/dist/ui/index.d.ts.map +1 -0
  648. package/dist/ui/index.js +6 -0
  649. package/dist/ui/uiAnchors.d.ts +21 -0
  650. package/dist/ui/uiAnchors.d.ts.map +1 -0
  651. package/dist/ui/uiAnchors.js +22 -0
  652. package/dist/ui/uiBaseStyles.d.ts +2 -0
  653. package/dist/ui/uiBaseStyles.d.ts.map +1 -0
  654. package/dist/ui/uiBaseStyles.js +100 -0
  655. package/dist/ui/uiBinder.d.ts +30 -0
  656. package/dist/ui/uiBinder.d.ts.map +1 -0
  657. package/dist/ui/uiBinder.js +344 -0
  658. package/dist/utils/configAnimations.d.ts.map +1 -1
  659. package/dist/utils/configAnimations.js +5 -1
  660. package/dist/utils/gridConfig.d.ts +1 -1
  661. package/dist/utils/gridConfig.d.ts.map +1 -1
  662. package/dist/utils/gridConfig.js +1 -1
  663. package/dist/utils/landPatch.d.ts +33 -0
  664. package/dist/utils/landPatch.d.ts.map +1 -0
  665. package/dist/utils/landPatch.js +114 -0
  666. package/dist/utils/renderedSky.d.ts +32 -0
  667. package/dist/utils/renderedSky.d.ts.map +1 -0
  668. package/dist/utils/renderedSky.js +57 -0
  669. package/dist/utils/skyMoon.d.ts +35 -0
  670. package/dist/utils/skyMoon.d.ts.map +1 -0
  671. package/dist/utils/skyMoon.js +41 -0
  672. package/dist/utils/terrainHeight.d.ts +4 -0
  673. package/dist/utils/terrainHeight.d.ts.map +1 -0
  674. package/dist/utils/terrainHeight.js +150 -0
  675. package/dist/utils/terrainTextureResolver.d.ts +18 -0
  676. package/dist/utils/terrainTextureResolver.d.ts.map +1 -0
  677. package/dist/utils/terrainTextureResolver.js +17 -0
  678. package/dist/utils/terrainUniforms.d.ts +17 -0
  679. package/dist/utils/terrainUniforms.d.ts.map +1 -1
  680. package/dist/utils/terrainUniforms.js +84 -0
  681. package/dist/utils/textureArrays.d.ts +29 -0
  682. package/dist/utils/textureArrays.d.ts.map +1 -0
  683. package/dist/utils/textureArrays.js +140 -0
  684. 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
+ };