@zephyr3d/scene 0.9.27 → 0.10.0

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 (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -0,0 +1,209 @@
1
+ import { Vector3 } from '@zephyr3d/base';
2
+ import { PhysicsPart } from './part.js';
3
+
4
+ /**
5
+ * A collision shape on its node.
6
+ *
7
+ * @remarks
8
+ * Belongs to the nearest {@link RigidBody} on its node or an ancestor. Without
9
+ * one it is a static obstacle - a floor, a wall - that never moves on its own
10
+ * but follows its node if the node is moved.
11
+ *
12
+ * Collision and trigger events are raised on the rigid body it belongs to, or
13
+ * on the collider itself when it has none; see {@link PhysicsEventMap}.
14
+ *
15
+ * Sizes are in the node's local units and scale with the node's world scale. A
16
+ * sphere scales by the largest axis, and capsules and cylinders by the larger
17
+ * of X and Z for their radius; `mesh` and `convex` scale exactly, along each
18
+ * axis.
19
+ *
20
+ * @public
21
+ */ class Collider extends PhysicsPart {
22
+ _shape;
23
+ _size;
24
+ _radius;
25
+ _height;
26
+ _offset;
27
+ _friction;
28
+ _restitution;
29
+ _isTrigger;
30
+ _layer;
31
+ _meshLod;
32
+ _terrainResolution;
33
+ _meshData;
34
+ /** The geometry last built from, for shapes that need it. */ _geometry;
35
+ _ready;
36
+ _error;
37
+ /** Warned that a mesh collider is on a dynamic body. */ _warnedDynamicMesh;
38
+ constructor(){
39
+ super();
40
+ this._shape = 'box';
41
+ this._size = new Vector3(1, 1, 1);
42
+ this._radius = 0.5;
43
+ this._height = 2;
44
+ this._offset = new Vector3();
45
+ this._friction = 0.5;
46
+ this._restitution = 0;
47
+ this._isTrigger = false;
48
+ this._layer = 0;
49
+ this._meshLod = 0;
50
+ this._terrainResolution = 1;
51
+ this._meshData = null;
52
+ this._geometry = null;
53
+ this._ready = false;
54
+ this._error = '';
55
+ this._warnedDynamicMesh = false;
56
+ }
57
+ /** The shape. Default `'box'`. */ get shape() {
58
+ return this._shape;
59
+ }
60
+ set shape(value) {
61
+ this._shape = value;
62
+ this._changed();
63
+ }
64
+ /** Full size of a box. Default (1, 1, 1). */ get size() {
65
+ return this._size;
66
+ }
67
+ set size(value) {
68
+ this._size.set(value);
69
+ this._changed();
70
+ }
71
+ /** Radius of a sphere, capsule or cylinder. Default 0.5. */ get radius() {
72
+ return this._radius;
73
+ }
74
+ set radius(value) {
75
+ this._radius = Math.max(0, value);
76
+ this._changed();
77
+ }
78
+ /** Total height of a capsule or cylinder. Default 2. */ get height() {
79
+ return this._height;
80
+ }
81
+ set height(value) {
82
+ this._height = Math.max(0, value);
83
+ this._changed();
84
+ }
85
+ /** Position of the shape's centre in the node's local space. Default (0, 0, 0). */ get offset() {
86
+ return this._offset;
87
+ }
88
+ set offset(value) {
89
+ this._offset.set(value);
90
+ this._changed();
91
+ }
92
+ /** How strongly surfaces resist sliding, usually 0 to 1. Default 0.5. */ get friction() {
93
+ return this._friction;
94
+ }
95
+ set friction(value) {
96
+ this._friction = Math.max(0, value);
97
+ this._changed();
98
+ }
99
+ /** Bounciness, from 0 (no bounce) to 1 (keeps all its speed). Default 0. */ get restitution() {
100
+ return this._restitution;
101
+ }
102
+ set restitution(value) {
103
+ this._restitution = Math.max(0, value);
104
+ this._changed();
105
+ }
106
+ /** A trigger detects overlaps but does not push anything. Default false. */ get isTrigger() {
107
+ return this._isTrigger;
108
+ }
109
+ set isTrigger(value) {
110
+ this._isTrigger = !!value;
111
+ this._changed();
112
+ }
113
+ /**
114
+ * Collision layer, 0 to 15. Which layers collide with each other is set on
115
+ * the world ({@link PhysicsWorld.setLayerCollision}); queries can be limited
116
+ * to some layers. Default 0.
117
+ */ get layer() {
118
+ return this._layer;
119
+ }
120
+ set layer(value) {
121
+ const layer = Math.min(15, Math.max(0, Math.floor(value)));
122
+ if (layer !== this._layer) {
123
+ this._layer = layer;
124
+ this.world?._updateColliderGroups(this);
125
+ }
126
+ }
127
+ /**
128
+ * Which level of detail of the mesh a `mesh` or `convex` collider is made
129
+ * from; 0 is full detail. A level past the mesh's lowest detail uses the
130
+ * lowest. Default 0.
131
+ */ get meshLod() {
132
+ return this._meshLod;
133
+ }
134
+ set meshLod(value) {
135
+ const lod = Math.max(0, Math.floor(value));
136
+ if (lod !== this._meshLod) {
137
+ this._meshLod = lod;
138
+ this._changed();
139
+ }
140
+ }
141
+ /**
142
+ * Spacing of a `terrain` collider's height samples, in height map texels: 1
143
+ * uses every texel, 2 every other one, and so on. Coarser is cheaper and
144
+ * smaller but follows the ground less closely. Default 1.
145
+ */ get terrainResolution() {
146
+ return this._terrainResolution;
147
+ }
148
+ set terrainResolution(value) {
149
+ const resolution = Math.max(1, Math.floor(value));
150
+ if (resolution !== this._terrainResolution) {
151
+ this._terrainResolution = resolution;
152
+ this._changed();
153
+ }
154
+ }
155
+ /**
156
+ * Gives a `mesh` or `convex` collider its triangles directly instead of
157
+ * reading them from the node's mesh, so it takes effect right away.
158
+ *
159
+ * @remarks
160
+ * For generated geometry, or collision geometry prepared in advance. Not
161
+ * saved with the scene.
162
+ *
163
+ * @param positions - Vertex positions in the node's local space, xyz each.
164
+ * @param indices - Three vertex indices per triangle. A `convex` collider
165
+ * only uses the positions and may leave this out.
166
+ */ setMeshData(positions, indices) {
167
+ this._meshData = {
168
+ positions,
169
+ indices: indices ?? new Uint32Array(0)
170
+ };
171
+ this._changed();
172
+ }
173
+ /** Goes back to reading the triangles from the node's mesh. */ clearMeshData() {
174
+ if (this._meshData) {
175
+ this._meshData = null;
176
+ this._changed();
177
+ }
178
+ }
179
+ /**
180
+ * Whether the collider is in the simulation. Basic shapes are as soon as
181
+ * their node is in a scene that is simulating; `mesh`, `convex` and `terrain`
182
+ * may have to wait for their geometry. Raises `ready` when it becomes true.
183
+ */ get ready() {
184
+ return this._ready;
185
+ }
186
+ /** Why the collider could not be built, or an empty string. */ get error() {
187
+ return this._error;
188
+ }
189
+ _setStatus(ready, error = '') {
190
+ const becameReady = ready && !this._ready;
191
+ this._ready = ready;
192
+ this._error = error;
193
+ if (becameReady) {
194
+ this.dispatchEvent('ready');
195
+ }
196
+ }
197
+ _changed() {
198
+ this.world?._markColliderDirty(this);
199
+ }
200
+ _join(world) {
201
+ world._registerCollider(this);
202
+ }
203
+ _leave(world) {
204
+ world._unregisterCollider(this);
205
+ }
206
+ }
207
+
208
+ export { Collider };
209
+ //# sourceMappingURL=collider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collider.js","sources":["../../src/physics/collider.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\nimport { PhysicsPart } from './part';\r\nimport type { PhysicsWorld } from './world';\r\n\r\n/**\r\n * Basic collision shapes, defined in the node's local space.\r\n *\r\n * - `box`: {@link Collider.size} is the full extent along each axis.\r\n * - `sphere`: {@link Collider.radius}.\r\n * - `capsule`: a cylinder with hemispherical ends, along the node's Y axis;\r\n * {@link Collider.height} is the total height, ends included.\r\n * - `cylinder`: along the node's Y axis, {@link Collider.height} tall.\r\n * - `mesh`: the triangles of the node's mesh, exactly. For floors, buildings\r\n * and other things that do not move on their own: on a dynamic rigid body it\r\n * has no volume, so it gets pushed into things; use `convex` there.\r\n * - `convex`: the convex hull of the node's mesh - the shape of the mesh\r\n * shrink-wrapped, hollows filled in. For dynamic objects: rocks, props.\r\n * - `terrain`: the heights of the node's terrain. Static only.\r\n *\r\n * `mesh` and `convex` read the mesh back from the GPU, so they come into effect\r\n * a few frames later (see {@link Collider.ready}), unless given their triangles\r\n * with {@link Collider.setMeshData}.\r\n *\r\n * @public\r\n */\r\nexport type ColliderShape = 'box' | 'sphere' | 'capsule' | 'cylinder' | 'mesh' | 'convex' | 'terrain';\r\n\r\n/**\r\n * A collision shape on its node.\r\n *\r\n * @remarks\r\n * Belongs to the nearest {@link RigidBody} on its node or an ancestor. Without\r\n * one it is a static obstacle - a floor, a wall - that never moves on its own\r\n * but follows its node if the node is moved.\r\n *\r\n * Collision and trigger events are raised on the rigid body it belongs to, or\r\n * on the collider itself when it has none; see {@link PhysicsEventMap}.\r\n *\r\n * Sizes are in the node's local units and scale with the node's world scale. A\r\n * sphere scales by the largest axis, and capsules and cylinders by the larger\r\n * of X and Z for their radius; `mesh` and `convex` scale exactly, along each\r\n * axis.\r\n *\r\n * @public\r\n */\r\nexport class Collider extends PhysicsPart {\r\n private _shape: ColliderShape;\r\n private readonly _size: Vector3;\r\n private _radius: number;\r\n private _height: number;\r\n private readonly _offset: Vector3;\r\n private _friction: number;\r\n private _restitution: number;\r\n private _isTrigger: boolean;\r\n private _layer: number;\r\n private _meshLod: number;\r\n private _terrainResolution: number;\r\n _meshData: { positions: Float32Array; indices: Uint32Array } | null;\r\n /** The geometry last built from, for shapes that need it. */\r\n _geometry: unknown;\r\n private _ready: boolean;\r\n private _error: string;\r\n /** Warned that a mesh collider is on a dynamic body. */\r\n _warnedDynamicMesh: boolean;\r\n\r\n constructor() {\r\n super();\r\n this._shape = 'box';\r\n this._size = new Vector3(1, 1, 1);\r\n this._radius = 0.5;\r\n this._height = 2;\r\n this._offset = new Vector3();\r\n this._friction = 0.5;\r\n this._restitution = 0;\r\n this._isTrigger = false;\r\n this._layer = 0;\r\n this._meshLod = 0;\r\n this._terrainResolution = 1;\r\n this._meshData = null;\r\n this._geometry = null;\r\n this._ready = false;\r\n this._error = '';\r\n this._warnedDynamicMesh = false;\r\n }\r\n\r\n /** The shape. Default `'box'`. */\r\n get shape() {\r\n return this._shape;\r\n }\r\n set shape(value: ColliderShape) {\r\n this._shape = value;\r\n this._changed();\r\n }\r\n /** Full size of a box. Default (1, 1, 1). */\r\n get size(): Vector3 {\r\n return this._size;\r\n }\r\n set size(value: Vector3) {\r\n this._size.set(value);\r\n this._changed();\r\n }\r\n /** Radius of a sphere, capsule or cylinder. Default 0.5. */\r\n get radius() {\r\n return this._radius;\r\n }\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n this._changed();\r\n }\r\n /** Total height of a capsule or cylinder. Default 2. */\r\n get height() {\r\n return this._height;\r\n }\r\n set height(value: number) {\r\n this._height = Math.max(0, value);\r\n this._changed();\r\n }\r\n /** Position of the shape's centre in the node's local space. Default (0, 0, 0). */\r\n get offset(): Vector3 {\r\n return this._offset;\r\n }\r\n set offset(value: Vector3) {\r\n this._offset.set(value);\r\n this._changed();\r\n }\r\n /** How strongly surfaces resist sliding, usually 0 to 1. Default 0.5. */\r\n get friction() {\r\n return this._friction;\r\n }\r\n set friction(value: number) {\r\n this._friction = Math.max(0, value);\r\n this._changed();\r\n }\r\n /** Bounciness, from 0 (no bounce) to 1 (keeps all its speed). Default 0. */\r\n get restitution() {\r\n return this._restitution;\r\n }\r\n set restitution(value: number) {\r\n this._restitution = Math.max(0, value);\r\n this._changed();\r\n }\r\n /** A trigger detects overlaps but does not push anything. Default false. */\r\n get isTrigger() {\r\n return this._isTrigger;\r\n }\r\n set isTrigger(value: boolean) {\r\n this._isTrigger = !!value;\r\n this._changed();\r\n }\r\n\r\n /**\r\n * Collision layer, 0 to 15. Which layers collide with each other is set on\r\n * the world ({@link PhysicsWorld.setLayerCollision}); queries can be limited\r\n * to some layers. Default 0.\r\n */\r\n get layer() {\r\n return this._layer;\r\n }\r\n set layer(value: number) {\r\n const layer = Math.min(15, Math.max(0, Math.floor(value)));\r\n if (layer !== this._layer) {\r\n this._layer = layer;\r\n this.world?._updateColliderGroups(this);\r\n }\r\n }\r\n\r\n /**\r\n * Which level of detail of the mesh a `mesh` or `convex` collider is made\r\n * from; 0 is full detail. A level past the mesh's lowest detail uses the\r\n * lowest. Default 0.\r\n */\r\n get meshLod() {\r\n return this._meshLod;\r\n }\r\n set meshLod(value: number) {\r\n const lod = Math.max(0, Math.floor(value));\r\n if (lod !== this._meshLod) {\r\n this._meshLod = lod;\r\n this._changed();\r\n }\r\n }\r\n /**\r\n * Spacing of a `terrain` collider's height samples, in height map texels: 1\r\n * uses every texel, 2 every other one, and so on. Coarser is cheaper and\r\n * smaller but follows the ground less closely. Default 1.\r\n */\r\n get terrainResolution() {\r\n return this._terrainResolution;\r\n }\r\n set terrainResolution(value: number) {\r\n const resolution = Math.max(1, Math.floor(value));\r\n if (resolution !== this._terrainResolution) {\r\n this._terrainResolution = resolution;\r\n this._changed();\r\n }\r\n }\r\n /**\r\n * Gives a `mesh` or `convex` collider its triangles directly instead of\r\n * reading them from the node's mesh, so it takes effect right away.\r\n *\r\n * @remarks\r\n * For generated geometry, or collision geometry prepared in advance. Not\r\n * saved with the scene.\r\n *\r\n * @param positions - Vertex positions in the node's local space, xyz each.\r\n * @param indices - Three vertex indices per triangle. A `convex` collider\r\n * only uses the positions and may leave this out.\r\n */\r\n setMeshData(positions: Float32Array, indices?: Uint32Array) {\r\n this._meshData = { positions, indices: indices ?? new Uint32Array(0) };\r\n this._changed();\r\n }\r\n /** Goes back to reading the triangles from the node's mesh. */\r\n clearMeshData() {\r\n if (this._meshData) {\r\n this._meshData = null;\r\n this._changed();\r\n }\r\n }\r\n /**\r\n * Whether the collider is in the simulation. Basic shapes are as soon as\r\n * their node is in a scene that is simulating; `mesh`, `convex` and `terrain`\r\n * may have to wait for their geometry. Raises `ready` when it becomes true.\r\n */\r\n get ready() {\r\n return this._ready;\r\n }\r\n /** Why the collider could not be built, or an empty string. */\r\n get error() {\r\n return this._error;\r\n }\r\n\r\n _setStatus(ready: boolean, error = '') {\r\n const becameReady = ready && !this._ready;\r\n this._ready = ready;\r\n this._error = error;\r\n if (becameReady) {\r\n this.dispatchEvent('ready');\r\n }\r\n }\r\n private _changed() {\r\n this.world?._markColliderDirty(this);\r\n }\r\n protected _join(world: PhysicsWorld) {\r\n world._registerCollider(this);\r\n }\r\n protected _leave(world: PhysicsWorld) {\r\n world._unregisterCollider(this);\r\n }\r\n}\r\n"],"names":["Collider","PhysicsPart","_shape","_size","_radius","_height","_offset","_friction","_restitution","_isTrigger","_layer","_meshLod","_terrainResolution","_meshData","_geometry","_ready","_error","_warnedDynamicMesh","Vector3","shape","value","_changed","size","set","radius","Math","max","height","offset","friction","restitution","isTrigger","layer","min","floor","world","_updateColliderGroups","meshLod","lod","terrainResolution","resolution","setMeshData","positions","indices","Uint32Array","clearMeshData","ready","error","_setStatus","becameReady","dispatchEvent","_markColliderDirty","_join","_registerCollider","_leave","_unregisterCollider"],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { Vector3 } from '@zephyr3d/base';
2
+
3
+ /**
4
+ * Passed with `collisionenter`, `collisionstay` and `collisionexit`.
5
+ *
6
+ * @remarks
7
+ * Contact details are worked out only when read, and only while the handler
8
+ * runs; read them there rather than keeping the event. On `collisionexit` the
9
+ * objects no longer touch, so there are none.
10
+ *
11
+ * @public
12
+ */ class PhysicsContactEvent {
13
+ other;
14
+ collider;
15
+ otherCollider;
16
+ _resolve;
17
+ _info;
18
+ _flip;
19
+ constructor(/** The other physics object: the physics data of its node. */ other, /** One of this object's colliders that touches the other object. */ collider, /** The other object's collider it touches. */ otherCollider, resolve, flip){
20
+ this.other = other;
21
+ this.collider = collider;
22
+ this.otherCollider = otherCollider;
23
+ this._resolve = resolve;
24
+ this._info = null;
25
+ this._flip = flip;
26
+ }
27
+ /** The other object's node. */ get otherNode() {
28
+ return this.other.node;
29
+ }
30
+ /**
31
+ * Direction of the contact in world space, pointing from this object towards
32
+ * the other. Zero when there is no contact to report.
33
+ */ get normal() {
34
+ return this._get()?.normal ?? Vector3.zero();
35
+ }
36
+ /** Contact points in world space, between the two colliders. */ get contacts() {
37
+ return this._get()?.points ?? [];
38
+ }
39
+ /**
40
+ * How hard the two pressed against each other during the last simulation
41
+ * step, in N·s; large for an impact, small for resting contact.
42
+ */ get impulse() {
43
+ return this._get()?.impulse ?? 0;
44
+ }
45
+ /** Ends the time contact details can be read. */ _expire() {
46
+ this._resolve = null;
47
+ }
48
+ _get() {
49
+ if (!this._info && this._resolve) {
50
+ const info = this._resolve();
51
+ if (info && this._flip) {
52
+ info.normal.scaleBy(-1);
53
+ }
54
+ this._info = info;
55
+ this._resolve = null;
56
+ }
57
+ return this._info;
58
+ }
59
+ }
60
+ /**
61
+ * Passed with `triggerenter` and `triggerexit`.
62
+ *
63
+ * @public
64
+ */ class PhysicsTriggerEvent {
65
+ other;
66
+ collider;
67
+ otherCollider;
68
+ constructor(/** The other object: the trigger, or what entered it. */ other, /** This object's collider involved. */ collider, /** The other object's collider involved. */ otherCollider){
69
+ this.other = other;
70
+ this.collider = collider;
71
+ this.otherCollider = otherCollider;
72
+ }
73
+ /** The other object's node. */ get otherNode() {
74
+ return this.other.node;
75
+ }
76
+ }
77
+
78
+ export { PhysicsContactEvent, PhysicsTriggerEvent };
79
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sources":["../../src/physics/events.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { PhysicsContactInfo } from './types';\r\nimport type { NodePhysics } from './node_physics';\r\nimport type { Collider } from './collider';\r\n\r\n/**\r\n * Passed with `collisionenter`, `collisionstay` and `collisionexit`.\r\n *\r\n * @remarks\r\n * Contact details are worked out only when read, and only while the handler\r\n * runs; read them there rather than keeping the event. On `collisionexit` the\r\n * objects no longer touch, so there are none.\r\n *\r\n * @public\r\n */\r\nexport class PhysicsContactEvent {\r\n private _resolve: (() => PhysicsContactInfo | null) | null;\r\n private _info: PhysicsContactInfo | null;\r\n private readonly _flip: boolean;\r\n constructor(\r\n /** The other physics object: the physics data of its node. */\r\n readonly other: NodePhysics,\r\n /** One of this object's colliders that touches the other object. */\r\n readonly collider: Collider,\r\n /** The other object's collider it touches. */\r\n readonly otherCollider: Collider,\r\n resolve: (() => PhysicsContactInfo | null) | null,\r\n flip: boolean\r\n ) {\r\n this._resolve = resolve;\r\n this._info = null;\r\n this._flip = flip;\r\n }\r\n /** The other object's node. */\r\n get otherNode(): SceneNode | null {\r\n return this.other.node;\r\n }\r\n /**\r\n * Direction of the contact in world space, pointing from this object towards\r\n * the other. Zero when there is no contact to report.\r\n */\r\n get normal(): Vector3 {\r\n return this._get()?.normal ?? Vector3.zero();\r\n }\r\n /** Contact points in world space, between the two colliders. */\r\n get contacts(): Vector3[] {\r\n return this._get()?.points ?? [];\r\n }\r\n /**\r\n * How hard the two pressed against each other during the last simulation\r\n * step, in N·s; large for an impact, small for resting contact.\r\n */\r\n get impulse(): number {\r\n return this._get()?.impulse ?? 0;\r\n }\r\n /** Ends the time contact details can be read. */\r\n _expire() {\r\n this._resolve = null;\r\n }\r\n private _get() {\r\n if (!this._info && this._resolve) {\r\n const info = this._resolve();\r\n if (info && this._flip) {\r\n info.normal.scaleBy(-1);\r\n }\r\n this._info = info;\r\n this._resolve = null;\r\n }\r\n return this._info;\r\n }\r\n}\r\n\r\n/**\r\n * Passed with `triggerenter` and `triggerexit`.\r\n *\r\n * @public\r\n */\r\nexport class PhysicsTriggerEvent {\r\n constructor(\r\n /** The other object: the trigger, or what entered it. */\r\n readonly other: NodePhysics,\r\n /** This object's collider involved. */\r\n readonly collider: Collider,\r\n /** The other object's collider involved. */\r\n readonly otherCollider: Collider\r\n ) {}\r\n /** The other object's node. */\r\n get otherNode(): SceneNode | null {\r\n return this.other.node;\r\n }\r\n}\r\n"],"names":["PhysicsContactEvent","_resolve","_info","_flip","other","resolve","flip","collider","otherCollider","otherNode","node","normal","_get","Vector3","zero","contacts","points","impulse","_expire","info","scaleBy","PhysicsTriggerEvent"],"mappings":";;AAMA;;;;;;;;;AASC,IACM,MAAMA,mBAAAA,CAAAA;;;;IACHC,QAAmD;IACnDC,KAAiC;IACxBC,KAAe;AAChC,IAAA,WAAA,gEAEWC,KAAkB,uEAE3B,QAA2B,iDAE3B,aAAgC,EAChCC,OAAiD,EACjDC,IAAa,CACb;aAPSF,KAAAA,GAAAA,KAAAA;aAEAG,QAAAA,GAAAA,QAAAA;aAEAC,aAAAA,GAAAA,aAAAA;QAIT,IAAI,CAACP,QAAQ,GAAGI,OAAAA;QAChB,IAAI,CAACH,KAAK,GAAG,IAAA;QACb,IAAI,CAACC,KAAK,GAAGG,IAAAA;AACf;oCAEA,IAAIG,SAA8B,GAAA;AAChC,QAAA,OAAO,IAAI,CAACL,KAAK,CAACM,IAAI;AACxB;AACA;;;AAGC,MACD,IAAIC,MAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAACC,IAAI,EAAID,EAAAA,MAAAA,IAAUE,QAAQC,IAAI,EAAA;AAC5C;qEAEA,IAAIC,QAAsB,GAAA;AACxB,QAAA,OAAO,IAAI,CAACH,IAAI,EAAA,EAAII,UAAU,EAAE;AAClC;AACA;;;AAGC,MACD,IAAIC,OAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAACL,IAAI,EAAA,EAAIK,OAAW,IAAA,CAAA;AACjC;AACA,sDACAC,OAAU,GAAA;QACR,IAAI,CAACjB,QAAQ,GAAG,IAAA;AAClB;IACQW,IAAO,GAAA;QACb,IAAI,CAAC,IAAI,CAACV,KAAK,IAAI,IAAI,CAACD,QAAQ,EAAE;YAChC,MAAMkB,IAAAA,GAAO,IAAI,CAAClB,QAAQ,EAAA;AAC1B,YAAA,IAAIkB,IAAQ,IAAA,IAAI,CAAChB,KAAK,EAAE;AACtBgB,gBAAAA,IAAAA,CAAKR,MAAM,CAACS,OAAO,CAAC,EAAC,CAAA;AACvB;YACA,IAAI,CAAClB,KAAK,GAAGiB,IAAAA;YACb,IAAI,CAAClB,QAAQ,GAAG,IAAA;AAClB;QACA,OAAO,IAAI,CAACC,KAAK;AACnB;AACF;AAEA;;;;AAIC,IACM,MAAMmB,mBAAAA,CAAAA;;;;AACX,IAAA,WAAA,2DAEE,KAA2B,0CAE3B,QAA2B,+CAElBb,aAAuB,CAChC;aALSJ,KAAAA,GAAAA,KAAAA;aAEAG,QAAAA,GAAAA,QAAAA;aAEAC,aAAAA,GAAAA,aAAAA;AACR;oCAEH,IAAIC,SAA8B,GAAA;AAChC,QAAA,OAAO,IAAI,CAACL,KAAK,CAACM,IAAI;AACxB;AACF;;;;"}
@@ -0,0 +1,272 @@
1
+ import { Vector3 } from '@zephyr3d/base';
2
+ import { PhysicsPart } from './part.js';
3
+
4
+ /**
5
+ * Connects two rigid bodies, or a rigid body and a fixed point in the world.
6
+ *
7
+ * @remarks
8
+ * The joint's own node is the joint's frame: the pivot is the node's origin
9
+ * (moved by {@link Joint.anchor}), and a hinge turns about, or a slider moves
10
+ * along, the node's local {@link Joint.axis}. To put a door's hinge at the edge
11
+ * of the door, put the joint on a child node placed there. A rope or spring
12
+ * runs from that pivot to {@link Joint.connectedAnchor} at the other end.
13
+ *
14
+ * Angles and positions measure how the joint's own body has turned or moved
15
+ * relative to the other end, about or along the axis: a hinge turning
16
+ * counter-clockwise seen from the tip of its axis has a growing angle.
17
+ *
18
+ * One side is the nearest {@link RigidBody} on the joint's node or above it; the
19
+ * other is the nearest rigid body on {@link Joint.connectedBody} or above it, or
20
+ * the world when that is empty.
21
+ *
22
+ * The joint holds the bodies in the pose they have when it is created: a
23
+ * hinge's angle is 0 there. Limits and motor targets are relative to it.
24
+ *
25
+ * Joints cannot break under load: physics implementations do not report the
26
+ * forces on them.
27
+ *
28
+ * @public
29
+ */ class Joint extends PhysicsPart {
30
+ _type;
31
+ _connectedBodyId;
32
+ _connectedBody;
33
+ _anchor;
34
+ _connectedAnchor;
35
+ _axis;
36
+ _collideConnected;
37
+ _limitsEnabled;
38
+ _lowerLimit;
39
+ _upperLimit;
40
+ _swingLimit;
41
+ _twistLimit;
42
+ _motorMode;
43
+ _motorTarget;
44
+ _motorStiffness;
45
+ _motorDamping;
46
+ _motorMaxForce;
47
+ _length;
48
+ _stiffness;
49
+ _damping;
50
+ _error;
51
+ constructor(){
52
+ super();
53
+ this._type = 'hinge';
54
+ this._connectedBodyId = '';
55
+ this._connectedBody = null;
56
+ this._anchor = new Vector3();
57
+ this._connectedAnchor = new Vector3();
58
+ this._axis = new Vector3(0, 1, 0);
59
+ this._collideConnected = false;
60
+ this._limitsEnabled = false;
61
+ this._lowerLimit = -45;
62
+ this._upperLimit = 45;
63
+ this._swingLimit = 45;
64
+ this._twistLimit = 45;
65
+ this._motorMode = 'off';
66
+ this._motorTarget = 0;
67
+ this._motorStiffness = 1000;
68
+ this._motorDamping = 100;
69
+ this._motorMaxForce = 0;
70
+ this._length = 1;
71
+ this._stiffness = 100;
72
+ this._damping = 5;
73
+ this._error = '';
74
+ }
75
+ /** What the joint allows. Default `'hinge'`. */ get type() {
76
+ return this._type;
77
+ }
78
+ set type(value) {
79
+ if (value !== this._type) {
80
+ this._type = value;
81
+ this._rebuild();
82
+ }
83
+ }
84
+ /**
85
+ * The node whose rigid body is the other side of the joint; null connects to
86
+ * a fixed point in the world. Stored by the node's persistent id, so it may
87
+ * be set before that node is loaded or added.
88
+ */ get connectedBody() {
89
+ const scene = this.node?.scene;
90
+ if (!this._connectedBodyId || !scene) {
91
+ return this._connectedBody;
92
+ }
93
+ // Looked up again if it left the scene: it may come back, or be replaced
94
+ // by a node loaded with the same id.
95
+ if (!this._connectedBody || this._connectedBody.scene !== scene || !this._connectedBody.attached) {
96
+ this._connectedBody = scene.findNodeById(this._connectedBodyId) ?? null;
97
+ }
98
+ return this._connectedBody?.attached ? this._connectedBody : null;
99
+ }
100
+ set connectedBody(node) {
101
+ this._connectedBody = node;
102
+ this._connectedBodyId = node?.persistentId ?? '';
103
+ this._rebuild();
104
+ }
105
+ /** Persistent id of {@link Joint.connectedBody}, or an empty string. */ get connectedBodyId() {
106
+ return this._connectedBodyId;
107
+ }
108
+ set connectedBodyId(id) {
109
+ if (id !== this._connectedBodyId) {
110
+ this._connectedBodyId = id;
111
+ this._connectedBody = null;
112
+ this._rebuild();
113
+ }
114
+ }
115
+ /** Pivot position in the joint node's local space. Default (0, 0, 0). */ get anchor() {
116
+ return this._anchor;
117
+ }
118
+ set anchor(value) {
119
+ this._anchor.set(value);
120
+ this._rebuild();
121
+ }
122
+ /**
123
+ * Where a rope or spring is tied at the other end: in the connected body's
124
+ * node space, or in world space when connected to the world. Default (0, 0, 0).
125
+ * Other joints pivot at the joint node only.
126
+ */ get connectedAnchor() {
127
+ return this._connectedAnchor;
128
+ }
129
+ set connectedAnchor(value) {
130
+ this._connectedAnchor.set(value);
131
+ this._rebuild();
132
+ }
133
+ /** Hinge or slider axis in the joint node's local space. Default (0, 1, 0). */ get axis() {
134
+ return this._axis;
135
+ }
136
+ set axis(value) {
137
+ this._axis.set(value);
138
+ this._rebuild();
139
+ }
140
+ /** Whether the two connected bodies still collide with each other. Default false. */ get collideConnected() {
141
+ return this._collideConnected;
142
+ }
143
+ set collideConnected(value) {
144
+ this._collideConnected = !!value;
145
+ this.world?._getJointHandle(this)?.setContactsEnabled(this._collideConnected);
146
+ }
147
+ /** Whether a hinge, slider or ball joint is limited. Default false. */ get limitsEnabled() {
148
+ return this._limitsEnabled;
149
+ }
150
+ set limitsEnabled(value) {
151
+ if (!!value !== this._limitsEnabled) {
152
+ this._limitsEnabled = !!value;
153
+ // Limits can only be turned off again by rebuilding the joint.
154
+ this._rebuild();
155
+ }
156
+ }
157
+ /** Lowest angle of a hinge in degrees, or position of a slider in metres. Default -45. */ get lowerLimit() {
158
+ return this._lowerLimit;
159
+ }
160
+ set lowerLimit(value) {
161
+ this._lowerLimit = value;
162
+ this.world?._applyJointLimits(this);
163
+ }
164
+ /** Highest angle of a hinge in degrees, or position of a slider in metres. Default 45. */ get upperLimit() {
165
+ return this._upperLimit;
166
+ }
167
+ set upperLimit(value) {
168
+ this._upperLimit = value;
169
+ this.world?._applyJointLimits(this);
170
+ }
171
+ /** How far a ball joint may swing away from its axis, in degrees each way. Default 45. */ get swingLimit() {
172
+ return this._swingLimit;
173
+ }
174
+ set swingLimit(value) {
175
+ this._swingLimit = Math.max(0, value);
176
+ this.world?._applyJointLimits(this);
177
+ }
178
+ /** How far a ball joint may twist about its axis, in degrees each way. Default 45. */ get twistLimit() {
179
+ return this._twistLimit;
180
+ }
181
+ set twistLimit(value) {
182
+ this._twistLimit = Math.max(0, value);
183
+ this.world?._applyJointLimits(this);
184
+ }
185
+ /** How a hinge or slider is driven. Default `'off'`. */ get motorMode() {
186
+ return this._motorMode;
187
+ }
188
+ set motorMode(value) {
189
+ this._motorMode = value;
190
+ this.world?._applyJointMotor(this);
191
+ }
192
+ /**
193
+ * In `velocity` mode the speed to reach: degrees per second for a hinge,
194
+ * metres per second for a slider. In `position` mode the angle (degrees) or
195
+ * position (metres) to reach. Default 0.
196
+ */ get motorTarget() {
197
+ return this._motorTarget;
198
+ }
199
+ set motorTarget(value) {
200
+ this._motorTarget = value;
201
+ this.world?._applyJointMotor(this);
202
+ }
203
+ /** How strongly a `position` motor pulls towards its target. Default 1000. */ get motorStiffness() {
204
+ return this._motorStiffness;
205
+ }
206
+ set motorStiffness(value) {
207
+ this._motorStiffness = Math.max(0, value);
208
+ this.world?._applyJointMotor(this);
209
+ }
210
+ /**
211
+ * How strongly a motor resists overshooting; in `velocity` mode, how quickly
212
+ * it gets up to speed. Default 100.
213
+ */ get motorDamping() {
214
+ return this._motorDamping;
215
+ }
216
+ set motorDamping(value) {
217
+ this._motorDamping = Math.max(0, value);
218
+ this.world?._applyJointMotor(this);
219
+ }
220
+ /** Most force (or torque) the motor applies; 0 for no limit. Default 0. */ get motorMaxForce() {
221
+ return this._motorMaxForce;
222
+ }
223
+ set motorMaxForce(value) {
224
+ this._motorMaxForce = Math.max(0, value);
225
+ this.world?._applyJointMotor(this);
226
+ }
227
+ /** A rope's longest distance, or a spring's rest length, in metres. Default 1. */ get length() {
228
+ return this._length;
229
+ }
230
+ set length(value) {
231
+ this._length = Math.max(0, value);
232
+ this._rebuild();
233
+ }
234
+ /** How hard a spring pulls, per metre stretched. Default 100. */ get stiffness() {
235
+ return this._stiffness;
236
+ }
237
+ set stiffness(value) {
238
+ this._stiffness = Math.max(0, value);
239
+ this._rebuild();
240
+ }
241
+ /** How quickly a spring stops bouncing. Default 5. */ get damping() {
242
+ return this._damping;
243
+ }
244
+ set damping(value) {
245
+ this._damping = Math.max(0, value);
246
+ this._rebuild();
247
+ }
248
+ /** A hinge's current angle in degrees, 0 where it was created; 0 for other joints. */ get angle() {
249
+ return this._type === 'hinge' ? this.world?._jointValue(this) ?? 0 : 0;
250
+ }
251
+ /** A slider's current position in metres, 0 where it was created; 0 for other joints. */ get position() {
252
+ return this._type === 'slider' ? this.world?._jointValue(this) ?? 0 : 0;
253
+ }
254
+ /** Why the joint could not be created, or an empty string. */ get error() {
255
+ return this._error;
256
+ }
257
+ _setError(error) {
258
+ this._error = error;
259
+ }
260
+ _rebuild() {
261
+ this.world?._markJointDirty(this);
262
+ }
263
+ _join(world) {
264
+ world._registerJoint(this);
265
+ }
266
+ _leave(world) {
267
+ world._unregisterJoint(this);
268
+ }
269
+ }
270
+
271
+ export { Joint };
272
+ //# sourceMappingURL=joint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joint.js","sources":["../../src/physics/joint.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport { PhysicsPart } from './part';\r\nimport type { PhysicsWorld } from './world';\r\n\r\n/**\r\n * What a {@link Joint} allows its two bodies to do.\r\n *\r\n * - `fixed`: nothing - they move as one.\r\n * - `hinge`: turn about the joint's axis, like a door.\r\n * - `slider`: slide along the joint's axis, like a drawer.\r\n * - `ball`: turn freely about the pivot, like a shoulder or a chain link.\r\n * - `rope`: move freely, but no further apart than {@link Joint.length}.\r\n * - `spring`: pulled back towards {@link Joint.length} apart.\r\n *\r\n * @public\r\n */\r\nexport type JointType = 'fixed' | 'hinge' | 'slider' | 'ball' | 'rope' | 'spring';\r\n\r\n/**\r\n * Drives a hinge or slider.\r\n *\r\n * - `off`: no drive.\r\n * - `velocity`: towards turning or sliding at {@link Joint.motorTarget}.\r\n * - `position`: towards the angle or position {@link Joint.motorTarget}.\r\n *\r\n * @public\r\n */\r\nexport type JointMotorMode = 'off' | 'velocity' | 'position';\r\n\r\n/**\r\n * Connects two rigid bodies, or a rigid body and a fixed point in the world.\r\n *\r\n * @remarks\r\n * The joint's own node is the joint's frame: the pivot is the node's origin\r\n * (moved by {@link Joint.anchor}), and a hinge turns about, or a slider moves\r\n * along, the node's local {@link Joint.axis}. To put a door's hinge at the edge\r\n * of the door, put the joint on a child node placed there. A rope or spring\r\n * runs from that pivot to {@link Joint.connectedAnchor} at the other end.\r\n *\r\n * Angles and positions measure how the joint's own body has turned or moved\r\n * relative to the other end, about or along the axis: a hinge turning\r\n * counter-clockwise seen from the tip of its axis has a growing angle.\r\n *\r\n * One side is the nearest {@link RigidBody} on the joint's node or above it; the\r\n * other is the nearest rigid body on {@link Joint.connectedBody} or above it, or\r\n * the world when that is empty.\r\n *\r\n * The joint holds the bodies in the pose they have when it is created: a\r\n * hinge's angle is 0 there. Limits and motor targets are relative to it.\r\n *\r\n * Joints cannot break under load: physics implementations do not report the\r\n * forces on them.\r\n *\r\n * @public\r\n */\r\nexport class Joint extends PhysicsPart {\r\n private _type: JointType;\r\n private _connectedBodyId: string;\r\n private _connectedBody: SceneNode | null;\r\n private readonly _anchor: Vector3;\r\n private readonly _connectedAnchor: Vector3;\r\n private readonly _axis: Vector3;\r\n private _collideConnected: boolean;\r\n private _limitsEnabled: boolean;\r\n private _lowerLimit: number;\r\n private _upperLimit: number;\r\n private _swingLimit: number;\r\n private _twistLimit: number;\r\n private _motorMode: JointMotorMode;\r\n private _motorTarget: number;\r\n private _motorStiffness: number;\r\n private _motorDamping: number;\r\n private _motorMaxForce: number;\r\n private _length: number;\r\n private _stiffness: number;\r\n private _damping: number;\r\n private _error: string;\r\n\r\n constructor() {\r\n super();\r\n this._type = 'hinge';\r\n this._connectedBodyId = '';\r\n this._connectedBody = null;\r\n this._anchor = new Vector3();\r\n this._connectedAnchor = new Vector3();\r\n this._axis = new Vector3(0, 1, 0);\r\n this._collideConnected = false;\r\n this._limitsEnabled = false;\r\n this._lowerLimit = -45;\r\n this._upperLimit = 45;\r\n this._swingLimit = 45;\r\n this._twistLimit = 45;\r\n this._motorMode = 'off';\r\n this._motorTarget = 0;\r\n this._motorStiffness = 1000;\r\n this._motorDamping = 100;\r\n this._motorMaxForce = 0;\r\n this._length = 1;\r\n this._stiffness = 100;\r\n this._damping = 5;\r\n this._error = '';\r\n }\r\n\r\n /** What the joint allows. Default `'hinge'`. */\r\n get type() {\r\n return this._type;\r\n }\r\n set type(value: JointType) {\r\n if (value !== this._type) {\r\n this._type = value;\r\n this._rebuild();\r\n }\r\n }\r\n /**\r\n * The node whose rigid body is the other side of the joint; null connects to\r\n * a fixed point in the world. Stored by the node's persistent id, so it may\r\n * be set before that node is loaded or added.\r\n */\r\n get connectedBody(): SceneNode | null {\r\n const scene = this.node?.scene;\r\n if (!this._connectedBodyId || !scene) {\r\n return this._connectedBody;\r\n }\r\n // Looked up again if it left the scene: it may come back, or be replaced\r\n // by a node loaded with the same id.\r\n if (!this._connectedBody || this._connectedBody.scene !== scene || !this._connectedBody.attached) {\r\n this._connectedBody = scene.findNodeById(this._connectedBodyId) ?? null;\r\n }\r\n return this._connectedBody?.attached ? this._connectedBody : null;\r\n }\r\n set connectedBody(node: SceneNode | null) {\r\n this._connectedBody = node;\r\n this._connectedBodyId = node?.persistentId ?? '';\r\n this._rebuild();\r\n }\r\n /** Persistent id of {@link Joint.connectedBody}, or an empty string. */\r\n get connectedBodyId() {\r\n return this._connectedBodyId;\r\n }\r\n set connectedBodyId(id: string) {\r\n if (id !== this._connectedBodyId) {\r\n this._connectedBodyId = id;\r\n this._connectedBody = null;\r\n this._rebuild();\r\n }\r\n }\r\n /** Pivot position in the joint node's local space. Default (0, 0, 0). */\r\n get anchor(): Vector3 {\r\n return this._anchor;\r\n }\r\n set anchor(value: Vector3) {\r\n this._anchor.set(value);\r\n this._rebuild();\r\n }\r\n /**\r\n * Where a rope or spring is tied at the other end: in the connected body's\r\n * node space, or in world space when connected to the world. Default (0, 0, 0).\r\n * Other joints pivot at the joint node only.\r\n */\r\n get connectedAnchor(): Vector3 {\r\n return this._connectedAnchor;\r\n }\r\n set connectedAnchor(value: Vector3) {\r\n this._connectedAnchor.set(value);\r\n this._rebuild();\r\n }\r\n /** Hinge or slider axis in the joint node's local space. Default (0, 1, 0). */\r\n get axis(): Vector3 {\r\n return this._axis;\r\n }\r\n set axis(value: Vector3) {\r\n this._axis.set(value);\r\n this._rebuild();\r\n }\r\n /** Whether the two connected bodies still collide with each other. Default false. */\r\n get collideConnected() {\r\n return this._collideConnected;\r\n }\r\n set collideConnected(value: boolean) {\r\n this._collideConnected = !!value;\r\n this.world?._getJointHandle(this)?.setContactsEnabled(this._collideConnected);\r\n }\r\n /** Whether a hinge, slider or ball joint is limited. Default false. */\r\n get limitsEnabled() {\r\n return this._limitsEnabled;\r\n }\r\n set limitsEnabled(value: boolean) {\r\n if (!!value !== this._limitsEnabled) {\r\n this._limitsEnabled = !!value;\r\n // Limits can only be turned off again by rebuilding the joint.\r\n this._rebuild();\r\n }\r\n }\r\n /** Lowest angle of a hinge in degrees, or position of a slider in metres. Default -45. */\r\n get lowerLimit() {\r\n return this._lowerLimit;\r\n }\r\n set lowerLimit(value: number) {\r\n this._lowerLimit = value;\r\n this.world?._applyJointLimits(this);\r\n }\r\n /** Highest angle of a hinge in degrees, or position of a slider in metres. Default 45. */\r\n get upperLimit() {\r\n return this._upperLimit;\r\n }\r\n set upperLimit(value: number) {\r\n this._upperLimit = value;\r\n this.world?._applyJointLimits(this);\r\n }\r\n /** How far a ball joint may swing away from its axis, in degrees each way. Default 45. */\r\n get swingLimit() {\r\n return this._swingLimit;\r\n }\r\n set swingLimit(value: number) {\r\n this._swingLimit = Math.max(0, value);\r\n this.world?._applyJointLimits(this);\r\n }\r\n /** How far a ball joint may twist about its axis, in degrees each way. Default 45. */\r\n get twistLimit() {\r\n return this._twistLimit;\r\n }\r\n set twistLimit(value: number) {\r\n this._twistLimit = Math.max(0, value);\r\n this.world?._applyJointLimits(this);\r\n }\r\n /** How a hinge or slider is driven. Default `'off'`. */\r\n get motorMode() {\r\n return this._motorMode;\r\n }\r\n set motorMode(value: JointMotorMode) {\r\n this._motorMode = value;\r\n this.world?._applyJointMotor(this);\r\n }\r\n /**\r\n * In `velocity` mode the speed to reach: degrees per second for a hinge,\r\n * metres per second for a slider. In `position` mode the angle (degrees) or\r\n * position (metres) to reach. Default 0.\r\n */\r\n get motorTarget() {\r\n return this._motorTarget;\r\n }\r\n set motorTarget(value: number) {\r\n this._motorTarget = value;\r\n this.world?._applyJointMotor(this);\r\n }\r\n /** How strongly a `position` motor pulls towards its target. Default 1000. */\r\n get motorStiffness() {\r\n return this._motorStiffness;\r\n }\r\n set motorStiffness(value: number) {\r\n this._motorStiffness = Math.max(0, value);\r\n this.world?._applyJointMotor(this);\r\n }\r\n /**\r\n * How strongly a motor resists overshooting; in `velocity` mode, how quickly\r\n * it gets up to speed. Default 100.\r\n */\r\n get motorDamping() {\r\n return this._motorDamping;\r\n }\r\n set motorDamping(value: number) {\r\n this._motorDamping = Math.max(0, value);\r\n this.world?._applyJointMotor(this);\r\n }\r\n /** Most force (or torque) the motor applies; 0 for no limit. Default 0. */\r\n get motorMaxForce() {\r\n return this._motorMaxForce;\r\n }\r\n set motorMaxForce(value: number) {\r\n this._motorMaxForce = Math.max(0, value);\r\n this.world?._applyJointMotor(this);\r\n }\r\n /** A rope's longest distance, or a spring's rest length, in metres. Default 1. */\r\n get length() {\r\n return this._length;\r\n }\r\n set length(value: number) {\r\n this._length = Math.max(0, value);\r\n this._rebuild();\r\n }\r\n /** How hard a spring pulls, per metre stretched. Default 100. */\r\n get stiffness() {\r\n return this._stiffness;\r\n }\r\n set stiffness(value: number) {\r\n this._stiffness = Math.max(0, value);\r\n this._rebuild();\r\n }\r\n /** How quickly a spring stops bouncing. Default 5. */\r\n get damping() {\r\n return this._damping;\r\n }\r\n set damping(value: number) {\r\n this._damping = Math.max(0, value);\r\n this._rebuild();\r\n }\r\n /** A hinge's current angle in degrees, 0 where it was created; 0 for other joints. */\r\n get angle() {\r\n return this._type === 'hinge' ? (this.world?._jointValue(this) ?? 0) : 0;\r\n }\r\n /** A slider's current position in metres, 0 where it was created; 0 for other joints. */\r\n get position() {\r\n return this._type === 'slider' ? (this.world?._jointValue(this) ?? 0) : 0;\r\n }\r\n /** Why the joint could not be created, or an empty string. */\r\n get error() {\r\n return this._error;\r\n }\r\n\r\n _setError(error: string) {\r\n this._error = error;\r\n }\r\n private _rebuild() {\r\n this.world?._markJointDirty(this);\r\n }\r\n protected _join(world: PhysicsWorld) {\r\n world._registerJoint(this);\r\n }\r\n protected _leave(world: PhysicsWorld) {\r\n world._unregisterJoint(this);\r\n }\r\n}\r\n"],"names":["Joint","PhysicsPart","_type","_connectedBodyId","_connectedBody","_anchor","_connectedAnchor","_axis","_collideConnected","_limitsEnabled","_lowerLimit","_upperLimit","_swingLimit","_twistLimit","_motorMode","_motorTarget","_motorStiffness","_motorDamping","_motorMaxForce","_length","_stiffness","_damping","_error","Vector3","type","value","_rebuild","connectedBody","scene","node","attached","findNodeById","persistentId","connectedBodyId","id","anchor","set","connectedAnchor","axis","collideConnected","world","_getJointHandle","setContactsEnabled","limitsEnabled","lowerLimit","_applyJointLimits","upperLimit","swingLimit","Math","max","twistLimit","motorMode","_applyJointMotor","motorTarget","motorStiffness","motorDamping","motorMaxForce","length","stiffness","damping","angle","_jointValue","position","error","_setError","_markJointDirty","_join","_registerJoint","_leave","_unregisterJoint"],"mappings":"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"}