@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
@@ -1 +1 @@
1
- {"version":3,"file":"scene.js","sources":["../../src/scene/scene.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector3, Vector4, Ray, DRef, DWeakRef, makeObservable, Disposable } from '@zephyr3d/base';\r\nimport { SceneNode } from './scene_node';\r\nimport { Octree } from './octree';\r\nimport { RaycastVisitor } from './raycast_visitor';\r\nimport { Environment } from './environment';\r\nimport type { GraphNode } from './graph_node';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { Drawable } from '../render';\r\nimport { SceneRenderer } from '../render';\r\nimport type { Compositor } from '../posteffect';\r\nimport type { Metadata } from 'draco3d';\r\nimport { getDevice } from '../app/api';\r\nimport type { IRenderable } from '../app';\r\nimport {\r\n normalizeScriptAttachmentConfig,\r\n normalizeScriptAttachments,\r\n ScriptAttachment\r\n} from './script_attachment';\r\nimport type { LightingMode } from '../utility/physical';\r\n\r\n/**\r\n * Represents a renderable world that manages scene graph, spatial indexing, and environment.\r\n *\r\n * Core responsibilities:\r\n * - Owns the root {@link SceneNode} and maintains a spatial {@link Octree} for culling/raycasting.\r\n * - Manages environment/lighting via {@link Environment}.\r\n * - Provides per-frame update queues (global and per-camera) for scene nodes.\r\n * - Offers utilities like ray construction and raycasting.\r\n * - Emits observable events: `update`, `startrender`, `endrender`.\r\n *\r\n * Performance notes:\r\n * - Octree placement is lazily synchronized on demand before reads (e.g., `octree`, `boundingBox`)\r\n * and during per-frame updates.\r\n * - Update queues use weak references to avoid retaining disposed nodes.\r\n *\r\n * @public\r\n */\r\nexport class Scene\r\n extends makeObservable(Disposable)<{\r\n /** Dispatched once per frame before render-related work. */\r\n update: [Scene];\r\n /** Dispatched immediately before rendering begins for a camera. */\r\n startrender: [Scene, Camera, Compositor];\r\n /** Dispatched immediately after rendering finishes for a camera. */\r\n endrender: [Scene, Camera, Compositor];\r\n }>()\r\n implements IRenderable\r\n{\r\n /** @internal */\r\n private static _nextId = 0;\r\n /** @internal Scene name. */\r\n protected _name: string;\r\n /** @internal Root node reference. */\r\n protected _rootNode: DRef<SceneNode>;\r\n /** @internal Spatial index for placement/culling. */\r\n protected _octree: Octree;\r\n /**\r\n * @internal Pending nodes whose placement in the octree must be updated.\r\n * Populated by {@link Scene.invalidateNodePlacement} and drained by {@link Scene.updateNodePlacement}.\r\n */\r\n protected _nodePlaceList: Set<GraphNode>;\r\n /** @internal Environment data (sky/light/IBL). */\r\n protected _env: Environment;\r\n /** @internal Frame counter that last updated this scene. */\r\n protected _updateFrame: number;\r\n /** @internal Unique scene ID. */\r\n protected _id: number;\r\n /** @internal One-shot per-frame update queue (runs before render). */\r\n protected _nodeUpdateQueue: DWeakRef<SceneNode>[];\r\n /** @internal */\r\n protected _drawableUpdateQueue: Drawable[];\r\n /** @internal One-shot per-frame-per-camera update queue. */\r\n protected _perCameraUpdateQueue: DWeakRef<SceneNode>[];\r\n /** @internal Main camera reference. */\r\n protected _mainCamera: DRef<Camera>;\r\n /** @internal Arbitrary metadata loaded with the scene (optional). */\r\n protected _metaData: Nullable<Metadata>;\r\n /** @internal Lighting unit model used by this scene. */\r\n protected _lightingMode: LightingMode;\r\n /** @internal Number of physical meters represented by one scene unit. */\r\n protected _metersPerUnit: number;\r\n /** @internal User-attached script entries (engine-defined). */\r\n private _scripts: ScriptAttachment[];\r\n /**\r\n * Creates an instance of Scene.\r\n *\r\n * Initializes:\r\n * - Unique ID\r\n * - Empty environment\r\n * - Octree with default depth/leaf capacities\r\n * - Root scene node named \"Root\"\r\n *\r\n * @param name - Optional scene name for diagnostics/UI.\r\n */\r\n constructor(name?: string) {\r\n super();\r\n this._id = ++Scene._nextId;\r\n this._name = name ?? '';\r\n this._octree = new Octree(this, 8, 8);\r\n this._nodePlaceList = new Set();\r\n this._nodeUpdateQueue = [];\r\n this._drawableUpdateQueue = [];\r\n this._perCameraUpdateQueue = [];\r\n this._env = new Environment();\r\n this._updateFrame = -1;\r\n this._rootNode = new DRef();\r\n this._rootNode.set(new SceneNode(this));\r\n this._rootNode.get()!.name = 'Root';\r\n this._metaData = null;\r\n this._lightingMode = 'legacy';\r\n this._metersPerUnit = 1;\r\n this._scripts = [];\r\n this._mainCamera = new DRef();\r\n }\r\n /**\r\n * Gets the unique identifier of the scene.\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Name of the scene\r\n */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val: string) {\r\n this._name = val ?? '';\r\n }\r\n /**\r\n * Main camera used to render the scene by default.\r\n */\r\n get mainCamera() {\r\n return this._mainCamera.get();\r\n }\r\n set mainCamera(camera) {\r\n this._mainCamera.set(camera);\r\n }\r\n /**\r\n * Gets the root scene node of the scene\r\n */\r\n get rootNode() {\r\n return this._rootNode.get()!;\r\n }\r\n /**\r\n * Gets the octree used for spatial organization and queries.\r\n *\r\n * Ensures pending node placements are synchronized before returning.\r\n */\r\n get octree() {\r\n // Make sure the octree state is up to date\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n return this._octree;\r\n }\r\n /**\r\n * Gets the world-axis-aligned bounding box of the scene.\r\n *\r\n * Ensures pending node placements are synchronized before computing.\r\n */\r\n get boundingBox() {\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n // this._syncBVChangedList();\r\n return this._octree.getRootNode().getBoxLoosed();\r\n }\r\n /**\r\n * The environment (sky, lights, IBL) of the scene.\r\n */\r\n get env() {\r\n return this._env;\r\n }\r\n /** Lighting unit model. Legacy remains the default for backward compatibility. */\r\n get lightingMode() {\r\n return this._lightingMode;\r\n }\r\n set lightingMode(val: LightingMode) {\r\n const mode: LightingMode = val === 'physical' ? 'physical' : 'legacy';\r\n if (mode !== this._lightingMode) {\r\n this._lightingMode = mode;\r\n this.invalidateLightUniforms();\r\n }\r\n }\r\n /** Number of physical meters represented by one scene-space unit. */\r\n get metersPerUnit() {\r\n return this._metersPerUnit;\r\n }\r\n set metersPerUnit(val: number) {\r\n const scale = Number.isFinite(val) ? Math.max(val, 0.000001) : 1;\r\n if (scale !== this._metersPerUnit) {\r\n this._metersPerUnit = scale;\r\n this.invalidateLightUniforms();\r\n }\r\n }\r\n /** @internal */\r\n private invalidateLightUniforms() {\r\n this._rootNode.get()?.iterate((node) => {\r\n if (node.isLight()) {\r\n node.invalidateUniforms();\r\n }\r\n });\r\n }\r\n /**\r\n * Arbitrary metadata associated with the scene (e.g., imported asset info).\r\n */\r\n get metaData() {\r\n return this._metaData;\r\n }\r\n set metaData(val) {\r\n this._metaData = val;\r\n }\r\n /**\r\n * Attached script filename or identifier (engine-specific).\r\n *\r\n * @remarks\r\n * Integrates with the engine’s scripting system if available.\r\n */\r\n get script() {\r\n return this._scripts[0]?.script ?? '';\r\n }\r\n set script(fileName: string) {\r\n const script = fileName ?? '';\r\n if (!script) {\r\n this._scripts.splice(0, 1);\r\n } else if (this._scripts[0]) {\r\n this._scripts[0].script = script;\r\n } else {\r\n this._scripts.unshift(new ScriptAttachment(script));\r\n }\r\n }\r\n /**\r\n * Script component configuration payload used by editor/runtime script components.\r\n */\r\n get scriptConfig() {\r\n return this._scripts[0]?.config ?? null;\r\n }\r\n set scriptConfig(value: Nullable<object | unknown[]>) {\r\n const normalized = normalizeScriptAttachmentConfig(value);\r\n if (this._scripts[0]) {\r\n this._scripts[0].config = normalized;\r\n } else if (normalized != null) {\r\n this._scripts.unshift(new ScriptAttachment('', normalized));\r\n }\r\n if (this._scripts[0] && !this._scripts[0].script && this._scripts[0].config == null) {\r\n this._scripts.splice(0, 1);\r\n }\r\n }\r\n /**\r\n * All script attachments on this scene.\r\n */\r\n get scripts() {\r\n return this._scripts;\r\n }\r\n set scripts(value: ScriptAttachment[]) {\r\n this._scripts = normalizeScriptAttachments(value);\r\n }\r\n /**\r\n * Script configs for all script attachments.\r\n */\r\n get scriptConfigs() {\r\n return this._scripts.map((item) => item.config);\r\n }\r\n set scriptConfigs(value: unknown[]) {\r\n const next = Array.isArray(value) ? value : [];\r\n for (let i = 0; i < Math.max(this._scripts.length, next.length); i++) {\r\n const config = normalizeScriptAttachmentConfig(next[i]);\r\n if (this._scripts[i]) {\r\n this._scripts[i].config = config;\r\n } else if (config != null) {\r\n this._scripts.push(new ScriptAttachment('', config));\r\n }\r\n }\r\n this._scripts = this._scripts.filter((item) => item.script || item.config != null);\r\n }\r\n /**\r\n * Finds a scene node by its persistent ID.\r\n *\r\n * @typeParam T - Expected node type.\r\n * @param id - Persistent identifier to match against `SceneNode.persistentId`.\r\n * @returns The first matching node, or `null` if not found.\r\n */\r\n findNodeById<T extends SceneNode>(id: string) {\r\n return this._rootNode.get()!.findNodeById<T>(id);\r\n }\r\n /**\r\n * Finds a scene node by name.\r\n *\r\n * If multiple nodes share the same name, returns the first match encountered\r\n * during traversal.\r\n *\r\n * @typeParam T - Expected node type.\r\n * @param name - Node name to match.\r\n * @returns The first matching node, or `null` if not found.\r\n *\r\n * @remarks\r\n * Names are not guaranteed unique. Prefer IDs for stable references.\r\n */\r\n findNodeByName<T extends SceneNode>(name: string) {\r\n return this._rootNode.get()!.findNodeByName<T>(name);\r\n }\r\n /**\r\n * Casts a ray into the scene and returns the closest intersection, if any.\r\n *\r\n * @param ray - The ray in world space.\r\n * @param length - Maximum ray length. Defaults to `Infinity`.\r\n * @returns Intersection info `{ target, dist, point }`, or `null` if no hit.\r\n *\r\n */\r\n raycast(ray: Ray, length = Infinity) {\r\n const raycastVisitor = new RaycastVisitor(ray, length);\r\n this.octree.getRootNode().traverse(raycastVisitor);\r\n return raycastVisitor.intersected\r\n ? {\r\n target: raycastVisitor.intersected,\r\n dist: raycastVisitor.intersectedDist,\r\n point: raycastVisitor.intersectedPoint\r\n }\r\n : null;\r\n }\r\n /**\r\n * Constructs a world-space ray from a camera and a screen position.\r\n *\r\n * @param camera - Camera whose projection/view defines the ray.\r\n * @param viewportWidth - Current viewport width in pixels.\r\n * @param viewportHeight - Current viewport height in pixels.\r\n * @param screenX - Screen-space x (pixels).\r\n * @param screenY - Screen-space y (pixels).\r\n * @param invModelMatrix - Optional inverse model matrix to transform the ray into local space.\r\n * @returns The constructed Ray.\r\n *\r\n * @remarks\r\n * Computes NDC from screen coordinates, unprojects using `invViewProjectionMatrix`,\r\n * then forms a ray from the camera world position to the unprojected point.\r\n * If `invModelMatrix` is provided, both origin and direction are transformed.\r\n */\r\n constructRay(\r\n camera: Camera,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n screenX: number,\r\n screenY: number,\r\n invModelMatrix?: Matrix4x4\r\n ) {\r\n const vClip = new Vector4((2 * screenX) / viewportWidth - 1, 1 - (2 * screenY) / viewportHeight, 1, 1);\r\n const vWorld = camera.invViewProjectionMatrix.transform(vClip);\r\n vWorld.scaleBy(1 / vWorld.w);\r\n let vEye = camera.getWorldPosition();\r\n let vDir = Vector3.sub(vWorld.xyz(), vEye).inplaceNormalize();\r\n if (invModelMatrix) {\r\n vEye = invModelMatrix.transformPointAffine(vEye);\r\n vDir = invModelMatrix.transformVectorAffine(vDir);\r\n }\r\n return new Ray(vEye, vDir);\r\n }\r\n /**\r\n * Queues a node for a one-shot update before the next render.\r\n *\r\n * The node's `update(frame, elapsedSeconds, deltaSeconds)` will be called\r\n * during Scene.frameUpdate and then the node is removed from the queue.\r\n *\r\n * @param node - Node to schedule.\r\n *\r\n * @remarks\r\n * - To update continuously each frame, call `queueUpdateNode(this)` from within the node's `update` method.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queueUpdateNode(node: SceneNode) {\r\n if (node && this._nodeUpdateQueue.findIndex((val) => val.get() === node) < 0) {\r\n this._nodeUpdateQueue.push(new DWeakRef(node));\r\n }\r\n }\r\n /**\r\n * Queues a drawable for a one-shot state update before the next render.\r\n *\r\n * The drawable's `updateState()` will be called during Scene.frameUpdate and then the drawable is removed from the queue.\r\n * @param drawable - Drawable to schedule.\r\n *\r\n * @remarks\r\n * - To update continuously each frame, call `queueUpdateDrawable(this)` from within the drawable's `updateState` method.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queueUpdateDrawable(drawable: Drawable) {\r\n if (drawable && this._drawableUpdateQueue.indexOf(drawable) < 0) {\r\n this._drawableUpdateQueue.push(drawable);\r\n }\r\n }\r\n /**\r\n * Queues a node for a one-shot per-camera update before render.\r\n *\r\n * The node's `updatePerCamera(camera, elapsedSeconds, deltaSeconds)` will be\r\n * called once for each camera during {@link Scene.frameUpdatePerCamera}, then removed.\r\n *\r\n * @param node - Node to schedule.\r\n *\r\n * @remarks\r\n * - To run per-camera work continuously, re-queue from `updatePerCamera`.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queuePerCameraUpdateNode(node: SceneNode) {\r\n if (node && this._perCameraUpdateQueue.findIndex((val) => val.get() === node) < 0) {\r\n this._perCameraUpdateQueue.push(new DWeakRef(node));\r\n }\r\n }\r\n /**\r\n * Renders this scene using the `mainCamera`, if present.\r\n *\r\n * Equivalent to `mainCamera.render(this)` when `mainCamera` is set.\r\n */\r\n render() {\r\n if (this.mainCamera) {\r\n this.mainCamera.render(this);\r\n }\r\n }\r\n /**\r\n * Marks a graph node as needing placement update in the octree.\r\n *\r\n * Called by nodes when their transform/visibility/attachment changes in a way\r\n * that affects spatial placement.\r\n *\r\n * @internal\r\n */\r\n invalidateNodePlacement(node: GraphNode) {\r\n this._nodePlaceList.add(node);\r\n }\r\n /**\r\n * Synchronizes environment light maps (IBL, SH/FB) with the sky as needed.\r\n *\r\n * Uses device capabilities to decide between Spherical Harmonics floating-point blending (SHFB)\r\n * and classic SH textures, and lazily fills missing environment fields from the sky.\r\n *\r\n * @internal\r\n */\r\n private updateEnvLight() {\r\n if (this.env.light.type === 'ibl') {\r\n this.env.light.radianceMap = this.env.sky.radianceMap;\r\n this.env.light.sheenRadianceMap = this.env.sky.sheenRadianceMap;\r\n this.env.light.irradianceWindow = this.env.sky.shWindowWeights;\r\n this.env.light.irradianceSHFB = this.env.sky.irradianceSHFB;\r\n this.env.light.irradianceSH = null;\r\n }\r\n }\r\n /**\r\n * Returns the renderer class used to render the scene.\r\n *\r\n * Override in subclasses to supply a custom renderer.\r\n *\r\n * @internal\r\n */\r\n getRenderer() {\r\n return SceneRenderer;\r\n }\r\n /**\r\n * Performs per-frame scene updates, once per device frame.\r\n *\r\n * Steps:\r\n * - Ensure this runs only once per frame (via `frameInfo.frameCounter`).\r\n * - Update environment light synchronization.\r\n * - Dispatch `update` event.\r\n * - Drain the one-shot node update queue and call `node.update(...)`.\r\n * - Apply pending octree placement updates.\r\n *\r\n */\r\n frameUpdate() {\r\n const frameInfo = getDevice().frameInfo;\r\n if (frameInfo.frameCounter !== this._updateFrame) {\r\n this._updateFrame = frameInfo.frameCounter;\r\n this.updateEnvLight();\r\n this.dispatchEvent('update', this);\r\n this.mainCamera?.updateController();\r\n if (this._nodeUpdateQueue.length > 0) {\r\n const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;\r\n const deltaInSeconds = frameInfo.elapsedFrame * 0.001;\r\n const queue = this._nodeUpdateQueue;\r\n this._nodeUpdateQueue = [];\r\n while (queue.length > 0) {\r\n const ref = queue.shift()!;\r\n const node = ref.get();\r\n if (node?.attached) {\r\n node.update(frameInfo.frameCounter, elapsedInSeconds, deltaInSeconds);\r\n }\r\n ref.dispose();\r\n }\r\n }\r\n if (this._drawableUpdateQueue.length > 0) {\r\n for (const drawable of this._drawableUpdateQueue) {\r\n drawable.updateState();\r\n }\r\n this._drawableUpdateQueue = [];\r\n }\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n }\r\n }\r\n /**\r\n * Performs per-camera scene updates for the current frame.\r\n *\r\n * Steps:\r\n * - Drain the per-camera update queue and call `node.updatePerCamera(camera, ...)`.\r\n * - Apply pending octree placement updates.\r\n *\r\n * @param camera - The camera being updated for.\r\n */\r\n frameUpdatePerCamera(camera: Camera) {\r\n if (this._perCameraUpdateQueue.length > 0) {\r\n const frameInfo = getDevice().frameInfo;\r\n const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;\r\n const deltaInSeconds = frameInfo.elapsedFrame * 0.001;\r\n const queue = this._perCameraUpdateQueue;\r\n this._perCameraUpdateQueue = [];\r\n while (queue.length > 0) {\r\n const ref = queue.shift()!;\r\n ref.get()?.updatePerCamera(camera, elapsedInSeconds, deltaInSeconds);\r\n ref.dispose();\r\n }\r\n }\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n }\r\n /**\r\n * Applies placement changes for nodes in `list` to the given `octree`.\r\n *\r\n * Rules:\r\n * - If node is not disposed, attached, not hidden, and `placeToOctree` is true,\r\n * it is placed; otherwise removed.\r\n * - Drains `list` until empty.\r\n *\r\n * @param octree - Target spatial index.\r\n * @param list - Set of nodes awaiting placement evaluation.\r\n */\r\n updateNodePlacement(octree: Octree, list: Set<GraphNode>) {\r\n function placeNode(node: GraphNode) {\r\n if (!node.disposed && node.attached && !node.hidden && node.placeToOctree) {\r\n octree.placeNode(node);\r\n } else {\r\n octree.removeNode(node);\r\n }\r\n list.delete(node);\r\n }\r\n if (list.size > 0) {\r\n while (list.size > 0) {\r\n const node = list.keys().next().value!;\r\n if (octree) {\r\n placeNode(node);\r\n } else {\r\n list.delete(node);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Disposes the scene and its owned resources.\r\n *\r\n * Disposes:\r\n * - Environment\r\n * - Root node (and, by extension, its hierarchy)\r\n * - Main camera reference wrapper\r\n *\r\n */\r\n protected onDispose() {\r\n this._env.dispose();\r\n this._rootNode.dispose();\r\n this._mainCamera.dispose();\r\n }\r\n}\r\n"],"names":["Scene","makeObservable","Disposable","_nextId","name","_id","_name","_octree","Octree","_nodePlaceList","Set","_nodeUpdateQueue","_drawableUpdateQueue","_perCameraUpdateQueue","_env","Environment","_updateFrame","_rootNode","DRef","set","SceneNode","get","_metaData","_lightingMode","_metersPerUnit","_scripts","_mainCamera","id","val","mainCamera","camera","rootNode","octree","updateNodePlacement","boundingBox","getRootNode","getBoxLoosed","env","lightingMode","mode","invalidateLightUniforms","metersPerUnit","scale","Number","isFinite","Math","max","iterate","node","isLight","invalidateUniforms","metaData","script","fileName","splice","unshift","ScriptAttachment","scriptConfig","config","value","normalized","normalizeScriptAttachmentConfig","scripts","normalizeScriptAttachments","scriptConfigs","map","item","next","Array","isArray","i","length","push","filter","findNodeById","findNodeByName","raycast","ray","Infinity","raycastVisitor","RaycastVisitor","traverse","intersected","target","dist","intersectedDist","point","intersectedPoint","constructRay","viewportWidth","viewportHeight","screenX","screenY","invModelMatrix","vClip","Vector4","vWorld","invViewProjectionMatrix","transform","scaleBy","w","vEye","getWorldPosition","vDir","Vector3","sub","xyz","inplaceNormalize","transformPointAffine","transformVectorAffine","Ray","queueUpdateNode","findIndex","DWeakRef","queueUpdateDrawable","drawable","indexOf","queuePerCameraUpdateNode","render","invalidateNodePlacement","add","light","type","radianceMap","sky","sheenRadianceMap","irradianceWindow","shWindowWeights","irradianceSHFB","irradianceSH","getRenderer","SceneRenderer","frameUpdate","frameInfo","getDevice","frameCounter","updateEnvLight","dispatchEvent","updateController","elapsedInSeconds","elapsedOverall","deltaInSeconds","elapsedFrame","queue","ref","shift","attached","update","dispose","updateState","frameUpdatePerCamera","updatePerCamera","list","placeNode","disposed","hidden","placeToOctree","removeNode","delete","size","keys"],"mappings":"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"}
1
+ {"version":3,"file":"scene.js","sources":["../../src/scene/scene.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector3, Vector4, Ray, DRef, makeObservable, Disposable } from '@zephyr3d/base';\r\nimport { SceneNode } from './scene_node';\r\nimport { Octree } from './octree';\r\nimport { RaycastVisitor } from './raycast_visitor';\r\nimport { Environment } from './environment';\r\nimport type { GraphNode } from './graph_node';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { Drawable } from '../render';\r\nimport { SceneRenderer } from '../render';\r\nimport type { Compositor } from '../posteffect';\r\nimport type { Metadata } from 'draco3d';\r\nimport { getDevice, tryGetApp } from '../app/api';\r\nimport { SkinPaletteAtlas } from '../animation/skin_palette_atlas';\r\nimport { UpdateQueue } from './update_queue';\r\nimport { AnimationBankTrack } from '../animation/animation_bank';\r\nimport type { IRenderable } from '../app';\r\nimport {\r\n normalizeScriptAttachmentConfig,\r\n normalizeScriptAttachments,\r\n ScriptAttachment\r\n} from './script_attachment';\r\nimport type { LightingMode } from '../utility/physical';\r\nimport type { ScenePhysicsSettings } from './physics_settings';\r\nimport type { PhysicsWorld } from '../physics/world';\r\nimport { getPhysicsWorldFactory } from '../physics/world';\r\nimport type { VirtualTextureClient } from '../render/virtualtexture/virtual_texture_client';\r\nimport { SceneSDF } from '../render/sdf/scene_sdf';\r\nimport { SceneGI } from '../render/gi/scene_gi';\r\nimport { RenderGraphExecutor } from '../render/rendergraph/executor';\r\n\r\n/**\r\n * Represents a renderable world that manages scene graph, spatial indexing, and environment.\r\n *\r\n * Core responsibilities:\r\n * - Owns the root {@link SceneNode} and maintains a spatial {@link Octree} for culling/raycasting.\r\n * - Manages environment/lighting via {@link Environment}.\r\n * - Provides per-frame update queues (global and per-camera) for scene nodes.\r\n * - Offers utilities like ray construction and raycasting.\r\n * - Emits observable events: `update`, `startrender`, `endrender`.\r\n *\r\n * Performance notes:\r\n * - Octree placement is lazily synchronized on demand before reads (e.g., `octree`, `boundingBox`)\r\n * and during per-frame updates.\r\n * - Update queues use weak references to avoid retaining disposed nodes.\r\n *\r\n * @public\r\n */\r\nexport class Scene\r\n extends makeObservable(Disposable)<{\r\n /** Dispatched once per frame before render-related work. */\r\n update: [Scene];\r\n /**\r\n * Dispatched once per frame after queued nodes have updated - animation, IK,\r\n * joint dynamics and skinning included - and before nodes are placed in the\r\n * octree. Node transforms set here are rendered this frame; a physics world\r\n * steps here so that kinematic bodies follow this frame's animated pose.\r\n */\r\n afterupdate: [Scene];\r\n /**\r\n * Dispatched once per frame after `afterupdate` - so after a physics world\r\n * has stepped and written back - and after scripts' `onLateUpdate` and a\r\n * `'late'` camera controller have run. The main camera's pose is final here:\r\n * the place for anything that tracks the camera, such as an audio listener.\r\n */\r\n lateupdate: [Scene];\r\n /** Dispatched immediately before rendering begins for a camera. */\r\n startrender: [Scene, Camera, Compositor];\r\n /** Dispatched immediately after rendering finishes for a camera. */\r\n endrender: [Scene, Camera, Compositor];\r\n }>()\r\n implements IRenderable\r\n{\r\n /** @internal */\r\n private static _nextId = 0;\r\n /** @internal Scene name. */\r\n protected _name: string;\r\n /** @internal Root node reference. */\r\n protected _rootNode: DRef<SceneNode>;\r\n /** @internal Spatial index for placement/culling. */\r\n protected _octree: Octree;\r\n /**\r\n * @internal Pending nodes whose placement in the octree must be updated.\r\n * Populated by {@link Scene.invalidateNodePlacement} and drained by {@link Scene.updateNodePlacement}.\r\n */\r\n protected _nodePlaceList: Set<GraphNode>;\r\n /** @internal Environment data (sky/light/IBL). */\r\n protected _env: Environment;\r\n /** @internal */\r\n protected _sdf: Nullable<SceneSDF>;\r\n /** @internal */\r\n protected _gi: Nullable<SceneGI>;\r\n /** @internal Frame counter that last updated this scene. */\r\n protected _updateFrame: number;\r\n /** @internal Unique scene ID. */\r\n protected _id: number;\r\n /**\r\n * @internal One-shot per-frame update queue (runs before render). Thousands of nodes may\r\n * re-queue themselves every frame, so duplicates are told by a stamp on the node\r\n */\r\n protected _nodeUpdateQueue: UpdateQueue<SceneNode>;\r\n /** @internal */\r\n protected _drawableUpdateQueue: UpdateQueue<Drawable>;\r\n /** @internal One-shot per-frame-per-camera update queue. */\r\n protected _perCameraUpdateQueue: UpdateQueue<SceneNode>;\r\n /** @internal Main camera reference. */\r\n protected _mainCamera: DRef<Camera>;\r\n /** @internal Arbitrary metadata loaded with the scene (optional). */\r\n protected _metaData: Nullable<Metadata>;\r\n /** @internal Physics settings saved with the scene (optional). */\r\n protected _physicsSettings: Nullable<ScenePhysicsSettings>;\r\n protected _physicsWorld: Nullable<PhysicsWorld>;\r\n /** @internal Lighting unit model used by this scene. */\r\n protected _lightingMode: LightingMode;\r\n /** @internal Number of physical meters represented by one scene unit. */\r\n protected _metersPerUnit: number;\r\n /** @internal User-attached script entries (engine-defined). */\r\n private _scripts: ScriptAttachment[];\r\n /** @internal Virtual texture users updated by every camera rendering this scene. */\r\n private _virtualTextureClients: VirtualTextureClient[];\r\n /**\r\n * Creates an instance of Scene.\r\n *\r\n * Initializes:\r\n * - Unique ID\r\n * - Empty environment\r\n * - Octree with default depth/leaf capacities\r\n * - Root scene node named \"Root\"\r\n *\r\n * @param name - Optional scene name for diagnostics/UI.\r\n */\r\n constructor(name?: string) {\r\n super();\r\n this._id = ++Scene._nextId;\r\n this._name = name ?? '';\r\n this._octree = new Octree(this, 8, 8);\r\n this._nodePlaceList = new Set();\r\n this._nodeUpdateQueue = new UpdateQueue(\r\n (node) => node._updateQueueStamp,\r\n (node, stamp) => (node._updateQueueStamp = stamp)\r\n );\r\n // Drawables made without mixinDrawable get the field on first use\r\n this._drawableUpdateQueue = new UpdateQueue(\r\n (drawable) => (drawable as { _drawableQueueStamp?: number })._drawableQueueStamp,\r\n (drawable, stamp) => ((drawable as { _drawableQueueStamp?: number })._drawableQueueStamp = stamp)\r\n );\r\n this._perCameraUpdateQueue = new UpdateQueue(\r\n (node) => node._perCameraQueueStamp,\r\n (node, stamp) => (node._perCameraQueueStamp = stamp)\r\n );\r\n this._env = new Environment();\r\n this._sdf = null;\r\n this._gi = null;\r\n this._updateFrame = -1;\r\n this._rootNode = new DRef();\r\n this._rootNode.set(new SceneNode(this));\r\n this._rootNode.get()!.name = 'Root';\r\n this._metaData = null;\r\n this._physicsSettings = null;\r\n this._physicsWorld = null;\r\n this._lightingMode = 'legacy';\r\n this._metersPerUnit = 1;\r\n this._scripts = [];\r\n this._virtualTextureClients = [];\r\n this._mainCamera = new DRef();\r\n }\r\n /** Virtual texture users updated by every camera rendering this scene. */\r\n get virtualTextureClients(): readonly VirtualTextureClient[] {\r\n return this._virtualTextureClients;\r\n }\r\n /**\r\n * Registers a virtual texture user. Every camera rendering the scene then updates and fills\r\n * its pages between the depth prepass and the light pass. WebGPU only.\r\n */\r\n addVirtualTextureClient(client: VirtualTextureClient) {\r\n if (!this._virtualTextureClients.includes(client)) {\r\n this._virtualTextureClients.push(client);\r\n }\r\n }\r\n /** Unregisters a virtual texture user. The client keeps ownership of its texture. */\r\n removeVirtualTextureClient(client: VirtualTextureClient) {\r\n const index = this._virtualTextureClients.indexOf(client);\r\n if (index >= 0) {\r\n this._virtualTextureClients.splice(index, 1);\r\n }\r\n }\r\n /**\r\n * Gets the unique identifier of the scene.\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Name of the scene\r\n */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val: string) {\r\n this._name = val ?? '';\r\n }\r\n /**\r\n * Main camera used to render the scene by default.\r\n */\r\n get mainCamera() {\r\n return this._mainCamera.get();\r\n }\r\n set mainCamera(camera) {\r\n this._mainCamera.set(camera);\r\n }\r\n /**\r\n * Gets the root scene node of the scene\r\n */\r\n get rootNode() {\r\n return this._rootNode.get()!;\r\n }\r\n /**\r\n * Gets the octree used for spatial organization and queries.\r\n *\r\n * Ensures pending node placements are synchronized before returning.\r\n */\r\n get octree() {\r\n // Make sure the octree state is up to date\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n return this._octree;\r\n }\r\n /**\r\n * Gets the world-axis-aligned bounding box of the scene.\r\n *\r\n * Ensures pending node placements are synchronized before computing.\r\n */\r\n get boundingBox() {\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n // this._syncBVChangedList();\r\n return this._octree.getRootNode().getBoxLoosed();\r\n }\r\n /**\r\n * The environment (sky, lights, IBL) of the scene.\r\n */\r\n get env() {\r\n return this._env;\r\n }\r\n /** Signed distance field data of the scene, off until enabled. */\r\n get sdf() {\r\n if (!this._sdf) {\r\n this._sdf = new SceneSDF(this);\r\n }\r\n return this._sdf;\r\n }\r\n /** Global illumination of the scene, off until enabled. */\r\n get gi() {\r\n if (!this._gi) {\r\n this._gi = new SceneGI(this);\r\n }\r\n return this._gi;\r\n }\r\n /** Lighting unit model. Legacy remains the default for backward compatibility. */\r\n get lightingMode() {\r\n return this._lightingMode;\r\n }\r\n set lightingMode(val: LightingMode) {\r\n const mode: LightingMode = val === 'physical' ? 'physical' : 'legacy';\r\n if (mode !== this._lightingMode) {\r\n this._lightingMode = mode;\r\n this.invalidateLightUniforms();\r\n }\r\n }\r\n /** Number of physical meters represented by one scene-space unit. */\r\n get metersPerUnit() {\r\n return this._metersPerUnit;\r\n }\r\n set metersPerUnit(val: number) {\r\n const scale = Number.isFinite(val) ? Math.max(val, 0.000001) : 1;\r\n if (scale !== this._metersPerUnit) {\r\n this._metersPerUnit = scale;\r\n this.invalidateLightUniforms();\r\n }\r\n }\r\n /** @internal */\r\n private invalidateLightUniforms() {\r\n this._rootNode.get()?.iterate((node) => {\r\n if (node.isLight()) {\r\n node.invalidateUniforms();\r\n }\r\n });\r\n }\r\n /**\r\n * Arbitrary metadata associated with the scene (e.g., imported asset info).\r\n */\r\n get metaData() {\r\n return this._metaData;\r\n }\r\n set metaData(val) {\r\n this._metaData = val;\r\n }\r\n /**\r\n * Physics settings of the scene, or null to use the physics package's\r\n * defaults. Only scenes simulated with a physics package need them.\r\n */\r\n get physicsSettings() {\r\n return this._physicsSettings;\r\n }\r\n set physicsSettings(val: Nullable<ScenePhysicsSettings>) {\r\n this._physicsSettings = val ?? null;\r\n }\r\n /**\r\n * The physics simulation of this scene, or null when no physics\r\n * implementation is loaded.\r\n *\r\n * @remarks\r\n * Created the first time it is needed - when a node with physics data\r\n * ({@link SceneNode.physics}) enters the scene, or when this is read - by the\r\n * implementation loaded with `initPhysics`. See {@link Scene.setPhysicsWorld}\r\n * to give the scene one directly.\r\n */\r\n get physicsWorld(): Nullable<PhysicsWorld> {\r\n if (!this._physicsWorld && !this.disposed) {\r\n const factory = getPhysicsWorldFactory();\r\n if (factory) {\r\n this._physicsWorld = factory(this);\r\n }\r\n }\r\n return this._physicsWorld;\r\n }\r\n /**\r\n * Gives the scene a physics world, replacing and disposing the current one;\r\n * null removes it until it is next needed.\r\n *\r\n * @remarks\r\n * The physics data of the scene's nodes moves to the new world.\r\n */\r\n setPhysicsWorld(world: Nullable<PhysicsWorld>) {\r\n const current = this._physicsWorld;\r\n if (current === (world ?? null)) {\r\n return;\r\n }\r\n if (world && world.scene !== this) {\r\n throw new Error('The physics world belongs to another scene.');\r\n }\r\n this.rootNode.iterate((node) => {\r\n node.physics?._hostDetached();\r\n });\r\n this._physicsWorld = world ?? null;\r\n current?.dispose();\r\n if (world) {\r\n this.rootNode.iterate((node) => {\r\n node.physics?._hostAttached();\r\n });\r\n }\r\n }\r\n /**\r\n * Attached script filename or identifier (engine-specific).\r\n *\r\n * @remarks\r\n * Integrates with the engine’s scripting system if available.\r\n */\r\n get script() {\r\n return this._scripts[0]?.script ?? '';\r\n }\r\n set script(fileName: string) {\r\n const script = fileName ?? '';\r\n if (!script) {\r\n this._scripts.splice(0, 1);\r\n } else if (this._scripts[0]) {\r\n this._scripts[0].script = script;\r\n } else {\r\n this._scripts.unshift(new ScriptAttachment(script));\r\n }\r\n }\r\n /**\r\n * Script component configuration payload used by editor/runtime script components.\r\n */\r\n get scriptConfig() {\r\n return this._scripts[0]?.config ?? null;\r\n }\r\n set scriptConfig(value: Nullable<object | unknown[]>) {\r\n const normalized = normalizeScriptAttachmentConfig(value);\r\n if (this._scripts[0]) {\r\n this._scripts[0].config = normalized;\r\n } else if (normalized != null) {\r\n this._scripts.unshift(new ScriptAttachment('', normalized));\r\n }\r\n if (this._scripts[0] && !this._scripts[0].script && this._scripts[0].config == null) {\r\n this._scripts.splice(0, 1);\r\n }\r\n }\r\n /**\r\n * All script attachments on this scene.\r\n */\r\n get scripts() {\r\n return this._scripts;\r\n }\r\n set scripts(value: ScriptAttachment[]) {\r\n this._scripts = normalizeScriptAttachments(value);\r\n }\r\n /**\r\n * Script configs for all script attachments.\r\n */\r\n get scriptConfigs() {\r\n return this._scripts.map((item) => item.config);\r\n }\r\n set scriptConfigs(value: unknown[]) {\r\n const next = Array.isArray(value) ? value : [];\r\n for (let i = 0; i < Math.max(this._scripts.length, next.length); i++) {\r\n const config = normalizeScriptAttachmentConfig(next[i]);\r\n if (this._scripts[i]) {\r\n this._scripts[i].config = config;\r\n } else if (config != null) {\r\n this._scripts.push(new ScriptAttachment('', config));\r\n }\r\n }\r\n this._scripts = this._scripts.filter((item) => item.script || item.config != null);\r\n }\r\n /**\r\n * Finds a scene node by its persistent ID.\r\n *\r\n * @typeParam T - Expected node type.\r\n * @param id - Persistent identifier to match against `SceneNode.persistentId`.\r\n * @returns The first matching node, or `null` if not found.\r\n */\r\n findNodeById<T extends SceneNode>(id: string) {\r\n return this._rootNode.get()!.findNodeById<T>(id);\r\n }\r\n /**\r\n * Finds a scene node by name.\r\n *\r\n * If multiple nodes share the same name, returns the first match encountered\r\n * during traversal.\r\n *\r\n * @typeParam T - Expected node type.\r\n * @param name - Node name to match.\r\n * @returns The first matching node, or `null` if not found.\r\n *\r\n * @remarks\r\n * Names are not guaranteed unique. Prefer IDs for stable references.\r\n */\r\n findNodeByName<T extends SceneNode>(name: string) {\r\n return this._rootNode.get()!.findNodeByName<T>(name);\r\n }\r\n /**\r\n * Casts a ray into the scene and returns the closest intersection, if any.\r\n *\r\n * @param ray - The ray in world space.\r\n * @param length - Maximum ray length. Defaults to `Infinity`.\r\n * @returns Intersection info `{ target, dist, point }`, or `null` if no hit.\r\n *\r\n */\r\n raycast(ray: Ray, length = Infinity) {\r\n const raycastVisitor = new RaycastVisitor(ray, length);\r\n this.octree.getRootNode().traverse(raycastVisitor);\r\n return raycastVisitor.intersected\r\n ? {\r\n target: raycastVisitor.intersected,\r\n dist: raycastVisitor.intersectedDist,\r\n point: raycastVisitor.intersectedPoint\r\n }\r\n : null;\r\n }\r\n /**\r\n * Constructs a world-space ray from a camera and a screen position.\r\n *\r\n * @param camera - Camera whose projection/view defines the ray.\r\n * @param viewportWidth - Current viewport width in pixels.\r\n * @param viewportHeight - Current viewport height in pixels.\r\n * @param screenX - Screen-space x (pixels).\r\n * @param screenY - Screen-space y (pixels).\r\n * @param invModelMatrix - Optional inverse model matrix to transform the ray into local space.\r\n * @returns The constructed Ray.\r\n *\r\n * @remarks\r\n * Computes NDC from screen coordinates, unprojects using `invViewProjectionMatrix`,\r\n * then forms a ray from the camera world position to the unprojected point.\r\n * If `invModelMatrix` is provided, both origin and direction are transformed.\r\n */\r\n constructRay(\r\n camera: Camera,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n screenX: number,\r\n screenY: number,\r\n invModelMatrix?: Matrix4x4\r\n ) {\r\n const vClip = new Vector4((2 * screenX) / viewportWidth - 1, 1 - (2 * screenY) / viewportHeight, 1, 1);\r\n const vWorld = camera.invViewProjectionMatrix.transform(vClip);\r\n vWorld.scaleBy(1 / vWorld.w);\r\n let vEye = camera.getWorldPosition();\r\n let vDir = Vector3.sub(vWorld.xyz(), vEye).inplaceNormalize();\r\n if (invModelMatrix) {\r\n vEye = invModelMatrix.transformPointAffine(vEye);\r\n vDir = invModelMatrix.transformVectorAffine(vDir);\r\n }\r\n return new Ray(vEye, vDir);\r\n }\r\n /**\r\n * Queues a node for a one-shot update before the next render.\r\n *\r\n * The node's `update(frame, elapsedSeconds, deltaSeconds)` will be called\r\n * during Scene.frameUpdate and then the node is removed from the queue.\r\n *\r\n * @param node - Node to schedule.\r\n *\r\n * @remarks\r\n * - To update continuously each frame, call `queueUpdateNode(this)` from within the node's `update` method.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queueUpdateNode(node: SceneNode) {\r\n // Only nodes of this scene, so a node waits in one update queue at most, as its stamp assumes\r\n if (node && node.scene === this) {\r\n this._nodeUpdateQueue.add(node);\r\n }\r\n }\r\n /**\r\n * Queues a drawable for a one-shot state update before the next render.\r\n *\r\n * The drawable's `updateState()` will be called during Scene.frameUpdate and then the drawable is removed from the queue.\r\n * @param drawable - Drawable to schedule.\r\n *\r\n * @remarks\r\n * - To update continuously each frame, call `queueUpdateDrawable(this)` from within the drawable's `updateState` method.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queueUpdateDrawable(drawable: Drawable) {\r\n if (drawable && drawable.getNode()?.scene === this) {\r\n this._drawableUpdateQueue.add(drawable);\r\n }\r\n }\r\n /**\r\n * Queues a node for a one-shot per-camera update before render.\r\n *\r\n * The node's `updatePerCamera(camera, elapsedSeconds, deltaSeconds)` will be\r\n * called once for each camera during {@link Scene.frameUpdatePerCamera}, then removed.\r\n *\r\n * @param node - Node to schedule.\r\n *\r\n * @remarks\r\n * - To run per-camera work continuously, re-queue from `updatePerCamera`.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queuePerCameraUpdateNode(node: SceneNode) {\r\n if (node && node.scene === this) {\r\n this._perCameraUpdateQueue.add(node);\r\n }\r\n }\r\n /**\r\n * Renders this scene using the `mainCamera`, if present.\r\n *\r\n * Equivalent to `mainCamera.render(this)` when `mainCamera` is set.\r\n */\r\n render() {\r\n if (this.mainCamera) {\r\n this.mainCamera.render(this);\r\n }\r\n }\r\n /**\r\n * Marks a graph node as needing placement update in the octree.\r\n *\r\n * Called by nodes when their transform/visibility/attachment changes in a way\r\n * that affects spatial placement.\r\n *\r\n * @internal\r\n */\r\n invalidateNodePlacement(node: GraphNode) {\r\n this._nodePlaceList.add(node);\r\n }\r\n /**\r\n * Synchronizes environment light maps (IBL, SH/FB) with the sky as needed.\r\n *\r\n * Uses device capabilities to decide between Spherical Harmonics floating-point blending (SHFB)\r\n * and classic SH textures, and lazily fills missing environment fields from the sky.\r\n *\r\n * @internal\r\n */\r\n private updateEnvLight() {\r\n if (this.env.light.type === 'ibl') {\r\n this.env.light.radianceMap = this.env.sky.radianceMap;\r\n this.env.light.sheenRadianceMap = this.env.sky.sheenRadianceMap;\r\n this.env.light.irradianceWindow = this.env.sky.shWindowWeights;\r\n this.env.light.irradianceSHFB = this.env.sky.irradianceSHFB;\r\n this.env.light.irradianceSH = null;\r\n }\r\n }\r\n /**\r\n * Returns the renderer class used to render the scene.\r\n *\r\n * Override in subclasses to supply a custom renderer.\r\n *\r\n * @internal\r\n */\r\n getRenderer() {\r\n return SceneRenderer;\r\n }\r\n /**\r\n * Performs per-frame scene updates, once per device frame.\r\n *\r\n * Steps:\r\n * - Ensure this runs only once per frame (via `frameInfo.frameCounter`).\r\n * - Update environment light synchronization.\r\n * - Dispatch `update` event.\r\n * - Update the main camera's controller if its `updatePhase` is `'early'`.\r\n * - Drain the one-shot node update queue and call `node.update(...)`.\r\n * - Dispatch `afterupdate` event; a physics world steps here.\r\n * - Call scripts' `onLateUpdate`, then update the main camera's controller if its\r\n * `updatePhase` is `'late'`, then dispatch `lateupdate` event.\r\n * - Apply pending octree placement updates.\r\n *\r\n */\r\n frameUpdate() {\r\n const frameInfo = getDevice().frameInfo;\r\n if (frameInfo.frameCounter !== this._updateFrame) {\r\n this._updateFrame = frameInfo.frameCounter;\r\n this._env.wind.update(frameInfo.elapsedFrame * 0.001);\r\n this.updateEnvLight();\r\n const deltaInSeconds = frameInfo.elapsedFrame * 0.001;\r\n this.dispatchEvent('update', this);\r\n this.mainCamera?.updateController(deltaInSeconds, 'early');\r\n if (this._nodeUpdateQueue.size > 0 || this._drawableUpdateQueue.size > 0) {\r\n RenderGraphExecutor.profileScope('SceneUpdate', () => {\r\n if (this._nodeUpdateQueue.size > 0) {\r\n const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;\r\n // Nodes queued while draining are updated next frame\r\n for (const node of this._nodeUpdateQueue.take()) {\r\n if (!node.disposed && node.attached) {\r\n node.update(frameInfo.frameCounter, elapsedInSeconds, deltaInSeconds);\r\n }\r\n }\r\n }\r\n if (this._drawableUpdateQueue.size > 0) {\r\n for (const drawable of this._drawableUpdateQueue.take()) {\r\n drawable.updateState();\r\n }\r\n }\r\n });\r\n }\r\n this.dispatchEvent('afterupdate', this);\r\n tryGetApp()?.engine?.lateUpdate(\r\n deltaInSeconds,\r\n (host) => host === this || (host instanceof SceneNode && host.scene === this)\r\n );\r\n this.mainCamera?.updateController(deltaInSeconds, 'late');\r\n this.dispatchEvent('lateupdate', this);\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n const camera = this.mainCamera;\r\n if (camera && (this._gi?.enabled || this._sdf?.enabled)) {\r\n const cameraPos = camera.getWorldPosition();\r\n // The voxel scene feeds the field's compositing, so it goes first\r\n if (this._gi?.enabled) {\r\n RenderGraphExecutor.profileScope('GIVoxelize', () => this._gi!.update(cameraPos, deltaInSeconds));\r\n }\r\n if (this._sdf?.enabled) {\r\n RenderGraphExecutor.profileScope('SceneSDF', () => this._sdf!.update(cameraPos, deltaInSeconds));\r\n }\r\n // Lighting reads what the field just composited\r\n if (this._gi?.enabled) {\r\n RenderGraphExecutor.profileScope('GILighting', () => this._gi!.updateLighting(camera));\r\n }\r\n }\r\n }\r\n // Palettes written by animation updates are uploaded once all nodes and bank tracks are updated\r\n RenderGraphExecutor.profileScope('Animation', () => {\r\n AnimationBankTrack.updateAll(getDevice().frameInfo.elapsedFrame * 0.001);\r\n SkinPaletteAtlas.flushPending();\r\n });\r\n }\r\n /**\r\n * Performs per-camera scene updates for the current frame.\r\n *\r\n * Steps:\r\n * - Drain the per-camera update queue and call `node.updatePerCamera(camera, ...)`.\r\n * - Apply pending octree placement updates.\r\n *\r\n * @param camera - The camera being updated for.\r\n */\r\n frameUpdatePerCamera(camera: Camera) {\r\n if (this._perCameraUpdateQueue.size > 0) {\r\n RenderGraphExecutor.profileScope('SceneUpdatePerCamera', () => {\r\n const frameInfo = getDevice().frameInfo;\r\n const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;\r\n const deltaInSeconds = frameInfo.elapsedFrame * 0.001;\r\n for (const node of this._perCameraUpdateQueue.take()) {\r\n if (!node.disposed) {\r\n node.updatePerCamera(camera, elapsedInSeconds, deltaInSeconds);\r\n }\r\n }\r\n });\r\n }\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n SkinPaletteAtlas.flushPending();\r\n }\r\n /**\r\n * Applies placement changes for nodes in `list` to the given `octree`.\r\n *\r\n * Rules:\r\n * - If node is not disposed, attached, not hidden, and `placeToOctree` is true,\r\n * it is placed; otherwise removed.\r\n * - Drains `list` until empty.\r\n *\r\n * @param octree - Target spatial index.\r\n * @param list - Set of nodes awaiting placement evaluation.\r\n */\r\n updateNodePlacement(octree: Octree, list: Set<GraphNode>) {\r\n function placeNode(node: GraphNode) {\r\n if (!node.disposed && node.attached && !node.hidden && node.placeToOctree) {\r\n octree.placeNode(node);\r\n } else {\r\n octree.removeNode(node);\r\n }\r\n list.delete(node);\r\n }\r\n if (list.size > 0) {\r\n while (list.size > 0) {\r\n const node = list.keys().next().value!;\r\n if (octree) {\r\n placeNode(node);\r\n } else {\r\n list.delete(node);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Disposes the scene and its owned resources.\r\n *\r\n * Disposes:\r\n * - Environment\r\n * - Root node (and, by extension, its hierarchy)\r\n * - Main camera reference wrapper\r\n *\r\n */\r\n protected onDispose() {\r\n this._nodeUpdateQueue.clear();\r\n this._drawableUpdateQueue.clear();\r\n this._perCameraUpdateQueue.clear();\r\n this._env.dispose();\r\n this._gi?.dispose();\r\n this._gi = null;\r\n this._sdf?.dispose();\r\n this._sdf = null;\r\n this._rootNode.dispose();\r\n this._mainCamera.dispose();\r\n this._physicsWorld?.dispose();\r\n this._physicsWorld = null;\r\n }\r\n}\r\n"],"names":["Scene","makeObservable","Disposable","_nextId","_physicsWorld","name","_id","_name","_octree","Octree","_nodePlaceList","Set","_nodeUpdateQueue","UpdateQueue","node","_updateQueueStamp","stamp","_drawableUpdateQueue","drawable","_drawableQueueStamp","_perCameraUpdateQueue","_perCameraQueueStamp","_env","Environment","_sdf","_gi","_updateFrame","_rootNode","DRef","set","SceneNode","get","_metaData","_physicsSettings","_lightingMode","_metersPerUnit","_scripts","_virtualTextureClients","_mainCamera","virtualTextureClients","addVirtualTextureClient","client","includes","push","removeVirtualTextureClient","index","indexOf","splice","id","val","mainCamera","camera","rootNode","octree","updateNodePlacement","boundingBox","getRootNode","getBoxLoosed","env","sdf","SceneSDF","gi","SceneGI","lightingMode","mode","invalidateLightUniforms","metersPerUnit","scale","Number","isFinite","Math","max","iterate","isLight","invalidateUniforms","metaData","physicsSettings","physicsWorld","disposed","factory","getPhysicsWorldFactory","setPhysicsWorld","world","current","scene","Error","physics","_hostDetached","dispose","_hostAttached","script","fileName","unshift","ScriptAttachment","scriptConfig","config","value","normalized","normalizeScriptAttachmentConfig","scripts","normalizeScriptAttachments","scriptConfigs","map","item","next","Array","isArray","i","length","filter","findNodeById","findNodeByName","raycast","ray","Infinity","raycastVisitor","RaycastVisitor","traverse","intersected","target","dist","intersectedDist","point","intersectedPoint","constructRay","viewportWidth","viewportHeight","screenX","screenY","invModelMatrix","vClip","Vector4","vWorld","invViewProjectionMatrix","transform","scaleBy","w","vEye","getWorldPosition","vDir","Vector3","sub","xyz","inplaceNormalize","transformPointAffine","transformVectorAffine","Ray","queueUpdateNode","add","queueUpdateDrawable","getNode","queuePerCameraUpdateNode","render","invalidateNodePlacement","light","type","radianceMap","sky","sheenRadianceMap","irradianceWindow","shWindowWeights","irradianceSHFB","irradianceSH","getRenderer","SceneRenderer","frameUpdate","frameInfo","getDevice","frameCounter","wind","update","elapsedFrame","updateEnvLight","deltaInSeconds","dispatchEvent","updateController","size","RenderGraphExecutor","profileScope","elapsedInSeconds","elapsedOverall","take","attached","updateState","tryGetApp","engine","lateUpdate","host","enabled","cameraPos","updateLighting","AnimationBankTrack","updateAll","SkinPaletteAtlas","flushPending","frameUpdatePerCamera","updatePerCamera","list","placeNode","hidden","placeToOctree","removeNode","delete","keys","clear"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import { makeObservable, Disposable, randomUUID, DRef, ObservableVector3, ObservableQuaternion, Matrix4x4, Vector3, Vector4 } from '@zephyr3d/base';
1
+ import { Quaternion, makeObservable, Disposable, randomUUID, DRef, ObservableVector3, ObservableQuaternion, Matrix4x4, Vector3, Vector4 } from '@zephyr3d/base';
2
2
  import { AnimationSet } from '../animation/animationset.js';
3
3
  import { getEngine } from '../app/api.js';
4
4
  import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttachments } from './script_attachment.js';
5
5
 
6
+ /** Scratch for {@link SceneNode.setWorldPose}. */ const tmpQuat = new Quaternion();
6
7
  const sceneMeshAssetBindings = new WeakMap();
7
8
  /** @internal */ function setSceneMeshAssetBinding(mesh, binding) {
8
9
  sceneMeshAssetBindings.set(mesh, binding);
@@ -74,10 +75,15 @@ const sceneMeshAssetBindings = new WeakMap();
74
75
  /** @internal Scratch local matrix to avoid allocations. */ _tmpLocalMatrix;
75
76
  /** @internal Scratch world matrix to avoid allocations. */ _tmpWorldMatrix;
76
77
  /** @internal Monotonically increasing tag for transform changes. */ _transformTag;
78
+ /** @internal Increased each time the local transform changes */ _localTransformTag;
79
+ /** @internal Stamp of the scene update queue this node is waiting in, see UpdateQueue */ _updateQueueStamp;
80
+ /** @internal Stamp of the scene per-camera update queue this node is waiting in */ _perCameraQueueStamp;
77
81
  /** @internal Shared callback used by observables on transform mutation. */ _transformChangeCallback;
78
82
  /** @internal Arbitrary metadata payload for this node. */ _metaData;
79
83
  /** @internal If greater than zero, suppress transform-change callbacks (during bulk updates). */ _disableCallback;
80
84
  /** @internal User-attached script entries (engine-defined). */ _scripts;
85
+ /** @internal Serialized GPU cloth components owned by this node. */ _gpuClothComponents;
86
+ /** @internal Physics data of this node. */ _physics;
81
87
  /**
82
88
  * Construct a scene node.
83
89
  *
@@ -119,10 +125,15 @@ const sceneMeshAssetBindings = new WeakMap();
119
125
  this._invWorldMatrix = null;
120
126
  this._localMatrix = null;
121
127
  this._transformTag = 0;
128
+ this._localTransformTag = 0;
129
+ this._updateQueueStamp = 0;
130
+ this._perCameraQueueStamp = 0;
122
131
  this._disableCallback = 0;
123
132
  this._tmpLocalMatrix = Matrix4x4.identity();
124
133
  this._tmpWorldMatrix = Matrix4x4.identity();
125
134
  this._scripts = [];
135
+ this._gpuClothComponents = [];
136
+ this._physics = null;
126
137
  this._metaData = null;
127
138
  this._parent = null;
128
139
  this.reparent(scene?.rootNode ?? null);
@@ -279,6 +290,71 @@ const sceneMeshAssetBindings = new WeakMap();
279
290
  }
280
291
  this._scripts = this._scripts.filter((item)=>item.script || item.config != null);
281
292
  }
293
+ /** GPU cloth simulations owned by this node. */ get gpuClothComponents() {
294
+ return this._gpuClothComponents;
295
+ }
296
+ set gpuClothComponents(value) {
297
+ const next = [
298
+ ...new Set((value ?? []).filter((component)=>!!component && !component.disposed))
299
+ ];
300
+ for (const component of next){
301
+ if (component.host && component.host !== this) {
302
+ throw new Error('GPU cloth component belongs to another scene node.');
303
+ }
304
+ }
305
+ for (const component of this._gpuClothComponents){
306
+ if (!next.includes(component)) {
307
+ component.detach(this);
308
+ component.dispose();
309
+ }
310
+ }
311
+ this._gpuClothComponents = next;
312
+ for (const component of next){
313
+ if (!component.host) {
314
+ component.attach(this);
315
+ }
316
+ }
317
+ }
318
+ /**
319
+ * Physics data of this node - rigid body, colliders, joint, vehicle, wheel -
320
+ * or null.
321
+ *
322
+ * @remarks
323
+ * Simulated by the scene's physics world ({@link Scene.physicsWorld}) while
324
+ * the node is in a scene that has one; otherwise it is only kept, saved and
325
+ * loaded. Replacing it disposes the previous data.
326
+ */ get physics() {
327
+ return this._physics;
328
+ }
329
+ set physics(value) {
330
+ const current = this._physics;
331
+ if (current === (value ?? null)) {
332
+ return;
333
+ }
334
+ if (value?.node && value.node !== this) {
335
+ throw new Error('Physics data already belongs to another scene node.');
336
+ }
337
+ this._physics = value ?? null;
338
+ if (current) {
339
+ current._setNode(null);
340
+ current.dispose();
341
+ }
342
+ value?._setNode(this);
343
+ }
344
+ /** Adds a GPU cloth component to this node. */ addGPUClothComponent(component) {
345
+ this.gpuClothComponents = [
346
+ ...this._gpuClothComponents,
347
+ component
348
+ ];
349
+ return component;
350
+ }
351
+ /** Removes and disposes a GPU cloth component from this node. */ removeGPUClothComponent(component) {
352
+ if (!this._gpuClothComponents.includes(component)) {
353
+ return false;
354
+ }
355
+ this.gpuClothComponents = this._gpuClothComponents.filter((item)=>item !== component);
356
+ return true;
357
+ }
282
358
  /**
283
359
  * Display name of the node (for UI/debugging).
284
360
  */ get name() {
@@ -855,6 +931,11 @@ const sceneMeshAssetBindings = new WeakMap();
855
931
  /** Get called when the node was just created by cloning from other node */ onPostClone() {}
856
932
  /** Disposes the node */ onDispose() {
857
933
  super.onDispose();
934
+ for (const component of this._gpuClothComponents.splice(0)){
935
+ component.detach(this);
936
+ component.dispose();
937
+ }
938
+ this.physics = null;
858
939
  this.remove();
859
940
  this.removeChildren();
860
941
  this._animationSet.dispose();
@@ -896,21 +977,29 @@ const sceneMeshAssetBindings = new WeakMap();
896
977
  }
897
978
  }
898
979
  /** @internal */ _onTransformChanged(invalidateLocal) {
980
+ if (invalidateLocal) {
981
+ this._localTransformTag++;
982
+ }
899
983
  if (this._disableCallback > 0) {
900
984
  return;
901
985
  }
902
986
  if (invalidateLocal) {
903
987
  this._localMatrix = null;
904
988
  }
905
- // A synchronized subtree is invalidated recursively below, so each node can
906
- // update its own placement once instead of rescanning all descendants here.
907
- this.invalidateWorldBoundingVolume(!this._worldMatrix);
908
- this.dispatchEvent('transformchanged', this);
909
- if (this._worldMatrix) {
989
+ // Drop the cached world matrices before any listener runs, so one reading the
990
+ // world matrix or bounding volume from an event sees the new transform
991
+ const hadWorldMatrix = !!this._worldMatrix;
992
+ if (hadWorldMatrix) {
910
993
  this._transformTag++;
911
994
  this._worldMatrix = null;
912
995
  this._invWorldMatrix = null;
913
996
  this._worldMatrixDet = null;
997
+ }
998
+ // A synchronized subtree is invalidated recursively below, so each node can
999
+ // update its own placement once instead of rescanning all descendants here.
1000
+ this.invalidateWorldBoundingVolume(!hadWorldMatrix);
1001
+ this.dispatchEvent('transformchanged', this);
1002
+ if (hadWorldMatrix) {
914
1003
  for (const child of this._children){
915
1004
  child.get()._onTransformChanged(false);
916
1005
  }
@@ -926,10 +1015,18 @@ const sceneMeshAssetBindings = new WeakMap();
926
1015
  this.iterate((child)=>{
927
1016
  this.scene.queueUpdateNode(child);
928
1017
  child._onAttached();
1018
+ for (const component of child._gpuClothComponents){
1019
+ component.hostAttached();
1020
+ }
1021
+ child._physics?._hostAttached();
929
1022
  });
930
1023
  }
931
1024
  /** @internal */ _detached() {
932
1025
  this.iterate((child)=>{
1026
+ for (const component of child._gpuClothComponents){
1027
+ component.hostDetached();
1028
+ }
1029
+ child._physics?._hostDetached();
933
1030
  child._onDetached();
934
1031
  });
935
1032
  }
@@ -1038,6 +1135,42 @@ const sceneMeshAssetBindings = new WeakMap();
1038
1135
  this._onTransformChanged(true);
1039
1136
  return this;
1040
1137
  }
1138
+ /**
1139
+ * Sets the node's local transform so that its world position and rotation
1140
+ * become the given ones.
1141
+ *
1142
+ * @remarks
1143
+ * Used to write back poses computed in world space, by a physics engine for
1144
+ * instance. Either argument may be omitted to keep that part. Local scale is
1145
+ * kept. The rotation is exact only when no ancestor has a non-uniform scale,
1146
+ * which would make the world rotation a shear. The transform-changed
1147
+ * notification fires once.
1148
+ *
1149
+ * @param position - World position, or null to keep the current one.
1150
+ * @param rotation - World rotation, or null to keep the current one.
1151
+ * @returns self
1152
+ */ setWorldPose(position, rotation) {
1153
+ const parent = this._parent;
1154
+ this._disableCallback++;
1155
+ if (position) {
1156
+ if (parent) {
1157
+ parent.invWorldMatrix.transformPointAffine(position, this._position);
1158
+ } else {
1159
+ this._position.set(position);
1160
+ }
1161
+ }
1162
+ if (rotation) {
1163
+ if (parent) {
1164
+ parent.worldMatrix.decompose(null, tmpQuat, null);
1165
+ Quaternion.multiply(Quaternion.inverse(tmpQuat, tmpQuat), rotation, this._rotation);
1166
+ } else {
1167
+ this._rotation.set(rotation);
1168
+ }
1169
+ }
1170
+ this._disableCallback--;
1171
+ this._onTransformChanged(true);
1172
+ return this;
1173
+ }
1041
1174
  /** Local transformation matrix of the xform */ get localMatrix() {
1042
1175
  if (!this._localMatrix) {
1043
1176
  this.calculateLocalTransform(this._tmpLocalMatrix);
@@ -1122,6 +1255,14 @@ const sceneMeshAssetBindings = new WeakMap();
1122
1255
  /** @internal */ get transformTag() {
1123
1256
  return this._transformTag;
1124
1257
  }
1258
+ /**
1259
+ * Increased each time the local transform changes, unlike {@link transformTag} which also
1260
+ * follows the ancestors
1261
+ *
1262
+ * @internal
1263
+ */ get localTransformTag() {
1264
+ return this._localTransformTag;
1265
+ }
1125
1266
  /** @internal */ syncTransform() {
1126
1267
  if (!this._worldMatrix) {
1127
1268
  this._worldMatrix = this._tmpWorldMatrix;