@zephyr3d/scene 0.9.4 → 0.9.6

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 (517) hide show
  1. package/dist/animation/animationmask.js +224 -0
  2. package/dist/animation/animationmask.js.map +1 -0
  3. package/dist/animation/animationset.js +268 -67
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js.map +1 -1
  6. package/dist/animation/eulerrotationtrack.js +3 -0
  7. package/dist/animation/eulerrotationtrack.js.map +1 -1
  8. package/dist/animation/fixed_geometry_cache_track.js +7 -0
  9. package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +6 -4
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  13. package/dist/animation/joint_dynamics/controller.js +390 -43
  14. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  15. package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
  16. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  17. package/dist/animation/joint_dynamics/solver.js +4 -3
  18. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  19. package/dist/animation/joint_dynamics/types.js.map +1 -1
  20. package/dist/animation/joint_dynamics_modifier.js +2 -0
  21. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  22. package/dist/animation/morphtarget.js +3 -72
  23. package/dist/animation/morphtarget.js.map +1 -1
  24. package/dist/animation/morphtrack.js +3 -0
  25. package/dist/animation/morphtrack.js.map +1 -1
  26. package/dist/animation/pca_geometry_cache_track.js +3 -0
  27. package/dist/animation/pca_geometry_cache_track.js.map +1 -1
  28. package/dist/animation/proptrack.js +3 -0
  29. package/dist/animation/proptrack.js.map +1 -1
  30. package/dist/animation/rotationtrack.js +3 -0
  31. package/dist/animation/rotationtrack.js.map +1 -1
  32. package/dist/animation/scaletrack.js +3 -0
  33. package/dist/animation/scaletrack.js.map +1 -1
  34. package/dist/animation/skeleton.js +254 -79
  35. package/dist/animation/skeleton.js.map +1 -1
  36. package/dist/animation/skeleton_modifier.js.map +1 -1
  37. package/dist/animation/spring_modifier.js.map +1 -1
  38. package/dist/animation/translationtrack.js +3 -0
  39. package/dist/animation/translationtrack.js.map +1 -1
  40. package/dist/app/engine.js +171 -107
  41. package/dist/app/engine.js.map +1 -1
  42. package/dist/app/scriptregistry.js +251 -80
  43. package/dist/app/scriptregistry.js.map +1 -1
  44. package/dist/asset/assetmanager.js +344 -365
  45. package/dist/asset/assetmanager.js.map +1 -1
  46. package/dist/asset/loaders/loader.js +1 -6
  47. package/dist/asset/loaders/loader.js.map +1 -1
  48. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
  49. package/dist/asset/model.js +1000 -131
  50. package/dist/asset/model.js.map +1 -1
  51. package/dist/avatar/wardrobe.js +474 -0
  52. package/dist/avatar/wardrobe.js.map +1 -0
  53. package/dist/index.d.ts +1126 -199
  54. package/dist/index.js +3 -2
  55. package/dist/index.js.map +1 -1
  56. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
  57. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  58. package/dist/material/mixins/pbr/common.js +72 -15
  59. package/dist/material/mixins/pbr/common.js.map +1 -1
  60. package/dist/material/msdf_text.js +3 -3
  61. package/dist/material/msdf_text.js.map +1 -1
  62. package/dist/material/msdf_text_sprite.js +4 -4
  63. package/dist/material/msdf_text_sprite.js.map +1 -1
  64. package/dist/material/pbrblueprint.js +102 -102
  65. package/dist/material/pbrblueprint.js.map +1 -1
  66. package/dist/render/envlight.js +54 -1
  67. package/dist/render/envlight.js.map +1 -1
  68. package/dist/render/sky.js +9 -0
  69. package/dist/render/sky.js.map +1 -1
  70. package/dist/scene/batchgroup.js +11 -13
  71. package/dist/scene/batchgroup.js.map +1 -1
  72. package/dist/scene/environment.js +15 -2
  73. package/dist/scene/environment.js.map +1 -1
  74. package/dist/scene/mesh.js +79 -16
  75. package/dist/scene/mesh.js.map +1 -1
  76. package/dist/scene/scene.js +1 -0
  77. package/dist/scene/scene.js.map +1 -1
  78. package/dist/scene/scene_node.js +203 -2
  79. package/dist/scene/scene_node.js.map +1 -1
  80. package/dist/text/font/cff_font.js +890 -0
  81. package/dist/text/font/cff_font.js.map +1 -0
  82. package/dist/text/font/font_asset.js +17 -3
  83. package/dist/text/font/font_asset.js.map +1 -1
  84. package/dist/text/msdf/generator.js.map +1 -1
  85. package/dist/text/msdf/shape.js +4 -1
  86. package/dist/text/msdf/shape.js.map +1 -1
  87. package/dist/text/runtime/msdf_text_atlas_manager.js +4 -1
  88. package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -1
  89. package/dist/utility/blueprint/material/inputs.js +1157 -1154
  90. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  91. package/dist/utility/bounding_volume.js.map +1 -1
  92. package/dist/utility/pmrem.js +34 -8
  93. package/dist/utility/pmrem.js.map +1 -1
  94. package/dist/utility/serialization/manager.js +22 -9
  95. package/dist/utility/serialization/manager.js.map +1 -1
  96. package/dist/utility/serialization/scene/animation.js +700 -7
  97. package/dist/utility/serialization/scene/animation.js.map +1 -1
  98. package/dist/utility/serialization/scene/mesh.js +64 -4
  99. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  100. package/dist/utility/serialization/scene/node.js +187 -8
  101. package/dist/utility/serialization/scene/node.js.map +1 -1
  102. package/dist/utility/serialization/types.js.map +1 -1
  103. package/dist/utility/textures/sheenlut.js +138 -0
  104. package/dist/utility/textures/sheenlut.js.map +1 -0
  105. package/package.json +2 -2
  106. package/dist/animation/ik/ik_chain_builder.js +0 -68
  107. package/dist/animation/ik/ik_chain_builder.js.map +0 -1
  108. package/dist/animation/ik/ik_pole_constraint.js +0 -123
  109. package/dist/animation/ik/ik_pole_constraint.js.map +0 -1
  110. package/dist/animation/ik/ik_track.js +0 -96
  111. package/dist/animation/ik/ik_track.js.map +0 -1
  112. package/dist/animation/ik_postprocessor.js +0 -71
  113. package/dist/animation/ik_postprocessor.js.map +0 -1
  114. package/dist/animation/joint_dynamics/math.js +0 -16
  115. package/dist/animation/joint_dynamics/math.js.map +0 -1
  116. package/dist/animation/manual_transform_processor.js +0 -156
  117. package/dist/animation/manual_transform_processor.js.map +0 -1
  118. package/dist/animation/skeleton_postprocessor.js +0 -50
  119. package/dist/animation/skeleton_postprocessor.js.map +0 -1
  120. package/dist/animation/spring2/collision.js +0 -469
  121. package/dist/animation/spring2/collision.js.map +0 -1
  122. package/dist/animation/spring2/constraints.js +0 -329
  123. package/dist/animation/spring2/constraints.js.map +0 -1
  124. package/dist/animation/spring2/controller.js +0 -434
  125. package/dist/animation/spring2/controller.js.map +0 -1
  126. package/dist/animation/spring2/math.js +0 -16
  127. package/dist/animation/spring2/math.js.map +0 -1
  128. package/dist/animation/spring2/solver.js +0 -624
  129. package/dist/animation/spring2/solver.js.map +0 -1
  130. package/dist/animation/spring2/spring_system.js +0 -118
  131. package/dist/animation/spring2/spring_system.js.map +0 -1
  132. package/dist/animation/spring2/types.js +0 -19
  133. package/dist/animation/spring2/types.js.map +0 -1
  134. package/dist/animation/spring_postprocessor.js +0 -54
  135. package/dist/animation/spring_postprocessor.js.map +0 -1
  136. package/dist/asset/loaders/gltf/gltf_loader.js +0 -1273
  137. package/dist/asset/loaders/gltf/gltf_loader.js.map +0 -1
  138. package/dist/asset/loaders/gltf/helpers.js +0 -331
  139. package/dist/asset/loaders/gltf/helpers.js.map +0 -1
  140. package/dist/material/sprite3d.js +0 -301
  141. package/dist/material/sprite3d.js.map +0 -1
  142. package/dist/material/sprite3d_std.js +0 -116
  143. package/dist/material/sprite3d_std.js.map +0 -1
  144. package/dist/material/sprite3dblueprint.js +0 -235
  145. package/dist/material/sprite3dblueprint.js.map +0 -1
  146. package/dist/material/sprite_sdf.js +0 -106
  147. package/dist/material/sprite_sdf.js.map +0 -1
  148. package/dist/material/terrainmaterial.js +0 -368
  149. package/dist/material/terrainmaterial.js.map +0 -1
  150. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
  151. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
  152. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
  153. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
  154. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
  155. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
  156. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
  157. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
  158. package/dist/render/deferredlightpass.js +0 -510
  159. package/dist/render/deferredlightpass.js.map +0 -1
  160. package/dist/render/deferredshadowlightpass.js +0 -428
  161. package/dist/render/deferredshadowlightpass.js.map +0 -1
  162. package/dist/render/gbufferpass.js +0 -50
  163. package/dist/render/gbufferpass.js.map +0 -1
  164. package/dist/scene/sdftextsprite.js +0 -322
  165. package/dist/scene/sdftextsprite.js.map +0 -1
  166. package/dist/scene/sprite3d.js +0 -18
  167. package/dist/scene/sprite3d.js.map +0 -1
  168. package/dist/scene/terrain/grass.js +0 -280
  169. package/dist/scene/terrain/grass.js.map +0 -1
  170. package/dist/scene/terrain/heightfield.js +0 -475
  171. package/dist/scene/terrain/heightfield.js.map +0 -1
  172. package/dist/scene/terrain/patch.js +0 -532
  173. package/dist/scene/terrain/patch.js.map +0 -1
  174. package/dist/scene/terrain/quadtree.js +0 -461
  175. package/dist/scene/terrain/quadtree.js.map +0 -1
  176. package/dist/scene/terrain/terrain.js +0 -231
  177. package/dist/scene/terrain/terrain.js.map +0 -1
  178. package/dist/src/animation/animation.js +0 -127
  179. package/dist/src/animation/animation.js.map +0 -1
  180. package/dist/src/animation/animationset.js +0 -255
  181. package/dist/src/animation/animationset.js.map +0 -1
  182. package/dist/src/animation/animationtrack.js +0 -34
  183. package/dist/src/animation/animationtrack.js.map +0 -1
  184. package/dist/src/animation/eulerrotationtrack.js +0 -52
  185. package/dist/src/animation/eulerrotationtrack.js.map +0 -1
  186. package/dist/src/animation/morphtarget.js +0 -93
  187. package/dist/src/animation/morphtarget.js.map +0 -1
  188. package/dist/src/animation/morphtrack.js +0 -70
  189. package/dist/src/animation/morphtrack.js.map +0 -1
  190. package/dist/src/animation/proptrack.js +0 -161
  191. package/dist/src/animation/proptrack.js.map +0 -1
  192. package/dist/src/animation/rotationtrack.js +0 -51
  193. package/dist/src/animation/rotationtrack.js.map +0 -1
  194. package/dist/src/animation/scaletrack.js +0 -50
  195. package/dist/src/animation/scaletrack.js.map +0 -1
  196. package/dist/src/animation/skeleton.js +0 -204
  197. package/dist/src/animation/skeleton.js.map +0 -1
  198. package/dist/src/animation/translationtrack.js +0 -50
  199. package/dist/src/animation/translationtrack.js.map +0 -1
  200. package/dist/src/app/app.js +0 -129
  201. package/dist/src/app/app.js.map +0 -1
  202. package/dist/src/app/inputmgr.js +0 -267
  203. package/dist/src/app/inputmgr.js.map +0 -1
  204. package/dist/src/asset/assetmanager.js +0 -404
  205. package/dist/src/asset/assetmanager.js.map +0 -1
  206. package/dist/src/asset/builtin.js +0 -337
  207. package/dist/src/asset/builtin.js.map +0 -1
  208. package/dist/src/asset/loaders/dds/dds.js +0 -470
  209. package/dist/src/asset/loaders/dds/dds.js.map +0 -1
  210. package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
  211. package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
  212. package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
  213. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
  214. package/dist/src/asset/loaders/gltf/helpers.js +0 -327
  215. package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
  216. package/dist/src/asset/loaders/hdr/hdr.js +0 -180
  217. package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
  218. package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
  219. package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
  220. package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
  221. package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
  222. package/dist/src/asset/loaders/loader.js +0 -45
  223. package/dist/src/asset/loaders/loader.js.map +0 -1
  224. package/dist/src/asset/model.js +0 -414
  225. package/dist/src/asset/model.js.map +0 -1
  226. package/dist/src/blitter/bilateralblur.js +0 -221
  227. package/dist/src/blitter/bilateralblur.js.map +0 -1
  228. package/dist/src/blitter/blitter.js +0 -390
  229. package/dist/src/blitter/blitter.js.map +0 -1
  230. package/dist/src/blitter/box.js +0 -118
  231. package/dist/src/blitter/box.js.map +0 -1
  232. package/dist/src/blitter/copy.js +0 -22
  233. package/dist/src/blitter/copy.js.map +0 -1
  234. package/dist/src/blitter/gaussianblur.js +0 -228
  235. package/dist/src/blitter/gaussianblur.js.map +0 -1
  236. package/dist/src/camera/base.js +0 -92
  237. package/dist/src/camera/base.js.map +0 -1
  238. package/dist/src/camera/camera.js +0 -1005
  239. package/dist/src/camera/camera.js.map +0 -1
  240. package/dist/src/camera/fps.js +0 -238
  241. package/dist/src/camera/fps.js.map +0 -1
  242. package/dist/src/camera/orbit.js +0 -245
  243. package/dist/src/camera/orbit.js.map +0 -1
  244. package/dist/src/camera/orthocamera.js +0 -167
  245. package/dist/src/camera/orthocamera.js.map +0 -1
  246. package/dist/src/camera/perspectivecamera.js +0 -141
  247. package/dist/src/camera/perspectivecamera.js.map +0 -1
  248. package/dist/src/index.js +0 -120
  249. package/dist/src/index.js.map +0 -1
  250. package/dist/src/material/blinn.js +0 -81
  251. package/dist/src/material/blinn.js.map +0 -1
  252. package/dist/src/material/grassmaterial.js +0 -113
  253. package/dist/src/material/grassmaterial.js.map +0 -1
  254. package/dist/src/material/lambert.js +0 -92
  255. package/dist/src/material/lambert.js.map +0 -1
  256. package/dist/src/material/material.js +0 -301
  257. package/dist/src/material/material.js.map +0 -1
  258. package/dist/src/material/meshmaterial.js +0 -704
  259. package/dist/src/material/meshmaterial.js.map +0 -1
  260. package/dist/src/material/mixins/albedocolor.js +0 -76
  261. package/dist/src/material/mixins/albedocolor.js.map +0 -1
  262. package/dist/src/material/mixins/foliage.js +0 -47
  263. package/dist/src/material/mixins/foliage.js.map +0 -1
  264. package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
  265. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
  266. package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
  267. package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
  268. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
  269. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
  270. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
  271. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
  272. package/dist/src/material/mixins/lit.js +0 -476
  273. package/dist/src/material/mixins/lit.js.map +0 -1
  274. package/dist/src/material/mixins/pbr/common.js +0 -918
  275. package/dist/src/material/mixins/pbr/common.js.map +0 -1
  276. package/dist/src/material/mixins/texture.js +0 -172
  277. package/dist/src/material/mixins/texture.js.map +0 -1
  278. package/dist/src/material/mixins/vertexcolor.js +0 -56
  279. package/dist/src/material/mixins/vertexcolor.js.map +0 -1
  280. package/dist/src/material/particle.js +0 -178
  281. package/dist/src/material/particle.js.map +0 -1
  282. package/dist/src/material/pbrmr.js +0 -97
  283. package/dist/src/material/pbrmr.js.map +0 -1
  284. package/dist/src/material/pbrsg.js +0 -97
  285. package/dist/src/material/pbrsg.js.map +0 -1
  286. package/dist/src/material/shader/helper.js +0 -1209
  287. package/dist/src/material/shader/helper.js.map +0 -1
  288. package/dist/src/material/terrain-cm.js +0 -606
  289. package/dist/src/material/terrain-cm.js.map +0 -1
  290. package/dist/src/material/terrainmaterial.js +0 -375
  291. package/dist/src/material/terrainmaterial.js.map +0 -1
  292. package/dist/src/material/unlit.js +0 -41
  293. package/dist/src/material/unlit.js.map +0 -1
  294. package/dist/src/material/water.js +0 -417
  295. package/dist/src/material/water.js.map +0 -1
  296. package/dist/src/posteffect/bloom.js +0 -361
  297. package/dist/src/posteffect/bloom.js.map +0 -1
  298. package/dist/src/posteffect/compositor.js +0 -226
  299. package/dist/src/posteffect/compositor.js.map +0 -1
  300. package/dist/src/posteffect/fxaa.js +0 -273
  301. package/dist/src/posteffect/fxaa.js.map +0 -1
  302. package/dist/src/posteffect/grayscale.js +0 -69
  303. package/dist/src/posteffect/grayscale.js.map +0 -1
  304. package/dist/src/posteffect/motionblur.js +0 -96
  305. package/dist/src/posteffect/motionblur.js.map +0 -1
  306. package/dist/src/posteffect/posteffect.js +0 -126
  307. package/dist/src/posteffect/posteffect.js.map +0 -1
  308. package/dist/src/posteffect/sao.js +0 -324
  309. package/dist/src/posteffect/sao.js.map +0 -1
  310. package/dist/src/posteffect/ssr.js +0 -489
  311. package/dist/src/posteffect/ssr.js.map +0 -1
  312. package/dist/src/posteffect/taa.js +0 -172
  313. package/dist/src/posteffect/taa.js.map +0 -1
  314. package/dist/src/posteffect/tonemap.js +0 -94
  315. package/dist/src/posteffect/tonemap.js.map +0 -1
  316. package/dist/src/render/abuffer_oit.js +0 -361
  317. package/dist/src/render/abuffer_oit.js.map +0 -1
  318. package/dist/src/render/clipmap.js +0 -851
  319. package/dist/src/render/clipmap.js.map +0 -1
  320. package/dist/src/render/cluster_light.js +0 -333
  321. package/dist/src/render/cluster_light.js.map +0 -1
  322. package/dist/src/render/cull_visitor.js +0 -187
  323. package/dist/src/render/cull_visitor.js.map +0 -1
  324. package/dist/src/render/depthpass.js +0 -68
  325. package/dist/src/render/depthpass.js.map +0 -1
  326. package/dist/src/render/drawable_mixin.js +0 -227
  327. package/dist/src/render/drawable_mixin.js.map +0 -1
  328. package/dist/src/render/envlight.js +0 -463
  329. package/dist/src/render/envlight.js.map +0 -1
  330. package/dist/src/render/fbm_wavegenerator.js +0 -251
  331. package/dist/src/render/fbm_wavegenerator.js.map +0 -1
  332. package/dist/src/render/fft_wavegenerator.js +0 -1006
  333. package/dist/src/render/fft_wavegenerator.js.map +0 -1
  334. package/dist/src/render/fullscreenquad.js +0 -38
  335. package/dist/src/render/fullscreenquad.js.map +0 -1
  336. package/dist/src/render/gerstner_wavegenerator.js +0 -314
  337. package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
  338. package/dist/src/render/globalbindgroup_allocator.js +0 -60
  339. package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
  340. package/dist/src/render/hzb.js +0 -273
  341. package/dist/src/render/hzb.js.map +0 -1
  342. package/dist/src/render/lightpass.js +0 -172
  343. package/dist/src/render/lightpass.js.map +0 -1
  344. package/dist/src/render/objectcolorpass.js +0 -51
  345. package/dist/src/render/objectcolorpass.js.map +0 -1
  346. package/dist/src/render/primitive.js +0 -364
  347. package/dist/src/render/primitive.js.map +0 -1
  348. package/dist/src/render/render_queue.js +0 -467
  349. package/dist/src/render/render_queue.js.map +0 -1
  350. package/dist/src/render/renderbundle_wrapper.js +0 -152
  351. package/dist/src/render/renderbundle_wrapper.js.map +0 -1
  352. package/dist/src/render/renderer.js +0 -455
  353. package/dist/src/render/renderer.js.map +0 -1
  354. package/dist/src/render/renderpass.js +0 -200
  355. package/dist/src/render/renderpass.js.map +0 -1
  356. package/dist/src/render/shadowmap_pass.js +0 -56
  357. package/dist/src/render/shadowmap_pass.js.map +0 -1
  358. package/dist/src/render/sky.js +0 -1103
  359. package/dist/src/render/sky.js.map +0 -1
  360. package/dist/src/render/weightedblended_oit.js +0 -168
  361. package/dist/src/render/weightedblended_oit.js.map +0 -1
  362. package/dist/src/scene/batchgroup.js +0 -162
  363. package/dist/src/scene/batchgroup.js.map +0 -1
  364. package/dist/src/scene/environment.js +0 -209
  365. package/dist/src/scene/environment.js.map +0 -1
  366. package/dist/src/scene/graph_node.js +0 -72
  367. package/dist/src/scene/graph_node.js.map +0 -1
  368. package/dist/src/scene/light.js +0 -416
  369. package/dist/src/scene/light.js.map +0 -1
  370. package/dist/src/scene/mesh.js +0 -341
  371. package/dist/src/scene/mesh.js.map +0 -1
  372. package/dist/src/scene/octree.js +0 -649
  373. package/dist/src/scene/octree.js.map +0 -1
  374. package/dist/src/scene/particlesys.js +0 -738
  375. package/dist/src/scene/particlesys.js.map +0 -1
  376. package/dist/src/scene/raycast_visitor.js +0 -103
  377. package/dist/src/scene/raycast_visitor.js.map +0 -1
  378. package/dist/src/scene/scene.js +0 -284
  379. package/dist/src/scene/scene.js.map +0 -1
  380. package/dist/src/scene/scene_node.js +0 -732
  381. package/dist/src/scene/scene_node.js.map +0 -1
  382. package/dist/src/scene/terrain/grass.js +0 -278
  383. package/dist/src/scene/terrain/grass.js.map +0 -1
  384. package/dist/src/scene/terrain/heightfield.js +0 -475
  385. package/dist/src/scene/terrain/heightfield.js.map +0 -1
  386. package/dist/src/scene/terrain/patch.js +0 -530
  387. package/dist/src/scene/terrain/patch.js.map +0 -1
  388. package/dist/src/scene/terrain/quadtree.js +0 -461
  389. package/dist/src/scene/terrain/quadtree.js.map +0 -1
  390. package/dist/src/scene/terrain/terrain.js +0 -246
  391. package/dist/src/scene/terrain/terrain.js.map +0 -1
  392. package/dist/src/scene/terrain-cm/grass.js +0 -594
  393. package/dist/src/scene/terrain-cm/grass.js.map +0 -1
  394. package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
  395. package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
  396. package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
  397. package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
  398. package/dist/src/scene/water.js +0 -374
  399. package/dist/src/scene/water.js.map +0 -1
  400. package/dist/src/shaders/atmosphere.js +0 -957
  401. package/dist/src/shaders/atmosphere.js.map +0 -1
  402. package/dist/src/shaders/fog.js +0 -112
  403. package/dist/src/shaders/fog.js.map +0 -1
  404. package/dist/src/shaders/misc.js +0 -266
  405. package/dist/src/shaders/misc.js.map +0 -1
  406. package/dist/src/shaders/noise.js +0 -222
  407. package/dist/src/shaders/noise.js.map +0 -1
  408. package/dist/src/shaders/pbr.js +0 -51
  409. package/dist/src/shaders/pbr.js.map +0 -1
  410. package/dist/src/shaders/shadow.js +0 -636
  411. package/dist/src/shaders/shadow.js.map +0 -1
  412. package/dist/src/shaders/ssr.js +0 -490
  413. package/dist/src/shaders/ssr.js.map +0 -1
  414. package/dist/src/shaders/temporal.js +0 -215
  415. package/dist/src/shaders/temporal.js.map +0 -1
  416. package/dist/src/shaders/water.js +0 -756
  417. package/dist/src/shaders/water.js.map +0 -1
  418. package/dist/src/shadow/esm.js +0 -237
  419. package/dist/src/shadow/esm.js.map +0 -1
  420. package/dist/src/shadow/pcf_opt.js +0 -181
  421. package/dist/src/shadow/pcf_opt.js.map +0 -1
  422. package/dist/src/shadow/pcf_pd.js +0 -189
  423. package/dist/src/shadow/pcf_pd.js.map +0 -1
  424. package/dist/src/shadow/shader.js +0 -37
  425. package/dist/src/shadow/shader.js.map +0 -1
  426. package/dist/src/shadow/shadow_impl.js +0 -15
  427. package/dist/src/shadow/shadow_impl.js.map +0 -1
  428. package/dist/src/shadow/shadowmapper.js +0 -790
  429. package/dist/src/shadow/shadowmapper.js.map +0 -1
  430. package/dist/src/shadow/ssm.js +0 -159
  431. package/dist/src/shadow/ssm.js.map +0 -1
  432. package/dist/src/shadow/vsm.js +0 -297
  433. package/dist/src/shadow/vsm.js.map +0 -1
  434. package/dist/src/shapes/box.js +0 -386
  435. package/dist/src/shapes/box.js.map +0 -1
  436. package/dist/src/shapes/cylinder.js +0 -125
  437. package/dist/src/shapes/cylinder.js.map +0 -1
  438. package/dist/src/shapes/plane.js +0 -88
  439. package/dist/src/shapes/plane.js.map +0 -1
  440. package/dist/src/shapes/shape.js +0 -87
  441. package/dist/src/shapes/shape.js.map +0 -1
  442. package/dist/src/shapes/sphere.js +0 -114
  443. package/dist/src/shapes/sphere.js.map +0 -1
  444. package/dist/src/shapes/tetrahedron.js +0 -188
  445. package/dist/src/shapes/tetrahedron.js.map +0 -1
  446. package/dist/src/shapes/torus.js +0 -111
  447. package/dist/src/shapes/torus.js.map +0 -1
  448. package/dist/src/utility/aabbtree.js +0 -400
  449. package/dist/src/utility/aabbtree.js.map +0 -1
  450. package/dist/src/utility/bounding_volume.js +0 -29
  451. package/dist/src/utility/bounding_volume.js.map +0 -1
  452. package/dist/src/utility/debug.js +0 -28
  453. package/dist/src/utility/debug.js.map +0 -1
  454. package/dist/src/utility/draco/decoder.js +0 -116
  455. package/dist/src/utility/draco/decoder.js.map +0 -1
  456. package/dist/src/utility/misc.js +0 -105
  457. package/dist/src/utility/misc.js.map +0 -1
  458. package/dist/src/utility/panorama.js +0 -163
  459. package/dist/src/utility/panorama.js.map +0 -1
  460. package/dist/src/utility/pmrem.js +0 -354
  461. package/dist/src/utility/pmrem.js.map +0 -1
  462. package/dist/src/utility/rendermipmap.js +0 -115
  463. package/dist/src/utility/rendermipmap.js.map +0 -1
  464. package/dist/src/utility/serialization/json.js +0 -402
  465. package/dist/src/utility/serialization/json.js.map +0 -1
  466. package/dist/src/utility/serialization/manager.js +0 -623
  467. package/dist/src/utility/serialization/manager.js.map +0 -1
  468. package/dist/src/utility/serialization/scene/animation.js +0 -248
  469. package/dist/src/utility/serialization/scene/animation.js.map +0 -1
  470. package/dist/src/utility/serialization/scene/batch.js +0 -59
  471. package/dist/src/utility/serialization/scene/batch.js.map +0 -1
  472. package/dist/src/utility/serialization/scene/camera.js +0 -790
  473. package/dist/src/utility/serialization/scene/camera.js.map +0 -1
  474. package/dist/src/utility/serialization/scene/common.js +0 -222
  475. package/dist/src/utility/serialization/scene/common.js.map +0 -1
  476. package/dist/src/utility/serialization/scene/light.js +0 -575
  477. package/dist/src/utility/serialization/scene/light.js.map +0 -1
  478. package/dist/src/utility/serialization/scene/material.js +0 -1111
  479. package/dist/src/utility/serialization/scene/material.js.map +0 -1
  480. package/dist/src/utility/serialization/scene/mesh.js +0 -148
  481. package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
  482. package/dist/src/utility/serialization/scene/misc.js +0 -39
  483. package/dist/src/utility/serialization/scene/misc.js.map +0 -1
  484. package/dist/src/utility/serialization/scene/node.js +0 -451
  485. package/dist/src/utility/serialization/scene/node.js.map +0 -1
  486. package/dist/src/utility/serialization/scene/particle.js +0 -425
  487. package/dist/src/utility/serialization/scene/particle.js.map +0 -1
  488. package/dist/src/utility/serialization/scene/primitive.js +0 -692
  489. package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
  490. package/dist/src/utility/serialization/scene/scene.js +0 -704
  491. package/dist/src/utility/serialization/scene/scene.js.map +0 -1
  492. package/dist/src/utility/serialization/scene/terrain.js +0 -488
  493. package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
  494. package/dist/src/utility/serialization/scene/water.js +0 -465
  495. package/dist/src/utility/serialization/scene/water.js.map +0 -1
  496. package/dist/src/utility/shprojector.js +0 -297
  497. package/dist/src/utility/shprojector.js.map +0 -1
  498. package/dist/src/utility/textures/ggxlut.js +0 -213
  499. package/dist/src/utility/textures/ggxlut.js.map +0 -1
  500. package/dist/src/utility/textures/gradientnoise.js +0 -62
  501. package/dist/src/utility/textures/gradientnoise.js.map +0 -1
  502. package/dist/src/utility/textures/randomnoise.js +0 -41
  503. package/dist/src/utility/textures/randomnoise.js.map +0 -1
  504. package/dist/src/values.js +0 -162
  505. package/dist/src/values.js.map +0 -1
  506. package/dist/utility/blueprint/material/common.js +0 -7
  507. package/dist/utility/blueprint/material/common.js.map +0 -1
  508. package/dist/utility/serialization/blueprint/constants.js +0 -255
  509. package/dist/utility/serialization/blueprint/constants.js.map +0 -1
  510. package/dist/utility/serialization/blueprint/material/constants.js +0 -203
  511. package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
  512. package/dist/utility/serialization/blueprint/material/texture.js +0 -165
  513. package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
  514. package/dist/utility/serialization/scene/cloth_script.js +0 -834
  515. package/dist/utility/serialization/scene/cloth_script.js.map +0 -1
  516. package/dist/utility/serialization/scene/spring_script.js +0 -596
  517. package/dist/utility/serialization/scene/spring_script.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"mesh.js","sources":["../../src/scene/mesh.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, castObservable, DRef } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type { MeshMaterial } from '../material';\r\nimport { LambertMaterial, ShaderHelper } from '../material';\r\nimport type {\r\n RenderPass,\r\n Primitive,\r\n BatchDrawable,\r\n DrawContext,\r\n PickTarget,\r\n MorphData,\r\n MorphInfo,\r\n RenderQueue\r\n} from '../render';\r\nimport {\r\n PBArrayTypeInfo,\r\n PBPrimitiveType,\r\n PBPrimitiveTypeInfo,\r\n PBStructTypeInfo,\r\n type RenderBundle,\r\n type Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport type { BoundingBox } from '../utility/bounding_volume';\r\nimport { MORPH_ATTRIBUTE_VECTOR_COUNT, MORPH_WEIGHTS_VECTOR_COUNT, QUEUE_OPAQUE } from '../values';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport type { SceneNode } from './scene_node';\r\nimport { getDevice } from '../app/api';\r\nimport type { SkinnedBoundingBox } from '../animation';\r\n\r\n/**\r\n * Callback invoked after a mesh finishes its per-frame update.\r\n *\r\n * @public\r\n */\r\nexport type MeshUpdateCallback = (frameId: number, elapsedInSeconds: number, deltaInSeconds: number) => void;\r\n\r\nconst MeshBase = castObservable(applyMixins(GraphNode, mixinDrawable))<{\r\n primitive_changed: [primitive: Nullable<Primitive>];\r\n material_changed: [material: Nullable<MeshMaterial>];\r\n}>();\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class Mesh extends MeshBase implements BatchDrawable {\r\n /** @internal */\r\n private readonly _primitive: DRef<Primitive>;\r\n /** @internal */\r\n private readonly _material: DRef<MeshMaterial>;\r\n /** @internal */\r\n protected _castShadow: boolean;\r\n /** @internal */\r\n protected _skinnedBoundingInfo: Nullable<SkinnedBoundingBox>;\r\n /** @internal */\r\n protected _animatedBoundingBox: Nullable<BoundingBox>;\r\n /** @internal */\r\n protected _skeletonName: string;\r\n /** @internal */\r\n protected _boneMatrices: DRef<Texture2D>;\r\n /** @internal */\r\n protected _morphData: Nullable<MorphData>;\r\n /** @internal */\r\n protected _morphInfo: Nullable<MorphInfo>;\r\n /** @internal */\r\n protected _morphDirty: boolean;\r\n /** @internal */\r\n protected _instanceHash: Nullable<string>;\r\n /** @internal */\r\n protected _batchable: boolean;\r\n /** @internal */\r\n protected _pickTarget: PickTarget;\r\n /** @internal */\r\n protected _suspendSkinning: boolean;\r\n /** @internal */\r\n protected _renderBundle: Nullable<Record<string, RenderBundle>>;\r\n /** @internal */\r\n protected _useRenderBundle: boolean;\r\n /** @internal */\r\n protected _materialChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _primitiveChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _postUpdateCallbacks: Set<MeshUpdateCallback>;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene, primitive?: Primitive, material?: MeshMaterial) {\r\n super(scene);\r\n this._primitive = new DRef();\r\n this._material = new DRef();\r\n this._castShadow = true;\r\n this._skinnedBoundingInfo = null;\r\n this._animatedBoundingBox = null;\r\n this._boneMatrices = new DRef();\r\n this._morphData = null;\r\n this._morphInfo = null;\r\n this._morphDirty = false;\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = getDevice().type !== 'webgl';\r\n this.primitive = primitive ?? null;\r\n this.material = material ?? Mesh._getDefaultMaterial();\r\n this._suspendSkinning = false;\r\n this._skeletonName = '';\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\r\n this._primitiveChangeTag = null;\r\n this._postUpdateCallbacks = new Set();\r\n }\r\n /**\r\n * Returns the batch instance ID for the current render pass.\r\n */\r\n getInstanceId(_renderPass: RenderPass) {\r\n return `${this._instanceHash}:${this.worldMatrixDet >= 0}`;\r\n }\r\n /**\r\n * Returns the packed instance-uniform buffer used for batching.\r\n */\r\n getInstanceUniforms() {\r\n return this._material.get()!.$instanceUniforms;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n setPickTarget(node: SceneNode, label?: string) {\r\n this._pickTarget = { node, label };\r\n }\r\n get skeletonName() {\r\n return this._skeletonName;\r\n }\r\n set skeletonName(name) {\r\n if (name !== this._skeletonName) {\r\n this._skeletonName = name;\r\n this.updateSkeletonState();\r\n }\r\n }\r\n /** @internal */\r\n get skinnedBoundingInfo() {\r\n return this._skinnedBoundingInfo;\r\n }\r\n /** @internal */\r\n get suspendSkinning() {\r\n return this._suspendSkinning;\r\n }\r\n /** @internal */\r\n set suspendSkinning(val) {\r\n this._suspendSkinning = !!val;\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(b) {\r\n this._castShadow = b;\r\n }\r\n /** Primitive of the mesh */\r\n get primitive() {\r\n return this._primitive?.get() ?? null;\r\n }\r\n set primitive(prim) {\r\n const currentPrimitive = this._primitive.get();\r\n if (prim !== currentPrimitive) {\r\n if (currentPrimitive) {\r\n currentPrimitive.off('bv_changed', this._onBoundingboxChange, this);\r\n }\r\n this._primitive.set(prim);\r\n if (prim) {\r\n prim.on('bv_changed', this._onBoundingboxChange, this);\r\n }\r\n this._instanceHash =\r\n prim && this._material.get()\r\n ? `${this.constructor.name}:${this._scene!.id}:${prim.id}:${this._material.get()!.instanceId}`\r\n : null;\r\n this.invalidateBoundingVolume();\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._primitiveChangeTag = null;\r\n this.dispatchEvent('primitive_changed', prim);\r\n }\r\n }\r\n /** Material of the mesh */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m) {\r\n this._material.set(m);\r\n if (m) {\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash =\r\n this._primitive.get() && m\r\n ? `${this.constructor.name}:${this._scene?.id ?? 0}:${this._primitive.get()!.id}:${m.instanceId}`\r\n : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n this.dispatchEvent('material_changed', m);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isMesh}\r\n */\r\n isMesh(): this is Mesh {\r\n return true;\r\n }\r\n /**\r\n * Sets the bounding box for animation\r\n * @param bbox - The bounding box for animation\r\n */\r\n setAnimatedBoundingBox(bbox: Nullable<BoundingBox>) {\r\n this._animatedBoundingBox = bbox;\r\n this.invalidateBoundingVolume();\r\n }\r\n /**\r\n * Gets the bounding box for animation\r\n */\r\n getAnimatedBoundingBox() {\r\n return this._animatedBoundingBox ?? null;\r\n }\r\n /**\r\n * Sets the texture that contains the bone matrices for skeletal animation\r\n * @param matrices - The texture that contains the bone matrices\r\n */\r\n setBoneMatrices(matrices: Nullable<Texture2D>) {\r\n if (this._boneMatrices.get() !== matrices) {\r\n this._boneMatrices.set(matrices);\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * Sets the texture that contains the morph target data\r\n * @param data - The texture that contains the morph target data\r\n */\r\n setMorphData(data: Nullable<MorphData>) {\r\n if (!data) {\r\n if (this._morphData) {\r\n this._morphData?.texture?.dispose();\r\n this._morphData = null;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n } else {\r\n if (!this._morphData) {\r\n this._morphData = {\r\n texture: new DRef()\r\n } as MorphData;\r\n }\r\n this._morphData.width = data.width;\r\n this._morphData.height = data.height;\r\n this._morphData.data = data.data.slice();\r\n if (data.texture?.get()) {\r\n this._morphData.texture!.set(data.texture.get());\r\n } else {\r\n const tex = getDevice().createTexture2D('rgba32f', data.width, data.height, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n tex.update(data.data, 0, 0, data.width, data.height);\r\n this._morphData.texture!.set(tex);\r\n }\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * Sets the skinned bounding info\r\n * @param info - The skinned bounding info\r\n */\r\n setSkinnedBoundingInfo(info: Nullable<SkinnedBoundingBox>) {\r\n this._skinnedBoundingInfo = info;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return this._morphData;\r\n }\r\n /**\r\n * Sets the buffer that contains the morph target information\r\n * @param info - The buffer that contains the morph target information\r\n */\r\n setMorphInfo(info: Nullable<MorphInfo>) {\r\n if (!info) {\r\n if (this._morphInfo) {\r\n this._morphInfo.buffer?.dispose();\r\n this._morphInfo = null;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n } else {\r\n if (!this._morphInfo) {\r\n this._morphInfo = {\r\n buffer: new DRef()\r\n } as MorphInfo;\r\n }\r\n this._morphInfo.data = info.data.slice();\r\n this._morphInfo.names = { ...info.names };\r\n if (info.buffer?.get()) {\r\n this._morphInfo.buffer!.set(info.buffer.get());\r\n } else {\r\n const bufferType = new PBStructTypeInfo('dummy', 'std140', [\r\n {\r\n name: ShaderHelper.getMorphInfoUniformName(),\r\n type: new PBArrayTypeInfo(\r\n new PBPrimitiveTypeInfo(PBPrimitiveType.F32VEC4),\r\n 1 + MORPH_WEIGHTS_VECTOR_COUNT + MORPH_ATTRIBUTE_VECTOR_COUNT\r\n )\r\n }\r\n ]);\r\n const morphUniformBuffer = getDevice().createStructuredBuffer(\r\n bufferType,\r\n {\r\n usage: 'uniform'\r\n },\r\n info.data\r\n );\r\n this._morphInfo.buffer!.set(morphUniformBuffer);\r\n }\r\n this._morphDirty = false;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return this._morphInfo;\r\n }\r\n /**\r\n * Get the number of morph targets\r\n *\r\n * @returns The number of morph targets\r\n */\r\n getNumMorphTargets(): number {\r\n return this._morphInfo?.data[3] ?? 0;\r\n }\r\n /**\r\n * Get the name of the morph target by index\r\n *\r\n * @param index - The index of the morph target\r\n * @returns The name of the morph target, or null if not found\r\n */\r\n getMorphTargetName(index: number): Nullable<string> {\r\n if (this._morphInfo && index >= 0 && index < this._morphInfo.data[3]) {\r\n const name = Object.keys(this._morphInfo.names).find((key) => this._morphInfo!.names![key] === index);\r\n return name ?? null;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Update morph target weight\r\n *\r\n * @param name - The name of the morph target\r\n * @param weight - The weight of the morph target\r\n */\r\n setMorphWeight(name: string, weight: number) {\r\n const index = this._morphInfo?.names?.[name];\r\n if (index !== undefined && index >= 0 && index < this._morphInfo!.data[3]) {\r\n if (this._morphInfo!.data[4 + index] !== weight) {\r\n this._morphInfo!.data[4 + index] = weight;\r\n this._morphDirty = true;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n } else {\r\n console.warn(`Morph target ${name} not found`);\r\n }\r\n }\r\n /**\r\n * Get morph target weight\r\n *\r\n * @param name - The name of the morph target\r\n * @returns The weight of the morph target, or 0 if not found\r\n */\r\n getMorphWeight(name: string): number {\r\n const index = this._morphInfo?.names?.[name];\r\n if (index !== undefined && index >= 0 && index < this._morphInfo!.data[3]) {\r\n return this._morphInfo!.data[4 + index];\r\n }\r\n return 0;\r\n }\r\n /**\r\n * Update morph target weight\r\n *\r\n * @param weight - The morph target weights. The length must not exceed the mesh's morph target count.\r\n */\r\n updateMorphWeights(weight: number[]) {\r\n if (this._morphInfo && weight && weight.length <= this._morphInfo.data[3]) {\r\n this._morphInfo.data.set(weight, 4);\r\n this._morphDirty = true;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.update} */\r\n update(frameId: number, elapsedInSeconds: number, deltaInSeconds: number) {\r\n super.update(frameId, elapsedInSeconds, deltaInSeconds);\r\n this.updateSkeletonState();\r\n this.updateMorphState();\r\n if (this._postUpdateCallbacks.size > 0) {\r\n for (const callback of this._postUpdateCallbacks) {\r\n callback(frameId, elapsedInSeconds, deltaInSeconds);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n addPostUpdateCallback(callback: MeshUpdateCallback) {\r\n if (callback) {\r\n this._postUpdateCallbacks.add(callback);\r\n }\r\n }\r\n /** @internal */\r\n removePostUpdateCallback(callback: MeshUpdateCallback) {\r\n if (callback) {\r\n this._postUpdateCallbacks.delete(callback);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return (\r\n this._batchable &&\r\n !this._boneMatrices.get() &&\r\n !this._morphData &&\r\n (this._material.get()?.isBatchable() ?? false)\r\n );\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this.material?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth() ?? false;\r\n }\r\n /** @internal */\r\n private updateMorphState() {\r\n if (this._morphInfo && this._morphDirty) {\r\n console.log(`jawOpen: ${this._morphInfo.data[20]}`);\r\n this._morphInfo.buffer!.get()!.bufferSubData(4 * 4, this._morphInfo.data, 4, this._morphInfo.data[3]);\r\n this._morphDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private updateSkeletonState() {\r\n if (this._suspendSkinning) {\r\n this.setBoneMatrices(null);\r\n this.setAnimatedBoundingBox(null);\r\n return;\r\n }\r\n const skeleton = this._skeletonName && this.findSkeletonById(this._skeletonName);\r\n if (skeleton) {\r\n this.setBoneMatrices(skeleton.jointTexture);\r\n skeleton.computeBoundingBox(this._skinnedBoundingInfo!, this.invWorldMatrix);\r\n this.setAnimatedBoundingBox(this._skinnedBoundingInfo!.boundingBox);\r\n } else {\r\n this.setBoneMatrices(null);\r\n this.setAnimatedBoundingBox(null);\r\n }\r\n if (this._skeletonName) {\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>, hash?: string) {\r\n const material = this.material;\r\n const primitive = this.primitive;\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (\r\n this._primitiveChangeTag !== primitive.changeTag ||\r\n this._materialChangeTag !== material.changeTag\r\n ) {\r\n this._renderBundle = {};\r\n this._primitiveChangeTag = primitive.changeTag;\r\n this._materialChangeTag = material.changeTag;\r\n }\r\n const renderBundle = this._renderBundle![hash];\r\n if (!renderBundle) {\r\n ctx.device.beginCapture();\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n this._renderBundle![hash] = ctx.device.endCapture();\r\n } else {\r\n ctx.device.executeRenderBundle(renderBundle);\r\n }\r\n } else {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this.material;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return this.primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return this._boneMatrices.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getNode}\r\n */\r\n getNode() {\r\n // mesh transform should be ignored when skinned\r\n return this;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n let bbox: Nullable<BoundingVolume>;\r\n if (this._animatedBoundingBox) {\r\n bbox = this._animatedBoundingBox;\r\n } else {\r\n bbox = this._primitive.get()?.getBoundingVolume() ?? null;\r\n }\r\n return bbox;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._primitive.get()?.off('bv_changed', this._onBoundingboxChange, this);\r\n this._primitive.dispose();\r\n this._material.dispose();\r\n this._boneMatrices.dispose();\r\n this.setMorphData(null);\r\n this.setMorphInfo(null);\r\n this._renderBundle = null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n /** @internal */\r\n private _onBoundingboxChange() {\r\n this.invalidateBoundingVolume();\r\n }\r\n /** @internal */\r\n private static _defaultMaterial: Nullable<MeshMaterial> = null;\r\n /** @internal */\r\n private static _getDefaultMaterial() {\r\n if (!this._defaultMaterial) {\r\n this._defaultMaterial = new LambertMaterial();\r\n }\r\n return this._defaultMaterial;\r\n }\r\n}\r\n"],"names":["MeshBase","castObservable","applyMixins","GraphNode","mixinDrawable","Mesh","scene","primitive","material","_primitive","DRef","_material","_castShadow","_skinnedBoundingInfo","_animatedBoundingBox","_boneMatrices","_morphData","_morphInfo","_morphDirty","_instanceHash","_pickTarget","node","_batchable","getDevice","type","_getDefaultMaterial","_suspendSkinning","_skeletonName","_renderBundle","_useRenderBundle","_materialChangeTag","_primitiveChangeTag","_postUpdateCallbacks","Set","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","skeletonName","name","updateSkeletonState","skinnedBoundingInfo","suspendSkinning","val","castShadow","b","prim","currentPrimitive","off","_onBoundingboxChange","set","on","_scene","id","instanceId","invalidateBoundingVolume","RenderBundleWrapper","drawableChanged","dispatchEvent","m","materialAttached","coreMaterial","isMesh","setAnimatedBoundingBox","bbox","getAnimatedBoundingBox","setBoneMatrices","matrices","setMorphData","data","texture","dispose","width","height","slice","tex","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","setSkinnedBoundingInfo","info","getMorphData","setMorphInfo","buffer","names","bufferType","PBStructTypeInfo","ShaderHelper","getMorphInfoUniformName","PBArrayTypeInfo","PBPrimitiveTypeInfo","PBPrimitiveType","F32VEC4","MORPH_WEIGHTS_VECTOR_COUNT","MORPH_ATTRIBUTE_VECTOR_COUNT","morphUniformBuffer","createStructuredBuffer","usage","getMorphInfo","getNumMorphTargets","getMorphTargetName","index","Object","keys","find","key","setMorphWeight","weight","undefined","queueUpdateNode","console","warn","getMorphWeight","updateMorphWeights","length","frameId","elapsedInSeconds","deltaInSeconds","updateMorphState","size","callback","addPostUpdateCallback","add","removePostUpdateCallback","delete","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","log","bufferSubData","skeleton","findSkeletonById","jointTexture","computeBoundingBox","invWorldMatrix","boundingBox","draw","ctx","renderQueue","hash","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","getPrimitive","getBoneMatrices","getNode","computeBoundingVolume","getBoundingVolume","onDispose","_defaultMaterial","LambertMaterial"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAMA,QAAAA,GAAWC,cAAeC,CAAAA,WAAAA,CAAYC,SAAWC,EAAAA,aAAAA,CAAAA,CAAAA,EAAAA;AAKvD;;;IAIO,MAAMC,IAAaL,SAAAA,QAAAA,CAAAA;qBAExB,UAA6C;qBAE7C,SAA+C;qBAE/C,WAA+B;qBAE/B,oBAA6D;qBAE7D,oBAAsD;qBAEtD,aAAgC;qBAEhC,aAAyC;qBAEzC,UAA0C;qBAE1C,UAA0C;qBAE1C,WAA+B;qBAE/B,aAA0C;qBAE1C,UAA8B;qBAE9B,WAAkC;qBAElC,gBAAoC;qBAEpC,aAAgE;qBAEhE,gBAAoC;qBAEpC,kBAA+C;qBAE/C,mBAAgD;qBAEhD,oBAAwD;AACxD;;;AAGC,MACD,YAAYM,KAAY,EAAEC,SAAqB,EAAEC,QAAuB,CAAE;AACxE,QAAA,KAAK,CAACF,KAAAA,CAAAA;QACN,IAAI,CAACG,UAAU,GAAG,IAAIC,IAAAA,EAAAA;QACtB,IAAI,CAACC,SAAS,GAAG,IAAID,IAAAA,EAAAA;QACrB,IAAI,CAACE,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,oBAAoB,GAAG,IAAA;QAC5B,IAAI,CAACC,oBAAoB,GAAG,IAAA;QAC5B,IAAI,CAACC,aAAa,GAAG,IAAIL,IAAAA,EAAAA;QACzB,IAAI,CAACM,UAAU,GAAG,IAAA;QAClB,IAAI,CAACC,UAAU,GAAG,IAAA;QAClB,IAAI,CAACC,WAAW,GAAG,KAAA;QACnB,IAAI,CAACC,aAAa,GAAG,IAAA;QACrB,IAAI,CAACC,WAAW,GAAG;AAAEC,YAAAA,IAAAA,EAAM;AAAK,SAAA;AAChC,QAAA,IAAI,CAACC,UAAU,GAAGC,SAAAA,EAAAA,CAAYC,IAAI,KAAK,OAAA;QACvC,IAAI,CAACjB,SAAS,GAAGA,SAAa,IAAA,IAAA;AAC9B,QAAA,IAAI,CAACC,QAAQ,GAAGA,QAAAA,IAAYH,KAAKoB,mBAAmB,EAAA;QACpD,IAAI,CAACC,gBAAgB,GAAG,KAAA;QACxB,IAAI,CAACC,aAAa,GAAG,EAAA;QACrB,IAAI,CAACC,aAAa,GAAG,EAAC;QACtB,IAAI,CAACC,gBAAgB,GAAG,IAAA;QACxB,IAAI,CAACC,kBAAkB,GAAG,IAAA;QAC1B,IAAI,CAACC,mBAAmB,GAAG,IAAA;QAC3B,IAAI,CAACC,oBAAoB,GAAG,IAAIC,GAAAA,EAAAA;AAClC;AACA;;MAGAC,aAAAA,CAAcC,WAAuB,EAAE;QACrC,OAAO,CAAA,EAAG,IAAI,CAAChB,aAAa,CAAC,CAAC,EAAE,IAAI,CAACiB,cAAc,IAAI,CAAG,CAAA,CAAA;AAC5D;AACA;;AAEC,MACDC,mBAAsB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC1B,SAAS,CAAC2B,GAAG,GAAIC,iBAAiB;AAChD;AACA;;AAEC,MACDC,aAAgB,GAAA;QACd,OAAO,IAAI,CAACpB,WAAW;AACzB;IACAqB,aAAcpB,CAAAA,IAAe,EAAEqB,KAAc,EAAE;QAC7C,IAAI,CAACtB,WAAW,GAAG;AAAEC,YAAAA,IAAAA;AAAMqB,YAAAA;AAAM,SAAA;AACnC;AACA,IAAA,IAAIC,YAAe,GAAA;QACjB,OAAO,IAAI,CAAChB,aAAa;AAC3B;IACA,IAAIgB,YAAAA,CAAaC,IAAI,EAAE;AACrB,QAAA,IAAIA,IAAS,KAAA,IAAI,CAACjB,aAAa,EAAE;YAC/B,IAAI,CAACA,aAAa,GAAGiB,IAAAA;AACrB,YAAA,IAAI,CAACC,mBAAmB,EAAA;AAC1B;AACF;qBAEA,IAAIC,mBAAsB,GAAA;QACxB,OAAO,IAAI,CAACjC,oBAAoB;AAClC;qBAEA,IAAIkC,eAAkB,GAAA;QACpB,OAAO,IAAI,CAACrB,gBAAgB;AAC9B;AACA,qBACA,IAAIqB,eAAgBC,CAAAA,GAAG,EAAE;AACvB,QAAA,IAAI,CAACtB,gBAAgB,GAAG,CAAC,CAACsB,GAAAA;AAC5B;8CAEA,IAAIC,UAAa,GAAA;QACf,OAAO,IAAI,CAACrC,WAAW;AACzB;IACA,IAAIqC,UAAAA,CAAWC,CAAC,EAAE;QAChB,IAAI,CAACtC,WAAW,GAAGsC,CAAAA;AACrB;iCAEA,IAAI3C,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAACE,UAAU,EAAE6B,GAAS,EAAA,IAAA,IAAA;AACnC;IACA,IAAI/B,SAAAA,CAAU4C,IAAI,EAAE;AAClB,QAAA,MAAMC,gBAAmB,GAAA,IAAI,CAAC3C,UAAU,CAAC6B,GAAG,EAAA;AAC5C,QAAA,IAAIa,SAASC,gBAAkB,EAAA;AAC7B,YAAA,IAAIA,gBAAkB,EAAA;AACpBA,gBAAAA,gBAAAA,CAAiBC,GAAG,CAAC,YAAA,EAAc,IAAI,CAACC,oBAAoB,EAAE,IAAI,CAAA;AACpE;AACA,YAAA,IAAI,CAAC7C,UAAU,CAAC8C,GAAG,CAACJ,IAAAA,CAAAA;AACpB,YAAA,IAAIA,IAAM,EAAA;AACRA,gBAAAA,IAAAA,CAAKK,EAAE,CAAC,YAAA,EAAc,IAAI,CAACF,oBAAoB,EAAE,IAAI,CAAA;AACvD;AACA,YAAA,IAAI,CAACnC,aAAa,GAChBgC,QAAQ,IAAI,CAACxC,SAAS,CAAC2B,GAAG,EACtB,GAAA,CAAA,EAAG,IAAI,CAAC,WAAW,CAACM,IAAI,CAAC,CAAC,EAAE,IAAI,CAACa,MAAM,CAAEC,EAAE,CAAC,CAAC,EAAEP,IAAAA,CAAKO,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC/C,SAAS,CAAC2B,GAAG,EAAIqB,CAAAA,UAAU,EAAE,GAC5F,IAAA;AACN,YAAA,IAAI,CAACC,wBAAwB,EAAA;YAC7BC,mBAAoBC,CAAAA,eAAe,CAAC,IAAI,CAAA;YACxC,IAAI,CAAC/B,mBAAmB,GAAG,IAAA;YAC3B,IAAI,CAACgC,aAAa,CAAC,mBAAqBZ,EAAAA,IAAAA,CAAAA;AAC1C;AACF;gCAEA,IAAI3C,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACG,SAAS,EAAE2B,GAAS,EAAA,IAAA,IAAA;AAClC;IACA,IAAI9B,QAAAA,CAASwD,CAAC,EAAE;AACd,QAAA,IAAI,IAAI,CAACrD,SAAS,CAAC2B,GAAG,OAAO0B,CAAG,EAAA;AAC9B,YAAA,IAAI,CAACrD,SAAS,CAAC4C,GAAG,CAACS,CAAAA,CAAAA;AACnB,YAAA,IAAIA,CAAG,EAAA;AACLH,gBAAAA,mBAAAA,CAAoBI,gBAAgB,CAACD,CAAEE,CAAAA,YAAY,EAAE,IAAI,CAAA;AAC3D;AACA,YAAA,IAAI,CAAC/C,aAAa,GAChB,IAAI,CAACV,UAAU,CAAC6B,GAAG,EAAA,IAAM0B,CACrB,GAAA,CAAA,EAAG,IAAI,CAAC,WAAW,CAACpB,IAAI,CAAC,CAAC,EAAE,IAAI,CAACa,MAAM,EAAEC,EAAM,IAAA,CAAA,CAAE,CAAC,EAAE,IAAI,CAACjD,UAAU,CAAC6B,GAAG,EAAA,CAAIoB,EAAE,CAAC,CAAC,EAAEM,CAAEL,CAAAA,UAAU,EAAE,GAC/F,IAAA;YACNE,mBAAoBC,CAAAA,eAAe,CAAC,IAAI,CAAA;YACxC,IAAI,CAAChC,kBAAkB,GAAG,IAAA;YAC1B,IAAI,CAACiC,aAAa,CAAC,kBAAoBC,EAAAA,CAAAA,CAAAA;AACzC;AACF;AACA;;AAEC,MACDG,MAAuB,GAAA;QACrB,OAAO,IAAA;AACT;AACA;;;MAIAC,sBAAAA,CAAuBC,IAA2B,EAAE;QAClD,IAAI,CAACvD,oBAAoB,GAAGuD,IAAAA;AAC5B,QAAA,IAAI,CAACT,wBAAwB,EAAA;AAC/B;AACA;;AAEC,MACDU,sBAAyB,GAAA;QACvB,OAAO,IAAI,CAACxD,oBAAoB,IAAI,IAAA;AACtC;AACA;;;MAIAyD,eAAAA,CAAgBC,QAA6B,EAAE;AAC7C,QAAA,IAAI,IAAI,CAACzD,aAAa,CAACuB,GAAG,OAAOkC,QAAU,EAAA;AACzC,YAAA,IAAI,CAACzD,aAAa,CAACwC,GAAG,CAACiB,QAAAA,CAAAA;YACvB,IAAI,CAAC5C,aAAa,GAAG,EAAC;YACtBiC,mBAAoBC,CAAAA,eAAe,CAAC,IAAI,CAAA;AAC1C;AACF;AACA;;;MAIAW,YAAAA,CAAaC,IAAyB,EAAE;AACtC,QAAA,IAAI,CAACA,IAAM,EAAA;YACT,IAAI,IAAI,CAAC1D,UAAU,EAAE;gBACnB,IAAI,CAACA,UAAU,EAAE2D,OAASC,EAAAA,OAAAA,EAAAA;gBAC1B,IAAI,CAAC5D,UAAU,GAAG,IAAA;gBAClB,IAAI,CAACY,aAAa,GAAG,EAAC;gBACtBiC,mBAAoBC,CAAAA,eAAe,CAAC,IAAI,CAAA;AAC1C;SACK,MAAA;AACL,YAAA,IAAI,CAAC,IAAI,CAAC9C,UAAU,EAAE;gBACpB,IAAI,CAACA,UAAU,GAAG;AAChB2D,oBAAAA,OAAAA,EAAS,IAAIjE,IAAAA;AACf,iBAAA;AACF;AACA,YAAA,IAAI,CAACM,UAAU,CAAC6D,KAAK,GAAGH,KAAKG,KAAK;AAClC,YAAA,IAAI,CAAC7D,UAAU,CAAC8D,MAAM,GAAGJ,KAAKI,MAAM;YACpC,IAAI,CAAC9D,UAAU,CAAC0D,IAAI,GAAGA,IAAKA,CAAAA,IAAI,CAACK,KAAK,EAAA;YACtC,IAAIL,IAAAA,CAAKC,OAAO,EAAErC,GAAO,EAAA,EAAA;gBACvB,IAAI,CAACtB,UAAU,CAAC2D,OAAO,CAAEpB,GAAG,CAACmB,IAAAA,CAAKC,OAAO,CAACrC,GAAG,EAAA,CAAA;aACxC,MAAA;gBACL,MAAM0C,GAAAA,GAAMzD,SAAY0D,EAAAA,CAAAA,eAAe,CAAC,SAAA,EAAWP,KAAKG,KAAK,EAAEH,IAAKI,CAAAA,MAAM,EAAE;oBAC1EI,UAAY,EAAA,KAAA;oBACZC,cAAgB,EAAA;wBACdC,SAAW,EAAA,SAAA;wBACXC,SAAW,EAAA,SAAA;wBACXC,SAAW,EAAA;AACb;AACF,iBAAA,CAAA;gBACAN,GAAIO,CAAAA,MAAM,CAACb,IAAAA,CAAKA,IAAI,EAAE,CAAG,EAAA,CAAA,EAAGA,IAAKG,CAAAA,KAAK,EAAEH,IAAAA,CAAKI,MAAM,CAAA;AACnD,gBAAA,IAAI,CAAC9D,UAAU,CAAC2D,OAAO,CAAEpB,GAAG,CAACyB,GAAAA,CAAAA;AAC/B;YACA,IAAI,CAACpD,aAAa,GAAG,EAAC;YACtBiC,mBAAoBC,CAAAA,eAAe,CAAC,IAAI,CAAA;AAC1C;AACF;AACA;;;MAIA0B,sBAAAA,CAAuBC,IAAkC,EAAE;QACzD,IAAI,CAAC5E,oBAAoB,GAAG4E,IAAAA;AAC9B;AACA;;AAEC,MACDC,YAAe,GAAA;QACb,OAAO,IAAI,CAAC1E,UAAU;AACxB;AACA;;;MAIA2E,YAAAA,CAAaF,IAAyB,EAAE;AACtC,QAAA,IAAI,CAACA,IAAM,EAAA;YACT,IAAI,IAAI,CAACxE,UAAU,EAAE;AACnB,gBAAA,IAAI,CAACA,UAAU,CAAC2E,MAAM,EAAEhB,OAAAA,EAAAA;gBACxB,IAAI,CAAC3D,UAAU,GAAG,IAAA;gBAClB,IAAI,CAACW,aAAa,GAAG,EAAC;gBACtBiC,mBAAoBC,CAAAA,eAAe,CAAC,IAAI,CAAA;AAC1C;SACK,MAAA;AACL,YAAA,IAAI,CAAC,IAAI,CAAC7C,UAAU,EAAE;gBACpB,IAAI,CAACA,UAAU,GAAG;AAChB2E,oBAAAA,MAAAA,EAAQ,IAAIlF,IAAAA;AACd,iBAAA;AACF;YACA,IAAI,CAACO,UAAU,CAACyD,IAAI,GAAGe,IAAKf,CAAAA,IAAI,CAACK,KAAK,EAAA;AACtC,YAAA,IAAI,CAAC9D,UAAU,CAAC4E,KAAK,GAAG;AAAE,gBAAA,GAAGJ,KAAKI;AAAM,aAAA;YACxC,IAAIJ,IAAAA,CAAKG,MAAM,EAAEtD,GAAO,EAAA,EAAA;gBACtB,IAAI,CAACrB,UAAU,CAAC2E,MAAM,CAAErC,GAAG,CAACkC,IAAAA,CAAKG,MAAM,CAACtD,GAAG,EAAA,CAAA;aACtC,MAAA;AACL,gBAAA,MAAMwD,UAAa,GAAA,IAAIC,gBAAiB,CAAA,OAAA,EAAS,QAAU,EAAA;AACzD,oBAAA;AACEnD,wBAAAA,IAAAA,EAAMoD,aAAaC,uBAAuB,EAAA;wBAC1CzE,IAAM,EAAA,IAAI0E,gBACR,IAAIC,mBAAAA,CAAoBC,gBAAgBC,OAAO,CAAA,EAC/C,IAAIC,0BAA6BC,GAAAA,4BAAAA;AAErC;AACD,iBAAA,CAAA;AACD,gBAAA,MAAMC,kBAAqBjF,GAAAA,SAAAA,EAAAA,CAAYkF,sBAAsB,CAC3DX,UACA,EAAA;oBACEY,KAAO,EAAA;AACT,iBAAA,EACAjB,KAAKf,IAAI,CAAA;AAEX,gBAAA,IAAI,CAACzD,UAAU,CAAC2E,MAAM,CAAErC,GAAG,CAACiD,kBAAAA,CAAAA;AAC9B;YACA,IAAI,CAACtF,WAAW,GAAG,KAAA;YACnB,IAAI,CAACU,aAAa,GAAG,EAAC;YACtBiC,mBAAoBC,CAAAA,eAAe,CAAC,IAAI,CAAA;AAC1C;AACF;AACA;;AAEC,MACD6C,YAAe,GAAA;QACb,OAAO,IAAI,CAAC1F,UAAU;AACxB;AACA;;;;AAIC,MACD2F,kBAA6B,GAAA;AAC3B,QAAA,OAAO,IAAI,CAAC3F,UAAU,EAAEyD,IAAI,CAAC,EAAE,IAAI,CAAA;AACrC;AACA;;;;;MAMAmC,kBAAAA,CAAmBC,KAAa,EAAoB;AAClD,QAAA,IAAI,IAAI,CAAC7F,UAAU,IAAI6F,SAAS,CAAKA,IAAAA,KAAAA,GAAQ,IAAI,CAAC7F,UAAU,CAACyD,IAAI,CAAC,EAAE,EAAE;YACpE,MAAM9B,IAAAA,GAAOmE,OAAOC,IAAI,CAAC,IAAI,CAAC/F,UAAU,CAAC4E,KAAK,CAAEoB,CAAAA,IAAI,CAAC,CAACC,GAAAA,GAAQ,IAAI,CAACjG,UAAU,CAAE4E,KAAM,CAACqB,GAAAA,CAAI,KAAKJ,KAAAA,CAAAA;AAC/F,YAAA,OAAOlE,IAAQ,IAAA,IAAA;AACjB;QACA,OAAO,IAAA;AACT;AACA;;;;;AAKC,MACDuE,cAAevE,CAAAA,IAAY,EAAEwE,MAAc,EAAE;AAC3C,QAAA,MAAMN,QAAQ,IAAI,CAAC7F,UAAU,EAAE4E,KAAAA,GAAQjD,IAAK,CAAA;AAC5C,QAAA,IAAIkE,KAAUO,KAAAA,SAAAA,IAAaP,KAAS,IAAA,CAAA,IAAKA,KAAQ,GAAA,IAAI,CAAC7F,UAAU,CAAEyD,IAAI,CAAC,CAAA,CAAE,EAAE;YACzE,IAAI,IAAI,CAACzD,UAAU,CAAEyD,IAAI,CAAC,CAAA,GAAIoC,KAAM,CAAA,KAAKM,MAAQ,EAAA;AAC/C,gBAAA,IAAI,CAACnG,UAAU,CAAEyD,IAAI,CAAC,CAAA,GAAIoC,MAAM,GAAGM,MAAAA;gBACnC,IAAI,CAAClG,WAAW,GAAG,IAAA;AACnB,gBAAA,IAAI,CAACZ,KAAK,CAAEgH,eAAe,CAAC,IAAI,CAAA;AAClC;SACK,MAAA;AACLC,YAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAC,aAAa,EAAE5E,IAAAA,CAAK,UAAU,CAAC,CAAA;AAC/C;AACF;AACA;;;;;MAMA6E,cAAAA,CAAe7E,IAAY,EAAU;AACnC,QAAA,MAAMkE,QAAQ,IAAI,CAAC7F,UAAU,EAAE4E,KAAAA,GAAQjD,IAAK,CAAA;AAC5C,QAAA,IAAIkE,KAAUO,KAAAA,SAAAA,IAAaP,KAAS,IAAA,CAAA,IAAKA,KAAQ,GAAA,IAAI,CAAC7F,UAAU,CAAEyD,IAAI,CAAC,CAAA,CAAE,EAAE;AACzE,YAAA,OAAO,IAAI,CAACzD,UAAU,CAAEyD,IAAI,CAAC,IAAIoC,KAAM,CAAA;AACzC;QACA,OAAO,CAAA;AACT;AACA;;;;MAKAY,kBAAAA,CAAmBN,MAAgB,EAAE;AACnC,QAAA,IAAI,IAAI,CAACnG,UAAU,IAAImG,UAAUA,MAAOO,CAAAA,MAAM,IAAI,IAAI,CAAC1G,UAAU,CAACyD,IAAI,CAAC,EAAE,EAAE;AACzE,YAAA,IAAI,CAACzD,UAAU,CAACyD,IAAI,CAACnB,GAAG,CAAC6D,MAAQ,EAAA,CAAA,CAAA;YACjC,IAAI,CAAClG,WAAW,GAAG,IAAA;AACnB,YAAA,IAAI,CAACZ,KAAK,CAAEgH,eAAe,CAAC,IAAI,CAAA;AAClC;AACF;AACA,0CACA/B,MAAOqC,CAAAA,OAAe,EAAEC,gBAAwB,EAAEC,cAAsB,EAAE;QACxE,KAAK,CAACvC,MAAOqC,CAAAA,OAAAA,EAASC,gBAAkBC,EAAAA,cAAAA,CAAAA;AACxC,QAAA,IAAI,CAACjF,mBAAmB,EAAA;AACxB,QAAA,IAAI,CAACkF,gBAAgB,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC/F,oBAAoB,CAACgG,IAAI,GAAG,CAAG,EAAA;AACtC,YAAA,KAAK,MAAMC,QAAAA,IAAY,IAAI,CAACjG,oBAAoB,CAAE;AAChDiG,gBAAAA,QAAAA,CAASL,SAASC,gBAAkBC,EAAAA,cAAAA,CAAAA;AACtC;AACF;AACF;qBAEAI,qBAAsBD,CAAAA,QAA4B,EAAE;AAClD,QAAA,IAAIA,QAAU,EAAA;AACZ,YAAA,IAAI,CAACjG,oBAAoB,CAACmG,GAAG,CAACF,QAAAA,CAAAA;AAChC;AACF;qBAEAG,wBAAyBH,CAAAA,QAA4B,EAAE;AACrD,QAAA,IAAIA,QAAU,EAAA;AACZ,YAAA,IAAI,CAACjG,oBAAoB,CAACqG,MAAM,CAACJ,QAAAA,CAAAA;AACnC;AACF;AACA;;AAEC,MACDK,WAAqC,GAAA;QACnC,OACE,IAAI,CAAChH,UAAU,IACf,CAAC,IAAI,CAACP,aAAa,CAACuB,GAAG,EACvB,IAAA,CAAC,IAAI,CAACtB,UAAU,KACf,IAAI,CAACL,SAAS,CAAC2B,GAAG,EAAIgG,EAAAA,WAAAA,EAAAA,IAAiB,KAAI,CAAA;AAEhD;AACA;;AAEC,MACDC,YAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC/H,QAAQ,EAAE+H,YAAkBC,EAAAA,IAAAA,YAAAA;AAC1C;AACA;;AAEC,MACDC,OAAU,GAAA;AACR,QAAA,OAAO,CAAC,IAAI,CAACjI,QAAQ,EAAEkI,eAAAA,EAAAA;AACzB;AACA;;AAEC,MACDC,cAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAACnI,QAAQ,EAAEmI,cAAoB,EAAA,IAAA,KAAA;AAC5C;AACA;;AAEC,MACDC,cAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAACpI,QAAQ,EAAEoI,cAAoB,EAAA,IAAA,KAAA;AAC5C;qBAEA,gBAA2B,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC3H,UAAU,IAAI,IAAI,CAACC,WAAW,EAAE;AACvCqG,YAAAA,OAAAA,CAAQsB,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC5H,UAAU,CAACyD,IAAI,CAAC,EAAA,CAAG,CAAE,CAAA,CAAA;YAClD,IAAI,CAACzD,UAAU,CAAC2E,MAAM,CAAEtD,GAAG,EAAIwG,CAAAA,aAAa,CAAC,CAAA,GAAI,CAAG,EAAA,IAAI,CAAC7H,UAAU,CAACyD,IAAI,EAAE,CAAG,EAAA,IAAI,CAACzD,UAAU,CAACyD,IAAI,CAAC,CAAE,CAAA,CAAA;YACpG,IAAI,CAACxD,WAAW,GAAG,KAAA;AACrB;AACF;qBAEA,mBAA8B,GAAA;QAC5B,IAAI,IAAI,CAACQ,gBAAgB,EAAE;YACzB,IAAI,CAAC6C,eAAe,CAAC,IAAA,CAAA;YACrB,IAAI,CAACH,sBAAsB,CAAC,IAAA,CAAA;AAC5B,YAAA;AACF;QACA,MAAM2E,QAAAA,GAAW,IAAI,CAACpH,aAAa,IAAI,IAAI,CAACqH,gBAAgB,CAAC,IAAI,CAACrH,aAAa,CAAA;AAC/E,QAAA,IAAIoH,QAAU,EAAA;AACZ,YAAA,IAAI,CAACxE,eAAe,CAACwE,QAAAA,CAASE,YAAY,CAAA;YAC1CF,QAASG,CAAAA,kBAAkB,CAAC,IAAI,CAACrI,oBAAoB,EAAG,IAAI,CAACsI,cAAc,CAAA;AAC3E,YAAA,IAAI,CAAC/E,sBAAsB,CAAC,IAAI,CAACvD,oBAAoB,CAAEuI,WAAW,CAAA;SAC7D,MAAA;YACL,IAAI,CAAC7E,eAAe,CAAC,IAAA,CAAA;YACrB,IAAI,CAACH,sBAAsB,CAAC,IAAA,CAAA;AAC9B;QACA,IAAI,IAAI,CAACzC,aAAa,EAAE;AACtB,YAAA,IAAI,CAACrB,KAAK,CAAEgH,eAAe,CAAC,IAAI,CAAA;AAClC;AACF;AACA;;AAEC,MACD+B,KAAKC,GAAgB,EAAEC,WAAkC,EAAEC,IAAa,EAAE;QACxE,MAAMhJ,QAAAA,GAAW,IAAI,CAACA,QAAQ;QAC9B,MAAMD,SAAAA,GAAY,IAAI,CAACA,SAAS;AAChC,QAAA,IAAIC,YAAYD,SAAW,EAAA;YACzB,IAAI,IAAI,CAACsB,gBAAgB,IAAI,CAACyH,GAAIG,CAAAA,YAAY,IAAID,IAAM,EAAA;AACtD,gBAAA,IACE,IAAI,CAACzH,mBAAmB,KAAKxB,SAAUmJ,CAAAA,SAAS,IAChD,IAAI,CAAC5H,kBAAkB,KAAKtB,QAAAA,CAASkJ,SAAS,EAC9C;oBACA,IAAI,CAAC9H,aAAa,GAAG,EAAC;AACtB,oBAAA,IAAI,CAACG,mBAAmB,GAAGxB,SAAAA,CAAUmJ,SAAS;AAC9C,oBAAA,IAAI,CAAC5H,kBAAkB,GAAGtB,QAAAA,CAASkJ,SAAS;AAC9C;AACA,gBAAA,MAAMC,eAAe,IAAI,CAAC/H,aAAc,CAAC4H,IAAK,CAAA;AAC9C,gBAAA,IAAI,CAACG,YAAc,EAAA;oBACjBL,GAAIM,CAAAA,MAAM,CAACC,YAAY,EAAA;oBACvB,IAAI,CAACC,IAAI,CAACR,GAAKC,EAAAA,WAAAA,CAAAA;oBACf/I,QAAS6I,CAAAA,IAAI,CAAC9I,SAAW+I,EAAAA,GAAAA,CAAAA;oBACzB,IAAI,CAAC1H,aAAa,CAAE4H,KAAK,GAAGF,GAAAA,CAAIM,MAAM,CAACG,UAAU,EAAA;iBAC5C,MAAA;oBACLT,GAAIM,CAAAA,MAAM,CAACI,mBAAmB,CAACL,YAAAA,CAAAA;AACjC;aACK,MAAA;gBACL,IAAI,CAACG,IAAI,CAACR,GAAKC,EAAAA,WAAAA,CAAAA;gBACf/I,QAAS6I,CAAAA,IAAI,CAAC9I,SAAW+I,EAAAA,GAAAA,CAAAA;AAC3B;AACF;AACF;AACA;;AAEC,MACDW,WAAc,GAAA;QACZ,OAAO,IAAI,CAACzJ,QAAQ;AACtB;AACA;;AAEC,MACD0J,YAAe,GAAA;QACb,OAAO,IAAI,CAAC3J,SAAS;AACvB;AACA;;AAEC,MACD4J,eAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAACpJ,aAAa,CAACuB,GAAG,EAAA;AAC/B;AACA;;AAEC,MACD8H,OAAU,GAAA;;AAER,QAAA,OAAO,IAAI;AACb;AACA,qBACAC,qBAAwB,GAAA;QACtB,IAAIhG,IAAAA;QACJ,IAAI,IAAI,CAACvD,oBAAoB,EAAE;YAC7BuD,IAAO,GAAA,IAAI,CAACvD,oBAAoB;SAC3B,MAAA;AACLuD,YAAAA,IAAAA,GAAO,IAAI,CAAC5D,UAAU,CAAC6B,GAAG,IAAIgI,iBAAuB,EAAA,IAAA,IAAA;AACvD;QACA,OAAOjG,IAAAA;AACT;kCAEA,SAAsB,GAAA;AACpB,QAAA,KAAK,CAACkG,SAAAA,EAAAA;QACN,IAAI,CAAC9J,UAAU,CAAC6B,GAAG,EAAA,EAAIe,GAAI,CAAA,YAAA,EAAc,IAAI,CAACC,oBAAoB,EAAE,IAAI,CAAA;QACxE,IAAI,CAAC7C,UAAU,CAACmE,OAAO,EAAA;QACvB,IAAI,CAACjE,SAAS,CAACiE,OAAO,EAAA;QACtB,IAAI,CAAC7D,aAAa,CAAC6D,OAAO,EAAA;QAC1B,IAAI,CAACH,YAAY,CAAC,IAAA,CAAA;QAClB,IAAI,CAACkB,YAAY,CAAC,IAAA,CAAA;QAClB,IAAI,CAAC/D,aAAa,GAAG,IAAA;QACrBiC,mBAAoBC,CAAAA,eAAe,CAAC,IAAI,CAAA;AAC1C;qBAEA,oBAA+B,GAAA;AAC7B,QAAA,IAAI,CAACF,wBAAwB,EAAA;AAC/B;qBAEA,OAAe4G,gBAAAA,GAA2C,IAAK;qBAE/D,OAAe/I,mBAAsB,GAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC+I,gBAAgB,EAAE;YAC1B,IAAI,CAACA,gBAAgB,GAAG,IAAIC,eAAAA,EAAAA;AAC9B;QACA,OAAO,IAAI,CAACD,gBAAgB;AAC9B;AACF;;;;"}
1
+ {"version":3,"file":"mesh.js","sources":["../../src/scene/mesh.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, castObservable, DRef } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type { MeshMaterial } from '../material';\r\nimport { LambertMaterial, ShaderHelper } from '../material';\r\nimport type {\r\n RenderPass,\r\n Primitive,\r\n BatchDrawable,\r\n DrawContext,\r\n PickTarget,\r\n MorphData,\r\n MorphInfo,\r\n RenderQueue\r\n} from '../render';\r\nimport {\r\n PBArrayTypeInfo,\r\n PBPrimitiveType,\r\n PBPrimitiveTypeInfo,\r\n PBStructTypeInfo,\r\n type RenderBundle,\r\n type Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox, type BoundingVolume } from '../utility/bounding_volume';\r\nimport { MORPH_ATTRIBUTE_VECTOR_COUNT, MORPH_WEIGHTS_VECTOR_COUNT, QUEUE_OPAQUE } from '../values';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport type { SceneNode } from './scene_node';\r\nimport { getDevice } from '../app/api';\r\nimport type { SkinnedBoundingBox } from '../animation';\r\nimport { calculateMorphBoundingBox } from '../animation/morphtarget';\r\n\r\n/**\r\n * Callback invoked after a mesh finishes its per-frame update.\r\n *\r\n * @public\r\n */\r\nexport type MeshUpdateCallback = (frameId: number, elapsedInSeconds: number, deltaInSeconds: number) => void;\r\n\r\n/**\r\n * Bounding data used to update a mesh's local bounding box after morph target weights change.\r\n *\r\n * @public\r\n */\r\nexport interface MorphBoundingInfo {\r\n targetBoxes: BoundingBox[];\r\n originBox: BoundingBox;\r\n}\r\n\r\nconst MeshBase = castObservable(applyMixins(GraphNode, mixinDrawable))<{\r\n primitive_changed: [primitive: Nullable<Primitive>];\r\n material_changed: [material: Nullable<MeshMaterial>];\r\n}>();\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class Mesh extends MeshBase implements BatchDrawable {\r\n /** @internal */\r\n private readonly _primitive: DRef<Primitive>;\r\n /** @internal */\r\n private readonly _material: DRef<MeshMaterial>;\r\n /** @internal */\r\n protected _castShadow: boolean;\r\n /** @internal */\r\n protected _skinnedBoundingInfo: Nullable<SkinnedBoundingBox>;\r\n /** @internal */\r\n protected _animatedBoundingBox: Nullable<BoundingBox>;\r\n /** @internal */\r\n protected _skinBindingName: string;\r\n /** @internal */\r\n protected _boneMatrices: DRef<Texture2D>;\r\n /** @internal */\r\n protected _morphData: Nullable<MorphData>;\r\n /** @internal */\r\n protected _morphInfo: Nullable<MorphInfo>;\r\n /** @internal */\r\n protected _morphBoundingInfo: Nullable<MorphBoundingInfo>;\r\n /** @internal */\r\n protected _morphDirty: boolean;\r\n /** @internal */\r\n protected _instanceHash: Nullable<string>;\r\n /** @internal */\r\n protected _batchable: boolean;\r\n /** @internal */\r\n protected _pickTarget: PickTarget;\r\n /** @internal */\r\n protected _suspendSkinning: boolean;\r\n /** @internal */\r\n protected _renderBundle: Nullable<Record<string, RenderBundle>>;\r\n /** @internal */\r\n protected _useRenderBundle: boolean;\r\n /** @internal */\r\n protected _materialChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _primitiveChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _postUpdateCallbacks: Set<MeshUpdateCallback>;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene, primitive?: Primitive, material?: MeshMaterial) {\r\n super(scene);\r\n this._primitive = new DRef();\r\n this._material = new DRef();\r\n this._castShadow = true;\r\n this._skinnedBoundingInfo = null;\r\n this._animatedBoundingBox = null;\r\n this._boneMatrices = new DRef();\r\n this._morphData = null;\r\n this._morphInfo = null;\r\n this._morphBoundingInfo = null;\r\n this._morphDirty = false;\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = getDevice().type !== 'webgl';\r\n this.primitive = primitive ?? null;\r\n this.material = material ?? Mesh._getDefaultMaterial();\r\n this._suspendSkinning = false;\r\n this._skinBindingName = '';\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\r\n this._primitiveChangeTag = null;\r\n this._postUpdateCallbacks = new Set();\r\n }\r\n /**\r\n * Returns the batch instance ID for the current render pass.\r\n */\r\n getInstanceId(_renderPass: RenderPass) {\r\n return `${this._instanceHash}:${this.worldMatrixDet >= 0}`;\r\n }\r\n /**\r\n * Returns the packed instance-uniform buffer used for batching.\r\n */\r\n getInstanceUniforms() {\r\n return this._material.get()!.$instanceUniforms;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n setPickTarget(node: SceneNode, label?: string) {\r\n this._pickTarget = { node, label };\r\n }\r\n get skeletonName() {\r\n return this._skinBindingName;\r\n }\r\n set skeletonName(name) {\r\n this.skinBindingName = name;\r\n }\r\n get skinBindingName() {\r\n return this._skinBindingName;\r\n }\r\n set skinBindingName(name) {\r\n if (name !== this._skinBindingName) {\r\n this._skinBindingName = name;\r\n this.updateSkeletonState();\r\n }\r\n }\r\n /** @internal */\r\n get skinnedBoundingInfo() {\r\n return this._skinnedBoundingInfo;\r\n }\r\n /** @internal */\r\n get suspendSkinning() {\r\n return this._suspendSkinning;\r\n }\r\n /** @internal */\r\n set suspendSkinning(val) {\r\n this._suspendSkinning = !!val;\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(b) {\r\n this._castShadow = b;\r\n }\r\n /** Primitive of the mesh */\r\n get primitive() {\r\n return this._primitive?.get() ?? null;\r\n }\r\n set primitive(prim) {\r\n const currentPrimitive = this._primitive.get();\r\n if (prim !== currentPrimitive) {\r\n if (currentPrimitive) {\r\n currentPrimitive.off('bv_changed', this._onBoundingboxChange, this);\r\n }\r\n this._primitive.set(prim);\r\n if (prim) {\r\n prim.on('bv_changed', this._onBoundingboxChange, this);\r\n }\r\n this._instanceHash =\r\n prim && this._material.get()\r\n ? `${this.constructor.name}:${this._scene!.id}:${prim.id}:${this._material.get()!.instanceId}`\r\n : null;\r\n this.invalidateBoundingVolume();\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._primitiveChangeTag = null;\r\n this.dispatchEvent('primitive_changed', prim);\r\n }\r\n }\r\n /** Material of the mesh */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m) {\r\n this._material.set(m);\r\n if (m) {\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash =\r\n this._primitive.get() && m\r\n ? `${this.constructor.name}:${this._scene?.id ?? 0}:${this._primitive.get()!.id}:${m.instanceId}`\r\n : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n this.dispatchEvent('material_changed', m);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isMesh}\r\n */\r\n isMesh(): this is Mesh {\r\n return true;\r\n }\r\n /**\r\n * Sets the bounding box for animation\r\n * @param bbox - The bounding box for animation\r\n */\r\n setAnimatedBoundingBox(bbox: Nullable<BoundingBox>) {\r\n this._animatedBoundingBox = bbox;\r\n this.invalidateBoundingVolume();\r\n }\r\n /**\r\n * Gets the bounding box for animation\r\n */\r\n getAnimatedBoundingBox() {\r\n return this._animatedBoundingBox ?? null;\r\n }\r\n /**\r\n * Sets morph target bounding data used to update the animated bounding box when weights change.\r\n * @param info - Morph target bounding data\r\n */\r\n setMorphBoundingInfo(info: Nullable<MorphBoundingInfo>) {\r\n this._morphBoundingInfo = info\r\n ? {\r\n targetBoxes: info.targetBoxes.map((box) => box.clone()),\r\n originBox: info.originBox.clone()\r\n }\r\n : null;\r\n this.updateMorphBoundingBox();\r\n }\r\n /**\r\n * Gets morph target bounding data.\r\n */\r\n getMorphBoundingInfo() {\r\n return this._morphBoundingInfo;\r\n }\r\n /**\r\n * Sets the texture that contains the bone matrices for skeletal animation\r\n * @param matrices - The texture that contains the bone matrices\r\n */\r\n setBoneMatrices(matrices: Nullable<Texture2D>) {\r\n if (this._boneMatrices.get() !== matrices) {\r\n this._boneMatrices.set(matrices);\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * Sets the texture that contains the morph target data\r\n * @param data - The texture that contains the morph target data\r\n */\r\n setMorphData(data: Nullable<MorphData>) {\r\n if (!data) {\r\n if (this._morphData) {\r\n this._morphData?.texture?.dispose();\r\n this._morphData = null;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n } else {\r\n if (!this._morphData) {\r\n this._morphData = {\r\n texture: new DRef()\r\n } as MorphData;\r\n }\r\n this._morphData.width = data.width;\r\n this._morphData.height = data.height;\r\n this._morphData.data = data.data.slice();\r\n if (data.texture?.get()) {\r\n this._morphData.texture!.set(data.texture.get());\r\n } else {\r\n const tex = getDevice().createTexture2D('rgba32f', data.width, data.height, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n tex.update(data.data, 0, 0, data.width, data.height);\r\n this._morphData.texture!.set(tex);\r\n }\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * Sets the skinned bounding info\r\n * @param info - The skinned bounding info\r\n */\r\n setSkinnedBoundingInfo(info: Nullable<SkinnedBoundingBox>) {\r\n this._skinnedBoundingInfo = info;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return this._morphData;\r\n }\r\n /**\r\n * Sets the buffer that contains the morph target information\r\n * @param info - The buffer that contains the morph target information\r\n */\r\n setMorphInfo(info: Nullable<MorphInfo>) {\r\n if (!info) {\r\n if (this._morphInfo) {\r\n this._morphInfo.buffer?.dispose();\r\n this._morphInfo = null;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n } else {\r\n if (!this._morphInfo) {\r\n this._morphInfo = {\r\n buffer: new DRef()\r\n } as MorphInfo;\r\n }\r\n this._morphInfo.data = info.data.slice();\r\n this._morphInfo.names = { ...info.names };\r\n if (info.buffer?.get()) {\r\n this._morphInfo.buffer!.set(info.buffer.get());\r\n } else {\r\n const bufferType = new PBStructTypeInfo('dummy', 'std140', [\r\n {\r\n name: ShaderHelper.getMorphInfoUniformName(),\r\n type: new PBArrayTypeInfo(\r\n new PBPrimitiveTypeInfo(PBPrimitiveType.F32VEC4),\r\n 1 + MORPH_WEIGHTS_VECTOR_COUNT + MORPH_ATTRIBUTE_VECTOR_COUNT\r\n )\r\n }\r\n ]);\r\n const morphUniformBuffer = getDevice().createStructuredBuffer(\r\n bufferType,\r\n {\r\n usage: 'uniform'\r\n },\r\n info.data\r\n );\r\n this._morphInfo.buffer!.set(morphUniformBuffer);\r\n }\r\n this._morphDirty = false;\r\n this.updateMorphBoundingBox();\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return this._morphInfo;\r\n }\r\n /**\r\n * Get the number of morph targets\r\n *\r\n * @returns The number of morph targets\r\n */\r\n getNumMorphTargets(): number {\r\n return this._morphInfo?.data[3] ?? 0;\r\n }\r\n /**\r\n * Get the name of the morph target by index\r\n *\r\n * @param index - The index of the morph target\r\n * @returns The name of the morph target, or null if not found\r\n */\r\n getMorphTargetName(index: number): Nullable<string> {\r\n if (this._morphInfo && index >= 0 && index < this._morphInfo.data[3]) {\r\n const name = Object.keys(this._morphInfo.names).find((key) => this._morphInfo!.names![key] === index);\r\n return name ?? null;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get the index of the morph target by name\r\n * @param name - The name of the morph target\r\n * @returns The index of the morph target, or -1 if not found\r\n */\r\n getMorphTargetIndexByName(name: string): number {\r\n return this._morphInfo?.names?.[name] ?? -1;\r\n }\r\n /**\r\n * Update morph target weight\r\n *\r\n * @param name - The name of the morph target\r\n * @param weight - The weight of the morph target\r\n */\r\n setMorphWeight(name: string, weight: number) {\r\n const index = this.getMorphTargetIndexByName(name);\r\n if (index >= 0) {\r\n this.setMorphWeightByIndex(index, weight);\r\n }\r\n }\r\n /**\r\n * Update morph target weight by index\r\n *\r\n * @param index - The index of the morph target\r\n * @param weight - The weight of the morph target\r\n */\r\n setMorphWeightByIndex(index: number, weight: number) {\r\n if (index >= 0 && index < this._morphInfo!.data[3]) {\r\n if (this._morphInfo!.data[4 + index] !== weight) {\r\n this._morphInfo!.data[4 + index] = weight;\r\n this._morphDirty = true;\r\n this.updateMorphBoundingBox();\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n } else {\r\n console.warn(`Morph target index out of range: ${index}`);\r\n }\r\n }\r\n /**\r\n * Get morph target weight\r\n *\r\n * @param name - The name of the morph target\r\n * @returns The weight of the morph target, or 0 if not found\r\n */\r\n getMorphWeight(name: string): number {\r\n const index = this._morphInfo?.names?.[name];\r\n if (index !== undefined && index >= 0 && index < this._morphInfo!.data[3]) {\r\n return this._morphInfo!.data[4 + index];\r\n }\r\n return 0;\r\n }\r\n /**\r\n * Update morph target weights\r\n *\r\n * @param weight - The morph target weights. The length must not exceed the mesh's morph target count.\r\n */\r\n updateMorphWeights(weight: number[]) {\r\n if (this._morphInfo && weight && weight.length <= this._morphInfo.data[3]) {\r\n this._morphInfo.data.set(weight, 4);\r\n this._morphDirty = true;\r\n this.updateMorphBoundingBox();\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.update} */\r\n update(frameId: number, elapsedInSeconds: number, deltaInSeconds: number) {\r\n super.update(frameId, elapsedInSeconds, deltaInSeconds);\r\n this.updateSkeletonState();\r\n this.updateMorphState();\r\n if (this._postUpdateCallbacks.size > 0) {\r\n for (const callback of this._postUpdateCallbacks) {\r\n callback(frameId, elapsedInSeconds, deltaInSeconds);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n addPostUpdateCallback(callback: MeshUpdateCallback) {\r\n if (callback) {\r\n this._postUpdateCallbacks.add(callback);\r\n }\r\n }\r\n /** @internal */\r\n removePostUpdateCallback(callback: MeshUpdateCallback) {\r\n if (callback) {\r\n this._postUpdateCallbacks.delete(callback);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return (\r\n this._batchable &&\r\n !this._boneMatrices.get() &&\r\n !this._morphData &&\r\n (this._material.get()?.isBatchable() ?? false)\r\n );\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this.material?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth() ?? false;\r\n }\r\n /** @internal */\r\n private updateMorphBoundingBox() {\r\n if (!this._morphInfo || !this._morphBoundingInfo) {\r\n return;\r\n }\r\n const numTargets = Math.min(this._morphInfo.data[3], this._morphBoundingInfo.targetBoxes.length);\r\n if (numTargets <= 0) {\r\n return;\r\n }\r\n const weights =\r\n this._morphInfo.data instanceof Float32Array\r\n ? this._morphInfo.data.subarray(4, 4 + numTargets)\r\n : new Float32Array(Array.from(this._morphInfo.data.subarray(4, 4 + numTargets)));\r\n const bbox = new BoundingBox();\r\n calculateMorphBoundingBox(bbox, this._morphBoundingInfo.targetBoxes, weights, numTargets);\r\n bbox.minPoint.addBy(this._morphBoundingInfo.originBox.minPoint);\r\n bbox.maxPoint.addBy(this._morphBoundingInfo.originBox.maxPoint);\r\n this.setAnimatedBoundingBox(bbox);\r\n }\r\n /** @internal */\r\n private updateMorphState() {\r\n if (this._morphInfo && this._morphDirty) {\r\n this._morphInfo.buffer!.get()!.bufferSubData(4 * 4, this._morphInfo.data, 4, this._morphInfo.data[3]);\r\n this.updateMorphBoundingBox();\r\n this._morphDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private updateSkeletonState() {\r\n if (this._suspendSkinning) {\r\n this.setBoneMatrices(null);\r\n this.setAnimatedBoundingBox(null);\r\n return;\r\n }\r\n const binding = this._skinBindingName && this.findSkinBindingById(this._skinBindingName);\r\n if (binding) {\r\n this.setBoneMatrices(binding.jointTexture);\r\n binding.computeBoundingBox(this._skinnedBoundingInfo!, this.invWorldMatrix);\r\n this.setAnimatedBoundingBox(this._skinnedBoundingInfo!.boundingBox);\r\n } else {\r\n this.setBoneMatrices(null);\r\n if (!this._morphInfo || !this._morphBoundingInfo) {\r\n this.setAnimatedBoundingBox(null);\r\n }\r\n }\r\n if (this._skinBindingName) {\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>, hash?: string) {\r\n const material = this.material;\r\n const primitive = this.primitive;\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (\r\n this._primitiveChangeTag !== primitive.changeTag ||\r\n this._materialChangeTag !== material.changeTag\r\n ) {\r\n this._renderBundle = {};\r\n this._primitiveChangeTag = primitive.changeTag;\r\n this._materialChangeTag = material.changeTag;\r\n }\r\n const renderBundle = this._renderBundle![hash];\r\n if (!renderBundle) {\r\n ctx.device.beginCapture();\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n this._renderBundle![hash] = ctx.device.endCapture();\r\n } else {\r\n ctx.device.executeRenderBundle(renderBundle);\r\n }\r\n } else {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this.material;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return this.primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return this._boneMatrices.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getNode}\r\n */\r\n getNode() {\r\n // mesh transform should be ignored when skinned\r\n return this;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n let bbox: Nullable<BoundingVolume>;\r\n if (this._animatedBoundingBox) {\r\n bbox = this._animatedBoundingBox;\r\n } else {\r\n bbox = this._primitive.get()?.getBoundingVolume() ?? null;\r\n }\r\n return bbox;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._primitive.get()?.off('bv_changed', this._onBoundingboxChange, this);\r\n this._primitive.dispose();\r\n this._material.dispose();\r\n this._boneMatrices.dispose();\r\n this.setMorphData(null);\r\n this.setMorphInfo(null);\r\n this.setMorphBoundingInfo(null);\r\n this._renderBundle = null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n /** @internal */\r\n private _onBoundingboxChange() {\r\n this.invalidateBoundingVolume();\r\n }\r\n /** @internal */\r\n private static _defaultMaterial: Nullable<MeshMaterial> = null;\r\n /** @internal */\r\n private static _getDefaultMaterial() {\r\n if (!this._defaultMaterial) {\r\n this._defaultMaterial = new LambertMaterial();\r\n }\r\n return this._defaultMaterial;\r\n }\r\n}\r\n"],"names":["MeshBase","castObservable","applyMixins","GraphNode","mixinDrawable","Mesh","scene","primitive","material","_primitive","DRef","_material","_castShadow","_skinnedBoundingInfo","_animatedBoundingBox","_boneMatrices","_morphData","_morphInfo","_morphBoundingInfo","_morphDirty","_instanceHash","_pickTarget","node","_batchable","getDevice","type","_getDefaultMaterial","_suspendSkinning","_skinBindingName","_renderBundle","_useRenderBundle","_materialChangeTag","_primitiveChangeTag","_postUpdateCallbacks","Set","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","skeletonName","name","skinBindingName","updateSkeletonState","skinnedBoundingInfo","suspendSkinning","val","castShadow","b","prim","currentPrimitive","off","_onBoundingboxChange","set","on","_scene","id","instanceId","invalidateBoundingVolume","RenderBundleWrapper","drawableChanged","dispatchEvent","m","materialAttached","coreMaterial","isMesh","setAnimatedBoundingBox","bbox","getAnimatedBoundingBox","setMorphBoundingInfo","info","targetBoxes","map","box","clone","originBox","updateMorphBoundingBox","getMorphBoundingInfo","setBoneMatrices","matrices","setMorphData","data","texture","dispose","width","height","slice","tex","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","setSkinnedBoundingInfo","getMorphData","setMorphInfo","buffer","names","bufferType","PBStructTypeInfo","ShaderHelper","getMorphInfoUniformName","PBArrayTypeInfo","PBPrimitiveTypeInfo","PBPrimitiveType","F32VEC4","MORPH_WEIGHTS_VECTOR_COUNT","MORPH_ATTRIBUTE_VECTOR_COUNT","morphUniformBuffer","createStructuredBuffer","usage","getMorphInfo","getNumMorphTargets","getMorphTargetName","index","Object","keys","find","key","getMorphTargetIndexByName","setMorphWeight","weight","setMorphWeightByIndex","queueUpdateNode","console","warn","getMorphWeight","undefined","updateMorphWeights","length","frameId","elapsedInSeconds","deltaInSeconds","updateMorphState","size","callback","addPostUpdateCallback","add","removePostUpdateCallback","delete","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","numTargets","Math","min","weights","Float32Array","subarray","Array","from","BoundingBox","calculateMorphBoundingBox","minPoint","addBy","maxPoint","bufferSubData","binding","findSkinBindingById","jointTexture","computeBoundingBox","invWorldMatrix","boundingBox","draw","ctx","renderQueue","hash","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","getPrimitive","getBoneMatrices","getNode","computeBoundingVolume","getBoundingVolume","onDispose","_defaultMaterial","LambertMaterial"],"mappings":"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"}
@@ -350,6 +350,7 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
350
350
  */ updateEnvLight() {
351
351
  if (this.env.light.type === 'ibl') {
352
352
  this.env.light.radianceMap = this.env.sky.radianceMap;
353
+ this.env.light.sheenRadianceMap = this.env.sky.sheenRadianceMap;
353
354
  this.env.light.irradianceWindow = this.env.sky.shWindowWeights;
354
355
  this.env.light.irradianceSHFB = this.env.sky.irradianceSHFB;
355
356
  this.env.light.irradianceSH = null;
@@ -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\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 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._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 /**\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.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","_scripts","_mainCamera","id","val","mainCamera","camera","rootNode","octree","updateNodePlacement","boundingBox","getRootNode","getBoxLoosed","env","metaData","script","fileName","splice","unshift","ScriptAttachment","scriptConfig","config","value","normalized","normalizeScriptAttachmentConfig","scripts","normalizeScriptAttachments","scriptConfigs","map","item","next","Array","isArray","i","Math","max","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","node","findIndex","DWeakRef","queueUpdateDrawable","drawable","indexOf","queuePerCameraUpdateNode","render","invalidateNodePlacement","add","light","type","radianceMap","sky","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, 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\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 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._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 /**\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","_scripts","_mainCamera","id","val","mainCamera","camera","rootNode","octree","updateNodePlacement","boundingBox","getRootNode","getBoxLoosed","env","metaData","script","fileName","splice","unshift","ScriptAttachment","scriptConfig","config","value","normalized","normalizeScriptAttachmentConfig","scripts","normalizeScriptAttachments","scriptConfigs","map","item","next","Array","isArray","i","Math","max","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","node","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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"}
@@ -3,6 +3,13 @@ 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
+ const sceneMeshAssetBindings = new WeakMap();
7
+ /** @internal */ function setSceneMeshAssetBinding(mesh, binding) {
8
+ sceneMeshAssetBindings.set(mesh, binding);
9
+ }
10
+ /** @internal */ function getSceneMeshAssetBinding(mesh) {
11
+ return sceneMeshAssetBindings.get(mesh) ?? null;
12
+ }
6
13
  /**
7
14
  * The base class of all scene graph objects.
8
15
  *
@@ -39,6 +46,7 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
39
46
  /** @internal Prefab id */ _prefabId;
40
47
  /** @internal Animation set reference. */ _animationSet;
41
48
  /** @internal Optional shared model reference for instancing. */ _sharedModel;
49
+ /** @internal Model-level morph target groups bound to runtime meshes. */ _morphTargetGroups;
42
50
  /** @internal */ _jointTypeT;
43
51
  /** @internal */ _jointTypeS;
44
52
  /** @internal */ _jointTypeR;
@@ -87,6 +95,7 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
87
95
  this._name = '';
88
96
  this._animationSet = new DRef();
89
97
  this._sharedModel = new DRef();
98
+ this._morphTargetGroups = [];
90
99
  this._jointTypeT = 'none';
91
100
  this._jointTypeS = 'none';
92
101
  this._jointTypeR = 'none';
@@ -322,6 +331,12 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
322
331
  set sharedModel(model) {
323
332
  this._sharedModel.set(model);
324
333
  }
334
+ /** Runtime morph target groups bound to this model instance. */ get morphTargetGroups() {
335
+ return this._morphTargetGroups;
336
+ }
337
+ set morphTargetGroups(groups) {
338
+ this._morphTargetGroups = (groups ?? []).filter((group)=>!!group?.name && group.bindings.length > 0);
339
+ }
325
340
  /**
326
341
  * Clone this node.
327
342
  *
@@ -598,6 +613,13 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
598
613
  * @param id - Persistent identifier to match against `Skeleton.persistentId`.
599
614
  * @returns The first matchign node, or `null` if not found.
600
615
  */ findSkeletonById(id) {
616
+ return this.findSkinBindingById(id);
617
+ }
618
+ /**
619
+ * Finds a skin binding by its persistent ID.
620
+ * @param id - Persistent identifier to match against `SkinBinding.persistentId`.
621
+ * @returns The first matching binding, or `null` if not found.
622
+ */ findSkinBindingById(id) {
601
623
  const prefabNode = this.getPrefabNode() ?? this;
602
624
  let sk = null;
603
625
  prefabNode.iterate((node)=>{
@@ -608,6 +630,19 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
608
630
  return sk?.get() ?? null;
609
631
  }
610
632
  /**
633
+ * Finds a shared skeleton rig by its persistent ID.
634
+ * @param id - Persistent identifier to match against `SkeletonRig.persistentId`.
635
+ * @returns The first matching rig, or `null` if not found.
636
+ */ findSkeletonRigById(id) {
637
+ const prefabNode = this.getPrefabNode() ?? this;
638
+ let rig = null;
639
+ prefabNode.iterate((node)=>{
640
+ rig = node.animationSet.rigs.find((s)=>s.get().persistentId === id) ?? null;
641
+ return !!rig;
642
+ });
643
+ return rig?.get() ?? null;
644
+ }
645
+ /**
611
646
  * Finds a scene node by name.
612
647
  *
613
648
  * If multiple nodes share the same name, returns the first match encountered
@@ -645,9 +680,175 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
645
680
  set boundingBoxDrawMode(mode) {
646
681
  this._boxDrawMode = mode;
647
682
  }
648
- invalidateTransform(invalidateLocal = true) {
683
+ /** @internal */ matchesMorphTargetBinding(mesh, binding) {
684
+ const assetBinding = getSceneMeshAssetBinding(mesh);
685
+ if (binding.node && assetBinding?.node !== binding.node) {
686
+ return false;
687
+ }
688
+ if (binding.mesh && binding.mesh !== mesh && assetBinding?.mesh !== binding.mesh) {
689
+ return false;
690
+ }
691
+ return true;
692
+ }
693
+ /** @internal */ applyMorphTargetBindingWeight(mesh, binding, weight) {
694
+ if (!this.matchesMorphTargetBinding(mesh, binding)) {
695
+ return;
696
+ }
697
+ const targetWeight = weight * binding.weight;
698
+ const targetIndex = binding.targetIndex;
699
+ if (typeof targetIndex === 'number' && targetIndex >= 0 && targetIndex < mesh.getNumMorphTargets()) {
700
+ mesh.setMorphWeightByIndex(targetIndex, targetWeight);
701
+ return;
702
+ }
703
+ if (binding.targetName) {
704
+ mesh.setMorphWeight(binding.targetName, targetWeight);
705
+ }
706
+ }
707
+ /** @internal */ getMorphTargetGroupRoot() {
708
+ let node = this;
709
+ while(node){
710
+ if (node._morphTargetGroups.length > 0 || node.sharedModel) {
711
+ return node;
712
+ }
713
+ node = node.parent;
714
+ }
715
+ return this.getPrefabNode() ?? this;
716
+ }
717
+ /** @internal */ applyMorphTargetGroupWeight(group, weight) {
718
+ const root = this.getMorphTargetGroupRoot();
719
+ root.iterate((node)=>{
720
+ if (node.isMesh()) {
721
+ for (const binding of group.bindings){
722
+ this.applyMorphTargetBindingWeight(node, binding, weight);
723
+ }
724
+ }
725
+ });
726
+ }
727
+ /** @internal */ getRuntimeMorphTargetGroup(name) {
728
+ const root = this.getMorphTargetGroupRoot();
729
+ return root._morphTargetGroups.find((group)=>group.name === name) ?? null;
730
+ }
731
+ /** Returns serialized morph target groups for this node. */ getSerializedMorphTargetGroups() {
732
+ return this._morphTargetGroups.map((group)=>({
733
+ name: group.name,
734
+ isBinary: group.isBinary,
735
+ weight: group.weight ?? 0,
736
+ bindings: group.bindings.filter((binding)=>!!binding.mesh).map((binding)=>({
737
+ meshId: binding.mesh.persistentId,
738
+ targetIndex: binding.targetIndex,
739
+ targetName: binding.targetName,
740
+ weight: binding.weight
741
+ }))
742
+ })).filter((group)=>group.bindings.length > 0);
743
+ }
744
+ /** Restores serialized morph target groups for this node. */ setSerializedMorphTargetGroups(groups) {
745
+ const runtimeGroups = [];
746
+ for (const group of groups ?? []){
747
+ if (!group?.name || !Array.isArray(group.bindings)) {
748
+ continue;
749
+ }
750
+ const bindings = [];
751
+ for (const binding of group.bindings){
752
+ const mesh = binding?.meshId ? this.findNodeById(binding.meshId) : null;
753
+ if (mesh?.isMesh()) {
754
+ bindings.push({
755
+ mesh,
756
+ targetIndex: binding.targetIndex,
757
+ targetName: binding.targetName,
758
+ weight: typeof binding.weight === 'number' ? binding.weight : 1
759
+ });
760
+ }
761
+ }
762
+ if (bindings.length > 0) {
763
+ runtimeGroups.push({
764
+ name: group.name,
765
+ bindings,
766
+ isBinary: group.isBinary,
767
+ weight: typeof group.weight === 'number' ? group.weight : 0
768
+ });
769
+ }
770
+ }
771
+ this._morphTargetGroups = runtimeGroups;
772
+ for (const group of this._morphTargetGroups){
773
+ this.applyMorphTargetGroupWeight(group, group.weight ?? 0);
774
+ }
775
+ }
776
+ /**
777
+ * Force transform update and notify descendants.
778
+ * @param invalidateLocal - If true, also invalidate local matrix; otherwise only invalidate world matrix.
779
+ */ invalidateTransform(invalidateLocal = true) {
649
780
  this._onTransformChanged(invalidateLocal);
650
781
  }
782
+ /**
783
+ * Set morph target weight by name for all meshes in the subtree.
784
+ * @param name - Morph target name
785
+ * @param weight - Morph target weight
786
+ */ setMorphTargetWeight(name, weight) {
787
+ const root = this.getPrefabNode() ?? this;
788
+ root.iterate((node)=>{
789
+ if (node.isMesh()) {
790
+ const index = node.getMorphTargetIndexByName(name);
791
+ if (index >= 0) {
792
+ node.setMorphWeightByIndex(index, weight);
793
+ }
794
+ }
795
+ });
796
+ }
797
+ /**
798
+ * Set morph target group weight for the model instance.
799
+ * @param name - Morph target group name
800
+ * @param weight - Group weight
801
+ */ setMorphTargetGroupWeight(name, weight) {
802
+ const runtimeGroup = this.getRuntimeMorphTargetGroup(name);
803
+ if (runtimeGroup) {
804
+ const groupWeight = runtimeGroup.isBinary ? weight > 0.5 ? 1 : 0 : weight;
805
+ runtimeGroup.weight = groupWeight;
806
+ this.applyMorphTargetGroupWeight(runtimeGroup, groupWeight);
807
+ return;
808
+ }
809
+ const root = this.getMorphTargetGroupRoot();
810
+ const group = root.sharedModel?.getMorphTargetGroup(name);
811
+ if (!group) {
812
+ this.setMorphTargetWeight(name, weight);
813
+ return;
814
+ }
815
+ const groupWeight = group.isBinary ? weight > 0.5 ? 1 : 0 : weight;
816
+ this.applyMorphTargetGroupWeight(group, groupWeight);
817
+ }
818
+ /**
819
+ * Get morph target group weight.
820
+ * @param name - Morph target group name
821
+ * @returns The group weight, or 0 if no group was found
822
+ */ getMorphTargetGroupWeight(name) {
823
+ const runtimeGroup = this.getRuntimeMorphTargetGroup(name);
824
+ return runtimeGroup?.weight ?? 0;
825
+ }
826
+ /**
827
+ * Collect all morph target names from meshes in the subtree.
828
+ * @returns Array of unique morph target names
829
+ */ collectMorphTargetNames() {
830
+ const root = this.getPrefabNode() ?? this;
831
+ const names = new Set();
832
+ root.iterate((node)=>{
833
+ if (node.isMesh()) {
834
+ for(let i = 0; i < node.getNumMorphTargets(); i++){
835
+ names.add(node.getMorphTargetName(i));
836
+ }
837
+ }
838
+ });
839
+ return Array.from(names);
840
+ }
841
+ /**
842
+ * Collect all model-level morph target group names.
843
+ * @returns Array of morph target group names
844
+ */ collectMorphTargetGroupNames() {
845
+ const root = this.getMorphTargetGroupRoot();
846
+ if (root._morphTargetGroups.length > 0) {
847
+ return root._morphTargetGroups.map((group)=>group.name);
848
+ }
849
+ const groups = root.sharedModel?.morphTargetGroups;
850
+ return groups ? groups.map((group)=>group.name) : [];
851
+ }
651
852
  /** Get called when the node was just created by cloning from other node */ onPostClone() {}
652
853
  /** Disposes the node */ onDispose() {
653
854
  super.onDispose();
@@ -930,5 +1131,5 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
930
1131
  }
931
1132
  }
932
1133
 
933
- export { SceneNode };
1134
+ export { SceneNode, setSceneMeshAssetBinding };
934
1135
  //# sourceMappingURL=scene_node.js.map