@zephyr3d/scene 0.8.0 → 0.8.2

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 (389) hide show
  1. package/dist/animation/animationset.js +220 -1
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/ik/ccd_solver.js +3 -4
  4. package/dist/animation/ik/ccd_solver.js.map +1 -1
  5. package/dist/animation/ik/fabrik_solver.js +3 -4
  6. package/dist/animation/ik/fabrik_solver.js.map +1 -1
  7. package/dist/animation/ik/ik_pole_constraint.js +7 -2
  8. package/dist/animation/ik/ik_pole_constraint.js.map +1 -1
  9. package/dist/animation/ik/ik_utils.js +0 -79
  10. package/dist/animation/ik/ik_utils.js.map +1 -1
  11. package/dist/animation/ik/two_bone_ik_solver.js +3 -4
  12. package/dist/animation/ik/two_bone_ik_solver.js.map +1 -1
  13. package/dist/animation/skeleton.js +157 -125
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/spring_bone.js +240 -0
  16. package/dist/animation/spring/spring_bone.js.map +1 -0
  17. package/dist/animation/spring/spring_bone_collider.js +198 -0
  18. package/dist/animation/spring/spring_bone_collider.js.map +1 -0
  19. package/dist/animation/spring/spring_bone_constraint.js +170 -0
  20. package/dist/animation/spring/spring_bone_constraint.js.map +1 -0
  21. package/dist/animation/spring/spring_bone_system.js +328 -0
  22. package/dist/animation/spring/spring_bone_system.js.map +1 -0
  23. package/dist/asset/model.js +2 -2
  24. package/dist/index.d.ts +17 -0
  25. package/dist/material/mixins/pbr/common.js +20 -17
  26. package/dist/material/mixins/pbr/common.js.map +1 -1
  27. package/dist/render/gpu_picking.js +100 -0
  28. package/dist/render/gpu_picking.js.map +1 -0
  29. package/dist/render/rendergraph/device_pool_allocator.js +41 -0
  30. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -0
  31. package/dist/render/rendergraph/executor.js +146 -0
  32. package/dist/render/rendergraph/executor.js.map +1 -0
  33. package/dist/render/rendergraph/forward_plus_builder.js +414 -0
  34. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -0
  35. package/dist/render/rendergraph/rendergraph.js +306 -0
  36. package/dist/render/rendergraph/rendergraph.js.map +1 -0
  37. package/dist/render/rendergraph/types.js +57 -0
  38. package/dist/render/rendergraph/types.js.map +1 -0
  39. package/dist/render/sky_motion_vector.js +85 -0
  40. package/dist/render/sky_motion_vector.js.map +1 -0
  41. package/dist/utility/serialization/scene/animation.js +3 -3
  42. package/dist/utility/serialization/scene/node.js +1 -1
  43. package/package.json +2 -2
  44. package/dist/animation/ik/ik_chain_builder.js +0 -68
  45. package/dist/animation/ik/ik_chain_builder.js.map +0 -1
  46. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
  47. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
  48. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
  49. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
  50. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
  51. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
  52. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
  53. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
  54. package/dist/src/animation/animation.js +0 -127
  55. package/dist/src/animation/animation.js.map +0 -1
  56. package/dist/src/animation/animationset.js +0 -255
  57. package/dist/src/animation/animationset.js.map +0 -1
  58. package/dist/src/animation/animationtrack.js +0 -34
  59. package/dist/src/animation/animationtrack.js.map +0 -1
  60. package/dist/src/animation/eulerrotationtrack.js +0 -52
  61. package/dist/src/animation/eulerrotationtrack.js.map +0 -1
  62. package/dist/src/animation/morphtarget.js +0 -93
  63. package/dist/src/animation/morphtarget.js.map +0 -1
  64. package/dist/src/animation/morphtrack.js +0 -70
  65. package/dist/src/animation/morphtrack.js.map +0 -1
  66. package/dist/src/animation/proptrack.js +0 -161
  67. package/dist/src/animation/proptrack.js.map +0 -1
  68. package/dist/src/animation/rotationtrack.js +0 -51
  69. package/dist/src/animation/rotationtrack.js.map +0 -1
  70. package/dist/src/animation/scaletrack.js +0 -50
  71. package/dist/src/animation/scaletrack.js.map +0 -1
  72. package/dist/src/animation/skeleton.js +0 -204
  73. package/dist/src/animation/skeleton.js.map +0 -1
  74. package/dist/src/animation/translationtrack.js +0 -50
  75. package/dist/src/animation/translationtrack.js.map +0 -1
  76. package/dist/src/app/app.js +0 -129
  77. package/dist/src/app/app.js.map +0 -1
  78. package/dist/src/app/inputmgr.js +0 -267
  79. package/dist/src/app/inputmgr.js.map +0 -1
  80. package/dist/src/asset/assetmanager.js +0 -404
  81. package/dist/src/asset/assetmanager.js.map +0 -1
  82. package/dist/src/asset/builtin.js +0 -337
  83. package/dist/src/asset/builtin.js.map +0 -1
  84. package/dist/src/asset/loaders/dds/dds.js +0 -470
  85. package/dist/src/asset/loaders/dds/dds.js.map +0 -1
  86. package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
  87. package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
  88. package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
  89. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
  90. package/dist/src/asset/loaders/gltf/helpers.js +0 -327
  91. package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
  92. package/dist/src/asset/loaders/hdr/hdr.js +0 -180
  93. package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
  94. package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
  95. package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
  96. package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
  97. package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
  98. package/dist/src/asset/loaders/loader.js +0 -45
  99. package/dist/src/asset/loaders/loader.js.map +0 -1
  100. package/dist/src/asset/model.js +0 -414
  101. package/dist/src/asset/model.js.map +0 -1
  102. package/dist/src/blitter/bilateralblur.js +0 -221
  103. package/dist/src/blitter/bilateralblur.js.map +0 -1
  104. package/dist/src/blitter/blitter.js +0 -390
  105. package/dist/src/blitter/blitter.js.map +0 -1
  106. package/dist/src/blitter/box.js +0 -118
  107. package/dist/src/blitter/box.js.map +0 -1
  108. package/dist/src/blitter/copy.js +0 -22
  109. package/dist/src/blitter/copy.js.map +0 -1
  110. package/dist/src/blitter/gaussianblur.js +0 -228
  111. package/dist/src/blitter/gaussianblur.js.map +0 -1
  112. package/dist/src/camera/base.js +0 -92
  113. package/dist/src/camera/base.js.map +0 -1
  114. package/dist/src/camera/camera.js +0 -1005
  115. package/dist/src/camera/camera.js.map +0 -1
  116. package/dist/src/camera/fps.js +0 -238
  117. package/dist/src/camera/fps.js.map +0 -1
  118. package/dist/src/camera/orbit.js +0 -245
  119. package/dist/src/camera/orbit.js.map +0 -1
  120. package/dist/src/camera/orthocamera.js +0 -167
  121. package/dist/src/camera/orthocamera.js.map +0 -1
  122. package/dist/src/camera/perspectivecamera.js +0 -141
  123. package/dist/src/camera/perspectivecamera.js.map +0 -1
  124. package/dist/src/index.js +0 -120
  125. package/dist/src/index.js.map +0 -1
  126. package/dist/src/material/blinn.js +0 -81
  127. package/dist/src/material/blinn.js.map +0 -1
  128. package/dist/src/material/grassmaterial.js +0 -113
  129. package/dist/src/material/grassmaterial.js.map +0 -1
  130. package/dist/src/material/lambert.js +0 -92
  131. package/dist/src/material/lambert.js.map +0 -1
  132. package/dist/src/material/material.js +0 -301
  133. package/dist/src/material/material.js.map +0 -1
  134. package/dist/src/material/meshmaterial.js +0 -704
  135. package/dist/src/material/meshmaterial.js.map +0 -1
  136. package/dist/src/material/mixins/albedocolor.js +0 -76
  137. package/dist/src/material/mixins/albedocolor.js.map +0 -1
  138. package/dist/src/material/mixins/foliage.js +0 -47
  139. package/dist/src/material/mixins/foliage.js.map +0 -1
  140. package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
  141. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
  142. package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
  143. package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
  144. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
  145. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
  146. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
  147. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
  148. package/dist/src/material/mixins/lit.js +0 -476
  149. package/dist/src/material/mixins/lit.js.map +0 -1
  150. package/dist/src/material/mixins/pbr/common.js +0 -918
  151. package/dist/src/material/mixins/pbr/common.js.map +0 -1
  152. package/dist/src/material/mixins/texture.js +0 -172
  153. package/dist/src/material/mixins/texture.js.map +0 -1
  154. package/dist/src/material/mixins/vertexcolor.js +0 -56
  155. package/dist/src/material/mixins/vertexcolor.js.map +0 -1
  156. package/dist/src/material/particle.js +0 -178
  157. package/dist/src/material/particle.js.map +0 -1
  158. package/dist/src/material/pbrmr.js +0 -97
  159. package/dist/src/material/pbrmr.js.map +0 -1
  160. package/dist/src/material/pbrsg.js +0 -97
  161. package/dist/src/material/pbrsg.js.map +0 -1
  162. package/dist/src/material/shader/helper.js +0 -1209
  163. package/dist/src/material/shader/helper.js.map +0 -1
  164. package/dist/src/material/terrain-cm.js +0 -606
  165. package/dist/src/material/terrain-cm.js.map +0 -1
  166. package/dist/src/material/terrainmaterial.js +0 -375
  167. package/dist/src/material/terrainmaterial.js.map +0 -1
  168. package/dist/src/material/unlit.js +0 -41
  169. package/dist/src/material/unlit.js.map +0 -1
  170. package/dist/src/material/water.js +0 -417
  171. package/dist/src/material/water.js.map +0 -1
  172. package/dist/src/posteffect/bloom.js +0 -361
  173. package/dist/src/posteffect/bloom.js.map +0 -1
  174. package/dist/src/posteffect/compositor.js +0 -226
  175. package/dist/src/posteffect/compositor.js.map +0 -1
  176. package/dist/src/posteffect/fxaa.js +0 -273
  177. package/dist/src/posteffect/fxaa.js.map +0 -1
  178. package/dist/src/posteffect/grayscale.js +0 -69
  179. package/dist/src/posteffect/grayscale.js.map +0 -1
  180. package/dist/src/posteffect/motionblur.js +0 -96
  181. package/dist/src/posteffect/motionblur.js.map +0 -1
  182. package/dist/src/posteffect/posteffect.js +0 -126
  183. package/dist/src/posteffect/posteffect.js.map +0 -1
  184. package/dist/src/posteffect/sao.js +0 -324
  185. package/dist/src/posteffect/sao.js.map +0 -1
  186. package/dist/src/posteffect/ssr.js +0 -489
  187. package/dist/src/posteffect/ssr.js.map +0 -1
  188. package/dist/src/posteffect/taa.js +0 -172
  189. package/dist/src/posteffect/taa.js.map +0 -1
  190. package/dist/src/posteffect/tonemap.js +0 -94
  191. package/dist/src/posteffect/tonemap.js.map +0 -1
  192. package/dist/src/render/abuffer_oit.js +0 -361
  193. package/dist/src/render/abuffer_oit.js.map +0 -1
  194. package/dist/src/render/clipmap.js +0 -851
  195. package/dist/src/render/clipmap.js.map +0 -1
  196. package/dist/src/render/cluster_light.js +0 -333
  197. package/dist/src/render/cluster_light.js.map +0 -1
  198. package/dist/src/render/cull_visitor.js +0 -187
  199. package/dist/src/render/cull_visitor.js.map +0 -1
  200. package/dist/src/render/depthpass.js +0 -68
  201. package/dist/src/render/depthpass.js.map +0 -1
  202. package/dist/src/render/drawable_mixin.js +0 -227
  203. package/dist/src/render/drawable_mixin.js.map +0 -1
  204. package/dist/src/render/envlight.js +0 -463
  205. package/dist/src/render/envlight.js.map +0 -1
  206. package/dist/src/render/fbm_wavegenerator.js +0 -251
  207. package/dist/src/render/fbm_wavegenerator.js.map +0 -1
  208. package/dist/src/render/fft_wavegenerator.js +0 -1006
  209. package/dist/src/render/fft_wavegenerator.js.map +0 -1
  210. package/dist/src/render/fullscreenquad.js +0 -38
  211. package/dist/src/render/fullscreenquad.js.map +0 -1
  212. package/dist/src/render/gerstner_wavegenerator.js +0 -314
  213. package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
  214. package/dist/src/render/globalbindgroup_allocator.js +0 -60
  215. package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
  216. package/dist/src/render/hzb.js +0 -273
  217. package/dist/src/render/hzb.js.map +0 -1
  218. package/dist/src/render/lightpass.js +0 -172
  219. package/dist/src/render/lightpass.js.map +0 -1
  220. package/dist/src/render/objectcolorpass.js +0 -51
  221. package/dist/src/render/objectcolorpass.js.map +0 -1
  222. package/dist/src/render/primitive.js +0 -364
  223. package/dist/src/render/primitive.js.map +0 -1
  224. package/dist/src/render/render_queue.js +0 -467
  225. package/dist/src/render/render_queue.js.map +0 -1
  226. package/dist/src/render/renderbundle_wrapper.js +0 -152
  227. package/dist/src/render/renderbundle_wrapper.js.map +0 -1
  228. package/dist/src/render/renderer.js +0 -455
  229. package/dist/src/render/renderer.js.map +0 -1
  230. package/dist/src/render/renderpass.js +0 -200
  231. package/dist/src/render/renderpass.js.map +0 -1
  232. package/dist/src/render/shadowmap_pass.js +0 -56
  233. package/dist/src/render/shadowmap_pass.js.map +0 -1
  234. package/dist/src/render/sky.js +0 -1103
  235. package/dist/src/render/sky.js.map +0 -1
  236. package/dist/src/render/weightedblended_oit.js +0 -168
  237. package/dist/src/render/weightedblended_oit.js.map +0 -1
  238. package/dist/src/scene/batchgroup.js +0 -162
  239. package/dist/src/scene/batchgroup.js.map +0 -1
  240. package/dist/src/scene/environment.js +0 -209
  241. package/dist/src/scene/environment.js.map +0 -1
  242. package/dist/src/scene/graph_node.js +0 -72
  243. package/dist/src/scene/graph_node.js.map +0 -1
  244. package/dist/src/scene/light.js +0 -416
  245. package/dist/src/scene/light.js.map +0 -1
  246. package/dist/src/scene/mesh.js +0 -341
  247. package/dist/src/scene/mesh.js.map +0 -1
  248. package/dist/src/scene/octree.js +0 -649
  249. package/dist/src/scene/octree.js.map +0 -1
  250. package/dist/src/scene/particlesys.js +0 -738
  251. package/dist/src/scene/particlesys.js.map +0 -1
  252. package/dist/src/scene/raycast_visitor.js +0 -103
  253. package/dist/src/scene/raycast_visitor.js.map +0 -1
  254. package/dist/src/scene/scene.js +0 -284
  255. package/dist/src/scene/scene.js.map +0 -1
  256. package/dist/src/scene/scene_node.js +0 -732
  257. package/dist/src/scene/scene_node.js.map +0 -1
  258. package/dist/src/scene/terrain/grass.js +0 -278
  259. package/dist/src/scene/terrain/grass.js.map +0 -1
  260. package/dist/src/scene/terrain/heightfield.js +0 -475
  261. package/dist/src/scene/terrain/heightfield.js.map +0 -1
  262. package/dist/src/scene/terrain/patch.js +0 -530
  263. package/dist/src/scene/terrain/patch.js.map +0 -1
  264. package/dist/src/scene/terrain/quadtree.js +0 -461
  265. package/dist/src/scene/terrain/quadtree.js.map +0 -1
  266. package/dist/src/scene/terrain/terrain.js +0 -246
  267. package/dist/src/scene/terrain/terrain.js.map +0 -1
  268. package/dist/src/scene/terrain-cm/grass.js +0 -594
  269. package/dist/src/scene/terrain-cm/grass.js.map +0 -1
  270. package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
  271. package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
  272. package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
  273. package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
  274. package/dist/src/scene/water.js +0 -374
  275. package/dist/src/scene/water.js.map +0 -1
  276. package/dist/src/shaders/atmosphere.js +0 -957
  277. package/dist/src/shaders/atmosphere.js.map +0 -1
  278. package/dist/src/shaders/fog.js +0 -112
  279. package/dist/src/shaders/fog.js.map +0 -1
  280. package/dist/src/shaders/misc.js +0 -266
  281. package/dist/src/shaders/misc.js.map +0 -1
  282. package/dist/src/shaders/noise.js +0 -222
  283. package/dist/src/shaders/noise.js.map +0 -1
  284. package/dist/src/shaders/pbr.js +0 -51
  285. package/dist/src/shaders/pbr.js.map +0 -1
  286. package/dist/src/shaders/shadow.js +0 -636
  287. package/dist/src/shaders/shadow.js.map +0 -1
  288. package/dist/src/shaders/ssr.js +0 -490
  289. package/dist/src/shaders/ssr.js.map +0 -1
  290. package/dist/src/shaders/temporal.js +0 -215
  291. package/dist/src/shaders/temporal.js.map +0 -1
  292. package/dist/src/shaders/water.js +0 -756
  293. package/dist/src/shaders/water.js.map +0 -1
  294. package/dist/src/shadow/esm.js +0 -237
  295. package/dist/src/shadow/esm.js.map +0 -1
  296. package/dist/src/shadow/pcf_opt.js +0 -181
  297. package/dist/src/shadow/pcf_opt.js.map +0 -1
  298. package/dist/src/shadow/pcf_pd.js +0 -189
  299. package/dist/src/shadow/pcf_pd.js.map +0 -1
  300. package/dist/src/shadow/shader.js +0 -37
  301. package/dist/src/shadow/shader.js.map +0 -1
  302. package/dist/src/shadow/shadow_impl.js +0 -15
  303. package/dist/src/shadow/shadow_impl.js.map +0 -1
  304. package/dist/src/shadow/shadowmapper.js +0 -790
  305. package/dist/src/shadow/shadowmapper.js.map +0 -1
  306. package/dist/src/shadow/ssm.js +0 -159
  307. package/dist/src/shadow/ssm.js.map +0 -1
  308. package/dist/src/shadow/vsm.js +0 -297
  309. package/dist/src/shadow/vsm.js.map +0 -1
  310. package/dist/src/shapes/box.js +0 -386
  311. package/dist/src/shapes/box.js.map +0 -1
  312. package/dist/src/shapes/cylinder.js +0 -125
  313. package/dist/src/shapes/cylinder.js.map +0 -1
  314. package/dist/src/shapes/plane.js +0 -88
  315. package/dist/src/shapes/plane.js.map +0 -1
  316. package/dist/src/shapes/shape.js +0 -87
  317. package/dist/src/shapes/shape.js.map +0 -1
  318. package/dist/src/shapes/sphere.js +0 -114
  319. package/dist/src/shapes/sphere.js.map +0 -1
  320. package/dist/src/shapes/tetrahedron.js +0 -188
  321. package/dist/src/shapes/tetrahedron.js.map +0 -1
  322. package/dist/src/shapes/torus.js +0 -111
  323. package/dist/src/shapes/torus.js.map +0 -1
  324. package/dist/src/utility/aabbtree.js +0 -400
  325. package/dist/src/utility/aabbtree.js.map +0 -1
  326. package/dist/src/utility/bounding_volume.js +0 -29
  327. package/dist/src/utility/bounding_volume.js.map +0 -1
  328. package/dist/src/utility/debug.js +0 -28
  329. package/dist/src/utility/debug.js.map +0 -1
  330. package/dist/src/utility/draco/decoder.js +0 -116
  331. package/dist/src/utility/draco/decoder.js.map +0 -1
  332. package/dist/src/utility/misc.js +0 -105
  333. package/dist/src/utility/misc.js.map +0 -1
  334. package/dist/src/utility/panorama.js +0 -163
  335. package/dist/src/utility/panorama.js.map +0 -1
  336. package/dist/src/utility/pmrem.js +0 -354
  337. package/dist/src/utility/pmrem.js.map +0 -1
  338. package/dist/src/utility/rendermipmap.js +0 -115
  339. package/dist/src/utility/rendermipmap.js.map +0 -1
  340. package/dist/src/utility/serialization/json.js +0 -402
  341. package/dist/src/utility/serialization/json.js.map +0 -1
  342. package/dist/src/utility/serialization/manager.js +0 -623
  343. package/dist/src/utility/serialization/manager.js.map +0 -1
  344. package/dist/src/utility/serialization/scene/animation.js +0 -248
  345. package/dist/src/utility/serialization/scene/animation.js.map +0 -1
  346. package/dist/src/utility/serialization/scene/batch.js +0 -59
  347. package/dist/src/utility/serialization/scene/batch.js.map +0 -1
  348. package/dist/src/utility/serialization/scene/camera.js +0 -790
  349. package/dist/src/utility/serialization/scene/camera.js.map +0 -1
  350. package/dist/src/utility/serialization/scene/common.js +0 -222
  351. package/dist/src/utility/serialization/scene/common.js.map +0 -1
  352. package/dist/src/utility/serialization/scene/light.js +0 -575
  353. package/dist/src/utility/serialization/scene/light.js.map +0 -1
  354. package/dist/src/utility/serialization/scene/material.js +0 -1111
  355. package/dist/src/utility/serialization/scene/material.js.map +0 -1
  356. package/dist/src/utility/serialization/scene/mesh.js +0 -148
  357. package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
  358. package/dist/src/utility/serialization/scene/misc.js +0 -39
  359. package/dist/src/utility/serialization/scene/misc.js.map +0 -1
  360. package/dist/src/utility/serialization/scene/node.js +0 -451
  361. package/dist/src/utility/serialization/scene/node.js.map +0 -1
  362. package/dist/src/utility/serialization/scene/particle.js +0 -425
  363. package/dist/src/utility/serialization/scene/particle.js.map +0 -1
  364. package/dist/src/utility/serialization/scene/primitive.js +0 -692
  365. package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
  366. package/dist/src/utility/serialization/scene/scene.js +0 -704
  367. package/dist/src/utility/serialization/scene/scene.js.map +0 -1
  368. package/dist/src/utility/serialization/scene/terrain.js +0 -488
  369. package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
  370. package/dist/src/utility/serialization/scene/water.js +0 -465
  371. package/dist/src/utility/serialization/scene/water.js.map +0 -1
  372. package/dist/src/utility/shprojector.js +0 -297
  373. package/dist/src/utility/shprojector.js.map +0 -1
  374. package/dist/src/utility/textures/ggxlut.js +0 -213
  375. package/dist/src/utility/textures/ggxlut.js.map +0 -1
  376. package/dist/src/utility/textures/gradientnoise.js +0 -62
  377. package/dist/src/utility/textures/gradientnoise.js.map +0 -1
  378. package/dist/src/utility/textures/randomnoise.js +0 -41
  379. package/dist/src/utility/textures/randomnoise.js.map +0 -1
  380. package/dist/src/values.js +0 -162
  381. package/dist/src/values.js.map +0 -1
  382. package/dist/utility/blueprint/material/common.js +0 -7
  383. package/dist/utility/blueprint/material/common.js.map +0 -1
  384. package/dist/utility/serialization/blueprint/constants.js +0 -255
  385. package/dist/utility/serialization/blueprint/constants.js.map +0 -1
  386. package/dist/utility/serialization/blueprint/material/constants.js +0 -203
  387. package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
  388. package/dist/utility/serialization/blueprint/material/texture.js +0 -165
  389. package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
@@ -0,0 +1,240 @@
1
+ import { Vector3, Quaternion } from '@zephyr3d/base';
2
+
3
+ /**
4
+ * Spring bone for physics-based animation.
5
+ *
6
+ * @remarks
7
+ * A spring bone simulates physics on a bone node, commonly used for:
8
+ * - Skirts and dresses
9
+ * - Hair strands
10
+ * - Tails
11
+ * - Capes and cloth
12
+ *
13
+ * The bone follows its parent's animation but adds secondary motion
14
+ * based on physics simulation (springs, gravity, inertia).
15
+ *
16
+ * @public
17
+ */ class SpringBone {
18
+ /** The bone node this spring controls */ _bone;
19
+ /** Current position in world space */ _currentPosition;
20
+ /** Previous position in world space (for velocity calculation) */ _previousPosition;
21
+ /** Initial local position relative to parent */ _initialLocalPosition;
22
+ /** Initial bone length (distance from parent) */ _boneLength;
23
+ /** Spring stiffness (0-1, higher = stiffer) */ _stiffness;
24
+ /** Damping factor (0-1, higher = more damping) */ _damping;
25
+ /** Mass of the bone (affects inertia) */ _mass;
26
+ /** Gravity scale (1 = normal gravity, 0 = no gravity) */ _gravityScale;
27
+ /** Radius for collision detection */ _radius;
28
+ /**
29
+ * Create a spring bone.
30
+ *
31
+ * @param bone - The bone node to control
32
+ * @param stiffness - Spring stiffness (0-1, default: 0.1)
33
+ * @param damping - Damping factor (0-1, default: 0.5)
34
+ * @param mass - Mass of the bone (default: 1)
35
+ * @param gravityScale - Gravity scale (default: 1)
36
+ * @param radius - Collision radius (default: 0.05)
37
+ */ constructor(bone, stiffness = 0.1, damping = 0.5, mass = 1, gravityScale = 1, radius = 0.05){
38
+ this._bone = bone;
39
+ this._stiffness = Math.max(0, Math.min(1, stiffness));
40
+ this._damping = Math.max(0, Math.min(1, damping));
41
+ this._mass = Math.max(0.01, mass);
42
+ this._gravityScale = gravityScale;
43
+ this._radius = Math.max(0, radius);
44
+ // Store initial local transform
45
+ this._initialLocalPosition = bone.position.clone();
46
+ this._boneLength = this._initialLocalPosition.magnitude;
47
+ // Initialize positions in world space
48
+ const worldPos = new Vector3();
49
+ bone.worldMatrix.decompose(null, null, worldPos);
50
+ this._currentPosition = worldPos.clone();
51
+ this._previousPosition = worldPos.clone();
52
+ }
53
+ /**
54
+ * Get the bone node.
55
+ */ get bone() {
56
+ return this._bone;
57
+ }
58
+ /**
59
+ * Get/set spring stiffness (0-1).
60
+ */ get stiffness() {
61
+ return this._stiffness;
62
+ }
63
+ set stiffness(value) {
64
+ this._stiffness = Math.max(0, Math.min(1, value));
65
+ }
66
+ /**
67
+ * Get/set damping factor (0-1).
68
+ */ get damping() {
69
+ return this._damping;
70
+ }
71
+ set damping(value) {
72
+ this._damping = Math.max(0, Math.min(1, value));
73
+ }
74
+ /**
75
+ * Get/set mass.
76
+ */ get mass() {
77
+ return this._mass;
78
+ }
79
+ set mass(value) {
80
+ this._mass = Math.max(0.01, value);
81
+ }
82
+ /**
83
+ * Get/set gravity scale.
84
+ */ get gravityScale() {
85
+ return this._gravityScale;
86
+ }
87
+ set gravityScale(value) {
88
+ this._gravityScale = value;
89
+ }
90
+ /**
91
+ * Get/set collision radius.
92
+ */ get radius() {
93
+ return this._radius;
94
+ }
95
+ set radius(value) {
96
+ this._radius = Math.max(0, value);
97
+ }
98
+ /**
99
+ * Get current position in world space.
100
+ */ get currentPosition() {
101
+ return this._currentPosition;
102
+ }
103
+ /**
104
+ * Get initial local position relative to parent.
105
+ */ get initialLocalPosition() {
106
+ return this._initialLocalPosition;
107
+ }
108
+ /**
109
+ * Reset the spring bone to its initial state.
110
+ */ reset() {
111
+ const worldPos = new Vector3();
112
+ this._bone.worldMatrix.decompose(null, null, worldPos);
113
+ this._currentPosition.set(worldPos);
114
+ this._previousPosition.set(worldPos);
115
+ }
116
+ /**
117
+ * Update spring physics.
118
+ *
119
+ * @param deltaTime - Time step in seconds
120
+ * @param gravity - Gravity vector in world space
121
+ * @param windForce - Wind force vector in world space
122
+ */ update(deltaTime, gravity, windForce) {
123
+ // Clamp delta time to avoid instability (1ms to 100ms)
124
+ if (deltaTime <= 0.001 || deltaTime > 0.1) {
125
+ return; // Skip invalid or too large time steps
126
+ }
127
+ // Get parent's world position
128
+ const parent = this._bone.parent;
129
+ if (!parent) {
130
+ return; // Root bone, no spring simulation
131
+ }
132
+ const parentWorldPos = new Vector3();
133
+ parent.worldMatrix.decompose(null, null, parentWorldPos);
134
+ // Calculate velocity from previous frame
135
+ const velocity = Vector3.sub(this._currentPosition, this._previousPosition, new Vector3());
136
+ Vector3.scale(velocity, 1 / deltaTime, velocity);
137
+ // Store current position as previous
138
+ this._previousPosition.set(this._currentPosition);
139
+ // Calculate forces
140
+ const totalForce = new Vector3();
141
+ // 1. Gravity force
142
+ const gravityForce = Vector3.scale(gravity, this._gravityScale * this._mass, new Vector3());
143
+ totalForce.addBy(gravityForce);
144
+ // 2. Wind force
145
+ totalForce.addBy(windForce);
146
+ // 3. Damping force (opposes velocity)
147
+ const dampingForce = Vector3.scale(velocity, -this._damping * this._mass, new Vector3());
148
+ totalForce.addBy(dampingForce);
149
+ // 4. Spring force (only if stretched beyond bone length)
150
+ const toChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());
151
+ const currentLength = toChild.magnitude;
152
+ if (currentLength > this._boneLength + 0.001) {
153
+ // Bone is stretched, apply restoring force
154
+ const stretchAmount = currentLength - this._boneLength;
155
+ const direction = Vector3.scale(toChild, -1 / currentLength, new Vector3());
156
+ const springForce = Vector3.scale(direction, stretchAmount * this._stiffness * 100, new Vector3());
157
+ totalForce.addBy(springForce);
158
+ }
159
+ // Calculate acceleration (F = ma, a = F/m)
160
+ const acceleration = Vector3.scale(totalForce, 1 / this._mass, new Vector3());
161
+ // Update velocity
162
+ velocity.addBy(Vector3.scale(acceleration, deltaTime, new Vector3()));
163
+ // Apply velocity damping (additional damping to prevent oscillation)
164
+ const velocityMagnitude = velocity.magnitude;
165
+ if (velocityMagnitude > 0.001) {
166
+ const dampingFactor = Math.max(0, 1 - this._damping * deltaTime * 10);
167
+ velocity.scaleBy(dampingFactor);
168
+ }
169
+ // Update position
170
+ this._currentPosition.addBy(Vector3.scale(velocity, deltaTime, new Vector3()));
171
+ // Constrain to bone length (hard constraint)
172
+ const finalToChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());
173
+ const finalLength = finalToChild.magnitude;
174
+ if (finalLength > 0.000001) {
175
+ const direction = Vector3.scale(finalToChild, 1 / finalLength, new Vector3());
176
+ const targetPos = Vector3.add(parentWorldPos, Vector3.scale(direction, this._boneLength, new Vector3()), new Vector3());
177
+ // Soft constraint: blend toward target position
178
+ // This prevents the hard snap that causes oscillation
179
+ const constraintStrength = 0.5; // 0 = no constraint, 1 = hard constraint
180
+ this._currentPosition.x += (targetPos.x - this._currentPosition.x) * constraintStrength;
181
+ this._currentPosition.y += (targetPos.y - this._currentPosition.y) * constraintStrength;
182
+ this._currentPosition.z += (targetPos.z - this._currentPosition.z) * constraintStrength;
183
+ }
184
+ }
185
+ /**
186
+ * Apply the simulated position to the bone node.
187
+ *
188
+ * @remarks
189
+ * This converts the world space position back to local rotation.
190
+ */ applyToNode() {
191
+ const parent = this._bone.parent;
192
+ if (!parent) {
193
+ return;
194
+ }
195
+ // Get parent's world position and rotation
196
+ const parentWorldPos = new Vector3();
197
+ const parentWorldRot = new Quaternion();
198
+ parent.worldMatrix.decompose(null, parentWorldRot, parentWorldPos);
199
+ // Calculate current direction from parent to simulated position (in world space)
200
+ const currentDir = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());
201
+ const currentLength = currentDir.magnitude;
202
+ if (currentLength < 0.000001) {
203
+ return; // Too close to parent
204
+ }
205
+ currentDir.scaleBy(1 / currentLength);
206
+ // Transform current direction to parent's local space
207
+ const parentInvRot = Quaternion.conjugate(parentWorldRot, new Quaternion());
208
+ const currentDirLocal = parentInvRot.transform(currentDir, new Vector3());
209
+ // Original direction in local space (normalized)
210
+ const originalDirLocal = Vector3.normalize(this._initialLocalPosition, new Vector3());
211
+ // Calculate local rotation from original to current
212
+ const localRotation = new Quaternion();
213
+ this._fromToRotation(originalDirLocal, currentDirLocal, localRotation);
214
+ // Apply to bone
215
+ this._bone.rotation = localRotation;
216
+ }
217
+ /**
218
+ * Calculate rotation from one direction to another.
219
+ */ _fromToRotation(from, to, result) {
220
+ const dot = Vector3.dot(from, to);
221
+ if (dot >= 0.999999) {
222
+ return result.identity();
223
+ }
224
+ if (dot <= -0.999999) {
225
+ let axis = Vector3.cross(Vector3.axisPX(), from, new Vector3());
226
+ const lenSq = axis.x * axis.x + axis.y * axis.y + axis.z * axis.z;
227
+ if (lenSq < 0.000001) {
228
+ axis = Vector3.cross(Vector3.axisPY(), from, new Vector3());
229
+ }
230
+ axis.inplaceNormalize();
231
+ return result.fromAxisAngle(axis, Math.PI);
232
+ }
233
+ const axis = Vector3.cross(from, to).inplaceNormalize();
234
+ const angle = Math.acos(dot);
235
+ return result.fromAxisAngle(axis, angle);
236
+ }
237
+ }
238
+
239
+ export { SpringBone };
240
+ //# sourceMappingURL=spring_bone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring_bone.js","sources":["../../../src/animation/spring/spring_bone.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Spring bone for physics-based animation.\r\n *\r\n * @remarks\r\n * A spring bone simulates physics on a bone node, commonly used for:\r\n * - Skirts and dresses\r\n * - Hair strands\r\n * - Tails\r\n * - Capes and cloth\r\n *\r\n * The bone follows its parent's animation but adds secondary motion\r\n * based on physics simulation (springs, gravity, inertia).\r\n *\r\n * @public\r\n */\r\nexport class SpringBone {\r\n /** The bone node this spring controls */\r\n private _bone: SceneNode;\r\n /** Current position in world space */\r\n private _currentPosition: Vector3;\r\n /** Previous position in world space (for velocity calculation) */\r\n private _previousPosition: Vector3;\r\n /** Initial local position relative to parent */\r\n private _initialLocalPosition: Vector3;\r\n /** Initial bone length (distance from parent) */\r\n private _boneLength: number;\r\n\r\n /** Spring stiffness (0-1, higher = stiffer) */\r\n private _stiffness: number;\r\n /** Damping factor (0-1, higher = more damping) */\r\n private _damping: number;\r\n /** Mass of the bone (affects inertia) */\r\n private _mass: number;\r\n /** Gravity scale (1 = normal gravity, 0 = no gravity) */\r\n private _gravityScale: number;\r\n\r\n /** Radius for collision detection */\r\n private _radius: number;\r\n\r\n /**\r\n * Create a spring bone.\r\n *\r\n * @param bone - The bone node to control\r\n * @param stiffness - Spring stiffness (0-1, default: 0.1)\r\n * @param damping - Damping factor (0-1, default: 0.5)\r\n * @param mass - Mass of the bone (default: 1)\r\n * @param gravityScale - Gravity scale (default: 1)\r\n * @param radius - Collision radius (default: 0.05)\r\n */\r\n constructor(\r\n bone: SceneNode,\r\n stiffness = 0.1,\r\n damping = 0.5,\r\n mass = 1,\r\n gravityScale = 1,\r\n radius = 0.05\r\n ) {\r\n this._bone = bone;\r\n this._stiffness = Math.max(0, Math.min(1, stiffness));\r\n this._damping = Math.max(0, Math.min(1, damping));\r\n this._mass = Math.max(0.01, mass);\r\n this._gravityScale = gravityScale;\r\n this._radius = Math.max(0, radius);\r\n\r\n // Store initial local transform\r\n this._initialLocalPosition = bone.position.clone();\r\n this._boneLength = this._initialLocalPosition.magnitude;\r\n\r\n // Initialize positions in world space\r\n const worldPos = new Vector3();\r\n bone.worldMatrix.decompose(null, null, worldPos);\r\n this._currentPosition = worldPos.clone();\r\n this._previousPosition = worldPos.clone();\r\n }\r\n\r\n /**\r\n * Get the bone node.\r\n */\r\n get bone(): SceneNode {\r\n return this._bone;\r\n }\r\n\r\n /**\r\n * Get/set spring stiffness (0-1).\r\n */\r\n get stiffness(): number {\r\n return this._stiffness;\r\n }\r\n\r\n set stiffness(value: number) {\r\n this._stiffness = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Get/set damping factor (0-1).\r\n */\r\n get damping(): number {\r\n return this._damping;\r\n }\r\n\r\n set damping(value: number) {\r\n this._damping = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Get/set mass.\r\n */\r\n get mass(): number {\r\n return this._mass;\r\n }\r\n\r\n set mass(value: number) {\r\n this._mass = Math.max(0.01, value);\r\n }\r\n\r\n /**\r\n * Get/set gravity scale.\r\n */\r\n get gravityScale(): number {\r\n return this._gravityScale;\r\n }\r\n\r\n set gravityScale(value: number) {\r\n this._gravityScale = value;\r\n }\r\n\r\n /**\r\n * Get/set collision radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Get current position in world space.\r\n */\r\n get currentPosition(): Vector3 {\r\n return this._currentPosition;\r\n }\r\n\r\n /**\r\n * Get initial local position relative to parent.\r\n */\r\n get initialLocalPosition(): Vector3 {\r\n return this._initialLocalPosition;\r\n }\r\n\r\n /**\r\n * Reset the spring bone to its initial state.\r\n */\r\n reset(): void {\r\n const worldPos = new Vector3();\r\n this._bone.worldMatrix.decompose(null, null, worldPos);\r\n this._currentPosition.set(worldPos);\r\n this._previousPosition.set(worldPos);\r\n }\r\n\r\n /**\r\n * Update spring physics.\r\n *\r\n * @param deltaTime - Time step in seconds\r\n * @param gravity - Gravity vector in world space\r\n * @param windForce - Wind force vector in world space\r\n */\r\n update(deltaTime: number, gravity: Vector3, windForce: Vector3): void {\r\n // Clamp delta time to avoid instability (1ms to 100ms)\r\n if (deltaTime <= 0.001 || deltaTime > 0.1) {\r\n return; // Skip invalid or too large time steps\r\n }\r\n\r\n // Get parent's world position\r\n const parent = this._bone.parent;\r\n if (!parent) {\r\n return; // Root bone, no spring simulation\r\n }\r\n\r\n const parentWorldPos = new Vector3();\r\n parent.worldMatrix.decompose(null, null, parentWorldPos);\r\n\r\n // Calculate velocity from previous frame\r\n const velocity = Vector3.sub(this._currentPosition, this._previousPosition, new Vector3());\r\n Vector3.scale(velocity, 1 / deltaTime, velocity);\r\n\r\n // Store current position as previous\r\n this._previousPosition.set(this._currentPosition);\r\n\r\n // Calculate forces\r\n const totalForce = new Vector3();\r\n\r\n // 1. Gravity force\r\n const gravityForce = Vector3.scale(gravity, this._gravityScale * this._mass, new Vector3());\r\n totalForce.addBy(gravityForce);\r\n\r\n // 2. Wind force\r\n totalForce.addBy(windForce);\r\n\r\n // 3. Damping force (opposes velocity)\r\n const dampingForce = Vector3.scale(velocity, -this._damping * this._mass, new Vector3());\r\n totalForce.addBy(dampingForce);\r\n\r\n // 4. Spring force (only if stretched beyond bone length)\r\n const toChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const currentLength = toChild.magnitude;\r\n\r\n if (currentLength > this._boneLength + 0.001) {\r\n // Bone is stretched, apply restoring force\r\n const stretchAmount = currentLength - this._boneLength;\r\n const direction = Vector3.scale(toChild, -1 / currentLength, new Vector3());\r\n const springForce = Vector3.scale(direction, stretchAmount * this._stiffness * 100, new Vector3());\r\n totalForce.addBy(springForce);\r\n }\r\n\r\n // Calculate acceleration (F = ma, a = F/m)\r\n const acceleration = Vector3.scale(totalForce, 1 / this._mass, new Vector3());\r\n\r\n // Update velocity\r\n velocity.addBy(Vector3.scale(acceleration, deltaTime, new Vector3()));\r\n\r\n // Apply velocity damping (additional damping to prevent oscillation)\r\n const velocityMagnitude = velocity.magnitude;\r\n if (velocityMagnitude > 0.001) {\r\n const dampingFactor = Math.max(0, 1 - this._damping * deltaTime * 10);\r\n velocity.scaleBy(dampingFactor);\r\n }\r\n\r\n // Update position\r\n this._currentPosition.addBy(Vector3.scale(velocity, deltaTime, new Vector3()));\r\n\r\n // Constrain to bone length (hard constraint)\r\n const finalToChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const finalLength = finalToChild.magnitude;\r\n\r\n if (finalLength > 0.000001) {\r\n const direction = Vector3.scale(finalToChild, 1 / finalLength, new Vector3());\r\n const targetPos = Vector3.add(\r\n parentWorldPos,\r\n Vector3.scale(direction, this._boneLength, new Vector3()),\r\n new Vector3()\r\n );\r\n\r\n // Soft constraint: blend toward target position\r\n // This prevents the hard snap that causes oscillation\r\n const constraintStrength = 0.5; // 0 = no constraint, 1 = hard constraint\r\n this._currentPosition.x += (targetPos.x - this._currentPosition.x) * constraintStrength;\r\n this._currentPosition.y += (targetPos.y - this._currentPosition.y) * constraintStrength;\r\n this._currentPosition.z += (targetPos.z - this._currentPosition.z) * constraintStrength;\r\n }\r\n }\r\n\r\n /**\r\n * Apply the simulated position to the bone node.\r\n *\r\n * @remarks\r\n * This converts the world space position back to local rotation.\r\n */\r\n applyToNode(): void {\r\n const parent = this._bone.parent;\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n // Get parent's world position and rotation\r\n const parentWorldPos = new Vector3();\r\n const parentWorldRot = new Quaternion();\r\n parent.worldMatrix.decompose(null, parentWorldRot, parentWorldPos);\r\n\r\n // Calculate current direction from parent to simulated position (in world space)\r\n const currentDir = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const currentLength = currentDir.magnitude;\r\n\r\n if (currentLength < 0.000001) {\r\n return; // Too close to parent\r\n }\r\n\r\n currentDir.scaleBy(1 / currentLength);\r\n\r\n // Transform current direction to parent's local space\r\n const parentInvRot = Quaternion.conjugate(parentWorldRot, new Quaternion());\r\n const currentDirLocal = parentInvRot.transform(currentDir, new Vector3());\r\n\r\n // Original direction in local space (normalized)\r\n const originalDirLocal = Vector3.normalize(this._initialLocalPosition, new Vector3());\r\n\r\n // Calculate local rotation from original to current\r\n const localRotation = new Quaternion();\r\n this._fromToRotation(originalDirLocal, currentDirLocal, localRotation);\r\n\r\n // Apply to bone\r\n this._bone.rotation = localRotation;\r\n }\r\n\r\n /**\r\n * Calculate rotation from one direction to another.\r\n */\r\n private _fromToRotation(from: Vector3, to: Vector3, result: Quaternion): Quaternion {\r\n const dot = Vector3.dot(from, to);\r\n\r\n if (dot >= 0.999999) {\r\n return result.identity();\r\n }\r\n\r\n if (dot <= -0.999999) {\r\n let axis = Vector3.cross(Vector3.axisPX(), from, new Vector3());\r\n const lenSq = axis.x * axis.x + axis.y * axis.y + axis.z * axis.z;\r\n if (lenSq < 0.000001) {\r\n axis = Vector3.cross(Vector3.axisPY(), from, new Vector3());\r\n }\r\n axis.inplaceNormalize();\r\n return result.fromAxisAngle(axis, Math.PI);\r\n }\r\n\r\n const axis = Vector3.cross(from, to).inplaceNormalize();\r\n const angle = Math.acos(dot);\r\n return result.fromAxisAngle(axis, angle);\r\n }\r\n}\r\n\r\n"],"names":["SpringBone","bone","stiffness","damping","mass","gravityScale","radius","_bone","_stiffness","Math","max","min","_damping","_mass","_gravityScale","_radius","_initialLocalPosition","position","clone","_boneLength","magnitude","worldPos","Vector3","worldMatrix","decompose","_currentPosition","_previousPosition","value","currentPosition","initialLocalPosition","reset","set","update","deltaTime","gravity","windForce","parent","parentWorldPos","velocity","sub","scale","totalForce","gravityForce","addBy","dampingForce","toChild","currentLength","stretchAmount","direction","springForce","acceleration","velocityMagnitude","dampingFactor","scaleBy","finalToChild","finalLength","targetPos","add","constraintStrength","x","y","z","applyToNode","parentWorldRot","Quaternion","currentDir","parentInvRot","conjugate","currentDirLocal","transform","originalDirLocal","normalize","localRotation","_fromToRotation","rotation","from","to","result","dot","identity","axis","cross","axisPX","lenSq","axisPY","inplaceNormalize","fromAxisAngle","PI","angle","acos"],"mappings":";;AAGA;;;;;;;;;;;;;;AAcC,IACM,MAAMA,UAAAA,CAAAA;8CAEX,KAAyB;2CAEzB,gBAAkC;uEAElC,iBAAmC;qDAEnC,qBAAuC;sDAEvC,WAA4B;oDAG5B,UAA2B;uDAE3B,QAAyB;8CAEzB,KAAsB;8DAEtB,aAA8B;0CAG9B,OAAwB;AAExB;;;;;;;;;AASC,MACD,YACEC,IAAe,EACfC,SAAY,GAAA,GAAG,EACfC,OAAU,GAAA,GAAG,EACbC,IAAAA,GAAO,CAAC,EACRC,YAAAA,GAAe,CAAC,EAChBC,MAAAA,GAAS,IAAI,CACb;QACA,IAAI,CAACC,KAAK,GAAGN,IAAAA;QACb,IAAI,CAACO,UAAU,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGT,EAAAA,SAAAA,CAAAA,CAAAA;QAC1C,IAAI,CAACU,QAAQ,GAAGH,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGR,EAAAA,OAAAA,CAAAA,CAAAA;AACxC,QAAA,IAAI,CAACU,KAAK,GAAGJ,IAAKC,CAAAA,GAAG,CAAC,IAAMN,EAAAA,IAAAA,CAAAA;QAC5B,IAAI,CAACU,aAAa,GAAGT,YAAAA;AACrB,QAAA,IAAI,CAACU,OAAO,GAAGN,IAAKC,CAAAA,GAAG,CAAC,CAAGJ,EAAAA,MAAAA,CAAAA;;AAG3B,QAAA,IAAI,CAACU,qBAAqB,GAAGf,IAAKgB,CAAAA,QAAQ,CAACC,KAAK,EAAA;AAChD,QAAA,IAAI,CAACC,WAAW,GAAG,IAAI,CAACH,qBAAqB,CAACI,SAAS;;AAGvD,QAAA,MAAMC,WAAW,IAAIC,OAAAA,EAAAA;AACrBrB,QAAAA,IAAAA,CAAKsB,WAAW,CAACC,SAAS,CAAC,MAAM,IAAMH,EAAAA,QAAAA,CAAAA;AACvC,QAAA,IAAI,CAACI,gBAAgB,GAAGJ,QAAAA,CAASH,KAAK,EAAA;AACtC,QAAA,IAAI,CAACQ,iBAAiB,GAAGL,QAAAA,CAASH,KAAK,EAAA;AACzC;AAEA;;AAEC,MACD,IAAIjB,IAAkB,GAAA;QACpB,OAAO,IAAI,CAACM,KAAK;AACnB;AAEA;;AAEC,MACD,IAAIL,SAAoB,GAAA;QACtB,OAAO,IAAI,CAACM,UAAU;AACxB;IAEA,IAAIN,SAAAA,CAAUyB,KAAa,EAAE;QAC3B,IAAI,CAACnB,UAAU,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGgB,EAAAA,KAAAA,CAAAA,CAAAA;AAC5C;AAEA;;AAEC,MACD,IAAIxB,OAAkB,GAAA;QACpB,OAAO,IAAI,CAACS,QAAQ;AACtB;IAEA,IAAIT,OAAAA,CAAQwB,KAAa,EAAE;QACzB,IAAI,CAACf,QAAQ,GAAGH,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGgB,EAAAA,KAAAA,CAAAA,CAAAA;AAC1C;AAEA;;AAEC,MACD,IAAIvB,IAAe,GAAA;QACjB,OAAO,IAAI,CAACS,KAAK;AACnB;IAEA,IAAIT,IAAAA,CAAKuB,KAAa,EAAE;AACtB,QAAA,IAAI,CAACd,KAAK,GAAGJ,IAAKC,CAAAA,GAAG,CAAC,IAAMiB,EAAAA,KAAAA,CAAAA;AAC9B;AAEA;;AAEC,MACD,IAAItB,YAAuB,GAAA;QACzB,OAAO,IAAI,CAACS,aAAa;AAC3B;IAEA,IAAIT,YAAAA,CAAasB,KAAa,EAAE;QAC9B,IAAI,CAACb,aAAa,GAAGa,KAAAA;AACvB;AAEA;;AAEC,MACD,IAAIrB,MAAiB,GAAA;QACnB,OAAO,IAAI,CAACS,OAAO;AACrB;IAEA,IAAIT,MAAAA,CAAOqB,KAAa,EAAE;AACxB,QAAA,IAAI,CAACZ,OAAO,GAAGN,IAAKC,CAAAA,GAAG,CAAC,CAAGiB,EAAAA,KAAAA,CAAAA;AAC7B;AAEA;;AAEC,MACD,IAAIC,eAA2B,GAAA;QAC7B,OAAO,IAAI,CAACH,gBAAgB;AAC9B;AAEA;;AAEC,MACD,IAAII,oBAAgC,GAAA;QAClC,OAAO,IAAI,CAACb,qBAAqB;AACnC;AAEA;;AAEC,MACDc,KAAc,GAAA;AACZ,QAAA,MAAMT,WAAW,IAAIC,OAAAA,EAAAA;QACrB,IAAI,CAACf,KAAK,CAACgB,WAAW,CAACC,SAAS,CAAC,MAAM,IAAMH,EAAAA,QAAAA,CAAAA;AAC7C,QAAA,IAAI,CAACI,gBAAgB,CAACM,GAAG,CAACV,QAAAA,CAAAA;AAC1B,QAAA,IAAI,CAACK,iBAAiB,CAACK,GAAG,CAACV,QAAAA,CAAAA;AAC7B;AAEA;;;;;;AAMC,MACDW,OAAOC,SAAiB,EAAEC,OAAgB,EAAEC,SAAkB,EAAQ;;QAEpE,IAAIF,SAAAA,IAAa,KAASA,IAAAA,SAAAA,GAAY,GAAK,EAAA;AACzC,YAAA,OAAA;AACF;;AAGA,QAAA,MAAMG,MAAS,GAAA,IAAI,CAAC7B,KAAK,CAAC6B,MAAM;AAChC,QAAA,IAAI,CAACA,MAAQ,EAAA;AACX,YAAA,OAAA;AACF;AAEA,QAAA,MAAMC,iBAAiB,IAAIf,OAAAA,EAAAA;AAC3Bc,QAAAA,MAAAA,CAAOb,WAAW,CAACC,SAAS,CAAC,MAAM,IAAMa,EAAAA,cAAAA,CAAAA;;AAGzC,QAAA,MAAMC,QAAWhB,GAAAA,OAAAA,CAAQiB,GAAG,CAAC,IAAI,CAACd,gBAAgB,EAAE,IAAI,CAACC,iBAAiB,EAAE,IAAIJ,OAAAA,EAAAA,CAAAA;AAChFA,QAAAA,OAAAA,CAAQkB,KAAK,CAACF,QAAU,EAAA,CAAA,GAAIL,SAAWK,EAAAA,QAAAA,CAAAA;;AAGvC,QAAA,IAAI,CAACZ,iBAAiB,CAACK,GAAG,CAAC,IAAI,CAACN,gBAAgB,CAAA;;AAGhD,QAAA,MAAMgB,aAAa,IAAInB,OAAAA,EAAAA;;AAGvB,QAAA,MAAMoB,YAAepB,GAAAA,OAAAA,CAAQkB,KAAK,CAACN,OAAS,EAAA,IAAI,CAACpB,aAAa,GAAG,IAAI,CAACD,KAAK,EAAE,IAAIS,OAAAA,EAAAA,CAAAA;AACjFmB,QAAAA,UAAAA,CAAWE,KAAK,CAACD,YAAAA,CAAAA;;AAGjBD,QAAAA,UAAAA,CAAWE,KAAK,CAACR,SAAAA,CAAAA;;AAGjB,QAAA,MAAMS,YAAetB,GAAAA,OAAAA,CAAQkB,KAAK,CAACF,UAAU,CAAC,IAAI,CAAC1B,QAAQ,GAAG,IAAI,CAACC,KAAK,EAAE,IAAIS,OAAAA,EAAAA,CAAAA;AAC9EmB,QAAAA,UAAAA,CAAWE,KAAK,CAACC,YAAAA,CAAAA;;QAGjB,MAAMC,OAAAA,GAAUvB,QAAQiB,GAAG,CAAC,IAAI,CAACd,gBAAgB,EAAEY,cAAAA,EAAgB,IAAIf,OAAAA,EAAAA,CAAAA;QACvE,MAAMwB,aAAAA,GAAgBD,QAAQzB,SAAS;AAEvC,QAAA,IAAI0B,aAAgB,GAAA,IAAI,CAAC3B,WAAW,GAAG,KAAO,EAAA;;AAE5C,YAAA,MAAM4B,aAAgBD,GAAAA,aAAAA,GAAgB,IAAI,CAAC3B,WAAW;YACtD,MAAM6B,SAAAA,GAAY1B,QAAQkB,KAAK,CAACK,SAAS,EAAC,GAAIC,eAAe,IAAIxB,OAAAA,EAAAA,CAAAA;YACjE,MAAM2B,WAAAA,GAAc3B,OAAQkB,CAAAA,KAAK,CAACQ,SAAAA,EAAWD,aAAgB,GAAA,IAAI,CAACvC,UAAU,GAAG,GAAA,EAAK,IAAIc,OAAAA,EAAAA,CAAAA;AACxFmB,YAAAA,UAAAA,CAAWE,KAAK,CAACM,WAAAA,CAAAA;AACnB;;QAGA,MAAMC,YAAAA,GAAe5B,OAAQkB,CAAAA,KAAK,CAACC,UAAAA,EAAY,IAAI,IAAI,CAAC5B,KAAK,EAAE,IAAIS,OAAAA,EAAAA,CAAAA;;AAGnEgB,QAAAA,QAAAA,CAASK,KAAK,CAACrB,OAAAA,CAAQkB,KAAK,CAACU,YAAAA,EAAcjB,WAAW,IAAIX,OAAAA,EAAAA,CAAAA,CAAAA;;QAG1D,MAAM6B,iBAAAA,GAAoBb,SAASlB,SAAS;AAC5C,QAAA,IAAI+B,oBAAoB,KAAO,EAAA;YAC7B,MAAMC,aAAAA,GAAgB3C,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,IAAI,CAACE,QAAQ,GAAGqB,SAAY,GAAA,EAAA,CAAA;AAClEK,YAAAA,QAAAA,CAASe,OAAO,CAACD,aAAAA,CAAAA;AACnB;;QAGA,IAAI,CAAC3B,gBAAgB,CAACkB,KAAK,CAACrB,QAAQkB,KAAK,CAACF,QAAUL,EAAAA,SAAAA,EAAW,IAAIX,OAAAA,EAAAA,CAAAA,CAAAA;;QAGnE,MAAMgC,YAAAA,GAAehC,QAAQiB,GAAG,CAAC,IAAI,CAACd,gBAAgB,EAAEY,cAAAA,EAAgB,IAAIf,OAAAA,EAAAA,CAAAA;QAC5E,MAAMiC,WAAAA,GAAcD,aAAalC,SAAS;AAE1C,QAAA,IAAImC,cAAc,QAAU,EAAA;AAC1B,YAAA,MAAMP,YAAY1B,OAAQkB,CAAAA,KAAK,CAACc,YAAc,EAAA,CAAA,GAAIC,aAAa,IAAIjC,OAAAA,EAAAA,CAAAA;AACnE,YAAA,MAAMkC,SAAYlC,GAAAA,OAAAA,CAAQmC,GAAG,CAC3BpB,gBACAf,OAAQkB,CAAAA,KAAK,CAACQ,SAAAA,EAAW,IAAI,CAAC7B,WAAW,EAAE,IAAIG,YAC/C,IAAIA,OAAAA,EAAAA,CAAAA;;;YAKN,MAAMoC,kBAAAA,GAAqB;AAC3B,YAAA,IAAI,CAACjC,gBAAgB,CAACkC,CAAC,IAAI,CAACH,SAAAA,CAAUG,CAAC,GAAG,IAAI,CAAClC,gBAAgB,CAACkC,CAAC,IAAID,kBAAAA;AACrE,YAAA,IAAI,CAACjC,gBAAgB,CAACmC,CAAC,IAAI,CAACJ,SAAAA,CAAUI,CAAC,GAAG,IAAI,CAACnC,gBAAgB,CAACmC,CAAC,IAAIF,kBAAAA;AACrE,YAAA,IAAI,CAACjC,gBAAgB,CAACoC,CAAC,IAAI,CAACL,SAAAA,CAAUK,CAAC,GAAG,IAAI,CAACpC,gBAAgB,CAACoC,CAAC,IAAIH,kBAAAA;AACvE;AACF;AAEA;;;;;AAKC,MACDI,WAAoB,GAAA;AAClB,QAAA,MAAM1B,MAAS,GAAA,IAAI,CAAC7B,KAAK,CAAC6B,MAAM;AAChC,QAAA,IAAI,CAACA,MAAQ,EAAA;AACX,YAAA;AACF;;AAGA,QAAA,MAAMC,iBAAiB,IAAIf,OAAAA,EAAAA;AAC3B,QAAA,MAAMyC,iBAAiB,IAAIC,UAAAA,EAAAA;AAC3B5B,QAAAA,MAAAA,CAAOb,WAAW,CAACC,SAAS,CAAC,MAAMuC,cAAgB1B,EAAAA,cAAAA,CAAAA;;QAGnD,MAAM4B,UAAAA,GAAa3C,QAAQiB,GAAG,CAAC,IAAI,CAACd,gBAAgB,EAAEY,cAAAA,EAAgB,IAAIf,OAAAA,EAAAA,CAAAA;QAC1E,MAAMwB,aAAAA,GAAgBmB,WAAW7C,SAAS;AAE1C,QAAA,IAAI0B,gBAAgB,QAAU,EAAA;AAC5B,YAAA,OAAA;AACF;QAEAmB,UAAWZ,CAAAA,OAAO,CAAC,CAAIP,GAAAA,aAAAA,CAAAA;;AAGvB,QAAA,MAAMoB,YAAeF,GAAAA,UAAAA,CAAWG,SAAS,CAACJ,gBAAgB,IAAIC,UAAAA,EAAAA,CAAAA;AAC9D,QAAA,MAAMI,eAAkBF,GAAAA,YAAAA,CAAaG,SAAS,CAACJ,YAAY,IAAI3C,OAAAA,EAAAA,CAAAA;;QAG/D,MAAMgD,gBAAAA,GAAmBhD,QAAQiD,SAAS,CAAC,IAAI,CAACvD,qBAAqB,EAAE,IAAIM,OAAAA,EAAAA,CAAAA;;AAG3E,QAAA,MAAMkD,gBAAgB,IAAIR,UAAAA,EAAAA;AAC1B,QAAA,IAAI,CAACS,eAAe,CAACH,gBAAAA,EAAkBF,eAAiBI,EAAAA,aAAAA,CAAAA;;AAGxD,QAAA,IAAI,CAACjE,KAAK,CAACmE,QAAQ,GAAGF,aAAAA;AACxB;AAEA;;AAEC,MACD,eAAwBG,CAAAA,IAAa,EAAEC,EAAW,EAAEC,MAAkB,EAAc;AAClF,QAAA,MAAMC,GAAMxD,GAAAA,OAAAA,CAAQwD,GAAG,CAACH,IAAMC,EAAAA,EAAAA,CAAAA;AAE9B,QAAA,IAAIE,OAAO,QAAU,EAAA;AACnB,YAAA,OAAOD,OAAOE,QAAQ,EAAA;AACxB;QAEA,IAAID,GAAAA,IAAO,SAAW,EAAA;YACpB,IAAIE,IAAAA,GAAO1D,QAAQ2D,KAAK,CAAC3D,QAAQ4D,MAAM,EAAA,EAAIP,MAAM,IAAIrD,OAAAA,EAAAA,CAAAA;AACrD,YAAA,MAAM6D,QAAQH,IAAKrB,CAAAA,CAAC,GAAGqB,IAAAA,CAAKrB,CAAC,GAAGqB,IAAAA,CAAKpB,CAAC,GAAGoB,KAAKpB,CAAC,GAAGoB,KAAKnB,CAAC,GAAGmB,KAAKnB,CAAC;AACjE,YAAA,IAAIsB,QAAQ,QAAU,EAAA;AACpBH,gBAAAA,IAAAA,GAAO1D,QAAQ2D,KAAK,CAAC3D,QAAQ8D,MAAM,EAAA,EAAIT,MAAM,IAAIrD,OAAAA,EAAAA,CAAAA;AACnD;AACA0D,YAAAA,IAAAA,CAAKK,gBAAgB,EAAA;AACrB,YAAA,OAAOR,MAAOS,CAAAA,aAAa,CAACN,IAAAA,EAAMvE,KAAK8E,EAAE,CAAA;AAC3C;AAEA,QAAA,MAAMP,OAAO1D,OAAQ2D,CAAAA,KAAK,CAACN,IAAAA,EAAMC,IAAIS,gBAAgB,EAAA;QACrD,MAAMG,KAAAA,GAAQ/E,IAAKgF,CAAAA,IAAI,CAACX,GAAAA,CAAAA;QACxB,OAAOD,MAAAA,CAAOS,aAAa,CAACN,IAAMQ,EAAAA,KAAAA,CAAAA;AACpC;AACF;;;;"}
@@ -0,0 +1,198 @@
1
+ import { Vector3 } from '@zephyr3d/base';
2
+
3
+ /**
4
+ * Base class for spring bone colliders.
5
+ *
6
+ * @public
7
+ */ class SpringBoneCollider {
8
+ }
9
+ /**
10
+ * Sphere collider for spring bones.
11
+ *
12
+ * @public
13
+ */ class SphereCollider extends SpringBoneCollider {
14
+ /** Center position in world space */ _center;
15
+ /** Sphere radius */ _radius;
16
+ /** Optional bone node to follow */ _bone;
17
+ /** Local offset from bone (if bone is set) */ _localOffset;
18
+ /**
19
+ * Create a sphere collider.
20
+ *
21
+ * @param center - Center position in world space (or local offset if bone is provided)
22
+ * @param radius - Sphere radius
23
+ * @param bone - Optional bone node to follow
24
+ */ constructor(center, radius, bone = null){
25
+ super();
26
+ this._center = center.clone();
27
+ this._radius = Math.max(0, radius);
28
+ this._bone = bone;
29
+ this._localOffset = bone ? center.clone() : new Vector3();
30
+ }
31
+ /**
32
+ * Get/set center position.
33
+ */ get center() {
34
+ if (this._bone) {
35
+ // Calculate world position from bone
36
+ const worldPos = new Vector3();
37
+ const matrix = this._bone.worldMatrix;
38
+ const offset = this._localOffset;
39
+ worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
40
+ worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
41
+ worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
42
+ return worldPos;
43
+ }
44
+ return this._center;
45
+ }
46
+ set center(value) {
47
+ if (this._bone) {
48
+ this._localOffset.set(value);
49
+ } else {
50
+ this._center.set(value);
51
+ }
52
+ }
53
+ /**
54
+ * Get/set radius.
55
+ */ get radius() {
56
+ return this._radius;
57
+ }
58
+ set radius(value) {
59
+ this._radius = Math.max(0, value);
60
+ }
61
+ /**
62
+ * Get/set bone node.
63
+ */ get bone() {
64
+ return this._bone;
65
+ }
66
+ set bone(value) {
67
+ this._bone = value;
68
+ }
69
+ /**
70
+ * Test collision with a point and resolve it.
71
+ */ collide(position, radius) {
72
+ const center = this.center;
73
+ const direction = Vector3.sub(position, center, new Vector3());
74
+ const distance = direction.magnitude;
75
+ const minDistance = this._radius + radius;
76
+ if (distance < minDistance && distance > 0.000001) {
77
+ // Collision detected, push the point out
78
+ direction.scaleBy(1 / distance);
79
+ const penetration = minDistance - distance;
80
+ position.addBy(Vector3.scale(direction, penetration, new Vector3()));
81
+ return true;
82
+ }
83
+ return false;
84
+ }
85
+ }
86
+ /**
87
+ * Capsule collider for spring bones.
88
+ *
89
+ * @remarks
90
+ * A capsule is defined by two sphere centers and a radius.
91
+ * Useful for limbs like arms and legs.
92
+ *
93
+ * @public
94
+ */ class CapsuleCollider extends SpringBoneCollider {
95
+ /** Start point in world space */ _start;
96
+ /** End point in world space */ _end;
97
+ /** Capsule radius */ _radius;
98
+ /** Optional bone node for start point */ _startBone;
99
+ /** Optional bone node for end point */ _endBone;
100
+ /** Local offset for start point */ _startOffset;
101
+ /** Local offset for end point */ _endOffset;
102
+ /**
103
+ * Create a capsule collider.
104
+ *
105
+ * @param start - Start point in world space (or local offset if startBone is provided)
106
+ * @param end - End point in world space (or local offset if endBone is provided)
107
+ * @param radius - Capsule radius
108
+ * @param startBone - Optional bone node for start point
109
+ * @param endBone - Optional bone node for end point
110
+ */ constructor(start, end, radius, startBone = null, endBone = null){
111
+ super();
112
+ this._start = start.clone();
113
+ this._end = end.clone();
114
+ this._radius = Math.max(0, radius);
115
+ this._startBone = startBone;
116
+ this._endBone = endBone;
117
+ this._startOffset = startBone ? start.clone() : new Vector3();
118
+ this._endOffset = endBone ? end.clone() : new Vector3();
119
+ }
120
+ /**
121
+ * Get start point in world space.
122
+ */ get start() {
123
+ if (this._startBone) {
124
+ const worldPos = new Vector3();
125
+ const matrix = this._startBone.worldMatrix;
126
+ const offset = this._startOffset;
127
+ worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
128
+ worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
129
+ worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
130
+ return worldPos;
131
+ }
132
+ return this._start;
133
+ }
134
+ /**
135
+ * Get end point in world space.
136
+ */ get end() {
137
+ if (this._endBone) {
138
+ const worldPos = new Vector3();
139
+ const matrix = this._endBone.worldMatrix;
140
+ const offset = this._endOffset;
141
+ worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
142
+ worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
143
+ worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
144
+ return worldPos;
145
+ }
146
+ return this._end;
147
+ }
148
+ /**
149
+ * Get/set radius.
150
+ */ get radius() {
151
+ return this._radius;
152
+ }
153
+ set radius(value) {
154
+ this._radius = Math.max(0, value);
155
+ }
156
+ /**
157
+ * Test collision with a point and resolve it.
158
+ */ collide(position, radius) {
159
+ const start = this.start;
160
+ const end = this.end;
161
+ // Calculate closest point on capsule line segment
162
+ const line = Vector3.sub(end, start, new Vector3());
163
+ const lineLength = line.magnitude;
164
+ if (lineLength < 0.000001) {
165
+ // Degenerate capsule, treat as sphere
166
+ const direction = Vector3.sub(position, start, new Vector3());
167
+ const distance = direction.magnitude;
168
+ const minDistance = this._radius + radius;
169
+ if (distance < minDistance && distance > 0.000001) {
170
+ direction.scaleBy(1 / distance);
171
+ const penetration = minDistance - distance;
172
+ position.addBy(Vector3.scale(direction, penetration, new Vector3()));
173
+ return true;
174
+ }
175
+ return false;
176
+ }
177
+ const lineDir = Vector3.scale(line, 1 / lineLength, new Vector3());
178
+ const toPoint = Vector3.sub(position, start, new Vector3());
179
+ const t = Math.max(0, Math.min(lineLength, Vector3.dot(toPoint, lineDir)));
180
+ // Closest point on line segment
181
+ const closestPoint = Vector3.add(start, Vector3.scale(lineDir, t, new Vector3()), new Vector3());
182
+ // Check distance from closest point
183
+ const direction = Vector3.sub(position, closestPoint, new Vector3());
184
+ const distance = direction.magnitude;
185
+ const minDistance = this._radius + radius;
186
+ if (distance < minDistance && distance > 0.000001) {
187
+ // Collision detected, push the point out
188
+ direction.scaleBy(1 / distance);
189
+ const penetration = minDistance - distance;
190
+ position.addBy(Vector3.scale(direction, penetration, new Vector3()));
191
+ return true;
192
+ }
193
+ return false;
194
+ }
195
+ }
196
+
197
+ export { CapsuleCollider, SphereCollider, SpringBoneCollider };
198
+ //# sourceMappingURL=spring_bone_collider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring_bone_collider.js","sources":["../../../src/animation/spring/spring_bone_collider.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Base class for spring bone colliders.\r\n *\r\n * @public\r\n */\r\nexport abstract class SpringBoneCollider {\r\n /**\r\n * Test collision with a point and resolve it.\r\n *\r\n * @param position - Point position in world space\r\n * @param radius - Point radius\r\n * @returns True if collision occurred and was resolved\r\n */\r\n abstract collide(position: Vector3, radius: number): boolean;\r\n}\r\n\r\n/**\r\n * Sphere collider for spring bones.\r\n *\r\n * @public\r\n */\r\nexport class SphereCollider extends SpringBoneCollider {\r\n /** Center position in world space */\r\n private _center: Vector3;\r\n /** Sphere radius */\r\n private _radius: number;\r\n /** Optional bone node to follow */\r\n private _bone: SceneNode | null;\r\n /** Local offset from bone (if bone is set) */\r\n private _localOffset: Vector3;\r\n\r\n /**\r\n * Create a sphere collider.\r\n *\r\n * @param center - Center position in world space (or local offset if bone is provided)\r\n * @param radius - Sphere radius\r\n * @param bone - Optional bone node to follow\r\n */\r\n constructor(center: Vector3, radius: number, bone: SceneNode | null = null) {\r\n super();\r\n this._center = center.clone();\r\n this._radius = Math.max(0, radius);\r\n this._bone = bone;\r\n this._localOffset = bone ? center.clone() : new Vector3();\r\n }\r\n\r\n /**\r\n * Get/set center position.\r\n */\r\n get center(): Vector3 {\r\n if (this._bone) {\r\n // Calculate world position from bone\r\n const worldPos = new Vector3();\r\n const matrix = this._bone.worldMatrix;\r\n const offset = this._localOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._center;\r\n }\r\n\r\n set center(value: Vector3) {\r\n if (this._bone) {\r\n this._localOffset.set(value);\r\n } else {\r\n this._center.set(value);\r\n }\r\n }\r\n\r\n /**\r\n * Get/set radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Get/set bone node.\r\n */\r\n get bone(): SceneNode | null {\r\n return this._bone;\r\n }\r\n\r\n set bone(value: SceneNode | null) {\r\n this._bone = value;\r\n }\r\n\r\n /**\r\n * Test collision with a point and resolve it.\r\n */\r\n collide(position: Vector3, radius: number): boolean {\r\n const center = this.center;\r\n const direction = Vector3.sub(position, center, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n // Collision detected, push the point out\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Capsule collider for spring bones.\r\n *\r\n * @remarks\r\n * A capsule is defined by two sphere centers and a radius.\r\n * Useful for limbs like arms and legs.\r\n *\r\n * @public\r\n */\r\nexport class CapsuleCollider extends SpringBoneCollider {\r\n /** Start point in world space */\r\n private _start: Vector3;\r\n /** End point in world space */\r\n private _end: Vector3;\r\n /** Capsule radius */\r\n private _radius: number;\r\n /** Optional bone node for start point */\r\n private _startBone: SceneNode | null;\r\n /** Optional bone node for end point */\r\n private _endBone: SceneNode | null;\r\n /** Local offset for start point */\r\n private _startOffset: Vector3;\r\n /** Local offset for end point */\r\n private _endOffset: Vector3;\r\n\r\n /**\r\n * Create a capsule collider.\r\n *\r\n * @param start - Start point in world space (or local offset if startBone is provided)\r\n * @param end - End point in world space (or local offset if endBone is provided)\r\n * @param radius - Capsule radius\r\n * @param startBone - Optional bone node for start point\r\n * @param endBone - Optional bone node for end point\r\n */\r\n constructor(\r\n start: Vector3,\r\n end: Vector3,\r\n radius: number,\r\n startBone: SceneNode | null = null,\r\n endBone: SceneNode | null = null\r\n ) {\r\n super();\r\n this._start = start.clone();\r\n this._end = end.clone();\r\n this._radius = Math.max(0, radius);\r\n this._startBone = startBone;\r\n this._endBone = endBone;\r\n this._startOffset = startBone ? start.clone() : new Vector3();\r\n this._endOffset = endBone ? end.clone() : new Vector3();\r\n }\r\n\r\n /**\r\n * Get start point in world space.\r\n */\r\n get start(): Vector3 {\r\n if (this._startBone) {\r\n const worldPos = new Vector3();\r\n const matrix = this._startBone.worldMatrix;\r\n const offset = this._startOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._start;\r\n }\r\n\r\n /**\r\n * Get end point in world space.\r\n */\r\n get end(): Vector3 {\r\n if (this._endBone) {\r\n const worldPos = new Vector3();\r\n const matrix = this._endBone.worldMatrix;\r\n const offset = this._endOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._end;\r\n }\r\n\r\n /**\r\n * Get/set radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Test collision with a point and resolve it.\r\n */\r\n collide(position: Vector3, radius: number): boolean {\r\n const start = this.start;\r\n const end = this.end;\r\n\r\n // Calculate closest point on capsule line segment\r\n const line = Vector3.sub(end, start, new Vector3());\r\n const lineLength = line.magnitude;\r\n\r\n if (lineLength < 0.000001) {\r\n // Degenerate capsule, treat as sphere\r\n const direction = Vector3.sub(position, start, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n const lineDir = Vector3.scale(line, 1 / lineLength, new Vector3());\r\n const toPoint = Vector3.sub(position, start, new Vector3());\r\n const t = Math.max(0, Math.min(lineLength, Vector3.dot(toPoint, lineDir)));\r\n\r\n // Closest point on line segment\r\n const closestPoint = Vector3.add(start, Vector3.scale(lineDir, t, new Vector3()), new Vector3());\r\n\r\n // Check distance from closest point\r\n const direction = Vector3.sub(position, closestPoint, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n // Collision detected, push the point out\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"],"names":["SpringBoneCollider","SphereCollider","center","radius","bone","_center","clone","_radius","Math","max","_bone","_localOffset","Vector3","worldPos","matrix","worldMatrix","offset","x","m00","m01","y","m02","z","m03","m10","m11","m12","m13","m20","m21","m22","m23","value","set","collide","position","direction","sub","distance","magnitude","minDistance","scaleBy","penetration","addBy","scale","CapsuleCollider","start","end","startBone","endBone","_start","_end","_startBone","_endBone","_startOffset","_endOffset","line","lineLength","lineDir","toPoint","t","min","dot","closestPoint","add"],"mappings":"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"}