@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 @@
1
+ {"version":3,"file":"animation_bank.js","sources":["../../src/animation/animation_bank.ts"],"sourcesContent":["import { Disposable, Matrix4x4, Quaternion, Vector3 } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { getDevice } from '../app/api';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport type { AnimationSet } from './animationset';\r\nimport type { SkinBinding } from './skeleton';\r\nimport { SkinPaletteAtlas } from './skin_palette_atlas';\r\nimport { AnimationBankGpuEvaluator } from './animation_bank_gpu';\r\nimport type { SkinPaletteBlock } from './skin_palette_atlas';\r\n\r\n/** Rate clips are sampled at when baked into a bank */\r\nexport const ANIMATION_BANK_SAMPLE_RATE = 30;\r\n\r\n/** Floats in one baked joint key: position xyz, rotation quaternion xyzw, scale xyz */\r\nconst KEY_FLOATS = 10;\r\n\r\n/**\r\n * One clip baked into an animation bank.\r\n *\r\n * @public\r\n */\r\nexport interface AnimationBankEntry {\r\n /** Name of the source clip */\r\n readonly name: string;\r\n /** Number of sampled frames, the first at time 0 and the last at {@link playLength} */\r\n readonly frameCount: number;\r\n /** Length of the baked clip in seconds */\r\n readonly playLength: number;\r\n /**\r\n * Joint keys of all frames, frame after frame, each frame holding one key per joint of the\r\n * bank: position, rotation and scale relative to the reference node of the skin binding\r\n */\r\n readonly keys: Float32Array<ArrayBuffer>;\r\n}\r\n\r\n/**\r\n * Options of a track playing a bank entry.\r\n *\r\n * @public\r\n */\r\nexport interface AnimationBankTrackOptions {\r\n /** Start position in seconds, default 0 */\r\n position?: number;\r\n /** Playback rate, default 1. Negative values play backwards */\r\n playRate?: number;\r\n /** Whether playback wraps around at either end, default true. Otherwise it stops at the end */\r\n loop?: boolean;\r\n /** Whether the position advances with time, default true */\r\n autoPlay?: boolean;\r\n /**\r\n * Where the palette is evaluated: 'auto' on the GPU where supported (WebGPU), 'cpu' always on the\r\n * CPU. Default 'auto'\r\n */\r\n evaluation?: 'auto' | 'cpu';\r\n}\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\nconst tmpMatrix2 = new Matrix4x4();\r\nconst tmpPosition = new Vector3();\r\nconst tmpRotation = new Quaternion();\r\nconst tmpScale = new Vector3();\r\nconst tmpPoint = new Vector3();\r\nconst tmpPoint2 = new Vector3();\r\nconst tmpHeader = new Float32Array(16);\r\n\r\n/**\r\n * Skeletal animation clips of one skin baked into joint poses, played back without the joint\r\n * scene nodes the clips were made for.\r\n *\r\n * @remarks\r\n * Every clip is sampled at {@link ANIMATION_BANK_SAMPLE_RATE} frames per second into joint poses\r\n * relative to the root of the skin, so that a pose is evaluated per joint without walking the\r\n * joint hierarchy.\r\n *\r\n * A bank is played by {@link AnimationBankTrack}s. Each track owns one palette in the skin palette\r\n * atlas, and any number of instances of the model skin their meshes by it, so a crowd costs the\r\n * evaluation of its tracks rather than of its characters.\r\n *\r\n * Meshes skinned by a track do not run IK, joint dynamics or any other skeleton modifier, and do\r\n * not blend clips.\r\n *\r\n * @public\r\n */\r\nexport class AnimationBank extends Disposable {\r\n private readonly _jointCount: number;\r\n private readonly _jointNames: string[];\r\n private readonly _inverseBindMatrices: Matrix4x4[];\r\n private readonly _entries: AnimationBankEntry[];\r\n private readonly _tracks: Set<AnimationBankTrack>;\r\n private _version: number;\r\n /**\r\n * Bake clips of an animation set into a bank for one skin.\r\n *\r\n * @remarks\r\n * Sampling poses the joints of the skin; their transforms are restored afterwards. Only tracks\r\n * targeting the joints of the skin, or the root joint of its rig, are sampled, and skeleton\r\n * modifiers do not run.\r\n *\r\n * @param animationSet - Animation set holding the clips\r\n * @param binding - Skin binding whose joints the clips animate\r\n * @param clipNames - Names of the clips to bake, default all clips of the set. More can be added\r\n * later with {@link addClip}\r\n */\r\n constructor(animationSet: AnimationSet, binding: SkinBinding, clipNames?: string[]) {\r\n super();\r\n this._jointCount = binding.joints.length;\r\n this._jointNames = binding.joints.map((joint) => joint.name);\r\n this._inverseBindMatrices = binding.inverseBindMatrices.map((m) => new Matrix4x4(new Float32Array(m)));\r\n this._entries = [];\r\n this._tracks = new Set();\r\n this._version = 0;\r\n const names = clipNames ?? animationSet.getAnimationNames();\r\n for (const name of names) {\r\n this.addClip(animationSet, binding, name);\r\n }\r\n }\r\n /**\r\n * Bake one more clip into the bank.\r\n *\r\n * @param animationSet - Animation set holding the clip\r\n * @param binding - Skin binding the bank was baked for, or a compatible one\r\n * @param name - Name of the clip\r\n * @returns Index of the entry, the existing one if the clip has been baked already, or -1 if\r\n * the clip does not animate the joints of the skin\r\n */\r\n addClip(animationSet: AnimationSet, binding: SkinBinding, name: string) {\r\n const index = this.getEntryIndex(name);\r\n if (index >= 0) {\r\n return index;\r\n }\r\n const entry = this.bakeClip(animationSet, binding, name);\r\n if (!entry) {\r\n return -1;\r\n }\r\n this._entries.push(entry);\r\n this._version++;\r\n return this._entries.length - 1;\r\n }\r\n /** Increased each time a clip is added */\r\n get version() {\r\n return this._version;\r\n }\r\n /** Number of joints of the skin */\r\n get jointCount() {\r\n return this._jointCount;\r\n }\r\n /** Baked clips */\r\n get entries(): readonly AnimationBankEntry[] {\r\n return this._entries;\r\n }\r\n /** Inverse bind matrices of the joints of the skin */\r\n get inverseBindMatrices(): readonly Matrix4x4[] {\r\n return this._inverseBindMatrices;\r\n }\r\n /**\r\n * Gets the index of a baked clip by name.\r\n *\r\n * @param name - Name of the clip\r\n * @returns Index of the entry, or -1 if the clip has not been baked\r\n */\r\n getEntryIndex(name: string) {\r\n return this._entries.findIndex((entry) => entry.name === name);\r\n }\r\n /**\r\n * Whether a skin binding has the joints this bank was baked for, in the same order.\r\n *\r\n * @param binding - Skin binding to check\r\n */\r\n isCompatible(binding: SkinBinding) {\r\n const joints = binding.joints;\r\n return (\r\n joints.length === this._jointCount &&\r\n joints.every((joint, i) => joint.name === this._jointNames[i]) &&\r\n // Skins sharing a rig differ by their inverse bind matrices\r\n binding.inverseBindMatrices.every((m, i) => m.equalsTo(this._inverseBindMatrices[i], 1e-4))\r\n );\r\n }\r\n /**\r\n * Create a track playing a baked clip.\r\n *\r\n * @param clip - Name or entry index of the clip\r\n * @param options - Playback options\r\n * @returns The track\r\n */\r\n createTrack(clip: string | number, options?: AnimationBankTrackOptions) {\r\n const index = typeof clip === 'number' ? clip : this.getEntryIndex(clip);\r\n if (index < 0 || index >= this._entries.length) {\r\n throw new Error(`AnimationBank.createTrack(): clip not baked: ${clip}`);\r\n }\r\n const track = new AnimationBankTrack(this, index, options);\r\n this._tracks.add(track);\r\n return track;\r\n }\r\n /**\r\n * Write the skinning palette of a pose to the skin palette atlas.\r\n *\r\n * @remarks\r\n * The two keys around the position are blended, positions and scales linearly and rotations by\r\n * normalized linear interpolation along the shorter arc, and the pose is followed by the inverse\r\n * bind matrix.\r\n *\r\n * @internal\r\n */\r\n writePalette(entryIndex: number, position: number, slot: number, out: Float32Array<ArrayBuffer>) {\r\n const entry = this._entries[entryIndex];\r\n const { key0, key1, alpha } = getKeyIndicesFromTime(position, entry.frameCount, entry.playLength);\r\n const keys = entry.keys;\r\n const n = this._jointCount;\r\n for (let i = 0; i < n; i++) {\r\n blendKeys(keys, (key0 * n + i) * KEY_FLOATS, (key1 * n + i) * KEY_FLOATS, alpha, tmpMatrix);\r\n Matrix4x4.multiplyAffine(tmpMatrix, this._inverseBindMatrices[i], tmpMatrix2);\r\n out.set(tmpMatrix2, i * 16);\r\n }\r\n SkinPaletteAtlas.instance.writeSlots(slot, out);\r\n }\r\n /**\r\n * Compute the bounds of a mesh over all frames of a baked clip.\r\n *\r\n * @param entryIndex - Index of the baked clip\r\n * @param mesh - Mesh skinned by the bank\r\n * @param binding - Skin binding of the mesh, whose reference node the keys are relative to\r\n * @returns Bounds in the local space of the mesh, or null if the mesh has no skinned bounding data\r\n * @internal\r\n */\r\n computeBoundingBox(entryIndex: number, mesh: Mesh, binding: SkinBinding): Nullable<BoundingBox> {\r\n const info = mesh.skinnedBoundingInfo;\r\n if (!info) {\r\n return null;\r\n }\r\n const entry = this._entries[entryIndex];\r\n const skinSpace = mesh.getSkinSpaceMatrix(binding);\r\n const influenceCount = Math.max(1, info.influenceCount ?? 4);\r\n const n = this._jointCount;\r\n const box = new BoundingBox();\r\n box.beginExtend();\r\n for (let frame = 0; frame < entry.frameCount; frame++) {\r\n for (let v = 0; v < info.boundingVertices.length; v++) {\r\n tmpPoint.setXYZ(0, 0, 0);\r\n for (let j = 0; j < influenceCount; j++) {\r\n const weight = Number(info.boundingVertexJointWeights[v * influenceCount + j]) || 0;\r\n const joint = Number(info.boundingVertexBlendIndices[v * influenceCount + j]) || 0;\r\n if (weight <= 0 || joint >= n) {\r\n continue;\r\n }\r\n const offset = (frame * n + joint) * KEY_FLOATS;\r\n blendKeys(entry.keys, offset, offset, 0, tmpMatrix);\r\n Matrix4x4.multiplyAffine(tmpMatrix, this._inverseBindMatrices[joint], tmpMatrix2);\r\n tmpMatrix2.transformPointAffine(info.boundingVertices[v], tmpPoint2).scaleBy(weight);\r\n tmpPoint.addBy(tmpPoint2);\r\n }\r\n box.extend(skinSpace.transformPointAffine(tmpPoint, tmpPoint));\r\n }\r\n }\r\n return box.isValid() ? box : null;\r\n }\r\n /** @internal */\r\n removeTrack(track: AnimationBankTrack) {\r\n this._tracks.delete(track);\r\n }\r\n /** Dispose all tracks of the bank */\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const track of [...this._tracks]) {\r\n track.dispose();\r\n }\r\n }\r\n private bakeClip(animationSet: AnimationSet, binding: SkinBinding, name: string) {\r\n const clip = animationSet.get(name);\r\n if (!clip) {\r\n console.error(`AnimationBank: animation not found: ${name}`);\r\n return null;\r\n }\r\n const rig = binding.rig;\r\n const joints = new Set<object>(binding.joints);\r\n if (rig.rootJoint) {\r\n joints.add(rig.rootJoint);\r\n }\r\n const tracks = [...clip.tracks].filter(([target]) => joints.has(target));\r\n if (tracks.length === 0) {\r\n return null;\r\n }\r\n // Keep the joint transforms so baking leaves the model as it was\r\n const saved = [...joints].map((joint) => {\r\n const node = joint as SceneNode;\r\n return {\r\n node,\r\n position: node.position.clone(),\r\n rotation: node.rotation.clone(),\r\n scale: node.scale.clone()\r\n };\r\n });\r\n const playLength = clip.timeDuration;\r\n const frameCount = Math.max(1, Math.round(playLength * ANIMATION_BANK_SAMPLE_RATE) + 1);\r\n const n = binding.joints.length;\r\n const keys = new Float32Array(frameCount * n * KEY_FLOATS);\r\n const reference = binding.referenceNode;\r\n try {\r\n rig.computeBindPose();\r\n for (let frame = 0; frame < frameCount; frame++) {\r\n const time = frameCount > 1 ? (playLength * frame) / (frameCount - 1) : 0;\r\n for (const [target, targetTracks] of tracks) {\r\n for (const track of targetTracks) {\r\n const t = playLength > 0 ? (time / playLength) * track.getDuration() : 0;\r\n track.applyState(target, track.calculateState(target, t));\r\n }\r\n }\r\n const invReference = reference ? Matrix4x4.invertAffine(reference.worldMatrix, tmpMatrix2) : null;\r\n for (let i = 0; i < n; i++) {\r\n const world = binding.joints[i].worldMatrix;\r\n if (invReference) {\r\n Matrix4x4.multiplyAffine(invReference, world, tmpMatrix);\r\n } else {\r\n tmpMatrix.set(world);\r\n }\r\n tmpMatrix.decompose(tmpScale, tmpRotation, tmpPosition);\r\n const offset = (frame * n + i) * KEY_FLOATS;\r\n keys[offset] = tmpPosition.x;\r\n keys[offset + 1] = tmpPosition.y;\r\n keys[offset + 2] = tmpPosition.z;\r\n keys[offset + 3] = tmpRotation.x;\r\n keys[offset + 4] = tmpRotation.y;\r\n keys[offset + 5] = tmpRotation.z;\r\n keys[offset + 6] = tmpRotation.w;\r\n keys[offset + 7] = tmpScale.x;\r\n keys[offset + 8] = tmpScale.y;\r\n keys[offset + 9] = tmpScale.z;\r\n }\r\n }\r\n } finally {\r\n for (const { node, position, rotation, scale } of saved) {\r\n node.position.set(position);\r\n node.rotation.set(rotation);\r\n node.scale.set(scale);\r\n }\r\n }\r\n return { name, frameCount, playLength: frameCount > 1 ? playLength : 0, keys } as AnimationBankEntry;\r\n }\r\n}\r\n\r\n/**\r\n * A playing clip of an animation bank, owning one skinning palette that any number of meshes\r\n * of compatible skins are skinned by.\r\n *\r\n * @remarks\r\n * Tracks advance once per frame before the skin palette atlas is uploaded. The palette keeps\r\n * the previous pose as well, for motion vectors.\r\n *\r\n * Where supported (WebGPU), palettes are evaluated in a compute pass, see\r\n * {@link AnimationBankTrackOptions.evaluation}; elsewhere on the CPU. Both produce the same pose.\r\n *\r\n * @public\r\n */\r\nexport class AnimationBankTrack extends Disposable {\r\n private static readonly _activeTracks: Set<AnimationBankTrack> = new Set();\r\n private static _updateFrame = -1;\r\n private readonly _bank: AnimationBank;\r\n private _entryIndex: number;\r\n private _position: number;\r\n /** Position at the previous evaluation, for the previous pose of GPU evaluation */\r\n private _previousPosition: number;\r\n /** Position the palette was last evaluated at */\r\n private _evaluatedPosition: number;\r\n /** Whether the palette is evaluated on the GPU, into fixed current and previous sets */\r\n private readonly _gpu: boolean;\r\n private _playRate: number;\r\n private _loop: boolean;\r\n private _autoPlay: boolean;\r\n private _block: Nullable<SkinPaletteBlock>;\r\n /** Offsets of the current and previous sets in the block, as `SkinBinding` keeps them */\r\n private readonly _offsets: [number, number];\r\n private _dirty: boolean;\r\n private readonly _palette: Float32Array<ArrayBuffer>;\r\n private readonly _meshes: Map<Mesh, Nullable<BoundingBox>>;\r\n /** @internal */\r\n constructor(bank: AnimationBank, entryIndex: number, options?: AnimationBankTrackOptions) {\r\n super();\r\n this._bank = bank;\r\n this._entryIndex = entryIndex;\r\n this._playRate = options?.playRate ?? 1;\r\n this._loop = options?.loop ?? true;\r\n this._autoPlay = options?.autoPlay ?? true;\r\n this._position = this.wrap(options?.position ?? 0);\r\n this._previousPosition = this._position;\r\n this._evaluatedPosition = this._position;\r\n this._gpu = (options?.evaluation ?? 'auto') === 'auto' && AnimationBankGpuEvaluator.isSupported();\r\n this._block = SkinPaletteAtlas.instance.allocate(bank.jointCount * 2 + 1);\r\n this._offsets = [0, 0];\r\n this._dirty = true;\r\n this._palette = new Float32Array(this._gpu ? 0 : bank.jointCount * 16);\r\n this._meshes = new Map();\r\n AnimationBankTrack._activeTracks.add(this);\r\n if (this._gpu) {\r\n // Fixed sets, both rewritten by every dispatch\r\n this._offsets[0] = 1;\r\n this._offsets[1] = 1 + bank.jointCount;\r\n this.writeHeader();\r\n AnimationBankGpuEvaluator.addTrack(this);\r\n } else {\r\n this.evaluate();\r\n }\r\n }\r\n /**\r\n * Advance all tracks by the frame time, once per device frame.\r\n *\r\n * @internal\r\n */\r\n static updateAll(deltaInSeconds: number) {\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._updateFrame) {\r\n this._updateFrame = frame;\r\n for (const track of this._activeTracks) {\r\n track.update(deltaInSeconds);\r\n }\r\n }\r\n }\r\n /** The bank this track plays */\r\n get bank() {\r\n return this._bank;\r\n }\r\n /** Name of the clip playing */\r\n get clipName() {\r\n return this._bank.entries[this._entryIndex].name;\r\n }\r\n /** Length of the clip in seconds */\r\n get playLength() {\r\n return this._bank.entries[this._entryIndex].playLength;\r\n }\r\n /** Playback position in seconds */\r\n get position() {\r\n return this._position;\r\n }\r\n set position(val: number) {\r\n this._position = this.wrap(val);\r\n this._dirty = true;\r\n }\r\n /** Playback rate, negative values play backwards */\r\n get playRate() {\r\n return this._playRate;\r\n }\r\n set playRate(val: number) {\r\n this._playRate = val;\r\n }\r\n /** Whether playback wraps around at either end */\r\n get loop() {\r\n return this._loop;\r\n }\r\n set loop(val: boolean) {\r\n this._loop = val;\r\n }\r\n /** Whether the position advances with time */\r\n get autoPlay() {\r\n return this._autoPlay;\r\n }\r\n set autoPlay(val: boolean) {\r\n this._autoPlay = val;\r\n }\r\n /** Slot index of the palette header in the skin palette atlas */\r\n get paletteBase() {\r\n return this._block?.base ?? 0;\r\n }\r\n /** Whether the palette is evaluated on the GPU */\r\n get gpuEvaluated() {\r\n return this._gpu;\r\n }\r\n /** @internal */\r\n get entryIndex() {\r\n return this._entryIndex;\r\n }\r\n /** @internal Position of the previous pose */\r\n get previousPosition() {\r\n return this._previousPosition;\r\n }\r\n /**\r\n * Play another clip of the bank, keeping the playback options.\r\n *\r\n * @remarks\r\n * The pose changes at once; tracks do not blend clips. The bounds of attached meshes are\r\n * recomputed for the new clip.\r\n *\r\n * @param clip - Name or entry index of the clip\r\n * @param position - Position to start at in seconds, default 0\r\n */\r\n setClip(clip: string | number, position = 0) {\r\n const index = typeof clip === 'number' ? clip : this._bank.getEntryIndex(clip);\r\n if (index < 0 || index >= this._bank.entries.length) {\r\n throw new Error(`AnimationBankTrack.setClip(): clip not baked: ${clip}`);\r\n }\r\n this._entryIndex = index;\r\n this._position = this.wrap(position);\r\n // The previous pose belonged to another clip, so the new one starts still\r\n this._previousPosition = this._position;\r\n this._evaluatedPosition = this._position;\r\n this._dirty = true;\r\n for (const mesh of this._meshes.keys()) {\r\n this.attachMesh(mesh);\r\n }\r\n }\r\n /**\r\n * Skin all meshes under a node by this track.\r\n *\r\n * @remarks\r\n * Meshes whose skin binding has other joints than the bank are skipped. The skin bindings of the\r\n * attached meshes stop updating their own palettes until detached.\r\n *\r\n * @param node - Root of the model, typically an instance of the model the bank was baked from\r\n * @param binding - If given, only meshes skinned by this binding are attached\r\n * @returns Number of meshes attached\r\n */\r\n attach(node: SceneNode, binding?: SkinBinding) {\r\n let count = 0;\r\n node.iterate((child) => {\r\n if (child.isMesh() && this.attachMesh(child, binding)) {\r\n count++;\r\n }\r\n return false;\r\n });\r\n return count;\r\n }\r\n /**\r\n * Skin the meshes under a node by their skin bindings again.\r\n *\r\n * @param node - Node passed to {@link attach}\r\n */\r\n detach(node: SceneNode) {\r\n node.iterate((child) => {\r\n if (child.isMesh() && this._meshes.has(child)) {\r\n this.detachMesh(child);\r\n }\r\n return false;\r\n });\r\n }\r\n /**\r\n * Advance the position by the frame time and write the new pose.\r\n *\r\n * @internal\r\n */\r\n update(deltaInSeconds: number) {\r\n if (this._autoPlay && this._playRate !== 0) {\r\n this._position = this.wrap(this._position + this._playRate * deltaInSeconds);\r\n this._dirty = true;\r\n }\r\n if (this._gpu) {\r\n // Evaluated by the next dispatch; a still pose evaluates to the same matrices twice\r\n this._previousPosition = this._evaluatedPosition;\r\n this._evaluatedPosition = this._position;\r\n this._dirty = false;\r\n } else if (this._dirty) {\r\n this.evaluate();\r\n } else if (this._offsets[1] !== this._offsets[0]) {\r\n // A still pose: point the previous set at the current one so motion vectors become zero\r\n this._offsets[1] = this._offsets[0];\r\n this.writeHeader();\r\n }\r\n }\r\n /** Release the palette and skin the attached meshes by their skin bindings again */\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const mesh of [...this._meshes.keys()]) {\r\n this.detachMesh(mesh);\r\n }\r\n AnimationBankTrack._activeTracks.delete(this);\r\n if (this._gpu) {\r\n AnimationBankGpuEvaluator.removeTrack(this);\r\n }\r\n this._bank.removeTrack(this);\r\n if (this._block) {\r\n SkinPaletteAtlas.instance.free(this._block);\r\n this._block = null;\r\n }\r\n }\r\n private attachMesh(mesh: Mesh, only?: SkinBinding) {\r\n const binding = mesh.findSkinBindingById(mesh.skinBindingName);\r\n if (!binding || (only && binding !== only) || !this._bank.isCompatible(binding)) {\r\n return false;\r\n }\r\n const previous = mesh.getSkinPaletteOverride();\r\n if (previous?.owner && previous.owner !== this) {\r\n previous.owner.detachMesh(mesh);\r\n }\r\n if (!this._meshes.has(mesh)) {\r\n binding.suspendPalette(true);\r\n }\r\n const boundingBox = this._bank.computeBoundingBox(this._entryIndex, mesh, binding);\r\n this._meshes.set(mesh, boundingBox);\r\n mesh.setSkinPaletteOverride({ paletteBase: this.paletteBase, boundingBox, owner: this });\r\n return true;\r\n }\r\n /** @internal */\r\n detachMesh(mesh: Mesh) {\r\n if (this._meshes.delete(mesh)) {\r\n mesh.findSkinBindingById(mesh.skinBindingName)?.suspendPalette(false);\r\n if (mesh.getSkinPaletteOverride()?.owner === this) {\r\n mesh.setSkinPaletteOverride(null);\r\n }\r\n }\r\n }\r\n /** Write the pose at the position into the set not holding the previous pose */\r\n private evaluate() {\r\n if (!this._block) {\r\n return;\r\n }\r\n const n = this._bank.jointCount;\r\n if (this._offsets[0] === 0) {\r\n this._offsets[0] = 1;\r\n this._offsets[1] = 1;\r\n } else {\r\n this._offsets[1] = this._offsets[0];\r\n this._offsets[0] = n - this._offsets[0] + 2;\r\n }\r\n this._bank.writePalette(\r\n this._entryIndex,\r\n this._position,\r\n this._block.base + this._offsets[0],\r\n this._palette\r\n );\r\n this.writeHeader();\r\n this._dirty = false;\r\n }\r\n private writeHeader() {\r\n const base = this._block!.base;\r\n tmpHeader[0] = base + this._offsets[0];\r\n tmpHeader[1] = base + this._offsets[1];\r\n SkinPaletteAtlas.instance.writeSlots(base, tmpHeader);\r\n }\r\n private wrap(position: number) {\r\n const length = this.playLength;\r\n if (this._loop) {\r\n position = length === 0 ? 0 : position % length;\r\n if (position < 0) {\r\n position += length;\r\n }\r\n return position;\r\n }\r\n return Math.min(Math.max(position, 0), length);\r\n }\r\n}\r\n\r\nfunction getKeyIndicesFromTime(time: number, numKeys: number, sequenceLength: number) {\r\n if (time <= 0 || numKeys === 1) {\r\n return { key0: 0, key1: 0, alpha: 0 };\r\n }\r\n const lastIndex = numKeys - 1;\r\n if (time >= sequenceLength) {\r\n return { key0: lastIndex, key1: 0, alpha: 0 };\r\n }\r\n const keyPos = time * (lastIndex / sequenceLength);\r\n const key0 = Math.min(Math.max(Math.floor(keyPos), 0), lastIndex);\r\n const alpha = keyPos - key0;\r\n const key1 = key0 + 1 === numKeys ? key0 : key0 + 1;\r\n return { key0, key1, alpha };\r\n}\r\n\r\n/** Blend two keys into a joint pose matrix */\r\nfunction blendKeys(keys: Float32Array, a: number, b: number, alpha: number, out: Matrix4x4) {\r\n const beta = 1 - alpha;\r\n // Rotations are normalized before and after blending, along the shorter arc\r\n let ax = keys[a + 3],\r\n ay = keys[a + 4],\r\n az = keys[a + 5],\r\n aw = keys[a + 6];\r\n let bx = keys[b + 3],\r\n by = keys[b + 4],\r\n bz = keys[b + 5],\r\n bw = keys[b + 6];\r\n let len = Math.hypot(ax, ay, az, aw) || 1;\r\n ax /= len;\r\n ay /= len;\r\n az /= len;\r\n aw /= len;\r\n len = Math.hypot(bx, by, bz, bw) || 1;\r\n const sign = ax * bx + ay * by + az * bz + aw * bw < 0 ? -1 / len : 1 / len;\r\n bx *= sign;\r\n by *= sign;\r\n bz *= sign;\r\n bw *= sign;\r\n let x = ax * beta + bx * alpha;\r\n let y = ay * beta + by * alpha;\r\n let z = az * beta + bz * alpha;\r\n let w = aw * beta + bw * alpha;\r\n len = Math.hypot(x, y, z, w) || 1;\r\n x /= len;\r\n y /= len;\r\n z /= len;\r\n w /= len;\r\n const sx = keys[a + 7] * beta + keys[b + 7] * alpha;\r\n const sy = keys[a + 8] * beta + keys[b + 8] * alpha;\r\n const sz = keys[a + 9] * beta + keys[b + 9] * alpha;\r\n // Column-major translation * rotation * scale\r\n out[0] = (1 - 2 * (y * y + z * z)) * sx;\r\n out[1] = 2 * (x * y + z * w) * sx;\r\n out[2] = 2 * (x * z - y * w) * sx;\r\n out[3] = 0;\r\n out[4] = 2 * (x * y - z * w) * sy;\r\n out[5] = (1 - 2 * (x * x + z * z)) * sy;\r\n out[6] = 2 * (y * z + x * w) * sy;\r\n out[7] = 0;\r\n out[8] = 2 * (x * z + y * w) * sz;\r\n out[9] = 2 * (y * z - x * w) * sz;\r\n out[10] = (1 - 2 * (x * x + y * y)) * sz;\r\n out[11] = 0;\r\n out[12] = keys[a] * beta + keys[b] * alpha;\r\n out[13] = keys[a + 1] * beta + keys[b + 1] * alpha;\r\n out[14] = keys[a + 2] * beta + keys[b + 2] * alpha;\r\n out[15] = 1;\r\n return out;\r\n}\r\n"],"names":["ANIMATION_BANK_SAMPLE_RATE","KEY_FLOATS","tmpMatrix","Matrix4x4","tmpMatrix2","tmpPosition","Vector3","tmpRotation","Quaternion","tmpScale","tmpPoint","tmpPoint2","tmpHeader","Float32Array","AnimationBank","Disposable","_jointCount","_jointNames","_inverseBindMatrices","_entries","_tracks","_version","animationSet","binding","clipNames","joints","length","map","joint","name","inverseBindMatrices","m","Set","names","getAnimationNames","addClip","index","getEntryIndex","entry","bakeClip","push","version","jointCount","entries","findIndex","isCompatible","every","i","equalsTo","createTrack","clip","options","Error","track","AnimationBankTrack","add","writePalette","entryIndex","position","slot","out","key0","key1","alpha","getKeyIndicesFromTime","frameCount","playLength","keys","n","blendKeys","multiplyAffine","set","SkinPaletteAtlas","instance","writeSlots","computeBoundingBox","mesh","info","skinnedBoundingInfo","skinSpace","getSkinSpaceMatrix","influenceCount","Math","max","box","BoundingBox","beginExtend","frame","v","boundingVertices","setXYZ","j","weight","Number","boundingVertexJointWeights","boundingVertexBlendIndices","offset","transformPointAffine","scaleBy","addBy","extend","isValid","removeTrack","delete","onDispose","dispose","get","console","error","rig","rootJoint","tracks","filter","target","has","saved","node","clone","rotation","scale","timeDuration","round","reference","referenceNode","computeBindPose","time","targetTracks","t","getDuration","applyState","calculateState","invReference","invertAffine","worldMatrix","world","decompose","x","y","z","w","_activeTracks","_updateFrame","_bank","_entryIndex","_position","_playRate","_loop","_autoPlay","_block","_dirty","_palette","_meshes","bank","playRate","loop","autoPlay","wrap","_previousPosition","_evaluatedPosition","_gpu","evaluation","AnimationBankGpuEvaluator","isSupported","allocate","_offsets","Map","writeHeader","addTrack","evaluate","updateAll","deltaInSeconds","getDevice","frameInfo","frameCounter","update","clipName","val","paletteBase","base","gpuEvaluated","previousPosition","setClip","attachMesh","attach","count","iterate","child","isMesh","detach","detachMesh","free","only","findSkinBindingById","skinBindingName","previous","getSkinPaletteOverride","owner","suspendPalette","boundingBox","setSkinPaletteOverride","min","numKeys","sequenceLength","lastIndex","keyPos","floor","a","b","beta","ax","ay","az","aw","bx","by","bz","bw","len","hypot","sign","sx","sy","sz"],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ import { DRef } from '@zephyr3d/base';
2
+ import { getDevice } from '../app/api.js';
3
+ import { SkinPaletteAtlas } from './skin_palette_atlas.js';
4
+
5
+ /** Threads in one workgroup, one joint of one job each */ const WORKGROUP_SIZE = 64;
6
+ /** Floats in one baked joint key, as `KEY_FLOATS` of animation_bank.ts */ const KEY_FLOATS = 10;
7
+ /** vec4s describing one job: (key offset, frame count, play length, time), (output slot, -, -, -) */ const JOB_VEC4S = 2;
8
+ /**
9
+ * Evaluates the palettes of animation bank tracks in a compute pass
10
+ *
11
+ * @remarks
12
+ * Each job poses every joint of one palette set at one time; a track runs two jobs per frame, its
13
+ * current and its previous position, into fixed sets of its palette block. Unlike the
14
+ * double-buffered sets of the CPU path, both are written each frame, which also makes the GPU
15
+ * slots immune to rows of the atlas being re-uploaded from its CPU mirror: evaluation is
16
+ * dispatched after every upload.
17
+ *
18
+ * WebGPU only, since it writes the atlas as a storage texture.
19
+ *
20
+ * @internal
21
+ */ class AnimationBankGpuEvaluator {
22
+ static _program = null;
23
+ static _banks = new Map();
24
+ static _listening = false;
25
+ static _dispatchFrame = -1;
26
+ static _params = new Float32Array(4);
27
+ /** Whether palettes can be evaluated on the device */ static isSupported() {
28
+ return getDevice().type === 'webgpu';
29
+ }
30
+ /** Evaluate a track on the GPU from now on */ static addTrack(track) {
31
+ const bank = track.bank;
32
+ let info = this._banks.get(bank);
33
+ if (!info) {
34
+ info = {
35
+ tracks: new Set(),
36
+ res: this.createResources(bank)
37
+ };
38
+ this._banks.set(bank, info);
39
+ }
40
+ info.tracks.add(track);
41
+ if (!this._listening) {
42
+ this._listening = true;
43
+ SkinPaletteAtlas.addUploadListener((uploaded)=>this.onAtlasFlushed(uploaded));
44
+ }
45
+ }
46
+ /** Stop evaluating a track, releasing the resources of its bank with its last track */ static removeTrack(track) {
47
+ const info = this._banks.get(track.bank);
48
+ if (info?.tracks.delete(track) && info.tracks.size === 0) {
49
+ this.releaseResources(info.res);
50
+ this._banks.delete(track.bank);
51
+ }
52
+ }
53
+ static releaseResources(res) {
54
+ res.keys.dispose();
55
+ res.inverseBind.dispose();
56
+ res.jobs.dispose();
57
+ res.bindGroup.dispose();
58
+ }
59
+ /**
60
+ * Evaluate once per frame, and again whenever the atlas uploads rows from its CPU mirror,
61
+ * which may hold stale contents for the slots written here
62
+ */ static onAtlasFlushed(uploaded) {
63
+ const frame = getDevice().frameInfo.frameCounter;
64
+ if (this._banks.size > 0 && (uploaded || frame !== this._dispatchFrame)) {
65
+ this._dispatchFrame = frame;
66
+ for (const [bank, info] of this._banks){
67
+ if (info.res.version !== bank.version) {
68
+ // Clips were baked into the bank since its keys were uploaded
69
+ this.releaseResources(info.res);
70
+ info.res = this.createResources(bank);
71
+ }
72
+ this.dispatch(bank, info.tracks, info.res);
73
+ }
74
+ }
75
+ }
76
+ static dispatch(bank, tracks, res) {
77
+ const n = bank.jointCount;
78
+ const jobCount = tracks.size * 2;
79
+ if (jobCount === 0 || n === 0) {
80
+ return;
81
+ }
82
+ const device = getDevice();
83
+ if (jobCount > res.jobCapacity) {
84
+ res.jobCapacity = Math.max(jobCount, res.jobCapacity * 2);
85
+ res.jobData = new Float32Array(res.jobCapacity * JOB_VEC4S * 4);
86
+ res.jobs.set(this.createStorageBuffer(res.jobData.byteLength, true));
87
+ res.bindGroup.get()?.setBuffer('jobs', res.jobs.get());
88
+ }
89
+ const data = res.jobData;
90
+ let o = 0;
91
+ for (const track of tracks){
92
+ const entryIndex = track.entryIndex;
93
+ const entry = bank.entries[entryIndex];
94
+ const base = track.paletteBase;
95
+ for (const [time, slot] of [
96
+ [
97
+ track.position,
98
+ base + 1
99
+ ],
100
+ [
101
+ track.previousPosition,
102
+ base + 1 + n
103
+ ]
104
+ ]){
105
+ data[o++] = res.entryOffsets[entryIndex];
106
+ data[o++] = entry.frameCount;
107
+ data[o++] = entry.playLength;
108
+ data[o++] = time;
109
+ data[o++] = slot;
110
+ data[o++] = 0;
111
+ data[o++] = 0;
112
+ data[o++] = 0;
113
+ }
114
+ }
115
+ res.jobs.get().bufferSubData(0, data, 0, o);
116
+ const atlas = SkinPaletteAtlas.instance;
117
+ const bindGroup = res.bindGroup.get();
118
+ this._params[0] = n;
119
+ this._params[1] = jobCount;
120
+ this._params[2] = atlas.width;
121
+ bindGroup.setValue('params', this._params);
122
+ // The atlas texture is replaced when it grows
123
+ bindGroup.setTexture('atlas', atlas.texture);
124
+ device.setProgram(this.getProgram());
125
+ device.setBindGroup(0, bindGroup);
126
+ device.compute(Math.ceil(jobCount * n / WORKGROUP_SIZE), 1, 1);
127
+ }
128
+ static createResources(bank) {
129
+ const entryOffsets = [];
130
+ let keyFloats = 0;
131
+ for (const entry of bank.entries){
132
+ entryOffsets.push(keyFloats);
133
+ keyFloats += entry.keys.length;
134
+ }
135
+ const keyData = new Float32Array(Math.max(4, keyFloats));
136
+ bank.entries.forEach((entry, i)=>keyData.set(entry.keys, entryOffsets[i]));
137
+ const inverseBindData = new Float32Array(Math.max(16, bank.jointCount * 16));
138
+ bank.inverseBindMatrices.forEach((m, i)=>inverseBindData.set(m, i * 16));
139
+ const keys = this.createStorageBuffer(keyData.byteLength, false);
140
+ keys.bufferSubData(0, keyData);
141
+ const inverseBind = this.createStorageBuffer(inverseBindData.byteLength, false);
142
+ inverseBind.bufferSubData(0, inverseBindData);
143
+ const jobCapacity = 8;
144
+ const jobData = new Float32Array(jobCapacity * JOB_VEC4S * 4);
145
+ const jobs = this.createStorageBuffer(jobData.byteLength, true);
146
+ const bindGroup = getDevice().createBindGroup(this.getProgram().bindGroupLayouts[0]);
147
+ bindGroup.setBuffer('keys', keys);
148
+ bindGroup.setBuffer('inverseBind', inverseBind);
149
+ bindGroup.setBuffer('jobs', jobs);
150
+ return {
151
+ keys: new DRef(keys),
152
+ inverseBind: new DRef(inverseBind),
153
+ jobs: new DRef(jobs),
154
+ jobCapacity,
155
+ jobData,
156
+ bindGroup: new DRef(bindGroup),
157
+ entryOffsets,
158
+ version: bank.version
159
+ };
160
+ }
161
+ static createStorageBuffer(bytes, dynamic) {
162
+ return getDevice().createBuffer(Math.max(16, bytes), {
163
+ usage: 'uniform',
164
+ storage: true,
165
+ dynamic,
166
+ managed: false
167
+ });
168
+ }
169
+ static getProgram() {
170
+ if (!this._program) {
171
+ this._program = getDevice().buildComputeProgram({
172
+ label: 'AnimationBankEvaluate',
173
+ workgroupSize: [
174
+ WORKGROUP_SIZE,
175
+ 1,
176
+ 1
177
+ ],
178
+ compute (pb) {
179
+ // (joint count, job count, atlas width, unused)
180
+ this.params = pb.vec4().uniform(0);
181
+ this.keys = pb.float[0]().storageBufferReadonly(0);
182
+ // Columns of the inverse bind matrices, four per joint
183
+ this.inverseBind = pb.vec4[0]().storageBufferReadonly(0);
184
+ this.jobs = pb.vec4[0]().storageBufferReadonly(0);
185
+ this.atlas = pb.texStorage2D.rgba32float().storage(0);
186
+ pb.func('loadRotation', [
187
+ pb.uint('o')
188
+ ], function() {
189
+ this.$l.q = pb.vec4(this.keys.at(pb.add(this.o, 3)), this.keys.at(pb.add(this.o, 4)), this.keys.at(pb.add(this.o, 5)), this.keys.at(pb.add(this.o, 6)));
190
+ this.$l.len2 = pb.dot(this.q, this.q);
191
+ this.$return(pb.select(pb.vec4(0, 0, 0, 1), pb.mul(this.q, pb.inverseSqrt(this.len2)), pb.greaterThan(this.len2, 0)));
192
+ });
193
+ pb.func('loadVec3', [
194
+ pb.uint('o')
195
+ ], function() {
196
+ this.$return(pb.vec3(this.keys.at(this.o), this.keys.at(pb.add(this.o, 1)), this.keys.at(pb.add(this.o, 2))));
197
+ });
198
+ pb.main(function() {
199
+ this.$l.n = pb.uint(this.params.x);
200
+ this.$l.gid = this.$builtins.globalInvocationId.x;
201
+ this.$l.job = pb.div(this.gid, this.n);
202
+ this.$if(pb.lessThan(this.job, pb.uint(this.params.y)), function() {
203
+ this.$l.joint = pb.sub(this.gid, pb.mul(this.job, this.n));
204
+ this.$l.desc = this.jobs.at(pb.mul(this.job, JOB_VEC4S));
205
+ this.$l.out = this.jobs.at(pb.add(pb.mul(this.job, JOB_VEC4S), 1));
206
+ this.$l.frameCount = pb.int(this.desc.y);
207
+ this.$l.playLength = this.desc.z;
208
+ this.$l.time = this.desc.w;
209
+ this.$l.key0 = pb.int(0);
210
+ this.$l.key1 = pb.int(0);
211
+ this.$l.alpha = pb.float(0);
212
+ this.$if(pb.and(pb.greaterThan(this.time, 0), pb.greaterThan(this.frameCount, 1)), function() {
213
+ this.$l.lastIndex = pb.sub(this.frameCount, 1);
214
+ this.$if(pb.greaterThanEqual(this.time, this.playLength), function() {
215
+ this.key0 = this.lastIndex;
216
+ }).$else(function() {
217
+ this.$l.keyPos = pb.mul(this.time, pb.div(pb.float(this.lastIndex), this.playLength));
218
+ this.key0 = pb.clamp(pb.int(pb.floor(this.keyPos)), 0, this.lastIndex);
219
+ this.alpha = pb.sub(this.keyPos, pb.float(this.key0));
220
+ this.key1 = pb.min(pb.add(this.key0, 1), this.lastIndex);
221
+ });
222
+ });
223
+ this.$l.entry = pb.uint(this.desc.x);
224
+ this.$l.a = pb.add(this.entry, pb.mul(pb.add(pb.mul(pb.uint(this.key0), this.n), this.joint), pb.uint(KEY_FLOATS)));
225
+ this.$l.b = pb.add(this.entry, pb.mul(pb.add(pb.mul(pb.uint(this.key1), this.n), this.joint), pb.uint(KEY_FLOATS)));
226
+ this.$l.qa = this.loadRotation(this.a);
227
+ this.$l.qb = this.loadRotation(this.b);
228
+ this.qb = pb.select(this.qb, pb.neg(this.qb), pb.lessThan(pb.dot(this.qa, this.qb), 0));
229
+ this.$l.q = pb.normalize(pb.mix(this.qa, this.qb, this.alpha));
230
+ this.$l.t = pb.mix(this.loadVec3(this.a), this.loadVec3(this.b), this.alpha);
231
+ this.$l.s = pb.mix(this.loadVec3(pb.add(this.a, 7)), this.loadVec3(pb.add(this.b, 7)), this.alpha);
232
+ // Joint pose as translation * rotation * scale, by columns
233
+ this.$l.x = this.q.x;
234
+ this.$l.y = this.q.y;
235
+ this.$l.z = this.q.z;
236
+ this.$l.w = this.q.w;
237
+ this.$l.pose = pb.mat4(pb.vec4(pb.mul(pb.vec3(pb.sub(1, pb.mul(2, pb.add(pb.mul(this.y, this.y), pb.mul(this.z, this.z)))), pb.mul(2, pb.add(pb.mul(this.x, this.y), pb.mul(this.z, this.w))), pb.mul(2, pb.sub(pb.mul(this.x, this.z), pb.mul(this.y, this.w)))), this.s.x), 0), pb.vec4(pb.mul(pb.vec3(pb.mul(2, pb.sub(pb.mul(this.x, this.y), pb.mul(this.z, this.w))), pb.sub(1, pb.mul(2, pb.add(pb.mul(this.x, this.x), pb.mul(this.z, this.z)))), pb.mul(2, pb.add(pb.mul(this.y, this.z), pb.mul(this.x, this.w)))), this.s.y), 0), pb.vec4(pb.mul(pb.vec3(pb.mul(2, pb.add(pb.mul(this.x, this.z), pb.mul(this.y, this.w))), pb.mul(2, pb.sub(pb.mul(this.y, this.z), pb.mul(this.x, this.w))), pb.sub(1, pb.mul(2, pb.add(pb.mul(this.x, this.x), pb.mul(this.y, this.y))))), this.s.z), 0), pb.vec4(this.t, 1));
238
+ // Skinning matrix = pose * inverse bind, stored by columns as the CPU path does
239
+ this.$l.slot = pb.add(pb.uint(this.out.x), this.joint);
240
+ this.$l.width = pb.uint(this.params.z);
241
+ this.$l.inv = pb.mul(this.joint, 4);
242
+ this.$for(pb.uint('c'), 0, 4, function() {
243
+ this.$l.texel = pb.add(pb.mul(this.slot, 4), this.c);
244
+ pb.textureStore(this.atlas, pb.uvec2(pb.sub(this.texel, pb.mul(pb.div(this.texel, this.width), this.width)), pb.div(this.texel, this.width)), pb.mul(this.pose, this.inverseBind.at(pb.add(this.inv, this.c))));
245
+ });
246
+ });
247
+ });
248
+ }
249
+ });
250
+ }
251
+ return this._program;
252
+ }
253
+ }
254
+
255
+ export { AnimationBankGpuEvaluator };
256
+ //# sourceMappingURL=animation_bank_gpu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation_bank_gpu.js","sources":["../../src/animation/animation_bank_gpu.ts"],"sourcesContent":["import { DRef } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { BindGroup, GPUDataBuffer, GPUProgram } from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\nimport type { AnimationBank, AnimationBankTrack } from './animation_bank';\r\nimport { SkinPaletteAtlas } from './skin_palette_atlas';\r\n\r\n/** Threads in one workgroup, one joint of one job each */\r\nconst WORKGROUP_SIZE = 64;\r\n/** Floats in one baked joint key, as `KEY_FLOATS` of animation_bank.ts */\r\nconst KEY_FLOATS = 10;\r\n/** vec4s describing one job: (key offset, frame count, play length, time), (output slot, -, -, -) */\r\nconst JOB_VEC4S = 2;\r\n\r\n/** GPU copies of the baked keys and inverse bind matrices of one bank */\r\ninterface BankResources {\r\n keys: DRef<GPUDataBuffer>;\r\n inverseBind: DRef<GPUDataBuffer>;\r\n jobs: DRef<GPUDataBuffer>;\r\n jobCapacity: number;\r\n jobData: Float32Array<ArrayBuffer>;\r\n bindGroup: DRef<BindGroup>;\r\n /** Offset of the keys of each entry in the key buffer, in floats */\r\n entryOffsets: number[];\r\n /** Version of the bank the buffers hold */\r\n version: number;\r\n}\r\n\r\n/**\r\n * Evaluates the palettes of animation bank tracks in a compute pass\r\n *\r\n * @remarks\r\n * Each job poses every joint of one palette set at one time; a track runs two jobs per frame, its\r\n * current and its previous position, into fixed sets of its palette block. Unlike the\r\n * double-buffered sets of the CPU path, both are written each frame, which also makes the GPU\r\n * slots immune to rows of the atlas being re-uploaded from its CPU mirror: evaluation is\r\n * dispatched after every upload.\r\n *\r\n * WebGPU only, since it writes the atlas as a storage texture.\r\n *\r\n * @internal\r\n */\r\nexport class AnimationBankGpuEvaluator {\r\n private static _program: Nullable<GPUProgram> = null;\r\n private static readonly _banks: Map<\r\n AnimationBank,\r\n { tracks: Set<AnimationBankTrack>; res: BankResources }\r\n > = new Map();\r\n private static _listening = false;\r\n private static _dispatchFrame = -1;\r\n private static readonly _params = new Float32Array(4);\r\n /** Whether palettes can be evaluated on the device */\r\n static isSupported() {\r\n return getDevice().type === 'webgpu';\r\n }\r\n /** Evaluate a track on the GPU from now on */\r\n static addTrack(track: AnimationBankTrack) {\r\n const bank = track.bank;\r\n let info = this._banks.get(bank);\r\n if (!info) {\r\n info = { tracks: new Set(), res: this.createResources(bank) };\r\n this._banks.set(bank, info);\r\n }\r\n info.tracks.add(track);\r\n if (!this._listening) {\r\n this._listening = true;\r\n SkinPaletteAtlas.addUploadListener((uploaded) => this.onAtlasFlushed(uploaded));\r\n }\r\n }\r\n /** Stop evaluating a track, releasing the resources of its bank with its last track */\r\n static removeTrack(track: AnimationBankTrack) {\r\n const info = this._banks.get(track.bank);\r\n if (info?.tracks.delete(track) && info.tracks.size === 0) {\r\n this.releaseResources(info.res);\r\n this._banks.delete(track.bank);\r\n }\r\n }\r\n private static releaseResources(res: BankResources) {\r\n res.keys.dispose();\r\n res.inverseBind.dispose();\r\n res.jobs.dispose();\r\n res.bindGroup.dispose();\r\n }\r\n /**\r\n * Evaluate once per frame, and again whenever the atlas uploads rows from its CPU mirror,\r\n * which may hold stale contents for the slots written here\r\n */\r\n private static onAtlasFlushed(uploaded: boolean) {\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (this._banks.size > 0 && (uploaded || frame !== this._dispatchFrame)) {\r\n this._dispatchFrame = frame;\r\n for (const [bank, info] of this._banks) {\r\n if (info.res.version !== bank.version) {\r\n // Clips were baked into the bank since its keys were uploaded\r\n this.releaseResources(info.res);\r\n info.res = this.createResources(bank);\r\n }\r\n this.dispatch(bank, info.tracks, info.res);\r\n }\r\n }\r\n }\r\n private static dispatch(bank: AnimationBank, tracks: Set<AnimationBankTrack>, res: BankResources) {\r\n const n = bank.jointCount;\r\n const jobCount = tracks.size * 2;\r\n if (jobCount === 0 || n === 0) {\r\n return;\r\n }\r\n const device = getDevice();\r\n if (jobCount > res.jobCapacity) {\r\n res.jobCapacity = Math.max(jobCount, res.jobCapacity * 2);\r\n res.jobData = new Float32Array(res.jobCapacity * JOB_VEC4S * 4);\r\n res.jobs.set(this.createStorageBuffer(res.jobData.byteLength, true));\r\n res.bindGroup.get()?.setBuffer('jobs', res.jobs.get()!);\r\n }\r\n const data = res.jobData;\r\n let o = 0;\r\n for (const track of tracks) {\r\n const entryIndex = track.entryIndex;\r\n const entry = bank.entries[entryIndex];\r\n const base = track.paletteBase;\r\n for (const [time, slot] of [\r\n [track.position, base + 1],\r\n [track.previousPosition, base + 1 + n]\r\n ]) {\r\n data[o++] = res.entryOffsets[entryIndex];\r\n data[o++] = entry.frameCount;\r\n data[o++] = entry.playLength;\r\n data[o++] = time;\r\n data[o++] = slot;\r\n data[o++] = 0;\r\n data[o++] = 0;\r\n data[o++] = 0;\r\n }\r\n }\r\n res.jobs.get()!.bufferSubData(0, data, 0, o);\r\n const atlas = SkinPaletteAtlas.instance;\r\n const bindGroup = res.bindGroup.get()!;\r\n this._params[0] = n;\r\n this._params[1] = jobCount;\r\n this._params[2] = atlas.width;\r\n bindGroup.setValue('params', this._params);\r\n // The atlas texture is replaced when it grows\r\n bindGroup.setTexture('atlas', atlas.texture);\r\n device.setProgram(this.getProgram());\r\n device.setBindGroup(0, bindGroup);\r\n device.compute(Math.ceil((jobCount * n) / WORKGROUP_SIZE), 1, 1);\r\n }\r\n private static createResources(bank: AnimationBank): BankResources {\r\n const entryOffsets: number[] = [];\r\n let keyFloats = 0;\r\n for (const entry of bank.entries) {\r\n entryOffsets.push(keyFloats);\r\n keyFloats += entry.keys.length;\r\n }\r\n const keyData = new Float32Array(Math.max(4, keyFloats));\r\n bank.entries.forEach((entry, i) => keyData.set(entry.keys, entryOffsets[i]));\r\n const inverseBindData = new Float32Array(Math.max(16, bank.jointCount * 16));\r\n bank.inverseBindMatrices.forEach((m, i) => inverseBindData.set(m, i * 16));\r\n const keys = this.createStorageBuffer(keyData.byteLength, false);\r\n keys.bufferSubData(0, keyData);\r\n const inverseBind = this.createStorageBuffer(inverseBindData.byteLength, false);\r\n inverseBind.bufferSubData(0, inverseBindData);\r\n const jobCapacity = 8;\r\n const jobData = new Float32Array(jobCapacity * JOB_VEC4S * 4);\r\n const jobs = this.createStorageBuffer(jobData.byteLength, true);\r\n const bindGroup = getDevice().createBindGroup(this.getProgram().bindGroupLayouts[0]);\r\n bindGroup.setBuffer('keys', keys);\r\n bindGroup.setBuffer('inverseBind', inverseBind);\r\n bindGroup.setBuffer('jobs', jobs);\r\n return {\r\n keys: new DRef(keys),\r\n inverseBind: new DRef(inverseBind),\r\n jobs: new DRef(jobs),\r\n jobCapacity,\r\n jobData,\r\n bindGroup: new DRef(bindGroup),\r\n entryOffsets,\r\n version: bank.version\r\n };\r\n }\r\n private static createStorageBuffer(bytes: number, dynamic: boolean) {\r\n return getDevice().createBuffer(Math.max(16, bytes), {\r\n usage: 'uniform',\r\n storage: true,\r\n dynamic,\r\n managed: false\r\n });\r\n }\r\n private static getProgram() {\r\n if (!this._program) {\r\n this._program = getDevice().buildComputeProgram({\r\n label: 'AnimationBankEvaluate',\r\n workgroupSize: [WORKGROUP_SIZE, 1, 1],\r\n compute(pb) {\r\n // (joint count, job count, atlas width, unused)\r\n this.params = pb.vec4().uniform(0);\r\n this.keys = pb.float[0]().storageBufferReadonly(0);\r\n // Columns of the inverse bind matrices, four per joint\r\n this.inverseBind = pb.vec4[0]().storageBufferReadonly(0);\r\n this.jobs = pb.vec4[0]().storageBufferReadonly(0);\r\n this.atlas = pb.texStorage2D.rgba32float().storage(0);\r\n pb.func('loadRotation', [pb.uint('o')], function () {\r\n this.$l.q = pb.vec4(\r\n this.keys.at(pb.add(this.o, 3)),\r\n this.keys.at(pb.add(this.o, 4)),\r\n this.keys.at(pb.add(this.o, 5)),\r\n this.keys.at(pb.add(this.o, 6))\r\n );\r\n this.$l.len2 = pb.dot(this.q, this.q);\r\n this.$return(\r\n pb.select(\r\n pb.vec4(0, 0, 0, 1),\r\n pb.mul(this.q, pb.inverseSqrt(this.len2)),\r\n pb.greaterThan(this.len2, 0)\r\n )\r\n );\r\n });\r\n pb.func('loadVec3', [pb.uint('o')], function () {\r\n this.$return(\r\n pb.vec3(this.keys.at(this.o), this.keys.at(pb.add(this.o, 1)), this.keys.at(pb.add(this.o, 2)))\r\n );\r\n });\r\n pb.main(function () {\r\n this.$l.n = pb.uint(this.params.x);\r\n this.$l.gid = this.$builtins.globalInvocationId.x;\r\n this.$l.job = pb.div(this.gid, this.n);\r\n this.$if(pb.lessThan(this.job, pb.uint(this.params.y)), function () {\r\n this.$l.joint = pb.sub(this.gid, pb.mul(this.job, this.n));\r\n this.$l.desc = this.jobs.at(pb.mul(this.job, JOB_VEC4S));\r\n this.$l.out = this.jobs.at(pb.add(pb.mul(this.job, JOB_VEC4S), 1));\r\n this.$l.frameCount = pb.int(this.desc.y);\r\n this.$l.playLength = this.desc.z;\r\n this.$l.time = this.desc.w;\r\n this.$l.key0 = pb.int(0);\r\n this.$l.key1 = pb.int(0);\r\n this.$l.alpha = pb.float(0);\r\n this.$if(pb.and(pb.greaterThan(this.time, 0), pb.greaterThan(this.frameCount, 1)), function () {\r\n this.$l.lastIndex = pb.sub(this.frameCount, 1);\r\n this.$if(pb.greaterThanEqual(this.time, this.playLength), function () {\r\n this.key0 = this.lastIndex;\r\n }).$else(function () {\r\n this.$l.keyPos = pb.mul(this.time, pb.div(pb.float(this.lastIndex), this.playLength));\r\n this.key0 = pb.clamp(pb.int(pb.floor(this.keyPos)), 0, this.lastIndex);\r\n this.alpha = pb.sub(this.keyPos, pb.float(this.key0));\r\n this.key1 = pb.min(pb.add(this.key0, 1), this.lastIndex);\r\n });\r\n });\r\n this.$l.entry = pb.uint(this.desc.x);\r\n this.$l.a = pb.add(\r\n this.entry,\r\n pb.mul(pb.add(pb.mul(pb.uint(this.key0), this.n), this.joint), pb.uint(KEY_FLOATS))\r\n );\r\n this.$l.b = pb.add(\r\n this.entry,\r\n pb.mul(pb.add(pb.mul(pb.uint(this.key1), this.n), this.joint), pb.uint(KEY_FLOATS))\r\n );\r\n this.$l.qa = this.loadRotation(this.a);\r\n this.$l.qb = this.loadRotation(this.b);\r\n this.qb = pb.select(this.qb, pb.neg(this.qb), pb.lessThan(pb.dot(this.qa, this.qb), 0));\r\n this.$l.q = pb.normalize(pb.mix(this.qa, this.qb, this.alpha));\r\n this.$l.t = pb.mix(this.loadVec3(this.a), this.loadVec3(this.b), this.alpha);\r\n this.$l.s = pb.mix(\r\n this.loadVec3(pb.add(this.a, 7)),\r\n this.loadVec3(pb.add(this.b, 7)),\r\n this.alpha\r\n );\r\n // Joint pose as translation * rotation * scale, by columns\r\n this.$l.x = this.q.x;\r\n this.$l.y = this.q.y;\r\n this.$l.z = this.q.z;\r\n this.$l.w = this.q.w;\r\n this.$l.pose = pb.mat4(\r\n pb.vec4(\r\n pb.mul(\r\n pb.vec3(\r\n pb.sub(1, pb.mul(2, pb.add(pb.mul(this.y, this.y), pb.mul(this.z, this.z)))),\r\n pb.mul(2, pb.add(pb.mul(this.x, this.y), pb.mul(this.z, this.w))),\r\n pb.mul(2, pb.sub(pb.mul(this.x, this.z), pb.mul(this.y, this.w)))\r\n ),\r\n this.s.x\r\n ),\r\n 0\r\n ),\r\n pb.vec4(\r\n pb.mul(\r\n pb.vec3(\r\n pb.mul(2, pb.sub(pb.mul(this.x, this.y), pb.mul(this.z, this.w))),\r\n pb.sub(1, pb.mul(2, pb.add(pb.mul(this.x, this.x), pb.mul(this.z, this.z)))),\r\n pb.mul(2, pb.add(pb.mul(this.y, this.z), pb.mul(this.x, this.w)))\r\n ),\r\n this.s.y\r\n ),\r\n 0\r\n ),\r\n pb.vec4(\r\n pb.mul(\r\n pb.vec3(\r\n pb.mul(2, pb.add(pb.mul(this.x, this.z), pb.mul(this.y, this.w))),\r\n pb.mul(2, pb.sub(pb.mul(this.y, this.z), pb.mul(this.x, this.w))),\r\n pb.sub(1, pb.mul(2, pb.add(pb.mul(this.x, this.x), pb.mul(this.y, this.y))))\r\n ),\r\n this.s.z\r\n ),\r\n 0\r\n ),\r\n pb.vec4(this.t, 1)\r\n );\r\n // Skinning matrix = pose * inverse bind, stored by columns as the CPU path does\r\n this.$l.slot = pb.add(pb.uint(this.out.x), this.joint);\r\n this.$l.width = pb.uint(this.params.z);\r\n this.$l.inv = pb.mul(this.joint, 4);\r\n this.$for(pb.uint('c'), 0, 4, function () {\r\n this.$l.texel = pb.add(pb.mul(this.slot, 4), this.c);\r\n pb.textureStore(\r\n this.atlas,\r\n pb.uvec2(\r\n pb.sub(this.texel, pb.mul(pb.div(this.texel, this.width), this.width)),\r\n pb.div(this.texel, this.width)\r\n ),\r\n pb.mul(this.pose, this.inverseBind.at(pb.add(this.inv, this.c)))\r\n );\r\n });\r\n });\r\n });\r\n }\r\n })!;\r\n }\r\n return this._program;\r\n }\r\n}\r\n"],"names":["WORKGROUP_SIZE","KEY_FLOATS","JOB_VEC4S","AnimationBankGpuEvaluator","_program","_banks","Map","_listening","_dispatchFrame","_params","Float32Array","isSupported","getDevice","type","addTrack","track","bank","info","get","tracks","Set","res","createResources","set","add","SkinPaletteAtlas","addUploadListener","uploaded","onAtlasFlushed","removeTrack","delete","size","releaseResources","keys","dispose","inverseBind","jobs","bindGroup","frame","frameInfo","frameCounter","version","dispatch","n","jointCount","jobCount","device","jobCapacity","Math","max","jobData","createStorageBuffer","byteLength","setBuffer","data","o","entryIndex","entry","entries","base","paletteBase","time","slot","position","previousPosition","entryOffsets","frameCount","playLength","bufferSubData","atlas","instance","width","setValue","setTexture","texture","setProgram","getProgram","setBindGroup","compute","ceil","keyFloats","push","length","keyData","forEach","i","inverseBindData","inverseBindMatrices","m","createBindGroup","bindGroupLayouts","DRef","bytes","dynamic","createBuffer","usage","storage","managed","buildComputeProgram","label","workgroupSize","pb","params","vec4","uniform","float","storageBufferReadonly","texStorage2D","rgba32float","func","uint","$l","q","at","len2","dot","$return","select","mul","inverseSqrt","greaterThan","vec3","main","x","gid","$builtins","globalInvocationId","job","div","$if","lessThan","y","joint","sub","desc","out","int","z","w","key0","key1","alpha","and","lastIndex","greaterThanEqual","$else","keyPos","clamp","floor","min","a","b","qa","loadRotation","qb","neg","normalize","mix","t","loadVec3","s","pose","mat4","inv","$for","texel","c","textureStore","uvec2"],"mappings":"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"}