@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
@@ -7,6 +7,7 @@ import { NodeScaleTrack } from './scaletrack.js';
7
7
  import { MorphTargetGroupTrack } from './morphtargetgrouptrack.js';
8
8
  import { HumanoidBodyRig } from './skeleton.js';
9
9
  import { createSkeletalMaskedAnimationClip } from './animationmask.js';
10
+ import { GpuAnimationDriver } from './gpu_animation_driver.js';
10
11
 
11
12
  let nextAnimationPlaybackId = 1;
12
13
  /**
@@ -236,6 +237,8 @@ function cloneInterpolator(src) {
236
237
  function createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint, translationRotation, translationScale, translationCorrection, translationAxisLocks, rotationCorrection) {
237
238
  const si = srcSkeleton.joints.indexOf(srcJoint);
238
239
  const di = dstSkeleton.joints.indexOf(dstJoint);
240
+ const srcReferencePose = srcSkeleton.retargetPose[si];
241
+ const dstReferencePose = dstSkeleton.retargetPose[di];
239
242
  const srcBindPose = srcSkeleton.bindPose[si];
240
243
  const dstBindPose = dstSkeleton.bindPose[di];
241
244
  const srcLen = srcBindPose.position.magnitude;
@@ -244,10 +247,10 @@ function createJointRetargetRemap(srcSkeleton, dstSkeleton, srcJoint, dstJoint,
244
247
  dstNode: dstJoint,
245
248
  dstJointIndex: di,
246
249
  srcNode: srcJoint,
247
- srcBindRotInv: Quaternion.inverse(srcBindPose.rotation),
248
- dstBindRot: dstBindPose.rotation.clone(),
250
+ srcBindRotInv: Quaternion.inverse(srcReferencePose.rotation),
251
+ dstBindRot: dstReferencePose.rotation.clone(),
249
252
  rotationCorrection,
250
- srcBindPos: srcBindPose.position.clone(),
253
+ srcBindPos: srcReferencePose.position.clone(),
251
254
  dstBindPos: dstBindPose.position.clone(),
252
255
  translationScale: translationScale ?? (srcLen > 1e-6 ? dstLen / srcLen : 1),
253
256
  translationRotation,
@@ -275,15 +278,14 @@ function getBindPosition(skeleton, joint) {
275
278
  const index = skeleton.joints.indexOf(joint);
276
279
  return index >= 0 ? skeleton.bindPose[index].position : null;
277
280
  }
278
- function getSkeletonLocalBindTransform(skeleton, node, jointSet, cache) {
281
+ function getSkeletonLocalReferenceTransform(skeleton, node, jointSet, cache) {
279
282
  let transform = cache.get(node);
280
283
  if (!transform) {
281
- const bindPose = getRigBindPoseForNode(skeleton, node);
282
- const position = bindPose.position.clone();
283
- const rotation = bindPose.rotation.clone();
284
+ const position = getRigBindPoseForNode(skeleton, node).position.clone();
285
+ const rotation = getRigReferencePoseForNode(skeleton, node).rotation.clone();
284
286
  const parent = node.parent;
285
287
  if (parent && jointSet.has(parent)) {
286
- const parentTransform = getSkeletonLocalBindTransform(skeleton, parent, jointSet, cache);
288
+ const parentTransform = getSkeletonLocalReferenceTransform(skeleton, parent, jointSet, cache);
287
289
  parentTransform.rotation.transform(position, position);
288
290
  position.addBy(parentTransform.position);
289
291
  Quaternion.multiply(parentTransform.rotation, rotation, rotation);
@@ -345,7 +347,7 @@ function getHumanoidLateralXSign(skeleton) {
345
347
  if (!left || !right || !jointSet.has(left) || !jointSet.has(right)) {
346
348
  continue;
347
349
  }
348
- const dx = getSkeletonLocalBindTransform(skeleton, left, jointSet, cache).position.x - getSkeletonLocalBindTransform(skeleton, right, jointSet, cache).position.x;
350
+ const dx = getSkeletonLocalReferenceTransform(skeleton, left, jointSet, cache).position.x - getSkeletonLocalReferenceTransform(skeleton, right, jointSet, cache).position.x;
349
351
  if (Math.abs(dx) > 1e-5) {
350
352
  score += dx;
351
353
  weight++;
@@ -381,7 +383,7 @@ function getHumanoidForwardZSign(skeleton) {
381
383
  if (!foot || !toes || !jointSet.has(foot) || !jointSet.has(toes)) {
382
384
  continue;
383
385
  }
384
- const dz = getSkeletonLocalBindTransform(skeleton, toes, jointSet, cache).position.z - getSkeletonLocalBindTransform(skeleton, foot, jointSet, cache).position.z;
386
+ const dz = getSkeletonLocalReferenceTransform(skeleton, toes, jointSet, cache).position.z - getSkeletonLocalReferenceTransform(skeleton, foot, jointSet, cache).position.z;
385
387
  if (Math.abs(dz) > 1e-5) {
386
388
  score += dz;
387
389
  weight++;
@@ -420,6 +422,13 @@ function getHumanoidRotationCorrection(srcSkeleton, dstSkeleton, srcSignSkeleton
420
422
  z: determinant * axisZSign
421
423
  };
422
424
  }
425
+ function getRigReferencePoseForNode(skeleton, node) {
426
+ return skeleton.getRetargetPoseForJoint(node) ?? (node === skeleton.rootJoint ? skeleton.rootBindPose : {
427
+ position: node.position,
428
+ rotation: node.rotation,
429
+ scale: node.scale
430
+ });
431
+ }
423
432
  function getRigBindPoseForNode(skeleton, node) {
424
433
  return skeleton.getBindPoseForJoint(node) ?? (node === skeleton.rootJoint ? skeleton.rootBindPose : {
425
434
  position: node.position,
@@ -463,11 +472,36 @@ function getHumanoidRootMotionScale(srcSkeleton, dstSkeleton) {
463
472
  function findTranslationTrack(tracks) {
464
473
  return tracks?.find((track)=>track instanceof NodeTranslationTrack) ?? null;
465
474
  }
466
- function findAncestorTranslationTrack(clip, node, modelRoot) {
475
+ function isTranslationTrackAnimated(track) {
476
+ const inputs = track.interpolator.inputs;
477
+ const outputs = track.interpolator.outputs;
478
+ const cubic = track.interpolator.mode === 'cubicspline';
479
+ const stride = cubic ? 9 : 3;
480
+ const valueOffset = cubic ? 3 : 0;
481
+ if (inputs.length < 2) {
482
+ return false;
483
+ }
484
+ const first = [
485
+ outputs[valueOffset],
486
+ outputs[valueOffset + 1],
487
+ outputs[valueOffset + 2]
488
+ ];
489
+ let maxValue = Math.max(1, Math.abs(first[0]), Math.abs(first[1]), Math.abs(first[2]));
490
+ let maxDelta = 0;
491
+ for(let i = 1; i < inputs.length; i++){
492
+ const base = i * stride + valueOffset;
493
+ for(let axis = 0; axis < 3; axis++){
494
+ maxValue = Math.max(maxValue, Math.abs(outputs[base + axis]));
495
+ maxDelta = Math.max(maxDelta, Math.abs(outputs[base + axis] - first[axis]));
496
+ }
497
+ }
498
+ return maxDelta > maxValue * 1e-5;
499
+ }
500
+ function findAncestorTranslationTrack(clip, node, modelRoot, animatedOnly = false) {
467
501
  let current = node.parent;
468
502
  while(current){
469
503
  const track = findTranslationTrack(clip.tracks.get(current));
470
- if (track) {
504
+ if (track && (!animatedOnly || isTranslationTrackAnimated(track))) {
471
505
  return {
472
506
  node: current,
473
507
  track
@@ -667,18 +701,20 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
667
701
  const remapsByDstNode = new Map();
668
702
  const srcJointSet = new Set(srcSkeleton.joints);
669
703
  const dstJointSet = new Set(dstSkeleton.joints);
670
- const srcBindRotByNode = new Map();
671
- const dstBindRotByNode = new Map();
704
+ const srcReferenceRotByNode = new Map();
705
+ const srcBaseRotByNode = new Map();
706
+ const dstReferenceRotByNode = new Map();
672
707
  const srcRotationTrackByNode = new Map();
673
708
  for(let i = 0; i < srcSkeleton.joints.length; i++){
674
709
  const joint = srcSkeleton.joints[i];
675
- srcBindRotByNode.set(joint, srcSkeleton.bindPose[i].rotation);
710
+ srcReferenceRotByNode.set(joint, srcSkeleton.retargetPose[i].rotation);
711
+ srcBaseRotByNode.set(joint, srcSkeleton.bindPose[i].rotation);
676
712
  const track = findRotationTrack(sourceClip.tracks.get(joint));
677
713
  srcRotationTrackByNode.set(joint, track);
678
714
  collectTrackTimes(track, times);
679
715
  }
680
716
  for(let i = 0; i < dstSkeleton.joints.length; i++){
681
- dstBindRotByNode.set(dstSkeleton.joints[i], dstSkeleton.bindPose[i].rotation);
717
+ dstReferenceRotByNode.set(dstSkeleton.joints[i], dstSkeleton.retargetPose[i].rotation);
682
718
  }
683
719
  for (const remap of remaps){
684
720
  const track = findRotationTrack(sourceClip.tracks.get(remap.srcNode));
@@ -705,7 +741,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
705
741
  function getSrcBindWorldRot(node) {
706
742
  let rot = srcBindWorldRots.get(node);
707
743
  if (!rot) {
708
- rot = (srcBindRotByNode.get(node) ?? Quaternion.identity()).clone();
744
+ rot = (srcReferenceRotByNode.get(node) ?? Quaternion.identity()).clone();
709
745
  const parent = node.parent;
710
746
  if (parent && srcJointSet.has(parent)) {
711
747
  Quaternion.multiply(getSrcBindWorldRot(parent), rot, rot);
@@ -719,7 +755,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
719
755
  function getDstBindWorldRot(node) {
720
756
  let rot = dstBindWorldRots.get(node);
721
757
  if (!rot) {
722
- rot = (dstBindRotByNode.get(node) ?? Quaternion.identity()).clone();
758
+ rot = (dstReferenceRotByNode.get(node) ?? Quaternion.identity()).clone();
723
759
  const parent = node.parent;
724
760
  if (parent && dstJointSet.has(parent)) {
725
761
  Quaternion.multiply(getDstBindWorldRot(parent), rot, rot);
@@ -738,7 +774,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
738
774
  }
739
775
  const parent = node.parent;
740
776
  const parentWorldRot = parent && srcJointSet.has(parent) ? getSrcAnimWorldRot(parent, time) : null;
741
- sampleRotationTrack(srcRotationTrackByNode.get(node) ?? null, time, srcBindRotByNode.get(node) ?? Quaternion.identity(), tmpLocalRot);
777
+ sampleRotationTrack(srcRotationTrackByNode.get(node) ?? null, time, srcBaseRotByNode.get(node) ?? Quaternion.identity(), tmpLocalRot);
742
778
  if (parentWorldRot) {
743
779
  Quaternion.multiply(parentWorldRot, tmpLocalRot, rot);
744
780
  } else {
@@ -776,7 +812,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
776
812
  }
777
813
  let rot = dstAnimWorldRots.get(parent);
778
814
  if (!rot) {
779
- rot = (dstBindRotByNode.get(parent) ?? Quaternion.identity()).clone();
815
+ rot = (dstReferenceRotByNode.get(parent) ?? Quaternion.identity()).clone();
780
816
  const parentWorldRot = getDstParentAnimWorldRot(parent, time);
781
817
  if (parentWorldRot) {
782
818
  Quaternion.multiply(parentWorldRot, rot, rot);
@@ -802,7 +838,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
802
838
  }
803
839
  }
804
840
  for (const remap of remaps){
805
- if (!rotationTracksByRemap.get(remap)) {
841
+ if (!rotationTracksByRemap.get(remap) && !srcSkeleton.hasRetargetPose && !dstSkeleton.hasRetargetPose) {
806
842
  continue;
807
843
  }
808
844
  const outputs = new Float32Array(outputsByRemap.get(remap));
@@ -849,6 +885,8 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
849
885
  * game clock instead of running on real time.
850
886
  * @internal
851
887
  */ _timelineTickers;
888
+ _gpuAnimation;
889
+ _gpuDriver;
852
890
  /**
853
891
  * Create an AnimationSet controlling the provided model.
854
892
  *
@@ -864,6 +902,40 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
864
902
  this._skeletons = [];
865
903
  this._rigs = [];
866
904
  this._timelineTickers = new Set();
905
+ this._gpuAnimation = false;
906
+ this._gpuDriver = null;
907
+ }
908
+ /**
909
+ * Whether skeletal animation may be played from baked poses, evaluated on the GPU where
910
+ * supported. Default false.
911
+ *
912
+ * @remarks
913
+ * Playback, events and the playback API stay the same. While exactly one clip is active, animating
914
+ * only the joints of the model, the joint nodes are left alone and the skinned meshes are posed by
915
+ * {@link AnimationBankTrack}s instead: clips are baked once per model and shared by all its
916
+ * instances, the poses are evaluated in a compute pass on WebGPU, and the meshes stay batchable.
917
+ *
918
+ * Frames that do not meet those conditions are posed on the regular path, without a visible jump:
919
+ * cross fades and other blends of clips, skeleton modifiers such as IK and joint dynamics, GPU
920
+ * cloth, and nodes attached below joints (which follow the joint nodes). In the editor, outside
921
+ * of play mode, animation always takes the regular path.
922
+ *
923
+ * Since joint nodes are not moved while baked poses are played, code reading joint transforms sees
924
+ * them as they were when the baked poses took over.
925
+ */ get gpuAnimation() {
926
+ return this._gpuAnimation;
927
+ }
928
+ set gpuAnimation(val) {
929
+ if (val !== this._gpuAnimation) {
930
+ this._gpuAnimation = val;
931
+ if (!val) {
932
+ this._gpuDriver?.dispose();
933
+ this._gpuDriver = null;
934
+ }
935
+ }
936
+ }
937
+ /** Whether the skinned meshes are currently posed from baked poses, see {@link gpuAnimation} */ get isPlayingOnGpu() {
938
+ return !!this._gpuDriver?.active;
867
939
  }
868
940
  /**
869
941
  * Register a callback advanced by {@link update} using the same delta time as the animations.
@@ -1076,6 +1148,21 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
1076
1148
  }
1077
1149
  }
1078
1150
  });
1151
+ if (this._gpuAnimation) {
1152
+ let clip = null;
1153
+ let time = 0;
1154
+ if (this._activeAnimations.size === 1) {
1155
+ const [[k, v]] = this._activeAnimations;
1156
+ clip = k;
1157
+ time = v.currentTime;
1158
+ }
1159
+ this._gpuDriver ??= new GpuAnimationDriver(this);
1160
+ if (this._gpuDriver.update(clip, time)) {
1161
+ // Bank tracks pose the skinned meshes: no joint node to pose, no palette to write
1162
+ this._timelineTickers.forEach((ticker)=>ticker(deltaInSeconds));
1163
+ return;
1164
+ }
1165
+ }
1079
1166
  // Update tracks
1080
1167
  this._activeTracks.forEach((v, k)=>{
1081
1168
  v.forEach((alltracks)=>{
@@ -1632,6 +1719,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
1632
1719
  const options = typeof targetNameOrOptions === 'string' ? copyOptions ?? {} : targetNameOrOptions ?? {};
1633
1720
  const destName = typeof targetNameOrOptions === 'string' ? targetNameOrOptions : options.targetName ?? animationName;
1634
1721
  const rootMotion = options.rootMotion ?? 'scaled';
1722
+ const hipsTranslation = options.hipsTranslation ?? 'scaled';
1635
1723
  const jointTranslations = options.jointTranslations ?? 'skip';
1636
1724
  const sourceClip = sourceSet.get(animationName);
1637
1725
  if (!sourceClip) {
@@ -1731,16 +1819,19 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
1731
1819
  const dstHipsNode = dstSkeleton.humanoidJointMapping.body[HumanoidBodyRig.Hips];
1732
1820
  const srcRootNode = srcSkeleton.rootJoint ?? srcHipsNode;
1733
1821
  const dstRootNode = dstSkeleton.rootJoint ?? dstHipsNode;
1822
+ const hasSeparateHips = srcRootNode !== srcHipsNode && dstRootNode !== dstHipsNode;
1734
1823
  const srcRootRot = computeParentChainRotation(srcRootNode, sourceSet.model, srcSkeleton);
1735
1824
  const dstRootRot = computeParentChainRotation(dstRootNode, this._model, dstSkeleton);
1736
- const srcRootTranslationTrack = findTranslationTrack(sourceClip.tracks.get(srcRootNode));
1737
- const srcAncestorTranslationTrackInfo = !srcRootTranslationTrack ? findAncestorTranslationTrack(sourceClip, srcRootNode, sourceSet.model) : null;
1738
- const srcFallbackHipsTranslationTrack = !srcRootTranslationTrack && !srcAncestorTranslationTrackInfo && srcRootNode !== srcHipsNode ? findTranslationTrack(sourceClip.tracks.get(srcHipsNode)) : null;
1739
- const srcMotionTrack = srcRootTranslationTrack ?? srcAncestorTranslationTrackInfo?.track ?? srcFallbackHipsTranslationTrack;
1740
- const srcMotionNode = srcRootTranslationTrack ? srcRootNode : srcAncestorTranslationTrackInfo ? srcAncestorTranslationTrackInfo.node : srcFallbackHipsTranslationTrack ? srcHipsNode : null;
1825
+ const rootTrackCandidate = findTranslationTrack(sourceClip.tracks.get(srcRootNode));
1826
+ const srcRootTranslationTrack = rootTrackCandidate && (!hasSeparateHips || isTranslationTrackAnimated(rootTrackCandidate)) ? rootTrackCandidate : null;
1827
+ const srcAncestorTranslationTrackInfo = !srcRootTranslationTrack ? findAncestorTranslationTrack(sourceClip, srcRootNode, sourceSet.model, hasSeparateHips) : null;
1828
+ const srcMotionTrack = srcRootTranslationTrack ?? srcAncestorTranslationTrackInfo?.track ?? null;
1829
+ const srcMotionNode = srcRootTranslationTrack ? srcRootNode : srcAncestorTranslationTrackInfo ? srcAncestorTranslationTrackInfo.node : null;
1741
1830
  const srcMotionParentRot = srcMotionNode ? computeParentChainRotation(srcMotionNode, sourceSet.model, srcSkeleton) : srcRootRot;
1742
1831
  const rootTranslationRotation = Quaternion.multiply(Quaternion.inverse(dstRootRot), srcMotionParentRot);
1743
- const rootTranslationScale = rootMotion === 'scaled' ? typeof options.rootMotionScale === 'number' ? options.rootMotionScale : options.rootMotionScale === 'none' ? 1 : getHumanoidRootMotionScale(srcSkeleton, dstSkeleton) : 1;
1832
+ const resolveTranslationScale = (mode)=>typeof mode === 'number' ? mode : mode === 'none' ? 1 : getHumanoidRootMotionScale(srcSkeleton, dstSkeleton);
1833
+ const rootTranslationScale = rootMotion === 'scaled' ? resolveTranslationScale(options.rootMotionScale) : 1;
1834
+ const hipsTranslationScale = hipsTranslation === 'scaled' ? resolveTranslationScale(options.hipsTranslationScale) : 1;
1744
1835
  const jointRemaps = [];
1745
1836
  const jointRemapsByDstSkeleton = new Map([
1746
1837
  [
@@ -1842,9 +1933,14 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
1842
1933
  if (rootMotion === 'locked') {
1843
1934
  dstRootTrack = createConstantTranslationTrack(dstRootBindPose.position);
1844
1935
  } else if (srcMotionTrack && srcMotionNode) {
1845
- const srcMotionBindPose = getRigBindPoseForNode(srcSkeleton, srcMotionNode);
1846
- const rootRemap = createTranslationRetargetRemap(srcMotionNode, dstRootNode, srcMotionBindPose.position, dstRootBindPose.position, dstSkeleton.joints.indexOf(dstRootNode), rootTranslationScale, rootTranslationRotation, humanoidRotationCorrection ?? undefined, options.lockRootMotionAxes, humanoidRotationCorrection ?? undefined);
1936
+ const srcMotionBindPose = getRigReferencePoseForNode(srcSkeleton, srcMotionNode);
1937
+ const rootMotionAxisLocks = options.lockRootMotionAxes ?? (hasSeparateHips ? {
1938
+ y: true
1939
+ } : undefined);
1940
+ const rootRemap = createTranslationRetargetRemap(srcMotionNode, dstRootNode, srcMotionBindPose.position, dstRootBindPose.position, dstSkeleton.joints.indexOf(dstRootNode), rootTranslationScale, rootTranslationRotation, humanoidRotationCorrection ?? undefined, rootMotionAxisLocks, humanoidRotationCorrection ?? undefined);
1847
1941
  dstRootTrack = retargetTranslationTrack(srcMotionTrack, rootRemap);
1942
+ } else {
1943
+ dstRootTrack = createConstantTranslationTrack(dstRootBindPose.position);
1848
1944
  }
1849
1945
  if (dstRootTrack) {
1850
1946
  dstRootTrack.name = srcMotionTrack?.name ?? 'translation';
@@ -1853,6 +1949,24 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
1853
1949
  dstClip.addTrack(dstRootNode, dstRootTrack);
1854
1950
  }
1855
1951
  }
1952
+ if (hasSeparateHips && hipsTranslation !== 'none') {
1953
+ const srcHipsTrack = findTranslationTrack(sourceClip.tracks.get(srcHipsNode)) ?? (srcSkeleton.hasRetargetPose ? createConstantTranslationTrack(getRigBindPoseForNode(srcSkeleton, srcHipsNode).position) : null);
1954
+ const dstHipsBindPose = getRigBindPoseForNode(dstSkeleton, dstHipsNode);
1955
+ let dstHipsTrack = null;
1956
+ if (hipsTranslation === 'locked') {
1957
+ dstHipsTrack = createConstantTranslationTrack(dstHipsBindPose.position);
1958
+ } else if (srcHipsTrack) {
1959
+ const srcHipsReferencePose = getRigReferencePoseForNode(srcSkeleton, srcHipsNode);
1960
+ const hipsRemap = createTranslationRetargetRemap(srcHipsNode, dstHipsNode, srcHipsReferencePose.position, dstHipsBindPose.position, dstSkeleton.joints.indexOf(dstHipsNode), hipsTranslationScale, undefined, humanoidRotationCorrection ?? undefined, undefined, humanoidRotationCorrection ?? undefined);
1961
+ dstHipsTrack = retargetTranslationTrack(srcHipsTrack, hipsRemap);
1962
+ }
1963
+ if (dstHipsTrack) {
1964
+ dstHipsTrack.name = srcHipsTrack?.name ?? 'translation';
1965
+ dstHipsTrack.target = dstHipsNode.persistentId;
1966
+ dstHipsTrack.jointIndex = dstSkeleton.joints.indexOf(dstHipsNode);
1967
+ dstClip.addTrack(dstHipsNode, dstHipsTrack);
1968
+ }
1969
+ }
1856
1970
  for (const [srcNode, srcRemaps] of jointRemapsBySrcNode){
1857
1971
  const srcTracks = sourceClip.tracks.get(srcNode);
1858
1972
  if (!srcTracks) {
@@ -1865,7 +1979,7 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
1865
1979
  if (srcTrack instanceof NodeRotationTrack || srcTrack instanceof NodeEulerRotationTrack) {
1866
1980
  continue;
1867
1981
  } else if (srcTrack instanceof NodeTranslationTrack) {
1868
- if (srcNode === srcRootNode || srcTrack === srcMotionTrack || jointTranslations !== 'preserve') {
1982
+ if (srcNode === srcRootNode || hasSeparateHips && srcNode === srcHipsNode || srcTrack === srcMotionTrack || jointTranslations !== 'preserve') {
1869
1983
  continue;
1870
1984
  }
1871
1985
  dstTrack = retargetTranslationTrack(srcTrack, remap);
@@ -2062,6 +2176,8 @@ function bakeHumanoidRotationTracks(sourceClip, srcSkeleton, dstSkeleton, srcRoo
2062
2176
  * - Clears active animations, tracks, and skeleton references.
2063
2177
  */ onDispose() {
2064
2178
  super.onDispose();
2179
+ this._gpuDriver?.dispose();
2180
+ this._gpuDriver = null;
2065
2181
  for(const k in this._animations){
2066
2182
  this._animations[k].dispose();
2067
2183
  }