@3driseai/3drise-viewer 0.1.26 → 0.1.27

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 (456) hide show
  1. package/dist/animationsV2/ClipPlayer.d.ts +3 -0
  2. package/dist/animationsV2/ClipPlayer.d.ts.map +1 -1
  3. package/dist/animationsV2/ClipPlayer.js +67 -8
  4. package/dist/animationsV2/ClipsRuntime.d.ts +39 -0
  5. package/dist/animationsV2/ClipsRuntime.d.ts.map +1 -1
  6. package/dist/animationsV2/ClipsRuntime.js +245 -14
  7. package/dist/animationsV2/appliers.d.ts +5 -0
  8. package/dist/animationsV2/appliers.d.ts.map +1 -1
  9. package/dist/animationsV2/appliers.js +25 -7
  10. package/dist/animationsV2/index.d.ts +1 -1
  11. package/dist/animationsV2/index.d.ts.map +1 -1
  12. package/dist/animationsV2/normalize.d.ts.map +1 -1
  13. package/dist/animationsV2/normalize.js +18 -7
  14. package/dist/animationsV2/sequenceUtils.d.ts +42 -1
  15. package/dist/animationsV2/sequenceUtils.d.ts.map +1 -1
  16. package/dist/animationsV2/sequenceUtils.js +103 -3
  17. package/dist/animationsV2/types.d.ts +20 -0
  18. package/dist/animationsV2/types.d.ts.map +1 -1
  19. package/dist/components/AdvancedGrid.d.ts +8 -2
  20. package/dist/components/AdvancedGrid.d.ts.map +1 -1
  21. package/dist/components/AdvancedGrid.js +31 -14
  22. package/dist/components/AnimatedObject.d.ts.map +1 -1
  23. package/dist/components/AnimatedObject.js +7 -5
  24. package/dist/components/Bubbles.d.ts +7 -1
  25. package/dist/components/Bubbles.d.ts.map +1 -1
  26. package/dist/components/Bubbles.js +42 -22
  27. package/dist/components/ChladniGrid.d.ts +8 -4
  28. package/dist/components/ChladniGrid.d.ts.map +1 -1
  29. package/dist/components/ChladniGrid.js +31 -13
  30. package/dist/components/CircuitGrid.d.ts +8 -11
  31. package/dist/components/CircuitGrid.d.ts.map +1 -1
  32. package/dist/components/CircuitGrid.js +31 -13
  33. package/dist/components/CloudsGenerator.d.ts +1 -1
  34. package/dist/components/CloudsGenerator.js +1 -1
  35. package/dist/components/ContourGrid.d.ts +8 -14
  36. package/dist/components/ContourGrid.d.ts.map +1 -1
  37. package/dist/components/ContourGrid.js +31 -13
  38. package/dist/components/EffectsGenerator.d.ts +7 -1
  39. package/dist/components/EffectsGenerator.d.ts.map +1 -1
  40. package/dist/components/EffectsGenerator.js +39 -38
  41. package/dist/components/EnvironmentManager.d.ts +4 -4
  42. package/dist/components/EnvironmentManager.d.ts.map +1 -1
  43. package/dist/components/FlowNetGrid.d.ts +8 -4
  44. package/dist/components/FlowNetGrid.d.ts.map +1 -1
  45. package/dist/components/FlowNetGrid.js +31 -13
  46. package/dist/components/FractalGrid.d.ts +8 -12
  47. package/dist/components/FractalGrid.d.ts.map +1 -1
  48. package/dist/components/FractalGrid.js +31 -13
  49. package/dist/components/GirihGrid.d.ts +8 -1
  50. package/dist/components/GirihGrid.d.ts.map +1 -1
  51. package/dist/components/GirihGrid.js +31 -13
  52. package/dist/components/Glyphs.d.ts +7 -1
  53. package/dist/components/Glyphs.d.ts.map +1 -1
  54. package/dist/components/Glyphs.js +40 -34
  55. package/dist/components/GravWaveGrid.d.ts +8 -1
  56. package/dist/components/GravWaveGrid.d.ts.map +1 -1
  57. package/dist/components/GravWaveGrid.js +31 -13
  58. package/dist/components/GridsGenerator.d.ts +7 -1
  59. package/dist/components/GridsGenerator.d.ts.map +1 -1
  60. package/dist/components/GridsGenerator.js +20 -18
  61. package/dist/components/HexGrid.d.ts +8 -10
  62. package/dist/components/HexGrid.d.ts.map +1 -1
  63. package/dist/components/HexGrid.js +31 -13
  64. package/dist/components/HyperbolicGrid.d.ts +8 -4
  65. package/dist/components/HyperbolicGrid.d.ts.map +1 -1
  66. package/dist/components/HyperbolicGrid.js +31 -13
  67. package/dist/components/LandscapeBuilder.d.ts +1 -1
  68. package/dist/components/LandscapeBuilder.d.ts.map +1 -1
  69. package/dist/components/LandscapeBuilder.js +1 -1
  70. package/dist/components/LandscapeObject.d.ts +1 -1
  71. package/dist/components/LandscapeObject.d.ts.map +1 -1
  72. package/dist/components/LandscapeObject.js +1 -1
  73. package/dist/components/MoireGrid.d.ts +8 -12
  74. package/dist/components/MoireGrid.d.ts.map +1 -1
  75. package/dist/components/MoireGrid.js +31 -13
  76. package/dist/components/ObjectNode.d.ts.map +1 -1
  77. package/dist/components/ObjectNode.js +2 -2
  78. package/dist/components/ObjectsRenderer.d.ts.map +1 -1
  79. package/dist/components/ObjectsRenderer.js +37 -3
  80. package/dist/components/OceanBuilder.d.ts +1 -1
  81. package/dist/components/OceanBuilder.js +1 -1
  82. package/dist/components/ParticlesGenerator.d.ts.map +1 -1
  83. package/dist/components/ParticlesGenerator.js +6 -0
  84. package/dist/components/QuasiGrid.d.ts +8 -11
  85. package/dist/components/QuasiGrid.d.ts.map +1 -1
  86. package/dist/components/QuasiGrid.js +31 -13
  87. package/dist/components/RadarGrid.d.ts +8 -13
  88. package/dist/components/RadarGrid.d.ts.map +1 -1
  89. package/dist/components/RadarGrid.js +31 -13
  90. package/dist/components/ReactionDiffusionGrid.d.ts +8 -1
  91. package/dist/components/ReactionDiffusionGrid.d.ts.map +1 -1
  92. package/dist/components/ReactionDiffusionGrid.js +33 -139
  93. package/dist/components/SceneBuilder.js +1 -1
  94. package/dist/components/SkySystem.d.ts +1 -1
  95. package/dist/components/SparklesBurst.d.ts +7 -1
  96. package/dist/components/SparklesBurst.d.ts.map +1 -1
  97. package/dist/components/SparklesBurst.js +31 -28
  98. package/dist/components/TerrainBuilder.d.ts +1 -1
  99. package/dist/components/TerrainBuilder.d.ts.map +1 -1
  100. package/dist/components/TerrainBuilder.js +1 -1
  101. package/dist/components/VoronoiGrid.d.ts +8 -10
  102. package/dist/components/VoronoiGrid.d.ts.map +1 -1
  103. package/dist/components/VoronoiGrid.js +31 -13
  104. package/dist/components/WallpaperGrid.d.ts +8 -1
  105. package/dist/components/WallpaperGrid.d.ts.map +1 -1
  106. package/dist/components/WallpaperGrid.js +33 -210
  107. package/dist/components/effects/AuraEffect.d.ts +8 -3
  108. package/dist/components/effects/AuraEffect.d.ts.map +1 -1
  109. package/dist/components/effects/AuraEffect.js +49 -24
  110. package/dist/components/effects/AuroraEffect.d.ts +8 -3
  111. package/dist/components/effects/AuroraEffect.d.ts.map +1 -1
  112. package/dist/components/effects/AuroraEffect.js +45 -25
  113. package/dist/components/effects/BlackHoleEffect.d.ts +8 -3
  114. package/dist/components/effects/BlackHoleEffect.d.ts.map +1 -1
  115. package/dist/components/effects/BlackHoleEffect.js +42 -21
  116. package/dist/components/effects/ConstellationEffect.d.ts +8 -3
  117. package/dist/components/effects/ConstellationEffect.d.ts.map +1 -1
  118. package/dist/components/effects/ConstellationEffect.js +49 -23
  119. package/dist/components/effects/DandelionSeedsEffect.d.ts +7 -2
  120. package/dist/components/effects/DandelionSeedsEffect.d.ts.map +1 -1
  121. package/dist/components/effects/DandelionSeedsEffect.js +19 -9
  122. package/dist/components/effects/DataStreamEffect.d.ts +8 -3
  123. package/dist/components/effects/DataStreamEffect.d.ts.map +1 -1
  124. package/dist/components/effects/DataStreamEffect.js +54 -26
  125. package/dist/components/effects/DnaHelixEffect.d.ts +8 -3
  126. package/dist/components/effects/DnaHelixEffect.d.ts.map +1 -1
  127. package/dist/components/effects/DnaHelixEffect.js +62 -30
  128. package/dist/components/effects/FallingLeavesEffect.d.ts +7 -2
  129. package/dist/components/effects/FallingLeavesEffect.d.ts.map +1 -1
  130. package/dist/components/effects/FallingLeavesEffect.js +19 -9
  131. package/dist/components/effects/FieldLinesEffect.d.ts +8 -3
  132. package/dist/components/effects/FieldLinesEffect.d.ts.map +1 -1
  133. package/dist/components/effects/FieldLinesEffect.js +30 -20
  134. package/dist/components/effects/Fire.d.ts +8 -3
  135. package/dist/components/effects/Fire.d.ts.map +1 -1
  136. package/dist/components/effects/Fire.js +47 -10
  137. package/dist/components/effects/FireflySwarmEffect.d.ts +7 -2
  138. package/dist/components/effects/FireflySwarmEffect.d.ts.map +1 -1
  139. package/dist/components/effects/FireflySwarmEffect.js +19 -9
  140. package/dist/components/effects/Flares.d.ts +10 -3
  141. package/dist/components/effects/Flares.d.ts.map +1 -1
  142. package/dist/components/effects/Flares.js +53 -56
  143. package/dist/components/effects/ForcefieldEffect.d.ts +8 -3
  144. package/dist/components/effects/ForcefieldEffect.d.ts.map +1 -1
  145. package/dist/components/effects/ForcefieldEffect.js +52 -33
  146. package/dist/components/effects/GalaxyEffect.d.ts +7 -2
  147. package/dist/components/effects/GalaxyEffect.d.ts.map +1 -1
  148. package/dist/components/effects/GalaxyEffect.js +19 -9
  149. package/dist/components/effects/HarmonicShellEffect.d.ts +8 -3
  150. package/dist/components/effects/HarmonicShellEffect.d.ts.map +1 -1
  151. package/dist/components/effects/HarmonicShellEffect.js +30 -22
  152. package/dist/components/effects/HologramEffect.d.ts +8 -3
  153. package/dist/components/effects/HologramEffect.d.ts.map +1 -1
  154. package/dist/components/effects/HologramEffect.js +52 -23
  155. package/dist/components/effects/IceCrystalsEffect.d.ts +8 -3
  156. package/dist/components/effects/IceCrystalsEffect.d.ts.map +1 -1
  157. package/dist/components/effects/IceCrystalsEffect.js +36 -21
  158. package/dist/components/effects/IceHaloEffect.d.ts +7 -2
  159. package/dist/components/effects/IceHaloEffect.d.ts.map +1 -1
  160. package/dist/components/effects/IceHaloEffect.js +19 -9
  161. package/dist/components/effects/LichtenbergEffect.d.ts +7 -2
  162. package/dist/components/effects/LichtenbergEffect.d.ts.map +1 -1
  163. package/dist/components/effects/LichtenbergEffect.js +19 -9
  164. package/dist/components/effects/LightningEffect.d.ts +8 -3
  165. package/dist/components/effects/LightningEffect.d.ts.map +1 -1
  166. package/dist/components/effects/LightningEffect.js +54 -32
  167. package/dist/components/effects/MoleculesEffect.d.ts +8 -3
  168. package/dist/components/effects/MoleculesEffect.d.ts.map +1 -1
  169. package/dist/components/effects/MoleculesEffect.js +31 -21
  170. package/dist/components/effects/MurmurationEffect.d.ts +7 -2
  171. package/dist/components/effects/MurmurationEffect.d.ts.map +1 -1
  172. package/dist/components/effects/MurmurationEffect.js +19 -9
  173. package/dist/components/effects/NeuralNetworkEffect.d.ts +8 -3
  174. package/dist/components/effects/NeuralNetworkEffect.d.ts.map +1 -1
  175. package/dist/components/effects/NeuralNetworkEffect.js +66 -33
  176. package/dist/components/effects/OrbEffect.d.ts +8 -3
  177. package/dist/components/effects/OrbEffect.d.ts.map +1 -1
  178. package/dist/components/effects/OrbEffect.js +89 -42
  179. package/dist/components/effects/PlanetaryRingsEffect.d.ts +7 -2
  180. package/dist/components/effects/PlanetaryRingsEffect.d.ts.map +1 -1
  181. package/dist/components/effects/PlanetaryRingsEffect.js +19 -9
  182. package/dist/components/effects/PortalEffect.d.ts +8 -3
  183. package/dist/components/effects/PortalEffect.d.ts.map +1 -1
  184. package/dist/components/effects/PortalEffect.js +41 -25
  185. package/dist/components/effects/ShockwaveEffect.d.ts +7 -2
  186. package/dist/components/effects/ShockwaveEffect.d.ts.map +1 -1
  187. package/dist/components/effects/ShockwaveEffect.js +19 -9
  188. package/dist/components/effects/SmokePlumeEffect.d.ts +8 -3
  189. package/dist/components/effects/SmokePlumeEffect.d.ts.map +1 -1
  190. package/dist/components/effects/SmokePlumeEffect.js +30 -20
  191. package/dist/components/effects/SmokeRibbon.d.ts +8 -2
  192. package/dist/components/effects/SmokeRibbon.d.ts.map +1 -1
  193. package/dist/components/effects/SmokeRibbon.js +34 -24
  194. package/dist/components/effects/SmokeRingEffect.d.ts +8 -3
  195. package/dist/components/effects/SmokeRingEffect.d.ts.map +1 -1
  196. package/dist/components/effects/SmokeRingEffect.js +33 -21
  197. package/dist/components/effects/StrangeAttractorEffect.d.ts +8 -3
  198. package/dist/components/effects/StrangeAttractorEffect.d.ts.map +1 -1
  199. package/dist/components/effects/StrangeAttractorEffect.js +30 -20
  200. package/dist/components/effects/VolumetricFogEffect.d.ts +8 -3
  201. package/dist/components/effects/VolumetricFogEffect.d.ts.map +1 -1
  202. package/dist/components/effects/VolumetricFogEffect.js +38 -20
  203. package/dist/components/effects/WaterCausticsEffect.d.ts +7 -2
  204. package/dist/components/effects/WaterCausticsEffect.d.ts.map +1 -1
  205. package/dist/components/effects/WaterCausticsEffect.js +19 -9
  206. package/dist/components/effects/index.d.ts +0 -1
  207. package/dist/components/effects/index.d.ts.map +1 -1
  208. package/dist/components/effects/index.js +0 -1
  209. package/dist/components/index.d.ts +0 -1
  210. package/dist/components/index.d.ts.map +1 -1
  211. package/dist/components/index.js +0 -1
  212. package/dist/components/landscape/LandscapeMesh.js +1 -1
  213. package/dist/components/landscape/types.d.ts +1 -1
  214. package/dist/components/landscape/types.d.ts.map +1 -1
  215. package/dist/components/particles/MagneticBottleParticles.d.ts +17 -0
  216. package/dist/components/particles/MagneticBottleParticles.d.ts.map +1 -0
  217. package/dist/components/particles/MagneticBottleParticles.js +618 -0
  218. package/dist/components/particles/ShapeBurstParticles.d.ts +17 -0
  219. package/dist/components/particles/ShapeBurstParticles.d.ts.map +1 -0
  220. package/dist/components/particles/ShapeBurstParticles.js +588 -0
  221. package/dist/components/particles/ShapeFlowParticles.d.ts +17 -0
  222. package/dist/components/particles/ShapeFlowParticles.d.ts.map +1 -0
  223. package/dist/components/particles/ShapeFlowParticles.js +755 -0
  224. package/dist/components/particles/index.d.ts +6 -0
  225. package/dist/components/particles/index.d.ts.map +1 -1
  226. package/dist/components/particles/index.js +3 -0
  227. package/dist/components/terrain/types.d.ts +1 -1
  228. package/dist/components/terrain/types.d.ts.map +1 -1
  229. package/dist/components/volumetricClouds/VolumetricCloudsPass.d.ts +1 -1
  230. package/dist/components/volumetricClouds/VolumetricCloudsPass.d.ts.map +1 -1
  231. package/dist/components/volumetricClouds/types.d.ts +1 -1
  232. package/dist/components/volumetricClouds/types.d.ts.map +1 -1
  233. package/dist/components/water/types.d.ts +1 -1
  234. package/dist/components/water/types.d.ts.map +1 -1
  235. package/dist/constants.d.ts +1 -1
  236. package/dist/constants.d.ts.map +1 -1
  237. package/dist/constants.js +1 -1
  238. package/dist/hooks/index.d.ts +2 -0
  239. package/dist/hooks/index.d.ts.map +1 -1
  240. package/dist/hooks/index.js +1 -0
  241. package/dist/hooks/useConfigDriver.d.ts +22 -0
  242. package/dist/hooks/useConfigDriver.d.ts.map +1 -0
  243. package/dist/hooks/useConfigDriver.js +43 -0
  244. package/dist/hooks/useConfigLive.d.ts +1 -1
  245. package/dist/hooks/useConfigLive.d.ts.map +1 -1
  246. package/dist/hooks/useLandscapeMaps.d.ts +1 -1
  247. package/dist/hooks/useLandscapeMaps.d.ts.map +1 -1
  248. package/dist/hooks/useOceanMaterial.d.ts +1 -1
  249. package/dist/hooks/useThunder.d.ts +1 -1
  250. package/dist/index.d.ts +1 -2
  251. package/dist/index.d.ts.map +1 -1
  252. package/dist/index.js +1 -2
  253. package/dist/interactions/index.d.ts +2 -1
  254. package/dist/interactions/index.d.ts.map +1 -1
  255. package/dist/interactions/index.js +1 -1
  256. package/dist/interactions/runner.d.ts +18 -3
  257. package/dist/interactions/runner.d.ts.map +1 -1
  258. package/dist/interactions/runner.js +25 -2
  259. package/dist/operations/catalogue/curlSmoke.d.ts +3 -0
  260. package/dist/operations/catalogue/curlSmoke.d.ts.map +1 -0
  261. package/dist/operations/catalogue/curlSmoke.js +178 -0
  262. package/dist/operations/catalogue/displayImage.d.ts.map +1 -1
  263. package/dist/operations/catalogue/displayImage.js +1 -0
  264. package/dist/operations/catalogue/dissolve.d.ts +3 -0
  265. package/dist/operations/catalogue/dissolve.d.ts.map +1 -0
  266. package/dist/operations/catalogue/dissolve.js +57 -0
  267. package/dist/operations/catalogue/emberAsh.d.ts +3 -0
  268. package/dist/operations/catalogue/emberAsh.d.ts.map +1 -0
  269. package/dist/operations/catalogue/emberAsh.js +171 -0
  270. package/dist/operations/catalogue/fade.d.ts.map +1 -1
  271. package/dist/operations/catalogue/fade.js +1 -0
  272. package/dist/operations/catalogue/flip.d.ts +3 -0
  273. package/dist/operations/catalogue/flip.d.ts.map +1 -0
  274. package/dist/operations/catalogue/flip.js +69 -0
  275. package/dist/operations/catalogue/flock.d.ts +3 -0
  276. package/dist/operations/catalogue/flock.d.ts.map +1 -0
  277. package/dist/operations/catalogue/flock.js +163 -0
  278. package/dist/operations/catalogue/focus.d.ts.map +1 -1
  279. package/dist/operations/catalogue/focus.js +1 -0
  280. package/dist/operations/catalogue/frame.d.ts +3 -0
  281. package/dist/operations/catalogue/frame.d.ts.map +1 -0
  282. package/dist/operations/catalogue/frame.js +44 -0
  283. package/dist/operations/catalogue/frost.d.ts +3 -0
  284. package/dist/operations/catalogue/frost.d.ts.map +1 -0
  285. package/dist/operations/catalogue/frost.js +111 -0
  286. package/dist/operations/catalogue/fxInstances.d.ts +21 -0
  287. package/dist/operations/catalogue/fxInstances.d.ts.map +1 -0
  288. package/dist/operations/catalogue/fxInstances.js +47 -0
  289. package/dist/operations/catalogue/fxPoints.d.ts +22 -0
  290. package/dist/operations/catalogue/fxPoints.d.ts.map +1 -0
  291. package/dist/operations/catalogue/fxPoints.js +70 -0
  292. package/dist/operations/catalogue/glow.d.ts.map +1 -1
  293. package/dist/operations/catalogue/glow.js +2 -1
  294. package/dist/operations/catalogue/heatCracks.d.ts +3 -0
  295. package/dist/operations/catalogue/heatCracks.d.ts.map +1 -0
  296. package/dist/operations/catalogue/heatCracks.js +134 -0
  297. package/dist/operations/catalogue/hologram.d.ts +3 -0
  298. package/dist/operations/catalogue/hologram.d.ts.map +1 -0
  299. package/dist/operations/catalogue/hologram.js +118 -0
  300. package/dist/operations/catalogue/inkBloom.d.ts +3 -0
  301. package/dist/operations/catalogue/inkBloom.d.ts.map +1 -0
  302. package/dist/operations/catalogue/inkBloom.js +156 -0
  303. package/dist/operations/catalogue/ivy.d.ts +13 -0
  304. package/dist/operations/catalogue/ivy.d.ts.map +1 -0
  305. package/dist/operations/catalogue/ivy.js +469 -0
  306. package/dist/operations/catalogue/jelly.d.ts +3 -0
  307. package/dist/operations/catalogue/jelly.d.ts.map +1 -0
  308. package/dist/operations/catalogue/jelly.js +50 -0
  309. package/dist/operations/catalogue/kintsugi.d.ts +3 -0
  310. package/dist/operations/catalogue/kintsugi.d.ts.map +1 -0
  311. package/dist/operations/catalogue/kintsugi.js +173 -0
  312. package/dist/operations/catalogue/lidarScan.d.ts +3 -0
  313. package/dist/operations/catalogue/lidarScan.d.ts.map +1 -0
  314. package/dist/operations/catalogue/lidarScan.js +240 -0
  315. package/dist/operations/catalogue/liquidMetal.d.ts +3 -0
  316. package/dist/operations/catalogue/liquidMetal.d.ts.map +1 -0
  317. package/dist/operations/catalogue/liquidMetal.js +122 -0
  318. package/dist/operations/catalogue/metalize.d.ts +3 -0
  319. package/dist/operations/catalogue/metalize.d.ts.map +1 -0
  320. package/dist/operations/catalogue/metalize.js +135 -0
  321. package/dist/operations/catalogue/moveToFront.d.ts.map +1 -1
  322. package/dist/operations/catalogue/moveToFront.js +1 -0
  323. package/dist/operations/catalogue/orbit.d.ts +3 -0
  324. package/dist/operations/catalogue/orbit.d.ts.map +1 -0
  325. package/dist/operations/catalogue/orbit.js +29 -0
  326. package/dist/operations/catalogue/particleSwarm.d.ts +3 -0
  327. package/dist/operations/catalogue/particleSwarm.d.ts.map +1 -0
  328. package/dist/operations/catalogue/particleSwarm.js +138 -0
  329. package/dist/operations/catalogue/petalPeel.d.ts +3 -0
  330. package/dist/operations/catalogue/petalPeel.d.ts.map +1 -0
  331. package/dist/operations/catalogue/petalPeel.js +137 -0
  332. package/dist/operations/catalogue/petrify.d.ts +3 -0
  333. package/dist/operations/catalogue/petrify.d.ts.map +1 -0
  334. package/dist/operations/catalogue/petrify.js +94 -0
  335. package/dist/operations/catalogue/portal.d.ts +3 -0
  336. package/dist/operations/catalogue/portal.d.ts.map +1 -0
  337. package/dist/operations/catalogue/portal.js +224 -0
  338. package/dist/operations/catalogue/print3d.d.ts +3 -0
  339. package/dist/operations/catalogue/print3d.d.ts.map +1 -0
  340. package/dist/operations/catalogue/print3d.js +275 -0
  341. package/dist/operations/catalogue/rainBeads.d.ts +3 -0
  342. package/dist/operations/catalogue/rainBeads.d.ts.map +1 -0
  343. package/dist/operations/catalogue/rainBeads.js +223 -0
  344. package/dist/operations/catalogue/restPose.d.ts +21 -0
  345. package/dist/operations/catalogue/restPose.d.ts.map +1 -0
  346. package/dist/operations/catalogue/restPose.js +55 -0
  347. package/dist/operations/catalogue/rimLight.d.ts +3 -0
  348. package/dist/operations/catalogue/rimLight.d.ts.map +1 -0
  349. package/dist/operations/catalogue/rimLight.js +72 -0
  350. package/dist/operations/catalogue/sandErosion.d.ts +3 -0
  351. package/dist/operations/catalogue/sandErosion.d.ts.map +1 -0
  352. package/dist/operations/catalogue/sandErosion.js +167 -0
  353. package/dist/operations/catalogue/shaderLayers.d.ts +74 -0
  354. package/dist/operations/catalogue/shaderLayers.d.ts.map +1 -0
  355. package/dist/operations/catalogue/shaderLayers.js +322 -0
  356. package/dist/operations/catalogue/shatter.d.ts +3 -0
  357. package/dist/operations/catalogue/shatter.d.ts.map +1 -0
  358. package/dist/operations/catalogue/shatter.js +267 -0
  359. package/dist/operations/catalogue/silkDrape.d.ts +3 -0
  360. package/dist/operations/catalogue/silkDrape.d.ts.map +1 -0
  361. package/dist/operations/catalogue/silkDrape.js +340 -0
  362. package/dist/operations/catalogue/spin.d.ts +3 -0
  363. package/dist/operations/catalogue/spin.d.ts.map +1 -0
  364. package/dist/operations/catalogue/spin.js +42 -0
  365. package/dist/operations/catalogue/surfaceSample.d.ts +17 -0
  366. package/dist/operations/catalogue/surfaceSample.d.ts.map +1 -0
  367. package/dist/operations/catalogue/surfaceSample.js +187 -0
  368. package/dist/operations/catalogue/swirl.d.ts +3 -0
  369. package/dist/operations/catalogue/swirl.d.ts.map +1 -0
  370. package/dist/operations/catalogue/swirl.js +69 -0
  371. package/dist/operations/catalogue/teleport.d.ts +3 -0
  372. package/dist/operations/catalogue/teleport.d.ts.map +1 -0
  373. package/dist/operations/catalogue/teleport.js +213 -0
  374. package/dist/operations/catalogue/transitionField.d.ts +124 -0
  375. package/dist/operations/catalogue/transitionField.d.ts.map +1 -0
  376. package/dist/operations/catalogue/transitionField.js +278 -0
  377. package/dist/operations/catalogue/unweave.d.ts +3 -0
  378. package/dist/operations/catalogue/unweave.d.ts.map +1 -0
  379. package/dist/operations/catalogue/unweave.js +233 -0
  380. package/dist/operations/catalogue/visibility.d.ts.map +1 -1
  381. package/dist/operations/catalogue/visibility.js +1 -0
  382. package/dist/operations/catalogue/voxelize.d.ts +3 -0
  383. package/dist/operations/catalogue/voxelize.d.ts.map +1 -0
  384. package/dist/operations/catalogue/voxelize.js +148 -0
  385. package/dist/operations/catalogue/warmup.d.ts +22 -0
  386. package/dist/operations/catalogue/warmup.d.ts.map +1 -0
  387. package/dist/operations/catalogue/warmup.js +106 -0
  388. package/dist/operations/catalogue/zoom.d.ts.map +1 -1
  389. package/dist/operations/catalogue/zoom.js +1 -0
  390. package/dist/operations/index.d.ts +4 -2
  391. package/dist/operations/index.d.ts.map +1 -1
  392. package/dist/operations/index.js +4 -2
  393. package/dist/operations/objectEffects.d.ts +46 -0
  394. package/dist/operations/objectEffects.d.ts.map +1 -0
  395. package/dist/operations/objectEffects.js +136 -0
  396. package/dist/operations/registry.d.ts +7 -2
  397. package/dist/operations/registry.d.ts.map +1 -1
  398. package/dist/operations/registry.js +45 -3
  399. package/dist/operations/runtime.d.ts +40 -2
  400. package/dist/operations/runtime.d.ts.map +1 -1
  401. package/dist/operations/runtime.js +164 -8
  402. package/dist/operations/types.d.ts +29 -3
  403. package/dist/operations/types.d.ts.map +1 -1
  404. package/dist/operations/types.js +6 -0
  405. package/dist/operations/useObjectEffectLayers.d.ts +4 -0
  406. package/dist/operations/useObjectEffectLayers.d.ts.map +1 -0
  407. package/dist/operations/useObjectEffectLayers.js +42 -0
  408. package/dist/operations/useOperationsRuntime.d.ts.map +1 -1
  409. package/dist/operations/useOperationsRuntime.js +42 -4
  410. package/dist/presets/landscapePresets.d.ts +1 -1
  411. package/dist/presets/landscapePresets.d.ts.map +1 -1
  412. package/dist/presets/landscapePresets.js +1 -1
  413. package/dist/presets/landscapeTypes.d.ts +1 -1
  414. package/dist/presets/landscapeTypes.d.ts.map +1 -1
  415. package/dist/presets/landscapeTypes.js +1 -1
  416. package/dist/presets/oceanSurfacePresets.d.ts +1 -1
  417. package/dist/presets/terrainPresets.d.ts +1 -1
  418. package/dist/presets/terrainPresets.d.ts.map +1 -1
  419. package/dist/presets/volumetricCloudPresets.d.ts +1 -1
  420. package/dist/types/cloudConfigs.d.ts +2 -309
  421. package/dist/types/cloudConfigs.d.ts.map +1 -1
  422. package/dist/types/cloudConfigs.js +2 -339
  423. package/dist/types/index.d.ts +8 -8
  424. package/dist/types/index.d.ts.map +1 -1
  425. package/dist/types/index.js +4 -4
  426. package/dist/types/landscapeConfigs.d.ts +2 -217
  427. package/dist/types/landscapeConfigs.d.ts.map +1 -1
  428. package/dist/types/landscapeConfigs.js +2 -256
  429. package/dist/types/oceanConfigs.d.ts +2 -289
  430. package/dist/types/oceanConfigs.d.ts.map +1 -1
  431. package/dist/types/oceanConfigs.js +2 -380
  432. package/dist/types/terrainConfigs.d.ts +2 -250
  433. package/dist/types/terrainConfigs.d.ts.map +1 -1
  434. package/dist/types/terrainConfigs.js +2 -292
  435. package/dist/utils/cloudUniforms.d.ts +1 -1
  436. package/dist/utils/configAnimations.d.ts +6 -0
  437. package/dist/utils/configAnimations.d.ts.map +1 -1
  438. package/dist/utils/configAnimations.js +14 -0
  439. package/dist/utils/gridConfig.d.ts +19 -0
  440. package/dist/utils/gridConfig.d.ts.map +1 -0
  441. package/dist/utils/gridConfig.js +52 -0
  442. package/dist/utils/handleCloudsAnimations.d.ts +1 -1
  443. package/dist/utils/handleCloudsAnimations.js +1 -1
  444. package/dist/utils/hasHoverAnimation.d.ts.map +1 -1
  445. package/dist/utils/hasHoverAnimation.js +0 -2
  446. package/dist/utils/landscapeUniforms.d.ts +1 -1
  447. package/dist/utils/landscapeUniforms.d.ts.map +1 -1
  448. package/dist/utils/oceanUniforms.d.ts +1 -1
  449. package/dist/utils/particleShape.d.ts +33 -0
  450. package/dist/utils/particleShape.d.ts.map +1 -0
  451. package/dist/utils/particleShape.js +207 -0
  452. package/dist/utils/particleTrails.d.ts.map +1 -1
  453. package/dist/utils/particleTrails.js +29 -14
  454. package/dist/utils/terrainUniforms.d.ts +1 -1
  455. package/dist/utils/terrainUniforms.d.ts.map +1 -1
  456. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- import type { AnimationClip, AnimationSequence, StepClip } from './types';
1
+ import type { AnimationClip, AnimationSequence, SequenceCue, StepClip } from './types';
2
2
  export interface ScheduledClip {
3
3
  /** `${stepClip.id}` — stable across re-resolves of the same sequence. */
4
4
  id: string;
@@ -11,6 +11,12 @@ export interface ScheduledClip {
11
11
  start: number;
12
12
  end: number;
13
13
  }
14
+ export interface ScheduledCue {
15
+ cue: SequenceCue;
16
+ stepIndex: number;
17
+ /** Sequence seconds. */
18
+ time: number;
19
+ }
14
20
  export interface SequenceSchedule {
15
21
  /** In priority order (schedule index = activation order). */
16
22
  entries: ScheduledClip[];
@@ -18,12 +24,47 @@ export interface SequenceSchedule {
18
24
  start: number;
19
25
  end: number;
20
26
  }[];
27
+ /** Sorted by time (authored order breaks ties). Cues on a missing step are dropped. */
28
+ cues: ScheduledCue[];
21
29
  duration: number;
22
30
  }
23
31
  export type ClipLookup = ReadonlyMap<string, AnimationClip> | ((id: string) => AnimationClip | undefined);
24
32
  export declare const clipMap: (clips: readonly AnimationClip[]) => Map<string, AnimationClip>;
25
33
  /** Step clips whose clip is missing (deleted, not loaded) are skipped. */
26
34
  export declare function resolveSequence(seq: AnimationSequence, clips: ClipLookup): SequenceSchedule;
35
+ /** Every cued action's state at sequence time T: on when its last cue at or before T is 'apply'. */
36
+ export declare function cueStatesAt(schedule: SequenceSchedule, T: number): Map<string, boolean>;
37
+ /**
38
+ * Where sequence time T sits, as a cue anchor: the step it falls in (a boundary
39
+ * belongs to the step that starts there) and the offset into it.
40
+ */
41
+ export declare function anchorAt(seq: AnimationSequence, schedule: SequenceSchedule, T: number): {
42
+ stepId: string;
43
+ at: number;
44
+ } | null;
45
+ /** On / off spans of one action along the sequence (for drawing). */
46
+ export declare function cueSpans(schedule: SequenceSchedule, actionId: string): Array<{
47
+ from: number;
48
+ to: number;
49
+ }>;
50
+ export interface CueConflict {
51
+ cue: SequenceCue;
52
+ /** The clip whose track animates a property the action patches. */
53
+ clip: AnimationClip;
54
+ state: string;
55
+ path: string;
56
+ }
57
+ /**
58
+ * 'apply' cues whose action patches a property that a clip of the same step
59
+ * animates — the clip writes over the patch while it runs.
60
+ */
61
+ export declare function findCueConflicts(seq: AnimationSequence, clips: ClipLookup, getAction: (id: string) => {
62
+ targets?: Array<{
63
+ state: string;
64
+ patch: any;
65
+ }>;
66
+ } | undefined): CueConflict[];
67
+ export declare function newCue(actionId: string, stepId: string, at: number, mode?: SequenceCue['mode']): SequenceCue;
27
68
  /** Clip-local time (seconds, 0..clip.duration) of an entry at sequence time T. */
28
69
  export declare function entryLocalTime(entry: ScheduledClip, T: number): number;
29
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sequenceUtils.d.ts","sourceRoot":"","sources":["../../src/animationsV2/sequenceUtils.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI1E,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC,CAAC;AAK1G,eAAO,MAAM,OAAO,GAAI,OAAO,SAAS,aAAa,EAAE,KAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAC/C,CAAC;AAKrC,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,GAAG,gBAAgB,CAqB3F;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAGtE;AAID,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,MAAM,EAAE,QAAQ,CAAC;IACjB,+BAA+B;IAC/B,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAID;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,CAuC/F;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAIrF;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAMxE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEpD;AAED,4CAA4C;AAC5C,wBAAgB,aAAa,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CASlG"}
1
+ {"version":3,"file":"sequenceUtils.d.ts","sourceRoot":"","sources":["../../src/animationsV2/sequenceUtils.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,98 @@ export function resolveSequence(seq, clips) {
24
24
  steps.push({ start: stepStart, end: stepEnd });
25
25
  cursor = stepEnd;
26
26
  });
27
- return { entries, steps, duration: cursor };
27
+ const stepIndexById = new Map(seq.steps.map((s, i) => [s.id, i]));
28
+ const cues = [];
29
+ (seq.cues ?? []).forEach((cue) => {
30
+ const stepIndex = stepIndexById.get(cue.stepId);
31
+ if (stepIndex === undefined)
32
+ return;
33
+ const time = Math.min(cursor, steps[stepIndex].start + safeDelay(cue.at));
34
+ cues.push({ cue, stepIndex, time });
35
+ });
36
+ cues.sort((a, b) => a.time - b.time); // stable: authored order breaks ties
37
+ return { entries, steps, cues, duration: cursor };
38
+ }
39
+ // --- cues (actions) ----------------------------------------------------------------
40
+ /** Every cued action's state at sequence time T: on when its last cue at or before T is 'apply'. */
41
+ export function cueStatesAt(schedule, T) {
42
+ const out = new Map();
43
+ for (const c of schedule.cues) {
44
+ if (!out.has(c.cue.actionId))
45
+ out.set(c.cue.actionId, false);
46
+ if (c.time <= T + 1e-9)
47
+ out.set(c.cue.actionId, c.cue.mode === 'apply');
48
+ }
49
+ return out;
50
+ }
51
+ /**
52
+ * Where sequence time T sits, as a cue anchor: the step it falls in (a boundary
53
+ * belongs to the step that starts there) and the offset into it.
54
+ */
55
+ export function anchorAt(seq, schedule, T) {
56
+ if (!seq.steps.length)
57
+ return null;
58
+ let index = 0;
59
+ schedule.steps.forEach((s, i) => { if (T >= s.start - 1e-9)
60
+ index = i; });
61
+ const start = schedule.steps[index]?.start ?? 0;
62
+ return { stepId: seq.steps[index].id, at: Math.max(0, T - start) };
63
+ }
64
+ /** On / off spans of one action along the sequence (for drawing). */
65
+ export function cueSpans(schedule, actionId) {
66
+ const spans = [];
67
+ let onAt = null;
68
+ for (const c of schedule.cues) {
69
+ if (c.cue.actionId !== actionId)
70
+ continue;
71
+ if (c.cue.mode === 'apply' && onAt === null)
72
+ onAt = c.time;
73
+ else if (c.cue.mode === 'revert' && onAt !== null) {
74
+ spans.push({ from: onAt, to: c.time });
75
+ onAt = null;
76
+ }
77
+ }
78
+ if (onAt !== null)
79
+ spans.push({ from: onAt, to: schedule.duration });
80
+ return spans;
81
+ }
82
+ /** Leaf paths of a patch ('meshSettings.position', 'config.intensity'…); arrays are leaves. */
83
+ function patchPaths(patch, prefix = '') {
84
+ if (!patch || typeof patch !== 'object' || Array.isArray(patch))
85
+ return prefix ? [prefix] : [];
86
+ return Object.entries(patch).flatMap(([k, v]) => patchPaths(v, prefix ? `${prefix}.${k}` : k));
87
+ }
88
+ const overlapsPath = (a, b) => a === b || a.startsWith(`${b}.`) || b.startsWith(`${a}.`);
89
+ /**
90
+ * 'apply' cues whose action patches a property that a clip of the same step
91
+ * animates — the clip writes over the patch while it runs.
92
+ */
93
+ export function findCueConflicts(seq, clips, getAction) {
94
+ const schedule = resolveSequence(seq, clips);
95
+ const out = [];
96
+ for (const sc of schedule.cues) {
97
+ if (sc.cue.mode !== 'apply')
98
+ continue;
99
+ const action = getAction(sc.cue.actionId);
100
+ if (!action?.targets?.length)
101
+ continue;
102
+ const entries = schedule.entries.filter(e => e.stepIndex === sc.stepIndex);
103
+ for (const target of action.targets) {
104
+ const paths = patchPaths(target.patch);
105
+ for (const e of entries) {
106
+ for (const track of e.clip.tracks) {
107
+ if (track.muted || track.node || track.state !== target.state || !track.keys.length)
108
+ continue;
109
+ if (paths.some(p => overlapsPath(p, track.path)))
110
+ out.push({ cue: sc.cue, clip: e.clip, state: track.state, path: track.path });
111
+ }
112
+ }
113
+ }
114
+ }
115
+ return out;
116
+ }
117
+ export function newCue(actionId, stepId, at, mode = 'apply') {
118
+ return { id: uid('cue'), actionId, stepId, at: Math.max(0, at), mode };
28
119
  }
29
120
  /** Clip-local time (seconds, 0..clip.duration) of an entry at sequence time T. */
30
121
  export function entryLocalTime(entry, T) {
@@ -99,7 +190,7 @@ export function conflictedStepClipIds(conflicts) {
99
190
  // --- builders ----------------------------------------------------------------------
100
191
  export function newSequence(name, key) {
101
192
  return {
102
- id: uid('seq'), name, key, steps: [{ id: uid('step'), clips: [] }],
193
+ id: uid('seq'), name, key, steps: [{ id: uid('step'), clips: [] }], cues: [],
103
194
  loop: false, yoyo: false, reverse: false, endMode: 'hold',
104
195
  driver: 'time', driverSettings: { ...DEFAULT_DRIVER_SETTINGS }, autoplay: false,
105
196
  };
@@ -115,6 +206,15 @@ export function cloneSequence(seq, name, key) {
115
206
  name,
116
207
  key,
117
208
  isDirty: undefined,
118
- steps: seq.steps.map(s => ({ id: uid('step'), clips: s.clips.map(c => ({ ...c, id: uid('sc') })) })),
209
+ ...(() => {
210
+ // Fresh step ids — cues follow their step to the copy.
211
+ const stepIds = new Map(seq.steps.map(s => [s.id, uid('step')]));
212
+ return {
213
+ steps: seq.steps.map(s => ({ id: stepIds.get(s.id), clips: s.clips.map(c => ({ ...c, id: uid('sc') })) })),
214
+ cues: (seq.cues ?? [])
215
+ .filter(c => stepIds.has(c.stepId))
216
+ .map(c => ({ ...c, id: uid('cue'), stepId: stepIds.get(c.stepId) })),
217
+ };
218
+ })(),
119
219
  };
120
220
  }
@@ -59,6 +59,24 @@ export interface SequenceStep {
59
59
  id: string;
60
60
  clips: StepClip[];
61
61
  }
62
+ /**
63
+ * An action switched at a moment of the sequence. Anchored to a step (not absolute
64
+ * time), so retiming clips or reordering steps keeps it on the moment it was put on.
65
+ *
66
+ * Cues are STATE, not events: at sequence time T an action is on when its last cue
67
+ * at or before T is 'apply' (off when 'revert', or when it has no cue yet). So
68
+ * scrubbing, reverse, yoyo, loop and input drivers all land on the same scene.
69
+ */
70
+ export interface SequenceCue {
71
+ id: string;
72
+ /** ActionSequence id. */
73
+ actionId: string;
74
+ /** Step it is anchored to. */
75
+ stepId: string;
76
+ /** Seconds after that step starts (>= 0). */
77
+ at: number;
78
+ mode: 'apply' | 'revert';
79
+ }
62
80
  /** What moves a sequence's clock: time (it plays), or an input that scrubs it. */
63
81
  export type SequenceDriver = 'time' | 'mouseWheel' | 'mouseX' | 'mouseY';
64
82
  export interface SequenceDriverSettings {
@@ -77,6 +95,8 @@ export interface AnimationSequence {
77
95
  description?: string;
78
96
  /** Run in order. */
79
97
  steps: SequenceStep[];
98
+ /** Actions switched on / off along the sequence. */
99
+ cues: SequenceCue[];
80
100
  /** Whole-sequence playback. */
81
101
  loop: boolean;
82
102
  yoyo: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/animationsV2/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/animationsV2/types.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,15 @@
1
1
  import type { ObjectReadyProps } from '../types/objectReady';
2
2
  import type { ThreeElements } from '@react-three/fiber';
3
- import type { MyGridConfig } from '@3driseai/3drise-core';
3
+ import type { AnimationOptions, MouseMoveDomain, MyGridConfig } from '@3driseai/3drise-core';
4
4
  export interface AdvancedGridProps extends ObjectReadyProps {
5
5
  config?: MyGridConfig;
6
6
  groupProps?: ThreeElements['group'];
7
+ /** Scene object id: the live-edit handle is found by it. */
8
+ id?: string;
9
+ /** Keyframes on this grid's config knobs (animations.grid.animations). */
10
+ keyframes?: AnimationOptions[];
11
+ /** Pointer bindings on this grid's config knobs (mouseMove.grid). */
12
+ mouseMove?: MouseMoveDomain;
7
13
  }
8
14
  /**
9
15
  * MyGridConfig — the single source of truth for a grid instance.
@@ -11,6 +17,6 @@ export interface AdvancedGridProps extends ObjectReadyProps {
11
17
  * and any preset/serialization layer.
12
18
  */
13
19
  export declare const defaultMyGridConfig: MyGridConfig;
14
- export declare function AdvancedGrid({ config, groupProps, onObjectReady, onObjectDispose }: AdvancedGridProps): import("react").JSX.Element;
20
+ export declare function AdvancedGrid({ config, groupProps, id, keyframes, mouseMove, onObjectReady, onObjectDispose }: AdvancedGridProps): import("react").JSX.Element;
15
21
  export default AdvancedGrid;
16
22
  //# sourceMappingURL=AdvancedGrid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdvancedGrid.d.ts","sourceRoot":"","sources":["../../src/components/AdvancedGrid.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACvD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACvC;AAKD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAyBjC,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,MAA4B,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,iBAAiB,+BAiE3H;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"AdvancedGrid.d.ts","sourceRoot":"","sources":["../../src/components/AdvancedGrid.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE7F,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACvD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,4DAA4D;IAC5D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,qEAAqE;IACrE,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAKD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAyBjC,CAAC;AAWF,wBAAgB,YAAY,CAAC,EAAE,MAA4B,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,iBAAiB,+BA+CrJ;AAED,eAAe,YAAY,CAAC"}
@@ -1,9 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useObjectReady } from '../hooks/useObjectReady.js';
3
3
  import { useGridSurface } from '../hooks/useGridSurface.js';
4
- import { useMemo, useRef } from 'react';
4
+ import { useConfigDriver } from '../hooks/useConfigDriver.js';
5
+ import { withConfigDefaults } from '../utils/configAnimations.js';
6
+ import { applyGridConfig, GRID_STRUCTURAL } from '../utils/gridConfig.js';
7
+ import { useCallback, useLayoutEffect, useMemo, useRef } from 'react';
5
8
  import * as THREE from 'three';
6
- import { MyGridMaterial } from '@3driseai/3drise-core';
9
+ import { MyGridMaterial, GRIDS_ANIMATABLE } from '@3driseai/3drise-core';
7
10
  // Side-effect import registers <myGridMaterial> via extend() in MyGridMaterial.ts.
8
11
  void MyGridMaterial;
9
12
  /**
@@ -37,27 +40,41 @@ export const defaultMyGridConfig = {
37
40
  reveal: 1,
38
41
  revealDuration: 0,
39
42
  };
40
- export function AdvancedGrid({ config = defaultMyGridConfig, groupProps, onObjectReady, onObjectDispose }) {
43
+ /** No knobs of its own: the shared surface knobs are all there is. */
44
+ const VARIANT = [];
45
+ /** No computed uniforms: every knob maps straight to its u_<key>. */
46
+ const DERIVE = {};
47
+ /** Knobs that rebuild the plane or pick a mode: they change on commit, never through the live path. */
48
+ const STRUCTURAL = [...GRID_STRUCTURAL];
49
+ /** Knobs a keyframe or pointer binding may drive per frame — exactly what applyGridConfig pushes. */
50
+ const ANIMATABLE = new Set((GRIDS_ANIMATABLE.advancedGrid ?? []).map((p) => p.value));
51
+ export function AdvancedGrid({ config = defaultMyGridConfig, groupProps, id, keyframes, mouseMove, onObjectReady, onObjectDispose }) {
41
52
  const matRef = useRef(null);
42
53
  const rootRef = useRef(null);
43
54
  const meshRef = useRef(null);
44
55
  useObjectReady(rootRef, config, onObjectReady, onObjectDispose);
45
- const { cellSize, size, segments, flat, lineMode, cellMode, lineWidth, sectionSize, sectionWidth, animSpeed, animScale, animIntensity, fadeDistance, fadeStrength, displace, lineColor, sectionColor, cellColor, glowColor, bgColor, bgOpacity, followMouse, reveal, revealDuration, } = config;
56
+ // The committed config over this grid's defaults: every knob has a value to render
57
+ // and for a keyframe or pointer binding to start from.
58
+ const base = useMemo(() => withConfigDefaults(defaultMyGridConfig, config), [config]);
59
+ const { cellSize, size, segments, flat, displace, followMouse, reveal, revealDuration } = base;
46
60
  const segs = segments ?? (displace > 0 ? Math.max(64, Math.ceil(size / cellSize) * 2) : 1);
47
- const fade = fadeDistance ?? size * 0.5;
48
- // memoize Color objects so we only re-allocate when the hex actually changes
49
- const colors = useMemo(() => ({
50
- line: new THREE.Color(lineColor),
51
- section: new THREE.Color(sectionColor),
52
- cell: new THREE.Color(cellColor),
53
- glow: new THREE.Color(glowColor),
54
- bg: new THREE.Color(bgColor),
55
- }), [lineColor, sectionColor, cellColor, glowColor, bgColor]);
56
61
  // Shared with every other shader-plane grid. This also fixes the pointer
57
62
  // projection: it used to assume the XZ plane, so `followMouse` picked
58
63
  // against the wrong plane whenever `flat` was false or a parent transform
59
64
  // had rotated the grid.
60
65
  useGridSurface(matRef, meshRef, { followMouse, reveal, revealDuration });
61
- return (_jsx("group", { ref: rootRef, ...groupProps, children: _jsxs("mesh", { ref: meshRef, rotation: flat ? [-Math.PI / 2, 0, 0] : [0, 0, 0], children: [_jsx("planeGeometry", { args: [size, size, segs, segs] }), _jsx("myGridMaterial", { ref: matRef, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide, u_cellSize: cellSize, u_lineWidth: lineWidth, u_sectionSize: sectionSize, u_sectionWidth: sectionWidth, u_lineMode: lineMode, u_cellMode: cellMode, u_animSpeed: animSpeed, u_animScale: animScale, u_animIntensity: animIntensity, u_fadeDistance: fade, u_fadeStrength: fadeStrength, u_displace: displace, u_lineColor: colors.line, u_sectionColor: colors.section, u_cellColor: colors.cell, u_glowColor: colors.glow, u_bgColor: colors.bg, u_bgOpacity: bgOpacity }, MyGridMaterial.key)] }) }));
66
+ // One push point for every uniform the config owns: the committed config when the
67
+ // material mounts or the config commits, the merged one while anything overrides it.
68
+ const baseRef = useRef(base);
69
+ baseRef.current = base;
70
+ const setMaterial = useCallback((m) => {
71
+ matRef.current = m;
72
+ if (m)
73
+ applyGridConfig(m, baseRef.current, VARIANT, DERIVE);
74
+ }, []);
75
+ useLayoutEffect(() => { applyGridConfig(matRef.current, base, VARIANT, DERIVE); }, [base]);
76
+ const push = useCallback((merged) => applyGridConfig(matRef.current, merged, VARIANT, DERIVE), []);
77
+ useConfigDriver({ rootRef, id, family: 'grids', base, structural: STRUCTURAL, allowed: ANIMATABLE, keyframes, mouseMove, push });
78
+ return (_jsx("group", { ref: rootRef, ...groupProps, children: _jsxs("mesh", { ref: meshRef, rotation: flat ? [-Math.PI / 2, 0, 0] : [0, 0, 0], children: [_jsx("planeGeometry", { args: [size, size, segs, segs] }), _jsx("myGridMaterial", { ref: setMaterial, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide }, MyGridMaterial.key)] }) }));
62
79
  }
63
80
  export default AdvancedGrid;
@@ -1 +1 @@
1
- {"version":3,"file":"AnimatedObject.d.ts","sourceRoot":"","sources":["../../src/components/AnimatedObject.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACtG,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,aAAa,EAAE,qBAAqB,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IACjH,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACvD,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAqFvD,CAAC;AAEH,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"AnimatedObject.d.ts","sourceRoot":"","sources":["../../src/components/AnimatedObject.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACtG,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,aAAa,EAAE,qBAAqB,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IACjH,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACvD,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAiFvD,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -1,8 +1,8 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useObjectReady } from '../hooks/useObjectReady.js';
3
3
  import { useRef, useEffect, useCallback, memo } from 'react';
4
4
  import { usePathAnimation } from '../hooks/usePathAnimation.js';
5
- import EffectsGroup from './EffectsGroup.js';
5
+ import { useObjectEffectLayers } from '../operations/useObjectEffectLayers.js';
6
6
  import { useObjectAnimation } from '../hooks/useObjectAnimation.js';
7
7
  import { hasHoverAnimation } from '../utils/hasHoverAnimation.js';
8
8
  export const AnimatedObject = memo(({ stateKey, transitionSettings, createdObject,
@@ -39,6 +39,8 @@ visible = true, children, parentRef, handleObjectClick, onPointerEnter, onPointe
39
39
  enabled: createdObject.type !== 'gallery', //
40
40
  hovered,
41
41
  }, groupRef);
42
+ // Effects layered on the object (frost, metalize…) — switched on / off, held while on.
43
+ useObjectEffectLayers(groupRef, createdObject.effects);
42
44
  const { startPathAnimation, updatePathAnimation, isAnimating: isPathAnimating } = usePathAnimation();
43
45
  const syncTransform = useCallback(() => {
44
46
  const obj = groupRef.current;
@@ -64,13 +66,13 @@ visible = true, children, parentRef, handleObjectClick, onPointerEnter, onPointe
64
66
  }
65
67
  };
66
68
  if (createdObject.type === 'particles' || createdObject.type === 'gallery' || (!hasHoverFunctionalities && !hasMouseInteraction)) {
67
- return _jsx(_Fragment, { children: _jsxs("group", { ref: groupRef, position: position, scale: scale, rotation: rotation, visible: visible,
69
+ return _jsx(_Fragment, { children: _jsx("group", { ref: groupRef, position: position, scale: scale, rotation: rotation, visible: visible,
68
70
  // onClick={onClick}
69
71
  // onPointerEnter={onPointerEnter}
70
72
  // onPointerLeave={onPointerLeave}
71
- name: createdObject.meshSettings.name, userData: { id: createdObject.id }, children: [children, _jsx(EffectsGroup, { createdObject: createdObject, objectRef: groupRef, onObjectReady: onObjectReady, onObjectDispose: onObjectDispose })] }) });
73
+ name: createdObject.meshSettings.name, userData: { id: createdObject.id }, children: children }) });
72
74
  }
73
- return (_jsxs("group", { ref: groupRef, position: position, scale: scale, rotation: rotation, visible: visible, onClick: onClick, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, name: createdObject.meshSettings.name, userData: { id: createdObject.id }, children: [children, _jsx(EffectsGroup, { createdObject: createdObject, objectRef: groupRef, onObjectReady: onObjectReady, onObjectDispose: onObjectDispose })] }));
75
+ return (_jsx("group", { ref: groupRef, position: position, scale: scale, rotation: rotation, visible: visible, onClick: onClick, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, name: createdObject.meshSettings.name, userData: { id: createdObject.id }, children: children }));
74
76
  });
75
77
  AnimatedObject.displayName = 'AnimatedObject';
76
78
  export default AnimatedObject;
@@ -1,9 +1,15 @@
1
1
  import type { ObjectReadyProps } from '../types/objectReady';
2
- import type { BubblesConfig } from '@3driseai/3drise-core';
2
+ import type { AnimationOptions, BubblesConfig, MouseMoveDomain } from '@3driseai/3drise-core';
3
3
  import React from "react";
4
4
  export interface BubblesProps extends ObjectReadyProps {
5
5
  config: BubblesConfig;
6
6
  boundingRadius?: number;
7
+ /** Scene object id of a standalone effect: the live-edit handle is found by it. */
8
+ id?: string;
9
+ /** Keyframes on this effect's config knobs (animations.effect.animations). */
10
+ keyframes?: AnimationOptions[];
11
+ /** Pointer bindings on this effect's config knobs (mouseMove.effect). */
12
+ mouseMove?: MouseMoveDomain;
7
13
  }
8
14
  declare const Bubbles: React.FC<BubblesProps>;
9
15
  export default Bubbles;
@@ -1 +1 @@
1
- {"version":3,"file":"Bubbles.d.ts","sourceRoot":"","sources":["../../src/components/Bubbles.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IAClD,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,QAAA,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAmGnC,CAAC;AACF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"Bubbles.d.ts","sourceRoot":"","sources":["../../src/components/Bubbles.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IAClD,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,yEAAyE;IACzE,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAyBD,QAAA,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAqGnC,CAAC;AACF,eAAe,OAAO,CAAC"}
@@ -1,11 +1,34 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useObjectReady } from '../hooks/useObjectReady.js';
3
- import { useEffect, useMemo, useRef } from 'react';
3
+ import { useConfigDriver } from '../hooks/useConfigDriver.js';
4
+ import { withConfigDefaults } from '../utils/configAnimations.js';
5
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
4
6
  import { useFrame } from '@react-three/fiber';
5
7
  import * as THREE from 'three';
6
- import { BubblesPointsMaterial } from '@3driseai/3drise-core';
8
+ import { BubblesPointsMaterial, DEFAULT_GENERATIVE_EFFECTS, EFFECTS_ANIMATABLE } from '@3driseai/3drise-core';
7
9
  const MAX_BUBBLES = 256;
8
- const Bubbles = ({ config, onObjectReady, onObjectDispose }) => {
10
+ /** Nothing rebuilds the pool: it is a fixed ring buffer of MAX_BUBBLES. */
11
+ const STRUCTURAL = [];
12
+ /** Knobs a keyframe or pointer binding may drive per frame — exactly what the push point applies. */
13
+ const ANIMATABLE = new Set(EFFECTS_ANIMATABLE.bubbles.map((p) => p.value));
14
+ /** The single push point: every config knob that lives on the material reaches it here. */
15
+ function applyConfig(material, c) {
16
+ const u = material.uniforms;
17
+ const [cA, cB, cC] = c.colors;
18
+ u.uColorA.value.set(cA);
19
+ u.uColorB.value.set(cB);
20
+ u.uColorC.value.set(cC);
21
+ u.uScale.value = (c.scale) / 10;
22
+ u.uOpacity.value = c.opacity;
23
+ u.uIridescence.value = c.iridescence;
24
+ // speed is integrated into uTime on the CPU (see useFrame), so the shader's
25
+ // uTime * uSpeed never jumps when the speed changes
26
+ u.uSpeed.value = 1;
27
+ }
28
+ const Bubbles = ({ config, id, keyframes, mouseMove, onObjectReady, onObjectDispose }) => {
29
+ const cfg = useMemo(() => withConfigDefaults(DEFAULT_GENERATIVE_EFFECTS.bubbles, config), [config]);
30
+ // the knobs read per frame by the simulation, from the last merged config
31
+ const cur = useRef(cfg);
9
32
  const positions = useMemo(() => new Float32Array(MAX_BUBBLES * 3), []);
10
33
  const velocities = useMemo(() => new Float32Array(MAX_BUBBLES * 3), []);
11
34
  const ages = useMemo(() => new Float32Array(MAX_BUBBLES), []);
@@ -31,28 +54,25 @@ const Bubbles = ({ config, onObjectReady, onObjectDispose }) => {
31
54
  m.blending = THREE.NormalBlending;
32
55
  return m;
33
56
  }, []);
34
- useEffect(() => {
35
- const u = material.uniforms;
36
- const [cA, cB, cC] = config.colors ?? ['#aaccff', '#ffaadd', '#aaffcc'];
37
- u.uColorA.value.set(cA);
38
- u.uColorB.value.set(cB);
39
- u.uColorC.value.set(cC);
40
- u.uScale.value = (config.scale ?? 1) / 10;
41
- u.uOpacity.value = config.opacity ?? 0.6;
42
- u.uIridescence.value = config.iridescence ?? 0.7;
43
- u.uSpeed.value = config.speed ?? 1;
44
- }, [config.colors, config.scale, config.opacity, config.iridescence, config.speed, material]);
45
57
  useEffect(() => () => { geometry.dispose(); material.dispose(); }, [geometry, material]);
46
58
  const spawnAccum = useRef(0);
47
59
  const rootRef = useRef(null);
48
60
  useObjectReady(rootRef, config, onObjectReady, onObjectDispose);
61
+ const push = useCallback((merged) => {
62
+ cur.current = merged;
63
+ applyConfig(material, merged);
64
+ }, [material]);
65
+ useLayoutEffect(() => { push(cfg); }, [push, cfg]);
66
+ useConfigDriver({ rootRef, id, family: 'effects', base: cfg, structural: STRUCTURAL, allowed: ANIMATABLE, keyframes, mouseMove, push });
49
67
  useFrame((state, delta) => {
50
- material.uniforms.uTime.value = state.clock.getElapsedTime();
51
- const scale = config.scale ?? 1;
52
- const spawnRate = config.spawnRate ?? 8;
53
- const floatSpeed = (config.floatSpeed ?? 0.5) * (config.speed ?? 1);
54
- const lifetimeMs = config.lifetimeMs ?? 4000;
55
- const speed = config.speed ?? 1;
68
+ const c = cur.current;
69
+ const speed = c.speed;
70
+ // one integrated clock drives the shader and the CPU wobble, so speed changes never jump
71
+ const t = (material.uniforms.uTime.value += Math.min(delta, 0.1) * speed);
72
+ const scale = c.scale;
73
+ const spawnRate = c.spawnRate;
74
+ const floatSpeed = (c.floatSpeed) * speed;
75
+ const lifetimeMs = c.lifetimeMs;
56
76
  spawnAccum.current += spawnRate * delta;
57
77
  let toSpawn = Math.floor(spawnAccum.current);
58
78
  spawnAccum.current -= toSpawn;
@@ -61,7 +81,7 @@ const Bubbles = ({ config, onObjectReady, onObjectDispose }) => {
61
81
  while (toSpawn > 0 && scan < MAX_BUBBLES) {
62
82
  if (alive[scan] === 0) {
63
83
  const base = scan * 3;
64
- // Spawn at local origin with small lateral jitter — parent group's
84
+ // Spawn at local origin with small lateral jitter - parent group's
65
85
  // transform places the system in world space.
66
86
  positions[base + 0] = (Math.random() - 0.5) * 0.2 * scale;
67
87
  positions[base + 1] = (Math.random() - 0.5) * 0.1 * scale;
@@ -90,7 +110,7 @@ const Bubbles = ({ config, onObjectReady, onObjectDispose }) => {
90
110
  }
91
111
  velocities[base + 0] *= 0.99;
92
112
  velocities[base + 2] *= 0.99;
93
- const wobble = Math.sin(state.clock.getElapsedTime() * 1.3 * speed + phases[j]) * 0.05;
113
+ const wobble = Math.sin(t * 1.3 + phases[j]) * 0.05;
94
114
  positions[base + 0] += velocities[base + 0] * delta + wobble * delta;
95
115
  positions[base + 1] += velocities[base + 1] * delta;
96
116
  positions[base + 2] += velocities[base + 2] * delta;
@@ -1,15 +1,19 @@
1
1
  import type { ThreeElements } from '@react-three/fiber';
2
2
  import type { ObjectReadyProps } from '../types/objectReady';
3
3
  import type { ChladniGridConfig } from '../types/gridConfigs';
4
+ import type { AnimationOptions, MouseMoveDomain } from '@3driseai/3drise-core';
4
5
  export interface ChladniGridProps extends ObjectReadyProps {
5
6
  config?: ChladniGridConfig;
6
7
  groupProps?: ThreeElements['group'];
8
+ /** Scene object id: the live-edit handle is found by it. */
9
+ id?: string;
10
+ /** Keyframes on this grid's config knobs (animations.grid.animations). */
11
+ keyframes?: AnimationOptions[];
12
+ /** Pointer bindings on this grid's config knobs (mouseMove.grid). */
13
+ mouseMove?: MouseMoveDomain;
7
14
  }
8
15
  /** ChladniGridConfig defaults. Must match the catalog entry in grid-defaults.json exactly. */
9
16
  export declare const defaultChladniGridConfig: ChladniGridConfig;
10
- /**
11
- * Chladni plates: the nodal lines of a standing wave on a square plate, with sand settling on them, drifting slowly between two neighbouring resonances.
12
- */
13
- export declare function ChladniGrid({ config, groupProps, onObjectReady, onObjectDispose }: ChladniGridProps): import("react").JSX.Element;
17
+ export declare function ChladniGrid({ config, groupProps, id, keyframes, mouseMove, onObjectReady, onObjectDispose }: ChladniGridProps): import("react").JSX.Element;
14
18
  export default ChladniGrid;
15
19
  //# sourceMappingURL=ChladniGrid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChladniGrid.d.ts","sourceRoot":"","sources":["../../src/components/ChladniGrid.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACtD,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACvC;AAKD,8FAA8F;AAC9F,eAAO,MAAM,wBAAwB,EAAE,iBA6BtC,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,MAAiC,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,gBAAgB,+BAiE9H;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ChladniGrid.d.ts","sourceRoot":"","sources":["../../src/components/ChladniGrid.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE/E,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACtD,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,4DAA4D;IAC5D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,qEAAqE;IACrE,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAKD,8FAA8F;AAC9F,eAAO,MAAM,wBAAwB,EAAE,iBA6BtC,CAAC;AAcF,wBAAgB,WAAW,CAAC,EAAE,MAAiC,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,gBAAgB,+BA4CxJ;AAED,eAAe,WAAW,CAAC"}
@@ -1,9 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useMemo, useRef } from 'react';
2
+ import { useCallback, useLayoutEffect, useMemo, useRef } from 'react';
3
3
  import * as THREE from 'three';
4
4
  import { useObjectReady } from '../hooks/useObjectReady.js';
5
5
  import { useGridSurface } from '../hooks/useGridSurface.js';
6
- import { ChladniGridMaterial } from '@3driseai/3drise-core';
6
+ import { useConfigDriver } from '../hooks/useConfigDriver.js';
7
+ import { withConfigDefaults } from '../utils/configAnimations.js';
8
+ import { applyGridConfig, GRID_STRUCTURAL } from '../utils/gridConfig.js';
9
+ import { ChladniGridMaterial, GRIDS_ANIMATABLE } from '@3driseai/3drise-core';
7
10
  // Side-effect import registers <chladniGridMaterial> via extend().
8
11
  void ChladniGridMaterial;
9
12
  /** ChladniGridConfig defaults. Must match the catalog entry in grid-defaults.json exactly. */
@@ -40,23 +43,38 @@ export const defaultChladniGridConfig = {
40
43
  /**
41
44
  * Chladni plates: the nodal lines of a standing wave on a square plate, with sand settling on them, drifting slowly between two neighbouring resonances.
42
45
  */
43
- export function ChladniGrid({ config = defaultChladniGridConfig, groupProps, onObjectReady, onObjectDispose }) {
46
+ /** This grid's own uniforms (u_<key>), pushed by applyGridConfig beside the shared surface knobs. */
47
+ const VARIANT = ['modeN', 'modeM', 'morph', 'grain'];
48
+ /** No computed uniforms: every knob maps straight to its u_<key>. */
49
+ const DERIVE = {};
50
+ /** Knobs that rebuild the plane or pick a mode: they change on commit, never through the live path. */
51
+ const STRUCTURAL = [...GRID_STRUCTURAL, 'modeN', 'modeM'];
52
+ /** Knobs a keyframe or pointer binding may drive per frame — exactly what applyGridConfig pushes. */
53
+ const ANIMATABLE = new Set((GRIDS_ANIMATABLE.chladniGrid ?? []).map((p) => p.value));
54
+ export function ChladniGrid({ config = defaultChladniGridConfig, groupProps, id, keyframes, mouseMove, onObjectReady, onObjectDispose }) {
44
55
  const matRef = useRef(null);
45
56
  const rootRef = useRef(null);
46
57
  const meshRef = useRef(null);
47
58
  useObjectReady(rootRef, config, onObjectReady, onObjectDispose);
48
- const { cellSize, size, segments, flat, lineMode, cellMode, lineWidth, sectionSize, sectionWidth, animSpeed, animScale, animIntensity, fadeDistance, fadeStrength, displace, modeN, modeM, morph, grain, lineColor, sectionColor, cellColor, glowColor, bgColor, bgOpacity, followMouse, reveal, revealDuration, } = config;
59
+ // The committed config over this grid's defaults: every knob has a value to render
60
+ // and for a keyframe or pointer binding to start from.
61
+ const base = useMemo(() => withConfigDefaults(defaultChladniGridConfig, config), [config]);
62
+ const { cellSize, size, segments, flat, displace, followMouse, reveal, revealDuration } = base;
49
63
  // the displacement is the standing wave itself, so the mesh has to resolve every mode
50
64
  const segs = segments ?? (displace > 0 ? Math.min(512, Math.max(96, Math.ceil(size / Math.max(cellSize, 1e-4)) * 48)) : 1);
51
- const fade = fadeDistance ?? size * 0.5;
52
- const colors = useMemo(() => ({
53
- line: new THREE.Color(lineColor),
54
- section: new THREE.Color(sectionColor),
55
- cell: new THREE.Color(cellColor),
56
- glow: new THREE.Color(glowColor),
57
- bg: new THREE.Color(bgColor),
58
- }), [lineColor, sectionColor, cellColor, glowColor, bgColor]);
59
65
  useGridSurface(matRef, meshRef, { followMouse, reveal, revealDuration });
60
- return (_jsx("group", { ref: rootRef, ...groupProps, children: _jsxs("mesh", { ref: meshRef, rotation: flat ? [-Math.PI / 2, 0, 0] : [0, 0, 0], children: [_jsx("planeGeometry", { args: [size, size, segs, segs] }), _jsx("chladniGridMaterial", { ref: matRef, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide, u_cellSize: cellSize, u_lineWidth: lineWidth, u_sectionSize: sectionSize, u_sectionWidth: sectionWidth, u_lineMode: lineMode, u_cellMode: cellMode, u_animSpeed: animSpeed, u_animScale: animScale, u_animIntensity: animIntensity, u_fadeDistance: fade, u_fadeStrength: fadeStrength, u_displace: displace, u_modeN: modeN, u_modeM: modeM, u_morph: morph, u_grain: grain, u_lineColor: colors.line, u_sectionColor: colors.section, u_cellColor: colors.cell, u_glowColor: colors.glow, u_bgColor: colors.bg, u_bgOpacity: bgOpacity }, ChladniGridMaterial.key)] }) }));
66
+ // One push point for every uniform the config owns: the committed config when the
67
+ // material mounts or the config commits, the merged one while anything overrides it.
68
+ const baseRef = useRef(base);
69
+ baseRef.current = base;
70
+ const setMaterial = useCallback((m) => {
71
+ matRef.current = m;
72
+ if (m)
73
+ applyGridConfig(m, baseRef.current, VARIANT, DERIVE);
74
+ }, []);
75
+ useLayoutEffect(() => { applyGridConfig(matRef.current, base, VARIANT, DERIVE); }, [base]);
76
+ const push = useCallback((merged) => applyGridConfig(matRef.current, merged, VARIANT, DERIVE), []);
77
+ useConfigDriver({ rootRef, id, family: 'grids', base, structural: STRUCTURAL, allowed: ANIMATABLE, keyframes, mouseMove, push });
78
+ return (_jsx("group", { ref: rootRef, ...groupProps, children: _jsxs("mesh", { ref: meshRef, rotation: flat ? [-Math.PI / 2, 0, 0] : [0, 0, 0], children: [_jsx("planeGeometry", { args: [size, size, segs, segs] }), _jsx("chladniGridMaterial", { ref: setMaterial, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide }, ChladniGridMaterial.key)] }) }));
61
79
  }
62
80
  export default ChladniGrid;