@zephyr3d/scene 0.7.1 → 0.8.1

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 (441) hide show
  1. package/dist/animation/animation.js +0 -18
  2. package/dist/animation/animation.js.map +1 -1
  3. package/dist/animation/animationset.js +200 -3
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/ik/ccd_solver.js +371 -0
  6. package/dist/animation/ik/ccd_solver.js.map +1 -0
  7. package/dist/animation/ik/fabrik_solver.js +398 -0
  8. package/dist/animation/ik/fabrik_solver.js.map +1 -0
  9. package/dist/animation/ik/ik_angle_constraint.js +181 -0
  10. package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
  11. package/dist/animation/ik/ik_chain.js +163 -0
  12. package/dist/animation/ik/ik_chain.js.map +1 -0
  13. package/dist/animation/ik/ik_constraint.js +25 -0
  14. package/dist/animation/ik/ik_constraint.js.map +1 -0
  15. package/dist/animation/ik/ik_pole_constraint.js +128 -0
  16. package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
  17. package/dist/animation/ik/ik_solver.js +48 -0
  18. package/dist/animation/ik/ik_solver.js.map +1 -0
  19. package/dist/animation/ik/ik_track.js +96 -0
  20. package/dist/animation/ik/ik_track.js.map +1 -0
  21. package/dist/animation/ik/ik_utils.js +191 -0
  22. package/dist/animation/ik/ik_utils.js.map +1 -0
  23. package/dist/animation/ik/two_bone_ik_solver.js +331 -0
  24. package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
  25. package/dist/animation/ik_modifier.js +61 -0
  26. package/dist/animation/ik_modifier.js.map +1 -0
  27. package/dist/animation/ik_postprocessor.js +71 -0
  28. package/dist/animation/ik_postprocessor.js.map +1 -0
  29. package/dist/animation/manual_transform_processor.js +156 -0
  30. package/dist/animation/manual_transform_processor.js.map +1 -0
  31. package/dist/animation/skeleton.js +55 -51
  32. package/dist/animation/skeleton.js.map +1 -1
  33. package/dist/animation/skeleton_modifier.js +38 -0
  34. package/dist/animation/skeleton_modifier.js.map +1 -0
  35. package/dist/animation/skeleton_postprocessor.js +50 -0
  36. package/dist/animation/skeleton_postprocessor.js.map +1 -0
  37. package/dist/animation/spring/multi_chain_spring_system.js +503 -0
  38. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
  39. package/dist/animation/spring/spring_bone.js +240 -0
  40. package/dist/animation/spring/spring_bone.js.map +1 -0
  41. package/dist/animation/spring/spring_bone_collider.js +198 -0
  42. package/dist/animation/spring/spring_bone_collider.js.map +1 -0
  43. package/dist/animation/spring/spring_bone_constraint.js +170 -0
  44. package/dist/animation/spring/spring_bone_constraint.js.map +1 -0
  45. package/dist/animation/spring/spring_bone_system.js +328 -0
  46. package/dist/animation/spring/spring_bone_system.js.map +1 -0
  47. package/dist/animation/spring/spring_chain.js +103 -0
  48. package/dist/animation/spring/spring_chain.js.map +1 -0
  49. package/dist/animation/spring/spring_collider.js +247 -0
  50. package/dist/animation/spring/spring_collider.js.map +1 -0
  51. package/dist/animation/spring/spring_constraint.js +21 -0
  52. package/dist/animation/spring/spring_constraint.js.map +1 -0
  53. package/dist/animation/spring/spring_particle.js +20 -0
  54. package/dist/animation/spring/spring_particle.js.map +1 -0
  55. package/dist/animation/spring/spring_system.js +526 -0
  56. package/dist/animation/spring/spring_system.js.map +1 -0
  57. package/dist/animation/spring_modifier.js +45 -0
  58. package/dist/animation/spring_modifier.js.map +1 -0
  59. package/dist/animation/spring_postprocessor.js +54 -0
  60. package/dist/animation/spring_postprocessor.js.map +1 -0
  61. package/dist/app/screen.js +1 -1
  62. package/dist/app/screen.js.map +1 -1
  63. package/dist/asset/model.js +10 -6
  64. package/dist/asset/model.js.map +1 -1
  65. package/dist/camera/perspectivecamera.js +3 -3
  66. package/dist/camera/perspectivecamera.js.map +1 -1
  67. package/dist/index.d.ts +1400 -4
  68. package/dist/index.js +16 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
  71. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  72. package/dist/material/mixins/pbr/common.js +20 -17
  73. package/dist/material/mixins/pbr/common.js.map +1 -1
  74. package/dist/material/shader/helper.js +5 -3
  75. package/dist/material/shader/helper.js.map +1 -1
  76. package/dist/render/gpu_picking.js +100 -0
  77. package/dist/render/gpu_picking.js.map +1 -0
  78. package/dist/render/rendergraph/device_pool_allocator.js +41 -0
  79. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -0
  80. package/dist/render/rendergraph/executor.js +146 -0
  81. package/dist/render/rendergraph/executor.js.map +1 -0
  82. package/dist/render/rendergraph/forward_plus_builder.js +414 -0
  83. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -0
  84. package/dist/render/rendergraph/rendergraph.js +306 -0
  85. package/dist/render/rendergraph/rendergraph.js.map +1 -0
  86. package/dist/render/rendergraph/types.js +57 -0
  87. package/dist/render/rendergraph/types.js.map +1 -0
  88. package/dist/render/sky_motion_vector.js +85 -0
  89. package/dist/render/sky_motion_vector.js.map +1 -0
  90. package/dist/scene/mesh.js +15 -23
  91. package/dist/scene/mesh.js.map +1 -1
  92. package/dist/utility/serialization/scene/animation.js +24 -23
  93. package/dist/utility/serialization/scene/animation.js.map +1 -1
  94. package/dist/utility/serialization/scene/material.js +62 -0
  95. package/dist/utility/serialization/scene/material.js.map +1 -1
  96. package/dist/utility/serialization/scene/node.js +1 -1
  97. package/package.json +3 -3
  98. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
  99. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
  100. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
  101. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
  102. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
  103. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
  104. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
  105. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
  106. package/dist/src/animation/animation.js +0 -127
  107. package/dist/src/animation/animation.js.map +0 -1
  108. package/dist/src/animation/animationset.js +0 -255
  109. package/dist/src/animation/animationset.js.map +0 -1
  110. package/dist/src/animation/animationtrack.js +0 -34
  111. package/dist/src/animation/animationtrack.js.map +0 -1
  112. package/dist/src/animation/eulerrotationtrack.js +0 -52
  113. package/dist/src/animation/eulerrotationtrack.js.map +0 -1
  114. package/dist/src/animation/morphtarget.js +0 -93
  115. package/dist/src/animation/morphtarget.js.map +0 -1
  116. package/dist/src/animation/morphtrack.js +0 -70
  117. package/dist/src/animation/morphtrack.js.map +0 -1
  118. package/dist/src/animation/proptrack.js +0 -161
  119. package/dist/src/animation/proptrack.js.map +0 -1
  120. package/dist/src/animation/rotationtrack.js +0 -51
  121. package/dist/src/animation/rotationtrack.js.map +0 -1
  122. package/dist/src/animation/scaletrack.js +0 -50
  123. package/dist/src/animation/scaletrack.js.map +0 -1
  124. package/dist/src/animation/skeleton.js +0 -204
  125. package/dist/src/animation/skeleton.js.map +0 -1
  126. package/dist/src/animation/translationtrack.js +0 -50
  127. package/dist/src/animation/translationtrack.js.map +0 -1
  128. package/dist/src/app/app.js +0 -129
  129. package/dist/src/app/app.js.map +0 -1
  130. package/dist/src/app/inputmgr.js +0 -267
  131. package/dist/src/app/inputmgr.js.map +0 -1
  132. package/dist/src/asset/assetmanager.js +0 -404
  133. package/dist/src/asset/assetmanager.js.map +0 -1
  134. package/dist/src/asset/builtin.js +0 -337
  135. package/dist/src/asset/builtin.js.map +0 -1
  136. package/dist/src/asset/loaders/dds/dds.js +0 -470
  137. package/dist/src/asset/loaders/dds/dds.js.map +0 -1
  138. package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
  139. package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
  140. package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
  141. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
  142. package/dist/src/asset/loaders/gltf/helpers.js +0 -327
  143. package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
  144. package/dist/src/asset/loaders/hdr/hdr.js +0 -180
  145. package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
  146. package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
  147. package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
  148. package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
  149. package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
  150. package/dist/src/asset/loaders/loader.js +0 -45
  151. package/dist/src/asset/loaders/loader.js.map +0 -1
  152. package/dist/src/asset/model.js +0 -414
  153. package/dist/src/asset/model.js.map +0 -1
  154. package/dist/src/blitter/bilateralblur.js +0 -221
  155. package/dist/src/blitter/bilateralblur.js.map +0 -1
  156. package/dist/src/blitter/blitter.js +0 -390
  157. package/dist/src/blitter/blitter.js.map +0 -1
  158. package/dist/src/blitter/box.js +0 -118
  159. package/dist/src/blitter/box.js.map +0 -1
  160. package/dist/src/blitter/copy.js +0 -22
  161. package/dist/src/blitter/copy.js.map +0 -1
  162. package/dist/src/blitter/gaussianblur.js +0 -228
  163. package/dist/src/blitter/gaussianblur.js.map +0 -1
  164. package/dist/src/camera/base.js +0 -92
  165. package/dist/src/camera/base.js.map +0 -1
  166. package/dist/src/camera/camera.js +0 -1005
  167. package/dist/src/camera/camera.js.map +0 -1
  168. package/dist/src/camera/fps.js +0 -238
  169. package/dist/src/camera/fps.js.map +0 -1
  170. package/dist/src/camera/orbit.js +0 -245
  171. package/dist/src/camera/orbit.js.map +0 -1
  172. package/dist/src/camera/orthocamera.js +0 -167
  173. package/dist/src/camera/orthocamera.js.map +0 -1
  174. package/dist/src/camera/perspectivecamera.js +0 -141
  175. package/dist/src/camera/perspectivecamera.js.map +0 -1
  176. package/dist/src/index.js +0 -120
  177. package/dist/src/index.js.map +0 -1
  178. package/dist/src/material/blinn.js +0 -81
  179. package/dist/src/material/blinn.js.map +0 -1
  180. package/dist/src/material/grassmaterial.js +0 -113
  181. package/dist/src/material/grassmaterial.js.map +0 -1
  182. package/dist/src/material/lambert.js +0 -92
  183. package/dist/src/material/lambert.js.map +0 -1
  184. package/dist/src/material/material.js +0 -301
  185. package/dist/src/material/material.js.map +0 -1
  186. package/dist/src/material/meshmaterial.js +0 -704
  187. package/dist/src/material/meshmaterial.js.map +0 -1
  188. package/dist/src/material/mixins/albedocolor.js +0 -76
  189. package/dist/src/material/mixins/albedocolor.js.map +0 -1
  190. package/dist/src/material/mixins/foliage.js +0 -47
  191. package/dist/src/material/mixins/foliage.js.map +0 -1
  192. package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
  193. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
  194. package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
  195. package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
  196. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
  197. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
  198. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
  199. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
  200. package/dist/src/material/mixins/lit.js +0 -476
  201. package/dist/src/material/mixins/lit.js.map +0 -1
  202. package/dist/src/material/mixins/pbr/common.js +0 -918
  203. package/dist/src/material/mixins/pbr/common.js.map +0 -1
  204. package/dist/src/material/mixins/texture.js +0 -172
  205. package/dist/src/material/mixins/texture.js.map +0 -1
  206. package/dist/src/material/mixins/vertexcolor.js +0 -56
  207. package/dist/src/material/mixins/vertexcolor.js.map +0 -1
  208. package/dist/src/material/particle.js +0 -178
  209. package/dist/src/material/particle.js.map +0 -1
  210. package/dist/src/material/pbrmr.js +0 -97
  211. package/dist/src/material/pbrmr.js.map +0 -1
  212. package/dist/src/material/pbrsg.js +0 -97
  213. package/dist/src/material/pbrsg.js.map +0 -1
  214. package/dist/src/material/shader/helper.js +0 -1209
  215. package/dist/src/material/shader/helper.js.map +0 -1
  216. package/dist/src/material/terrain-cm.js +0 -606
  217. package/dist/src/material/terrain-cm.js.map +0 -1
  218. package/dist/src/material/terrainmaterial.js +0 -375
  219. package/dist/src/material/terrainmaterial.js.map +0 -1
  220. package/dist/src/material/unlit.js +0 -41
  221. package/dist/src/material/unlit.js.map +0 -1
  222. package/dist/src/material/water.js +0 -417
  223. package/dist/src/material/water.js.map +0 -1
  224. package/dist/src/posteffect/bloom.js +0 -361
  225. package/dist/src/posteffect/bloom.js.map +0 -1
  226. package/dist/src/posteffect/compositor.js +0 -226
  227. package/dist/src/posteffect/compositor.js.map +0 -1
  228. package/dist/src/posteffect/fxaa.js +0 -273
  229. package/dist/src/posteffect/fxaa.js.map +0 -1
  230. package/dist/src/posteffect/grayscale.js +0 -69
  231. package/dist/src/posteffect/grayscale.js.map +0 -1
  232. package/dist/src/posteffect/motionblur.js +0 -96
  233. package/dist/src/posteffect/motionblur.js.map +0 -1
  234. package/dist/src/posteffect/posteffect.js +0 -126
  235. package/dist/src/posteffect/posteffect.js.map +0 -1
  236. package/dist/src/posteffect/sao.js +0 -324
  237. package/dist/src/posteffect/sao.js.map +0 -1
  238. package/dist/src/posteffect/ssr.js +0 -489
  239. package/dist/src/posteffect/ssr.js.map +0 -1
  240. package/dist/src/posteffect/taa.js +0 -172
  241. package/dist/src/posteffect/taa.js.map +0 -1
  242. package/dist/src/posteffect/tonemap.js +0 -94
  243. package/dist/src/posteffect/tonemap.js.map +0 -1
  244. package/dist/src/render/abuffer_oit.js +0 -361
  245. package/dist/src/render/abuffer_oit.js.map +0 -1
  246. package/dist/src/render/clipmap.js +0 -851
  247. package/dist/src/render/clipmap.js.map +0 -1
  248. package/dist/src/render/cluster_light.js +0 -333
  249. package/dist/src/render/cluster_light.js.map +0 -1
  250. package/dist/src/render/cull_visitor.js +0 -187
  251. package/dist/src/render/cull_visitor.js.map +0 -1
  252. package/dist/src/render/depthpass.js +0 -68
  253. package/dist/src/render/depthpass.js.map +0 -1
  254. package/dist/src/render/drawable_mixin.js +0 -227
  255. package/dist/src/render/drawable_mixin.js.map +0 -1
  256. package/dist/src/render/envlight.js +0 -463
  257. package/dist/src/render/envlight.js.map +0 -1
  258. package/dist/src/render/fbm_wavegenerator.js +0 -251
  259. package/dist/src/render/fbm_wavegenerator.js.map +0 -1
  260. package/dist/src/render/fft_wavegenerator.js +0 -1006
  261. package/dist/src/render/fft_wavegenerator.js.map +0 -1
  262. package/dist/src/render/fullscreenquad.js +0 -38
  263. package/dist/src/render/fullscreenquad.js.map +0 -1
  264. package/dist/src/render/gerstner_wavegenerator.js +0 -314
  265. package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
  266. package/dist/src/render/globalbindgroup_allocator.js +0 -60
  267. package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
  268. package/dist/src/render/hzb.js +0 -273
  269. package/dist/src/render/hzb.js.map +0 -1
  270. package/dist/src/render/lightpass.js +0 -172
  271. package/dist/src/render/lightpass.js.map +0 -1
  272. package/dist/src/render/objectcolorpass.js +0 -51
  273. package/dist/src/render/objectcolorpass.js.map +0 -1
  274. package/dist/src/render/primitive.js +0 -364
  275. package/dist/src/render/primitive.js.map +0 -1
  276. package/dist/src/render/render_queue.js +0 -467
  277. package/dist/src/render/render_queue.js.map +0 -1
  278. package/dist/src/render/renderbundle_wrapper.js +0 -152
  279. package/dist/src/render/renderbundle_wrapper.js.map +0 -1
  280. package/dist/src/render/renderer.js +0 -455
  281. package/dist/src/render/renderer.js.map +0 -1
  282. package/dist/src/render/renderpass.js +0 -200
  283. package/dist/src/render/renderpass.js.map +0 -1
  284. package/dist/src/render/shadowmap_pass.js +0 -56
  285. package/dist/src/render/shadowmap_pass.js.map +0 -1
  286. package/dist/src/render/sky.js +0 -1103
  287. package/dist/src/render/sky.js.map +0 -1
  288. package/dist/src/render/weightedblended_oit.js +0 -168
  289. package/dist/src/render/weightedblended_oit.js.map +0 -1
  290. package/dist/src/scene/batchgroup.js +0 -162
  291. package/dist/src/scene/batchgroup.js.map +0 -1
  292. package/dist/src/scene/environment.js +0 -209
  293. package/dist/src/scene/environment.js.map +0 -1
  294. package/dist/src/scene/graph_node.js +0 -72
  295. package/dist/src/scene/graph_node.js.map +0 -1
  296. package/dist/src/scene/light.js +0 -416
  297. package/dist/src/scene/light.js.map +0 -1
  298. package/dist/src/scene/mesh.js +0 -341
  299. package/dist/src/scene/mesh.js.map +0 -1
  300. package/dist/src/scene/octree.js +0 -649
  301. package/dist/src/scene/octree.js.map +0 -1
  302. package/dist/src/scene/particlesys.js +0 -738
  303. package/dist/src/scene/particlesys.js.map +0 -1
  304. package/dist/src/scene/raycast_visitor.js +0 -103
  305. package/dist/src/scene/raycast_visitor.js.map +0 -1
  306. package/dist/src/scene/scene.js +0 -284
  307. package/dist/src/scene/scene.js.map +0 -1
  308. package/dist/src/scene/scene_node.js +0 -732
  309. package/dist/src/scene/scene_node.js.map +0 -1
  310. package/dist/src/scene/terrain/grass.js +0 -278
  311. package/dist/src/scene/terrain/grass.js.map +0 -1
  312. package/dist/src/scene/terrain/heightfield.js +0 -475
  313. package/dist/src/scene/terrain/heightfield.js.map +0 -1
  314. package/dist/src/scene/terrain/patch.js +0 -530
  315. package/dist/src/scene/terrain/patch.js.map +0 -1
  316. package/dist/src/scene/terrain/quadtree.js +0 -461
  317. package/dist/src/scene/terrain/quadtree.js.map +0 -1
  318. package/dist/src/scene/terrain/terrain.js +0 -246
  319. package/dist/src/scene/terrain/terrain.js.map +0 -1
  320. package/dist/src/scene/terrain-cm/grass.js +0 -594
  321. package/dist/src/scene/terrain-cm/grass.js.map +0 -1
  322. package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
  323. package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
  324. package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
  325. package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
  326. package/dist/src/scene/water.js +0 -374
  327. package/dist/src/scene/water.js.map +0 -1
  328. package/dist/src/shaders/atmosphere.js +0 -957
  329. package/dist/src/shaders/atmosphere.js.map +0 -1
  330. package/dist/src/shaders/fog.js +0 -112
  331. package/dist/src/shaders/fog.js.map +0 -1
  332. package/dist/src/shaders/misc.js +0 -266
  333. package/dist/src/shaders/misc.js.map +0 -1
  334. package/dist/src/shaders/noise.js +0 -222
  335. package/dist/src/shaders/noise.js.map +0 -1
  336. package/dist/src/shaders/pbr.js +0 -51
  337. package/dist/src/shaders/pbr.js.map +0 -1
  338. package/dist/src/shaders/shadow.js +0 -636
  339. package/dist/src/shaders/shadow.js.map +0 -1
  340. package/dist/src/shaders/ssr.js +0 -490
  341. package/dist/src/shaders/ssr.js.map +0 -1
  342. package/dist/src/shaders/temporal.js +0 -215
  343. package/dist/src/shaders/temporal.js.map +0 -1
  344. package/dist/src/shaders/water.js +0 -756
  345. package/dist/src/shaders/water.js.map +0 -1
  346. package/dist/src/shadow/esm.js +0 -237
  347. package/dist/src/shadow/esm.js.map +0 -1
  348. package/dist/src/shadow/pcf_opt.js +0 -181
  349. package/dist/src/shadow/pcf_opt.js.map +0 -1
  350. package/dist/src/shadow/pcf_pd.js +0 -189
  351. package/dist/src/shadow/pcf_pd.js.map +0 -1
  352. package/dist/src/shadow/shader.js +0 -37
  353. package/dist/src/shadow/shader.js.map +0 -1
  354. package/dist/src/shadow/shadow_impl.js +0 -15
  355. package/dist/src/shadow/shadow_impl.js.map +0 -1
  356. package/dist/src/shadow/shadowmapper.js +0 -790
  357. package/dist/src/shadow/shadowmapper.js.map +0 -1
  358. package/dist/src/shadow/ssm.js +0 -159
  359. package/dist/src/shadow/ssm.js.map +0 -1
  360. package/dist/src/shadow/vsm.js +0 -297
  361. package/dist/src/shadow/vsm.js.map +0 -1
  362. package/dist/src/shapes/box.js +0 -386
  363. package/dist/src/shapes/box.js.map +0 -1
  364. package/dist/src/shapes/cylinder.js +0 -125
  365. package/dist/src/shapes/cylinder.js.map +0 -1
  366. package/dist/src/shapes/plane.js +0 -88
  367. package/dist/src/shapes/plane.js.map +0 -1
  368. package/dist/src/shapes/shape.js +0 -87
  369. package/dist/src/shapes/shape.js.map +0 -1
  370. package/dist/src/shapes/sphere.js +0 -114
  371. package/dist/src/shapes/sphere.js.map +0 -1
  372. package/dist/src/shapes/tetrahedron.js +0 -188
  373. package/dist/src/shapes/tetrahedron.js.map +0 -1
  374. package/dist/src/shapes/torus.js +0 -111
  375. package/dist/src/shapes/torus.js.map +0 -1
  376. package/dist/src/utility/aabbtree.js +0 -400
  377. package/dist/src/utility/aabbtree.js.map +0 -1
  378. package/dist/src/utility/bounding_volume.js +0 -29
  379. package/dist/src/utility/bounding_volume.js.map +0 -1
  380. package/dist/src/utility/debug.js +0 -28
  381. package/dist/src/utility/debug.js.map +0 -1
  382. package/dist/src/utility/draco/decoder.js +0 -116
  383. package/dist/src/utility/draco/decoder.js.map +0 -1
  384. package/dist/src/utility/misc.js +0 -105
  385. package/dist/src/utility/misc.js.map +0 -1
  386. package/dist/src/utility/panorama.js +0 -163
  387. package/dist/src/utility/panorama.js.map +0 -1
  388. package/dist/src/utility/pmrem.js +0 -354
  389. package/dist/src/utility/pmrem.js.map +0 -1
  390. package/dist/src/utility/rendermipmap.js +0 -115
  391. package/dist/src/utility/rendermipmap.js.map +0 -1
  392. package/dist/src/utility/serialization/json.js +0 -402
  393. package/dist/src/utility/serialization/json.js.map +0 -1
  394. package/dist/src/utility/serialization/manager.js +0 -623
  395. package/dist/src/utility/serialization/manager.js.map +0 -1
  396. package/dist/src/utility/serialization/scene/animation.js +0 -248
  397. package/dist/src/utility/serialization/scene/animation.js.map +0 -1
  398. package/dist/src/utility/serialization/scene/batch.js +0 -59
  399. package/dist/src/utility/serialization/scene/batch.js.map +0 -1
  400. package/dist/src/utility/serialization/scene/camera.js +0 -790
  401. package/dist/src/utility/serialization/scene/camera.js.map +0 -1
  402. package/dist/src/utility/serialization/scene/common.js +0 -222
  403. package/dist/src/utility/serialization/scene/common.js.map +0 -1
  404. package/dist/src/utility/serialization/scene/light.js +0 -575
  405. package/dist/src/utility/serialization/scene/light.js.map +0 -1
  406. package/dist/src/utility/serialization/scene/material.js +0 -1111
  407. package/dist/src/utility/serialization/scene/material.js.map +0 -1
  408. package/dist/src/utility/serialization/scene/mesh.js +0 -148
  409. package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
  410. package/dist/src/utility/serialization/scene/misc.js +0 -39
  411. package/dist/src/utility/serialization/scene/misc.js.map +0 -1
  412. package/dist/src/utility/serialization/scene/node.js +0 -451
  413. package/dist/src/utility/serialization/scene/node.js.map +0 -1
  414. package/dist/src/utility/serialization/scene/particle.js +0 -425
  415. package/dist/src/utility/serialization/scene/particle.js.map +0 -1
  416. package/dist/src/utility/serialization/scene/primitive.js +0 -692
  417. package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
  418. package/dist/src/utility/serialization/scene/scene.js +0 -704
  419. package/dist/src/utility/serialization/scene/scene.js.map +0 -1
  420. package/dist/src/utility/serialization/scene/terrain.js +0 -488
  421. package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
  422. package/dist/src/utility/serialization/scene/water.js +0 -465
  423. package/dist/src/utility/serialization/scene/water.js.map +0 -1
  424. package/dist/src/utility/shprojector.js +0 -297
  425. package/dist/src/utility/shprojector.js.map +0 -1
  426. package/dist/src/utility/textures/ggxlut.js +0 -213
  427. package/dist/src/utility/textures/ggxlut.js.map +0 -1
  428. package/dist/src/utility/textures/gradientnoise.js +0 -62
  429. package/dist/src/utility/textures/gradientnoise.js.map +0 -1
  430. package/dist/src/utility/textures/randomnoise.js +0 -41
  431. package/dist/src/utility/textures/randomnoise.js.map +0 -1
  432. package/dist/src/values.js +0 -162
  433. package/dist/src/values.js.map +0 -1
  434. package/dist/utility/blueprint/material/common.js +0 -7
  435. package/dist/utility/blueprint/material/common.js.map +0 -1
  436. package/dist/utility/serialization/blueprint/constants.js +0 -255
  437. package/dist/utility/serialization/blueprint/constants.js.map +0 -1
  438. package/dist/utility/serialization/blueprint/material/constants.js +0 -203
  439. package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
  440. package/dist/utility/serialization/blueprint/material/texture.js +0 -165
  441. package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
@@ -0,0 +1,103 @@
1
+ import { Vector3, Quaternion } from '@zephyr3d/base';
2
+ import { createSpringParticle } from './spring_particle.js';
3
+ import { createSpringConstraint } from './spring_constraint.js';
4
+
5
+ /**
6
+ * Manages a chain of spring particles and constraints
7
+ *
8
+ * @public
9
+ */ class SpringChain {
10
+ /** Array of particles in the chain */ particles;
11
+ /** Array of constraints between particles */ constraints;
12
+ constructor(){
13
+ this.particles = [];
14
+ this.constraints = [];
15
+ }
16
+ /**
17
+ * Creates a spring chain from a bone hierarchy
18
+ * @param startNode - Root node of the bone chain
19
+ * @param endNode - End node of the bone chain (optional, if null uses all descendants)
20
+ * @param options - Additional options
21
+ * @returns A new SpringChain instance
22
+ */ static fromBoneChain(startNode, endNode = null, options) {
23
+ const chain = new SpringChain();
24
+ const mass = options?.mass ?? 1.0;
25
+ const damping = options?.damping ?? 0.95;
26
+ const stiffness = options?.stiffness ?? 0.8;
27
+ // Collect nodes from startNode to endNode
28
+ const nodes = [];
29
+ let current = startNode;
30
+ while(current){
31
+ nodes.push(current);
32
+ if (current === endNode) {
33
+ break;
34
+ }
35
+ if (current.children && current.children.length > 0) {
36
+ current = current.children[0].get();
37
+ } else {
38
+ break;
39
+ }
40
+ }
41
+ // Create particles for each bone
42
+ for(let i = 0; i < nodes.length; i++){
43
+ const node = nodes[i];
44
+ const worldPos = new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23);
45
+ // Get the original world rotation
46
+ const originalRotation = new Quaternion();
47
+ node.worldMatrix.decompose(null, originalRotation, null);
48
+ const particle = createSpringParticle(worldPos, {
49
+ mass,
50
+ damping,
51
+ fixed: i === 0,
52
+ node,
53
+ originalRotation
54
+ });
55
+ const particleIndex = chain.addParticle(particle);
56
+ // Create constraint with previous particle
57
+ if (i > 0) {
58
+ const prevIndex = particleIndex - 1;
59
+ const prevParticle = chain.particles[prevIndex];
60
+ const restLength = Vector3.distance(particle.position, prevParticle.position);
61
+ chain.addConstraint(createSpringConstraint(prevIndex, particleIndex, restLength, stiffness));
62
+ }
63
+ }
64
+ return chain;
65
+ }
66
+ /**
67
+ * Adds a particle to the chain
68
+ * @param particle - The particle to add
69
+ * @returns The index of the added particle
70
+ */ addParticle(particle) {
71
+ this.particles.push(particle);
72
+ return this.particles.length - 1;
73
+ }
74
+ /**
75
+ * Adds a constraint to the chain
76
+ * @param constraint - The constraint to add
77
+ */ addConstraint(constraint) {
78
+ this.constraints.push(constraint);
79
+ }
80
+ /**
81
+ * Adds cross constraints between particles for cloth-like behavior
82
+ * @param stiffness - Stiffness of the cross constraints
83
+ * @param skipDistance - Distance between particles to connect (default: 2)
84
+ */ addCrossConstraints(stiffness = 0.6, skipDistance = 2) {
85
+ for(let i = 0; i < this.particles.length - skipDistance; i++){
86
+ const pA = this.particles[i];
87
+ const pB = this.particles[i + skipDistance];
88
+ const restLength = Vector3.distance(pA.position, pB.position);
89
+ this.addConstraint(createSpringConstraint(i, i + skipDistance, restLength, stiffness));
90
+ }
91
+ }
92
+ /**
93
+ * Resets all particles to their original positions
94
+ */ reset() {
95
+ for (const particle of this.particles){
96
+ particle.position.set(particle.originalPosition);
97
+ particle.prevPosition.set(particle.originalPosition);
98
+ }
99
+ }
100
+ }
101
+
102
+ export { SpringChain };
103
+ //# sourceMappingURL=spring_chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring_chain.js","sources":["../../../src/animation/spring/spring_chain.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\nimport type { SpringParticle } from './spring_particle';\r\nimport { createSpringParticle } from './spring_particle';\r\nimport type { SpringConstraint } from './spring_constraint';\r\nimport { createSpringConstraint } from './spring_constraint';\r\n\r\n/**\r\n * Manages a chain of spring particles and constraints\r\n *\r\n * @public\r\n */\r\nexport class SpringChain {\r\n /** Array of particles in the chain */\r\n particles: SpringParticle[];\r\n /** Array of constraints between particles */\r\n constraints: SpringConstraint[];\r\n\r\n constructor() {\r\n this.particles = [];\r\n this.constraints = [];\r\n }\r\n\r\n /**\r\n * Creates a spring chain from a bone hierarchy\r\n * @param startNode - Root node of the bone chain\r\n * @param endNode - End node of the bone chain (optional, if null uses all descendants)\r\n * @param options - Additional options\r\n * @returns A new SpringChain instance\r\n */\r\n static fromBoneChain(\r\n startNode: SceneNode,\r\n endNode: SceneNode | null = null,\r\n options?: {\r\n mass?: number;\r\n damping?: number;\r\n stiffness?: number;\r\n }\r\n ): SpringChain {\r\n const chain = new SpringChain();\r\n const mass = options?.mass ?? 1.0;\r\n const damping = options?.damping ?? 0.95;\r\n const stiffness = options?.stiffness ?? 0.8;\r\n\r\n // Collect nodes from startNode to endNode\r\n const nodes: SceneNode[] = [];\r\n let current: SceneNode | null = startNode;\r\n\r\n while (current) {\r\n nodes.push(current);\r\n if (current === endNode) {\r\n break;\r\n }\r\n\r\n if (current.children && current.children.length > 0) {\r\n current = current.children[0].get();\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Create particles for each bone\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n const worldPos = new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23);\r\n\r\n // Get the original world rotation\r\n const originalRotation = new Quaternion();\r\n node.worldMatrix.decompose(null, originalRotation, null);\r\n\r\n const particle = createSpringParticle(worldPos, {\r\n mass,\r\n damping,\r\n fixed: i === 0, // First particle is fixed (anchor)\r\n node,\r\n originalRotation\r\n });\r\n\r\n const particleIndex = chain.addParticle(particle);\r\n\r\n // Create constraint with previous particle\r\n if (i > 0) {\r\n const prevIndex = particleIndex - 1;\r\n const prevParticle = chain.particles[prevIndex];\r\n const restLength = Vector3.distance(particle.position, prevParticle.position);\r\n\r\n chain.addConstraint(createSpringConstraint(prevIndex, particleIndex, restLength, stiffness));\r\n }\r\n }\r\n\r\n return chain;\r\n }\r\n\r\n /**\r\n * Adds a particle to the chain\r\n * @param particle - The particle to add\r\n * @returns The index of the added particle\r\n */\r\n addParticle(particle: SpringParticle): number {\r\n this.particles.push(particle);\r\n return this.particles.length - 1;\r\n }\r\n\r\n /**\r\n * Adds a constraint to the chain\r\n * @param constraint - The constraint to add\r\n */\r\n addConstraint(constraint: SpringConstraint): void {\r\n this.constraints.push(constraint);\r\n }\r\n\r\n /**\r\n * Adds cross constraints between particles for cloth-like behavior\r\n * @param stiffness - Stiffness of the cross constraints\r\n * @param skipDistance - Distance between particles to connect (default: 2)\r\n */\r\n addCrossConstraints(stiffness: number = 0.6, skipDistance: number = 2): void {\r\n for (let i = 0; i < this.particles.length - skipDistance; i++) {\r\n const pA = this.particles[i];\r\n const pB = this.particles[i + skipDistance];\r\n const restLength = Vector3.distance(pA.position, pB.position);\r\n\r\n this.addConstraint(createSpringConstraint(i, i + skipDistance, restLength, stiffness));\r\n }\r\n }\r\n\r\n /**\r\n * Resets all particles to their original positions\r\n */\r\n reset(): void {\r\n for (const particle of this.particles) {\r\n particle.position.set(particle.originalPosition);\r\n particle.prevPosition.set(particle.originalPosition);\r\n }\r\n }\r\n}\r\n"],"names":["SpringChain","particles","constraints","fromBoneChain","startNode","endNode","options","chain","mass","damping","stiffness","nodes","current","push","children","length","get","i","node","worldPos","Vector3","worldMatrix","m03","m13","m23","originalRotation","Quaternion","decompose","particle","createSpringParticle","fixed","particleIndex","addParticle","prevIndex","prevParticle","restLength","distance","position","addConstraint","createSpringConstraint","constraint","addCrossConstraints","skipDistance","pA","pB","reset","set","originalPosition","prevPosition"],"mappings":";;;;AAOA;;;;AAIC,IACM,MAAMA,WAAAA,CAAAA;AACX,2CACAC,SAA4B;AAC5B,kDACAC,WAAgC;IAEhC,WAAc,EAAA;QACZ,IAAI,CAACD,SAAS,GAAG,EAAE;QACnB,IAAI,CAACC,WAAW,GAAG,EAAE;AACvB;AAEA;;;;;;MAOA,OAAOC,cACLC,SAAoB,EACpBC,UAA4B,IAAI,EAChCC,OAIC,EACY;AACb,QAAA,MAAMC,QAAQ,IAAIP,WAAAA,EAAAA;QAClB,MAAMQ,IAAAA,GAAOF,SAASE,IAAQ,IAAA,GAAA;QAC9B,MAAMC,OAAAA,GAAUH,SAASG,OAAW,IAAA,IAAA;QACpC,MAAMC,SAAAA,GAAYJ,SAASI,SAAa,IAAA,GAAA;;AAGxC,QAAA,MAAMC,QAAqB,EAAE;AAC7B,QAAA,IAAIC,OAA4BR,GAAAA,SAAAA;AAEhC,QAAA,MAAOQ,OAAS,CAAA;AACdD,YAAAA,KAAAA,CAAME,IAAI,CAACD,OAAAA,CAAAA;AACX,YAAA,IAAIA,YAAYP,OAAS,EAAA;AACvB,gBAAA;AACF;YAEA,IAAIO,OAAAA,CAAQE,QAAQ,IAAIF,OAAAA,CAAQE,QAAQ,CAACC,MAAM,GAAG,CAAG,EAAA;AACnDH,gBAAAA,OAAAA,GAAUA,OAAQE,CAAAA,QAAQ,CAAC,CAAA,CAAE,CAACE,GAAG,EAAA;aAC5B,MAAA;AACL,gBAAA;AACF;AACF;;AAGA,QAAA,IAAK,IAAIC,CAAI,GAAA,CAAA,EAAGA,IAAIN,KAAMI,CAAAA,MAAM,EAAEE,CAAK,EAAA,CAAA;YACrC,MAAMC,IAAAA,GAAOP,KAAK,CAACM,CAAE,CAAA;AACrB,YAAA,MAAME,WAAW,IAAIC,OAAAA,CAAQF,IAAKG,CAAAA,WAAW,CAACC,GAAG,EAAEJ,IAAKG,CAAAA,WAAW,CAACE,GAAG,EAAEL,IAAKG,CAAAA,WAAW,CAACG,GAAG,CAAA;;AAG7F,YAAA,MAAMC,mBAAmB,IAAIC,UAAAA,EAAAA;AAC7BR,YAAAA,IAAAA,CAAKG,WAAW,CAACM,SAAS,CAAC,MAAMF,gBAAkB,EAAA,IAAA,CAAA;YAEnD,MAAMG,QAAAA,GAAWC,qBAAqBV,QAAU,EAAA;AAC9CX,gBAAAA,IAAAA;AACAC,gBAAAA,OAAAA;AACAqB,gBAAAA,KAAAA,EAAOb,CAAM,KAAA,CAAA;AACbC,gBAAAA,IAAAA;AACAO,gBAAAA;AACF,aAAA,CAAA;YAEA,MAAMM,aAAAA,GAAgBxB,KAAMyB,CAAAA,WAAW,CAACJ,QAAAA,CAAAA;;AAGxC,YAAA,IAAIX,IAAI,CAAG,EAAA;AACT,gBAAA,MAAMgB,YAAYF,aAAgB,GAAA,CAAA;AAClC,gBAAA,MAAMG,YAAe3B,GAAAA,KAAAA,CAAMN,SAAS,CAACgC,SAAU,CAAA;gBAC/C,MAAME,UAAAA,GAAaf,QAAQgB,QAAQ,CAACR,SAASS,QAAQ,EAAEH,aAAaG,QAAQ,CAAA;AAE5E9B,gBAAAA,KAAAA,CAAM+B,aAAa,CAACC,sBAAuBN,CAAAA,SAAAA,EAAWF,eAAeI,UAAYzB,EAAAA,SAAAA,CAAAA,CAAAA;AACnF;AACF;QAEA,OAAOH,KAAAA;AACT;AAEA;;;;MAKAyB,WAAAA,CAAYJ,QAAwB,EAAU;AAC5C,QAAA,IAAI,CAAC3B,SAAS,CAACY,IAAI,CAACe,QAAAA,CAAAA;AACpB,QAAA,OAAO,IAAI,CAAC3B,SAAS,CAACc,MAAM,GAAG,CAAA;AACjC;AAEA;;;MAIAuB,aAAAA,CAAcE,UAA4B,EAAQ;AAChD,QAAA,IAAI,CAACtC,WAAW,CAACW,IAAI,CAAC2B,UAAAA,CAAAA;AACxB;AAEA;;;;AAIC,MACDC,oBAAoB/B,SAAoB,GAAA,GAAG,EAAEgC,YAAAA,GAAuB,CAAC,EAAQ;QAC3E,IAAK,IAAIzB,CAAI,GAAA,CAAA,EAAGA,CAAI,GAAA,IAAI,CAAChB,SAAS,CAACc,MAAM,GAAG2B,YAAAA,EAAczB,CAAK,EAAA,CAAA;AAC7D,YAAA,MAAM0B,EAAK,GAAA,IAAI,CAAC1C,SAAS,CAACgB,CAAE,CAAA;AAC5B,YAAA,MAAM2B,KAAK,IAAI,CAAC3C,SAAS,CAACgB,IAAIyB,YAAa,CAAA;YAC3C,MAAMP,UAAAA,GAAaf,QAAQgB,QAAQ,CAACO,GAAGN,QAAQ,EAAEO,GAAGP,QAAQ,CAAA;AAE5D,YAAA,IAAI,CAACC,aAAa,CAACC,uBAAuBtB,CAAGA,EAAAA,CAAAA,GAAIyB,cAAcP,UAAYzB,EAAAA,SAAAA,CAAAA,CAAAA;AAC7E;AACF;AAEA;;AAEC,MACDmC,KAAc,GAAA;AACZ,QAAA,KAAK,MAAMjB,QAAAA,IAAY,IAAI,CAAC3B,SAAS,CAAE;AACrC2B,YAAAA,QAAAA,CAASS,QAAQ,CAACS,GAAG,CAAClB,SAASmB,gBAAgB,CAAA;AAC/CnB,YAAAA,QAAAA,CAASoB,YAAY,CAACF,GAAG,CAAClB,SAASmB,gBAAgB,CAAA;AACrD;AACF;AACF;;;;"}
@@ -0,0 +1,247 @@
1
+ import { Vector3 } from '@zephyr3d/base';
2
+
3
+ /**
4
+ * Creates a sphere collider
5
+ * @param centerOrOffset - Center position in world space, or local offset if node is provided
6
+ * @param radius - Radius of the sphere
7
+ * @param node - Optional scene node to attach to (if provided, centerOrOffset is treated as local offset)
8
+ *
9
+ * @public
10
+ */ function createSphereCollider(centerOrOffset, radius, node) {
11
+ if (node) {
12
+ // If node is provided, treat centerOrOffset as local offset
13
+ const worldMatrix = node.worldMatrix;
14
+ const worldCenter = new Vector3(worldMatrix.m03 + centerOrOffset.x, worldMatrix.m13 + centerOrOffset.y, worldMatrix.m23 + centerOrOffset.z);
15
+ return {
16
+ type: 'sphere',
17
+ center: worldCenter,
18
+ radius,
19
+ node,
20
+ enabled: true,
21
+ localOffset: centerOrOffset.clone()
22
+ };
23
+ } else {
24
+ // No node, use as world position
25
+ return {
26
+ type: 'sphere',
27
+ center: centerOrOffset.clone(),
28
+ radius,
29
+ node: null,
30
+ enabled: true
31
+ };
32
+ }
33
+ }
34
+ /**
35
+ * Creates a capsule collider
36
+ * @param startOrOffset - Start point in world space, or local offset if node is provided
37
+ * @param endOrOffset - End point in world space, or local offset if node is provided
38
+ * @param radius - Radius of the capsule
39
+ * @param node - Optional scene node to attach to (if provided, offsets are treated as local)
40
+ *
41
+ * @public
42
+ */ function createCapsuleCollider(startOrOffset, endOrOffset, radius, node) {
43
+ if (node) {
44
+ // If node is provided, treat as local offsets
45
+ const worldMatrix = node.worldMatrix;
46
+ const worldStart = new Vector3(worldMatrix.m03 + startOrOffset.x, worldMatrix.m13 + startOrOffset.y, worldMatrix.m23 + startOrOffset.z);
47
+ const worldEnd = new Vector3(worldMatrix.m03 + endOrOffset.x, worldMatrix.m13 + endOrOffset.y, worldMatrix.m23 + endOrOffset.z);
48
+ return {
49
+ type: 'capsule',
50
+ start: worldStart,
51
+ end: worldEnd,
52
+ radius,
53
+ node,
54
+ enabled: true,
55
+ localStartOffset: startOrOffset.clone(),
56
+ localEndOffset: endOrOffset.clone()
57
+ };
58
+ } else {
59
+ // No node, use as world positions
60
+ return {
61
+ type: 'capsule',
62
+ start: startOrOffset.clone(),
63
+ end: endOrOffset.clone(),
64
+ radius,
65
+ node: null,
66
+ enabled: true
67
+ };
68
+ }
69
+ }
70
+ /**
71
+ * Creates a plane collider
72
+ * @param pointOrOffset - Point on plane in world space, or local offset if node is provided
73
+ * @param normal - Normal vector (will be normalized)
74
+ * @param node - Optional scene node to attach to (if provided, pointOrOffset is treated as local offset)
75
+ *
76
+ * @public
77
+ */ function createPlaneCollider(pointOrOffset, normal, node) {
78
+ const normalizedNormal = new Vector3();
79
+ Vector3.normalize(normal, normalizedNormal);
80
+ if (node) {
81
+ // If node is provided, treat as local offset
82
+ const worldMatrix = node.worldMatrix;
83
+ const worldPoint = new Vector3(worldMatrix.m03 + pointOrOffset.x, worldMatrix.m13 + pointOrOffset.y, worldMatrix.m23 + pointOrOffset.z);
84
+ return {
85
+ type: 'plane',
86
+ point: worldPoint,
87
+ normal: normalizedNormal.clone(),
88
+ node,
89
+ enabled: true,
90
+ localPointOffset: pointOrOffset.clone(),
91
+ localNormal: normalizedNormal.clone()
92
+ };
93
+ } else {
94
+ // No node, use as world position
95
+ return {
96
+ type: 'plane',
97
+ point: pointOrOffset.clone(),
98
+ normal: normalizedNormal,
99
+ node: null,
100
+ enabled: true
101
+ };
102
+ }
103
+ }
104
+ /**
105
+ * Resolves collision between a particle and a sphere collider
106
+ * @returns true if collision occurred
107
+ *
108
+ * @public
109
+ */ function resolveSphereCollision(particlePos, collider) {
110
+ const toParticle = Vector3.sub(particlePos, collider.center, new Vector3());
111
+ const distSq = toParticle.magnitudeSq;
112
+ const radiusSq = collider.radius * collider.radius;
113
+ if (distSq < radiusSq && distSq > 0.0001) {
114
+ // Particle is inside sphere, push it out
115
+ const dist = Math.sqrt(distSq);
116
+ const penetration = collider.radius - dist;
117
+ // Push particle to sphere surface
118
+ Vector3.normalize(toParticle, toParticle);
119
+ toParticle.scaleBy(penetration);
120
+ Vector3.add(particlePos, toParticle, particlePos);
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ /**
126
+ * Resolves collision between a particle and a capsule collider
127
+ * @returns true if collision occurred
128
+ *
129
+ * @public
130
+ */ function resolveCapsuleCollision(particlePos, collider) {
131
+ // Find closest point on capsule axis
132
+ const axis = Vector3.sub(collider.end, collider.start, new Vector3());
133
+ const axisLength = axis.magnitude;
134
+ if (axisLength < 0.0001) {
135
+ // Degenerate capsule, treat as sphere
136
+ const toParticle = Vector3.sub(particlePos, collider.start, new Vector3());
137
+ const distSq = toParticle.magnitudeSq;
138
+ const radiusSq = collider.radius * collider.radius;
139
+ if (distSq < radiusSq && distSq > 0.0001) {
140
+ const dist = Math.sqrt(distSq);
141
+ const penetration = collider.radius - dist;
142
+ Vector3.normalize(toParticle, toParticle);
143
+ toParticle.scaleBy(penetration);
144
+ Vector3.add(particlePos, toParticle, particlePos);
145
+ return true;
146
+ }
147
+ return false;
148
+ }
149
+ Vector3.normalize(axis, axis);
150
+ const toParticle = Vector3.sub(particlePos, collider.start, new Vector3());
151
+ const projection = Vector3.dot(toParticle, axis);
152
+ // Clamp projection to capsule length
153
+ const t = Math.max(0, Math.min(axisLength, projection));
154
+ // Closest point on capsule axis
155
+ const closestPoint = Vector3.add(collider.start, Vector3.scale(axis, t, new Vector3()), new Vector3());
156
+ // Check distance from closest point
157
+ const toParticleFromAxis = Vector3.sub(particlePos, closestPoint, new Vector3());
158
+ const distSq = toParticleFromAxis.magnitudeSq;
159
+ const radiusSq = collider.radius * collider.radius;
160
+ if (distSq < radiusSq && distSq > 0.0001) {
161
+ const dist = Math.sqrt(distSq);
162
+ const penetration = collider.radius - dist;
163
+ Vector3.normalize(toParticleFromAxis, toParticleFromAxis);
164
+ toParticleFromAxis.scaleBy(penetration);
165
+ Vector3.add(particlePos, toParticleFromAxis, particlePos);
166
+ return true;
167
+ }
168
+ return false;
169
+ }
170
+ /**
171
+ * Resolves collision between a particle and a plane collider
172
+ * @returns true if collision occurred
173
+ *
174
+ * @public
175
+ */ function resolvePlaneCollision(particlePos, collider) {
176
+ const toParticle = Vector3.sub(particlePos, collider.point, new Vector3());
177
+ const distance = Vector3.dot(toParticle, collider.normal);
178
+ if (distance < 0) {
179
+ // Particle is below plane, push it up
180
+ const correction = Vector3.scale(collider.normal, -distance, new Vector3());
181
+ Vector3.add(particlePos, correction, particlePos);
182
+ return true;
183
+ }
184
+ return false;
185
+ }
186
+ /**
187
+ * Updates collider position from its associated node
188
+ *
189
+ * @public
190
+ */ function updateColliderFromNode(collider) {
191
+ if (!collider.node || !collider.enabled) {
192
+ return;
193
+ }
194
+ const worldMatrix = collider.node.worldMatrix;
195
+ switch(collider.type){
196
+ case 'sphere':
197
+ {
198
+ const sphere = collider;
199
+ if (sphere.localOffset) {
200
+ // Transform local offset to world space
201
+ worldMatrix.transformPointAffine(sphere.localOffset, sphere.center);
202
+ } else {
203
+ // No local offset, just use node position
204
+ sphere.center.x = worldMatrix.m03;
205
+ sphere.center.y = worldMatrix.m13;
206
+ sphere.center.z = worldMatrix.m23;
207
+ }
208
+ break;
209
+ }
210
+ case 'capsule':
211
+ {
212
+ const capsule = collider;
213
+ if (capsule.localStartOffset && capsule.localEndOffset) {
214
+ // Transform local offsets to world space
215
+ worldMatrix.transformPointAffine(capsule.localStartOffset, capsule.start);
216
+ worldMatrix.transformPointAffine(capsule.localEndOffset, capsule.end);
217
+ } else {
218
+ // No local offsets, just use node position for start
219
+ capsule.start.x = worldMatrix.m03;
220
+ capsule.start.y = worldMatrix.m13;
221
+ capsule.start.z = worldMatrix.m23;
222
+ }
223
+ break;
224
+ }
225
+ case 'plane':
226
+ {
227
+ const plane = collider;
228
+ if (plane.localPointOffset) {
229
+ // Transform local offset to world space
230
+ worldMatrix.transformPointAffine(plane.localPointOffset, plane.point);
231
+ } else {
232
+ // No local offset, just use node position
233
+ plane.point.x = worldMatrix.m03;
234
+ plane.point.y = worldMatrix.m13;
235
+ plane.point.z = worldMatrix.m23;
236
+ }
237
+ if (plane.localNormal) {
238
+ // Transform local normal to world space (rotation only)
239
+ worldMatrix.transformVectorAffine(plane.localNormal, plane.normal).inplaceNormalize;
240
+ }
241
+ break;
242
+ }
243
+ }
244
+ }
245
+
246
+ export { createCapsuleCollider, createPlaneCollider, createSphereCollider, resolveCapsuleCollision, resolvePlaneCollision, resolveSphereCollision, updateColliderFromNode };
247
+ //# sourceMappingURL=spring_collider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring_collider.js","sources":["../../../src/animation/spring/spring_collider.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Base interface for spring collision shapes\r\n *\r\n * @public\r\n */\r\nexport interface SpringCollider {\r\n /** Type of collider */\r\n type: 'sphere' | 'capsule' | 'plane';\r\n /** Associated scene node (optional, for dynamic colliders) */\r\n node?: Nullable<SceneNode>;\r\n /** Whether this collider is enabled */\r\n enabled: boolean;\r\n}\r\n\r\n/**\r\n * Sphere collider for spring collision detection\r\n *\r\n * @public\r\n */\r\nexport interface SphereCollider extends SpringCollider {\r\n type: 'sphere';\r\n /** Center position in world space */\r\n center: Vector3;\r\n /** Radius of the sphere */\r\n radius: number;\r\n /** Local offset from node (if node is set) */\r\n localOffset?: Vector3;\r\n}\r\n\r\n/**\r\n * Capsule collider for spring collision detection\r\n *\r\n * @public\r\n */\r\nexport interface CapsuleCollider extends SpringCollider {\r\n type: 'capsule';\r\n /** Start point of the capsule axis in world space */\r\n start: Vector3;\r\n /** End point of the capsule axis in world space */\r\n end: Vector3;\r\n /** Radius of the capsule */\r\n radius: number;\r\n /** Local start offset from node (if node is set) */\r\n localStartOffset?: Vector3;\r\n /** Local end offset from node (if node is set) */\r\n localEndOffset?: Vector3;\r\n}\r\n\r\n/**\r\n * Plane collider for spring collision detection\r\n *\r\n * @public\r\n */\r\nexport interface PlaneCollider extends SpringCollider {\r\n type: 'plane';\r\n /** Point on the plane in world space */\r\n point: Vector3;\r\n /** Normal vector of the plane (should be normalized) */\r\n normal: Vector3;\r\n /** Local point offset from node (if node is set) */\r\n localPointOffset?: Vector3;\r\n /** Local normal direction (if node is set) */\r\n localNormal?: Vector3;\r\n}\r\n\r\n/**\r\n * Creates a sphere collider\r\n * @param centerOrOffset - Center position in world space, or local offset if node is provided\r\n * @param radius - Radius of the sphere\r\n * @param node - Optional scene node to attach to (if provided, centerOrOffset is treated as local offset)\r\n *\r\n * @public\r\n */\r\nexport function createSphereCollider(\r\n centerOrOffset: Vector3,\r\n radius: number,\r\n node?: SceneNode\r\n): SphereCollider {\r\n if (node) {\r\n // If node is provided, treat centerOrOffset as local offset\r\n const worldMatrix = node.worldMatrix;\r\n const worldCenter = new Vector3(\r\n worldMatrix.m03 + centerOrOffset.x,\r\n worldMatrix.m13 + centerOrOffset.y,\r\n worldMatrix.m23 + centerOrOffset.z\r\n );\r\n\r\n return {\r\n type: 'sphere',\r\n center: worldCenter,\r\n radius,\r\n node,\r\n enabled: true,\r\n localOffset: centerOrOffset.clone()\r\n };\r\n } else {\r\n // No node, use as world position\r\n return {\r\n type: 'sphere',\r\n center: centerOrOffset.clone(),\r\n radius,\r\n node: null,\r\n enabled: true\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates a capsule collider\r\n * @param startOrOffset - Start point in world space, or local offset if node is provided\r\n * @param endOrOffset - End point in world space, or local offset if node is provided\r\n * @param radius - Radius of the capsule\r\n * @param node - Optional scene node to attach to (if provided, offsets are treated as local)\r\n *\r\n * @public\r\n */\r\nexport function createCapsuleCollider(\r\n startOrOffset: Vector3,\r\n endOrOffset: Vector3,\r\n radius: number,\r\n node?: SceneNode\r\n): CapsuleCollider {\r\n if (node) {\r\n // If node is provided, treat as local offsets\r\n const worldMatrix = node.worldMatrix;\r\n const worldStart = new Vector3(\r\n worldMatrix.m03 + startOrOffset.x,\r\n worldMatrix.m13 + startOrOffset.y,\r\n worldMatrix.m23 + startOrOffset.z\r\n );\r\n const worldEnd = new Vector3(\r\n worldMatrix.m03 + endOrOffset.x,\r\n worldMatrix.m13 + endOrOffset.y,\r\n worldMatrix.m23 + endOrOffset.z\r\n );\r\n\r\n return {\r\n type: 'capsule',\r\n start: worldStart,\r\n end: worldEnd,\r\n radius,\r\n node,\r\n enabled: true,\r\n localStartOffset: startOrOffset.clone(),\r\n localEndOffset: endOrOffset.clone()\r\n };\r\n } else {\r\n // No node, use as world positions\r\n return {\r\n type: 'capsule',\r\n start: startOrOffset.clone(),\r\n end: endOrOffset.clone(),\r\n radius,\r\n node: null,\r\n enabled: true\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates a plane collider\r\n * @param pointOrOffset - Point on plane in world space, or local offset if node is provided\r\n * @param normal - Normal vector (will be normalized)\r\n * @param node - Optional scene node to attach to (if provided, pointOrOffset is treated as local offset)\r\n *\r\n * @public\r\n */\r\nexport function createPlaneCollider(\r\n pointOrOffset: Vector3,\r\n normal: Vector3,\r\n node?: SceneNode\r\n): PlaneCollider {\r\n const normalizedNormal = new Vector3();\r\n Vector3.normalize(normal, normalizedNormal);\r\n\r\n if (node) {\r\n // If node is provided, treat as local offset\r\n const worldMatrix = node.worldMatrix;\r\n const worldPoint = new Vector3(\r\n worldMatrix.m03 + pointOrOffset.x,\r\n worldMatrix.m13 + pointOrOffset.y,\r\n worldMatrix.m23 + pointOrOffset.z\r\n );\r\n\r\n return {\r\n type: 'plane',\r\n point: worldPoint,\r\n normal: normalizedNormal.clone(),\r\n node,\r\n enabled: true,\r\n localPointOffset: pointOrOffset.clone(),\r\n localNormal: normalizedNormal.clone()\r\n };\r\n } else {\r\n // No node, use as world position\r\n return {\r\n type: 'plane',\r\n point: pointOrOffset.clone(),\r\n normal: normalizedNormal,\r\n node: null,\r\n enabled: true\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Resolves collision between a particle and a sphere collider\r\n * @returns true if collision occurred\r\n *\r\n * @public\r\n */\r\nexport function resolveSphereCollision(particlePos: Vector3, collider: SphereCollider): boolean {\r\n const toParticle = Vector3.sub(particlePos, collider.center, new Vector3());\r\n const distSq = toParticle.magnitudeSq;\r\n const radiusSq = collider.radius * collider.radius;\r\n\r\n if (distSq < radiusSq && distSq > 0.0001) {\r\n // Particle is inside sphere, push it out\r\n const dist = Math.sqrt(distSq);\r\n const penetration = collider.radius - dist;\r\n\r\n // Push particle to sphere surface\r\n Vector3.normalize(toParticle, toParticle);\r\n toParticle.scaleBy(penetration);\r\n Vector3.add(particlePos, toParticle, particlePos);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Resolves collision between a particle and a capsule collider\r\n * @returns true if collision occurred\r\n *\r\n * @public\r\n */\r\nexport function resolveCapsuleCollision(particlePos: Vector3, collider: CapsuleCollider): boolean {\r\n // Find closest point on capsule axis\r\n const axis = Vector3.sub(collider.end, collider.start, new Vector3());\r\n const axisLength = axis.magnitude;\r\n\r\n if (axisLength < 0.0001) {\r\n // Degenerate capsule, treat as sphere\r\n const toParticle = Vector3.sub(particlePos, collider.start, new Vector3());\r\n const distSq = toParticle.magnitudeSq;\r\n const radiusSq = collider.radius * collider.radius;\r\n\r\n if (distSq < radiusSq && distSq > 0.0001) {\r\n const dist = Math.sqrt(distSq);\r\n const penetration = collider.radius - dist;\r\n Vector3.normalize(toParticle, toParticle);\r\n toParticle.scaleBy(penetration);\r\n Vector3.add(particlePos, toParticle, particlePos);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n Vector3.normalize(axis, axis);\r\n\r\n const toParticle = Vector3.sub(particlePos, collider.start, new Vector3());\r\n const projection = Vector3.dot(toParticle, axis);\r\n\r\n // Clamp projection to capsule length\r\n const t = Math.max(0, Math.min(axisLength, projection));\r\n\r\n // Closest point on capsule axis\r\n const closestPoint = Vector3.add(collider.start, Vector3.scale(axis, t, new Vector3()), new Vector3());\r\n\r\n // Check distance from closest point\r\n const toParticleFromAxis = Vector3.sub(particlePos, closestPoint, new Vector3());\r\n const distSq = toParticleFromAxis.magnitudeSq;\r\n const radiusSq = collider.radius * collider.radius;\r\n\r\n if (distSq < radiusSq && distSq > 0.0001) {\r\n const dist = Math.sqrt(distSq);\r\n const penetration = collider.radius - dist;\r\n Vector3.normalize(toParticleFromAxis, toParticleFromAxis);\r\n toParticleFromAxis.scaleBy(penetration);\r\n Vector3.add(particlePos, toParticleFromAxis, particlePos);\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Resolves collision between a particle and a plane collider\r\n * @returns true if collision occurred\r\n *\r\n * @public\r\n */\r\nexport function resolvePlaneCollision(particlePos: Vector3, collider: PlaneCollider): boolean {\r\n const toParticle = Vector3.sub(particlePos, collider.point, new Vector3());\r\n const distance = Vector3.dot(toParticle, collider.normal);\r\n\r\n if (distance < 0) {\r\n // Particle is below plane, push it up\r\n const correction = Vector3.scale(collider.normal, -distance, new Vector3());\r\n Vector3.add(particlePos, correction, particlePos);\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Updates collider position from its associated node\r\n *\r\n * @public\r\n */\r\nexport function updateColliderFromNode(collider: SpringCollider): void {\r\n if (!collider.node || !collider.enabled) {\r\n return;\r\n }\r\n\r\n const worldMatrix = collider.node.worldMatrix;\r\n\r\n switch (collider.type) {\r\n case 'sphere': {\r\n const sphere = collider as SphereCollider;\r\n if (sphere.localOffset) {\r\n // Transform local offset to world space\r\n worldMatrix.transformPointAffine(sphere.localOffset, sphere.center);\r\n } else {\r\n // No local offset, just use node position\r\n sphere.center.x = worldMatrix.m03;\r\n sphere.center.y = worldMatrix.m13;\r\n sphere.center.z = worldMatrix.m23;\r\n }\r\n break;\r\n }\r\n\r\n case 'capsule': {\r\n const capsule = collider as CapsuleCollider;\r\n if (capsule.localStartOffset && capsule.localEndOffset) {\r\n // Transform local offsets to world space\r\n worldMatrix.transformPointAffine(capsule.localStartOffset, capsule.start);\r\n worldMatrix.transformPointAffine(capsule.localEndOffset, capsule.end);\r\n } else {\r\n // No local offsets, just use node position for start\r\n capsule.start.x = worldMatrix.m03;\r\n capsule.start.y = worldMatrix.m13;\r\n capsule.start.z = worldMatrix.m23;\r\n }\r\n break;\r\n }\r\n\r\n case 'plane': {\r\n const plane = collider as PlaneCollider;\r\n if (plane.localPointOffset) {\r\n // Transform local offset to world space\r\n worldMatrix.transformPointAffine(plane.localPointOffset, plane.point);\r\n } else {\r\n // No local offset, just use node position\r\n plane.point.x = worldMatrix.m03;\r\n plane.point.y = worldMatrix.m13;\r\n plane.point.z = worldMatrix.m23;\r\n }\r\n\r\n if (plane.localNormal) {\r\n // Transform local normal to world space (rotation only)\r\n worldMatrix.transformVectorAffine(plane.localNormal, plane.normal).inplaceNormalize;\r\n }\r\n break;\r\n }\r\n }\r\n}\r\n"],"names":["createSphereCollider","centerOrOffset","radius","node","worldMatrix","worldCenter","Vector3","m03","x","m13","y","m23","z","type","center","enabled","localOffset","clone","createCapsuleCollider","startOrOffset","endOrOffset","worldStart","worldEnd","start","end","localStartOffset","localEndOffset","createPlaneCollider","pointOrOffset","normal","normalizedNormal","normalize","worldPoint","point","localPointOffset","localNormal","resolveSphereCollision","particlePos","collider","toParticle","sub","distSq","magnitudeSq","radiusSq","dist","Math","sqrt","penetration","scaleBy","add","resolveCapsuleCollision","axis","axisLength","magnitude","projection","dot","t","max","min","closestPoint","scale","toParticleFromAxis","resolvePlaneCollision","distance","correction","updateColliderFromNode","sphere","transformPointAffine","capsule","plane","transformVectorAffine","inplaceNormalize"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Represents a spring constraint between two particles
3
+ *
4
+ * @public
5
+ */ /**
6
+ * Creates a new spring constraint
7
+ *
8
+ * @public
9
+ */ function createSpringConstraint(particleA, particleB, restLength, stiffness = 0.8, compliance = 0) {
10
+ return {
11
+ particleA,
12
+ particleB,
13
+ restLength,
14
+ stiffness,
15
+ compliance,
16
+ lambda: 0
17
+ };
18
+ }
19
+
20
+ export { createSpringConstraint };
21
+ //# sourceMappingURL=spring_constraint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring_constraint.js","sources":["../../../src/animation/spring/spring_constraint.ts"],"sourcesContent":["/**\r\n * Represents a spring constraint between two particles\r\n *\r\n * @public\r\n */\r\nexport interface SpringConstraint {\r\n /** Index of the first particle */\r\n particleA: number;\r\n /** Index of the second particle */\r\n particleB: number;\r\n /** Rest length of the spring */\r\n restLength: number;\r\n /** Stiffness coefficient [0-1] used by Verlet solver (0 = no constraint, 1 = rigid) */\r\n stiffness: number;\r\n /**\r\n * XPBD compliance (inverse stiffness) in m/N.\r\n * 0 = perfectly rigid, larger values = softer spring.\r\n * Typical ranges: 0 (rigid) ~ 1e-7 (very stiff) ~ 1e-3 (soft cloth) ~ 1e-1 (rubber band).\r\n * Only used when solver is 'xpbd'.\r\n */\r\n compliance: number;\r\n /**\r\n * XPBD Lagrange multiplier accumulator, reset to 0 at the start of each time step.\r\n * Managed internally by the solver — do not set manually.\r\n */\r\n lambda: number;\r\n}\r\n\r\n/**\r\n * Creates a new spring constraint\r\n *\r\n * @public\r\n */\r\nexport function createSpringConstraint(\r\n particleA: number,\r\n particleB: number,\r\n restLength: number,\r\n stiffness: number = 0.8,\r\n compliance: number = 0\r\n): SpringConstraint {\r\n return {\r\n particleA,\r\n particleB,\r\n restLength,\r\n stiffness,\r\n compliance,\r\n lambda: 0\r\n };\r\n}\r\n"],"names":["createSpringConstraint","particleA","particleB","restLength","stiffness","compliance","lambda"],"mappings":"AAAA;;;;;;;;AAgCC,IACM,SAASA,sBACdC,CAAAA,SAAiB,EACjBC,SAAiB,EACjBC,UAAkB,EAClBC,SAAAA,GAAoB,GAAG,EACvBC,aAAqB,CAAC,EAAA;IAEtB,OAAO;AACLJ,QAAAA,SAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,UAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,UAAAA;QACAC,MAAQ,EAAA;AACV,KAAA;AACF;;;;"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Creates a new spring particle
3
+ *
4
+ * @public
5
+ */ function createSpringParticle(position, options) {
6
+ return {
7
+ position: position.clone(),
8
+ prevPosition: position.clone(),
9
+ originalPosition: position.clone(),
10
+ originalRotation: options?.originalRotation?.clone() ?? null,
11
+ mass: options?.mass ?? 1.0,
12
+ damping: options?.damping ?? 0.95,
13
+ fixed: options?.fixed ?? false,
14
+ node: options?.node ?? null,
15
+ lastFramePosition: position.clone()
16
+ };
17
+ }
18
+
19
+ export { createSpringParticle };
20
+ //# sourceMappingURL=spring_particle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring_particle.js","sources":["../../../src/animation/spring/spring_particle.ts"],"sourcesContent":["import type { Vector3, Quaternion, Nullable } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Represents a particle in the spring system\r\n *\r\n * @public\r\n */\r\nexport interface SpringParticle {\r\n /** Current position in world space */\r\n position: Vector3;\r\n /** Previous position for Verlet integration */\r\n prevPosition: Vector3;\r\n /** Original position for reset */\r\n originalPosition: Vector3;\r\n /** Original world rotation (for calculating rotation delta) */\r\n originalRotation: Quaternion | null;\r\n /** Mass of the particle (affects inertia) */\r\n mass: number;\r\n /** Damping coefficient [0-1] (0 = no damping, 1 = full damping) */\r\n damping: number;\r\n /** Whether this particle is fixed (anchor point) */\r\n fixed: boolean;\r\n /** Associated scene node (optional) */\r\n node: Nullable<SceneNode>;\r\n /** Previous frame position (used to calculate velocity for inertial forces) */\r\n lastFramePosition: Vector3;\r\n /** Position history for rotation center estimation (for fixed particles) */\r\n positionHistory?: Vector3[];\r\n}\r\n\r\n/**\r\n * Creates a new spring particle\r\n *\r\n * @public\r\n */\r\nexport function createSpringParticle(\r\n position: Vector3,\r\n options?: {\r\n mass?: number;\r\n damping?: number;\r\n fixed?: boolean;\r\n node?: SceneNode;\r\n originalRotation?: Quaternion;\r\n }\r\n): SpringParticle {\r\n return {\r\n position: position.clone(),\r\n prevPosition: position.clone(),\r\n originalPosition: position.clone(),\r\n originalRotation: options?.originalRotation?.clone() ?? null,\r\n mass: options?.mass ?? 1.0,\r\n damping: options?.damping ?? 0.95,\r\n fixed: options?.fixed ?? false,\r\n node: options?.node ?? null,\r\n lastFramePosition: position.clone()\r\n };\r\n}\r\n"],"names":["createSpringParticle","position","options","clone","prevPosition","originalPosition","originalRotation","mass","damping","fixed","node","lastFramePosition"],"mappings":"AA+BA;;;;AAIC,IACM,SAASA,oBACdC,CAAAA,QAAiB,EACjBC,OAMC,EAAA;IAED,OAAO;AACLD,QAAAA,QAAAA,EAAUA,SAASE,KAAK,EAAA;AACxBC,QAAAA,YAAAA,EAAcH,SAASE,KAAK,EAAA;AAC5BE,QAAAA,gBAAAA,EAAkBJ,SAASE,KAAK,EAAA;QAChCG,gBAAkBJ,EAAAA,OAAAA,EAASI,kBAAkBH,KAAW,EAAA,IAAA,IAAA;AACxDI,QAAAA,IAAAA,EAAML,SAASK,IAAQ,IAAA,GAAA;AACvBC,QAAAA,OAAAA,EAASN,SAASM,OAAW,IAAA,IAAA;AAC7BC,QAAAA,KAAAA,EAAOP,SAASO,KAAS,IAAA,KAAA;AACzBC,QAAAA,IAAAA,EAAMR,SAASQ,IAAQ,IAAA,IAAA;AACvBC,QAAAA,iBAAAA,EAAmBV,SAASE,KAAK;AACnC,KAAA;AACF;;;;"}