@zephyr3d/scene 0.9.26 → 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 (506) 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 +146 -30
  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 +300 -56
  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 +177 -3
  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 +178 -200
  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 +30475 -19865
  109. package/dist/index.js +67 -12
  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/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -0,0 +1,406 @@
1
+ import { Disposable, Vector3 } from '@zephyr3d/base';
2
+ import { createCapsuleCollider, createPlaneCollider, createBoxCollider, createSphereCollider } from '../spring/spring_collider.js';
3
+ import { GPUClothSystem } from './gpu_cloth_system.js';
4
+
5
+ const DEFAULT_CONFIG = {
6
+ version: 1,
7
+ sourceId: '',
8
+ enabled: true,
9
+ simulationMeshId: '',
10
+ gravity: [
11
+ 0,
12
+ -9.8,
13
+ 0
14
+ ],
15
+ damping: 0.02,
16
+ dynamicFriction: 0.15,
17
+ staticFriction: 0.3,
18
+ stiffness: 0.3,
19
+ poseFollow: 0,
20
+ substeps: 2,
21
+ solverIterations: 5,
22
+ maxNeighbors: 8,
23
+ maxTrianglesPerVertex: 16,
24
+ workgroupSize: 64,
25
+ rebuildNormals: true,
26
+ pinnedVertexWeights: '',
27
+ wrapTargets: [],
28
+ colliders: []
29
+ };
30
+ function finite(value, fallback) {
31
+ const result = Number(value);
32
+ return Number.isFinite(result) ? result : fallback;
33
+ }
34
+ function clamp(value, min, max, fallback) {
35
+ return Math.min(Math.max(finite(value, fallback), min), max);
36
+ }
37
+ function vec3(value, fallback) {
38
+ const source = Array.isArray(value) ? value : fallback;
39
+ return [
40
+ finite(source[0], fallback[0]),
41
+ finite(source[1], fallback[1]),
42
+ finite(source[2], fallback[2])
43
+ ];
44
+ }
45
+ function cloneBindingData(value) {
46
+ return {
47
+ version: 4,
48
+ vertexCount: Math.max(0, finite(value?.vertexCount, 0) | 0),
49
+ sourceVertexCount: Math.max(0, finite(value?.sourceVertexCount, 0) | 0),
50
+ influenceCount: Math.max(0, finite(value?.influenceCount, 0) | 0),
51
+ maxOffsetDistance: Math.max(0, finite(value?.maxOffsetDistance, 0)),
52
+ sourceTriangleIndices: String(value?.sourceTriangleIndices ?? ''),
53
+ sourceBarycentrics: String(value?.sourceBarycentrics ?? ''),
54
+ targetLocalOffsets: String(value?.targetLocalOffsets ?? '')
55
+ };
56
+ }
57
+ function normalizeNodePath(value) {
58
+ return Array.isArray(value) ? value.filter((entry)=>entry && typeof entry === 'object').map((entry)=>({
59
+ name: String(entry.name ?? ''),
60
+ sameNameIndex: Math.max(0, Math.floor(Number(entry.sameNameIndex) || 0))
61
+ })) : [];
62
+ }
63
+ function resolveMeshByReference(host, id, path) {
64
+ const root = typeof host?.getPrefabNode === 'function' && host.getPrefabNode() || host.scene?.rootNode || host;
65
+ if (Array.isArray(path)) {
66
+ let current = root;
67
+ for (const segment of normalizeNodePath(path)){
68
+ if (!current) {
69
+ break;
70
+ }
71
+ const matches = current.children.filter((child)=>child.name === segment.name);
72
+ current = matches[segment.sameNameIndex] ?? null;
73
+ if (!current) {
74
+ break;
75
+ }
76
+ }
77
+ if (isMesh(current)) {
78
+ return current;
79
+ }
80
+ }
81
+ const candidate = host.findNodeById(id) ?? root.findNodeById(id);
82
+ return isMesh(candidate) ? candidate : null;
83
+ }
84
+ /** Normalizes untrusted or older component data into the current schema. */ function normalizeGPUClothComponentConfig(value) {
85
+ const source = value ?? {};
86
+ return {
87
+ version: 1,
88
+ sourceId: String(source.sourceId ?? ''),
89
+ enabled: source.enabled !== false,
90
+ simulationMeshId: String(source.simulationMeshId ?? ''),
91
+ ...Array.isArray(source.simulationMeshPath) ? {
92
+ simulationMeshPath: normalizeNodePath(source.simulationMeshPath)
93
+ } : {},
94
+ gravity: vec3(source.gravity, DEFAULT_CONFIG.gravity),
95
+ damping: clamp(source.damping, 0, 1, DEFAULT_CONFIG.damping),
96
+ dynamicFriction: clamp(source.dynamicFriction, 0, 1, DEFAULT_CONFIG.dynamicFriction),
97
+ staticFriction: clamp(source.staticFriction, 0, 1, DEFAULT_CONFIG.staticFriction),
98
+ stiffness: clamp(source.stiffness, 0, 1, DEFAULT_CONFIG.stiffness),
99
+ poseFollow: clamp(source.poseFollow, 0, 1, DEFAULT_CONFIG.poseFollow),
100
+ substeps: clamp(source.substeps, 1, 8, DEFAULT_CONFIG.substeps) | 0,
101
+ solverIterations: Math.max(1, finite(source.solverIterations, DEFAULT_CONFIG.solverIterations) | 0),
102
+ maxNeighbors: Math.max(1, finite(source.maxNeighbors, DEFAULT_CONFIG.maxNeighbors) | 0),
103
+ maxTrianglesPerVertex: Math.max(1, finite(source.maxTrianglesPerVertex, DEFAULT_CONFIG.maxTrianglesPerVertex) | 0),
104
+ workgroupSize: clamp(source.workgroupSize, 1, 256, DEFAULT_CONFIG.workgroupSize) | 0,
105
+ rebuildNormals: source.rebuildNormals !== false,
106
+ pinnedVertexWeights: String(source.pinnedVertexWeights ?? ''),
107
+ wrapTargets: (Array.isArray(source.wrapTargets) ? source.wrapTargets : []).filter((entry)=>!!entry?.meshId && !!entry.bindingData).map((entry)=>({
108
+ meshId: String(entry.meshId),
109
+ ...Array.isArray(entry.meshPath) ? {
110
+ meshPath: normalizeNodePath(entry.meshPath)
111
+ } : {},
112
+ bindingData: cloneBindingData(entry.bindingData),
113
+ targetWrapWeights: String(entry.targetWrapWeights ?? '')
114
+ })),
115
+ colliders: (Array.isArray(source.colliders) ? source.colliders : []).map((entry)=>({
116
+ type: entry?.type === 'capsule' || entry?.type === 'plane' || entry?.type === 'box' ? entry.type : 'sphere',
117
+ enabled: entry?.enabled !== false,
118
+ nodeId: String(entry?.nodeId ?? ''),
119
+ offset: vec3(entry?.offset, [
120
+ 0,
121
+ 0,
122
+ 0
123
+ ]),
124
+ endOffset: vec3(entry?.endOffset, [
125
+ 0,
126
+ 0.2,
127
+ 0
128
+ ]),
129
+ radius: Math.max(0, finite(entry?.radius, 0.15)),
130
+ normal: vec3(entry?.normal, [
131
+ 0,
132
+ 1,
133
+ 0
134
+ ]),
135
+ size: vec3(entry?.size, [
136
+ 0.3,
137
+ 0.3,
138
+ 0.3
139
+ ])
140
+ }))
141
+ };
142
+ }
143
+ function isMesh(node) {
144
+ return !!node?.isMesh?.() && !!node.primitive;
145
+ }
146
+ function parsePinnedWeights(source, vertexCount) {
147
+ if (!source.trim() || vertexCount <= 0) {
148
+ return undefined;
149
+ }
150
+ const result = new Float32Array(vertexCount);
151
+ for (const token of source.split(',')){
152
+ const separator = token.indexOf(':');
153
+ if (separator < 0) {
154
+ continue;
155
+ }
156
+ const parsedIndex = Number(token.slice(0, separator).trim());
157
+ const clothWeight = clamp(Number(token.slice(separator + 1).trim()), 0, 1, 1);
158
+ if (!Number.isInteger(parsedIndex) || parsedIndex < 0 || parsedIndex >= vertexCount) {
159
+ continue;
160
+ }
161
+ result[parsedIndex] = 1 - clothWeight;
162
+ }
163
+ return result;
164
+ }
165
+ function parseTargetWrapWeights(source, vertexCount) {
166
+ if (!source.trim() || vertexCount <= 0) {
167
+ return undefined;
168
+ }
169
+ const result = new Float32Array(vertexCount);
170
+ result.fill(1);
171
+ for (const token of source.split(',')){
172
+ const separator = token.indexOf(':');
173
+ if (separator < 0) {
174
+ continue;
175
+ }
176
+ const parsedIndex = Number(token.slice(0, separator).trim());
177
+ if (!Number.isInteger(parsedIndex) || parsedIndex < 0 || parsedIndex >= vertexCount) {
178
+ continue;
179
+ }
180
+ result[parsedIndex] = clamp(Number(token.slice(separator + 1).trim()), 0, 1, 1);
181
+ }
182
+ return result;
183
+ }
184
+ /**
185
+ * Serializable owner for one GPU cloth simulation.
186
+ *
187
+ * The component stores only stable asset data. GPU buffers are rebuilt when its host enters a scene.
188
+ */ class GPUClothComponent extends Disposable {
189
+ _config;
190
+ _host;
191
+ _system;
192
+ _generation;
193
+ _rebuildPromise;
194
+ _disabledReason;
195
+ _simulationMesh;
196
+ constructor(config){
197
+ super();
198
+ this._config = normalizeGPUClothComponentConfig(config);
199
+ this._host = null;
200
+ this._system = null;
201
+ this._generation = 0;
202
+ this._rebuildPromise = null;
203
+ this._disabledReason = null;
204
+ this._simulationMesh = null;
205
+ }
206
+ get config() {
207
+ return normalizeGPUClothComponentConfig(this._config);
208
+ }
209
+ get host() {
210
+ return this._host;
211
+ }
212
+ get system() {
213
+ return this._system;
214
+ }
215
+ get disabledReason() {
216
+ return this._disabledReason;
217
+ }
218
+ setConfig(config) {
219
+ this._config = normalizeGPUClothComponentConfig(config);
220
+ return this.rebuild();
221
+ }
222
+ /** @internal */ attach(host) {
223
+ if (this._host === host) {
224
+ return;
225
+ }
226
+ if (this._host) {
227
+ throw new Error('GPU cloth component is already attached to another scene node.');
228
+ }
229
+ this._host = host;
230
+ host.on('nodeattached', this._handleHierarchyChanged, this);
231
+ host.on('noderemoved', this._handleHierarchyChanged, this);
232
+ if (host.attached) {
233
+ void this.rebuild();
234
+ }
235
+ }
236
+ /** @internal */ detach(host) {
237
+ if (!this._host || host && this._host !== host) {
238
+ return;
239
+ }
240
+ this._host.off('nodeattached', this._handleHierarchyChanged, this);
241
+ this._host.off('noderemoved', this._handleHierarchyChanged, this);
242
+ this._host = null;
243
+ this.releaseRuntime();
244
+ }
245
+ /** @internal */ hostAttached() {
246
+ if (this._host?.attached) {
247
+ void this.rebuild();
248
+ }
249
+ }
250
+ /** @internal */ hostDetached() {
251
+ this.releaseRuntime();
252
+ }
253
+ async rebuild() {
254
+ const generation = ++this._generation;
255
+ this.releaseSystem();
256
+ const previous = this._rebuildPromise;
257
+ const task = (async ()=>{
258
+ if (previous) {
259
+ await previous.catch(()=>undefined);
260
+ }
261
+ const host = this._host;
262
+ if (generation !== this._generation || !host?.attached || this.disposed) {
263
+ return;
264
+ }
265
+ await this.createSystem(host, generation);
266
+ })();
267
+ this._rebuildPromise = task;
268
+ try {
269
+ await task;
270
+ } finally{
271
+ if (this._rebuildPromise === task) {
272
+ this._rebuildPromise = null;
273
+ }
274
+ }
275
+ }
276
+ async createSystem(host, generation) {
277
+ const config = this._config;
278
+ const simulationMesh = resolveMeshByReference(host, config.simulationMeshId, config.simulationMeshPath);
279
+ if (!isMesh(simulationMesh)) {
280
+ this._disabledReason = 'GPU cloth simulation mesh was not found.';
281
+ return;
282
+ }
283
+ this.watchSimulationMesh(simulationMesh);
284
+ const gravity = simulationMesh.invWorldMatrix.transformVectorAffine(new Vector3(config.gravity[0], config.gravity[1], config.gravity[2]), new Vector3());
285
+ let system = null;
286
+ try {
287
+ system = await GPUClothSystem.createFromMesh(simulationMesh, {
288
+ enabled: config.enabled,
289
+ gravity,
290
+ damping: config.damping,
291
+ dynamicFriction: config.dynamicFriction,
292
+ staticFriction: config.staticFriction,
293
+ stiffness: config.stiffness,
294
+ poseFollow: config.poseFollow,
295
+ substeps: config.substeps,
296
+ solverIterations: config.solverIterations,
297
+ maxNeighbors: config.maxNeighbors,
298
+ maxTrianglesPerVertex: config.maxTrianglesPerVertex,
299
+ workgroupSize: config.workgroupSize,
300
+ rebuildNormals: config.rebuildNormals,
301
+ pinnedVertexWeights: parsePinnedWeights(config.pinnedVertexWeights, simulationMesh.primitive?.getNumVertices() ?? 0),
302
+ colliders: this.createColliders(host, config.colliders),
303
+ autoUpdate: true
304
+ });
305
+ const targets = this.resolveWrapTargets(host, simulationMesh, config.wrapTargets);
306
+ if (targets.length > 0) {
307
+ await system.setWrapTargetsFromBindingData(targets);
308
+ }
309
+ } catch (err) {
310
+ system?.dispose();
311
+ if (generation === this._generation) {
312
+ this._disabledReason = err instanceof Error ? err.message : String(err);
313
+ }
314
+ return;
315
+ }
316
+ if (generation !== this._generation || this.disposed || this._host !== host || !host.attached) {
317
+ system.dispose();
318
+ return;
319
+ }
320
+ this._system = system;
321
+ this._disabledReason = system.disabledReason;
322
+ }
323
+ createColliders(host, configs) {
324
+ const result = [];
325
+ for (const config of configs){
326
+ const node = (config.nodeId ? host.findNodeById(config.nodeId) : null) ?? host;
327
+ const offset = vec3(config.offset, [
328
+ 0,
329
+ 0,
330
+ 0
331
+ ]);
332
+ const endOffset = vec3(config.endOffset, [
333
+ 0,
334
+ 0.2,
335
+ 0
336
+ ]);
337
+ const normal = vec3(config.normal, [
338
+ 0,
339
+ 1,
340
+ 0
341
+ ]);
342
+ let collider;
343
+ if (config.type === 'capsule') {
344
+ collider = createCapsuleCollider(new Vector3(offset[0], offset[1], offset[2]), new Vector3(endOffset[0], endOffset[1], endOffset[2]), Math.max(0, finite(config.radius, 0.15)), node);
345
+ } else if (config.type === 'plane') {
346
+ collider = createPlaneCollider(new Vector3(offset[0], offset[1], offset[2]), new Vector3(normal[0], normal[1], normal[2]), node);
347
+ } else if (config.type === 'box') {
348
+ const size = vec3(config.size, [
349
+ 0.3,
350
+ 0.3,
351
+ 0.3
352
+ ]);
353
+ collider = createBoxCollider(new Vector3(offset[0], offset[1], offset[2]), new Vector3(Math.max(0.0001, size[0] * 0.5), Math.max(0.0001, size[1] * 0.5), Math.max(0.0001, size[2] * 0.5)), node);
354
+ } else {
355
+ collider = createSphereCollider(new Vector3(offset[0], offset[1], offset[2]), Math.max(0, finite(config.radius, 0.15)), node);
356
+ }
357
+ collider.enabled = config.enabled !== false;
358
+ result.push(collider);
359
+ }
360
+ return result;
361
+ }
362
+ resolveWrapTargets(host, simulationMesh, configs) {
363
+ const result = [];
364
+ for (const config of configs){
365
+ const target = resolveMeshByReference(host, config.meshId, config.meshPath);
366
+ if (isMesh(target) && target !== simulationMesh) {
367
+ result.push({
368
+ target,
369
+ data: cloneBindingData(config.bindingData),
370
+ targetWrapWeights: parseTargetWrapWeights(config.targetWrapWeights ?? '', target.primitive?.getNumVertices() ?? 0)
371
+ });
372
+ }
373
+ }
374
+ return result;
375
+ }
376
+ watchSimulationMesh(mesh) {
377
+ if (this._simulationMesh === mesh) {
378
+ return;
379
+ }
380
+ this._simulationMesh?.off('primitive_changed', this._handlePrimitiveChanged, this);
381
+ this._simulationMesh = mesh;
382
+ this._simulationMesh?.on('primitive_changed', this._handlePrimitiveChanged, this);
383
+ }
384
+ releaseSystem() {
385
+ this.watchSimulationMesh(null);
386
+ this._system?.dispose();
387
+ this._system = null;
388
+ }
389
+ releaseRuntime() {
390
+ this._generation++;
391
+ this.releaseSystem();
392
+ }
393
+ _handleHierarchyChanged() {
394
+ void this.rebuild();
395
+ }
396
+ _handlePrimitiveChanged() {
397
+ void this.rebuild();
398
+ }
399
+ onDispose() {
400
+ this.detach();
401
+ super.onDispose();
402
+ }
403
+ }
404
+
405
+ export { GPUClothComponent, normalizeGPUClothComponentConfig };
406
+ //# sourceMappingURL=gpu_cloth_component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu_cloth_component.js","sources":["../../../src/animation/cloth/gpu_cloth_component.ts"],"sourcesContent":["import { Disposable, Vector3, type Nullable } from '@zephyr3d/base';\r\nimport type { Mesh } from '../../scene/mesh';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\nimport {\r\n createCapsuleCollider,\r\n createBoxCollider,\r\n createPlaneCollider,\r\n createSphereCollider,\r\n type SpringCollider\r\n} from '../spring';\r\nimport {\r\n GPUClothSystem,\r\n type GPUClothWrapBindingData,\r\n type GPUClothWrapBindingTarget\r\n} from './gpu_cloth_system';\r\n\r\n/** Serialized collider used by {@link GPUClothComponent}. */\r\nexport type GPUClothColliderConfig = {\r\n type: 'sphere' | 'capsule' | 'plane' | 'box';\r\n enabled?: boolean;\r\n nodeId?: string;\r\n offset?: [number, number, number];\r\n endOffset?: [number, number, number];\r\n radius?: number;\r\n size?: [number, number, number];\r\n normal?: [number, number, number];\r\n};\r\n\r\n/** Serialized wrap target used by {@link GPUClothComponent}. */\r\nexport type GPUClothWrapTargetConfig = {\r\n meshId: string;\r\n meshPath?: Array<{ name: string; sameNameIndex: number }>;\r\n bindingData: GPUClothWrapBindingData;\r\n /** Sparse per-vertex wrap weights encoded as `vertexIndex:weight`. Missing vertices default to 1. */\r\n targetWrapWeights?: string;\r\n};\r\n\r\n/** Persistent configuration for a GPU cloth component. */\r\nexport type GPUClothComponentConfig = {\r\n version: 1;\r\n sourceId?: string;\r\n enabled: boolean;\r\n simulationMeshId: string;\r\n simulationMeshPath?: Array<{ name: string; sameNameIndex: number }>;\r\n gravity: [number, number, number];\r\n damping: number;\r\n dynamicFriction: number;\r\n staticFriction: number;\r\n stiffness: number;\r\n poseFollow: number;\r\n substeps: number;\r\n solverIterations: number;\r\n maxNeighbors: number;\r\n maxTrianglesPerVertex: number;\r\n workgroupSize: number;\r\n rebuildNormals: boolean;\r\n pinnedVertexWeights: string;\r\n wrapTargets: GPUClothWrapTargetConfig[];\r\n colliders: GPUClothColliderConfig[];\r\n};\r\n\r\nconst DEFAULT_CONFIG: GPUClothComponentConfig = {\r\n version: 1,\r\n sourceId: '',\r\n enabled: true,\r\n simulationMeshId: '',\r\n gravity: [0, -9.8, 0],\r\n damping: 0.02,\r\n dynamicFriction: 0.15,\r\n staticFriction: 0.3,\r\n stiffness: 0.3,\r\n poseFollow: 0,\r\n substeps: 2,\r\n solverIterations: 5,\r\n maxNeighbors: 8,\r\n maxTrianglesPerVertex: 16,\r\n workgroupSize: 64,\r\n rebuildNormals: true,\r\n pinnedVertexWeights: '',\r\n wrapTargets: [],\r\n colliders: []\r\n};\r\n\r\nfunction finite(value: unknown, fallback: number) {\r\n const result = Number(value);\r\n return Number.isFinite(result) ? result : fallback;\r\n}\r\n\r\nfunction clamp(value: unknown, min: number, max: number, fallback: number) {\r\n return Math.min(Math.max(finite(value, fallback), min), max);\r\n}\r\n\r\nfunction vec3(value: unknown, fallback: [number, number, number]): [number, number, number] {\r\n const source = Array.isArray(value) ? value : fallback;\r\n return [finite(source[0], fallback[0]), finite(source[1], fallback[1]), finite(source[2], fallback[2])];\r\n}\r\n\r\nfunction cloneBindingData(value: GPUClothWrapBindingData): GPUClothWrapBindingData {\r\n return {\r\n version: 4,\r\n vertexCount: Math.max(0, finite(value?.vertexCount, 0) | 0),\r\n sourceVertexCount: Math.max(0, finite(value?.sourceVertexCount, 0) | 0),\r\n influenceCount: Math.max(0, finite(value?.influenceCount, 0) | 0),\r\n maxOffsetDistance: Math.max(0, finite(value?.maxOffsetDistance, 0)),\r\n sourceTriangleIndices: String(value?.sourceTriangleIndices ?? ''),\r\n sourceBarycentrics: String(value?.sourceBarycentrics ?? ''),\r\n targetLocalOffsets: String(value?.targetLocalOffsets ?? '')\r\n };\r\n}\r\n\r\nfunction normalizeNodePath(value: unknown) {\r\n return Array.isArray(value)\r\n ? value\r\n .filter((entry) => entry && typeof entry === 'object')\r\n .map((entry: any) => ({\r\n name: String(entry.name ?? ''),\r\n sameNameIndex: Math.max(0, Math.floor(Number(entry.sameNameIndex) || 0))\r\n }))\r\n : [];\r\n}\r\n\r\nfunction resolveMeshByReference(\r\n host: SceneNode,\r\n id: string,\r\n path: Array<{ name: string; sameNameIndex: number }> | undefined\r\n) {\r\n const root = ((typeof (host as any)?.getPrefabNode === 'function' && (host as any).getPrefabNode()) ||\r\n host.scene?.rootNode ||\r\n host) as SceneNode;\r\n if (Array.isArray(path)) {\r\n let current: SceneNode | null = root;\r\n for (const segment of normalizeNodePath(path)) {\r\n if (!current) {\r\n break;\r\n }\r\n const matches: SceneNode[] = current.children.filter(\r\n (child) => child.name === segment.name\r\n ) as SceneNode[];\r\n current = matches[segment.sameNameIndex] ?? null;\r\n if (!current) {\r\n break;\r\n }\r\n }\r\n if (isMesh(current)) {\r\n return current;\r\n }\r\n }\r\n const candidate = host.findNodeById<SceneNode>(id) ?? root.findNodeById<SceneNode>(id);\r\n return isMesh(candidate) ? candidate : null;\r\n}\r\n\r\n/** Normalizes untrusted or older component data into the current schema. */\r\nexport function normalizeGPUClothComponentConfig(\r\n value?: Partial<GPUClothComponentConfig> | null\r\n): GPUClothComponentConfig {\r\n const source = value ?? {};\r\n return {\r\n version: 1,\r\n sourceId: String(source.sourceId ?? ''),\r\n enabled: source.enabled !== false,\r\n simulationMeshId: String(source.simulationMeshId ?? ''),\r\n ...(Array.isArray(source.simulationMeshPath)\r\n ? { simulationMeshPath: normalizeNodePath(source.simulationMeshPath) }\r\n : {}),\r\n gravity: vec3(source.gravity, DEFAULT_CONFIG.gravity),\r\n damping: clamp(source.damping, 0, 1, DEFAULT_CONFIG.damping),\r\n dynamicFriction: clamp(source.dynamicFriction, 0, 1, DEFAULT_CONFIG.dynamicFriction),\r\n staticFriction: clamp(source.staticFriction, 0, 1, DEFAULT_CONFIG.staticFriction),\r\n stiffness: clamp(source.stiffness, 0, 1, DEFAULT_CONFIG.stiffness),\r\n poseFollow: clamp(source.poseFollow, 0, 1, DEFAULT_CONFIG.poseFollow),\r\n substeps: clamp(source.substeps, 1, 8, DEFAULT_CONFIG.substeps) | 0,\r\n solverIterations: Math.max(1, finite(source.solverIterations, DEFAULT_CONFIG.solverIterations) | 0),\r\n maxNeighbors: Math.max(1, finite(source.maxNeighbors, DEFAULT_CONFIG.maxNeighbors) | 0),\r\n maxTrianglesPerVertex: Math.max(\r\n 1,\r\n finite(source.maxTrianglesPerVertex, DEFAULT_CONFIG.maxTrianglesPerVertex) | 0\r\n ),\r\n workgroupSize: clamp(source.workgroupSize, 1, 256, DEFAULT_CONFIG.workgroupSize) | 0,\r\n rebuildNormals: source.rebuildNormals !== false,\r\n pinnedVertexWeights: String(source.pinnedVertexWeights ?? ''),\r\n wrapTargets: (Array.isArray(source.wrapTargets) ? source.wrapTargets : [])\r\n .filter((entry) => !!entry?.meshId && !!entry.bindingData)\r\n .map((entry) => ({\r\n meshId: String(entry.meshId),\r\n ...(Array.isArray(entry.meshPath) ? { meshPath: normalizeNodePath(entry.meshPath) } : {}),\r\n bindingData: cloneBindingData(entry.bindingData),\r\n targetWrapWeights: String(entry.targetWrapWeights ?? '')\r\n })),\r\n colliders: (Array.isArray(source.colliders) ? source.colliders : []).map((entry) => ({\r\n type:\r\n entry?.type === 'capsule' || entry?.type === 'plane' || entry?.type === 'box' ? entry.type : 'sphere',\r\n enabled: entry?.enabled !== false,\r\n nodeId: String(entry?.nodeId ?? ''),\r\n offset: vec3(entry?.offset, [0, 0, 0]),\r\n endOffset: vec3(entry?.endOffset, [0, 0.2, 0]),\r\n radius: Math.max(0, finite(entry?.radius, 0.15)),\r\n normal: vec3(entry?.normal, [0, 1, 0]),\r\n size: vec3(entry?.size, [0.3, 0.3, 0.3])\r\n }))\r\n };\r\n}\r\n\r\nfunction isMesh(node: Nullable<SceneNode>): node is Mesh {\r\n return !!node?.isMesh?.() && !!(node as Mesh).primitive;\r\n}\r\n\r\nfunction parsePinnedWeights(source: string, vertexCount: number) {\r\n if (!source.trim() || vertexCount <= 0) {\r\n return undefined;\r\n }\r\n const result = new Float32Array(vertexCount);\r\n for (const token of source.split(',')) {\r\n const separator = token.indexOf(':');\r\n if (separator < 0) {\r\n continue;\r\n }\r\n const parsedIndex = Number(token.slice(0, separator).trim());\r\n const clothWeight = clamp(Number(token.slice(separator + 1).trim()), 0, 1, 1);\r\n if (!Number.isInteger(parsedIndex) || parsedIndex < 0 || parsedIndex >= vertexCount) {\r\n continue;\r\n }\r\n result[parsedIndex] = 1 - clothWeight;\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseTargetWrapWeights(source: string, vertexCount: number) {\r\n if (!source.trim() || vertexCount <= 0) {\r\n return undefined;\r\n }\r\n const result = new Float32Array(vertexCount);\r\n result.fill(1);\r\n for (const token of source.split(',')) {\r\n const separator = token.indexOf(':');\r\n if (separator < 0) {\r\n continue;\r\n }\r\n const parsedIndex = Number(token.slice(0, separator).trim());\r\n if (!Number.isInteger(parsedIndex) || parsedIndex < 0 || parsedIndex >= vertexCount) {\r\n continue;\r\n }\r\n result[parsedIndex] = clamp(Number(token.slice(separator + 1).trim()), 0, 1, 1);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Serializable owner for one GPU cloth simulation.\r\n *\r\n * The component stores only stable asset data. GPU buffers are rebuilt when its host enters a scene.\r\n */\r\nexport class GPUClothComponent extends Disposable {\r\n private _config: GPUClothComponentConfig;\r\n private _host: Nullable<SceneNode>;\r\n private _system: Nullable<GPUClothSystem>;\r\n private _generation: number;\r\n private _rebuildPromise: Nullable<Promise<void>>;\r\n private _disabledReason: Nullable<string>;\r\n private _simulationMesh: Nullable<Mesh>;\r\n\r\n constructor(config?: Partial<GPUClothComponentConfig> | null) {\r\n super();\r\n this._config = normalizeGPUClothComponentConfig(config);\r\n this._host = null;\r\n this._system = null;\r\n this._generation = 0;\r\n this._rebuildPromise = null;\r\n this._disabledReason = null;\r\n this._simulationMesh = null;\r\n }\r\n\r\n get config() {\r\n return normalizeGPUClothComponentConfig(this._config);\r\n }\r\n\r\n get host() {\r\n return this._host;\r\n }\r\n\r\n get system() {\r\n return this._system;\r\n }\r\n\r\n get disabledReason() {\r\n return this._disabledReason;\r\n }\r\n\r\n setConfig(config: Partial<GPUClothComponentConfig>) {\r\n this._config = normalizeGPUClothComponentConfig(config);\r\n return this.rebuild();\r\n }\r\n\r\n /** @internal */\r\n attach(host: SceneNode) {\r\n if (this._host === host) {\r\n return;\r\n }\r\n if (this._host) {\r\n throw new Error('GPU cloth component is already attached to another scene node.');\r\n }\r\n this._host = host;\r\n host.on('nodeattached', this._handleHierarchyChanged, this);\r\n host.on('noderemoved', this._handleHierarchyChanged, this);\r\n if (host.attached) {\r\n void this.rebuild();\r\n }\r\n }\r\n\r\n /** @internal */\r\n detach(host?: SceneNode) {\r\n if (!this._host || (host && this._host !== host)) {\r\n return;\r\n }\r\n this._host.off('nodeattached', this._handleHierarchyChanged, this);\r\n this._host.off('noderemoved', this._handleHierarchyChanged, this);\r\n this._host = null;\r\n this.releaseRuntime();\r\n }\r\n\r\n /** @internal */\r\n hostAttached() {\r\n if (this._host?.attached) {\r\n void this.rebuild();\r\n }\r\n }\r\n\r\n /** @internal */\r\n hostDetached() {\r\n this.releaseRuntime();\r\n }\r\n\r\n async rebuild() {\r\n const generation = ++this._generation;\r\n this.releaseSystem();\r\n const previous = this._rebuildPromise;\r\n const task = (async () => {\r\n if (previous) {\r\n await previous.catch(() => undefined);\r\n }\r\n const host = this._host;\r\n if (generation !== this._generation || !host?.attached || this.disposed) {\r\n return;\r\n }\r\n await this.createSystem(host, generation);\r\n })();\r\n this._rebuildPromise = task;\r\n try {\r\n await task;\r\n } finally {\r\n if (this._rebuildPromise === task) {\r\n this._rebuildPromise = null;\r\n }\r\n }\r\n }\r\n\r\n private async createSystem(host: SceneNode, generation: number) {\r\n const config = this._config;\r\n const simulationMesh = resolveMeshByReference(host, config.simulationMeshId, config.simulationMeshPath);\r\n if (!isMesh(simulationMesh)) {\r\n this._disabledReason = 'GPU cloth simulation mesh was not found.';\r\n return;\r\n }\r\n this.watchSimulationMesh(simulationMesh);\r\n const gravity = simulationMesh.invWorldMatrix.transformVectorAffine(\r\n new Vector3(config.gravity[0], config.gravity[1], config.gravity[2]),\r\n new Vector3()\r\n );\r\n let system: Nullable<GPUClothSystem> = null;\r\n try {\r\n system = await GPUClothSystem.createFromMesh(simulationMesh, {\r\n enabled: config.enabled,\r\n gravity,\r\n damping: config.damping,\r\n dynamicFriction: config.dynamicFriction,\r\n staticFriction: config.staticFriction,\r\n stiffness: config.stiffness,\r\n poseFollow: config.poseFollow,\r\n substeps: config.substeps,\r\n solverIterations: config.solverIterations,\r\n maxNeighbors: config.maxNeighbors,\r\n maxTrianglesPerVertex: config.maxTrianglesPerVertex,\r\n workgroupSize: config.workgroupSize,\r\n rebuildNormals: config.rebuildNormals,\r\n pinnedVertexWeights: parsePinnedWeights(\r\n config.pinnedVertexWeights,\r\n simulationMesh.primitive?.getNumVertices() ?? 0\r\n ),\r\n colliders: this.createColliders(host, config.colliders),\r\n autoUpdate: true\r\n });\r\n const targets = this.resolveWrapTargets(host, simulationMesh, config.wrapTargets);\r\n if (targets.length > 0) {\r\n await system.setWrapTargetsFromBindingData(targets);\r\n }\r\n } catch (err) {\r\n system?.dispose();\r\n if (generation === this._generation) {\r\n this._disabledReason = err instanceof Error ? err.message : String(err);\r\n }\r\n return;\r\n }\r\n if (generation !== this._generation || this.disposed || this._host !== host || !host.attached) {\r\n system.dispose();\r\n return;\r\n }\r\n this._system = system;\r\n this._disabledReason = system.disabledReason;\r\n }\r\n\r\n private createColliders(host: SceneNode, configs: GPUClothColliderConfig[]) {\r\n const result: SpringCollider[] = [];\r\n for (const config of configs) {\r\n const node = (config.nodeId ? host.findNodeById<SceneNode>(config.nodeId) : null) ?? host;\r\n const offset = vec3(config.offset, [0, 0, 0]);\r\n const endOffset = vec3(config.endOffset, [0, 0.2, 0]);\r\n const normal = vec3(config.normal, [0, 1, 0]);\r\n let collider: SpringCollider;\r\n if (config.type === 'capsule') {\r\n collider = createCapsuleCollider(\r\n new Vector3(offset[0], offset[1], offset[2]),\r\n new Vector3(endOffset[0], endOffset[1], endOffset[2]),\r\n Math.max(0, finite(config.radius, 0.15)),\r\n node\r\n );\r\n } else if (config.type === 'plane') {\r\n collider = createPlaneCollider(\r\n new Vector3(offset[0], offset[1], offset[2]),\r\n new Vector3(normal[0], normal[1], normal[2]),\r\n node\r\n );\r\n } else if (config.type === 'box') {\r\n const size = vec3(config.size, [0.3, 0.3, 0.3]);\r\n collider = createBoxCollider(\r\n new Vector3(offset[0], offset[1], offset[2]),\r\n new Vector3(\r\n Math.max(0.0001, size[0] * 0.5),\r\n Math.max(0.0001, size[1] * 0.5),\r\n Math.max(0.0001, size[2] * 0.5)\r\n ),\r\n node\r\n );\r\n } else {\r\n collider = createSphereCollider(\r\n new Vector3(offset[0], offset[1], offset[2]),\r\n Math.max(0, finite(config.radius, 0.15)),\r\n node\r\n );\r\n }\r\n collider.enabled = config.enabled !== false;\r\n result.push(collider);\r\n }\r\n return result;\r\n }\r\n\r\n private resolveWrapTargets(host: SceneNode, simulationMesh: Mesh, configs: GPUClothWrapTargetConfig[]) {\r\n const result: GPUClothWrapBindingTarget[] = [];\r\n for (const config of configs) {\r\n const target = resolveMeshByReference(host, config.meshId, config.meshPath);\r\n if (isMesh(target) && target !== simulationMesh) {\r\n result.push({\r\n target,\r\n data: cloneBindingData(config.bindingData),\r\n targetWrapWeights: parseTargetWrapWeights(\r\n config.targetWrapWeights ?? '',\r\n target.primitive?.getNumVertices() ?? 0\r\n )\r\n });\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n private watchSimulationMesh(mesh: Nullable<Mesh>) {\r\n if (this._simulationMesh === mesh) {\r\n return;\r\n }\r\n this._simulationMesh?.off('primitive_changed', this._handlePrimitiveChanged, this);\r\n this._simulationMesh = mesh;\r\n this._simulationMesh?.on('primitive_changed', this._handlePrimitiveChanged, this);\r\n }\r\n\r\n private releaseSystem() {\r\n this.watchSimulationMesh(null);\r\n this._system?.dispose();\r\n this._system = null;\r\n }\r\n\r\n private releaseRuntime() {\r\n this._generation++;\r\n this.releaseSystem();\r\n }\r\n\r\n private _handleHierarchyChanged() {\r\n void this.rebuild();\r\n }\r\n\r\n private _handlePrimitiveChanged() {\r\n void this.rebuild();\r\n }\r\n\r\n protected onDispose() {\r\n this.detach();\r\n super.onDispose();\r\n }\r\n}\r\n"],"names":["DEFAULT_CONFIG","version","sourceId","enabled","simulationMeshId","gravity","damping","dynamicFriction","staticFriction","stiffness","poseFollow","substeps","solverIterations","maxNeighbors","maxTrianglesPerVertex","workgroupSize","rebuildNormals","pinnedVertexWeights","wrapTargets","colliders","finite","value","fallback","result","Number","isFinite","clamp","min","max","Math","vec3","source","Array","isArray","cloneBindingData","vertexCount","sourceVertexCount","influenceCount","maxOffsetDistance","sourceTriangleIndices","String","sourceBarycentrics","targetLocalOffsets","normalizeNodePath","filter","entry","map","name","sameNameIndex","floor","resolveMeshByReference","host","id","path","root","getPrefabNode","scene","rootNode","current","segment","matches","children","child","isMesh","candidate","findNodeById","normalizeGPUClothComponentConfig","simulationMeshPath","meshId","bindingData","meshPath","targetWrapWeights","type","nodeId","offset","endOffset","radius","normal","size","node","primitive","parsePinnedWeights","trim","undefined","Float32Array","token","split","separator","indexOf","parsedIndex","slice","clothWeight","isInteger","parseTargetWrapWeights","fill","GPUClothComponent","Disposable","_config","_host","_system","_generation","_rebuildPromise","_disabledReason","_simulationMesh","config","system","disabledReason","setConfig","rebuild","attach","Error","on","_handleHierarchyChanged","attached","detach","off","releaseRuntime","hostAttached","hostDetached","generation","releaseSystem","previous","task","catch","disposed","createSystem","simulationMesh","watchSimulationMesh","invWorldMatrix","transformVectorAffine","Vector3","GPUClothSystem","createFromMesh","getNumVertices","createColliders","autoUpdate","targets","resolveWrapTargets","length","setWrapTargetsFromBindingData","err","dispose","message","configs","collider","createCapsuleCollider","createPlaneCollider","createBoxCollider","createSphereCollider","push","target","data","mesh","_handlePrimitiveChanged","onDispose"],"mappings":"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"}