@3driseai/3drise-viewer 0.1.26 → 0.1.28

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 (476) 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/ApollonianGrid.d.ts +25 -0
  25. package/dist/components/ApollonianGrid.d.ts.map +1 -0
  26. package/dist/components/ApollonianGrid.js +80 -0
  27. package/dist/components/Bubbles.d.ts +7 -1
  28. package/dist/components/Bubbles.d.ts.map +1 -1
  29. package/dist/components/Bubbles.js +42 -22
  30. package/dist/components/ChladniGrid.d.ts +8 -4
  31. package/dist/components/ChladniGrid.d.ts.map +1 -1
  32. package/dist/components/ChladniGrid.js +31 -13
  33. package/dist/components/CircuitGrid.d.ts +8 -11
  34. package/dist/components/CircuitGrid.d.ts.map +1 -1
  35. package/dist/components/CircuitGrid.js +31 -13
  36. package/dist/components/CloudsGenerator.d.ts +1 -1
  37. package/dist/components/CloudsGenerator.js +1 -1
  38. package/dist/components/ConformalGrid.d.ts +25 -0
  39. package/dist/components/ConformalGrid.d.ts.map +1 -0
  40. package/dist/components/ConformalGrid.js +97 -0
  41. package/dist/components/ContourGrid.d.ts +8 -14
  42. package/dist/components/ContourGrid.d.ts.map +1 -1
  43. package/dist/components/ContourGrid.js +31 -13
  44. package/dist/components/EffectsGenerator.d.ts +7 -1
  45. package/dist/components/EffectsGenerator.d.ts.map +1 -1
  46. package/dist/components/EffectsGenerator.js +39 -38
  47. package/dist/components/EnvironmentManager.d.ts +4 -4
  48. package/dist/components/EnvironmentManager.d.ts.map +1 -1
  49. package/dist/components/FlowNetGrid.d.ts +8 -4
  50. package/dist/components/FlowNetGrid.d.ts.map +1 -1
  51. package/dist/components/FlowNetGrid.js +31 -13
  52. package/dist/components/FractalGrid.d.ts +8 -12
  53. package/dist/components/FractalGrid.d.ts.map +1 -1
  54. package/dist/components/FractalGrid.js +31 -13
  55. package/dist/components/GirihGrid.d.ts +8 -1
  56. package/dist/components/GirihGrid.d.ts.map +1 -1
  57. package/dist/components/GirihGrid.js +31 -13
  58. package/dist/components/Glyphs.d.ts +7 -1
  59. package/dist/components/Glyphs.d.ts.map +1 -1
  60. package/dist/components/Glyphs.js +40 -34
  61. package/dist/components/GravWaveGrid.d.ts +8 -1
  62. package/dist/components/GravWaveGrid.d.ts.map +1 -1
  63. package/dist/components/GravWaveGrid.js +31 -13
  64. package/dist/components/GridsGenerator.d.ts +9 -3
  65. package/dist/components/GridsGenerator.d.ts.map +1 -1
  66. package/dist/components/GridsGenerator.js +41 -18
  67. package/dist/components/HexGrid.d.ts +8 -10
  68. package/dist/components/HexGrid.d.ts.map +1 -1
  69. package/dist/components/HexGrid.js +31 -13
  70. package/dist/components/HilbertGrid.d.ts +25 -0
  71. package/dist/components/HilbertGrid.d.ts.map +1 -0
  72. package/dist/components/HilbertGrid.js +93 -0
  73. package/dist/components/HyperbolicGrid.d.ts +8 -4
  74. package/dist/components/HyperbolicGrid.d.ts.map +1 -1
  75. package/dist/components/HyperbolicGrid.js +31 -13
  76. package/dist/components/LandscapeBuilder.d.ts +1 -1
  77. package/dist/components/LandscapeBuilder.d.ts.map +1 -1
  78. package/dist/components/LandscapeBuilder.js +1 -1
  79. package/dist/components/LandscapeObject.d.ts +1 -1
  80. package/dist/components/LandscapeObject.d.ts.map +1 -1
  81. package/dist/components/LandscapeObject.js +1 -1
  82. package/dist/components/LensingGrid.d.ts +25 -0
  83. package/dist/components/LensingGrid.d.ts.map +1 -0
  84. package/dist/components/LensingGrid.js +81 -0
  85. package/dist/components/MoireGrid.d.ts +8 -12
  86. package/dist/components/MoireGrid.d.ts.map +1 -1
  87. package/dist/components/MoireGrid.js +31 -13
  88. package/dist/components/ObjectNode.d.ts.map +1 -1
  89. package/dist/components/ObjectNode.js +2 -2
  90. package/dist/components/ObjectsRenderer.d.ts.map +1 -1
  91. package/dist/components/ObjectsRenderer.js +37 -3
  92. package/dist/components/OceanBuilder.d.ts +1 -1
  93. package/dist/components/OceanBuilder.js +1 -1
  94. package/dist/components/ParastichyGrid.d.ts +25 -0
  95. package/dist/components/ParastichyGrid.d.ts.map +1 -0
  96. package/dist/components/ParastichyGrid.js +82 -0
  97. package/dist/components/ParticlesGenerator.d.ts.map +1 -1
  98. package/dist/components/ParticlesGenerator.js +6 -0
  99. package/dist/components/PhyllotaxisGrid.d.ts +25 -0
  100. package/dist/components/PhyllotaxisGrid.d.ts.map +1 -0
  101. package/dist/components/PhyllotaxisGrid.js +95 -0
  102. package/dist/components/QuasiGrid.d.ts +8 -11
  103. package/dist/components/QuasiGrid.d.ts.map +1 -1
  104. package/dist/components/QuasiGrid.js +31 -13
  105. package/dist/components/RadarGrid.d.ts +8 -13
  106. package/dist/components/RadarGrid.d.ts.map +1 -1
  107. package/dist/components/RadarGrid.js +31 -13
  108. package/dist/components/ReactionDiffusionGrid.d.ts +8 -1
  109. package/dist/components/ReactionDiffusionGrid.d.ts.map +1 -1
  110. package/dist/components/ReactionDiffusionGrid.js +33 -139
  111. package/dist/components/SceneBuilder.js +1 -1
  112. package/dist/components/SkySystem.d.ts +1 -1
  113. package/dist/components/SparklesBurst.d.ts +7 -1
  114. package/dist/components/SparklesBurst.d.ts.map +1 -1
  115. package/dist/components/SparklesBurst.js +31 -28
  116. package/dist/components/TerrainBuilder.d.ts +1 -1
  117. package/dist/components/TerrainBuilder.d.ts.map +1 -1
  118. package/dist/components/TerrainBuilder.js +1 -1
  119. package/dist/components/TruchetGrid.d.ts +25 -0
  120. package/dist/components/TruchetGrid.d.ts.map +1 -0
  121. package/dist/components/TruchetGrid.js +82 -0
  122. package/dist/components/VoronoiGrid.d.ts +8 -10
  123. package/dist/components/VoronoiGrid.d.ts.map +1 -1
  124. package/dist/components/VoronoiGrid.js +31 -13
  125. package/dist/components/WallpaperGrid.d.ts +8 -1
  126. package/dist/components/WallpaperGrid.d.ts.map +1 -1
  127. package/dist/components/WallpaperGrid.js +33 -210
  128. package/dist/components/effects/AuraEffect.d.ts +8 -3
  129. package/dist/components/effects/AuraEffect.d.ts.map +1 -1
  130. package/dist/components/effects/AuraEffect.js +49 -24
  131. package/dist/components/effects/AuroraEffect.d.ts +8 -3
  132. package/dist/components/effects/AuroraEffect.d.ts.map +1 -1
  133. package/dist/components/effects/AuroraEffect.js +45 -25
  134. package/dist/components/effects/BlackHoleEffect.d.ts +8 -3
  135. package/dist/components/effects/BlackHoleEffect.d.ts.map +1 -1
  136. package/dist/components/effects/BlackHoleEffect.js +42 -21
  137. package/dist/components/effects/ConstellationEffect.d.ts +8 -3
  138. package/dist/components/effects/ConstellationEffect.d.ts.map +1 -1
  139. package/dist/components/effects/ConstellationEffect.js +49 -23
  140. package/dist/components/effects/DandelionSeedsEffect.d.ts +7 -2
  141. package/dist/components/effects/DandelionSeedsEffect.d.ts.map +1 -1
  142. package/dist/components/effects/DandelionSeedsEffect.js +19 -9
  143. package/dist/components/effects/DataStreamEffect.d.ts +8 -3
  144. package/dist/components/effects/DataStreamEffect.d.ts.map +1 -1
  145. package/dist/components/effects/DataStreamEffect.js +54 -26
  146. package/dist/components/effects/DnaHelixEffect.d.ts +8 -3
  147. package/dist/components/effects/DnaHelixEffect.d.ts.map +1 -1
  148. package/dist/components/effects/DnaHelixEffect.js +62 -30
  149. package/dist/components/effects/FallingLeavesEffect.d.ts +7 -2
  150. package/dist/components/effects/FallingLeavesEffect.d.ts.map +1 -1
  151. package/dist/components/effects/FallingLeavesEffect.js +19 -9
  152. package/dist/components/effects/FieldLinesEffect.d.ts +8 -3
  153. package/dist/components/effects/FieldLinesEffect.d.ts.map +1 -1
  154. package/dist/components/effects/FieldLinesEffect.js +30 -20
  155. package/dist/components/effects/Fire.d.ts +8 -3
  156. package/dist/components/effects/Fire.d.ts.map +1 -1
  157. package/dist/components/effects/Fire.js +47 -10
  158. package/dist/components/effects/FireflySwarmEffect.d.ts +7 -2
  159. package/dist/components/effects/FireflySwarmEffect.d.ts.map +1 -1
  160. package/dist/components/effects/FireflySwarmEffect.js +19 -9
  161. package/dist/components/effects/Flares.d.ts +10 -3
  162. package/dist/components/effects/Flares.d.ts.map +1 -1
  163. package/dist/components/effects/Flares.js +53 -56
  164. package/dist/components/effects/ForcefieldEffect.d.ts +8 -3
  165. package/dist/components/effects/ForcefieldEffect.d.ts.map +1 -1
  166. package/dist/components/effects/ForcefieldEffect.js +52 -33
  167. package/dist/components/effects/GalaxyEffect.d.ts +7 -2
  168. package/dist/components/effects/GalaxyEffect.d.ts.map +1 -1
  169. package/dist/components/effects/GalaxyEffect.js +19 -9
  170. package/dist/components/effects/HarmonicShellEffect.d.ts +8 -3
  171. package/dist/components/effects/HarmonicShellEffect.d.ts.map +1 -1
  172. package/dist/components/effects/HarmonicShellEffect.js +30 -22
  173. package/dist/components/effects/HologramEffect.d.ts +8 -3
  174. package/dist/components/effects/HologramEffect.d.ts.map +1 -1
  175. package/dist/components/effects/HologramEffect.js +52 -23
  176. package/dist/components/effects/IceCrystalsEffect.d.ts +8 -3
  177. package/dist/components/effects/IceCrystalsEffect.d.ts.map +1 -1
  178. package/dist/components/effects/IceCrystalsEffect.js +36 -21
  179. package/dist/components/effects/IceHaloEffect.d.ts +7 -2
  180. package/dist/components/effects/IceHaloEffect.d.ts.map +1 -1
  181. package/dist/components/effects/IceHaloEffect.js +19 -9
  182. package/dist/components/effects/LichtenbergEffect.d.ts +7 -2
  183. package/dist/components/effects/LichtenbergEffect.d.ts.map +1 -1
  184. package/dist/components/effects/LichtenbergEffect.js +19 -9
  185. package/dist/components/effects/LightningEffect.d.ts +8 -3
  186. package/dist/components/effects/LightningEffect.d.ts.map +1 -1
  187. package/dist/components/effects/LightningEffect.js +54 -32
  188. package/dist/components/effects/MoleculesEffect.d.ts +8 -3
  189. package/dist/components/effects/MoleculesEffect.d.ts.map +1 -1
  190. package/dist/components/effects/MoleculesEffect.js +31 -21
  191. package/dist/components/effects/MurmurationEffect.d.ts +7 -2
  192. package/dist/components/effects/MurmurationEffect.d.ts.map +1 -1
  193. package/dist/components/effects/MurmurationEffect.js +19 -9
  194. package/dist/components/effects/NeuralNetworkEffect.d.ts +8 -3
  195. package/dist/components/effects/NeuralNetworkEffect.d.ts.map +1 -1
  196. package/dist/components/effects/NeuralNetworkEffect.js +66 -33
  197. package/dist/components/effects/OrbEffect.d.ts +8 -3
  198. package/dist/components/effects/OrbEffect.d.ts.map +1 -1
  199. package/dist/components/effects/OrbEffect.js +89 -42
  200. package/dist/components/effects/PlanetaryRingsEffect.d.ts +7 -2
  201. package/dist/components/effects/PlanetaryRingsEffect.d.ts.map +1 -1
  202. package/dist/components/effects/PlanetaryRingsEffect.js +19 -9
  203. package/dist/components/effects/PortalEffect.d.ts +8 -3
  204. package/dist/components/effects/PortalEffect.d.ts.map +1 -1
  205. package/dist/components/effects/PortalEffect.js +41 -25
  206. package/dist/components/effects/ShockwaveEffect.d.ts +7 -2
  207. package/dist/components/effects/ShockwaveEffect.d.ts.map +1 -1
  208. package/dist/components/effects/ShockwaveEffect.js +19 -9
  209. package/dist/components/effects/SmokePlumeEffect.d.ts +8 -3
  210. package/dist/components/effects/SmokePlumeEffect.d.ts.map +1 -1
  211. package/dist/components/effects/SmokePlumeEffect.js +30 -20
  212. package/dist/components/effects/SmokeRibbon.d.ts +8 -2
  213. package/dist/components/effects/SmokeRibbon.d.ts.map +1 -1
  214. package/dist/components/effects/SmokeRibbon.js +34 -24
  215. package/dist/components/effects/SmokeRingEffect.d.ts +8 -3
  216. package/dist/components/effects/SmokeRingEffect.d.ts.map +1 -1
  217. package/dist/components/effects/SmokeRingEffect.js +33 -21
  218. package/dist/components/effects/StrangeAttractorEffect.d.ts +8 -3
  219. package/dist/components/effects/StrangeAttractorEffect.d.ts.map +1 -1
  220. package/dist/components/effects/StrangeAttractorEffect.js +30 -20
  221. package/dist/components/effects/VolumetricFogEffect.d.ts +8 -3
  222. package/dist/components/effects/VolumetricFogEffect.d.ts.map +1 -1
  223. package/dist/components/effects/VolumetricFogEffect.js +38 -20
  224. package/dist/components/effects/WaterCausticsEffect.d.ts +7 -2
  225. package/dist/components/effects/WaterCausticsEffect.d.ts.map +1 -1
  226. package/dist/components/effects/WaterCausticsEffect.js +19 -9
  227. package/dist/components/effects/index.d.ts +0 -1
  228. package/dist/components/effects/index.d.ts.map +1 -1
  229. package/dist/components/effects/index.js +0 -1
  230. package/dist/components/index.d.ts +14 -1
  231. package/dist/components/index.d.ts.map +1 -1
  232. package/dist/components/index.js +7 -1
  233. package/dist/components/landscape/LandscapeMesh.js +1 -1
  234. package/dist/components/landscape/types.d.ts +1 -1
  235. package/dist/components/landscape/types.d.ts.map +1 -1
  236. package/dist/components/particles/MagneticBottleParticles.d.ts +17 -0
  237. package/dist/components/particles/MagneticBottleParticles.d.ts.map +1 -0
  238. package/dist/components/particles/MagneticBottleParticles.js +618 -0
  239. package/dist/components/particles/ShapeBurstParticles.d.ts +17 -0
  240. package/dist/components/particles/ShapeBurstParticles.d.ts.map +1 -0
  241. package/dist/components/particles/ShapeBurstParticles.js +588 -0
  242. package/dist/components/particles/ShapeFlowParticles.d.ts +17 -0
  243. package/dist/components/particles/ShapeFlowParticles.d.ts.map +1 -0
  244. package/dist/components/particles/ShapeFlowParticles.js +755 -0
  245. package/dist/components/particles/index.d.ts +6 -0
  246. package/dist/components/particles/index.d.ts.map +1 -1
  247. package/dist/components/particles/index.js +3 -0
  248. package/dist/components/terrain/types.d.ts +1 -1
  249. package/dist/components/terrain/types.d.ts.map +1 -1
  250. package/dist/components/volumetricClouds/VolumetricCloudsPass.d.ts +1 -1
  251. package/dist/components/volumetricClouds/VolumetricCloudsPass.d.ts.map +1 -1
  252. package/dist/components/volumetricClouds/types.d.ts +1 -1
  253. package/dist/components/volumetricClouds/types.d.ts.map +1 -1
  254. package/dist/components/water/types.d.ts +1 -1
  255. package/dist/components/water/types.d.ts.map +1 -1
  256. package/dist/hooks/index.d.ts +2 -0
  257. package/dist/hooks/index.d.ts.map +1 -1
  258. package/dist/hooks/index.js +1 -0
  259. package/dist/hooks/useConfigDriver.d.ts +22 -0
  260. package/dist/hooks/useConfigDriver.d.ts.map +1 -0
  261. package/dist/hooks/useConfigDriver.js +43 -0
  262. package/dist/hooks/useConfigLive.d.ts +1 -1
  263. package/dist/hooks/useConfigLive.d.ts.map +1 -1
  264. package/dist/hooks/useLandscapeMaps.d.ts +1 -1
  265. package/dist/hooks/useLandscapeMaps.d.ts.map +1 -1
  266. package/dist/hooks/useOceanMaterial.d.ts +1 -1
  267. package/dist/hooks/useThunder.d.ts +1 -1
  268. package/dist/index.d.ts +1 -2
  269. package/dist/index.d.ts.map +1 -1
  270. package/dist/index.js +1 -2
  271. package/dist/interactions/index.d.ts +2 -1
  272. package/dist/interactions/index.d.ts.map +1 -1
  273. package/dist/interactions/index.js +1 -1
  274. package/dist/interactions/runner.d.ts +18 -3
  275. package/dist/interactions/runner.d.ts.map +1 -1
  276. package/dist/interactions/runner.js +25 -2
  277. package/dist/operations/catalogue/curlSmoke.d.ts +3 -0
  278. package/dist/operations/catalogue/curlSmoke.d.ts.map +1 -0
  279. package/dist/operations/catalogue/curlSmoke.js +178 -0
  280. package/dist/operations/catalogue/displayImage.d.ts.map +1 -1
  281. package/dist/operations/catalogue/displayImage.js +1 -0
  282. package/dist/operations/catalogue/dissolve.d.ts +3 -0
  283. package/dist/operations/catalogue/dissolve.d.ts.map +1 -0
  284. package/dist/operations/catalogue/dissolve.js +57 -0
  285. package/dist/operations/catalogue/emberAsh.d.ts +3 -0
  286. package/dist/operations/catalogue/emberAsh.d.ts.map +1 -0
  287. package/dist/operations/catalogue/emberAsh.js +171 -0
  288. package/dist/operations/catalogue/fade.d.ts.map +1 -1
  289. package/dist/operations/catalogue/fade.js +1 -0
  290. package/dist/operations/catalogue/flip.d.ts +3 -0
  291. package/dist/operations/catalogue/flip.d.ts.map +1 -0
  292. package/dist/operations/catalogue/flip.js +69 -0
  293. package/dist/operations/catalogue/flock.d.ts +3 -0
  294. package/dist/operations/catalogue/flock.d.ts.map +1 -0
  295. package/dist/operations/catalogue/flock.js +163 -0
  296. package/dist/operations/catalogue/focus.d.ts.map +1 -1
  297. package/dist/operations/catalogue/focus.js +1 -0
  298. package/dist/operations/catalogue/frame.d.ts +3 -0
  299. package/dist/operations/catalogue/frame.d.ts.map +1 -0
  300. package/dist/operations/catalogue/frame.js +44 -0
  301. package/dist/operations/catalogue/frost.d.ts +3 -0
  302. package/dist/operations/catalogue/frost.d.ts.map +1 -0
  303. package/dist/operations/catalogue/frost.js +111 -0
  304. package/dist/operations/catalogue/fxInstances.d.ts +21 -0
  305. package/dist/operations/catalogue/fxInstances.d.ts.map +1 -0
  306. package/dist/operations/catalogue/fxInstances.js +47 -0
  307. package/dist/operations/catalogue/fxPoints.d.ts +22 -0
  308. package/dist/operations/catalogue/fxPoints.d.ts.map +1 -0
  309. package/dist/operations/catalogue/fxPoints.js +70 -0
  310. package/dist/operations/catalogue/glow.d.ts.map +1 -1
  311. package/dist/operations/catalogue/glow.js +2 -1
  312. package/dist/operations/catalogue/heatCracks.d.ts +3 -0
  313. package/dist/operations/catalogue/heatCracks.d.ts.map +1 -0
  314. package/dist/operations/catalogue/heatCracks.js +134 -0
  315. package/dist/operations/catalogue/hologram.d.ts +3 -0
  316. package/dist/operations/catalogue/hologram.d.ts.map +1 -0
  317. package/dist/operations/catalogue/hologram.js +118 -0
  318. package/dist/operations/catalogue/inkBloom.d.ts +3 -0
  319. package/dist/operations/catalogue/inkBloom.d.ts.map +1 -0
  320. package/dist/operations/catalogue/inkBloom.js +156 -0
  321. package/dist/operations/catalogue/ivy.d.ts +13 -0
  322. package/dist/operations/catalogue/ivy.d.ts.map +1 -0
  323. package/dist/operations/catalogue/ivy.js +469 -0
  324. package/dist/operations/catalogue/jelly.d.ts +3 -0
  325. package/dist/operations/catalogue/jelly.d.ts.map +1 -0
  326. package/dist/operations/catalogue/jelly.js +50 -0
  327. package/dist/operations/catalogue/kintsugi.d.ts +3 -0
  328. package/dist/operations/catalogue/kintsugi.d.ts.map +1 -0
  329. package/dist/operations/catalogue/kintsugi.js +173 -0
  330. package/dist/operations/catalogue/lidarScan.d.ts +3 -0
  331. package/dist/operations/catalogue/lidarScan.d.ts.map +1 -0
  332. package/dist/operations/catalogue/lidarScan.js +240 -0
  333. package/dist/operations/catalogue/liquidMetal.d.ts +3 -0
  334. package/dist/operations/catalogue/liquidMetal.d.ts.map +1 -0
  335. package/dist/operations/catalogue/liquidMetal.js +122 -0
  336. package/dist/operations/catalogue/metalize.d.ts +3 -0
  337. package/dist/operations/catalogue/metalize.d.ts.map +1 -0
  338. package/dist/operations/catalogue/metalize.js +135 -0
  339. package/dist/operations/catalogue/moveToFront.d.ts.map +1 -1
  340. package/dist/operations/catalogue/moveToFront.js +1 -0
  341. package/dist/operations/catalogue/orbit.d.ts +3 -0
  342. package/dist/operations/catalogue/orbit.d.ts.map +1 -0
  343. package/dist/operations/catalogue/orbit.js +29 -0
  344. package/dist/operations/catalogue/particleSwarm.d.ts +3 -0
  345. package/dist/operations/catalogue/particleSwarm.d.ts.map +1 -0
  346. package/dist/operations/catalogue/particleSwarm.js +138 -0
  347. package/dist/operations/catalogue/petalPeel.d.ts +3 -0
  348. package/dist/operations/catalogue/petalPeel.d.ts.map +1 -0
  349. package/dist/operations/catalogue/petalPeel.js +137 -0
  350. package/dist/operations/catalogue/petrify.d.ts +3 -0
  351. package/dist/operations/catalogue/petrify.d.ts.map +1 -0
  352. package/dist/operations/catalogue/petrify.js +94 -0
  353. package/dist/operations/catalogue/portal.d.ts +3 -0
  354. package/dist/operations/catalogue/portal.d.ts.map +1 -0
  355. package/dist/operations/catalogue/portal.js +224 -0
  356. package/dist/operations/catalogue/print3d.d.ts +3 -0
  357. package/dist/operations/catalogue/print3d.d.ts.map +1 -0
  358. package/dist/operations/catalogue/print3d.js +275 -0
  359. package/dist/operations/catalogue/rainBeads.d.ts +3 -0
  360. package/dist/operations/catalogue/rainBeads.d.ts.map +1 -0
  361. package/dist/operations/catalogue/rainBeads.js +223 -0
  362. package/dist/operations/catalogue/restPose.d.ts +21 -0
  363. package/dist/operations/catalogue/restPose.d.ts.map +1 -0
  364. package/dist/operations/catalogue/restPose.js +55 -0
  365. package/dist/operations/catalogue/rimLight.d.ts +3 -0
  366. package/dist/operations/catalogue/rimLight.d.ts.map +1 -0
  367. package/dist/operations/catalogue/rimLight.js +72 -0
  368. package/dist/operations/catalogue/sandErosion.d.ts +3 -0
  369. package/dist/operations/catalogue/sandErosion.d.ts.map +1 -0
  370. package/dist/operations/catalogue/sandErosion.js +167 -0
  371. package/dist/operations/catalogue/shaderLayers.d.ts +74 -0
  372. package/dist/operations/catalogue/shaderLayers.d.ts.map +1 -0
  373. package/dist/operations/catalogue/shaderLayers.js +322 -0
  374. package/dist/operations/catalogue/shatter.d.ts +3 -0
  375. package/dist/operations/catalogue/shatter.d.ts.map +1 -0
  376. package/dist/operations/catalogue/shatter.js +267 -0
  377. package/dist/operations/catalogue/silkDrape.d.ts +3 -0
  378. package/dist/operations/catalogue/silkDrape.d.ts.map +1 -0
  379. package/dist/operations/catalogue/silkDrape.js +340 -0
  380. package/dist/operations/catalogue/spin.d.ts +3 -0
  381. package/dist/operations/catalogue/spin.d.ts.map +1 -0
  382. package/dist/operations/catalogue/spin.js +42 -0
  383. package/dist/operations/catalogue/surfaceSample.d.ts +17 -0
  384. package/dist/operations/catalogue/surfaceSample.d.ts.map +1 -0
  385. package/dist/operations/catalogue/surfaceSample.js +187 -0
  386. package/dist/operations/catalogue/swirl.d.ts +3 -0
  387. package/dist/operations/catalogue/swirl.d.ts.map +1 -0
  388. package/dist/operations/catalogue/swirl.js +69 -0
  389. package/dist/operations/catalogue/teleport.d.ts +3 -0
  390. package/dist/operations/catalogue/teleport.d.ts.map +1 -0
  391. package/dist/operations/catalogue/teleport.js +213 -0
  392. package/dist/operations/catalogue/transitionField.d.ts +124 -0
  393. package/dist/operations/catalogue/transitionField.d.ts.map +1 -0
  394. package/dist/operations/catalogue/transitionField.js +278 -0
  395. package/dist/operations/catalogue/unweave.d.ts +3 -0
  396. package/dist/operations/catalogue/unweave.d.ts.map +1 -0
  397. package/dist/operations/catalogue/unweave.js +233 -0
  398. package/dist/operations/catalogue/visibility.d.ts.map +1 -1
  399. package/dist/operations/catalogue/visibility.js +1 -0
  400. package/dist/operations/catalogue/voxelize.d.ts +3 -0
  401. package/dist/operations/catalogue/voxelize.d.ts.map +1 -0
  402. package/dist/operations/catalogue/voxelize.js +148 -0
  403. package/dist/operations/catalogue/warmup.d.ts +22 -0
  404. package/dist/operations/catalogue/warmup.d.ts.map +1 -0
  405. package/dist/operations/catalogue/warmup.js +106 -0
  406. package/dist/operations/catalogue/zoom.d.ts.map +1 -1
  407. package/dist/operations/catalogue/zoom.js +1 -0
  408. package/dist/operations/index.d.ts +4 -2
  409. package/dist/operations/index.d.ts.map +1 -1
  410. package/dist/operations/index.js +4 -2
  411. package/dist/operations/objectEffects.d.ts +46 -0
  412. package/dist/operations/objectEffects.d.ts.map +1 -0
  413. package/dist/operations/objectEffects.js +136 -0
  414. package/dist/operations/registry.d.ts +7 -2
  415. package/dist/operations/registry.d.ts.map +1 -1
  416. package/dist/operations/registry.js +45 -3
  417. package/dist/operations/runtime.d.ts +40 -2
  418. package/dist/operations/runtime.d.ts.map +1 -1
  419. package/dist/operations/runtime.js +164 -8
  420. package/dist/operations/types.d.ts +29 -3
  421. package/dist/operations/types.d.ts.map +1 -1
  422. package/dist/operations/types.js +6 -0
  423. package/dist/operations/useObjectEffectLayers.d.ts +4 -0
  424. package/dist/operations/useObjectEffectLayers.d.ts.map +1 -0
  425. package/dist/operations/useObjectEffectLayers.js +42 -0
  426. package/dist/operations/useOperationsRuntime.d.ts.map +1 -1
  427. package/dist/operations/useOperationsRuntime.js +42 -4
  428. package/dist/presets/landscapePresets.d.ts +1 -1
  429. package/dist/presets/landscapePresets.d.ts.map +1 -1
  430. package/dist/presets/landscapePresets.js +1 -1
  431. package/dist/presets/landscapeTypes.d.ts +1 -1
  432. package/dist/presets/landscapeTypes.d.ts.map +1 -1
  433. package/dist/presets/landscapeTypes.js +1 -1
  434. package/dist/presets/oceanSurfacePresets.d.ts +1 -1
  435. package/dist/presets/terrainPresets.d.ts +1 -1
  436. package/dist/presets/terrainPresets.d.ts.map +1 -1
  437. package/dist/presets/volumetricCloudPresets.d.ts +1 -1
  438. package/dist/types/cloudConfigs.d.ts +2 -309
  439. package/dist/types/cloudConfigs.d.ts.map +1 -1
  440. package/dist/types/cloudConfigs.js +2 -339
  441. package/dist/types/gridConfigs.d.ts +103 -0
  442. package/dist/types/gridConfigs.d.ts.map +1 -1
  443. package/dist/types/index.d.ts +9 -9
  444. package/dist/types/index.d.ts.map +1 -1
  445. package/dist/types/index.js +4 -4
  446. package/dist/types/landscapeConfigs.d.ts +2 -217
  447. package/dist/types/landscapeConfigs.d.ts.map +1 -1
  448. package/dist/types/landscapeConfigs.js +2 -256
  449. package/dist/types/oceanConfigs.d.ts +2 -289
  450. package/dist/types/oceanConfigs.d.ts.map +1 -1
  451. package/dist/types/oceanConfigs.js +2 -380
  452. package/dist/types/terrainConfigs.d.ts +2 -250
  453. package/dist/types/terrainConfigs.d.ts.map +1 -1
  454. package/dist/types/terrainConfigs.js +2 -292
  455. package/dist/utils/cloudUniforms.d.ts +1 -1
  456. package/dist/utils/configAnimations.d.ts +6 -0
  457. package/dist/utils/configAnimations.d.ts.map +1 -1
  458. package/dist/utils/configAnimations.js +14 -0
  459. package/dist/utils/gridConfig.d.ts +19 -0
  460. package/dist/utils/gridConfig.d.ts.map +1 -0
  461. package/dist/utils/gridConfig.js +52 -0
  462. package/dist/utils/handleCloudsAnimations.d.ts +1 -1
  463. package/dist/utils/handleCloudsAnimations.js +1 -1
  464. package/dist/utils/hasHoverAnimation.d.ts.map +1 -1
  465. package/dist/utils/hasHoverAnimation.js +0 -2
  466. package/dist/utils/landscapeUniforms.d.ts +1 -1
  467. package/dist/utils/landscapeUniforms.d.ts.map +1 -1
  468. package/dist/utils/oceanUniforms.d.ts +1 -1
  469. package/dist/utils/particleShape.d.ts +33 -0
  470. package/dist/utils/particleShape.d.ts.map +1 -0
  471. package/dist/utils/particleShape.js +207 -0
  472. package/dist/utils/particleTrails.d.ts.map +1 -1
  473. package/dist/utils/particleTrails.js +29 -14
  474. package/dist/utils/terrainUniforms.d.ts +1 -1
  475. package/dist/utils/terrainUniforms.d.ts.map +1 -1
  476. package/package.json +2 -2
@@ -1,8 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box3, Sphere, Color, Vector3, Matrix4, PlaneGeometry, InstancedBufferGeometry, InstancedBufferAttribute, } from 'three';
3
- import { useEffect, useLayoutEffect, useMemo, useRef } from 'react';
2
+ import { Box3, Sphere, Vector3, Matrix4, PlaneGeometry, InstancedBufferGeometry, InstancedBufferAttribute, } from 'three';
3
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
4
4
  import { useFrame } from '@react-three/fiber';
5
+ import { DEFAULT_GENERATIVE_EFFECTS, EFFECTS_ANIMATABLE } from "@3driseai/3drise-core";
5
6
  import { useObjectReady } from '../../hooks/useObjectReady.js';
7
+ import { useConfigDriver } from '../../hooks/useConfigDriver.js';
8
+ import { withConfigDefaults } from '../../utils/configAnimations.js';
6
9
  // Add to FireConfig in 3drize-core:
7
10
  // mode?: 'crown' | 'wrap' // wrap scatters tongues over the host surface
8
11
  // coverage?: number // 0..1 — how far down the host burns (wrap)
@@ -85,14 +88,30 @@ function sampleSurface(host, count) {
85
88
  }
86
89
  return points;
87
90
  }
88
- const Fire = ({ hostRef, config, animations, onObjectReady, onObjectDispose }) => {
91
+ /** Knobs that re-fit or re-scatter the flames, or mount the light: commit only, never live. */
92
+ const STRUCTURAL = ['mode', 'coverage', 'tongues', 'radius', 'height', 'radiusScale', 'heightScale', 'light'];
93
+ /** Knobs a keyframe or pointer binding may drive per frame — exactly what the push point applies. */
94
+ const ANIMATABLE = new Set(EFFECTS_ANIMATABLE.fire.map((p) => p.value));
95
+ /** The single push point: every config knob that lives on the material reaches it here. */
96
+ function applyConfig(m, c) {
97
+ m.u_intensity = c.intensity;
98
+ // speed is integrated into u_time on the CPU (see useFrame), so the shader's
99
+ // u_time * u_speed never jumps when the speed changes
100
+ m.u_speed = 1;
101
+ m.u_turbulence = c.turbulence;
102
+ m.u_sway = c.sway;
103
+ m.u_tint.set(c.tint);
104
+ }
105
+ const Fire = ({ hostRef, config, id, keyframes, mouseMove, onObjectReady, onObjectDispose }) => {
106
+ const cfg = useMemo(() => withConfigDefaults(DEFAULT_GENERATIVE_EFFECTS.fire, config), [config]);
89
107
  const group = useRef(null);
90
108
  useObjectReady(group, config, onObjectReady, onObjectDispose);
91
109
  const material = useRef(null);
92
110
  const lightRef = useRef(null);
93
- const { radius = 1, height = 2.5, radiusScale = 1, heightScale = 1, intensity = 1, speed = 1, turbulence = 1.5, sway = 1, tint = '#ffffff', light = true, mode = 'tongues', coverage = 0.85, tongues = 36, } = config;
94
- const tintColor = useMemo(() => new Color(tint), [tint]);
95
- // Shared instanced quad — per-tongue attributes are (re)filled on fit.
111
+ // the knobs read per frame (speed, intensity), from the last merged config
112
+ const cur = useRef(cfg);
113
+ const { radius, height, radiusScale, heightScale, light, mode, coverage, tongues } = cfg;
114
+ // Shared instanced quad - per-tongue attributes are (re)filled on fit.
96
115
  const geometry = useMemo(() => {
97
116
  const base = new PlaneGeometry(1, 1);
98
117
  const geo = new InstancedBufferGeometry();
@@ -192,11 +211,29 @@ const Fire = ({ hostRef, config, animations, onObjectReady, onObjectDispose }) =
192
211
  heightScale,
193
212
  geometry,
194
213
  ]);
195
- useFrame(({ clock }) => {
214
+ // One push point for the material: the committed config when the material mounts or
215
+ // the config commits, the merged one while anything overrides it.
216
+ const cfgRef = useRef(cfg);
217
+ cfgRef.current = cfg;
218
+ const setMaterial = useCallback((m) => {
219
+ material.current = m;
220
+ if (m)
221
+ applyConfig(m, cfgRef.current);
222
+ }, []);
223
+ const push = useCallback((merged) => {
224
+ cur.current = merged;
225
+ if (material.current)
226
+ applyConfig(material.current, merged);
227
+ }, []);
228
+ useLayoutEffect(() => { push(cfg); }, [push, cfg]);
229
+ useConfigDriver({ rootRef: group, id, family: 'effects', base: cfg, structural: STRUCTURAL, allowed: ANIMATABLE, keyframes, mouseMove, push });
230
+ useFrame(({ clock }, delta) => {
196
231
  const t = clock.getElapsedTime();
197
- material.current.u_time = t;
232
+ const { speed, intensity } = cur.current;
233
+ if (material.current)
234
+ material.current.u_time += Math.min(delta, 0.1) * speed;
198
235
  if (light && lightRef.current) {
199
- // Low-frequency flicker — calm, ember-like, no strobing.
236
+ // Low-frequency flicker - calm, ember-like, no strobing.
200
237
  const flicker = 0.82 +
201
238
  0.12 * Math.sin(t * 7.3) * Math.sin(t * 3.1) +
202
239
  0.06 * Math.sin(t * 13.7 + 1.4);
@@ -205,6 +242,6 @@ const Fire = ({ hostRef, config, animations, onObjectReady, onObjectDispose }) =
205
242
  material.current.u_height * (0.35 + 0.03 * Math.sin(t * 5.1));
206
243
  }
207
244
  });
208
- return (_jsxs("group", { ref: group, children: [_jsx("mesh", { geometry: geometry, frustumCulled: false, children: _jsx("fireMaterial", { ref: material, u_intensity: intensity, u_speed: speed, u_turbulence: turbulence, u_sway: sway, u_tint: tintColor }) }), light && (_jsx("pointLight", { ref: lightRef, color: "#ff7a26", distance: 0, decay: 2 }))] }));
245
+ return (_jsxs("group", { ref: group, children: [_jsx("mesh", { geometry: geometry, frustumCulled: false, children: _jsx("fireMaterial", { ref: setMaterial }) }), light && (_jsx("pointLight", { ref: lightRef, color: "#ff7a26", distance: 0, decay: 2 }))] }));
209
246
  };
210
247
  export default Fire;
@@ -1,10 +1,15 @@
1
1
  import React from 'react';
2
- import type { AnimationOptions, FireflySwarmConfig } from '@3driseai/3drise-core';
2
+ import type { AnimationOptions, FireflySwarmConfig, MouseMoveDomain } from '@3driseai/3drise-core';
3
3
  import type { ObjectReadyProps } from '../../types/objectReady';
4
4
  export interface FireflySwarmEffectProps extends ObjectReadyProps {
5
5
  boundingRadius: number;
6
6
  config: FireflySwarmConfig;
7
- animations?: AnimationOptions[];
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;
8
13
  /** True when the effect is attached to an object, so it can react to the host. */
9
14
  hasHost?: boolean;
10
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FireflySwarmEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/FireflySwarmEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsD,MAAM,OAAO,CAAC;AAG3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAwXD,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA+BzD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"FireflySwarmEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/FireflySwarmEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmE,MAAM,OAAO,CAAC;AAIxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAInG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,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;IAC5B,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AA8XD,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAqCzD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useLayoutEffect, useMemo, useRef } from 'react';
2
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
3
3
  import * as THREE from 'three';
4
4
  import { useFrame } from '@react-three/fiber';
5
- import { applyGenerativeAnimations } from '../../utils/handleGenerativeEffectsAnimations.js';
5
+ import { EFFECTS_ANIMATABLE } from '@3driseai/3drise-core';
6
+ import { withConfigDefaults } from '../../utils/configAnimations.js';
6
7
  import { useObjectReady } from '../../hooks/useObjectReady.js';
8
+ import { useConfigDriver } from '../../hooks/useConfigDriver.js';
7
9
  /**
8
10
  * Kuramoto-coupled fireflies drifting on a divergence-free flow: random blinking slowly locks into sync, with ripples of light rolling through the swarm. Use for night, garden, forest, magical scenes.
9
11
  *
@@ -367,7 +369,7 @@ function build(u, c, bound, env) {
367
369
  dispose() { geo.dispose(); mat.dispose(); },
368
370
  };
369
371
  }
370
- /** Defaults for every knob, so an older saved config still renders. */
372
+ /** A value for every knob: the base the renderer draws and keyframes interpolate from. */
371
373
  const DEFAULTS = {
372
374
  intensity: 1,
373
375
  speed: 1,
@@ -381,27 +383,35 @@ const DEFAULTS = {
381
383
  glowSize: 1,
382
384
  flashColor: '#d4ff5c',
383
385
  };
384
- const FireflySwarmEffect = ({ boundingRadius, config, animations, hasHost = false, onObjectReady, onObjectDispose }) => {
386
+ /** Knobs that rebuild the object: they change on commit, never through the live path. */
387
+ const STRUCTURAL = ['count'];
388
+ /** Knobs a keyframe or pointer binding may drive per frame — exactly what the push point applies. */
389
+ const ANIMATABLE = new Set(EFFECTS_ANIMATABLE.fireflySwarm.map((p) => p.value));
390
+ const FireflySwarmEffect = ({ boundingRadius, config, id, keyframes, mouseMove, hasHost = false, onObjectReady, onObjectDispose }) => {
385
391
  const rootRef = useRef(null);
386
- const animCache = useRef({});
387
392
  useObjectReady(rootRef, config, onObjectReady, onObjectDispose);
388
393
  // a standalone effect gets boundingRadius 1
389
394
  const b = boundingRadius > 0 ? boundingRadius : 1;
390
- const cfg = useMemo(() => ({ ...DEFAULTS, ...config }), [config]);
395
+ const cfg = useMemo(() => withConfigDefaults(DEFAULTS, config), [config]);
391
396
  const env = useMemo(() => ({ hasHost: hasHost }), [hasHost]);
392
397
  // uniforms outlive the objects, so keyframe animations survive a rebuild
393
398
  const uniforms = useMemo(() => createUniforms(), []);
394
399
  // rebuilt only when the host size or a structural knob changes
395
- const instance = useMemo(() => build(uniforms, { ...DEFAULTS, ...config }, b, env), [uniforms, b, env, cfg.count]);
400
+ const instance = useMemo(() => build(uniforms, cfg, b, env), [uniforms, b, env, cfg.count]);
396
401
  useEffect(() => () => instance.dispose(), [instance]);
397
402
  useLayoutEffect(() => {
398
403
  applyConfig(uniforms, cfg, b, env);
399
404
  instance.apply(cfg);
400
405
  }, [instance, uniforms, cfg, b, env]);
406
+ // Committed config + live drag + keyframes + pointer, merged into the one push point
407
+ // (the uniforms, then the instance's own cheap per-config step).
408
+ const push = useCallback((merged) => {
409
+ applyConfig(uniforms, merged, b, env);
410
+ instance.apply(merged);
411
+ }, [instance, uniforms, b, env]);
412
+ useConfigDriver({ rootRef, id, family: 'effects', base: cfg, structural: STRUCTURAL, allowed: ANIMATABLE, keyframes, mouseMove, push });
401
413
  useFrame((state, delta) => {
402
414
  instance.update(Math.min(delta, 0.1), state.camera);
403
- if (animations?.length)
404
- applyGenerativeAnimations(instance.materials, animations, animCache.current, Date.now(), false);
405
415
  });
406
416
  return (_jsx("group", { ref: rootRef, children: _jsx("primitive", { object: instance.object }) }));
407
417
  };
@@ -1,5 +1,5 @@
1
1
  import { Vector3, Object3D } from "three";
2
- import { AnimationOptions, FlaresConfig } from "@3driseai/3drise-core";
2
+ import type { AnimationOptions, FlaresConfig, MouseMoveDomain } from "@3driseai/3drise-core";
3
3
  declare global {
4
4
  namespace JSX {
5
5
  interface IntrinsicElements {
@@ -15,11 +15,18 @@ export type FlaresProps = ObjectReadyProps & {
15
15
  * false -> plane mode: circular limb billboard (default).
16
16
  */
17
17
  hostRef?: Object3D | null;
18
+ /** Host bounding radius (1 for a standalone effect): the billboard is sized from it. */
19
+ boundingRadius?: number;
18
20
  /** Root the bursts at the center (shooting from source) instead of the limb. */
19
21
  config: FlaresConfig;
20
22
  /** Uniform overrides for FlareMaterial (u_frequency, u_reach, ...). */
21
23
  uniforms?: Record<string, number | Vector3 | number[]>;
22
- animations?: AnimationOptions[];
24
+ /** Scene object id of a standalone effect: the live-edit handle is found by it. */
25
+ id?: string;
26
+ /** Keyframes on this effect's config knobs (animations.effect.animations). */
27
+ keyframes?: AnimationOptions[];
28
+ /** Pointer bindings on this effect's config knobs (mouseMove.effect). */
29
+ mouseMove?: MouseMoveDomain;
23
30
  };
24
- export default function Flares({ hostRef, config, uniforms, animations, onObjectReady, onObjectDispose }: FlaresProps): import("react").JSX.Element;
31
+ export default function Flares({ hostRef, boundingRadius, config, uniforms, id, keyframes, mouseMove, onObjectReady, onObjectDispose }: FlaresProps): import("react").JSX.Element;
25
32
  //# sourceMappingURL=Flares.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Flares.d.ts","sourceRoot":"","sources":["../../../src/components/effects/Flares.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwE,OAAO,EAA8B,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5I,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,GAAG,CAAC;QACV,UAAU,iBAAiB;YACvB,aAAa,EAAE,GAAG,CAAC;SACtB;KACJ;CACJ;AAGD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG;IACzC;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,gFAAgF;IAChF,MAAM,EAAE,YAAY,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;IACvD,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC,CAAC;AAUF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,WAAW,+BA2HpH"}
1
+ {"version":3,"file":"Flares.d.ts","sourceRoot":"","sources":["../../../src/components/effects/Flares.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA0D,OAAO,EAA8B,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9H,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,GAAG,CAAC;QACV,UAAU,iBAAiB;YACvB,aAAa,EAAE,GAAG,CAAC;SACtB;KACJ;CACJ;AAGD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG;IACzC;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,MAAM,EAAE,YAAY,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;IACvD,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,CAAC;AAoCF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,cAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,WAAW,+BA+FtJ"}
@@ -1,22 +1,62 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useMemo, useRef } from "react";
2
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from "react";
3
3
  import { useFrame, useThree } from "@react-three/fiber";
4
- import { WebGLRenderTarget, MeshBasicMaterial, AdditiveBlending, Box3, Sphere, Vector3, Vector2, Quaternion, Color, Object3D } from "three";
4
+ import { WebGLRenderTarget, MeshBasicMaterial, AdditiveBlending, Vector3, Vector2, Quaternion, Color, Object3D } from "three";
5
+ import { DEFAULT_GENERATIVE_EFFECTS, EFFECTS_ANIMATABLE } from "@3driseai/3drise-core";
5
6
  import { useObjectReady } from '../../hooks/useObjectReady.js';
6
- const tmpBox = new Box3();
7
- const tmpSphere = new Sphere();
7
+ import { useConfigDriver } from '../../hooks/useConfigDriver.js';
8
+ import { withConfigDefaults } from '../../utils/configAnimations.js';
8
9
  const tmpVec = new Vector3();
9
10
  const tmpVec2 = new Vector2();
10
11
  const tmpQuat = new Quaternion();
11
12
  const tmpRight = new Vector3();
12
13
  const tmpColor = new Color();
13
- export default function Flares({ hostRef, config, uniforms, animations, onObjectReady, onObjectDispose }) {
14
+ /** Knobs that re-tag the host or rebuild the mask pass: commit only, never live. */
15
+ const STRUCTURAL = ['shooting', 'maskResolution', 'maskLayer'];
16
+ /** Knobs a keyframe or pointer binding may drive per frame — exactly what the push point applies. */
17
+ const ANIMATABLE = new Set(EFFECTS_ANIMATABLE.flares.map((p) => p.value));
18
+ const _tip = new Color();
19
+ /**
20
+ * The single push point. The billboard is sized like every other effect: the host's
21
+ * bounding radius (1 standalone) x radius x padding. `speed` is read per frame (the flare
22
+ * clock's rate).
23
+ */
24
+ function applyConfig(mesh, mat, c, bound) {
25
+ if (mesh)
26
+ mesh.scale.setScalar(bound * c.radius * c.padding);
27
+ if (!mat)
28
+ return;
29
+ // additive blending: opacity is a brightness scale, so it folds into the intensity
30
+ mat.u_intensity = c.intensity * c.opacity;
31
+ _tip.set(c.color);
32
+ mat.u_tipColor.set(_tip.r, _tip.g, _tip.b);
33
+ // speed is integrated into u_time (see useFrame), so the shader's u_time * u_speed
34
+ // never jumps when the speed changes
35
+ mat.u_speed = 1;
36
+ }
37
+ export default function Flares({ hostRef, boundingRadius = 1, config, uniforms, id, keyframes, mouseMove, onObjectReady, onObjectDispose }) {
14
38
  const { gl, scene } = useThree();
15
39
  const anchorRef = useRef(null);
16
40
  useObjectReady(anchorRef, config, onObjectReady, onObjectDispose);
17
41
  const meshRef = useRef(null);
18
42
  const matRef = useRef(null);
19
- const { radius, padding = 1.2, fitKey, shooting, maskResolution = 512, maskLayer = 31 } = config;
43
+ const cfg = useMemo(() => withConfigDefaults(DEFAULT_GENERATIVE_EFFECTS.flares, config), [config]);
44
+ // the knobs read per frame (speed), from the last merged config
45
+ const cur = useRef(cfg);
46
+ const { shooting, maskResolution, maskLayer } = cfg;
47
+ const b = boundingRadius > 0 ? boundingRadius : 1;
48
+ const push = useCallback((merged) => {
49
+ cur.current = merged;
50
+ applyConfig(meshRef.current, matRef.current, merged, b);
51
+ }, [b]);
52
+ // push the current config into the material the moment it mounts
53
+ const setMaterial = useCallback((m) => {
54
+ matRef.current = m;
55
+ if (m)
56
+ applyConfig(meshRef.current, m, cur.current, b);
57
+ }, [b]);
58
+ useLayoutEffect(() => { push(cfg); }, [push, cfg]);
59
+ useConfigDriver({ rootRef: anchorRef, id, family: 'effects', base: cfg, structural: STRUCTURAL, allowed: ANIMATABLE, keyframes, mouseMove, push });
20
60
  const maskTarget = useMemo(() => hostRef
21
61
  ? new WebGLRenderTarget(maskResolution, maskResolution, {
22
62
  depthBuffer: true,
@@ -26,62 +66,19 @@ export default function Flares({ hostRef, config, uniforms, animations, onObject
26
66
  : null, [hostRef, maskResolution]);
27
67
  const maskMaterial = useMemo(() => new MeshBasicMaterial({ color: 0xffffff }), []);
28
68
  useEffect(() => () => maskTarget?.dispose(), [maskTarget]);
29
- // Fit the billboard to the host object + tag the host for the mask pass.
69
+ // Silhouette mode: tag every host node (except us) with the mask layer.
30
70
  useEffect(() => {
31
71
  const anchor = anchorRef.current;
32
- const mesh = meshRef.current;
33
- if (!anchor || !mesh)
34
- return;
35
- const host = hostRef && hostRef instanceof Object3D ? hostRef : anchor;
36
- // Silhouette mode: tag every host node (except us) with the mask layer.
37
- if (hostRef && host) {
38
- host.traverse((o) => o.layers.enable(maskLayer));
39
- anchor.traverse((o) => o.layers.disable(maskLayer));
40
- }
41
- if (radius !== undefined) {
42
- anchor.position.set(0, 0, 0);
43
- mesh.scale.setScalar(radius * padding);
44
- return;
45
- }
46
- if (!host)
47
- return;
48
- // Bounding box of every sibling except ourselves (world space).
49
- tmpBox.makeEmpty();
50
- let hasGeometry = false;
51
- for (const child of host.children) {
52
- if (child === anchor)
53
- continue;
54
- const childBox = new Box3().setFromObject(child);
55
- if (!childBox.isEmpty()) {
56
- tmpBox.union(childBox);
57
- hasGeometry = true;
58
- }
59
- }
60
- // Host itself may be a mesh (Flares nested directly inside it).
61
- if (host.geometry) {
62
- const g = host.geometry;
63
- if (!g.boundingBox)
64
- g.computeBoundingBox();
65
- if (g.boundingBox) {
66
- tmpBox.union(g.boundingBox.clone().applyMatrix4(host.matrixWorld));
67
- hasGeometry = true;
68
- }
69
- }
70
- if (!hasGeometry)
72
+ if (!anchor || !hostRef || !(hostRef instanceof Object3D))
71
73
  return;
72
- tmpBox.getBoundingSphere(tmpSphere);
73
- host.updateWorldMatrix(true, false);
74
- const localCenter = host.worldToLocal(tmpSphere.center.clone());
75
- host.getWorldScale(tmpVec);
76
- const worldScale = Math.max(tmpVec.x, tmpVec.y, tmpVec.z) || 1;
77
- anchor.position.copy(localCenter);
78
- mesh.scale.setScalar((tmpSphere.radius / worldScale) * padding);
79
- }, [radius, padding, fitKey, hostRef, maskLayer]);
74
+ hostRef.traverse((o) => o.layers.enable(maskLayer));
75
+ anchor.traverse((o) => o.layers.disable(maskLayer));
76
+ }, [hostRef, maskLayer]);
80
77
  useFrame(({ camera: cam }, delta) => {
81
78
  const mat = matRef.current;
82
79
  const mesh = meshRef.current;
83
80
  if (mat)
84
- mat.u_time += delta;
81
+ mat.u_time += delta * cur.current.speed;
85
82
  // World-space billboard: compensate for inherited rotation.
86
83
  if (mesh && hostRef) {
87
84
  hostRef.getWorldQuaternion(tmpQuat).invert();
@@ -132,5 +129,5 @@ export default function Flares({ hostRef, config, uniforms, animations, onObject
132
129
  mat.u_maskEnabled = 0;
133
130
  }
134
131
  });
135
- return (_jsx("group", { ref: anchorRef, children: _jsxs("mesh", { ref: meshRef, renderOrder: 2, children: [_jsx("planeGeometry", { args: [4.4, 4.4] }), _jsx("flareMaterial", { ref: matRef, transparent: true, depthWrite: false, depthTest: !hostRef && !shooting, blending: AdditiveBlending, u_shootEnabled: shooting ? 1 : 0, ...uniforms })] }) }));
132
+ return (_jsx("group", { ref: anchorRef, children: _jsxs("mesh", { ref: meshRef, renderOrder: 2, children: [_jsx("planeGeometry", { args: [4.4, 4.4] }), _jsx("flareMaterial", { ref: setMaterial, transparent: true, depthWrite: false, depthTest: !hostRef && !shooting, blending: AdditiveBlending, u_shootEnabled: shooting ? 1 : 0, ...uniforms })] }) }));
136
133
  }
@@ -1,10 +1,15 @@
1
1
  import React from "react";
2
- import type { ForcefieldConfig, AnimationOptions } from "@3driseai/3drise-core";
2
+ import type { ForcefieldConfig, AnimationOptions, MouseMoveDomain } from "@3driseai/3drise-core";
3
3
  import type { ObjectReadyProps } from '../../types/objectReady';
4
- interface ForcefieldEffectProps extends ObjectReadyProps {
4
+ export interface ForcefieldEffectProps extends ObjectReadyProps {
5
5
  boundingRadius: number;
6
6
  config: ForcefieldConfig;
7
- animations?: AnimationOptions[];
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;
8
13
  }
9
14
  declare const ForcefieldEffect: React.FC<ForcefieldEffectProps>;
10
15
  export default ForcefieldEffect;
@@ -1 +1 @@
1
- {"version":3,"file":"ForcefieldEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/ForcefieldEffect.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,UAAU,qBAAsB,SAAQ,gBAAgB;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC;AA6ED,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAoDrD,CAAC;AACF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"ForcefieldEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/ForcefieldEffect.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGjG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,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;AAiGD,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAwDrD,CAAC;AACF,eAAe,gBAAgB,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useRef, useMemo } from 'react';
2
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
3
3
  import { useFrame } from '@react-three/fiber';
4
4
  import * as THREE from 'three';
5
- import { applyGenerativeAnimations } from '../../utils/handleGenerativeEffectsAnimations.js';
5
+ import { withConfigDefaults } from '../../utils/configAnimations.js';
6
+ import { DEFAULT_GENERATIVE_EFFECTS, EFFECTS_ANIMATABLE } from "@3driseai/3drise-core";
6
7
  import { useObjectReady } from '../../hooks/useObjectReady.js';
8
+ import { useConfigDriver } from '../../hooks/useConfigDriver.js';
7
9
  const shieldVert = /* glsl */ `
8
10
  varying vec3 vNormal;
9
11
  varying vec3 vWorldPos;
@@ -78,43 +80,63 @@ const shieldFrag = /* glsl */ `
78
80
  gl_FragColor = vec4(col + uRimColor * ripple * 0.3, alpha);
79
81
  }
80
82
  `;
81
- const ForcefieldEffect = ({ boundingRadius, config, animations, onObjectReady, onObjectDispose }) => {
82
- const { hexSize, rippleEnabled, shieldColor, rimColor, opacity, speed, intensity } = config;
83
- const startValuesCacheRef = useRef({});
83
+ /** No knob rebuilds the shield: the sphere is sized by the host only. */
84
+ const STRUCTURAL = [];
85
+ /** Knobs a keyframe or pointer binding may drive per frame — exactly what the push point applies. */
86
+ const ANIMATABLE = new Set(EFFECTS_ANIMATABLE.forcefield.map((p) => p.value));
87
+ const _color = new THREE.Color();
88
+ /** The single push point: every config knob reaches its uniform here. */
89
+ function applyConfig(mat, c) {
90
+ const u = mat.uniforms;
91
+ u.uHexSize.value = c.hexSize;
92
+ _color.set(c.shieldColor);
93
+ u.uShieldColor.value.set(_color.r, _color.g, _color.b);
94
+ _color.set(c.rimColor);
95
+ u.uRimColor.value.set(_color.r, _color.g, _color.b);
96
+ u.uOpacity.value = c.opacity;
97
+ u.uIntensity.value = c.intensity;
98
+ }
99
+ const ForcefieldEffect = ({ boundingRadius, config, id, keyframes, mouseMove, onObjectReady, onObjectDispose }) => {
100
+ const cfg = useMemo(() => withConfigDefaults(DEFAULT_GENERATIVE_EFFECTS.forcefield, config), [config]);
84
101
  const meshRef = useRef(null);
85
102
  useObjectReady(meshRef, config, onObjectReady, onObjectDispose);
86
103
  const hitSlot = useRef(0);
87
104
  const nextHit = useRef(0);
88
- const mat = useMemo(() => {
89
- const sc = new THREE.Color(shieldColor);
90
- const rc = new THREE.Color(rimColor);
91
- return new THREE.ShaderMaterial({
92
- vertexShader: shieldVert,
93
- fragmentShader: shieldFrag,
94
- uniforms: {
95
- u_time: { value: 0 },
96
- uHexSize: { value: hexSize },
97
- uShieldColor: { value: new THREE.Vector3(sc.r, sc.g, sc.b) },
98
- uRimColor: { value: new THREE.Vector3(rc.r, rc.g, rc.b) },
99
- uOpacity: { value: opacity },
100
- uIntensity: { value: intensity },
101
- uHitPos: { value: [new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3()] },
102
- uHitTime: { value: [-99, -99, -99] },
103
- },
104
- transparent: true,
105
- depthWrite: false,
106
- side: THREE.FrontSide,
107
- blending: THREE.AdditiveBlending,
108
- });
109
- // eslint-disable-next-line react-hooks/exhaustive-deps
110
- }, [hexSize, shieldColor, rimColor, opacity, intensity]);
105
+ // the knobs read per frame (speed, rippleEnabled), from the last merged config
106
+ const cur = useRef(cfg);
107
+ // One material for the life of the effect; the config is pushed into it.
108
+ const mat = useMemo(() => new THREE.ShaderMaterial({
109
+ vertexShader: shieldVert,
110
+ fragmentShader: shieldFrag,
111
+ uniforms: {
112
+ u_time: { value: 0 },
113
+ uHexSize: { value: 0.06 },
114
+ uShieldColor: { value: new THREE.Vector3() },
115
+ uRimColor: { value: new THREE.Vector3() },
116
+ uOpacity: { value: 1 },
117
+ uIntensity: { value: 1 },
118
+ uHitPos: { value: [new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3()] },
119
+ uHitTime: { value: [-99, -99, -99] },
120
+ },
121
+ transparent: true,
122
+ depthWrite: false,
123
+ side: THREE.FrontSide,
124
+ blending: THREE.AdditiveBlending,
125
+ }), []);
126
+ useEffect(() => () => mat.dispose(), [mat]);
127
+ const push = useCallback((merged) => {
128
+ cur.current = merged;
129
+ applyConfig(mat, merged);
130
+ }, [mat]);
131
+ useLayoutEffect(() => { push(cfg); }, [push, cfg]);
132
+ useConfigDriver({ rootRef: meshRef, id, family: 'effects', base: cfg, structural: STRUCTURAL, allowed: ANIMATABLE, keyframes, mouseMove, push });
111
133
  useFrame((state, delta) => {
112
134
  const t = state.clock.getElapsedTime();
113
135
  mat.uniforms.u_time.value = t;
114
- if (rippleEnabled) {
136
+ if (cur.current.rippleEnabled) {
115
137
  nextHit.current -= delta;
116
138
  if (nextHit.current <= 0) {
117
- nextHit.current = 1.4 / speed + Math.random() * 0.8;
139
+ nextHit.current = 1.4 / Math.max(cur.current.speed, 0.05) + Math.random() * 0.8;
118
140
  // Random point on sphere surface
119
141
  const phi = Math.random() * Math.PI * 2;
120
142
  const theta = Math.acos(2 * Math.random() - 1);
@@ -125,9 +147,6 @@ const ForcefieldEffect = ({ boundingRadius, config, animations, onObjectReady, o
125
147
  hitSlot.current++;
126
148
  }
127
149
  }
128
- if (animations?.length) {
129
- applyGenerativeAnimations([mat], animations, startValuesCacheRef.current, Date.now(), false);
130
- }
131
150
  });
132
151
  return (_jsx("mesh", { ref: meshRef, material: mat, children: _jsx("sphereGeometry", { args: [boundingRadius * 1.15, 64, 64] }) }));
133
152
  };
@@ -1,10 +1,15 @@
1
1
  import React from 'react';
2
- import type { AnimationOptions, GalaxyConfig } from '@3driseai/3drise-core';
2
+ import type { AnimationOptions, GalaxyConfig, MouseMoveDomain } from '@3driseai/3drise-core';
3
3
  import type { ObjectReadyProps } from '../../types/objectReady';
4
4
  export interface GalaxyEffectProps extends ObjectReadyProps {
5
5
  boundingRadius: number;
6
6
  config: GalaxyConfig;
7
- animations?: AnimationOptions[];
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;
8
13
  /** True when the effect is attached to an object, so it can react to the host. */
9
14
  hasHost?: boolean;
10
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GalaxyEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/GalaxyEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsD,MAAM,OAAO,CAAC;AAG3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AA8VD,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA+B7C,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"GalaxyEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/GalaxyEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmE,MAAM,OAAO,CAAC;AAIxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,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;IAC5B,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAoWD,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAqC7C,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useLayoutEffect, useMemo, useRef } from 'react';
2
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
3
3
  import * as THREE from 'three';
4
4
  import { useFrame } from '@react-three/fiber';
5
- import { applyGenerativeAnimations } from '../../utils/handleGenerativeEffectsAnimations.js';
5
+ import { EFFECTS_ANIMATABLE } from '@3driseai/3drise-core';
6
+ import { withConfigDefaults } from '../../utils/configAnimations.js';
6
7
  import { useObjectReady } from '../../hooks/useObjectReady.js';
8
+ import { useConfigDriver } from '../../hooks/useConfigDriver.js';
7
9
  /**
8
10
  * A spiral galaxy from density-wave theory: nested elliptical orbits twist into arms, lit by young blue stars, dust lanes and a warm bulge. Use for space, cosmic, sci-fi scenes.
9
11
  *
@@ -332,7 +334,7 @@ function build(u, c, bound, env) {
332
334
  },
333
335
  };
334
336
  }
335
- /** Defaults for every knob, so an older saved config still renders. */
337
+ /** A value for every knob: the base the renderer draws and keyframes interpolate from. */
336
338
  const DEFAULTS = {
337
339
  intensity: 1,
338
340
  speed: 1,
@@ -347,27 +349,35 @@ const DEFAULTS = {
347
349
  tilt: 22,
348
350
  coreColor: '#ffd9a8',
349
351
  };
350
- const GalaxyEffect = ({ boundingRadius, config, animations, hasHost = false, onObjectReady, onObjectDispose }) => {
352
+ /** Knobs that rebuild the object: they change on commit, never through the live path. */
353
+ const STRUCTURAL = ['starCount'];
354
+ /** Knobs a keyframe or pointer binding may drive per frame — exactly what the push point applies. */
355
+ const ANIMATABLE = new Set(EFFECTS_ANIMATABLE.galaxy.map((p) => p.value));
356
+ const GalaxyEffect = ({ boundingRadius, config, id, keyframes, mouseMove, hasHost = false, onObjectReady, onObjectDispose }) => {
351
357
  const rootRef = useRef(null);
352
- const animCache = useRef({});
353
358
  useObjectReady(rootRef, config, onObjectReady, onObjectDispose);
354
359
  // a standalone effect gets boundingRadius 1
355
360
  const b = boundingRadius > 0 ? boundingRadius : 1;
356
- const cfg = useMemo(() => ({ ...DEFAULTS, ...config }), [config]);
361
+ const cfg = useMemo(() => withConfigDefaults(DEFAULTS, config), [config]);
357
362
  const env = useMemo(() => ({ hasHost: hasHost }), [hasHost]);
358
363
  // uniforms outlive the objects, so keyframe animations survive a rebuild
359
364
  const uniforms = useMemo(() => createUniforms(), []);
360
365
  // rebuilt only when the host size or a structural knob changes
361
- const instance = useMemo(() => build(uniforms, { ...DEFAULTS, ...config }, b, env), [uniforms, b, env, cfg.starCount]);
366
+ const instance = useMemo(() => build(uniforms, cfg, b, env), [uniforms, b, env, cfg.starCount]);
362
367
  useEffect(() => () => instance.dispose(), [instance]);
363
368
  useLayoutEffect(() => {
364
369
  applyConfig(uniforms, cfg, b, env);
365
370
  instance.apply(cfg);
366
371
  }, [instance, uniforms, cfg, b, env]);
372
+ // Committed config + live drag + keyframes + pointer, merged into the one push point
373
+ // (the uniforms, then the instance's own cheap per-config step).
374
+ const push = useCallback((merged) => {
375
+ applyConfig(uniforms, merged, b, env);
376
+ instance.apply(merged);
377
+ }, [instance, uniforms, b, env]);
378
+ useConfigDriver({ rootRef, id, family: 'effects', base: cfg, structural: STRUCTURAL, allowed: ANIMATABLE, keyframes, mouseMove, push });
367
379
  useFrame((state, delta) => {
368
380
  instance.update(Math.min(delta, 0.1), state.camera);
369
- if (animations?.length)
370
- applyGenerativeAnimations(instance.materials, animations, animCache.current, Date.now(), false);
371
381
  });
372
382
  return (_jsx("group", { ref: rootRef, children: _jsx("primitive", { object: instance.object }) }));
373
383
  };
@@ -1,10 +1,15 @@
1
- import React from 'react';
2
- import type { AnimationOptions, HarmonicShellConfig } from '@3driseai/3drise-core';
1
+ import React from "react";
2
+ import type { HarmonicShellConfig, AnimationOptions, MouseMoveDomain } from "@3driseai/3drise-core";
3
3
  import type { ObjectReadyProps } from '../../types/objectReady';
4
4
  export interface HarmonicShellEffectProps extends ObjectReadyProps {
5
5
  boundingRadius: number;
6
6
  config: HarmonicShellConfig;
7
- animations?: AnimationOptions[];
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;
8
13
  }
9
14
  declare const HarmonicShellEffect: React.FC<HarmonicShellEffectProps>;
10
15
  export default HarmonicShellEffect;
@@ -1 +1 @@
1
- {"version":3,"file":"HarmonicShellEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/HarmonicShellEffect.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC;AA0KD,QAAA,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA2D3D,CAAC;AACF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"HarmonicShellEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/HarmonicShellEffect.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,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;AA+LD,QAAA,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA4C3D,CAAC;AACF,eAAe,mBAAmB,CAAC"}