@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,234 @@
1
+ import { makeObservable, Disposable } from '@zephyr3d/base';
2
+
3
+ let nextObjectId = 1;
4
+ /**
5
+ * The physics data of a scene node: {@link SceneNode.physics}.
6
+ *
7
+ * @remarks
8
+ * Plain data until the node is in a scene with a {@link PhysicsWorld}, which
9
+ * then simulates it; without one it is kept, saved and loaded as is.
10
+ *
11
+ * - {@link NodePhysics.body}: a {@link RigidBody}.
12
+ * - {@link NodePhysics.character}: a {@link CharacterController}. A node has a
13
+ * rigid body or a character, not both: setting one clears the other.
14
+ * - {@link NodePhysics.colliders}: collision shapes. They belong to the nearest
15
+ * rigid body on this node or above it; with none, they are static.
16
+ * - {@link NodePhysics.joint}: links the nearest rigid body to another one.
17
+ * - {@link NodePhysics.vehicle}: drives the node's dynamic rigid body as a vehicle.
18
+ * - {@link NodePhysics.wheel}: a wheel of the vehicle above.
19
+ *
20
+ * Collision and trigger events are raised on the physics data of the node that
21
+ * has the rigid body or character, or of a node with static colliders; see
22
+ * {@link PhysicsEventMap}.
23
+ *
24
+ * @public
25
+ */ class NodePhysics extends makeObservable(Disposable)() {
26
+ /** Identifies the object in pair bookkeeping, in creation order. */ _physicsId;
27
+ _node;
28
+ _body;
29
+ _character;
30
+ _colliders;
31
+ _joint;
32
+ _vehicle;
33
+ _wheel;
34
+ /**
35
+ * @param init - Parts to start with, as if assigned one by one:
36
+ * `new NodePhysics({ body: new RigidBody(), colliders: [collider] })`.
37
+ */ constructor(init){
38
+ super();
39
+ this._physicsId = nextObjectId++;
40
+ this._node = null;
41
+ this._body = null;
42
+ this._character = null;
43
+ this._colliders = [];
44
+ this._joint = null;
45
+ this._vehicle = null;
46
+ this._wheel = null;
47
+ if (init) {
48
+ this.body = init.body ?? null;
49
+ if (init.character) {
50
+ this.character = init.character;
51
+ }
52
+ this.colliders = init.colliders ?? [];
53
+ this.joint = init.joint ?? null;
54
+ this.vehicle = init.vehicle ?? null;
55
+ this.wheel = init.wheel ?? null;
56
+ }
57
+ }
58
+ /** The node this data is on. */ get node() {
59
+ return this._node;
60
+ }
61
+ /** The node's rigid body, or null. Setting one removes the node's character. */ get body() {
62
+ return this._body;
63
+ }
64
+ set body(value) {
65
+ const current = this._body;
66
+ if (current !== value) {
67
+ this._check(value);
68
+ if (value) {
69
+ this.character = null;
70
+ }
71
+ this._body = value ?? null;
72
+ current?._setOwner(null);
73
+ value?._setOwner(this);
74
+ }
75
+ }
76
+ /** The node's character controller, or null. Setting one removes the node's rigid body. */ get character() {
77
+ return this._character;
78
+ }
79
+ set character(value) {
80
+ const current = this._character;
81
+ if (current !== value) {
82
+ this._check(value);
83
+ if (value) {
84
+ this.body = null;
85
+ }
86
+ this._character = value ?? null;
87
+ current?._setOwner(null);
88
+ value?._setOwner(this);
89
+ }
90
+ }
91
+ /** The node's collision shapes. */ get colliders() {
92
+ return this._colliders;
93
+ }
94
+ set colliders(value) {
95
+ const next = [
96
+ ...new Set(value ?? [])
97
+ ];
98
+ next.forEach((c)=>this._check(c));
99
+ for (const c of this._colliders){
100
+ if (!next.includes(c)) {
101
+ c._setOwner(null);
102
+ }
103
+ }
104
+ const added = next.filter((c)=>!this._colliders.includes(c));
105
+ this._colliders = next;
106
+ for (const c of added){
107
+ c._setOwner(this);
108
+ }
109
+ }
110
+ /** Adds a collision shape. */ addCollider(collider) {
111
+ if (!this._colliders.includes(collider)) {
112
+ this.colliders = [
113
+ ...this._colliders,
114
+ collider
115
+ ];
116
+ }
117
+ return collider;
118
+ }
119
+ /** Removes a collision shape; returns false if it was not on this node. */ removeCollider(collider) {
120
+ if (!this._colliders.includes(collider)) {
121
+ return false;
122
+ }
123
+ this.colliders = this._colliders.filter((c)=>c !== collider);
124
+ return true;
125
+ }
126
+ /** The node's joint, or null. */ get joint() {
127
+ return this._joint;
128
+ }
129
+ set joint(value) {
130
+ const current = this._joint;
131
+ if (current !== value) {
132
+ this._check(value);
133
+ this._joint = value ?? null;
134
+ current?._setOwner(null);
135
+ value?._setOwner(this);
136
+ }
137
+ }
138
+ /** Drives the node's dynamic rigid body as a vehicle, or null. */ get vehicle() {
139
+ return this._vehicle;
140
+ }
141
+ set vehicle(value) {
142
+ const current = this._vehicle;
143
+ if (current !== value) {
144
+ this._check(value);
145
+ this._vehicle = value ?? null;
146
+ current?._setOwner(null);
147
+ value?._setOwner(this);
148
+ }
149
+ }
150
+ /** Makes the node a wheel of the vehicle above it, or null. */ get wheel() {
151
+ return this._wheel;
152
+ }
153
+ set wheel(value) {
154
+ const current = this._wheel;
155
+ if (current !== value) {
156
+ this._check(value);
157
+ this._wheel = value ?? null;
158
+ current?._setOwner(null);
159
+ value?._setOwner(this);
160
+ }
161
+ }
162
+ /** Every part, in a fixed order: body or character, colliders, joint, vehicle, wheel. */ get parts() {
163
+ const parts = [];
164
+ if (this._body) {
165
+ parts.push(this._body);
166
+ }
167
+ if (this._character) {
168
+ parts.push(this._character);
169
+ }
170
+ parts.push(...this._colliders);
171
+ for (const p of [
172
+ this._joint,
173
+ this._vehicle,
174
+ this._wheel
175
+ ]){
176
+ if (p) {
177
+ parts.push(p);
178
+ }
179
+ }
180
+ return parts;
181
+ }
182
+ /** Whether anything listens to an event, to skip computing it otherwise. */ _hasListeners(type) {
183
+ return !!this._listeners?.[type]?.some((l)=>!l.removed);
184
+ }
185
+ /** Puts the data on a node, or takes it off with null. Called by {@link SceneNode.physics}. */ _setNode(node) {
186
+ if (node === this._node) {
187
+ return;
188
+ }
189
+ if (node && this._node) {
190
+ throw new Error('Physics data already belongs to another node.');
191
+ }
192
+ if (!node) {
193
+ for (const part of this.parts){
194
+ part._leaveWorld();
195
+ }
196
+ }
197
+ this._node = node;
198
+ if (node) {
199
+ for (const part of this.parts){
200
+ part._enterWorld();
201
+ }
202
+ }
203
+ }
204
+ /** The node entered a scene. */ _hostAttached() {
205
+ for (const part of this.parts){
206
+ part._enterWorld();
207
+ }
208
+ }
209
+ /** The node left its scene. */ _hostDetached() {
210
+ for (const part of this.parts){
211
+ part._leaveWorld();
212
+ }
213
+ }
214
+ _check(part) {
215
+ if (part?.owner && part.owner !== this) {
216
+ throw new Error('Physics data already belongs to another node.');
217
+ }
218
+ }
219
+ onDispose() {
220
+ super.onDispose();
221
+ for (const part of this.parts){
222
+ part.dispose();
223
+ }
224
+ this._colliders = [];
225
+ this._body = null;
226
+ this._character = null;
227
+ this._joint = null;
228
+ this._vehicle = null;
229
+ this._wheel = null;
230
+ }
231
+ }
232
+
233
+ export { NodePhysics };
234
+ //# sourceMappingURL=node_physics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node_physics.js","sources":["../../src/physics/node_physics.ts"],"sourcesContent":["import { Disposable, makeObservable } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { PhysicsPart } from './part';\r\nimport type { PhysicsEventMap } from './types';\r\nimport type { RigidBody } from './rigid_body';\r\nimport type { Collider } from './collider';\r\nimport type { Joint } from './joint';\r\nimport type { CharacterController } from './character';\r\nimport type { Vehicle, Wheel } from './vehicle';\r\n\r\nlet nextObjectId = 1;\r\n\r\n/**\r\n * Parts to create a {@link NodePhysics} with.\r\n *\r\n * @public\r\n */\r\nexport interface NodePhysicsInit {\r\n body?: Nullable<RigidBody>;\r\n character?: Nullable<CharacterController>;\r\n colliders?: readonly Collider[];\r\n joint?: Nullable<Joint>;\r\n vehicle?: Nullable<Vehicle>;\r\n wheel?: Nullable<Wheel>;\r\n}\r\n\r\n/**\r\n * The physics data of a scene node: {@link SceneNode.physics}.\r\n *\r\n * @remarks\r\n * Plain data until the node is in a scene with a {@link PhysicsWorld}, which\r\n * then simulates it; without one it is kept, saved and loaded as is.\r\n *\r\n * - {@link NodePhysics.body}: a {@link RigidBody}.\r\n * - {@link NodePhysics.character}: a {@link CharacterController}. A node has a\r\n * rigid body or a character, not both: setting one clears the other.\r\n * - {@link NodePhysics.colliders}: collision shapes. They belong to the nearest\r\n * rigid body on this node or above it; with none, they are static.\r\n * - {@link NodePhysics.joint}: links the nearest rigid body to another one.\r\n * - {@link NodePhysics.vehicle}: drives the node's dynamic rigid body as a vehicle.\r\n * - {@link NodePhysics.wheel}: a wheel of the vehicle above.\r\n *\r\n * Collision and trigger events are raised on the physics data of the node that\r\n * has the rigid body or character, or of a node with static colliders; see\r\n * {@link PhysicsEventMap}.\r\n *\r\n * @public\r\n */\r\nexport class NodePhysics extends makeObservable(Disposable)<PhysicsEventMap>() {\r\n /** Identifies the object in pair bookkeeping, in creation order. */\r\n readonly _physicsId: number;\r\n private _node: Nullable<SceneNode>;\r\n private _body: Nullable<RigidBody>;\r\n private _character: Nullable<CharacterController>;\r\n private _colliders: Collider[];\r\n private _joint: Nullable<Joint>;\r\n private _vehicle: Nullable<Vehicle>;\r\n private _wheel: Nullable<Wheel>;\r\n /**\r\n * @param init - Parts to start with, as if assigned one by one:\r\n * `new NodePhysics({ body: new RigidBody(), colliders: [collider] })`.\r\n */\r\n constructor(init?: NodePhysicsInit) {\r\n super();\r\n this._physicsId = nextObjectId++;\r\n this._node = null;\r\n this._body = null;\r\n this._character = null;\r\n this._colliders = [];\r\n this._joint = null;\r\n this._vehicle = null;\r\n this._wheel = null;\r\n if (init) {\r\n this.body = init.body ?? null;\r\n if (init.character) {\r\n this.character = init.character;\r\n }\r\n this.colliders = init.colliders ?? [];\r\n this.joint = init.joint ?? null;\r\n this.vehicle = init.vehicle ?? null;\r\n this.wheel = init.wheel ?? null;\r\n }\r\n }\r\n /** The node this data is on. */\r\n get node(): Nullable<SceneNode> {\r\n return this._node;\r\n }\r\n /** The node's rigid body, or null. Setting one removes the node's character. */\r\n get body(): Nullable<RigidBody> {\r\n return this._body;\r\n }\r\n set body(value: Nullable<RigidBody>) {\r\n const current = this._body;\r\n if (current !== value) {\r\n this._check(value);\r\n if (value) {\r\n this.character = null;\r\n }\r\n this._body = value ?? null;\r\n current?._setOwner(null);\r\n value?._setOwner(this);\r\n }\r\n }\r\n /** The node's character controller, or null. Setting one removes the node's rigid body. */\r\n get character(): Nullable<CharacterController> {\r\n return this._character;\r\n }\r\n set character(value: Nullable<CharacterController>) {\r\n const current = this._character;\r\n if (current !== value) {\r\n this._check(value);\r\n if (value) {\r\n this.body = null;\r\n }\r\n this._character = value ?? null;\r\n current?._setOwner(null);\r\n value?._setOwner(this);\r\n }\r\n }\r\n /** The node's collision shapes. */\r\n get colliders(): readonly Collider[] {\r\n return this._colliders;\r\n }\r\n set colliders(value: readonly Collider[]) {\r\n const next = [...new Set(value ?? [])];\r\n next.forEach((c) => this._check(c));\r\n for (const c of this._colliders) {\r\n if (!next.includes(c)) {\r\n c._setOwner(null);\r\n }\r\n }\r\n const added = next.filter((c) => !this._colliders.includes(c));\r\n this._colliders = next;\r\n for (const c of added) {\r\n c._setOwner(this);\r\n }\r\n }\r\n /** Adds a collision shape. */\r\n addCollider(collider: Collider) {\r\n if (!this._colliders.includes(collider)) {\r\n this.colliders = [...this._colliders, collider];\r\n }\r\n return collider;\r\n }\r\n /** Removes a collision shape; returns false if it was not on this node. */\r\n removeCollider(collider: Collider) {\r\n if (!this._colliders.includes(collider)) {\r\n return false;\r\n }\r\n this.colliders = this._colliders.filter((c) => c !== collider);\r\n return true;\r\n }\r\n /** The node's joint, or null. */\r\n get joint(): Nullable<Joint> {\r\n return this._joint;\r\n }\r\n set joint(value: Nullable<Joint>) {\r\n const current = this._joint;\r\n if (current !== value) {\r\n this._check(value);\r\n this._joint = value ?? null;\r\n current?._setOwner(null);\r\n value?._setOwner(this);\r\n }\r\n }\r\n /** Drives the node's dynamic rigid body as a vehicle, or null. */\r\n get vehicle(): Nullable<Vehicle> {\r\n return this._vehicle;\r\n }\r\n set vehicle(value: Nullable<Vehicle>) {\r\n const current = this._vehicle;\r\n if (current !== value) {\r\n this._check(value);\r\n this._vehicle = value ?? null;\r\n current?._setOwner(null);\r\n value?._setOwner(this);\r\n }\r\n }\r\n /** Makes the node a wheel of the vehicle above it, or null. */\r\n get wheel(): Nullable<Wheel> {\r\n return this._wheel;\r\n }\r\n set wheel(value: Nullable<Wheel>) {\r\n const current = this._wheel;\r\n if (current !== value) {\r\n this._check(value);\r\n this._wheel = value ?? null;\r\n current?._setOwner(null);\r\n value?._setOwner(this);\r\n }\r\n }\r\n /** Every part, in a fixed order: body or character, colliders, joint, vehicle, wheel. */\r\n get parts(): PhysicsPart[] {\r\n const parts: PhysicsPart[] = [];\r\n if (this._body) {\r\n parts.push(this._body);\r\n }\r\n if (this._character) {\r\n parts.push(this._character);\r\n }\r\n parts.push(...this._colliders);\r\n for (const p of [this._joint, this._vehicle, this._wheel]) {\r\n if (p) {\r\n parts.push(p);\r\n }\r\n }\r\n return parts;\r\n }\r\n /** Whether anything listens to an event, to skip computing it otherwise. */\r\n _hasListeners(type: keyof PhysicsEventMap) {\r\n return !!this._listeners?.[type]?.some((l) => !l.removed);\r\n }\r\n /** Puts the data on a node, or takes it off with null. Called by {@link SceneNode.physics}. */\r\n _setNode(node: Nullable<SceneNode>) {\r\n if (node === this._node) {\r\n return;\r\n }\r\n if (node && this._node) {\r\n throw new Error('Physics data already belongs to another node.');\r\n }\r\n if (!node) {\r\n for (const part of this.parts) {\r\n part._leaveWorld();\r\n }\r\n }\r\n this._node = node;\r\n if (node) {\r\n for (const part of this.parts) {\r\n part._enterWorld();\r\n }\r\n }\r\n }\r\n /** The node entered a scene. */\r\n _hostAttached() {\r\n for (const part of this.parts) {\r\n part._enterWorld();\r\n }\r\n }\r\n /** The node left its scene. */\r\n _hostDetached() {\r\n for (const part of this.parts) {\r\n part._leaveWorld();\r\n }\r\n }\r\n private _check(part: Nullable<PhysicsPart>) {\r\n if (part?.owner && part.owner !== this) {\r\n throw new Error('Physics data already belongs to another node.');\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const part of this.parts) {\r\n part.dispose();\r\n }\r\n this._colliders = [];\r\n this._body = null;\r\n this._character = null;\r\n this._joint = null;\r\n this._vehicle = null;\r\n this._wheel = null;\r\n }\r\n}\r\n"],"names":["nextObjectId","NodePhysics","makeObservable","Disposable","_node","_body","_character","_colliders","_joint","_vehicle","_wheel","init","_physicsId","body","character","colliders","joint","vehicle","wheel","node","value","current","_check","_setOwner","next","Set","forEach","c","includes","added","filter","addCollider","collider","removeCollider","parts","push","p","_hasListeners","type","_listeners","some","l","removed","_setNode","Error","part","_leaveWorld","_enterWorld","_hostAttached","_hostDetached","owner","onDispose","dispose"],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { makeObservable, Disposable } from '@zephyr3d/base';
2
+
3
+ let nextPhysicsId = 1;
4
+ /**
5
+ * Common lifecycle of the physics data on a node - {@link RigidBody},
6
+ * {@link Collider}, {@link Joint}, {@link CharacterController}, {@link Vehicle}
7
+ * and {@link Wheel}: part of the scene's {@link PhysicsWorld} while its node is
8
+ * in a scene that has one.
9
+ *
10
+ * @remarks
11
+ * A part belongs to at most one {@link NodePhysics}.
12
+ *
13
+ * @public
14
+ */ class PhysicsPart extends makeObservable(Disposable)() {
15
+ /** Identifies the part in pair bookkeeping, in creation order. */ _physicsId;
16
+ _owner;
17
+ /** The node, for parts that belong to another part rather than to a NodePhysics. */ _ownerNode;
18
+ _world;
19
+ constructor(){
20
+ super();
21
+ this._physicsId = nextPhysicsId++;
22
+ this._owner = null;
23
+ this._ownerNode = null;
24
+ this._world = null;
25
+ }
26
+ /** The physics data of the node this part is on. */ get owner() {
27
+ return this._owner;
28
+ }
29
+ /** The node this part is on. */ get node() {
30
+ return this._owner?.node ?? this._ownerNode;
31
+ }
32
+ /** The world this part is in, while its node is in a scene that has one. */ get world() {
33
+ return this._world;
34
+ }
35
+ /** Puts the part on a NodePhysics, or takes it off with null. */ _setOwner(owner) {
36
+ if (owner === this._owner) {
37
+ return;
38
+ }
39
+ if (owner && this._owner) {
40
+ throw new Error('Physics data already belongs to another node.');
41
+ }
42
+ if (!owner) {
43
+ this._leaveWorld();
44
+ }
45
+ this._owner = owner;
46
+ if (owner) {
47
+ this._enterWorld();
48
+ }
49
+ }
50
+ /** Puts a part owned by another part on a node, or takes it off with null. */ _setOwnerNode(node) {
51
+ if (node === this._ownerNode) {
52
+ return;
53
+ }
54
+ if (!node) {
55
+ this._leaveWorld();
56
+ }
57
+ this._ownerNode = node;
58
+ if (node) {
59
+ this._enterWorld();
60
+ }
61
+ }
62
+ /** Joins the world of the node's scene, if the node is in one. */ _enterWorld() {
63
+ const node = this.node;
64
+ if (this._world || !node?.attached || !node.scene) {
65
+ return;
66
+ }
67
+ const world = node.scene.physicsWorld;
68
+ if (world && !world.disposed) {
69
+ this._world = world;
70
+ this._join(world);
71
+ }
72
+ }
73
+ /** Leaves its world. */ _leaveWorld() {
74
+ if (this._world) {
75
+ if (!this._world.disposed) {
76
+ this._leave(this._world);
77
+ }
78
+ this._world = null;
79
+ }
80
+ }
81
+ /** Whether anything listens to an event, to skip computing it otherwise. */ _hasListeners(type) {
82
+ return !!this._listeners?.[type]?.some((l)=>!l.removed);
83
+ }
84
+ onDispose() {
85
+ super.onDispose();
86
+ this._leaveWorld();
87
+ }
88
+ }
89
+
90
+ export { PhysicsPart };
91
+ //# sourceMappingURL=part.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"part.js","sources":["../../src/physics/part.ts"],"sourcesContent":["import { Disposable, makeObservable } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { NodePhysics } from './node_physics';\r\nimport type { PhysicsWorld } from './world';\r\n\r\nlet nextPhysicsId = 1;\r\n\r\n/**\r\n * Events of physics parts: `ready` is raised by a {@link Collider} when it comes\r\n * into the simulation.\r\n *\r\n * @public\r\n */\r\nexport type PhysicsPartEventMap = {\r\n ready: [];\r\n};\r\n\r\n/**\r\n * Common lifecycle of the physics data on a node - {@link RigidBody},\r\n * {@link Collider}, {@link Joint}, {@link CharacterController}, {@link Vehicle}\r\n * and {@link Wheel}: part of the scene's {@link PhysicsWorld} while its node is\r\n * in a scene that has one.\r\n *\r\n * @remarks\r\n * A part belongs to at most one {@link NodePhysics}.\r\n *\r\n * @public\r\n */\r\nexport abstract class PhysicsPart extends makeObservable(Disposable)<PhysicsPartEventMap>() {\r\n /** Identifies the part in pair bookkeeping, in creation order. */\r\n readonly _physicsId: number;\r\n private _owner: Nullable<NodePhysics>;\r\n /** The node, for parts that belong to another part rather than to a NodePhysics. */\r\n private _ownerNode: Nullable<SceneNode>;\r\n private _world: Nullable<PhysicsWorld>;\r\n constructor() {\r\n super();\r\n this._physicsId = nextPhysicsId++;\r\n this._owner = null;\r\n this._ownerNode = null;\r\n this._world = null;\r\n }\r\n /** The physics data of the node this part is on. */\r\n get owner(): Nullable<NodePhysics> {\r\n return this._owner;\r\n }\r\n /** The node this part is on. */\r\n get node(): Nullable<SceneNode> {\r\n return this._owner?.node ?? this._ownerNode;\r\n }\r\n /** The world this part is in, while its node is in a scene that has one. */\r\n get world(): Nullable<PhysicsWorld> {\r\n return this._world;\r\n }\r\n /** Puts the part on a NodePhysics, or takes it off with null. */\r\n _setOwner(owner: Nullable<NodePhysics>) {\r\n if (owner === this._owner) {\r\n return;\r\n }\r\n if (owner && this._owner) {\r\n throw new Error('Physics data already belongs to another node.');\r\n }\r\n if (!owner) {\r\n this._leaveWorld();\r\n }\r\n this._owner = owner;\r\n if (owner) {\r\n this._enterWorld();\r\n }\r\n }\r\n /** Puts a part owned by another part on a node, or takes it off with null. */\r\n _setOwnerNode(node: Nullable<SceneNode>) {\r\n if (node === this._ownerNode) {\r\n return;\r\n }\r\n if (!node) {\r\n this._leaveWorld();\r\n }\r\n this._ownerNode = node;\r\n if (node) {\r\n this._enterWorld();\r\n }\r\n }\r\n /** Joins the world of the node's scene, if the node is in one. */\r\n _enterWorld() {\r\n const node = this.node;\r\n if (this._world || !node?.attached || !node.scene) {\r\n return;\r\n }\r\n const world = node.scene.physicsWorld;\r\n if (world && !world.disposed) {\r\n this._world = world;\r\n this._join(world);\r\n }\r\n }\r\n /** Leaves its world. */\r\n _leaveWorld() {\r\n if (this._world) {\r\n if (!this._world.disposed) {\r\n this._leave(this._world);\r\n }\r\n this._world = null;\r\n }\r\n }\r\n /** Whether anything listens to an event, to skip computing it otherwise. */\r\n _hasListeners(type: keyof PhysicsPartEventMap) {\r\n return !!this._listeners?.[type]?.some((l) => !l.removed);\r\n }\r\n protected abstract _join(world: PhysicsWorld): void;\r\n protected abstract _leave(world: PhysicsWorld): void;\r\n protected onDispose() {\r\n super.onDispose();\r\n this._leaveWorld();\r\n }\r\n}\r\n"],"names":["nextPhysicsId","PhysicsPart","makeObservable","Disposable","_owner","_world","_physicsId","_ownerNode","owner","node","world","_setOwner","Error","_leaveWorld","_enterWorld","_setOwnerNode","attached","scene","physicsWorld","disposed","_join","_leave","_hasListeners","type","_listeners","some","l","removed","onDispose"],"mappings":";;AAMA,IAAIA,aAAgB,GAAA,CAAA;AAYpB;;;;;;;;;;IAWO,MAAeC,WAAAA,SAAoBC,cAAeC,CAAAA,UAAAA,CAAAA,EAAAA,CAAAA;uEAEvD,UAA4B;IACpBC,MAA8B;yFAEtC,UAAwC;IAChCC,MAA+B;IACvC,WAAc,EAAA;QACZ,KAAK,EAAA;QACL,IAAI,CAACC,UAAU,GAAGN,aAAAA,EAAAA;QAClB,IAAI,CAACI,MAAM,GAAG,IAAA;QACd,IAAI,CAACG,UAAU,GAAG,IAAA;QAClB,IAAI,CAACF,MAAM,GAAG,IAAA;AAChB;yDAEA,IAAIG,KAA+B,GAAA;QACjC,OAAO,IAAI,CAACJ,MAAM;AACpB;qCAEA,IAAIK,IAA4B,GAAA;AAC9B,QAAA,OAAO,IAAI,CAACL,MAAM,EAAEK,IAAQ,IAAA,IAAI,CAACF,UAAU;AAC7C;iFAEA,IAAIG,KAAgC,GAAA;QAClC,OAAO,IAAI,CAACL,MAAM;AACpB;sEAEAM,SAAUH,CAAAA,KAA4B,EAAE;AACtC,QAAA,IAAIA,KAAU,KAAA,IAAI,CAACJ,MAAM,EAAE;AACzB,YAAA;AACF;AACA,QAAA,IAAII,KAAS,IAAA,IAAI,CAACJ,MAAM,EAAE;AACxB,YAAA,MAAM,IAAIQ,KAAM,CAAA,+CAAA,CAAA;AAClB;AACA,QAAA,IAAI,CAACJ,KAAO,EAAA;AACV,YAAA,IAAI,CAACK,WAAW,EAAA;AAClB;QACA,IAAI,CAACT,MAAM,GAAGI,KAAAA;AACd,QAAA,IAAIA,KAAO,EAAA;AACT,YAAA,IAAI,CAACM,WAAW,EAAA;AAClB;AACF;mFAEAC,aAAcN,CAAAA,IAAyB,EAAE;AACvC,QAAA,IAAIA,IAAS,KAAA,IAAI,CAACF,UAAU,EAAE;AAC5B,YAAA;AACF;AACA,QAAA,IAAI,CAACE,IAAM,EAAA;AACT,YAAA,IAAI,CAACI,WAAW,EAAA;AAClB;QACA,IAAI,CAACN,UAAU,GAAGE,IAAAA;AAClB,QAAA,IAAIA,IAAM,EAAA;AACR,YAAA,IAAI,CAACK,WAAW,EAAA;AAClB;AACF;AACA,uEACAA,WAAc,GAAA;QACZ,MAAML,IAAAA,GAAO,IAAI,CAACA,IAAI;QACtB,IAAI,IAAI,CAACJ,MAAM,IAAI,CAACI,MAAMO,QAAY,IAAA,CAACP,IAAKQ,CAAAA,KAAK,EAAE;AACjD,YAAA;AACF;AACA,QAAA,MAAMP,KAAQD,GAAAA,IAAAA,CAAKQ,KAAK,CAACC,YAAY;AACrC,QAAA,IAAIR,KAAS,IAAA,CAACA,KAAMS,CAAAA,QAAQ,EAAE;YAC5B,IAAI,CAACd,MAAM,GAAGK,KAAAA;YACd,IAAI,CAACU,KAAK,CAACV,KAAAA,CAAAA;AACb;AACF;AACA,6BACAG,WAAc,GAAA;QACZ,IAAI,IAAI,CAACR,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,IAAI,CAACA,MAAM,CAACc,QAAQ,EAAE;AACzB,gBAAA,IAAI,CAACE,MAAM,CAAC,IAAI,CAAChB,MAAM,CAAA;AACzB;YACA,IAAI,CAACA,MAAM,GAAG,IAAA;AAChB;AACF;iFAEAiB,aAAcC,CAAAA,IAA+B,EAAE;AAC7C,QAAA,OAAO,CAAC,CAAC,IAAI,CAACC,UAAU,GAAGD,IAAK,CAAA,EAAEE,IAAK,CAAA,CAACC,CAAM,GAAA,CAACA,EAAEC,OAAO,CAAA;AAC1D;IAGUC,SAAY,GAAA;AACpB,QAAA,KAAK,CAACA,SAAAA,EAAAA;AACN,QAAA,IAAI,CAACf,WAAW,EAAA;AAClB;AACF;;;;"}