@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
@@ -1 +1 @@
1
- {"version":3,"file":"basesprite.js","sources":["../../src/scene/basesprite.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, DRef, Quaternion, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type {\r\n RenderPass,\r\n BatchDrawable,\r\n DrawContext,\r\n PickTarget,\r\n RenderQueue,\r\n SkinInfluenceData\r\n} from '../render';\r\nimport { Primitive } from '../render';\r\nimport type { RenderBundle } from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { 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 { SpriteMaterial } from '../material/sprite';\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class BaseSprite<M extends SpriteMaterial>\r\n extends applyMixins(GraphNode, mixinDrawable)\r\n implements BatchDrawable\r\n{\r\n /** @internal */\r\n private static _primitive: DRef<Primitive> = new DRef();\r\n /** @internal */\r\n protected readonly _material: DRef<M>;\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 _renderBundle: 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 _anchor: Vector2;\r\n /** @internal */\r\n protected _rotateAngle: number;\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) {\r\n super(scene);\r\n this._material = new DRef();\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = getDevice().type !== 'webgl';\r\n this._anchor = new Vector2(0.5, 0.5);\r\n this._rotateAngle = 0;\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\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 /** Material of the mesh */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m && m instanceof SpriteMaterial) {\r\n this._material.set(m);\r\n if (m) {\r\n this.onSetMaterial(m);\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash = m ? `${this.constructor.name}:${this._scene?.id ?? 0}:${m.instanceId}` : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n }\r\n }\r\n get anchorX() {\r\n return this._anchor.x;\r\n }\r\n set anchorX(value) {\r\n if (this._anchor.x !== value) {\r\n this._anchor.x = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorX = this._anchor.x;\r\n }\r\n }\r\n }\r\n get anchorY() {\r\n return this._anchor.y;\r\n }\r\n set anchorY(value) {\r\n if (this._anchor.y !== value) {\r\n this._anchor.y = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorY = this._anchor.y;\r\n }\r\n }\r\n }\r\n get uvTopLeft() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.x, uvinfo.y);\r\n }\r\n set uvTopLeft(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(value.x, value.y, uvinfo.z, uvinfo.w);\r\n }\r\n get uvBottomRight() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.z, uvinfo.w);\r\n }\r\n set uvBottomRight(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(uvinfo.x, uvinfo.y, value.x, value.y);\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return this._batchable && !!this._material.get() && this._material.get()!.isBatchable();\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();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth();\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.getPrimitive();\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (this._materialChangeTag !== material.changeTag) {\r\n this._renderBundle = {};\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 let primitive = BaseSprite._primitive.get();\r\n if (!primitive) {\r\n primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32', new Float32Array([0, 1, 2, 3]));\r\n primitive.createAndSetIndexBuffer(new Uint16Array([0, 1, 2, 3]));\r\n primitive.primitiveType = 'triangle-strip';\r\n BaseSprite._primitive.set(primitive);\r\n }\r\n return primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getSkinInfluenceData}\r\n */\r\n getSkinInfluenceData(): Nullable<SkinInfluenceData> {\r\n return null;\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 /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const scaleX = Math.hypot(this.worldMatrix[0], this.worldMatrix[1], this.worldMatrix[2]);\r\n const scaleY = Math.hypot(this.worldMatrix[4], this.worldMatrix[5], this.worldMatrix[6]);\r\n const mat = this._material?.get();\r\n if (mat) {\r\n const boundingBox = new BoundingBox();\r\n const cx = Math.max(Math.abs(this._anchor.x), Math.abs(1 - this._anchor.x)) * scaleX;\r\n const cy = Math.max(Math.abs(this._anchor.y), Math.abs(1 - this._anchor.y)) * scaleY;\r\n const size = Math.max(cx, cy);\r\n boundingBox.minPoint.setXYZ(p.x - size, p.y - size, p.z - size);\r\n boundingBox.maxPoint.setXYZ(p.x + size, p.y + size, p.z + size);\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n const rot = this.rotation.toEulerAngles().z;\r\n const rotationZ = Quaternion.fromAxisAngle(Vector3.axisPZ(), rot);\r\n outMatrix.compose(this._scaling, rotationZ, this._position);\r\n if (this._material?.get()) {\r\n this._rotateAngle = -rot;\r\n this._material.get()!.rotation = this._rotateAngle;\r\n }\r\n\r\n //outMatrix.scaling(this.scale).translateLeft(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /** Called when new material is set */\r\n protected onSetMaterial(material: M) {\r\n material.anchor = this._anchor;\r\n material.rotation = this._rotateAngle;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n}\r\n"],"names":["BaseSprite","applyMixins","GraphNode","mixinDrawable","_primitive","DRef","scene","_material","_instanceHash","_pickTarget","node","_batchable","getDevice","type","_anchor","Vector2","_rotateAngle","_renderBundle","_useRenderBundle","_materialChangeTag","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","material","m","SpriteMaterial","set","onSetMaterial","RenderBundleWrapper","materialAttached","coreMaterial","name","_scene","id","instanceId","drawableChanged","anchorX","x","value","invalidateWorldBoundingVolume","anchorY","y","uvTopLeft","uvinfo","setUVInfo","z","w","uvBottomRight","getMorphData","getMorphInfo","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","draw","ctx","renderQueue","hash","primitive","getPrimitive","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","Primitive","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","primitiveType","getBoneMatrices","getSkinInfluenceData","getNode","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scaleX","Math","hypot","scaleY","mat","boundingBox","BoundingBox","cx","max","abs","cy","size","minPoint","setXYZ","maxPoint","calculateLocalTransform","outMatrix","rot","rotation","toEulerAngles","rotationZ","Quaternion","fromAxisAngle","axisPZ","compose","_scaling","_position","calculateWorldTransform","localMatrix","parent","m03","m13","m23","anchor","onDispose","dispose"],"mappings":"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"}
1
+ {"version":3,"file":"basesprite.js","sources":["../../src/scene/basesprite.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, DRef, Quaternion, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type {\r\n RenderPass,\r\n BatchDrawable,\r\n DrawContext,\r\n PickTarget,\r\n RenderQueue,\r\n SkinInfluenceData\r\n} from '../render';\r\nimport { Primitive } from '../render';\r\nimport type { RenderBundle } from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { 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 { SpriteMaterial } from '../material/sprite';\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class BaseSprite<M extends SpriteMaterial>\r\n extends applyMixins(GraphNode, mixinDrawable)\r\n implements BatchDrawable\r\n{\r\n /** @internal */\r\n private static _primitive: DRef<Primitive> = new DRef();\r\n /** @internal */\r\n protected readonly _material: DRef<M>;\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 _renderBundle: 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 _anchor: Vector2;\r\n /** @internal */\r\n protected _rotateAngle: number;\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) {\r\n super(scene);\r\n this._material = new DRef();\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = true;\r\n this._anchor = new Vector2(0.5, 0.5);\r\n this._rotateAngle = 0;\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\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 /** Material of the mesh */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m && m instanceof SpriteMaterial) {\r\n this._material.set(m);\r\n if (m) {\r\n this.onSetMaterial(m);\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash = m ? `${this.constructor.name}:${this._scene?.id ?? 0}:${m.instanceId}` : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n }\r\n }\r\n get anchorX() {\r\n return this._anchor.x;\r\n }\r\n set anchorX(value) {\r\n if (this._anchor.x !== value) {\r\n this._anchor.x = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorX = this._anchor.x;\r\n }\r\n }\r\n }\r\n get anchorY() {\r\n return this._anchor.y;\r\n }\r\n set anchorY(value) {\r\n if (this._anchor.y !== value) {\r\n this._anchor.y = value;\r\n this.invalidateWorldBoundingVolume(false);\r\n const material = this._material.get();\r\n if (material) {\r\n material.anchorY = this._anchor.y;\r\n }\r\n }\r\n }\r\n get uvTopLeft() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.x, uvinfo.y);\r\n }\r\n set uvTopLeft(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(value.x, value.y, uvinfo.z, uvinfo.w);\r\n }\r\n get uvBottomRight() {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n return new Vector2(uvinfo.z, uvinfo.w);\r\n }\r\n set uvBottomRight(value) {\r\n const uvinfo = this._material.get()!.uvinfo;\r\n this._material.get()!.setUVInfo(uvinfo.x, uvinfo.y, value.x, value.y);\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return this._batchable && !!this._material.get() && this._material.get()!.isBatchable();\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();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth();\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.getPrimitive();\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (this._materialChangeTag !== material.changeTag) {\r\n this._renderBundle = {};\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 let primitive = BaseSprite._primitive.get();\r\n if (!primitive) {\r\n primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32', new Float32Array([0, 1, 2, 3]));\r\n primitive.createAndSetIndexBuffer(new Uint16Array([0, 1, 2, 3]));\r\n primitive.primitiveType = 'triangle-strip';\r\n BaseSprite._primitive.set(primitive);\r\n }\r\n return primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getSkinInfluenceData}\r\n */\r\n getSkinInfluenceData(): Nullable<SkinInfluenceData> {\r\n return null;\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 /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const scaleX = Math.hypot(this.worldMatrix[0], this.worldMatrix[1], this.worldMatrix[2]);\r\n const scaleY = Math.hypot(this.worldMatrix[4], this.worldMatrix[5], this.worldMatrix[6]);\r\n const mat = this._material?.get();\r\n if (mat) {\r\n const boundingBox = new BoundingBox();\r\n const cx = Math.max(Math.abs(this._anchor.x), Math.abs(1 - this._anchor.x)) * scaleX;\r\n const cy = Math.max(Math.abs(this._anchor.y), Math.abs(1 - this._anchor.y)) * scaleY;\r\n const size = Math.max(cx, cy);\r\n boundingBox.minPoint.setXYZ(p.x - size, p.y - size, p.z - size);\r\n boundingBox.maxPoint.setXYZ(p.x + size, p.y + size, p.z + size);\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n const rot = this.rotation.toEulerAngles().z;\r\n const rotationZ = Quaternion.fromAxisAngle(Vector3.axisPZ(), rot);\r\n outMatrix.compose(this._scaling, rotationZ, this._position);\r\n if (this._material?.get()) {\r\n this._rotateAngle = -rot;\r\n this._material.get()!.rotation = this._rotateAngle;\r\n }\r\n\r\n //outMatrix.scaling(this.scale).translateLeft(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /** Called when new material is set */\r\n protected onSetMaterial(material: M) {\r\n material.anchor = this._anchor;\r\n material.rotation = this._rotateAngle;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n}\r\n"],"names":["BaseSprite","applyMixins","GraphNode","mixinDrawable","_primitive","DRef","scene","_material","_instanceHash","_pickTarget","node","_batchable","_anchor","Vector2","_rotateAngle","_renderBundle","_useRenderBundle","_materialChangeTag","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","material","m","SpriteMaterial","set","onSetMaterial","RenderBundleWrapper","materialAttached","coreMaterial","name","_scene","id","instanceId","drawableChanged","anchorX","x","value","invalidateWorldBoundingVolume","anchorY","y","uvTopLeft","uvinfo","setUVInfo","z","w","uvBottomRight","getMorphData","getMorphInfo","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","draw","ctx","renderQueue","hash","primitive","getPrimitive","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","Primitive","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","primitiveType","getBoneMatrices","getSkinInfluenceData","getNode","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scaleX","Math","hypot","scaleY","mat","boundingBox","BoundingBox","cx","max","abs","cy","size","minPoint","setXYZ","maxPoint","calculateLocalTransform","outMatrix","rot","rotation","toEulerAngles","rotationZ","Quaternion","fromAxisAngle","axisPZ","compose","_scaling","_position","calculateWorldTransform","localMatrix","parent","m03","m13","m23","anchor","onDispose","dispose"],"mappings":"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"}
@@ -8,11 +8,12 @@ import '../material/shader/helper.js';
8
8
  import '../material/lambert.js';
9
9
  import '../material/blinn.js';
10
10
  import '../material/unlit.js';
11
+ import '../material/meshmaterial.js';
11
12
  import '../material/particle.js';
12
13
  import '../material/subsurfaceprofile.js';
13
- import '../material/skin.js';
14
+ import '../material/sssprofile.js';
15
+ import '../material/sss.js';
14
16
  import '../material/eye.js';
15
- import '../material/meshmaterial.js';
16
17
  import '../material/hair.js';
17
18
  import '../material/hairstrand.js';
18
19
  import '../material/grassmaterial.js';
@@ -29,9 +30,15 @@ import '../render/lightpass.js';
29
30
  import '../render/sky.js';
30
31
  import '../render/clipmap.js';
31
32
  import '../render/envlight.js';
33
+ import '../render/lod.js';
32
34
  import '../render/dualdepthpeeling_oit.js';
33
35
  import '../shaders/atmosphere.js';
36
+ import '../render/water_interaction.js';
34
37
  import '../render/rendergraph/scene_render_context.js';
38
+ import '../render/sdf/scene_sdf.js';
39
+ import '../render/sdf/global_sdf.js';
40
+ import '../render/gi/voxelize_pass.js';
41
+ import { InstanceCuller } from '../render/instance_culling.js';
35
42
  import { BoundingBox } from '../utility/bounding_volume.js';
36
43
 
37
44
  const tmpMatrix = new Matrix4x4();
@@ -42,7 +49,12 @@ const tmpMatrix = new Matrix4x4();
42
49
  _renderQueueMap;
43
50
  _bindGroupAllocator;
44
51
  _changeTag;
52
+ /**
53
+ * Child meshes split by how they are drawn, keyed by whether GPU instance culling selects the
54
+ * levels of detail of the queue, see getMeshSplit
55
+ */ _meshSplits;
45
56
  _staticBV;
57
+ _gpuInstanceCulling;
46
58
  /**
47
59
  * Creates an instance of mesh node
48
60
  * @param scene - The scene to which the mesh node belongs
@@ -50,20 +62,39 @@ const tmpMatrix = new Matrix4x4();
50
62
  super(scene);
51
63
  this._renderQueueMap = new Map();
52
64
  this._changeTag = 0;
65
+ this._meshSplits = new Map();
53
66
  this._bindGroupAllocator = new InstanceBindGroupAllocator();
54
67
  this._staticBV = false;
55
- const bvCallback = ()=>{
68
+ this._gpuInstanceCulling = true;
69
+ const bvCallback = (node)=>{
56
70
  if (!this._staticBV) {
57
71
  this.invalidateBoundingVolume();
58
72
  }
73
+ // Bounds of the child mesh, transformed or animated
74
+ if (node?.isMesh()) {
75
+ for (const { queue } of this._renderQueueMap.values()){
76
+ queue.markInstanceBoundsDirty(node);
77
+ }
78
+ }
59
79
  };
60
80
  const primitiveCallback = ()=>{
61
- bvCallback();
81
+ if (!this._staticBV) {
82
+ this.invalidateBoundingVolume();
83
+ }
62
84
  this.invalidate();
63
85
  };
64
86
  const materialCallback = ()=>{
65
87
  this.invalidate();
66
88
  };
89
+ // A forced level decides whether the view selects the mesh's level, so the meshes are split
90
+ // again; cached queues hold forced levels as they were built with, so they are rebuilt too.
91
+ // Levels selected by GPU culling read the level limits of the mesh with its bounds
92
+ const lodCallback = (mesh)=>{
93
+ for (const { queue } of this._renderQueueMap.values()){
94
+ queue.markInstanceBoundsDirty(mesh);
95
+ }
96
+ this.invalidate();
97
+ };
67
98
  this.on('visiblechanged', (node)=>{
68
99
  node.iterate((child)=>{
69
100
  if (child.isMesh()) {
@@ -83,6 +114,7 @@ const tmpMatrix = new Matrix4x4();
83
114
  child.on('bvchanged', bvCallback);
84
115
  child.on('primitive_changed', primitiveCallback);
85
116
  child.on('material_changed', materialCallback);
117
+ child.on('lod_changed', lodCallback);
86
118
  this.invalidate();
87
119
  }
88
120
  });
@@ -97,11 +129,32 @@ const tmpMatrix = new Matrix4x4();
97
129
  child.off('bvchanged', bvCallback);
98
130
  child.off('primitive_changed', primitiveCallback);
99
131
  child.off('material_changed', materialCallback);
132
+ child.off('lod_changed', lodCallback);
100
133
  this.invalidate();
101
134
  }
102
135
  });
103
136
  });
104
137
  }
138
+ /**
139
+ * Whether the instances of the child meshes are frustum culled on the GPU, for each view the
140
+ * group is drawn in (WebGPU only). Default true.
141
+ *
142
+ * @remarks
143
+ * The group draws its child meshes as batches recorded once, which the CPU only culls as a whole.
144
+ * With this on, each view also drops the meshes it does not see from the batches before drawing
145
+ * them, which cuts the vertex work of large groups seen in part, shadow cascades included.
146
+ */ get gpuInstanceCulling() {
147
+ return this._gpuInstanceCulling;
148
+ }
149
+ set gpuInstanceCulling(val) {
150
+ if (val !== this._gpuInstanceCulling) {
151
+ this._gpuInstanceCulling = val;
152
+ for (const { queue } of this._renderQueueMap.values()){
153
+ queue.dispose();
154
+ }
155
+ this._renderQueueMap.clear();
156
+ }
157
+ }
105
158
  /** Gets the batch group name. */ getName() {
106
159
  return this._name;
107
160
  }
@@ -158,28 +211,71 @@ const tmpMatrix = new Matrix4x4();
158
211
  let queueInfo = this._renderQueueMap.get(cullVisitor.renderPass);
159
212
  if (!queueInfo) {
160
213
  queueInfo = {
161
- queue: new RenderQueue(cullVisitor.renderPass, this._bindGroupAllocator),
162
- tag: -1
214
+ queue: new RenderQueue(cullVisitor.renderPass, this._bindGroupAllocator, this._gpuInstanceCulling),
215
+ tag: -1,
216
+ lodColoration: false
163
217
  };
164
218
  this._renderQueueMap.set(cullVisitor.renderPass, queueInfo);
165
219
  }
166
- if (queueInfo.tag !== this._changeTag) {
220
+ // The cached queue holds its meshes at the levels of detail they were built with, none of
221
+ // which the view selects, so moving the view does not rebuild it
222
+ const lodColoration = !!cullVisitor.camera?.lodColoration;
223
+ const split = this.getMeshSplit(queueInfo.queue.culledOnGpu && !lodColoration);
224
+ if (queueInfo.tag !== this._changeTag || queueInfo.lodColoration !== lodColoration) {
167
225
  queueInfo.tag = this._changeTag;
226
+ queueInfo.lodColoration = lodColoration;
168
227
  queueInfo.queue.reset();
169
228
  const frustumCulling = cullVisitor.frustumCulling;
170
229
  const renderQueue = cullVisitor.renderQueue;
171
230
  cullVisitor.frustumCulling = false;
172
231
  cullVisitor.renderQueue = queueInfo.queue;
232
+ for (const mesh of split.cached){
233
+ cullVisitor.visit(mesh);
234
+ }
235
+ queueInfo.queue.end(cullVisitor.camera, true, cullVisitor.lodCamera);
236
+ cullVisitor.frustumCulling = frustumCulling;
237
+ cullVisitor.renderQueue = renderQueue;
238
+ } else if (cullVisitor.camera?.getPickResultResolveFunc()) {
239
+ // The queue is kept across frames and was built in one that did not pick, so its drawables
240
+ // have neither their object colors nor a place in the picking lookup
241
+ queueInfo.queue.registerObjectColors();
242
+ }
243
+ cullVisitor.pushRenderQueue(queueInfo.queue);
244
+ // Culled, and their levels selected, in the view's queue as if they were not in the group
245
+ for (const mesh of split.dynamic){
246
+ cullVisitor.visit(mesh);
247
+ }
248
+ }
249
+ /**
250
+ * Splits the child meshes into those the cached queues hold and the dynamic ones, whose level of
251
+ * detail the CPU selects from the view: a primitive with levels, no forced level, and GPU culling
252
+ * not selecting the level. Batchable meshes are dynamic too when the CPU selects their level
253
+ * (WebGL, no indirect first instance, or level coloration).
254
+ *
255
+ * @remarks
256
+ * Taken again whenever the group changes. Forcing or freeing the level of a mesh does so through
257
+ * lod_changed; assigning Primitive.lods to a primitive already in the group does not, and it is
258
+ * only picked up with the next change.
259
+ *
260
+ * @param gpuLod - Whether GPU instance culling selects the levels of the queue's batches
261
+ */ getMeshSplit(gpuLod) {
262
+ let split = this._meshSplits.get(gpuLod);
263
+ if (!split || split.tag !== this._changeTag) {
264
+ split = {
265
+ tag: this._changeTag,
266
+ cached: [],
267
+ dynamic: []
268
+ };
269
+ this._meshSplits.set(gpuLod, split);
173
270
  this.iterate((node)=>{
174
271
  if (node.isMesh()) {
175
- cullVisitor.visit(node);
272
+ const viewLod = (node.primitive?.lodCount ?? 1) > 1 && node.forcedLod < 0 && !(gpuLod && node.isBatchable() && InstanceCuller.selectsLod(node));
273
+ (viewLod ? split.dynamic : split.cached).push(node);
176
274
  }
275
+ return false;
177
276
  });
178
- queueInfo.queue.end(cullVisitor.camera, true);
179
- cullVisitor.frustumCulling = frustumCulling;
180
- cullVisitor.renderQueue = renderQueue;
181
277
  }
182
- cullVisitor.pushRenderQueue(queueInfo.queue);
278
+ return split;
183
279
  }
184
280
  }
185
281
 
@@ -1 +1 @@
1
- {"version":3,"file":"batchgroup.js","sources":["../../src/scene/batchgroup.ts"],"sourcesContent":["import { GraphNode } from './graph_node';\r\nimport type { CullVisitor, RenderPass } from '../render';\r\nimport { RenderQueue, InstanceBindGroupAllocator } from '../render';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox, type BoundingVolume } from '../utility/bounding_volume';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\n\r\n/**\r\n * Batch group node\r\n * @public\r\n */\r\nexport class BatchGroup extends GraphNode {\r\n private readonly _renderQueueMap: Map<\r\n RenderPass,\r\n {\r\n queue: RenderQueue;\r\n tag: number;\r\n }\r\n >;\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n private _changeTag: number;\r\n private _staticBV: boolean;\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) {\r\n super(scene);\r\n this._renderQueueMap = new Map();\r\n this._changeTag = 0;\r\n this._bindGroupAllocator = new InstanceBindGroupAllocator();\r\n this._staticBV = false;\r\n const bvCallback = () => {\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n };\r\n const primitiveCallback = () => {\r\n bvCallback();\r\n this.invalidate();\r\n };\r\n const materialCallback = () => {\r\n this.invalidate();\r\n };\r\n this.on('visiblechanged', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n this.invalidate();\r\n return true;\r\n }\r\n return false;\r\n });\r\n });\r\n this.on('nodeattached', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n child.placeToOctree = false;\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n child.on('bvchanged', bvCallback);\r\n child.on('primitive_changed', primitiveCallback);\r\n child.on('material_changed', materialCallback);\r\n this.invalidate();\r\n }\r\n });\r\n });\r\n this.on('noderemoved', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n child.placeToOctree = true;\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n child.off('bvchanged', bvCallback);\r\n child.off('primitive_changed', primitiveCallback);\r\n child.off('material_changed', materialCallback);\r\n this.invalidate();\r\n }\r\n });\r\n });\r\n }\r\n /** Gets the batch group name. */\r\n getName() {\r\n return this._name;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isBatchGroup}\r\n */\r\n isBatchGroup(): this is BatchGroup {\r\n return true;\r\n }\r\n /**\r\n * Force the batch state to be rebuilt\r\n */\r\n invalidate() {\r\n this._changeTag++;\r\n }\r\n /** @internal */\r\n protected _onDetached() {\r\n super._onDetached();\r\n // Usually the node will be garbage collected after it is detached,\r\n // We should reset the render queue to release the render bundles.\r\n this._renderQueueMap.forEach((val) => {\r\n val.queue.reset();\r\n });\r\n this.invalidate();\r\n }\r\n /** @internal */\r\n protected _onAttached() {\r\n // Reset the render queue when attached to a new scene.\r\n this.invalidate();\r\n }\r\n /** Release cached queues and their private instance bind groups. */\r\n protected onDispose() {\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.dispose();\r\n }\r\n this._renderQueueMap.clear();\r\n this._bindGroupAllocator.dispose();\r\n super.onDispose();\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const bv = new BoundingBox();\r\n const invWorldMatrix = Matrix4x4.invertAffine(this.worldMatrix);\r\n bv.beginExtend();\r\n this.iterate((node) => {\r\n if (node.isMesh()) {\r\n Matrix4x4.multiplyAffine(invWorldMatrix, node.worldMatrix, tmpMatrix);\r\n const wb = node.getBoundingVolume()!.transform(tmpMatrix).toAABB();\r\n bv.extend(wb.minPoint);\r\n bv.extend(wb.maxPoint);\r\n }\r\n });\r\n return bv.isValid() ? bv : null;\r\n }\r\n /** @internal */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n this._staticBV = !!bv;\r\n super.setBoundingVolume(bv);\r\n }\r\n /** @internal */\r\n cull(cullVisitor: CullVisitor) {\r\n let queueInfo = this._renderQueueMap.get(cullVisitor.renderPass);\r\n if (!queueInfo) {\r\n queueInfo = {\r\n queue: new RenderQueue(cullVisitor.renderPass, this._bindGroupAllocator),\r\n tag: -1\r\n };\r\n this._renderQueueMap.set(cullVisitor.renderPass, queueInfo);\r\n }\r\n if (queueInfo.tag !== this._changeTag) {\r\n queueInfo.tag = this._changeTag;\r\n queueInfo.queue.reset();\r\n const frustumCulling = cullVisitor.frustumCulling;\r\n const renderQueue = cullVisitor.renderQueue;\r\n cullVisitor.frustumCulling = false;\r\n cullVisitor.renderQueue = queueInfo.queue;\r\n this.iterate((node) => {\r\n if (node.isMesh()) {\r\n cullVisitor.visit(node);\r\n }\r\n });\r\n queueInfo.queue.end(cullVisitor.camera, true);\r\n cullVisitor.frustumCulling = frustumCulling;\r\n cullVisitor.renderQueue = renderQueue;\r\n }\r\n cullVisitor.pushRenderQueue(queueInfo.queue);\r\n }\r\n}\r\n"],"names":["tmpMatrix","Matrix4x4","BatchGroup","GraphNode","_renderQueueMap","_bindGroupAllocator","_changeTag","_staticBV","scene","Map","InstanceBindGroupAllocator","bvCallback","invalidateBoundingVolume","primitiveCallback","invalidate","materialCallback","on","node","iterate","child","isMesh","placeToOctree","off","getName","_name","isBatchGroup","_onDetached","forEach","val","queue","reset","values","dispose","clear","onDispose","computeBoundingVolume","bv","BoundingBox","invWorldMatrix","invertAffine","worldMatrix","beginExtend","multiplyAffine","wb","getBoundingVolume","transform","toAABB","extend","minPoint","maxPoint","isValid","setBoundingVolume","cull","cullVisitor","queueInfo","get","renderPass","RenderQueue","tag","set","frustumCulling","renderQueue","visit","end","camera","pushRenderQueue"],"mappings":"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"}
1
+ {"version":3,"file":"batchgroup.js","sources":["../../src/scene/batchgroup.ts"],"sourcesContent":["import { GraphNode } from './graph_node';\r\nimport type { CullVisitor, RenderPass } from '../render';\r\nimport { RenderQueue, InstanceBindGroupAllocator } from '../render';\r\nimport { InstanceCuller } from '../render/instance_culling';\r\nimport type { Scene } from './scene';\r\nimport type { Mesh } from './mesh';\r\nimport type { SceneNode } from './scene_node';\r\nimport { BoundingBox, type BoundingVolume } from '../utility/bounding_volume';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\n\r\n/** Child meshes of a batch group split by how they are drawn, collected at tag */\r\ninterface BatchGroupMeshSplit {\r\n tag: number;\r\n /** Meshes the cached queues hold, recorded into render bundles */\r\n cached: Mesh[];\r\n /**\r\n * Meshes whose level of detail the CPU selects from the view, culled like any mesh every frame\r\n * instead: a cached queue holding them would be rebuilt, with all its render bundles recorded\r\n * again, whenever one switched level, which happens every few frames while the view moves\r\n */\r\n dynamic: Mesh[];\r\n}\r\n\r\n/**\r\n * Batch group node\r\n * @public\r\n */\r\nexport class BatchGroup extends GraphNode {\r\n private readonly _renderQueueMap: Map<\r\n RenderPass,\r\n {\r\n queue: RenderQueue;\r\n tag: number;\r\n /** Whether the queue was built for a camera coloring levels of detail */\r\n lodColoration: boolean;\r\n }\r\n >;\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n private _changeTag: number;\r\n /**\r\n * Child meshes split by how they are drawn, keyed by whether GPU instance culling selects the\r\n * levels of detail of the queue, see getMeshSplit\r\n */\r\n private readonly _meshSplits: Map<boolean, BatchGroupMeshSplit>;\r\n private _staticBV: boolean;\r\n private _gpuInstanceCulling: boolean;\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) {\r\n super(scene);\r\n this._renderQueueMap = new Map();\r\n this._changeTag = 0;\r\n this._meshSplits = new Map();\r\n this._bindGroupAllocator = new InstanceBindGroupAllocator();\r\n this._staticBV = false;\r\n this._gpuInstanceCulling = true;\r\n const bvCallback = (node: SceneNode) => {\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n // Bounds of the child mesh, transformed or animated\r\n if (node?.isMesh()) {\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.markInstanceBoundsDirty(node);\r\n }\r\n }\r\n };\r\n const primitiveCallback = () => {\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n this.invalidate();\r\n };\r\n const materialCallback = () => {\r\n this.invalidate();\r\n };\r\n // A forced level decides whether the view selects the mesh's level, so the meshes are split\r\n // again; cached queues hold forced levels as they were built with, so they are rebuilt too.\r\n // Levels selected by GPU culling read the level limits of the mesh with its bounds\r\n const lodCallback = (mesh: Mesh) => {\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.markInstanceBoundsDirty(mesh);\r\n }\r\n this.invalidate();\r\n };\r\n this.on('visiblechanged', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n this.invalidate();\r\n return true;\r\n }\r\n return false;\r\n });\r\n });\r\n this.on('nodeattached', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n child.placeToOctree = false;\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n child.on('bvchanged', bvCallback);\r\n child.on('primitive_changed', primitiveCallback);\r\n child.on('material_changed', materialCallback);\r\n child.on('lod_changed', lodCallback);\r\n this.invalidate();\r\n }\r\n });\r\n });\r\n this.on('noderemoved', (node) => {\r\n node.iterate((child) => {\r\n if (child.isMesh()) {\r\n child.placeToOctree = true;\r\n if (!this._staticBV) {\r\n this.invalidateBoundingVolume();\r\n }\r\n child.off('bvchanged', bvCallback);\r\n child.off('primitive_changed', primitiveCallback);\r\n child.off('material_changed', materialCallback);\r\n child.off('lod_changed', lodCallback);\r\n this.invalidate();\r\n }\r\n });\r\n });\r\n }\r\n /**\r\n * Whether the instances of the child meshes are frustum culled on the GPU, for each view the\r\n * group is drawn in (WebGPU only). Default true.\r\n *\r\n * @remarks\r\n * The group draws its child meshes as batches recorded once, which the CPU only culls as a whole.\r\n * With this on, each view also drops the meshes it does not see from the batches before drawing\r\n * them, which cuts the vertex work of large groups seen in part, shadow cascades included.\r\n */\r\n get gpuInstanceCulling() {\r\n return this._gpuInstanceCulling;\r\n }\r\n set gpuInstanceCulling(val: boolean) {\r\n if (val !== this._gpuInstanceCulling) {\r\n this._gpuInstanceCulling = val;\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.dispose();\r\n }\r\n this._renderQueueMap.clear();\r\n }\r\n }\r\n /** Gets the batch group name. */\r\n getName() {\r\n return this._name;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isBatchGroup}\r\n */\r\n isBatchGroup(): this is BatchGroup {\r\n return true;\r\n }\r\n /**\r\n * Force the batch state to be rebuilt\r\n */\r\n invalidate() {\r\n this._changeTag++;\r\n }\r\n /** @internal */\r\n protected _onDetached() {\r\n super._onDetached();\r\n // Usually the node will be garbage collected after it is detached,\r\n // We should reset the render queue to release the render bundles.\r\n this._renderQueueMap.forEach((val) => {\r\n val.queue.reset();\r\n });\r\n this.invalidate();\r\n }\r\n /** @internal */\r\n protected _onAttached() {\r\n // Reset the render queue when attached to a new scene.\r\n this.invalidate();\r\n }\r\n /** Release cached queues and their private instance bind groups. */\r\n protected onDispose() {\r\n for (const { queue } of this._renderQueueMap.values()) {\r\n queue.dispose();\r\n }\r\n this._renderQueueMap.clear();\r\n this._bindGroupAllocator.dispose();\r\n super.onDispose();\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const bv = new BoundingBox();\r\n const invWorldMatrix = Matrix4x4.invertAffine(this.worldMatrix);\r\n bv.beginExtend();\r\n this.iterate((node) => {\r\n if (node.isMesh()) {\r\n Matrix4x4.multiplyAffine(invWorldMatrix, node.worldMatrix, tmpMatrix);\r\n const wb = node.getBoundingVolume()!.transform(tmpMatrix).toAABB();\r\n bv.extend(wb.minPoint);\r\n bv.extend(wb.maxPoint);\r\n }\r\n });\r\n return bv.isValid() ? bv : null;\r\n }\r\n /** @internal */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n this._staticBV = !!bv;\r\n super.setBoundingVolume(bv);\r\n }\r\n /** @internal */\r\n cull(cullVisitor: CullVisitor) {\r\n let queueInfo = this._renderQueueMap.get(cullVisitor.renderPass);\r\n if (!queueInfo) {\r\n queueInfo = {\r\n queue: new RenderQueue(cullVisitor.renderPass, this._bindGroupAllocator, this._gpuInstanceCulling),\r\n tag: -1,\r\n lodColoration: false\r\n };\r\n this._renderQueueMap.set(cullVisitor.renderPass, queueInfo);\r\n }\r\n // The cached queue holds its meshes at the levels of detail they were built with, none of\r\n // which the view selects, so moving the view does not rebuild it\r\n const lodColoration = !!cullVisitor.camera?.lodColoration;\r\n const split = this.getMeshSplit(queueInfo.queue.culledOnGpu && !lodColoration);\r\n if (queueInfo.tag !== this._changeTag || queueInfo.lodColoration !== lodColoration) {\r\n queueInfo.tag = this._changeTag;\r\n queueInfo.lodColoration = lodColoration;\r\n queueInfo.queue.reset();\r\n const frustumCulling = cullVisitor.frustumCulling;\r\n const renderQueue = cullVisitor.renderQueue;\r\n cullVisitor.frustumCulling = false;\r\n cullVisitor.renderQueue = queueInfo.queue;\r\n for (const mesh of split.cached) {\r\n cullVisitor.visit(mesh);\r\n }\r\n queueInfo.queue.end(cullVisitor.camera, true, cullVisitor.lodCamera);\r\n cullVisitor.frustumCulling = frustumCulling;\r\n cullVisitor.renderQueue = renderQueue;\r\n } else if (cullVisitor.camera?.getPickResultResolveFunc()) {\r\n // The queue is kept across frames and was built in one that did not pick, so its drawables\r\n // have neither their object colors nor a place in the picking lookup\r\n queueInfo.queue.registerObjectColors();\r\n }\r\n cullVisitor.pushRenderQueue(queueInfo.queue);\r\n // Culled, and their levels selected, in the view's queue as if they were not in the group\r\n for (const mesh of split.dynamic) {\r\n cullVisitor.visit(mesh);\r\n }\r\n }\r\n /**\r\n * Splits the child meshes into those the cached queues hold and the dynamic ones, whose level of\r\n * detail the CPU selects from the view: a primitive with levels, no forced level, and GPU culling\r\n * not selecting the level. Batchable meshes are dynamic too when the CPU selects their level\r\n * (WebGL, no indirect first instance, or level coloration).\r\n *\r\n * @remarks\r\n * Taken again whenever the group changes. Forcing or freeing the level of a mesh does so through\r\n * lod_changed; assigning Primitive.lods to a primitive already in the group does not, and it is\r\n * only picked up with the next change.\r\n *\r\n * @param gpuLod - Whether GPU instance culling selects the levels of the queue's batches\r\n */\r\n private getMeshSplit(gpuLod: boolean) {\r\n let split = this._meshSplits.get(gpuLod);\r\n if (!split || split.tag !== this._changeTag) {\r\n split = { tag: this._changeTag, cached: [], dynamic: [] };\r\n this._meshSplits.set(gpuLod, split);\r\n this.iterate((node) => {\r\n if (node.isMesh()) {\r\n const viewLod =\r\n (node.primitive?.lodCount ?? 1) > 1 &&\r\n node.forcedLod < 0 &&\r\n !(gpuLod && node.isBatchable() && InstanceCuller.selectsLod(node));\r\n (viewLod ? split!.dynamic : split!.cached).push(node);\r\n }\r\n return false;\r\n });\r\n }\r\n return split;\r\n }\r\n}\r\n"],"names":["tmpMatrix","Matrix4x4","BatchGroup","GraphNode","_renderQueueMap","_bindGroupAllocator","_changeTag","_staticBV","_gpuInstanceCulling","scene","Map","_meshSplits","InstanceBindGroupAllocator","bvCallback","node","invalidateBoundingVolume","isMesh","queue","values","markInstanceBoundsDirty","primitiveCallback","invalidate","materialCallback","lodCallback","mesh","on","iterate","child","placeToOctree","off","gpuInstanceCulling","val","dispose","clear","getName","_name","isBatchGroup","_onDetached","forEach","reset","onDispose","computeBoundingVolume","bv","BoundingBox","invWorldMatrix","invertAffine","worldMatrix","beginExtend","multiplyAffine","wb","getBoundingVolume","transform","toAABB","extend","minPoint","maxPoint","isValid","setBoundingVolume","cull","cullVisitor","queueInfo","get","renderPass","RenderQueue","tag","lodColoration","set","camera","split","getMeshSplit","culledOnGpu","frustumCulling","renderQueue","cached","visit","end","lodCamera","getPickResultResolveFunc","registerObjectColors","pushRenderQueue","dynamic","gpuLod","viewLod","primitive","lodCount","forcedLod","isBatchable","InstanceCuller","selectsLod","push"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Disposable, ObservableVector4, DRef, Vector3 } from '@zephyr3d/base';
2
+ import { getProbeVolumeForDraw } from '../render/gi/probe_volume.js';
2
3
  import '../values.js';
3
4
  import '../render/render_queue.js';
4
5
  import '../render/primitive.js';
@@ -7,11 +8,12 @@ import '../material/shader/helper.js';
7
8
  import '../material/lambert.js';
8
9
  import '../material/blinn.js';
9
10
  import '../material/unlit.js';
11
+ import '../material/meshmaterial.js';
10
12
  import '../material/particle.js';
11
13
  import '../material/subsurfaceprofile.js';
12
- import '../material/skin.js';
14
+ import '../material/sssprofile.js';
15
+ import '../material/sss.js';
13
16
  import '../material/eye.js';
14
- import '../material/meshmaterial.js';
15
17
  import '../material/hair.js';
16
18
  import '../material/hairstrand.js';
17
19
  import '../material/grassmaterial.js';
@@ -27,16 +29,23 @@ import '../render/rendergraph/forward_plus_builder.js';
27
29
  import '../render/lightpass.js';
28
30
  import { SkyRenderer } from '../render/sky.js';
29
31
  import '../render/clipmap.js';
30
- import { EnvShIBL, EnvHemisphericAmbient, EnvConstantAmbient } from '../render/envlight.js';
32
+ import { EnvShIBL, EnvProbesOnly, EnvHemisphericAmbient, EnvConstantAmbient } from '../render/envlight.js';
33
+ import '../render/lod.js';
31
34
  import '../render/dualdepthpeeling_oit.js';
32
35
  import '../shaders/atmosphere.js';
36
+ import '../render/water_interaction.js';
33
37
  import '../render/rendergraph/scene_render_context.js';
38
+ import '../render/sdf/scene_sdf.js';
39
+ import '../render/sdf/global_sdf.js';
40
+ import '../render/gi/voxelize_pass.js';
41
+ import { WindField } from './wind.js';
34
42
 
35
43
  /**
36
44
  * Wrapper for environmant lighting
37
45
  * @public
38
46
  */ class EnvLightWrapper extends Disposable {
39
47
  _envLight;
48
+ /** Stands in for the environment light of type `none`, see {@link EnvLightWrapper.envLight}. */ _probesOnly;
40
49
  _ambientColor;
41
50
  _ambientDown;
42
51
  _ambientUp;
@@ -53,6 +62,7 @@ import '../render/rendergraph/scene_render_context.js';
53
62
  /** @internal */ constructor(){
54
63
  super();
55
64
  this._envLight = new EnvShIBL();
65
+ this._probesOnly = new EnvProbesOnly();
56
66
  this._ambientColor = new ObservableVector4(0.2, 0.2, 0.2, 1).setCallback(()=>{
57
67
  if (this.type === 'constant') {
58
68
  this._envLight.ambientColor.set(this._ambientColor);
@@ -89,11 +99,16 @@ import '../render/rendergraph/scene_render_context.js';
89
99
  }
90
100
  /** @internal */ getHash(ctx) {
91
101
  const irradianceSource = this.type === 'ibl' ? this._irradianceSHFB.get() ? 'fb' : this._irradianceSH.get() ? 'buf' : 'none' : 'na';
92
- const ssgiHistory = !!ctx?.SSGI && !!ctx.SSGIIrradianceHistoryTexture && !!ctx.SSGISurfaceHistoryTexture && (ctx.device.type === 'webgl' || !!ctx.motionVectorTexture);
93
- return !ctx || ctx.drawEnvLight ? `${this.type}:${this._envLight.hasRadiance() ? '1' : '0'}:${this._envLight.hasSheenRadiance() ? '1' : '0'}:${this._envLight.hasIrradiance() ? '1' : '0'}:${irradianceSource}:ssgi${ssgiHistory ? '1' : '0'}` : 'none';
102
+ const ssgiHistory = !!ctx?.SSGI && !!ctx.SSGIIrradianceHistoryTexture && !!ctx.SSGISurfaceHistoryTexture && !!ctx.motionVectorTexture;
103
+ const envLight = this.envLight;
104
+ return !ctx || ctx.drawEnvLight ? `${this.type}:${envLight.hasRadiance() ? '1' : '0'}:${envLight.hasSheenRadiance() ? '1' : '0'}:${envLight.hasIrradiance() ? '1' : '0'}:${irradianceSource}:ssgi${ssgiHistory ? '1' : '0'}:probes${getProbeVolumeForDraw(ctx) ? '1' : '0'}` : 'none';
94
105
  }
95
- /** @internal */ get envLight() {
96
- return this._envLight;
106
+ /**
107
+ * @internal
108
+ * Environment lighting used by materials. For type `none`, a sky-less stand-in
109
+ * that applies probe GI only; passes reading the sky check {@link EnvLightWrapper.type}.
110
+ */ get envLight() {
111
+ return this._envLight ?? this._probesOnly;
97
112
  }
98
113
  /**
99
114
  * Multiplier on environment lighting, in both lighting modes.
@@ -245,6 +260,7 @@ import '../render/rendergraph/scene_render_context.js';
245
260
  /** Disposes the environment lighting wrapper */ onDispose() {
246
261
  super.onDispose();
247
262
  this._envLight?.dispose();
263
+ this._probesOnly.dispose();
248
264
  this._radianceMap.dispose();
249
265
  this._sheenRadianceMap.dispose();
250
266
  this._irradianceMap.dispose();
@@ -258,10 +274,12 @@ import '../render/rendergraph/scene_render_context.js';
258
274
  */ class Environment extends Disposable {
259
275
  _sky;
260
276
  _light;
277
+ _wind;
261
278
  /** @internal */ constructor(){
262
279
  super();
263
280
  this._sky = new SkyRenderer();
264
281
  this._light = new EnvLightWrapper();
282
+ this._wind = new WindField();
265
283
  // The physical `intensity` only reaches the image through the cached sky bake, so changing it
266
284
  // has to re-bake; otherwise the cubemap keeps the value it was baked with.
267
285
  this._light.setBakeInvalidator(()=>this._sky.invalidate());
@@ -272,6 +290,9 @@ import '../render/rendergraph/scene_render_context.js';
272
290
  /** The environment lighting renderer */ get light() {
273
291
  return this._light;
274
292
  }
293
+ /** The scene-wide wind */ get wind() {
294
+ return this._wind;
295
+ }
275
296
  /** @internal */ getHash(ctx) {
276
297
  return `${this.light?.getHash(ctx)}:${this._sky?.getHash(ctx)}`;
277
298
  }
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sources":["../../src/scene/environment.ts"],"sourcesContent":["import type { Immutable, Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Vector3, DRef, Disposable } from '@zephyr3d/base';\r\nimport { ObservableVector4 } from '@zephyr3d/base';\r\nimport type { DrawContext, EnvironmentLighting } from '../render';\r\nimport { EnvShIBL } from '../render';\r\nimport { EnvConstantAmbient, EnvHemisphericAmbient } from '../render';\r\nimport { SkyRenderer } from '../render/sky';\r\nimport type { FrameBuffer, GPUDataBuffer, TextureCube } from '@zephyr3d/device';\r\n\r\n/**\r\n * Wrapper for environmant lighting\r\n * @public\r\n */\r\nexport class EnvLightWrapper extends Disposable {\r\n private _envLight: Nullable<EnvironmentLighting>;\r\n private readonly _ambientColor: ObservableVector4;\r\n private readonly _ambientDown: ObservableVector4;\r\n private readonly _ambientUp: ObservableVector4;\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n private readonly _sheenRadianceMap: DRef<TextureCube>;\r\n private readonly _irradianceMap: DRef<TextureCube>;\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n private readonly _irradianceWindow: Vector3;\r\n private _strength: number;\r\n private _intensity: number;\r\n private _specularStrength: number;\r\n /** @internal Invalidates the owning Environment's cached sky bake. */\r\n private _invalidateBake: Nullable<() => void>;\r\n /** @internal */\r\n constructor() {\r\n super();\r\n this._envLight = new EnvShIBL();\r\n this._ambientColor = new ObservableVector4(0.2, 0.2, 0.2, 1).setCallback(() => {\r\n if (this.type === 'constant') {\r\n (this._envLight as EnvConstantAmbient).ambientColor.set(this._ambientColor);\r\n }\r\n });\r\n this._ambientDown = new ObservableVector4(0.2, 0.2, 0.2, 1).setCallback(() => {\r\n if (this.type === 'hemisphere') {\r\n (this._envLight as EnvHemisphericAmbient).ambientDown.set(this._ambientDown);\r\n }\r\n });\r\n this._ambientUp = new ObservableVector4(0.3, 0.5, 0.8, 1).setCallback(() => {\r\n if (this.type === 'hemisphere') {\r\n (this._envLight as EnvHemisphericAmbient).ambientUp.set(this._ambientUp);\r\n }\r\n });\r\n this._radianceMap = new DRef();\r\n this._sheenRadianceMap = new DRef();\r\n this._irradianceMap = new DRef();\r\n this._irradianceSH = new DRef();\r\n this._irradianceSHFB = new DRef();\r\n this._irradianceWindow = new Vector3();\r\n this._strength = 1;\r\n // Filament's IndirectLight default intensity, in lux.\r\n this._intensity = 30000;\r\n this._specularStrength = 1;\r\n this._invalidateBake = null;\r\n }\r\n /**\r\n * @internal\r\n * Registers the owning {@link Environment}'s sky-bake invalidator, so photometric properties that\r\n * are only applied at bake time can force a re-bake when they change.\r\n */\r\n setBakeInvalidator(invalidate: Nullable<() => void>) {\r\n this._invalidateBake = invalidate;\r\n }\r\n /** @internal */\r\n getHash(ctx?: DrawContext) {\r\n const irradianceSource =\r\n this.type === 'ibl'\r\n ? this._irradianceSHFB.get()\r\n ? 'fb'\r\n : this._irradianceSH.get()\r\n ? 'buf'\r\n : 'none'\r\n : 'na';\r\n const ssgiHistory =\r\n !!ctx?.SSGI &&\r\n !!ctx.SSGIIrradianceHistoryTexture &&\r\n !!ctx.SSGISurfaceHistoryTexture &&\r\n (ctx.device.type === 'webgl' || !!ctx.motionVectorTexture);\r\n return !ctx || ctx.drawEnvLight\r\n ? `${this.type}:${this._envLight!.hasRadiance() ? '1' : '0'}:${\r\n this._envLight!.hasSheenRadiance() ? '1' : '0'\r\n }:${this._envLight!.hasIrradiance() ? '1' : '0'}:${irradianceSource}:ssgi${ssgiHistory ? '1' : '0'}`\r\n : 'none';\r\n }\r\n /** @internal */\r\n get envLight() {\r\n return this._envLight!;\r\n }\r\n /**\r\n * Multiplier on environment lighting, in both lighting modes.\r\n *\r\n * @remarks\r\n * In physical mode this is the per-frame dimmer for the IBL. The photometric {@link intensity}\r\n * only reaches the image through the cached sky bake -- and a `scatter` sky ignores it entirely,\r\n * taking its brightness from the sun -- so this is the control that always responds. 0 turns\r\n * environment lighting off.\r\n */\r\n get strength() {\r\n return this._strength;\r\n }\r\n set strength(val) {\r\n this._strength = val;\r\n }\r\n /**\r\n * Physical environment light intensity, in lux.\r\n *\r\n * @remarks\r\n * Mirrors Filament's `IndirectLight::Builder::intensity`: the illuminance a unit (0..1)\r\n * environment texture value represents. Applied when the sky is baked, so changing it re-bakes.\r\n *\r\n * Only affects authored skies (`skybox`, `image`). A `scatter` sky derives its luminance from the\r\n * sun's illuminance, so this value never enters its bake -- use {@link strength} to dim that.\r\n *\r\n * Used only when the owning scene enables physical lighting; legacy uses {@link strength}.\r\n * Default 30,000 lux matches Filament's default (roughly an overcast-to-hazy sky).\r\n */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n const intensity = Math.max(0, val);\r\n if (intensity !== this._intensity) {\r\n this._intensity = intensity;\r\n // Authored skies are lifted by this value when baked, so the cached cubemap is stale now.\r\n // A scatter sky ignores it (its brightness comes from the sun), but re-baking is harmless.\r\n this._invalidateBake?.();\r\n }\r\n }\r\n /**\r\n * Physical environment light intensity in lux.\r\n *\r\n * @deprecated Renamed to {@link intensity} to match the photometric unit it carries.\r\n */\r\n get radianceScale() {\r\n return this._intensity;\r\n }\r\n set radianceScale(val) {\r\n this.intensity = val;\r\n }\r\n /** The strength of environment specular lighting */\r\n get specularStrength() {\r\n return this._specularStrength;\r\n }\r\n set specularStrength(val) {\r\n this._specularStrength = val;\r\n }\r\n /** Ambient light color for environment light type constant */\r\n get ambientColor(): Vector4 {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(val: Vector4) {\r\n this._ambientColor.set(val);\r\n }\r\n /** Up color for environment light type hemisphere */\r\n get ambientUp(): Vector4 {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(val: Vector4) {\r\n this._ambientUp.set(val);\r\n }\r\n /** Down color for environment light type hemisphere */\r\n get ambientDown(): Vector4 {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(val: Vector4) {\r\n this._ambientDown.set(val);\r\n }\r\n /** Radiance map for environment light type ibl */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).radianceMap = this.radianceMap;\r\n }\r\n }\r\n /** Charlie-filtered sheen radiance map for environment light type ibl */\r\n get sheenRadianceMap() {\r\n return this._sheenRadianceMap.get();\r\n }\r\n set sheenRadianceMap(tex) {\r\n this._sheenRadianceMap.set(tex);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).sheenRadianceMap = this.sheenRadianceMap;\r\n }\r\n }\r\n /** Irradiance SH buffer for environment light type ibl */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).irradianceSH = this.irradianceSH;\r\n }\r\n }\r\n /** Irradiance SH texture for environment light type ibl */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).irradianceSHFB = this.irradianceSHFB;\r\n }\r\n }\r\n /** Irradiance SH window for environment light type ibl */\r\n get irradianceWindow(): Immutable<Vector3> {\r\n return this._irradianceWindow;\r\n }\r\n set irradianceWindow(value: Immutable<Vector3>) {\r\n this._irradianceWindow.set(value);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).irradianceWindow = this._irradianceWindow;\r\n }\r\n }\r\n /** The environment light type */\r\n get type() {\r\n return this._envLight?.getType() ?? 'none';\r\n }\r\n set type(val) {\r\n switch (val) {\r\n case 'none':\r\n this._envLight = null;\r\n break;\r\n case 'ibl':\r\n if (this._envLight?.getType() !== val) {\r\n this._envLight = new EnvShIBL(\r\n this.radianceMap!,\r\n this.irradianceSH!,\r\n this.irradianceSHFB!,\r\n this.sheenRadianceMap!\r\n );\r\n }\r\n (this._envLight as EnvShIBL).radianceMap = this.radianceMap;\r\n (this._envLight as EnvShIBL).sheenRadianceMap = this.sheenRadianceMap;\r\n (this._envLight as EnvShIBL).irradianceSH = this.irradianceSH;\r\n (this._envLight as EnvShIBL).irradianceSHFB = this.irradianceSHFB;\r\n (this._envLight as EnvShIBL).irradianceWindow = this.irradianceWindow;\r\n break;\r\n case 'constant':\r\n if (this._envLight?.getType() !== val) {\r\n this._envLight = new EnvConstantAmbient(this._ambientColor);\r\n }\r\n break;\r\n case 'hemisphere':\r\n if (this._envLight?.getType() !== val) {\r\n this._envLight = new EnvHemisphericAmbient(this._ambientUp, this._ambientDown);\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n /** Disposes the environment lighting wrapper */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._envLight?.dispose();\r\n this._radianceMap.dispose();\r\n this._sheenRadianceMap.dispose();\r\n this._irradianceMap.dispose();\r\n this._irradianceSHFB.dispose();\r\n this._irradianceSH.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Environment of scene\r\n * @public\r\n */\r\nexport class Environment extends Disposable {\r\n private readonly _sky: SkyRenderer;\r\n private readonly _light: EnvLightWrapper;\r\n /** @internal */\r\n constructor() {\r\n super();\r\n this._sky = new SkyRenderer();\r\n this._light = new EnvLightWrapper();\r\n // The physical `intensity` only reaches the image through the cached sky bake, so changing it\r\n // has to re-bake; otherwise the cubemap keeps the value it was baked with.\r\n this._light.setBakeInvalidator(() => this._sky.invalidate());\r\n }\r\n /** The sky renderer */\r\n get sky() {\r\n return this._sky;\r\n }\r\n /** The environment lighting renderer */\r\n get light() {\r\n return this._light;\r\n }\r\n /** @internal */\r\n getHash(ctx: DrawContext) {\r\n return `${this.light?.getHash(ctx)}:${this._sky?.getHash(ctx)}`;\r\n }\r\n /** @internal */\r\n needSceneDepthTexture() {\r\n return this._sky.fogType !== 'none';\r\n }\r\n /** Disposes the environment object */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._sky.dispose();\r\n this._light.dispose();\r\n }\r\n}\r\n"],"names":["EnvLightWrapper","Disposable","_envLight","_ambientColor","_ambientDown","_ambientUp","_radianceMap","_sheenRadianceMap","_irradianceMap","_irradianceSH","_irradianceSHFB","_irradianceWindow","_strength","_intensity","_specularStrength","EnvShIBL","ObservableVector4","setCallback","type","ambientColor","set","ambientDown","ambientUp","DRef","Vector3","_invalidateBake","setBakeInvalidator","invalidate","getHash","ctx","irradianceSource","get","ssgiHistory","SSGI","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","device","motionVectorTexture","drawEnvLight","hasRadiance","hasSheenRadiance","hasIrradiance","envLight","strength","val","intensity","Math","max","radianceScale","specularStrength","radianceMap","tex","sheenRadianceMap","irradianceSH","value","irradianceSHFB","irradianceWindow","getType","EnvConstantAmbient","EnvHemisphericAmbient","onDispose","dispose","Environment","_sky","_light","SkyRenderer","sky","light","needSceneDepthTexture","fogType"],"mappings":"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"}
1
+ {"version":3,"file":"environment.js","sources":["../../src/scene/environment.ts"],"sourcesContent":["import type { Immutable, Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Vector3, DRef, Disposable } from '@zephyr3d/base';\r\nimport { ObservableVector4 } from '@zephyr3d/base';\r\nimport type { DrawContext, EnvironmentLighting } from '../render';\r\nimport { getProbeVolumeForDraw } from '../render/gi/probe_volume';\r\nimport { EnvShIBL } from '../render';\r\nimport { EnvConstantAmbient, EnvHemisphericAmbient, EnvProbesOnly } from '../render';\r\nimport { SkyRenderer } from '../render/sky';\r\nimport { WindField } from './wind';\r\nimport type { FrameBuffer, GPUDataBuffer, TextureCube } from '@zephyr3d/device';\r\n\r\n/**\r\n * Wrapper for environmant lighting\r\n * @public\r\n */\r\nexport class EnvLightWrapper extends Disposable {\r\n private _envLight: Nullable<EnvironmentLighting>;\r\n /** Stands in for the environment light of type `none`, see {@link EnvLightWrapper.envLight}. */\r\n private readonly _probesOnly: EnvProbesOnly;\r\n private readonly _ambientColor: ObservableVector4;\r\n private readonly _ambientDown: ObservableVector4;\r\n private readonly _ambientUp: ObservableVector4;\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n private readonly _sheenRadianceMap: DRef<TextureCube>;\r\n private readonly _irradianceMap: DRef<TextureCube>;\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n private readonly _irradianceWindow: Vector3;\r\n private _strength: number;\r\n private _intensity: number;\r\n private _specularStrength: number;\r\n /** @internal Invalidates the owning Environment's cached sky bake. */\r\n private _invalidateBake: Nullable<() => void>;\r\n /** @internal */\r\n constructor() {\r\n super();\r\n this._envLight = new EnvShIBL();\r\n this._probesOnly = new EnvProbesOnly();\r\n this._ambientColor = new ObservableVector4(0.2, 0.2, 0.2, 1).setCallback(() => {\r\n if (this.type === 'constant') {\r\n (this._envLight as EnvConstantAmbient).ambientColor.set(this._ambientColor);\r\n }\r\n });\r\n this._ambientDown = new ObservableVector4(0.2, 0.2, 0.2, 1).setCallback(() => {\r\n if (this.type === 'hemisphere') {\r\n (this._envLight as EnvHemisphericAmbient).ambientDown.set(this._ambientDown);\r\n }\r\n });\r\n this._ambientUp = new ObservableVector4(0.3, 0.5, 0.8, 1).setCallback(() => {\r\n if (this.type === 'hemisphere') {\r\n (this._envLight as EnvHemisphericAmbient).ambientUp.set(this._ambientUp);\r\n }\r\n });\r\n this._radianceMap = new DRef();\r\n this._sheenRadianceMap = new DRef();\r\n this._irradianceMap = new DRef();\r\n this._irradianceSH = new DRef();\r\n this._irradianceSHFB = new DRef();\r\n this._irradianceWindow = new Vector3();\r\n this._strength = 1;\r\n // Filament's IndirectLight default intensity, in lux.\r\n this._intensity = 30000;\r\n this._specularStrength = 1;\r\n this._invalidateBake = null;\r\n }\r\n /**\r\n * @internal\r\n * Registers the owning {@link Environment}'s sky-bake invalidator, so photometric properties that\r\n * are only applied at bake time can force a re-bake when they change.\r\n */\r\n setBakeInvalidator(invalidate: Nullable<() => void>) {\r\n this._invalidateBake = invalidate;\r\n }\r\n /** @internal */\r\n getHash(ctx?: DrawContext) {\r\n const irradianceSource =\r\n this.type === 'ibl'\r\n ? this._irradianceSHFB.get()\r\n ? 'fb'\r\n : this._irradianceSH.get()\r\n ? 'buf'\r\n : 'none'\r\n : 'na';\r\n const ssgiHistory =\r\n !!ctx?.SSGI &&\r\n !!ctx.SSGIIrradianceHistoryTexture &&\r\n !!ctx.SSGISurfaceHistoryTexture &&\r\n !!ctx.motionVectorTexture;\r\n const envLight = this.envLight;\r\n return !ctx || ctx.drawEnvLight\r\n ? `${this.type}:${envLight.hasRadiance() ? '1' : '0'}:${\r\n envLight.hasSheenRadiance() ? '1' : '0'\r\n }:${envLight.hasIrradiance() ? '1' : '0'}:${irradianceSource}:ssgi${ssgiHistory ? '1' : '0'}:probes${\r\n getProbeVolumeForDraw(ctx) ? '1' : '0'\r\n }`\r\n : 'none';\r\n }\r\n /**\r\n * @internal\r\n * Environment lighting used by materials. For type `none`, a sky-less stand-in\r\n * that applies probe GI only; passes reading the sky check {@link EnvLightWrapper.type}.\r\n */\r\n get envLight(): EnvironmentLighting {\r\n return this._envLight ?? this._probesOnly;\r\n }\r\n /**\r\n * Multiplier on environment lighting, in both lighting modes.\r\n *\r\n * @remarks\r\n * In physical mode this is the per-frame dimmer for the IBL. The photometric {@link intensity}\r\n * only reaches the image through the cached sky bake -- and a `scatter` sky ignores it entirely,\r\n * taking its brightness from the sun -- so this is the control that always responds. 0 turns\r\n * environment lighting off.\r\n */\r\n get strength() {\r\n return this._strength;\r\n }\r\n set strength(val) {\r\n this._strength = val;\r\n }\r\n /**\r\n * Physical environment light intensity, in lux.\r\n *\r\n * @remarks\r\n * Mirrors Filament's `IndirectLight::Builder::intensity`: the illuminance a unit (0..1)\r\n * environment texture value represents. Applied when the sky is baked, so changing it re-bakes.\r\n *\r\n * Only affects authored skies (`skybox`, `image`). A `scatter` sky derives its luminance from the\r\n * sun's illuminance, so this value never enters its bake -- use {@link strength} to dim that.\r\n *\r\n * Used only when the owning scene enables physical lighting; legacy uses {@link strength}.\r\n * Default 30,000 lux matches Filament's default (roughly an overcast-to-hazy sky).\r\n */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n const intensity = Math.max(0, val);\r\n if (intensity !== this._intensity) {\r\n this._intensity = intensity;\r\n // Authored skies are lifted by this value when baked, so the cached cubemap is stale now.\r\n // A scatter sky ignores it (its brightness comes from the sun), but re-baking is harmless.\r\n this._invalidateBake?.();\r\n }\r\n }\r\n /**\r\n * Physical environment light intensity in lux.\r\n *\r\n * @deprecated Renamed to {@link intensity} to match the photometric unit it carries.\r\n */\r\n get radianceScale() {\r\n return this._intensity;\r\n }\r\n set radianceScale(val) {\r\n this.intensity = val;\r\n }\r\n /** The strength of environment specular lighting */\r\n get specularStrength() {\r\n return this._specularStrength;\r\n }\r\n set specularStrength(val) {\r\n this._specularStrength = val;\r\n }\r\n /** Ambient light color for environment light type constant */\r\n get ambientColor(): Vector4 {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(val: Vector4) {\r\n this._ambientColor.set(val);\r\n }\r\n /** Up color for environment light type hemisphere */\r\n get ambientUp(): Vector4 {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(val: Vector4) {\r\n this._ambientUp.set(val);\r\n }\r\n /** Down color for environment light type hemisphere */\r\n get ambientDown(): Vector4 {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(val: Vector4) {\r\n this._ambientDown.set(val);\r\n }\r\n /** Radiance map for environment light type ibl */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).radianceMap = this.radianceMap;\r\n }\r\n }\r\n /** Charlie-filtered sheen radiance map for environment light type ibl */\r\n get sheenRadianceMap() {\r\n return this._sheenRadianceMap.get();\r\n }\r\n set sheenRadianceMap(tex) {\r\n this._sheenRadianceMap.set(tex);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).sheenRadianceMap = this.sheenRadianceMap;\r\n }\r\n }\r\n /** Irradiance SH buffer for environment light type ibl */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).irradianceSH = this.irradianceSH;\r\n }\r\n }\r\n /** Irradiance SH texture for environment light type ibl */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).irradianceSHFB = this.irradianceSHFB;\r\n }\r\n }\r\n /** Irradiance SH window for environment light type ibl */\r\n get irradianceWindow(): Immutable<Vector3> {\r\n return this._irradianceWindow;\r\n }\r\n set irradianceWindow(value: Immutable<Vector3>) {\r\n this._irradianceWindow.set(value);\r\n if (this.type === 'ibl') {\r\n (this._envLight as EnvShIBL).irradianceWindow = this._irradianceWindow;\r\n }\r\n }\r\n /** The environment light type */\r\n get type() {\r\n return this._envLight?.getType() ?? 'none';\r\n }\r\n set type(val) {\r\n switch (val) {\r\n case 'none':\r\n this._envLight = null;\r\n break;\r\n case 'ibl':\r\n if (this._envLight?.getType() !== val) {\r\n this._envLight = new EnvShIBL(\r\n this.radianceMap!,\r\n this.irradianceSH!,\r\n this.irradianceSHFB!,\r\n this.sheenRadianceMap!\r\n );\r\n }\r\n (this._envLight as EnvShIBL).radianceMap = this.radianceMap;\r\n (this._envLight as EnvShIBL).sheenRadianceMap = this.sheenRadianceMap;\r\n (this._envLight as EnvShIBL).irradianceSH = this.irradianceSH;\r\n (this._envLight as EnvShIBL).irradianceSHFB = this.irradianceSHFB;\r\n (this._envLight as EnvShIBL).irradianceWindow = this.irradianceWindow;\r\n break;\r\n case 'constant':\r\n if (this._envLight?.getType() !== val) {\r\n this._envLight = new EnvConstantAmbient(this._ambientColor);\r\n }\r\n break;\r\n case 'hemisphere':\r\n if (this._envLight?.getType() !== val) {\r\n this._envLight = new EnvHemisphericAmbient(this._ambientUp, this._ambientDown);\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n /** Disposes the environment lighting wrapper */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._envLight?.dispose();\r\n this._probesOnly.dispose();\r\n this._radianceMap.dispose();\r\n this._sheenRadianceMap.dispose();\r\n this._irradianceMap.dispose();\r\n this._irradianceSHFB.dispose();\r\n this._irradianceSH.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Environment of scene\r\n * @public\r\n */\r\nexport class Environment extends Disposable {\r\n private readonly _sky: SkyRenderer;\r\n private readonly _light: EnvLightWrapper;\r\n private readonly _wind: WindField;\r\n /** @internal */\r\n constructor() {\r\n super();\r\n this._sky = new SkyRenderer();\r\n this._light = new EnvLightWrapper();\r\n this._wind = new WindField();\r\n // The physical `intensity` only reaches the image through the cached sky bake, so changing it\r\n // has to re-bake; otherwise the cubemap keeps the value it was baked with.\r\n this._light.setBakeInvalidator(() => this._sky.invalidate());\r\n }\r\n /** The sky renderer */\r\n get sky() {\r\n return this._sky;\r\n }\r\n /** The environment lighting renderer */\r\n get light() {\r\n return this._light;\r\n }\r\n /** The scene-wide wind */\r\n get wind() {\r\n return this._wind;\r\n }\r\n /** @internal */\r\n getHash(ctx: DrawContext) {\r\n return `${this.light?.getHash(ctx)}:${this._sky?.getHash(ctx)}`;\r\n }\r\n /** @internal */\r\n needSceneDepthTexture() {\r\n return this._sky.fogType !== 'none';\r\n }\r\n /** Disposes the environment object */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._sky.dispose();\r\n this._light.dispose();\r\n }\r\n}\r\n"],"names":["EnvLightWrapper","Disposable","_envLight","_ambientColor","_ambientDown","_ambientUp","_radianceMap","_sheenRadianceMap","_irradianceMap","_irradianceSH","_irradianceSHFB","_irradianceWindow","_strength","_intensity","_specularStrength","EnvShIBL","_probesOnly","EnvProbesOnly","ObservableVector4","setCallback","type","ambientColor","set","ambientDown","ambientUp","DRef","Vector3","_invalidateBake","setBakeInvalidator","invalidate","getHash","ctx","irradianceSource","get","ssgiHistory","SSGI","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","motionVectorTexture","envLight","drawEnvLight","hasRadiance","hasSheenRadiance","hasIrradiance","getProbeVolumeForDraw","strength","val","intensity","Math","max","radianceScale","specularStrength","radianceMap","tex","sheenRadianceMap","irradianceSH","value","irradianceSHFB","irradianceWindow","getType","EnvConstantAmbient","EnvHemisphericAmbient","onDispose","dispose","Environment","_sky","_light","_wind","SkyRenderer","WindField","sky","light","wind","needSceneDepthTexture","fogType"],"mappings":"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"}