@zephyr3d/scene 0.9.26 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -1 +1 @@
1
- {"version":3,"file":"weightedblended_oit.js","sources":["../../src/render/weightedblended_oit.ts"],"sourcesContent":["import type {\n AbstractDevice,\n BindGroup,\n GPUProgram,\n PBGlobalScope,\n PBInsideFunctionScope,\n PBShaderExp,\n RenderStateSet,\n Texture2D\n} from '@zephyr3d/device';\nimport { OIT } from './oit';\nimport type { DrawContext } from './drawable';\nimport { drawFullscreenQuad } from './fullscreenquad';\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\n\n/**\n * Weighted-blended OIT renderer.\n *\n * @remarks\n * The weighed-blended OIT renderer supports both WebGL, WebGL2 and WebGPU device.\n *\n * @public\n */\nexport class WeightedBlendedOIT extends OIT {\n /** Type name of WeightedBlendedOIT */\n public static readonly type = 'wb';\n private static _compositeProgram: GPUProgram;\n private static _compositeBindGroup: BindGroup;\n private static _compositeRenderStates: RenderStateSet;\n\n constructor() {\n super();\n }\n /**\n * {@inheritDoc OIT.getType}\n */\n getType() {\n return WeightedBlendedOIT.type;\n }\n /**\n * {@inheritDoc OIT.supportDevice}\n */\n supportDevice(_deviceType: string) {\n return true;\n }\n /**\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\n */\n wantsPremultipliedAlpha() {\n return false;\n }\n /**\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\n */\n wantsAdditiveLightPassAlpha() {\n return false;\n }\n /**\n * {@inheritDoc OIT.begin}\n */\n begin(_ctx: DrawContext) {\n return 1;\n }\n /**\n * {@inheritDoc OIT.end}\n */\n end(_ctx: DrawContext) {\n return;\n }\n /**\n * {@inheritDoc OIT.setupFragmentOutput}\n */\n setupFragmentOutput(scope: PBGlobalScope) {\n const pb = scope.$builder;\n scope.$outputs.outColor = pb.vec4();\n scope.$outputs.outAlpha = pb.getDevice().type === 'webgl' ? pb.vec4() : pb.float();\n }\n /**\n * {@inheritDoc OIT.beginPass}\n */\n beginPass(ctx: DrawContext, _pass: number) {\n const device = ctx.device;\n const accumBuffer = this.getAccumFramebuffer(ctx, device);\n device.pushDeviceStates();\n device.setFramebuffer(accumBuffer);\n device.clearFrameBuffer(new Vector4(0, 0, 0, 1), null, null);\n return true;\n }\n /**\n * {@inheritDoc OIT.endPass}\n */\n endPass(ctx: DrawContext, _pass: number) {\n const device = ctx.device;\n const accumBuffer = device.getFramebuffer()!;\n device.popDeviceStates();\n const accumTargets = accumBuffer.getColorAttachments();\n this.composite(ctx, device, accumTargets[0] as Texture2D, accumTargets[1] as Texture2D);\n }\n /**\n * {@inheritDoc OIT.calculateHash}\n */\n calculateHash() {\n return this.getType();\n }\n /**\n * {@inheritDoc OIT.applyUniforms}\n */\n applyUniforms(_ctx: DrawContext, _bindGroup: BindGroup) {\n return;\n }\n /**\n * {@inheritDoc OIT.outputFragmentColor}\n */\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\n const pb = scope.$builder;\n pb.func('Z_WBOIT_depthWeight', [pb.float('z'), pb.float('a')], function () {\n this.$return(\n pb.clamp(\n pb.mul(\n pb.pow(pb.add(pb.min(1, pb.mul(this.a, 10)), 0.01), 3),\n 1e8,\n pb.pow(pb.sub(1, pb.mul(this.z, 0.9)), 2)\n ),\n 1e-2,\n 3e3\n )\n );\n });\n pb.func('Z_WBOIT_output', [pb.vec4('color')], function () {\n // The weight ramp expects standard-oriented depth (0 = near)\n this.$l.w = this.Z_WBOIT_depthWeight(\n REVERSE_Z ? pb.sub(1, this.$builtins.fragCoord.z) : this.$builtins.fragCoord.z,\n this.color.a\n );\n this.$outputs[0] = pb.vec4(pb.mul(this.color.rgb, this.w), this.color.a);\n this.$outputs[1] =\n pb.getDevice().type === 'webgl'\n ? pb.vec4(pb.mul(this.color.a, this.w))\n : pb.mul(this.color.a, this.w);\n });\n scope.Z_WBOIT_output(color);\n return true;\n }\n /**\n * {@inheritDoc OIT.setRenderStates}\n */\n setRenderStates(rs: RenderStateSet) {\n const blendingState = rs.useBlendingState();\n blendingState.enable(true);\n blendingState.setBlendEquation('add', 'add');\n blendingState.setBlendFuncRGB('one', 'one');\n blendingState.setBlendFuncAlpha('zero', 'inv-src-alpha');\n const depthState = rs.useDepthState();\n depthState.enableWrite(false).enableTest(true);\n }\n /** @internal */\n private composite(ctx: DrawContext, device: AbstractDevice, accumColor: Texture2D, accumAlpha: Texture2D) {\n const currentFramebuffer = device.getFramebuffer();\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\n const singleColorFramebuffer =\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\n ? device.pool.fetchTemporalFramebuffer(\n false,\n 0,\n 0,\n colorAttachment,\n currentFramebuffer.getDepthAttachment(),\n false\n )\n : null;\n if (singleColorFramebuffer) {\n const viewport = device.getViewport();\n const scissor = device.getScissor();\n device.pushDeviceStates();\n device.setFramebuffer(singleColorFramebuffer);\n device.setViewport(viewport);\n device.setScissor(scissor);\n }\n try {\n device.setProgram(WeightedBlendedOIT.getCompositeProgram(device));\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumColorTex', accumColor);\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumAlphaTex', accumAlpha);\n device.setBindGroup(0, WeightedBlendedOIT._compositeBindGroup);\n drawFullscreenQuad(WeightedBlendedOIT._compositeRenderStates);\n } finally {\n if (singleColorFramebuffer) {\n device.popDeviceStates();\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\n }\n }\n }\n /** @internal */\n private getAccumFramebuffer(ctx: DrawContext, device: AbstractDevice) {\n const width = ctx.depthTexture!.width;\n const height = ctx.depthTexture!.height;\n const accumColor = device.pool.fetchTemporalTexture2D(false, 'rgba16f', width, height, false);\n const accumAlpha = device.pool.fetchTemporalTexture2D(\n false,\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\n width,\n height,\n false\n );\n const fb = device.pool.createTemporalFramebuffer(true, [accumColor, accumAlpha], ctx.depthTexture);\n device.pool.releaseTexture(accumColor);\n device.pool.releaseTexture(accumAlpha);\n return fb;\n }\n /** @internal */\n private static getCompositeProgram(device: AbstractDevice) {\n if (!this._compositeProgram) {\n this._compositeProgram = device.buildRenderProgram({\n vertex(pb) {\n this.$inputs.pos = pb.vec2().attrib('position');\n this.$outputs.uv = pb.vec2();\n pb.main(function () {\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\n if (device.type === 'webgpu') {\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\n }\n });\n },\n fragment(pb) {\n this.$outputs.outColor = pb.vec4();\n this.accumColorTex = pb.tex2D().uniform(0);\n this.accumAlphaTex = pb.tex2D().uniform(0);\n pb.main(function () {\n this.$l.accumColor = pb.textureSample(this.accumColorTex, this.$inputs.uv);\n this.$l.accumAlpha = pb.textureSample(this.accumAlphaTex, this.$inputs.uv);\n this.$l.r = this.accumColor.a;\n this.accumColor.a = this.accumAlpha.r;\n this.$outputs.outColor = pb.vec4(\n pb.div(this.accumColor.rgb, pb.clamp(this.accumColor.a, 0.0001, 50000)),\n this.r\n );\n });\n }\n })!;\n this._compositeProgram.name = '@WBOIT_Composite';\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\n this._compositeRenderStates = device.createRenderStateSet();\n this._compositeRenderStates\n .useBlendingState()\n .enable(true)\n .setBlendFuncRGB('inv-src-alpha', 'src-alpha')\n .setBlendFuncAlpha('zero', 'one');\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\n }\n return this._compositeProgram;\n }\n}\n"],"names":["WeightedBlendedOIT","OIT","type","_compositeProgram","_compositeBindGroup","_compositeRenderStates","getType","supportDevice","_deviceType","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","_ctx","end","setupFragmentOutput","scope","pb","$builder","$outputs","outColor","vec4","outAlpha","getDevice","float","beginPass","ctx","_pass","device","accumBuffer","getAccumFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","Vector4","endPass","getFramebuffer","popDeviceStates","accumTargets","getColorAttachments","composite","calculateHash","applyUniforms","_bindGroup","outputFragmentColor","color","func","$return","clamp","mul","pow","add","min","a","sub","z","$l","w","Z_WBOIT_depthWeight","REVERSE_Z","$builtins","fragCoord","rgb","Z_WBOIT_output","setRenderStates","rs","blendingState","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","depthState","useDepthState","enableWrite","enableTest","accumColor","accumAlpha","currentFramebuffer","colorAttachment","singleColorFramebuffer","length","pool","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setTexture","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","width","depthTexture","height","fetchTemporalTexture2D","fb","createTemporalFramebuffer","releaseTexture","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","DEPTH_FARTHEST","xy","y","neg","fragment","accumColorTex","tex2D","uniform","accumAlphaTex","textureSample","r","div","name","createBindGroup","bindGroupLayouts","createRenderStateSet"],"mappings":"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"}
1
+ {"version":3,"file":"weightedblended_oit.js","sources":["../../src/render/weightedblended_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Weighted-blended OIT renderer.\r\n *\r\n * @remarks\r\n * The weighed-blended OIT renderer supports both WebGL, WebGL2 and WebGPU device.\r\n *\r\n * @public\r\n */\r\nexport class WeightedBlendedOIT extends OIT {\r\n /** Type name of WeightedBlendedOIT */\r\n public static readonly type = 'wb';\r\n private static _compositeProgram: GPUProgram;\r\n private static _compositeBindGroup: BindGroup;\r\n private static _compositeRenderStates: RenderStateSet;\r\n\r\n constructor() {\r\n super();\r\n }\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return WeightedBlendedOIT.type;\r\n }\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(_deviceType: string) {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(_ctx: DrawContext) {\r\n return 1;\r\n }\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(_ctx: DrawContext) {\r\n return;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.$outputs.outColor = pb.vec4();\r\n scope.$outputs.outAlpha = pb.float();\r\n }\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, _pass: number) {\r\n const device = ctx.device;\r\n const accumBuffer = this.getAccumFramebuffer(ctx, device);\r\n device.pushDeviceStates();\r\n device.setFramebuffer(accumBuffer);\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 1), null, null);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n const device = ctx.device;\r\n const accumBuffer = device.getFramebuffer()!;\r\n device.popDeviceStates();\r\n const accumTargets = accumBuffer.getColorAttachments();\r\n this.composite(ctx, device, accumTargets[0] as Texture2D, accumTargets[1] as Texture2D);\r\n }\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this.getType();\r\n }\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, _bindGroup: BindGroup) {\r\n return;\r\n }\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('Z_WBOIT_depthWeight', [pb.float('z'), pb.float('a')], function () {\r\n this.$return(\r\n pb.clamp(\r\n pb.mul(\r\n pb.pow(pb.add(pb.min(1, pb.mul(this.a, 10)), 0.01), 3),\r\n 1e8,\r\n pb.pow(pb.sub(1, pb.mul(this.z, 0.9)), 2)\r\n ),\r\n 1e-2,\r\n 3e3\r\n )\r\n );\r\n });\r\n pb.func('Z_WBOIT_output', [pb.vec4('color')], function () {\r\n // The weight ramp expects standard-oriented depth (0 = near)\r\n this.$l.w = this.Z_WBOIT_depthWeight(\r\n REVERSE_Z ? pb.sub(1, this.$builtins.fragCoord.z) : this.$builtins.fragCoord.z,\r\n this.color.a\r\n );\r\n this.$outputs[0] = pb.vec4(pb.mul(this.color.rgb, this.w), this.color.a);\r\n this.$outputs[1] = pb.mul(this.color.a, this.w);\r\n });\r\n scope.Z_WBOIT_output(color);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n const blendingState = rs.useBlendingState();\r\n blendingState.enable(true);\r\n blendingState.setBlendEquation('add', 'add');\r\n blendingState.setBlendFuncRGB('one', 'one');\r\n blendingState.setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n const depthState = rs.useDepthState();\r\n depthState.enableWrite(false).enableTest(true);\r\n }\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, accumColor: Texture2D, accumAlpha: Texture2D) {\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(WeightedBlendedOIT.getCompositeProgram(device));\r\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumColorTex', accumColor);\r\n WeightedBlendedOIT._compositeBindGroup.setTexture('accumAlphaTex', accumAlpha);\r\n device.setBindGroup(0, WeightedBlendedOIT._compositeBindGroup);\r\n drawFullscreenQuad(WeightedBlendedOIT._compositeRenderStates);\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private getAccumFramebuffer(ctx: DrawContext, device: AbstractDevice) {\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const accumColor = device.pool.fetchTemporalTexture2D(false, 'rgba16f', width, height, false);\r\n const accumAlpha = device.pool.fetchTemporalTexture2D(false, 'r16f', width, height, false);\r\n const fb = device.pool.createTemporalFramebuffer(true, [accumColor, accumAlpha], ctx.depthTexture);\r\n device.pool.releaseTexture(accumColor);\r\n device.pool.releaseTexture(accumAlpha);\r\n return fb;\r\n }\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.accumColorTex = pb.tex2D().uniform(0);\r\n this.accumAlphaTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.accumColor = pb.textureSample(this.accumColorTex, this.$inputs.uv);\r\n this.$l.accumAlpha = pb.textureSample(this.accumAlphaTex, this.$inputs.uv);\r\n this.$l.r = this.accumColor.a;\r\n this.accumColor.a = this.accumAlpha.r;\r\n this.$outputs.outColor = pb.vec4(\r\n pb.div(this.accumColor.rgb, pb.clamp(this.accumColor.a, 0.0001, 50000)),\r\n this.r\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@WBOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('inv-src-alpha', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n return this._compositeProgram;\r\n }\r\n}\r\n"],"names":["WeightedBlendedOIT","OIT","type","_compositeProgram","_compositeBindGroup","_compositeRenderStates","getType","supportDevice","_deviceType","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","_ctx","end","setupFragmentOutput","scope","pb","$builder","$outputs","outColor","vec4","outAlpha","float","beginPass","ctx","_pass","device","accumBuffer","getAccumFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","Vector4","endPass","getFramebuffer","popDeviceStates","accumTargets","getColorAttachments","composite","calculateHash","applyUniforms","_bindGroup","outputFragmentColor","color","func","$return","clamp","mul","pow","add","min","a","sub","z","$l","w","Z_WBOIT_depthWeight","REVERSE_Z","$builtins","fragCoord","rgb","Z_WBOIT_output","setRenderStates","rs","blendingState","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","depthState","useDepthState","enableWrite","enableTest","accumColor","accumAlpha","currentFramebuffer","colorAttachment","singleColorFramebuffer","length","pool","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setTexture","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","width","depthTexture","height","fetchTemporalTexture2D","fb","createTemporalFramebuffer","releaseTexture","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","DEPTH_FARTHEST","xy","y","neg","fragment","accumColorTex","tex2D","uniform","accumAlphaTex","textureSample","r","div","name","createBindGroup","bindGroupLayouts","createRenderStateSet"],"mappings":"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"}
@@ -3,18 +3,18 @@ import { GraphNode } from './graph_node.js';
3
3
  import { QUEUE_OPAQUE } from '../values.js';
4
4
  import '../render/render_queue.js';
5
5
  import { RenderBundleWrapper } from '../render/renderbundle_wrapper.js';
6
- import { getDevice } from '../app/api.js';
7
6
  import { Primitive } from '../render/primitive.js';
8
7
  import '@zephyr3d/device';
9
8
  import '../material/shader/helper.js';
10
9
  import '../material/lambert.js';
11
10
  import '../material/blinn.js';
12
11
  import '../material/unlit.js';
12
+ import '../material/meshmaterial.js';
13
13
  import '../material/particle.js';
14
14
  import '../material/subsurfaceprofile.js';
15
- import '../material/skin.js';
15
+ import '../material/sssprofile.js';
16
+ import '../material/sss.js';
16
17
  import '../material/eye.js';
17
- import '../material/meshmaterial.js';
18
18
  import '../material/hair.js';
19
19
  import '../material/hairstrand.js';
20
20
  import '../material/grassmaterial.js';
@@ -31,9 +31,14 @@ import '../render/lightpass.js';
31
31
  import '../render/sky.js';
32
32
  import '../render/clipmap.js';
33
33
  import '../render/envlight.js';
34
+ import '../render/lod.js';
34
35
  import '../render/dualdepthpeeling_oit.js';
35
36
  import '../shaders/atmosphere.js';
37
+ import '../render/water_interaction.js';
36
38
  import '../render/rendergraph/scene_render_context.js';
39
+ import '../render/sdf/scene_sdf.js';
40
+ import '../render/sdf/global_sdf.js';
41
+ import '../render/gi/voxelize_pass.js';
37
42
  import { BoundingBox } from '../utility/bounding_volume.js';
38
43
  import { mixinDrawable } from '../render/drawable_mixin.js';
39
44
 
@@ -61,7 +66,7 @@ import { mixinDrawable } from '../render/drawable_mixin.js';
61
66
  this._pickTarget = {
62
67
  node: this
63
68
  };
64
- this._batchable = getDevice().type !== 'webgl';
69
+ this._batchable = true;
65
70
  this._anchor = new Vector2(0.5, 0.5);
66
71
  this._rotateAngle = 0;
67
72
  this._renderBundle = {};
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA;;;AAGC,IACM,MAAMA,UACHC,SAAAA,WAAAA,CAAYC,SAAWC,EAAAA,aAAAA,CAAAA,CAAAA;AAG/B,qBACA,OAAeC,UAA8B,GAAA,IAAIC,IAAO,EAAA;qBAExD,SAAsC;qBAEtC,aAA0C;qBAE1C,UAA8B;qBAE9B,WAAkC;qBAElC,aAAsD;qBAEtD,gBAAoC;qBAEpC,kBAA+C;qBAE/C,OAA2B;qBAE3B,YAA+B;AAC/B;;;MAIA,WAAA,CAAYC,KAAY,CAAE;AACxB,QAAA,KAAK,CAACA,KAAAA,CAAAA;QACN,IAAI,CAACC,SAAS,GAAG,IAAIF,IAAAA,EAAAA;QACrB,IAAI,CAACG,aAAa,GAAG,IAAA;QACrB,IAAI,CAACC,WAAW,GAAG;AAAEC,YAAAA,IAAAA,EAAM;AAAK,SAAA;AAChC,QAAA,IAAI,CAACC,UAAU,GAAGC,SAAAA,EAAAA,CAAYC,IAAI,KAAK,OAAA;AACvC,QAAA,IAAI,CAACC,OAAO,GAAG,IAAIC,QAAQ,GAAK,EAAA,GAAA,CAAA;QAChC,IAAI,CAACC,YAAY,GAAG,CAAA;QACpB,IAAI,CAACC,aAAa,GAAG,EAAC;QACtB,IAAI,CAACC,gBAAgB,GAAG,IAAA;QACxB,IAAI,CAACC,kBAAkB,GAAG,IAAA;AAC5B;AACA;;MAGAC,aAAAA,CAAcC,WAAuB,EAAE;QACrC,OAAO,CAAA,EAAG,IAAI,CAACb,aAAa,CAAC,CAAC,EAAE,IAAI,CAACc,cAAc,IAAI,CAAG,CAAA,CAAA;AAC5D;AACA;;AAEC,MACDC,mBAAsB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAChB,SAAS,CAACiB,GAAG,GAAIC,iBAAiB;AAChD;AACA;;AAEC,MACDC,aAAgB,GAAA;QACd,OAAO,IAAI,CAACjB,WAAW;AACzB;IACAkB,aAAcjB,CAAAA,IAAe,EAAEkB,KAAc,EAAE;QAC7C,IAAI,CAACnB,WAAW,GAAG;AAAEC,YAAAA,IAAAA;AAAMkB,YAAAA;AAAM,SAAA;AACnC;gCAEA,IAAIC,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACtB,SAAS,CAACiB,GAAG,EAAA;AAC3B;IACA,IAAIK,QAAAA,CAASC,CAAC,EAAE;QACd,IAAI,IAAI,CAACvB,SAAS,CAACiB,GAAG,EAAOM,KAAAA,CAAAA,IAAKA,aAAaC,cAAgB,EAAA;AAC7D,YAAA,IAAI,CAACxB,SAAS,CAACyB,GAAG,CAACF,CAAAA,CAAAA;AACnB,YAAA,IAAIA,CAAG,EAAA;gBACL,IAAI,CAACG,aAAa,CAACH,CAAAA,CAAAA;AACnBI,gBAAAA,mBAAAA,CAAoBC,gBAAgB,CAACL,CAAEM,CAAAA,YAAY,EAAE,IAAI,CAAA;AAC3D;YACA,IAAI,CAAC5B,aAAa,GAAGsB,CAAI,GAAA,CAAA,EAAG,IAAI,CAAC,WAAW,CAACO,IAAI,CAAC,CAAC,EAAE,IAAI,CAACC,MAAM,EAAEC,EAAM,IAAA,CAAA,CAAE,CAAC,EAAET,CAAAA,CAAEU,UAAU,CAAA,CAAE,GAAG,IAAA;YAC9FN,mBAAoBO,CAAAA,eAAe,CAAC,IAAI,CAAA;YACxC,IAAI,CAACtB,kBAAkB,GAAG,IAAA;AAC5B;AACF;AACA,IAAA,IAAIuB,OAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC5B,OAAO,CAAC6B,CAAC;AACvB;IACA,IAAID,OAAAA,CAAQE,KAAK,EAAE;AACjB,QAAA,IAAI,IAAI,CAAC9B,OAAO,CAAC6B,CAAC,KAAKC,KAAO,EAAA;AAC5B,YAAA,IAAI,CAAC9B,OAAO,CAAC6B,CAAC,GAAGC,KAAAA;YACjB,IAAI,CAACC,6BAA6B,CAAC,KAAA,CAAA;AACnC,YAAA,MAAMhB,QAAW,GAAA,IAAI,CAACtB,SAAS,CAACiB,GAAG,EAAA;AACnC,YAAA,IAAIK,QAAU,EAAA;AACZA,gBAAAA,QAAAA,CAASa,OAAO,GAAG,IAAI,CAAC5B,OAAO,CAAC6B,CAAC;AACnC;AACF;AACF;AACA,IAAA,IAAIG,OAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAChC,OAAO,CAACiC,CAAC;AACvB;IACA,IAAID,OAAAA,CAAQF,KAAK,EAAE;AACjB,QAAA,IAAI,IAAI,CAAC9B,OAAO,CAACiC,CAAC,KAAKH,KAAO,EAAA;AAC5B,YAAA,IAAI,CAAC9B,OAAO,CAACiC,CAAC,GAAGH,KAAAA;YACjB,IAAI,CAACC,6BAA6B,CAAC,KAAA,CAAA;AACnC,YAAA,MAAMhB,QAAW,GAAA,IAAI,CAACtB,SAAS,CAACiB,GAAG,EAAA;AACnC,YAAA,IAAIK,QAAU,EAAA;AACZA,gBAAAA,QAAAA,CAASiB,OAAO,GAAG,IAAI,CAAChC,OAAO,CAACiC,CAAC;AACnC;AACF;AACF;AACA,IAAA,IAAIC,SAAY,GAAA;AACd,QAAA,MAAMC,SAAS,IAAI,CAAC1C,SAAS,CAACiB,GAAG,GAAIyB,MAAM;AAC3C,QAAA,OAAO,IAAIlC,OAAQkC,CAAAA,MAAAA,CAAON,CAAC,EAAEM,OAAOF,CAAC,CAAA;AACvC;IACA,IAAIC,SAAAA,CAAUJ,KAAK,EAAE;AACnB,QAAA,MAAMK,SAAS,IAAI,CAAC1C,SAAS,CAACiB,GAAG,GAAIyB,MAAM;AAC3C,QAAA,IAAI,CAAC1C,SAAS,CAACiB,GAAG,EAAA,CAAI0B,SAAS,CAACN,KAAAA,CAAMD,CAAC,EAAEC,MAAMG,CAAC,EAAEE,OAAOE,CAAC,EAAEF,OAAOG,CAAC,CAAA;AACtE;AACA,IAAA,IAAIC,aAAgB,GAAA;AAClB,QAAA,MAAMJ,SAAS,IAAI,CAAC1C,SAAS,CAACiB,GAAG,GAAIyB,MAAM;AAC3C,QAAA,OAAO,IAAIlC,OAAQkC,CAAAA,MAAAA,CAAOE,CAAC,EAAEF,OAAOG,CAAC,CAAA;AACvC;IACA,IAAIC,aAAAA,CAAcT,KAAK,EAAE;AACvB,QAAA,MAAMK,SAAS,IAAI,CAAC1C,SAAS,CAACiB,GAAG,GAAIyB,MAAM;AAC3C,QAAA,IAAI,CAAC1C,SAAS,CAACiB,GAAG,EAAA,CAAI0B,SAAS,CAACD,MAAAA,CAAON,CAAC,EAAEM,OAAOF,CAAC,EAAEH,MAAMD,CAAC,EAAEC,MAAMG,CAAC,CAAA;AACtE;AACA;;AAEC,MACDO,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,WAAqC,GAAA;AACnC,QAAA,OAAO,IAAI,CAAC7C,UAAU,IAAI,CAAC,CAAC,IAAI,CAACJ,SAAS,CAACiB,GAAG,MAAM,IAAI,CAACjB,SAAS,CAACiB,GAAG,GAAIgC,WAAW,EAAA;AACvF;AACA;;AAEC,MACDC,YAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC5B,QAAQ,EAAE4B,YAAkBC,EAAAA,IAAAA,YAAAA;AAC1C;AACA;;AAEC,MACDC,OAAU,GAAA;AACR,QAAA,OAAO,CAAC,IAAI,CAAC9B,QAAQ,EAAE+B,eAAAA,EAAAA;AACzB;AACA;;AAEC,MACDC,cAAiB,GAAA;QACf,OAAO,IAAI,CAAChC,QAAQ,EAAEgC,cAAAA,EAAAA;AACxB;AACA;;AAEC,MACDC,cAAiB,GAAA;QACf,OAAO,IAAI,CAACjC,QAAQ,EAAEiC,cAAAA,EAAAA;AACxB;AACA;;AAEC,MACDC,KAAKC,GAAgB,EAAEC,WAAkC,EAAEC,IAAa,EAAE;QACxE,MAAMrC,QAAAA,GAAW,IAAI,CAACA,QAAQ;QAC9B,MAAMsC,SAAAA,GAAY,IAAI,CAACC,YAAY,EAAA;AACnC,QAAA,IAAIvC,YAAYsC,SAAW,EAAA;YACzB,IAAI,IAAI,CAACjD,gBAAgB,IAAI,CAAC8C,GAAIK,CAAAA,YAAY,IAAIH,IAAM,EAAA;AACtD,gBAAA,IAAI,IAAI,CAAC/C,kBAAkB,KAAKU,QAAAA,CAASyC,SAAS,EAAE;oBAClD,IAAI,CAACrD,aAAa,GAAG,EAAC;AACtB,oBAAA,IAAI,CAACE,kBAAkB,GAAGU,QAAAA,CAASyC,SAAS;AAC9C;AACA,gBAAA,MAAMC,YAAe,GAAA,IAAI,CAACtD,aAAa,CAACiD,IAAK,CAAA;AAC7C,gBAAA,IAAI,CAACK,YAAc,EAAA;oBACjBP,GAAIQ,CAAAA,MAAM,CAACC,YAAY,EAAA;oBACvB,IAAI,CAACC,IAAI,CAACV,GAAKC,EAAAA,WAAAA,CAAAA;oBACfpC,QAASkC,CAAAA,IAAI,CAACI,SAAWH,EAAAA,GAAAA,CAAAA;oBACzB,IAAI,CAAC/C,aAAa,CAACiD,IAAAA,CAAK,GAAGF,GAAIQ,CAAAA,MAAM,CAACG,UAAU,EAAA;iBAC3C,MAAA;oBACLX,GAAIQ,CAAAA,MAAM,CAACI,mBAAmB,CAACL,YAAAA,CAAAA;AACjC;aACK,MAAA;gBACL,IAAI,CAACG,IAAI,CAACV,GAAKC,EAAAA,WAAAA,CAAAA;gBACfpC,QAASkC,CAAAA,IAAI,CAACI,SAAWH,EAAAA,GAAAA,CAAAA;AAC3B;AACF;AACF;AACA;;AAEC,MACDa,WAAc,GAAA;QACZ,OAAO,IAAI,CAAChD,QAAQ;AACtB;AACA;;AAEC,MACDuC,YAAe,GAAA;AACb,QAAA,IAAID,SAAYnE,GAAAA,UAAAA,CAAWI,UAAU,CAACoB,GAAG,EAAA;AACzC,QAAA,IAAI,CAAC2C,SAAW,EAAA;AACdA,YAAAA,SAAAA,GAAY,IAAIW,SAAAA,EAAAA;AAChBX,YAAAA,SAAAA,CAAUY,wBAAwB,CAAC,cAAgB,EAAA,IAAIC,YAAa,CAAA;AAAC,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA;AAAE,aAAA,CAAA,CAAA;YAChFb,SAAUc,CAAAA,uBAAuB,CAAC,IAAIC,WAAY,CAAA;AAAC,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA;AAAE,aAAA,CAAA,CAAA;AAC9Df,YAAAA,SAAAA,CAAUgB,aAAa,GAAG,gBAAA;YAC1BnF,UAAWI,CAAAA,UAAU,CAAC4B,GAAG,CAACmC,SAAAA,CAAAA;AAC5B;QACA,OAAOA,SAAAA;AACT;AACA;;AAEC,MACDiB,eAAkB,GAAA;QAChB,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,oBAAoD,GAAA;QAClD,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,OAAU,GAAA;;AAER,QAAA,OAAO,IAAI;AACb;AACA;;AAEC,MACDC,qBAAwB,GAAA;QACtB,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,0BAA6B,GAAA;QAC3B,MAAMC,CAAAA,GAAI,IAAI,CAACC,WAAW,CAACC,oBAAoB,CAACC,QAAQC,IAAI,EAAA,CAAA;QAC5D,MAAMC,MAAAA,GAASC,KAAKC,KAAK,CAAC,IAAI,CAACN,WAAW,CAAC,CAAE,CAAA,EAAE,IAAI,CAACA,WAAW,CAAC,CAAE,CAAA,EAAE,IAAI,CAACA,WAAW,CAAC,CAAE,CAAA,CAAA;QACvF,MAAMO,MAAAA,GAASF,KAAKC,KAAK,CAAC,IAAI,CAACN,WAAW,CAAC,CAAE,CAAA,EAAE,IAAI,CAACA,WAAW,CAAC,CAAE,CAAA,EAAE,IAAI,CAACA,WAAW,CAAC,CAAE,CAAA,CAAA;AACvF,QAAA,MAAMQ,GAAM,GAAA,IAAI,CAAC3F,SAAS,EAAEiB,GAAAA,EAAAA;AAC5B,QAAA,IAAI0E,GAAK,EAAA;AACP,YAAA,MAAMC,cAAc,IAAIC,WAAAA,EAAAA;YACxB,MAAMC,EAAAA,GAAKN,KAAKO,GAAG,CAACP,KAAKQ,GAAG,CAAC,IAAI,CAACzF,OAAO,CAAC6B,CAAC,CAAGoD,EAAAA,IAAAA,CAAKQ,GAAG,CAAC,CAAA,GAAI,IAAI,CAACzF,OAAO,CAAC6B,CAAC,CAAKmD,CAAAA,GAAAA,MAAAA;YAC9E,MAAMU,EAAAA,GAAKT,KAAKO,GAAG,CAACP,KAAKQ,GAAG,CAAC,IAAI,CAACzF,OAAO,CAACiC,CAAC,CAAGgD,EAAAA,IAAAA,CAAKQ,GAAG,CAAC,CAAA,GAAI,IAAI,CAACzF,OAAO,CAACiC,CAAC,CAAKkD,CAAAA,GAAAA,MAAAA;AAC9E,YAAA,MAAMQ,IAAOV,GAAAA,IAAAA,CAAKO,GAAG,CAACD,EAAIG,EAAAA,EAAAA,CAAAA;AAC1BL,YAAAA,WAAAA,CAAYO,QAAQ,CAACC,MAAM,CAAClB,EAAE9C,CAAC,GAAG8D,IAAMhB,EAAAA,CAAAA,CAAE1C,CAAC,GAAG0D,IAAMhB,EAAAA,CAAAA,CAAEtC,CAAC,GAAGsD,IAAAA,CAAAA;AAC1DN,YAAAA,WAAAA,CAAYS,QAAQ,CAACD,MAAM,CAAClB,EAAE9C,CAAC,GAAG8D,IAAMhB,EAAAA,CAAAA,CAAE1C,CAAC,GAAG0D,IAAMhB,EAAAA,CAAAA,CAAEtC,CAAC,GAAGsD,IAAAA,CAAAA;YAC1D,OAAON,WAAAA;AACT;QACA,OAAO,IAAA;AACT;AACAU,IAAAA,uBAAAA,CAAwBC,SAAoB,EAAE;AAC5C,QAAA,MAAMC,MAAM,IAAI,CAACC,QAAQ,CAACC,aAAa,GAAG9D,CAAC;AAC3C,QAAA,MAAM+D,YAAYC,UAAWC,CAAAA,aAAa,CAACxB,OAAAA,CAAQyB,MAAM,EAAIN,EAAAA,GAAAA,CAAAA;QAC7DD,SAAUQ,CAAAA,OAAO,CAAC,IAAI,CAACC,QAAQ,EAAEL,SAAAA,EAAW,IAAI,CAACM,SAAS,CAAA;AAC1D,QAAA,IAAI,IAAI,CAACjH,SAAS,EAAEiB,GAAO,EAAA,EAAA;YACzB,IAAI,CAACR,YAAY,GAAG,CAAC+F,GAAAA;YACrB,IAAI,CAACxG,SAAS,CAACiB,GAAG,GAAIwF,QAAQ,GAAG,IAAI,CAAChG,YAAY;AACpD;;AAGF;AACAyG,IAAAA,uBAAAA,CAAwBX,SAAoB,EAAE;AAC5CA,QAAAA,SAAAA,CAAU9E,GAAG,CAAC,IAAI,CAAC0F,WAAW,CAAA;QAC9B,IAAI,IAAI,CAACC,MAAM,EAAE;YACfb,SAAUc,CAAAA,GAAG,IAAI,IAAI,CAACD,MAAM,CAACjC,WAAW,CAACkC,GAAG;YAC5Cd,SAAUe,CAAAA,GAAG,IAAI,IAAI,CAACF,MAAM,CAACjC,WAAW,CAACmC,GAAG;YAC5Cf,SAAUgB,CAAAA,GAAG,IAAI,IAAI,CAACH,MAAM,CAACjC,WAAW,CAACoC,GAAG;AAC9C;AACF;AACA,2CACU7F,aAAcJ,CAAAA,QAAW,EAAE;AACnCA,QAAAA,QAAAA,CAASkG,MAAM,GAAG,IAAI,CAACjH,OAAO;AAC9Be,QAAAA,QAAAA,CAASmF,QAAQ,GAAG,IAAI,CAAChG,YAAY;AACvC;kCAEA,SAAsB,GAAA;AACpB,QAAA,KAAK,CAACgH,SAAAA,EAAAA;QACN,IAAI,CAACzH,SAAS,CAAC0H,OAAO,EAAA;QACtB/F,mBAAoBO,CAAAA,eAAe,CAAC,IAAI,CAAA;AAC1C;AACF;;;;"}
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
  }