@zephyr3d/scene 0.9.27 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -0,0 +1,157 @@
1
+ import { Vector3 } from '@zephyr3d/base';
2
+
3
+ /** Number of collision layers. @public */ const PHYSICS_LAYER_COUNT = 16;
4
+ const ALL_LAYERS = (1 << PHYSICS_LAYER_COUNT) - 1;
5
+ /**
6
+ * Physics settings saved with a scene.
7
+ *
8
+ * @remarks
9
+ * Plain data: the scene package does not simulate anything. A physics package
10
+ * reads these when it simulates the scene, and picks up later changes through
11
+ * {@link ScenePhysicsSettings.version}. A scene without settings
12
+ * ({@link Scene.physicsSettings} null) uses the physics package's defaults,
13
+ * which match the defaults here.
14
+ *
15
+ * @public
16
+ */ class ScenePhysicsSettings {
17
+ _gravity;
18
+ _fixedTimeStep;
19
+ _maxSubSteps;
20
+ _interpolation;
21
+ _waitForCollidersOnStart;
22
+ _layerNames;
23
+ _layerMasks;
24
+ _version;
25
+ constructor(){
26
+ this._gravity = new Vector3(0, -9.81, 0);
27
+ this._fixedTimeStep = 1 / 60;
28
+ this._maxSubSteps = 8;
29
+ this._interpolation = true;
30
+ this._waitForCollidersOnStart = true;
31
+ this._layerNames = Array.from({
32
+ length: PHYSICS_LAYER_COUNT
33
+ }, (_, i)=>ScenePhysicsSettings.defaultLayerName(i));
34
+ this._layerMasks = new Array(PHYSICS_LAYER_COUNT).fill(ALL_LAYERS);
35
+ this._version = 0;
36
+ }
37
+ /** Name a layer has until renamed. */ static defaultLayerName(layer) {
38
+ return layer === 0 ? 'Default' : `Layer ${layer}`;
39
+ }
40
+ /** Increases whenever a setting changes. */ get version() {
41
+ return this._version;
42
+ }
43
+ /** Gravity in m/s². Default (0, -9.81, 0). Returns a copy; assign to change it. */ get gravity() {
44
+ return new Vector3(this._gravity);
45
+ }
46
+ set gravity(value) {
47
+ if (!this._gravity.equalsTo(value)) {
48
+ this._gravity.set(value);
49
+ this._version++;
50
+ }
51
+ }
52
+ /** Length of one simulation step, in seconds. Default 1/60. */ get fixedTimeStep() {
53
+ return this._fixedTimeStep;
54
+ }
55
+ set fixedTimeStep(value) {
56
+ value = Math.max(1e-4, value);
57
+ if (value !== this._fixedTimeStep) {
58
+ this._fixedTimeStep = value;
59
+ this._version++;
60
+ }
61
+ }
62
+ /** Most simulation steps taken in one frame. Default 8: real time down to 7.5 frames per second at the default step. */ get maxSubSteps() {
63
+ return this._maxSubSteps;
64
+ }
65
+ set maxSubSteps(value) {
66
+ value = Math.max(1, Math.floor(value));
67
+ if (value !== this._maxSubSteps) {
68
+ this._maxSubSteps = value;
69
+ this._version++;
70
+ }
71
+ }
72
+ /** Whether moving bodies are drawn between simulation steps. Default true. */ get interpolation() {
73
+ return this._interpolation;
74
+ }
75
+ set interpolation(value) {
76
+ if (!!value !== this._interpolation) {
77
+ this._interpolation = !!value;
78
+ this._version++;
79
+ }
80
+ }
81
+ /** Whether the simulation waits for mesh and terrain colliders before starting. Default true. */ get waitForCollidersOnStart() {
82
+ return this._waitForCollidersOnStart;
83
+ }
84
+ set waitForCollidersOnStart(value) {
85
+ if (!!value !== this._waitForCollidersOnStart) {
86
+ this._waitForCollidersOnStart = !!value;
87
+ this._version++;
88
+ }
89
+ }
90
+ /** Display name of a layer. */ getLayerName(layer) {
91
+ return this._layerNames[layer] ?? '';
92
+ }
93
+ setLayerName(layer, name) {
94
+ if (layer >= 0 && layer < PHYSICS_LAYER_COUNT && this._layerNames[layer] !== name) {
95
+ this._layerNames[layer] = name;
96
+ this._version++;
97
+ }
98
+ }
99
+ /** Whether colliders on layers `a` and `b` collide. All layers collide by default. */ getLayerCollision(a, b) {
100
+ return !!((this._layerMasks[a] ?? 0) & 1 << b);
101
+ }
102
+ /** Sets whether colliders on layers `a` and `b` collide; applies to both orders. */ setLayerCollision(a, b, enabled) {
103
+ if (a < 0 || a >= PHYSICS_LAYER_COUNT || b < 0 || b >= PHYSICS_LAYER_COUNT) {
104
+ return;
105
+ }
106
+ if (this.getLayerCollision(a, b) === !!enabled && this.getLayerCollision(b, a) === !!enabled) {
107
+ return;
108
+ }
109
+ if (enabled) {
110
+ this._layerMasks[a] |= 1 << b;
111
+ this._layerMasks[b] |= 1 << a;
112
+ } else {
113
+ this._layerMasks[a] &= ~(1 << b);
114
+ this._layerMasks[b] &= ~(1 << a);
115
+ }
116
+ this._version++;
117
+ }
118
+ /** Layer names as saved: a JSON array of 16 strings. @internal */ get layerNamesData() {
119
+ return JSON.stringify(this._layerNames);
120
+ }
121
+ set layerNamesData(value) {
122
+ let names;
123
+ try {
124
+ names = JSON.parse(value);
125
+ } catch {
126
+ names = null;
127
+ }
128
+ for(let i = 0; i < PHYSICS_LAYER_COUNT; i++){
129
+ const name = Array.isArray(names) ? names[i] : undefined;
130
+ this.setLayerName(i, typeof name === 'string' ? name : ScenePhysicsSettings.defaultLayerName(i));
131
+ }
132
+ }
133
+ /**
134
+ * Collision matrix as saved: 16 comma separated masks, bit `b` of mask `a`
135
+ * set when layers `a` and `b` collide. Made symmetric on load: a pair collides
136
+ * if either order says so. @internal
137
+ */ get layerMatrixData() {
138
+ return this._layerMasks.join(',');
139
+ }
140
+ set layerMatrixData(value) {
141
+ const parts = value.split(',');
142
+ const masks = Array.from({
143
+ length: PHYSICS_LAYER_COUNT
144
+ }, (_, i)=>{
145
+ const n = Number(parts[i]);
146
+ return parts[i] !== undefined && parts[i].trim() !== '' && Number.isFinite(n) ? n & ALL_LAYERS : ALL_LAYERS;
147
+ });
148
+ for(let a = 0; a < PHYSICS_LAYER_COUNT; a++){
149
+ for(let b = a; b < PHYSICS_LAYER_COUNT; b++){
150
+ this.setLayerCollision(a, b, !!(masks[a] >> b & 1) || !!(masks[b] >> a & 1));
151
+ }
152
+ }
153
+ }
154
+ }
155
+
156
+ export { PHYSICS_LAYER_COUNT, ScenePhysicsSettings };
157
+ //# sourceMappingURL=physics_settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics_settings.js","sources":["../../src/scene/physics_settings.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\n\r\n/** Number of collision layers. @public */\r\nexport const PHYSICS_LAYER_COUNT = 16;\r\nconst ALL_LAYERS = (1 << PHYSICS_LAYER_COUNT) - 1;\r\n\r\n/**\r\n * Physics settings saved with a scene.\r\n *\r\n * @remarks\r\n * Plain data: the scene package does not simulate anything. A physics package\r\n * reads these when it simulates the scene, and picks up later changes through\r\n * {@link ScenePhysicsSettings.version}. A scene without settings\r\n * ({@link Scene.physicsSettings} null) uses the physics package's defaults,\r\n * which match the defaults here.\r\n *\r\n * @public\r\n */\r\nexport class ScenePhysicsSettings {\r\n private readonly _gravity: Vector3;\r\n private _fixedTimeStep: number;\r\n private _maxSubSteps: number;\r\n private _interpolation: boolean;\r\n private _waitForCollidersOnStart: boolean;\r\n private readonly _layerNames: string[];\r\n private readonly _layerMasks: number[];\r\n private _version: number;\r\n constructor() {\r\n this._gravity = new Vector3(0, -9.81, 0);\r\n this._fixedTimeStep = 1 / 60;\r\n this._maxSubSteps = 8;\r\n this._interpolation = true;\r\n this._waitForCollidersOnStart = true;\r\n this._layerNames = Array.from({ length: PHYSICS_LAYER_COUNT }, (_, i) =>\r\n ScenePhysicsSettings.defaultLayerName(i)\r\n );\r\n this._layerMasks = new Array<number>(PHYSICS_LAYER_COUNT).fill(ALL_LAYERS);\r\n this._version = 0;\r\n }\r\n /** Name a layer has until renamed. */\r\n static defaultLayerName(layer: number) {\r\n return layer === 0 ? 'Default' : `Layer ${layer}`;\r\n }\r\n /** Increases whenever a setting changes. */\r\n get version() {\r\n return this._version;\r\n }\r\n /** Gravity in m/s². Default (0, -9.81, 0). Returns a copy; assign to change it. */\r\n get gravity(): Vector3 {\r\n return new Vector3(this._gravity);\r\n }\r\n set gravity(value: Vector3) {\r\n if (!this._gravity.equalsTo(value)) {\r\n this._gravity.set(value);\r\n this._version++;\r\n }\r\n }\r\n /** Length of one simulation step, in seconds. Default 1/60. */\r\n get fixedTimeStep() {\r\n return this._fixedTimeStep;\r\n }\r\n set fixedTimeStep(value: number) {\r\n value = Math.max(1e-4, value);\r\n if (value !== this._fixedTimeStep) {\r\n this._fixedTimeStep = value;\r\n this._version++;\r\n }\r\n }\r\n /** Most simulation steps taken in one frame. Default 8: real time down to 7.5 frames per second at the default step. */\r\n get maxSubSteps() {\r\n return this._maxSubSteps;\r\n }\r\n set maxSubSteps(value: number) {\r\n value = Math.max(1, Math.floor(value));\r\n if (value !== this._maxSubSteps) {\r\n this._maxSubSteps = value;\r\n this._version++;\r\n }\r\n }\r\n /** Whether moving bodies are drawn between simulation steps. Default true. */\r\n get interpolation() {\r\n return this._interpolation;\r\n }\r\n set interpolation(value: boolean) {\r\n if (!!value !== this._interpolation) {\r\n this._interpolation = !!value;\r\n this._version++;\r\n }\r\n }\r\n /** Whether the simulation waits for mesh and terrain colliders before starting. Default true. */\r\n get waitForCollidersOnStart() {\r\n return this._waitForCollidersOnStart;\r\n }\r\n set waitForCollidersOnStart(value: boolean) {\r\n if (!!value !== this._waitForCollidersOnStart) {\r\n this._waitForCollidersOnStart = !!value;\r\n this._version++;\r\n }\r\n }\r\n /** Display name of a layer. */\r\n getLayerName(layer: number) {\r\n return this._layerNames[layer] ?? '';\r\n }\r\n setLayerName(layer: number, name: string) {\r\n if (layer >= 0 && layer < PHYSICS_LAYER_COUNT && this._layerNames[layer] !== name) {\r\n this._layerNames[layer] = name;\r\n this._version++;\r\n }\r\n }\r\n /** Whether colliders on layers `a` and `b` collide. All layers collide by default. */\r\n getLayerCollision(a: number, b: number) {\r\n return !!((this._layerMasks[a] ?? 0) & (1 << b));\r\n }\r\n /** Sets whether colliders on layers `a` and `b` collide; applies to both orders. */\r\n setLayerCollision(a: number, b: number, enabled: boolean) {\r\n if (a < 0 || a >= PHYSICS_LAYER_COUNT || b < 0 || b >= PHYSICS_LAYER_COUNT) {\r\n return;\r\n }\r\n if (this.getLayerCollision(a, b) === !!enabled && this.getLayerCollision(b, a) === !!enabled) {\r\n return;\r\n }\r\n if (enabled) {\r\n this._layerMasks[a] |= 1 << b;\r\n this._layerMasks[b] |= 1 << a;\r\n } else {\r\n this._layerMasks[a] &= ~(1 << b);\r\n this._layerMasks[b] &= ~(1 << a);\r\n }\r\n this._version++;\r\n }\r\n /** Layer names as saved: a JSON array of 16 strings. @internal */\r\n get layerNamesData() {\r\n return JSON.stringify(this._layerNames);\r\n }\r\n set layerNamesData(value: string) {\r\n let names: unknown;\r\n try {\r\n names = JSON.parse(value);\r\n } catch {\r\n names = null;\r\n }\r\n for (let i = 0; i < PHYSICS_LAYER_COUNT; i++) {\r\n const name = Array.isArray(names) ? names[i] : undefined;\r\n this.setLayerName(i, typeof name === 'string' ? name : ScenePhysicsSettings.defaultLayerName(i));\r\n }\r\n }\r\n /**\r\n * Collision matrix as saved: 16 comma separated masks, bit `b` of mask `a`\r\n * set when layers `a` and `b` collide. Made symmetric on load: a pair collides\r\n * if either order says so. @internal\r\n */\r\n get layerMatrixData() {\r\n return this._layerMasks.join(',');\r\n }\r\n set layerMatrixData(value: string) {\r\n const parts = value.split(',');\r\n const masks = Array.from({ length: PHYSICS_LAYER_COUNT }, (_, i) => {\r\n const n = Number(parts[i]);\r\n return parts[i] !== undefined && parts[i].trim() !== '' && Number.isFinite(n)\r\n ? n & ALL_LAYERS\r\n : ALL_LAYERS;\r\n });\r\n for (let a = 0; a < PHYSICS_LAYER_COUNT; a++) {\r\n for (let b = a; b < PHYSICS_LAYER_COUNT; b++) {\r\n this.setLayerCollision(a, b, !!((masks[a] >> b) & 1) || !!((masks[b] >> a) & 1));\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["PHYSICS_LAYER_COUNT","ALL_LAYERS","ScenePhysicsSettings","_gravity","_fixedTimeStep","_maxSubSteps","_interpolation","_waitForCollidersOnStart","_layerNames","_layerMasks","_version","Vector3","Array","from","length","_","i","defaultLayerName","fill","layer","version","gravity","value","equalsTo","set","fixedTimeStep","Math","max","maxSubSteps","floor","interpolation","waitForCollidersOnStart","getLayerName","setLayerName","name","getLayerCollision","a","b","setLayerCollision","enabled","layerNamesData","JSON","stringify","names","parse","isArray","undefined","layerMatrixData","join","parts","split","masks","n","Number","trim","isFinite"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { makeObservable, Disposable, DRef, Vector4, Vector3, Ray, DWeakRef } from '@zephyr3d/base';
1
+ import { makeObservable, Disposable, DRef, Vector4, Vector3, Ray } from '@zephyr3d/base';
2
2
  import { SceneNode } from './scene_node.js';
3
3
  import { Octree } from './octree.js';
4
4
  import { RaycastVisitor } from './raycast_visitor.js';
5
5
  import { Environment } from './environment.js';
6
6
  import '../values.js';
7
+ import { getDevice, tryGetApp } from '../app/api.js';
7
8
  import '../render/render_queue.js';
8
- import { getDevice } from '../app/api.js';
9
9
  import { SceneRenderer } from '../render/renderer.js';
10
10
  import '../render/lightpass.js';
11
11
  import '../material/shader/helper.js';
@@ -13,15 +13,17 @@ import '../render/sky.js';
13
13
  import '../render/clipmap.js';
14
14
  import '../render/envlight.js';
15
15
  import '../render/primitive.js';
16
+ import '@zephyr3d/device';
17
+ import '../render/lod.js';
16
18
  import '../material/lambert.js';
17
19
  import '../material/blinn.js';
18
20
  import '../material/unlit.js';
21
+ import '../material/meshmaterial.js';
19
22
  import '../material/particle.js';
20
23
  import '../material/subsurfaceprofile.js';
21
- import '../material/skin.js';
24
+ import '../material/sssprofile.js';
25
+ import '../material/sss.js';
22
26
  import '../material/eye.js';
23
- import '@zephyr3d/device';
24
- import '../material/meshmaterial.js';
25
27
  import '../material/hair.js';
26
28
  import '../material/hairstrand.js';
27
29
  import '../material/grassmaterial.js';
@@ -35,9 +37,19 @@ import '../material/sprite_std.js';
35
37
  import '../utility/blueprint/material/texture.js';
36
38
  import '../render/dualdepthpeeling_oit.js';
37
39
  import '../shaders/atmosphere.js';
40
+ import '../render/water_interaction.js';
41
+ import { RenderGraphExecutor } from '../render/rendergraph/executor.js';
38
42
  import '../render/rendergraph/forward_plus_builder.js';
39
43
  import '../render/rendergraph/scene_render_context.js';
44
+ import { SceneSDF } from '../render/sdf/scene_sdf.js';
45
+ import '../render/sdf/global_sdf.js';
46
+ import '../render/gi/voxelize_pass.js';
47
+ import { SceneGI } from '../render/gi/scene_gi.js';
48
+ import { SkinPaletteAtlas } from '../animation/skin_palette_atlas.js';
49
+ import { UpdateQueue } from './update_queue.js';
50
+ import { AnimationBankTrack } from '../animation/animation_bank.js';
40
51
  import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttachments } from './script_attachment.js';
52
+ import { getPhysicsWorldFactory } from '../physics/world.js';
41
53
 
42
54
  /**
43
55
  * Represents a renderable world that manages scene graph, spatial indexing, and environment.
@@ -65,16 +77,24 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
65
77
  * Populated by {@link Scene.invalidateNodePlacement} and drained by {@link Scene.updateNodePlacement}.
66
78
  */ _nodePlaceList;
67
79
  /** @internal Environment data (sky/light/IBL). */ _env;
80
+ /** @internal */ _sdf;
81
+ /** @internal */ _gi;
68
82
  /** @internal Frame counter that last updated this scene. */ _updateFrame;
69
83
  /** @internal Unique scene ID. */ _id;
70
- /** @internal One-shot per-frame update queue (runs before render). */ _nodeUpdateQueue;
84
+ /**
85
+ * @internal One-shot per-frame update queue (runs before render). Thousands of nodes may
86
+ * re-queue themselves every frame, so duplicates are told by a stamp on the node
87
+ */ _nodeUpdateQueue;
71
88
  /** @internal */ _drawableUpdateQueue;
72
89
  /** @internal One-shot per-frame-per-camera update queue. */ _perCameraUpdateQueue;
73
90
  /** @internal Main camera reference. */ _mainCamera;
74
91
  /** @internal Arbitrary metadata loaded with the scene (optional). */ _metaData;
92
+ /** @internal Physics settings saved with the scene (optional). */ _physicsSettings;
93
+ _physicsWorld;
75
94
  /** @internal Lighting unit model used by this scene. */ _lightingMode;
76
95
  /** @internal Number of physical meters represented by one scene unit. */ _metersPerUnit;
77
96
  /** @internal User-attached script entries (engine-defined). */ _scripts;
97
+ /** @internal Virtual texture users updated by every camera rendering this scene. */ _virtualTextureClients;
78
98
  /**
79
99
  * Creates an instance of Scene.
80
100
  *
@@ -91,20 +111,43 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
91
111
  this._name = name ?? '';
92
112
  this._octree = new Octree(this, 8, 8);
93
113
  this._nodePlaceList = new Set();
94
- this._nodeUpdateQueue = [];
95
- this._drawableUpdateQueue = [];
96
- this._perCameraUpdateQueue = [];
114
+ this._nodeUpdateQueue = new UpdateQueue((node)=>node._updateQueueStamp, (node, stamp)=>node._updateQueueStamp = stamp);
115
+ // Drawables made without mixinDrawable get the field on first use
116
+ this._drawableUpdateQueue = new UpdateQueue((drawable)=>drawable._drawableQueueStamp, (drawable, stamp)=>drawable._drawableQueueStamp = stamp);
117
+ this._perCameraUpdateQueue = new UpdateQueue((node)=>node._perCameraQueueStamp, (node, stamp)=>node._perCameraQueueStamp = stamp);
97
118
  this._env = new Environment();
119
+ this._sdf = null;
120
+ this._gi = null;
98
121
  this._updateFrame = -1;
99
122
  this._rootNode = new DRef();
100
123
  this._rootNode.set(new SceneNode(this));
101
124
  this._rootNode.get().name = 'Root';
102
125
  this._metaData = null;
126
+ this._physicsSettings = null;
127
+ this._physicsWorld = null;
103
128
  this._lightingMode = 'legacy';
104
129
  this._metersPerUnit = 1;
105
130
  this._scripts = [];
131
+ this._virtualTextureClients = [];
106
132
  this._mainCamera = new DRef();
107
133
  }
134
+ /** Virtual texture users updated by every camera rendering this scene. */ get virtualTextureClients() {
135
+ return this._virtualTextureClients;
136
+ }
137
+ /**
138
+ * Registers a virtual texture user. Every camera rendering the scene then updates and fills
139
+ * its pages between the depth prepass and the light pass. WebGPU only.
140
+ */ addVirtualTextureClient(client) {
141
+ if (!this._virtualTextureClients.includes(client)) {
142
+ this._virtualTextureClients.push(client);
143
+ }
144
+ }
145
+ /** Unregisters a virtual texture user. The client keeps ownership of its texture. */ removeVirtualTextureClient(client) {
146
+ const index = this._virtualTextureClients.indexOf(client);
147
+ if (index >= 0) {
148
+ this._virtualTextureClients.splice(index, 1);
149
+ }
150
+ }
108
151
  /**
109
152
  * Gets the unique identifier of the scene.
110
153
  */ get id() {
@@ -154,6 +197,18 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
154
197
  */ get env() {
155
198
  return this._env;
156
199
  }
200
+ /** Signed distance field data of the scene, off until enabled. */ get sdf() {
201
+ if (!this._sdf) {
202
+ this._sdf = new SceneSDF(this);
203
+ }
204
+ return this._sdf;
205
+ }
206
+ /** Global illumination of the scene, off until enabled. */ get gi() {
207
+ if (!this._gi) {
208
+ this._gi = new SceneGI(this);
209
+ }
210
+ return this._gi;
211
+ }
157
212
  /** Lighting unit model. Legacy remains the default for backward compatibility. */ get lightingMode() {
158
213
  return this._lightingMode;
159
214
  }
@@ -190,6 +245,58 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
190
245
  this._metaData = val;
191
246
  }
192
247
  /**
248
+ * Physics settings of the scene, or null to use the physics package's
249
+ * defaults. Only scenes simulated with a physics package need them.
250
+ */ get physicsSettings() {
251
+ return this._physicsSettings;
252
+ }
253
+ set physicsSettings(val) {
254
+ this._physicsSettings = val ?? null;
255
+ }
256
+ /**
257
+ * The physics simulation of this scene, or null when no physics
258
+ * implementation is loaded.
259
+ *
260
+ * @remarks
261
+ * Created the first time it is needed - when a node with physics data
262
+ * ({@link SceneNode.physics}) enters the scene, or when this is read - by the
263
+ * implementation loaded with `initPhysics`. See {@link Scene.setPhysicsWorld}
264
+ * to give the scene one directly.
265
+ */ get physicsWorld() {
266
+ if (!this._physicsWorld && !this.disposed) {
267
+ const factory = getPhysicsWorldFactory();
268
+ if (factory) {
269
+ this._physicsWorld = factory(this);
270
+ }
271
+ }
272
+ return this._physicsWorld;
273
+ }
274
+ /**
275
+ * Gives the scene a physics world, replacing and disposing the current one;
276
+ * null removes it until it is next needed.
277
+ *
278
+ * @remarks
279
+ * The physics data of the scene's nodes moves to the new world.
280
+ */ setPhysicsWorld(world) {
281
+ const current = this._physicsWorld;
282
+ if (current === (world ?? null)) {
283
+ return;
284
+ }
285
+ if (world && world.scene !== this) {
286
+ throw new Error('The physics world belongs to another scene.');
287
+ }
288
+ this.rootNode.iterate((node)=>{
289
+ node.physics?._hostDetached();
290
+ });
291
+ this._physicsWorld = world ?? null;
292
+ current?.dispose();
293
+ if (world) {
294
+ this.rootNode.iterate((node)=>{
295
+ node.physics?._hostAttached();
296
+ });
297
+ }
298
+ }
299
+ /**
193
300
  * Attached script filename or identifier (engine-specific).
194
301
  *
195
302
  * @remarks
@@ -327,8 +434,9 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
327
434
  * - To update continuously each frame, call `queueUpdateNode(this)` from within the node's `update` method.
328
435
  * - Duplicate scheduling within the same frame is prevented.
329
436
  */ queueUpdateNode(node) {
330
- if (node && this._nodeUpdateQueue.findIndex((val)=>val.get() === node) < 0) {
331
- this._nodeUpdateQueue.push(new DWeakRef(node));
437
+ // Only nodes of this scene, so a node waits in one update queue at most, as its stamp assumes
438
+ if (node && node.scene === this) {
439
+ this._nodeUpdateQueue.add(node);
332
440
  }
333
441
  }
334
442
  /**
@@ -341,8 +449,8 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
341
449
  * - To update continuously each frame, call `queueUpdateDrawable(this)` from within the drawable's `updateState` method.
342
450
  * - Duplicate scheduling within the same frame is prevented.
343
451
  */ queueUpdateDrawable(drawable) {
344
- if (drawable && this._drawableUpdateQueue.indexOf(drawable) < 0) {
345
- this._drawableUpdateQueue.push(drawable);
452
+ if (drawable && drawable.getNode()?.scene === this) {
453
+ this._drawableUpdateQueue.add(drawable);
346
454
  }
347
455
  }
348
456
  /**
@@ -357,8 +465,8 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
357
465
  * - To run per-camera work continuously, re-queue from `updatePerCamera`.
358
466
  * - Duplicate scheduling within the same frame is prevented.
359
467
  */ queuePerCameraUpdateNode(node) {
360
- if (node && this._perCameraUpdateQueue.findIndex((val)=>val.get() === node) < 0) {
361
- this._perCameraUpdateQueue.push(new DWeakRef(node));
468
+ if (node && node.scene === this) {
469
+ this._perCameraUpdateQueue.add(node);
362
470
  }
363
471
  }
364
472
  /**
@@ -412,38 +520,66 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
412
520
  * - Ensure this runs only once per frame (via `frameInfo.frameCounter`).
413
521
  * - Update environment light synchronization.
414
522
  * - Dispatch `update` event.
523
+ * - Update the main camera's controller if its `updatePhase` is `'early'`.
415
524
  * - Drain the one-shot node update queue and call `node.update(...)`.
525
+ * - Dispatch `afterupdate` event; a physics world steps here.
526
+ * - Call scripts' `onLateUpdate`, then update the main camera's controller if its
527
+ * `updatePhase` is `'late'`, then dispatch `lateupdate` event.
416
528
  * - Apply pending octree placement updates.
417
529
  *
418
530
  */ frameUpdate() {
419
531
  const frameInfo = getDevice().frameInfo;
420
532
  if (frameInfo.frameCounter !== this._updateFrame) {
421
533
  this._updateFrame = frameInfo.frameCounter;
534
+ this._env.wind.update(frameInfo.elapsedFrame * 0.001);
422
535
  this.updateEnvLight();
536
+ const deltaInSeconds = frameInfo.elapsedFrame * 0.001;
423
537
  this.dispatchEvent('update', this);
424
- this.mainCamera?.updateController();
425
- if (this._nodeUpdateQueue.length > 0) {
426
- const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;
427
- const deltaInSeconds = frameInfo.elapsedFrame * 0.001;
428
- const queue = this._nodeUpdateQueue;
429
- this._nodeUpdateQueue = [];
430
- while(queue.length > 0){
431
- const ref = queue.shift();
432
- const node = ref.get();
433
- if (node?.attached) {
434
- node.update(frameInfo.frameCounter, elapsedInSeconds, deltaInSeconds);
538
+ this.mainCamera?.updateController(deltaInSeconds, 'early');
539
+ if (this._nodeUpdateQueue.size > 0 || this._drawableUpdateQueue.size > 0) {
540
+ RenderGraphExecutor.profileScope('SceneUpdate', ()=>{
541
+ if (this._nodeUpdateQueue.size > 0) {
542
+ const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;
543
+ // Nodes queued while draining are updated next frame
544
+ for (const node of this._nodeUpdateQueue.take()){
545
+ if (!node.disposed && node.attached) {
546
+ node.update(frameInfo.frameCounter, elapsedInSeconds, deltaInSeconds);
547
+ }
548
+ }
435
549
  }
436
- ref.dispose();
437
- }
550
+ if (this._drawableUpdateQueue.size > 0) {
551
+ for (const drawable of this._drawableUpdateQueue.take()){
552
+ drawable.updateState();
553
+ }
554
+ }
555
+ });
438
556
  }
439
- if (this._drawableUpdateQueue.length > 0) {
440
- for (const drawable of this._drawableUpdateQueue){
441
- drawable.updateState();
557
+ this.dispatchEvent('afterupdate', this);
558
+ tryGetApp()?.engine?.lateUpdate(deltaInSeconds, (host)=>host === this || host instanceof SceneNode && host.scene === this);
559
+ this.mainCamera?.updateController(deltaInSeconds, 'late');
560
+ this.dispatchEvent('lateupdate', this);
561
+ this.updateNodePlacement(this._octree, this._nodePlaceList);
562
+ const camera = this.mainCamera;
563
+ if (camera && (this._gi?.enabled || this._sdf?.enabled)) {
564
+ const cameraPos = camera.getWorldPosition();
565
+ // The voxel scene feeds the field's compositing, so it goes first
566
+ if (this._gi?.enabled) {
567
+ RenderGraphExecutor.profileScope('GIVoxelize', ()=>this._gi.update(cameraPos, deltaInSeconds));
568
+ }
569
+ if (this._sdf?.enabled) {
570
+ RenderGraphExecutor.profileScope('SceneSDF', ()=>this._sdf.update(cameraPos, deltaInSeconds));
571
+ }
572
+ // Lighting reads what the field just composited
573
+ if (this._gi?.enabled) {
574
+ RenderGraphExecutor.profileScope('GILighting', ()=>this._gi.updateLighting(camera));
442
575
  }
443
- this._drawableUpdateQueue = [];
444
576
  }
445
- this.updateNodePlacement(this._octree, this._nodePlaceList);
446
577
  }
578
+ // Palettes written by animation updates are uploaded once all nodes and bank tracks are updated
579
+ RenderGraphExecutor.profileScope('Animation', ()=>{
580
+ AnimationBankTrack.updateAll(getDevice().frameInfo.elapsedFrame * 0.001);
581
+ SkinPaletteAtlas.flushPending();
582
+ });
447
583
  }
448
584
  /**
449
585
  * Performs per-camera scene updates for the current frame.
@@ -454,19 +590,20 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
454
590
  *
455
591
  * @param camera - The camera being updated for.
456
592
  */ frameUpdatePerCamera(camera) {
457
- if (this._perCameraUpdateQueue.length > 0) {
458
- const frameInfo = getDevice().frameInfo;
459
- const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;
460
- const deltaInSeconds = frameInfo.elapsedFrame * 0.001;
461
- const queue = this._perCameraUpdateQueue;
462
- this._perCameraUpdateQueue = [];
463
- while(queue.length > 0){
464
- const ref = queue.shift();
465
- ref.get()?.updatePerCamera(camera, elapsedInSeconds, deltaInSeconds);
466
- ref.dispose();
467
- }
593
+ if (this._perCameraUpdateQueue.size > 0) {
594
+ RenderGraphExecutor.profileScope('SceneUpdatePerCamera', ()=>{
595
+ const frameInfo = getDevice().frameInfo;
596
+ const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;
597
+ const deltaInSeconds = frameInfo.elapsedFrame * 0.001;
598
+ for (const node of this._perCameraUpdateQueue.take()){
599
+ if (!node.disposed) {
600
+ node.updatePerCamera(camera, elapsedInSeconds, deltaInSeconds);
601
+ }
602
+ }
603
+ });
468
604
  }
469
605
  this.updateNodePlacement(this._octree, this._nodePlaceList);
606
+ SkinPaletteAtlas.flushPending();
470
607
  }
471
608
  /**
472
609
  * Applies placement changes for nodes in `list` to the given `octree`.
@@ -507,9 +644,18 @@ import { ScriptAttachment, normalizeScriptAttachmentConfig, normalizeScriptAttac
507
644
  * - Main camera reference wrapper
508
645
  *
509
646
  */ onDispose() {
647
+ this._nodeUpdateQueue.clear();
648
+ this._drawableUpdateQueue.clear();
649
+ this._perCameraUpdateQueue.clear();
510
650
  this._env.dispose();
651
+ this._gi?.dispose();
652
+ this._gi = null;
653
+ this._sdf?.dispose();
654
+ this._sdf = null;
511
655
  this._rootNode.dispose();
512
656
  this._mainCamera.dispose();
657
+ this._physicsWorld?.dispose();
658
+ this._physicsWorld = null;
513
659
  }
514
660
  }
515
661