@zephyr3d/scene 0.9.27 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ import { DEBUG_VIEWS } from '@zephyr3d/base';
2
+ import { RENDER_PASS_TYPE_LIGHT, RENDER_PASS_TYPE_DEPTH } from '../values.js';
3
+
4
+ /**
5
+ * Wireframe debug view: while active, triangle primitives draw as the edges of their triangles,
6
+ * see Primitive. Nested, so a wireframe mesh drawn inside a wireframe view ends it only once.
7
+ */ let wireframeDepth = 0;
8
+ /** @internal Whether primitives drawn now are drawn as wireframe */ function isWireframeActive() {
9
+ return DEBUG_VIEWS && wireframeDepth > 0;
10
+ }
11
+ /**
12
+ * @internal Whether a draw in this context may draw wireframe: the depth and light passes, which
13
+ * must agree for the light pass's equal depth test. Shadows and picking keep the triangles.
14
+ */ function isWireframePass(ctx) {
15
+ const type = ctx?.renderPass?.type;
16
+ return DEBUG_VIEWS && (type === RENDER_PASS_TYPE_LIGHT || type === RENDER_PASS_TYPE_DEPTH);
17
+ }
18
+ /** @internal Start drawing primitives as wireframe, until the matching {@link endWireframe} */ function beginWireframe() {
19
+ wireframeDepth++;
20
+ }
21
+ /** @internal End a {@link beginWireframe} */ function endWireframe() {
22
+ wireframeDepth = Math.max(0, wireframeDepth - 1);
23
+ }
24
+ const warned = new Set();
25
+ /**
26
+ * @internal Warn once that a debug view was turned on without DEBUG_VIEWS, where it has no effect.
27
+ * @returns DEBUG_VIEWS
28
+ */ function checkDebugViews(name) {
29
+ if (!DEBUG_VIEWS && !warned.has(name)) {
30
+ warned.add(name);
31
+ console.warn(`${name} is a debug view and has no effect: set globalThis.__ZEPHYR3D_DEBUG_VIEWS__ = true before the engine loads to use it`);
32
+ }
33
+ return DEBUG_VIEWS;
34
+ }
35
+
36
+ export { beginWireframe, checkDebugViews, endWireframe, isWireframeActive, isWireframePass };
37
+ //# sourceMappingURL=debug_views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug_views.js","sources":["../../src/render/debug_views.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEBUG_VIEWS } from '@zephyr3d/base';\r\nimport type { DrawContext } from './drawable';\r\nimport { RENDER_PASS_TYPE_DEPTH, RENDER_PASS_TYPE_LIGHT } from '../values';\r\n\r\n/**\r\n * Wireframe debug view: while active, triangle primitives draw as the edges of their triangles,\r\n * see Primitive. Nested, so a wireframe mesh drawn inside a wireframe view ends it only once.\r\n */\r\nlet wireframeDepth = 0;\r\n\r\n/** @internal Whether primitives drawn now are drawn as wireframe */\r\nexport function isWireframeActive() {\r\n return DEBUG_VIEWS && wireframeDepth > 0;\r\n}\r\n\r\n/**\r\n * @internal Whether a draw in this context may draw wireframe: the depth and light passes, which\r\n * must agree for the light pass's equal depth test. Shadows and picking keep the triangles.\r\n */\r\nexport function isWireframePass(ctx: Nullable<DrawContext>) {\r\n const type = ctx?.renderPass?.type;\r\n return DEBUG_VIEWS && (type === RENDER_PASS_TYPE_LIGHT || type === RENDER_PASS_TYPE_DEPTH);\r\n}\r\n\r\n/** @internal Start drawing primitives as wireframe, until the matching {@link endWireframe} */\r\nexport function beginWireframe() {\r\n wireframeDepth++;\r\n}\r\n\r\n/** @internal End a {@link beginWireframe} */\r\nexport function endWireframe() {\r\n wireframeDepth = Math.max(0, wireframeDepth - 1);\r\n}\r\n\r\nconst warned = new Set<string>();\r\n\r\n/**\r\n * @internal Warn once that a debug view was turned on without DEBUG_VIEWS, where it has no effect.\r\n * @returns DEBUG_VIEWS\r\n */\r\nexport function checkDebugViews(name: string) {\r\n if (!DEBUG_VIEWS && !warned.has(name)) {\r\n warned.add(name);\r\n console.warn(\r\n `${name} is a debug view and has no effect: set globalThis.__ZEPHYR3D_DEBUG_VIEWS__ = true before the engine loads to use it`\r\n );\r\n }\r\n return DEBUG_VIEWS;\r\n}\r\n"],"names":["wireframeDepth","isWireframeActive","DEBUG_VIEWS","isWireframePass","ctx","type","renderPass","RENDER_PASS_TYPE_LIGHT","RENDER_PASS_TYPE_DEPTH","beginWireframe","endWireframe","Math","max","warned","Set","checkDebugViews","name","has","add","console","warn"],"mappings":";;;AAKA;;;AAGC,IACD,IAAIA,cAAiB,GAAA,CAAA;AAErB,qEACO,SAASC,iBAAAA,GAAAA;AACd,IAAA,OAAOC,eAAeF,cAAiB,GAAA,CAAA;AACzC;AAEA;;;IAIO,SAASG,eAAAA,CAAgBC,GAA0B,EAAA;IACxD,MAAMC,IAAAA,GAAOD,KAAKE,UAAYD,EAAAA,IAAAA;AAC9B,IAAA,OAAOH,WAAgBG,KAAAA,IAASE,KAAAA,sBAAAA,IAA0BF,SAASG,sBAAqB,CAAA;AAC1F;AAEA,gGACO,SAASC,cAAAA,GAAAA;AACdT,IAAAA,cAAAA,EAAAA;AACF;AAEA,8CACO,SAASU,YAAAA,GAAAA;AACdV,IAAAA,cAAAA,GAAiBW,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGZ,cAAiB,GAAA,CAAA,CAAA;AAChD;AAEA,MAAMa,SAAS,IAAIC,GAAAA,EAAAA;AAEnB;;;IAIO,SAASC,eAAAA,CAAgBC,IAAY,EAAA;AAC1C,IAAA,IAAI,CAACd,WAAe,IAAA,CAACW,MAAOI,CAAAA,GAAG,CAACD,IAAO,CAAA,EAAA;AACrCH,QAAAA,MAAAA,CAAOK,GAAG,CAACF,IAAAA,CAAAA;AACXG,QAAAA,OAAAA,CAAQC,IAAI,CACV,CAAGJ,EAAAA,IAAAA,CAAK,oHAAoH,CAAC,CAAA;AAEjI;IACA,OAAOd,WAAAA;AACT;;;;"}
@@ -64,7 +64,11 @@ import { ShaderHelper } from '../material/shader/helper.js';
64
64
  this._encodeDepth = !!val;
65
65
  }
66
66
  /** @internal */ _getGlobalBindGroupHash(ctx) {
67
- return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}:${Number(this._motionVectorOnly)}`;
67
+ // Every flag that changes the fragment output count has to be in here. See
68
+ // the note in renderItems: a hash collision hands this pass another pass's
69
+ // program, and the failure mode is an output count mismatch rather than
70
+ // anything that points at the cache.
71
+ return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}:${Number(this._motionVectorOnly)}:${Number(ctx.sssProfileId)}`;
68
72
  }
69
73
  /** @internal */ renderItems(ctx, renderCamera, renderQueue) {
70
74
  const items = renderQueue.itemList;
@@ -1 +1 @@
1
- {"version":3,"file":"depthpass.js","sources":["../../src/render/depthpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { RENDER_PASS_TYPE_DEPTH } from '../values';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Depth render pass\r\n *\r\n * Scene depth render pass\r\n *\r\n * @public\r\n */\r\nexport class DepthPass extends RenderPass {\r\n private _renderBackface: boolean;\r\n private _encodeDepth: boolean;\r\n private _transmission: boolean;\r\n private _motionVectorOnly: boolean;\r\n /**\r\n * Creates an instance of DepthRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_DEPTH);\r\n this._renderBackface = false;\r\n this._encodeDepth = false;\r\n this._transmission = false;\r\n this._motionVectorOnly = false;\r\n }\r\n /**\r\n * Draws the transparent queue for its motion vectors alone.\r\n *\r\n * @remarks\r\n * Blended geometry is absent from the ordinary prepass, so it contributes no\r\n * velocity and a temporal filter reprojects it with whatever is behind it -\r\n * which for hair swinging in front of a still background means reprojecting it\r\n * as if it were still. This mode fills that in: same pass, same shaders, but\r\n * the framebuffer carries the motion vector attachment only, nothing writes\r\n * depth, and materials that have not opted in discard.\r\n *\r\n * It cannot be exact. One velocity per pixel cannot describe several blended\r\n * layers, so the value that survives is whichever fragment landed last rather\r\n * than the nearest. For hair that is the same approximation the dithered path\r\n * already makes - dither keeps one arbitrary strand per pixel - which is why\r\n * it holds up there and why it stays opt-in rather than applying to every\r\n * transparent material.\r\n */\r\n get motionVectorOnly() {\r\n return this._motionVectorOnly;\r\n }\r\n set motionVectorOnly(val: boolean) {\r\n this._motionVectorOnly = !!val;\r\n }\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val: boolean) {\r\n this._transmission = val;\r\n }\r\n get renderBackface() {\r\n return this._renderBackface;\r\n }\r\n set renderBackface(val) {\r\n this._renderBackface = !!val;\r\n }\r\n get encodeDepth() {\r\n return this._encodeDepth;\r\n }\r\n set encodeDepth(val) {\r\n this._encodeDepth = !!val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext) {\r\n return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(\r\n ctx.motionVectors\r\n )}:${Number(this._motionVectorOnly)}`;\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, renderCamera: Camera, renderQueue: RenderQueue) {\r\n const items = renderQueue.itemList;\r\n if (items) {\r\n ctx.drawEnvLight = false;\r\n ctx.env = null;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n // This pass keys its programs off renderPassHash, which Material.calcGlobalHash only\r\n // consults when shaderVariantHash is null. LightPass clears that field on entry but not\r\n // on exit, so a depth pass running after it would otherwise inherit the light pass's\r\n // variant hash and hash to the same key -- handing this pass the light pass's program.\r\n // The prepass never noticed (it runs first, while the field is still null); the\r\n // transmission depth pass runs after the light pass and did, silently reusing a\r\n // single-output program. With motion vectors on, its framebuffer has two attachments and\r\n // the reuse finally surfaced as a fragment output count mismatch.\r\n ctx.shaderVariantHash = null;\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, renderCamera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, renderCamera, true);\r\n const reverseWinding = ctx.camera.worldMatrixDet < 0;\r\n const list = this._motionVectorOnly\r\n ? items.transparent\r\n : this._transmission\r\n ? items.transmission\r\n : items.opaque;\r\n for (const lit of list.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n for (const unlit of list.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["DepthPass","RenderPass","_renderBackface","_encodeDepth","_transmission","_motionVectorOnly","RENDER_PASS_TYPE_DEPTH","motionVectorOnly","val","transmission","renderBackface","encodeDepth","_getGlobalBindGroupHash","ctx","Number","motionVectors","renderCamera","renderQueue","items","itemList","drawEnvLight","env","flip","isAutoFlip","shaderVariantHash","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","reverseWinding","camera","worldMatrixDet","list","transparent","opaque","lit","drawItemList","unlit"],"mappings":"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"}
1
+ {"version":3,"file":"depthpass.js","sources":["../../src/render/depthpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { RENDER_PASS_TYPE_DEPTH } from '../values';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Depth render pass\r\n *\r\n * Scene depth render pass\r\n *\r\n * @public\r\n */\r\nexport class DepthPass extends RenderPass {\r\n private _renderBackface: boolean;\r\n private _encodeDepth: boolean;\r\n private _transmission: boolean;\r\n private _motionVectorOnly: boolean;\r\n /**\r\n * Creates an instance of DepthRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_DEPTH);\r\n this._renderBackface = false;\r\n this._encodeDepth = false;\r\n this._transmission = false;\r\n this._motionVectorOnly = false;\r\n }\r\n /**\r\n * Draws the transparent queue for its motion vectors alone.\r\n *\r\n * @remarks\r\n * Blended geometry is absent from the ordinary prepass, so it contributes no\r\n * velocity and a temporal filter reprojects it with whatever is behind it -\r\n * which for hair swinging in front of a still background means reprojecting it\r\n * as if it were still. This mode fills that in: same pass, same shaders, but\r\n * the framebuffer carries the motion vector attachment only, nothing writes\r\n * depth, and materials that have not opted in discard.\r\n *\r\n * It cannot be exact. One velocity per pixel cannot describe several blended\r\n * layers, so the value that survives is whichever fragment landed last rather\r\n * than the nearest. For hair that is the same approximation the dithered path\r\n * already makes - dither keeps one arbitrary strand per pixel - which is why\r\n * it holds up there and why it stays opt-in rather than applying to every\r\n * transparent material.\r\n */\r\n get motionVectorOnly() {\r\n return this._motionVectorOnly;\r\n }\r\n set motionVectorOnly(val: boolean) {\r\n this._motionVectorOnly = !!val;\r\n }\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val: boolean) {\r\n this._transmission = val;\r\n }\r\n get renderBackface() {\r\n return this._renderBackface;\r\n }\r\n set renderBackface(val) {\r\n this._renderBackface = !!val;\r\n }\r\n get encodeDepth() {\r\n return this._encodeDepth;\r\n }\r\n set encodeDepth(val) {\r\n this._encodeDepth = !!val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext) {\r\n // Every flag that changes the fragment output count has to be in here. See\r\n // the note in renderItems: a hash collision hands this pass another pass's\r\n // program, and the failure mode is an output count mismatch rather than\r\n // anything that points at the cache.\r\n return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(\r\n ctx.motionVectors\r\n )}:${Number(this._motionVectorOnly)}:${Number(ctx.sssProfileId)}`;\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, renderCamera: Camera, renderQueue: RenderQueue) {\r\n const items = renderQueue.itemList;\r\n if (items) {\r\n ctx.drawEnvLight = false;\r\n ctx.env = null;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n // This pass keys its programs off renderPassHash, which Material.calcGlobalHash only\r\n // consults when shaderVariantHash is null. LightPass clears that field on entry but not\r\n // on exit, so a depth pass running after it would otherwise inherit the light pass's\r\n // variant hash and hash to the same key -- handing this pass the light pass's program.\r\n // The prepass never noticed (it runs first, while the field is still null); the\r\n // transmission depth pass runs after the light pass and did, silently reusing a\r\n // single-output program. With motion vectors on, its framebuffer has two attachments and\r\n // the reuse finally surfaced as a fragment output count mismatch.\r\n ctx.shaderVariantHash = null;\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, renderCamera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, renderCamera, true);\r\n const reverseWinding = ctx.camera.worldMatrixDet < 0;\r\n const list = this._motionVectorOnly\r\n ? items.transparent\r\n : this._transmission\r\n ? items.transmission\r\n : items.opaque;\r\n for (const lit of list.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n for (const unlit of list.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["DepthPass","RenderPass","_renderBackface","_encodeDepth","_transmission","_motionVectorOnly","RENDER_PASS_TYPE_DEPTH","motionVectorOnly","val","transmission","renderBackface","encodeDepth","_getGlobalBindGroupHash","ctx","Number","motionVectors","sssProfileId","renderCamera","renderQueue","items","itemList","drawEnvLight","env","flip","isAutoFlip","shaderVariantHash","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","reverseWinding","camera","worldMatrixDet","list","transparent","opaque","lit","drawItemList","unlit"],"mappings":"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"}
@@ -3,14 +3,15 @@ import { ShaderHelper } from '../material/shader/helper.js';
3
3
  import '../material/lambert.js';
4
4
  import '../material/blinn.js';
5
5
  import '../material/unlit.js';
6
+ import '../material/meshmaterial.js';
6
7
  import '../material/particle.js';
7
8
  import '../material/subsurfaceprofile.js';
8
- import '../material/skin.js';
9
+ import '../material/sssprofile.js';
10
+ import '../material/sss.js';
9
11
  import '../material/eye.js';
10
12
  import '@zephyr3d/device';
11
13
  import { MaterialVaryingFlags } from '../values.js';
12
14
  import { getDevice } from '../app/api.js';
13
- import '../material/meshmaterial.js';
14
15
  import '../material/hair.js';
15
16
  import '../material/hairstrand.js';
16
17
  import '../material/grassmaterial.js';
@@ -29,6 +30,8 @@ const skinInfluenceInfo = new Vector4();
29
30
  let defaultSkinInfluenceTexture = null;
30
31
  const instanceBindGroupTransfromTags = new WeakMap();
31
32
  const drawableBindGroupTransfromTags = new WeakMap();
33
+ /** Skin palette base last written to each instance data block or drawable bind group */ const instanceSkinPaletteBases = new WeakMap();
34
+ const drawableSkinPaletteBases = new WeakMap();
32
35
  const bindGroupCache = {};
33
36
  const usedBindGroups = new WeakMap();
34
37
  function fetchBindGroup(skinning, morphing, instancing) {
@@ -94,8 +97,10 @@ function mixinDrawable(baseCls) {
94
97
  _drawableId;
95
98
  _objectColor;
96
99
  _nodeTransformTag;
100
+ /** Stamp of the scene drawable update queue this drawable is waiting in, see UpdateQueue */ _drawableQueueStamp;
97
101
  constructor(...args){
98
102
  super(...args);
103
+ this._drawableQueueStamp = 0;
99
104
  this._drawableId = ++_drawableId;
100
105
  this._objectColor = null;
101
106
  this._mdRenderQueueRef = [];
@@ -158,26 +163,43 @@ function mixinDrawable(baseCls) {
158
163
  applyTransformUniforms(renderQueue) {
159
164
  const instanceInfo = renderQueue.getInstanceInfo(this);
160
165
  const currentTag = this.getNode().transformTag;
166
+ const paletteBase = this.getBoneMatrices() ? this.getSkinPaletteBase() : 0;
161
167
  if (instanceInfo) {
162
168
  const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;
163
- if (tag !== currentTag) {
169
+ if (tag !== currentTag || instanceSkinPaletteBases.get(instanceInfo) !== paletteBase) {
170
+ // The unused z of the framestamp vector carries the skin palette base of the instance
171
+ this._worldMatrixBuffer[18] = paletteBase;
164
172
  instanceInfo.bindGroup.bindGroup.setRawData(ShaderHelper.getInstanceDataUniformName(), instanceInfo.offset * 4, this._worldMatrixBuffer, 0, 36);
165
173
  instanceBindGroupTransfromTags.set(instanceInfo, currentTag);
174
+ instanceSkinPaletteBases.set(instanceInfo, paletteBase);
166
175
  }
167
176
  } else {
168
177
  const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);
178
+ if (drawableSkinPaletteBases.get(drawableBindGroup) !== paletteBase) {
179
+ if (this.getBoneMatrices()) {
180
+ drawableBindGroup.setValue(ShaderHelper.getSkinPaletteBaseUniformName(), paletteBase);
181
+ }
182
+ drawableSkinPaletteBases.set(drawableBindGroup, paletteBase);
183
+ }
169
184
  const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;
170
185
  if (tag !== currentTag) {
171
186
  drawableBindGroup.setValue(ShaderHelper.getWorldMatrixUniformName(), this._currentWorldMatrixBuffer);
172
187
  drawableBindGroup.setValue(ShaderHelper.getPrevWorldMatrixUniformName(), this._prevWorldMatrixBuffer);
173
188
  drawableBindGroup.setValue(ShaderHelper.getPrevWorldMatrixFrameUniformName(), this._framestampBuffer[0]);
174
189
  if (this.getBoneMatrices()) {
175
- drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.invWorldMatrix);
190
+ drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.getSkinSpaceMatrix());
176
191
  }
177
192
  drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);
178
193
  }
179
194
  }
180
195
  }
196
+ applyTransformUniformsAll() {
197
+ for (const ref of this._mdRenderQueueRef){
198
+ if (ref.valid && !ref.ref.disposed) {
199
+ this.applyTransformUniforms(ref.ref);
200
+ }
201
+ }
202
+ }
181
203
  applyMaterialUniformsAll() {
182
204
  for (const ref of this._mdRenderQueueRef){
183
205
  if (ref.valid && !ref.ref.disposed) {
@@ -194,6 +216,28 @@ function mixinDrawable(baseCls) {
194
216
  instanceInfo.bindGroup.bindGroup.setRawData(ShaderHelper.getInstanceDataUniformName(), (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4, uniforms, 0, uniforms.length);
195
217
  }
196
218
  }
219
+ /**
220
+ * Takes the current world matrix of the node at once, as the previous one too.
221
+ *
222
+ * @remarks
223
+ * The world matrix a drawable renders with is refreshed in {@link Scene.frameUpdate}. A
224
+ * drawable created and placed after that, e.g. in `updatePerCamera`, would be drawn that
225
+ * frame with the matrix it had when created; call this once it is placed. The previous
226
+ * matrix is set to the same, so it gets no motion from where it was created.
227
+ */ syncDrawableTransform() {
228
+ const node = this.getNode();
229
+ this._nodeTransformTag = node.transformTag;
230
+ const frame = getDevice().frameInfo.frameCounter;
231
+ this._currentWorldMatrixBuffer.set(node.worldMatrix);
232
+ this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);
233
+ this._framestampBuffer[0] = frame;
234
+ this._framestampBuffer[1] = frame;
235
+ for (const ref of this._mdRenderQueueRef){
236
+ if (ref.valid && !ref.ref.disposed) {
237
+ this.applyTransformUniforms(ref.ref);
238
+ }
239
+ }
240
+ }
197
241
  updateState() {
198
242
  const currentTag = this.getNode().transformTag;
199
243
  if (this._nodeTransformTag !== currentTag) {
@@ -217,15 +261,18 @@ function mixinDrawable(baseCls) {
217
261
  const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue);
218
262
  device.setBindGroup(1, drawableBindGroup);
219
263
  if (ctx.instanceData) {
220
- device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);
264
+ device.setBindGroup(3, ctx.instanceData.culled?.bindGroup ?? ctx.instanceData.bindGroup.bindGroup);
221
265
  }
222
266
  if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {
223
267
  const boneTexture = this.getBoneMatrices();
224
268
  const skinData = this.getSkinInfluenceData();
225
269
  drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);
226
- drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.invWorldMatrix);
270
+ drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.getSkinSpaceMatrix());
227
271
  boneTextureSize.setXY(boneTexture.width, boneTexture.height);
228
272
  drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);
273
+ if (!ctx.instanceData) {
274
+ drawableBindGroup.setValue(ShaderHelper.getSkinPaletteBaseUniformName(), this.getSkinPaletteBase());
275
+ }
229
276
  drawableBindGroup.setTexture(ShaderHelper.getSkinInfluenceDataUniformName(), skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture());
230
277
  skinInfluenceInfo.setXYZW(skinData?.width ?? 1, skinData?.height ?? 1, skinData?.influenceCount ?? 4, skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0);
231
278
  drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);
@@ -1 +1 @@
1
- {"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice, Texture2D } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\nconst skinInfluenceInfo = new Vector4();\r\nlet defaultSkinInfluenceTexture: Nullable<Texture2D> = null;\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nfunction getDefaultSkinInfluenceTexture() {\r\n let texture = defaultSkinInfluenceTexture;\r\n if (!texture) {\r\n texture = getDevice().createTexture2D('rgba32f', 1, 1, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n texture.update(new Float32Array(4), 0, 0, 1, 1);\r\n defaultSkinInfluenceTexture = texture;\r\n }\r\n return texture;\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n if (!this._mdRenderQueueRef.includes(ref)) {\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const queueRef = this._mdRenderQueueRef[i];\r\n const ref = queueRef.ref;\r\n if (force || !queueRef.valid || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n const skinData = (this as unknown as Mesh).getSkinInfluenceData();\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n drawableBindGroup.setTexture(\r\n ShaderHelper.getSkinInfluenceDataUniformName(),\r\n skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture()\r\n );\r\n skinInfluenceInfo.setXYZW(\r\n skinData?.width ?? 1,\r\n skinData?.height ?? 1,\r\n skinData?.influenceCount ?? 4,\r\n skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0\r\n );\r\n drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getRenderMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","skinInfluenceInfo","Vector4","defaultSkinInfluenceTexture","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","getDefaultSkinInfluenceTexture","texture","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","Float32Array","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","pushRenderQueueRef","ref","renderQueueRefPrune","includes","force","i","queueRef","valid","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","tag","setRawData","getInstanceDataUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneMatrices","getBoneInvBindMatrixUniformName","invWorldMatrix","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","updateState","frame","bind","ctx","device","instanceData","setBindGroup","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","skinData","getSkinInfluenceData","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","getSkinInfluenceDataUniformName","setXYZW","influenceCount","Math","ceil","max","getSkinInfluenceInfoUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getRenderMorphInfo","getMorphDataUniformName","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}
1
+ {"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice, Texture2D } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyTransformUniformsAll(): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n syncDrawableTransform(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\nconst skinInfluenceInfo = new Vector4();\r\nlet defaultSkinInfluenceTexture: Nullable<Texture2D> = null;\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n/** Skin palette base last written to each instance data block or drawable bind group */\r\nconst instanceSkinPaletteBases = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableSkinPaletteBases = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nfunction getDefaultSkinInfluenceTexture() {\r\n let texture = defaultSkinInfluenceTexture;\r\n if (!texture) {\r\n texture = getDevice().createTexture2D('rgba32f', 1, 1, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n texture.update(new Float32Array(4), 0, 0, 1, 1);\r\n defaultSkinInfluenceTexture = texture;\r\n }\r\n return texture;\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n /** Stamp of the scene drawable update queue this drawable is waiting in, see UpdateQueue */\r\n _drawableQueueStamp: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableQueueStamp = 0;\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n if (!this._mdRenderQueueRef.includes(ref)) {\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const queueRef = this._mdRenderQueueRef[i];\r\n const ref = queueRef.ref;\r\n if (force || !queueRef.valid || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n const paletteBase = (this as unknown as Drawable).getBoneMatrices()\r\n ? (this as unknown as Mesh).getSkinPaletteBase()\r\n : 0;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag || instanceSkinPaletteBases.get(instanceInfo) !== paletteBase) {\r\n // The unused z of the framestamp vector carries the skin palette base of the instance\r\n this._worldMatrixBuffer[18] = paletteBase;\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n instanceSkinPaletteBases.set(instanceInfo, paletteBase);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n if (drawableSkinPaletteBases.get(drawableBindGroup) !== paletteBase) {\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(ShaderHelper.getSkinPaletteBaseUniformName(), paletteBase);\r\n }\r\n drawableSkinPaletteBases.set(drawableBindGroup, paletteBase);\r\n }\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).getSkinSpaceMatrix()\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyTransformUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n /**\r\n * Takes the current world matrix of the node at once, as the previous one too.\r\n *\r\n * @remarks\r\n * The world matrix a drawable renders with is refreshed in {@link Scene.frameUpdate}. A\r\n * drawable created and placed after that, e.g. in `updatePerCamera`, would be drawn that\r\n * frame with the matrix it had when created; call this once it is placed. The previous\r\n * matrix is set to the same, so it gets no motion from where it was created.\r\n */\r\n syncDrawableTransform() {\r\n const node = this.getNode();\r\n this._nodeTransformTag = node.transformTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n this._currentWorldMatrixBuffer.set(node.worldMatrix);\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.culled?.bindGroup ?? ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n const skinData = (this as unknown as Mesh).getSkinInfluenceData();\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).getSkinSpaceMatrix()\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n if (!ctx.instanceData) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getSkinPaletteBaseUniformName(),\r\n (this as unknown as Mesh).getSkinPaletteBase()\r\n );\r\n }\r\n drawableBindGroup.setTexture(\r\n ShaderHelper.getSkinInfluenceDataUniformName(),\r\n skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture()\r\n );\r\n skinInfluenceInfo.setXYZW(\r\n skinData?.width ?? 1,\r\n skinData?.height ?? 1,\r\n skinData?.influenceCount ?? 4,\r\n skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0\r\n );\r\n drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getRenderMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","skinInfluenceInfo","Vector4","defaultSkinInfluenceTexture","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","instanceSkinPaletteBases","drawableSkinPaletteBases","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","getDefaultSkinInfluenceTexture","texture","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","Float32Array","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","_drawableQueueStamp","args","Map","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","pushRenderQueueRef","ref","renderQueueRefPrune","includes","force","i","queueRef","valid","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","paletteBase","getBoneMatrices","getSkinPaletteBase","tag","setRawData","getInstanceDataUniformName","getSkinPaletteBaseUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneInvBindMatrixUniformName","getSkinSpaceMatrix","applyTransformUniformsAll","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","syncDrawableTransform","node","frame","updateState","bind","ctx","device","instanceData","setBindGroup","culled","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","skinData","getSkinInfluenceData","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","getSkinInfluenceDataUniformName","setXYZW","influenceCount","Math","ceil","max","getSkinInfluenceInfoUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getRenderMorphInfo","getMorphDataUniformName","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}
@@ -65,16 +65,16 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
65
65
  /**
66
66
  * Checks whether dual depth peeling can run with a capability snapshot.
67
67
  *
68
- * @param deviceType - The device type.
68
+ * @param _deviceType - The device type. Unused: every supported backend
69
+ * (WebGL2, WebGPU) has the required uniform buffers, so only the
70
+ * capabilities decide.
69
71
  * @param caps - The device capabilities.
70
72
  * @returns True if dual depth peeling is supported.
71
- */ static supportDeviceCaps(deviceType, caps) {
73
+ */ static supportDeviceCaps(_deviceType, caps) {
72
74
  const framebufferCaps = caps.framebufferCaps;
73
75
  const textureCaps = caps.textureCaps;
74
- const shaderCaps = caps.shaderCaps;
75
76
  const miscCaps = caps.miscCaps;
76
- const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;
77
- return webgl2OrBetter && framebufferCaps.maxDrawBuffers >= 3 && framebufferCaps.supportPerTargetBlending && framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE && miscCaps.supportBlendMinMax && textureCaps.supportHalfFloatColorBuffer && textureCaps.supportFloatColorBuffer && textureCaps.supportFloatBlending;
77
+ return framebufferCaps.maxDrawBuffers >= 3 && framebufferCaps.supportPerTargetBlending && framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE && miscCaps.supportBlendMinMax && textureCaps.supportHalfFloatColorBuffer && textureCaps.supportFloatColorBuffer && textureCaps.supportFloatBlending;
78
78
  }
79
79
  /**
80
80
  * {@inheritDoc OIT.getType}
@@ -1 +1 @@
1
- {"version":3,"file":"dualdepthpeeling_oit.js","sources":["../../src/render/dualdepthpeeling_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceCaps,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\nimport { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { tryGetApp } from '../app/api';\r\n\r\nconst DEPTH_FORMAT: TextureFormat = 'rg32f';\r\nconst ACCUM_FORMAT: TextureFormat = 'rgba16f';\r\nconst COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;\r\n\r\n/**\r\n * Dual depth peeling OIT renderer.\r\n *\r\n * @remarks\r\n * This implementation follows the official dual depth peeling pass structure:\r\n * an initialization pass writes the nearest/farthest transparent depth pair, then\r\n * each peel pass ping-pongs the depth pair while accumulating front and back colors.\r\n *\r\n * It requires MRT, per-target blending, min/max blend equations and blendable\r\n * floating-point color targets. If those capabilities are missing, supportDevice()\r\n * returns false and the transparent pass falls back to sorted alpha blending.\r\n *\r\n * @public\r\n */\r\nexport class DualDepthPeelingOIT extends OIT {\r\n /** Type name of DualDepthPeelingOIT */\r\n public static readonly type = 'ddp';\r\n private static readonly DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);\r\n private static readonly FRONT_CLEAR = new Vector4(0, 0, 0, 1);\r\n private static readonly BACK_CLEAR = new Vector4(0, 0, 0, 0);\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private _numPeels: number;\r\n private _currentPass: number;\r\n private _hash: string;\r\n private _depthTargets: [Nullable<Texture2D>, Nullable<Texture2D>];\r\n private _frontTarget: Nullable<Texture2D>;\r\n private _backTarget: Nullable<Texture2D>;\r\n private _framebuffers: [Nullable<FrameBuffer>, Nullable<FrameBuffer>];\r\n private _device: Nullable<AbstractDevice>;\r\n\r\n /**\r\n * Creates an instance of DualDepthPeelingOIT.\r\n *\r\n * @param numPeels - Number of peel iterations after the initialization pass.\r\n */\r\n constructor(numPeels = 8) {\r\n super();\r\n this._numPeels = Math.max(1, Math.floor(numPeels || 0));\r\n this._currentPass = 0;\r\n this._hash = DualDepthPeelingOIT.type;\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** Number of front/back peel iterations after the initialization pass. */\r\n get numPeels() {\r\n return this._numPeels;\r\n }\r\n set numPeels(val: number) {\r\n this._numPeels = Math.max(1, Math.floor(val || 0));\r\n }\r\n\r\n /**\r\n * Checks whether dual depth peeling can run with a capability snapshot.\r\n *\r\n * @param deviceType - The device type.\r\n * @param caps - The device capabilities.\r\n * @returns True if dual depth peeling is supported.\r\n */\r\n static supportDeviceCaps(deviceType: string, caps: DeviceCaps) {\r\n const framebufferCaps = caps.framebufferCaps;\r\n const textureCaps = caps.textureCaps;\r\n const shaderCaps = caps.shaderCaps;\r\n const miscCaps = caps.miscCaps;\r\n const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;\r\n return (\r\n webgl2OrBetter &&\r\n framebufferCaps.maxDrawBuffers >= 3 &&\r\n framebufferCaps.supportPerTargetBlending &&\r\n framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE &&\r\n miscCaps.supportBlendMinMax &&\r\n textureCaps.supportHalfFloatColorBuffer &&\r\n textureCaps.supportFloatColorBuffer &&\r\n textureCaps.supportFloatBlending\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return DualDepthPeelingOIT.type;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n const device = tryGetApp()?.device;\r\n return (\r\n !!device &&\r\n device.type === deviceType &&\r\n DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps())\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n this.releaseFramebuffers();\r\n if (!ctx.depthTexture) {\r\n return 0;\r\n }\r\n this._device = ctx.device;\r\n this.createFramebuffers(ctx);\r\n return this._numPeels + 1;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n try {\r\n if (this._frontTarget && this._backTarget) {\r\n this.composite(ctx, ctx.device, this._frontTarget, this._backTarget);\r\n }\r\n } finally {\r\n this.releaseFramebuffers();\r\n this._hash = DualDepthPeelingOIT.type;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const targetIndex = pass & 1;\r\n const currentDepthTarget = this._depthTargets[targetIndex];\r\n const previousDepthTarget = this._depthTargets[targetIndex ^ 1];\r\n const framebuffer = this._framebuffers[targetIndex];\r\n if (!currentDepthTarget || !framebuffer || (pass > 0 && !previousDepthTarget)) {\r\n return false;\r\n }\r\n this._hash =\r\n pass === 0\r\n ? `${this.getType()}#init#${currentDepthTarget.uid}`\r\n : `${this.getType()}#peel#${previousDepthTarget!.uid}`;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(framebuffer);\r\n ctx.device.clearFrameBuffer(\r\n pass === 0\r\n ? [DualDepthPeelingOIT.DEPTH_CLEAR, DualDepthPeelingOIT.FRONT_CLEAR, DualDepthPeelingOIT.BACK_CLEAR]\r\n : [DualDepthPeelingOIT.DEPTH_CLEAR, null, null],\r\n null,\r\n null\r\n );\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n ctx.device.popDeviceStates();\r\n }\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.Z_DDP_depth = pb.vec2();\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4();\r\n scope.$outputs.Z_DDP_backColor = pb.vec4();\r\n if (this._currentPass > 0) {\r\n scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4(0, 0, 0, 0);\r\n scope.$outputs.Z_DDP_backColor = pb.vec4(0, 0, 0, 0);\r\n // The peeling depth encoding is internal to this algorithm; normalize\r\n // device depth to standard orientation (0 = near) so the (-front, back)\r\n // encoding, the max/max blend extraction and the peel window logic stay\r\n // convention independent.\r\n scope.$l.Z_DDP_normDepth = REVERSE_Z\r\n ? pb.sub(1, scope.$builtins.fragCoord.z)\r\n : scope.$builtins.fragCoord.z;\r\n if (this._currentPass === 0) {\r\n scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope.Z_DDP_normDepth), scope.Z_DDP_normDepth);\r\n } else {\r\n scope.$l.Z_DDP_prevDepth = pb.textureLoad(\r\n scope.Z_DDP_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).xy;\r\n scope.$l.Z_DDP_frontDepth = pb.neg(scope.Z_DDP_prevDepth.x);\r\n scope.$l.Z_DDP_backDepth = scope.Z_DDP_prevDepth.y;\r\n scope.$l.Z_DDP_curDepth = scope.Z_DDP_normDepth;\r\n scope.$l.Z_DDP_outputColor = pb.vec4(color.rgb, ctx.lightBlending ? pb.float(0) : color.a);\r\n scope\r\n .$if(\r\n pb.or(\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n pb.discard();\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_depth = pb.vec2(pb.neg(this.Z_DDP_normDepth), this.Z_DDP_normDepth);\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.lessThan(scope.Z_DDP_curDepth, pb.add(scope.Z_DDP_frontDepth, 0.000001)),\r\n pb.greaterThan(scope.Z_DDP_curDepth, pb.sub(scope.Z_DDP_frontDepth, 0.000001))\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_frontColor = this.Z_DDP_outputColor;\r\n }\r\n )\r\n .$else(function () {\r\n this.$outputs.Z_DDP_backColor = this.Z_DDP_outputColor;\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, bindGroup: BindGroup) {\r\n if (this._currentPass > 0) {\r\n bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[(this._currentPass & 1) ^ 1]!);\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n rs.useBlendingState().enable(false).enableAlphaToCoverage(false);\r\n rs.useDepthState().enableTest(true).enableWrite(false);\r\n\r\n rs.useTargetBlendingState(0)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('max', 'max')\r\n .setBlendFunc('one', 'one');\r\n\r\n rs.useTargetBlendingState(1)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('dst-alpha', 'one')\r\n .setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n\r\n rs.useTargetBlendingState(2)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'inv-src-alpha')\r\n .setBlendFuncAlpha('one', 'inv-src-alpha');\r\n }\r\n\r\n /** @internal */\r\n private createFramebuffers(ctx: DrawContext) {\r\n const device = ctx.device;\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const depthTarget0 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const depthTarget1 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const frontTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const backTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const framebuffer0 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget0, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n const framebuffer1 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget1, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n device.pool.releaseTexture(depthTarget0);\r\n device.pool.releaseTexture(depthTarget1);\r\n device.pool.releaseTexture(frontTarget);\r\n device.pool.releaseTexture(backTarget);\r\n this._depthTargets = [depthTarget0, depthTarget1];\r\n this._frontTarget = frontTarget;\r\n this._backTarget = backTarget;\r\n this._framebuffers = [framebuffer0, framebuffer1];\r\n }\r\n\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, frontTarget: Texture2D, backTarget: 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(DualDepthPeelingOIT.getCompositeProgram(device));\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('frontTex', frontTarget);\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('backTex', backTarget);\r\n device.setBindGroup(0, DualDepthPeelingOIT._compositeBindGroup!);\r\n drawFullscreenQuad(DualDepthPeelingOIT._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\r\n /** @internal */\r\n private releaseFramebuffers() {\r\n if (this._device) {\r\n if (this._framebuffers[0]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[0]);\r\n }\r\n if (this._framebuffers[1]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[1]);\r\n }\r\n }\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\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.frontTex = pb.tex2D().uniform(0);\r\n this.backTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.frontColor = pb.textureSample(this.frontTex, this.$inputs.uv);\r\n this.$l.backColor = pb.textureSample(this.backTex, this.$inputs.uv);\r\n this.$l.remainingAlpha = pb.clamp(pb.mul(this.frontColor.a, pb.sub(1, this.backColor.a)), 0, 1);\r\n this.$outputs.outColor = pb.vec4(\r\n pb.add(this.frontColor.rgb, pb.mul(this.frontColor.a, this.backColor.rgb)),\r\n this.remainingAlpha\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@DualDepthPeelingOIT_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('one', '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 protected onDispose() {\r\n super.onDispose();\r\n this.releaseFramebuffers();\r\n }\r\n}\r\n"],"names":["DEPTH_FORMAT","ACCUM_FORMAT","COLOR_ATTACHMENT_BYTES_PER_SAMPLE","DualDepthPeelingOIT","OIT","type","DEPTH_CLEAR","Vector4","FRONT_CLEAR","BACK_CLEAR","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_numPeels","_currentPass","_hash","_depthTargets","_frontTarget","_backTarget","_framebuffers","_device","numPeels","Math","max","floor","val","supportDeviceCaps","deviceType","caps","framebufferCaps","textureCaps","shaderCaps","miscCaps","webgl2OrBetter","maxUniformBufferSize","maxDrawBuffers","supportPerTargetBlending","maxColorAttachmentBytesPerSample","supportBlendMinMax","supportHalfFloatColorBuffer","supportFloatColorBuffer","supportFloatBlending","getType","supportDevice","device","tryGetApp","getDeviceCaps","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","ctx","releaseFramebuffers","depthTexture","createFramebuffers","end","composite","beginPass","pass","targetIndex","currentDepthTarget","previousDepthTarget","framebuffer","uid","pushDeviceStates","setFramebuffer","clearFrameBuffer","endPass","_pass","popDeviceStates","setupFragmentOutput","scope","pb","$builder","$outputs","Z_DDP_depth","vec2","Z_DDP_frontColor","vec4","Z_DDP_backColor","Z_DDP_depthTexture","tex2D","uniform","noSampler","outputFragmentColor","color","$l","Z_DDP_normDepth","REVERSE_Z","sub","$builtins","fragCoord","z","neg","Z_DDP_prevDepth","textureLoad","ivec2","xy","Z_DDP_frontDepth","x","Z_DDP_backDepth","y","Z_DDP_curDepth","Z_DDP_outputColor","rgb","lightBlending","float","a","$if","or","lessThan","add","greaterThan","discard","$elseif","and","$else","applyUniforms","_ctx","bindGroup","setTexture","calculateHash","setRenderStates","rs","useBlendingState","enable","enableAlphaToCoverage","useDepthState","enableTest","enableWrite","useTargetBlendingState","setBlendEquation","setBlendFunc","setBlendFuncRGB","setBlendFuncAlpha","width","height","depthTarget0","pool","fetchTemporalTexture2D","depthTarget1","frontTarget","backTarget","framebuffer0","createTemporalFramebuffer","framebuffer1","releaseTexture","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","singleColorFramebuffer","length","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","buildRenderProgram","vertex","$inputs","pos","attrib","uv","main","position","DEPTH_FARTHEST","mul","fragment","outColor","frontTex","backTex","frontColor","textureSample","backColor","remainingAlpha","clamp","name","createBindGroup","bindGroupLayouts","createRenderStateSet","onDispose"],"mappings":";;;;;AAoBA,MAAMA,YAA8B,GAAA,OAAA;AACpC,MAAMC,YAA8B,GAAA,SAAA;AACpC,MAAMC,iCAAAA,GAAoC,IAAI,CAAI,GAAA,CAAA;AAElD;;;;;;;;;;;;;IAcO,MAAMC,mBAA4BC,SAAAA,GAAAA,CAAAA;4CAEvC,OAAuBC,IAAAA,GAAO,KAAM;IACpC,OAAwBC,WAAAA,GAAc,IAAIC,OAAAA,CAAQ,EAAC,EAAG,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA;AAClE,IAAA,OAAwBC,cAAc,IAAID,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,CAAA;AAC9D,IAAA,OAAwBE,aAAa,IAAIF,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,CAAA;AAC7D,IAAA,OAAeG,oBAA0C,IAAK;AAC9D,IAAA,OAAeC,sBAA2C,IAAK;AAC/D,IAAA,OAAeC,yBAAmD,IAAK;IAC/DC,SAAkB;IAClBC,YAAqB;IACrBC,KAAc;IACdC,aAA0D;IAC1DC,YAAkC;IAClCC,WAAiC;IACjCC,aAA8D;IAC9DC,OAAkC;AAE1C;;;;MAKA,WAAA,CAAYC,QAAW,GAAA,CAAC,CAAE;QACxB,KAAK,EAAA;QACL,IAAI,CAACR,SAAS,GAAGS,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,KAAK,CAACH,QAAY,IAAA,CAAA,CAAA,CAAA;QACpD,IAAI,CAACP,YAAY,GAAG,CAAA;AACpB,QAAA,IAAI,CAACC,KAAK,GAAGZ,mBAAAA,CAAoBE,IAAI;QACrC,IAAI,CAACW,aAAa,GAAG;AAAC,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA;QACjC,IAAI,CAACC,YAAY,GAAG,IAAA;QACpB,IAAI,CAACC,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,aAAa,GAAG;AAAC,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA;QACjC,IAAI,CAACC,OAAO,GAAG,IAAA;AACjB;+EAGA,IAAIC,QAAW,GAAA;QACb,OAAO,IAAI,CAACR,SAAS;AACvB;IACA,IAAIQ,QAAAA,CAASI,GAAW,EAAE;QACxB,IAAI,CAACZ,SAAS,GAAGS,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,KAAK,CAACC,GAAO,IAAA,CAAA,CAAA,CAAA;AACjD;AAEA;;;;;;AAMC,MACD,OAAOC,iBAAAA,CAAkBC,UAAkB,EAAEC,IAAgB,EAAE;QAC7D,MAAMC,eAAAA,GAAkBD,KAAKC,eAAe;QAC5C,MAAMC,WAAAA,GAAcF,KAAKE,WAAW;QACpC,MAAMC,UAAAA,GAAaH,KAAKG,UAAU;QAClC,MAAMC,QAAAA,GAAWJ,KAAKI,QAAQ;AAC9B,QAAA,MAAMC,cAAiBN,GAAAA,UAAAA,KAAe,OAAWI,IAAAA,UAAAA,CAAWG,oBAAoB,GAAG,CAAA;QACnF,OACED,cAAAA,IACAJ,gBAAgBM,cAAc,IAAI,KAClCN,eAAgBO,CAAAA,wBAAwB,IACxCP,eAAAA,CAAgBQ,gCAAgC,IAAInC,qCACpD8B,QAASM,CAAAA,kBAAkB,IAC3BR,WAAYS,CAAAA,2BAA2B,IACvCT,WAAYU,CAAAA,uBAAuB,IACnCV,WAAAA,CAAYW,oBAAoB;AAEpC;AAEA;;AAEC,MACDC,OAAU,GAAA;AACR,QAAA,OAAOvC,oBAAoBE,IAAI;AACjC;AAEA;;MAGAsC,aAAAA,CAAchB,UAAkB,EAAE;AAChC,QAAA,MAAMiB,SAASC,SAAaD,EAAAA,EAAAA,MAAAA;AAC5B,QAAA,OACE,CAAC,CAACA,MACFA,IAAAA,MAAAA,CAAOvC,IAAI,KAAKsB,UAChBxB,IAAAA,mBAAAA,CAAoBuB,iBAAiB,CAACC,UAAYiB,EAAAA,MAAAA,CAAOE,aAAa,EAAA,CAAA;AAE1E;AAEA;;AAEC,MACDC,uBAA0B,GAAA;QACxB,OAAO,IAAA;AACT;AAEA;;AAEC,MACDC,2BAA8B,GAAA;QAC5B,OAAO,IAAA;AACT;AAEA;;MAGAC,KAAAA,CAAMC,GAAgB,EAAE;AACtB,QAAA,IAAI,CAACC,mBAAmB,EAAA;QACxB,IAAI,CAACD,GAAIE,CAAAA,YAAY,EAAE;YACrB,OAAO,CAAA;AACT;AACA,QAAA,IAAI,CAAChC,OAAO,GAAG8B,GAAAA,CAAIN,MAAM;QACzB,IAAI,CAACS,kBAAkB,CAACH,GAAAA,CAAAA;QACxB,OAAO,IAAI,CAACrC,SAAS,GAAG,CAAA;AAC1B;AAEA;;MAGAyC,GAAAA,CAAIJ,GAAgB,EAAE;QACpB,IAAI;AACF,YAAA,IAAI,IAAI,CAACjC,YAAY,IAAI,IAAI,CAACC,WAAW,EAAE;AACzC,gBAAA,IAAI,CAACqC,SAAS,CAACL,GAAAA,EAAKA,GAAIN,CAAAA,MAAM,EAAE,IAAI,CAAC3B,YAAY,EAAE,IAAI,CAACC,WAAW,CAAA;AACrE;SACQ,QAAA;AACR,YAAA,IAAI,CAACiC,mBAAmB,EAAA;AACxB,YAAA,IAAI,CAACpC,KAAK,GAAGZ,mBAAAA,CAAoBE,IAAI;AACvC;AACF;AAEA;;AAEC,MACDmD,SAAUN,CAAAA,GAAgB,EAAEO,IAAY,EAAE;QACxC,IAAI,CAAC3C,YAAY,GAAG2C,IAAAA;AACpB,QAAA,MAAMC,cAAcD,IAAO,GAAA,CAAA;AAC3B,QAAA,MAAME,kBAAqB,GAAA,IAAI,CAAC3C,aAAa,CAAC0C,WAAY,CAAA;AAC1D,QAAA,MAAME,sBAAsB,IAAI,CAAC5C,aAAa,CAAC0C,cAAc,CAAE,CAAA;AAC/D,QAAA,MAAMG,WAAc,GAAA,IAAI,CAAC1C,aAAa,CAACuC,WAAY,CAAA;AACnD,QAAA,IAAI,CAACC,kBAAsB,IAAA,CAACE,eAAgBJ,IAAO,GAAA,CAAA,IAAK,CAACG,mBAAsB,EAAA;YAC7E,OAAO,KAAA;AACT;QACA,IAAI,CAAC7C,KAAK,GACR0C,IAAS,KAAA,CAAA,GACL,GAAG,IAAI,CAACf,OAAO,EAAA,CAAG,MAAM,EAAEiB,mBAAmBG,GAAG,CAAA,CAAE,GAClD,CAAA,EAAG,IAAI,CAACpB,OAAO,EAAA,CAAG,MAAM,EAAEkB,mBAAqBE,CAAAA,GAAG,CAAE,CAAA;QAC1DZ,GAAIN,CAAAA,MAAM,CAACmB,gBAAgB,EAAA;QAC3Bb,GAAIN,CAAAA,MAAM,CAACoB,cAAc,CAACH,WAAAA,CAAAA;AAC1BX,QAAAA,GAAAA,CAAIN,MAAM,CAACqB,gBAAgB,CACzBR,SAAS,CACL,GAAA;AAACtD,YAAAA,mBAAAA,CAAoBG,WAAW;AAAEH,YAAAA,mBAAAA,CAAoBK,WAAW;AAAEL,YAAAA,mBAAAA,CAAoBM;SAAW,GAClG;AAACN,YAAAA,mBAAAA,CAAoBG,WAAW;AAAE,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA,EACjD,IACA,EAAA,IAAA,CAAA;QAEF,OAAO,IAAA;AACT;AAEA;;AAEC,MACD4D,OAAQhB,CAAAA,GAAgB,EAAEiB,KAAa,EAAE;QACvCjB,GAAIN,CAAAA,MAAM,CAACwB,eAAe,EAAA;AAC5B;AAEA;;MAGAC,mBAAAA,CAAoBC,KAAoB,EAAE;QACxC,MAAMC,EAAAA,GAAKD,MAAME,QAAQ;AACzBF,QAAAA,KAAAA,CAAMG,QAAQ,CAACC,WAAW,GAAGH,GAAGI,IAAI,EAAA;AACpCL,QAAAA,KAAAA,CAAMG,QAAQ,CAACG,gBAAgB,GAAGL,GAAGM,IAAI,EAAA;AACzCP,QAAAA,KAAAA,CAAMG,QAAQ,CAACK,eAAe,GAAGP,GAAGM,IAAI,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC/D,YAAY,GAAG,CAAG,EAAA;YACzBwD,KAAMS,CAAAA,kBAAkB,GAAGR,EAAGS,CAAAA,KAAK,GAAGC,OAAO,CAAC,GAAGC,SAAS,EAAA;AAC5D;AACF;AAEA;;AAEC,MACDC,oBAAoBb,KAA4B,EAAEc,KAAkB,EAAElC,GAAgB,EAAE;QACtF,MAAMqB,EAAAA,GAAKD,MAAME,QAAQ;QACzBF,KAAMG,CAAAA,QAAQ,CAACC,WAAW,GAAGH,GAAGI,IAAI,CAAC,EAAC,EAAG,EAAC,CAAA;QAC1CL,KAAMG,CAAAA,QAAQ,CAACG,gBAAgB,GAAGL,GAAGM,IAAI,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;QACnDP,KAAMG,CAAAA,QAAQ,CAACK,eAAe,GAAGP,GAAGM,IAAI,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;;;;;QAKlDP,KAAMe,CAAAA,EAAE,CAACC,eAAe,GAAGC,YACvBhB,EAAGiB,CAAAA,GAAG,CAAC,CAAGlB,EAAAA,KAAAA,CAAMmB,SAAS,CAACC,SAAS,CAACC,CAAC,CAAA,GACrCrB,MAAMmB,SAAS,CAACC,SAAS,CAACC,CAAC;AAC/B,QAAA,IAAI,IAAI,CAAC7E,YAAY,KAAK,CAAG,EAAA;AAC3BwD,YAAAA,KAAAA,CAAMG,QAAQ,CAACC,WAAW,GAAGH,GAAGI,IAAI,CAACJ,EAAGqB,CAAAA,GAAG,CAACtB,KAAAA,CAAMgB,eAAe,CAAA,EAAGhB,MAAMgB,eAAe,CAAA;SACpF,MAAA;YACLhB,KAAMe,CAAAA,EAAE,CAACQ,eAAe,GAAGtB,GAAGuB,WAAW,CACvCxB,MAAMS,kBAAkB,EACxBR,GAAGwB,KAAK,CAACzB,MAAMmB,SAAS,CAACC,SAAS,CAACM,EAAE,CACrC,EAAA,CAAA,CAAA,CACAA,EAAE;YACJ1B,KAAMe,CAAAA,EAAE,CAACY,gBAAgB,GAAG1B,EAAAA,CAAGqB,GAAG,CAACtB,KAAAA,CAAMuB,eAAe,CAACK,CAAC,CAAA;AAC1D5B,YAAAA,KAAAA,CAAMe,EAAE,CAACc,eAAe,GAAG7B,KAAMuB,CAAAA,eAAe,CAACO,CAAC;AAClD9B,YAAAA,KAAAA,CAAMe,EAAE,CAACgB,cAAc,GAAG/B,MAAMgB,eAAe;AAC/ChB,YAAAA,KAAAA,CAAMe,EAAE,CAACiB,iBAAiB,GAAG/B,EAAGM,CAAAA,IAAI,CAACO,KAAMmB,CAAAA,GAAG,EAAErD,GAAAA,CAAIsD,aAAa,GAAGjC,EAAAA,CAAGkC,KAAK,CAAC,CAAA,CAAA,GAAKrB,MAAMsB,CAAC,CAAA;AACzFpC,YAAAA,KAAAA,CACGqC,GAAG,CACFpC,EAAGqC,CAAAA,EAAE,CACHrC,EAAAA,CAAGsC,QAAQ,CAACtC,EAAGuC,CAAAA,GAAG,CAACxC,KAAAA,CAAM+B,cAAc,EAAE,QAAA,CAAA,EAAW/B,KAAM2B,CAAAA,gBAAgB,CAC1E1B,EAAAA,EAAAA,CAAGwC,WAAW,CAACxC,EAAGiB,CAAAA,GAAG,CAAClB,KAAAA,CAAM+B,cAAc,EAAE,QAAW/B,CAAAA,EAAAA,KAAAA,CAAM6B,eAAe,CAE9E,CAAA,EAAA,WAAA;AACE5B,gBAAAA,EAAAA,CAAGyC,OAAO,EAAA;AACZ,aAAA,CAAA,CAEDC,OAAO,CACN1C,EAAG2C,CAAAA,GAAG,CACJ3C,EAAAA,CAAGwC,WAAW,CAACxC,EAAGiB,CAAAA,GAAG,CAAClB,KAAAA,CAAM+B,cAAc,EAAE,QAAA,CAAA,EAAW/B,KAAM2B,CAAAA,gBAAgB,CAC7E1B,EAAAA,EAAAA,CAAGsC,QAAQ,CAACtC,EAAGuC,CAAAA,GAAG,CAACxC,KAAAA,CAAM+B,cAAc,EAAE,QAAW/B,CAAAA,EAAAA,KAAAA,CAAM6B,eAAe,CAE3E,CAAA,EAAA,WAAA;AACE,gBAAA,IAAI,CAAC1B,QAAQ,CAACC,WAAW,GAAGH,GAAGI,IAAI,CAACJ,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACN,eAAe,CAAG,EAAA,IAAI,CAACA,eAAe,CAAA;AACxF,aAAA,CAAA,CAED2B,OAAO,CACN1C,EAAG2C,CAAAA,GAAG,CACJ3C,EAAAA,CAAGsC,QAAQ,CAACvC,KAAM+B,CAAAA,cAAc,EAAE9B,EAAAA,CAAGuC,GAAG,CAACxC,KAAAA,CAAM2B,gBAAgB,EAAE,QACjE1B,CAAAA,CAAAA,EAAAA,EAAAA,CAAGwC,WAAW,CAACzC,KAAM+B,CAAAA,cAAc,EAAE9B,EAAAA,CAAGiB,GAAG,CAAClB,KAAM2B,CAAAA,gBAAgB,EAAE,QAEtE,CAAA,CAAA,CAAA,EAAA,WAAA;AACE,gBAAA,IAAI,CAACxB,QAAQ,CAACG,gBAAgB,GAAG,IAAI,CAAC0B,iBAAiB;AACzD,aAAA,CAAA,CAEDa,KAAK,CAAC,WAAA;AACL,gBAAA,IAAI,CAAC1C,QAAQ,CAACK,eAAe,GAAG,IAAI,CAACwB,iBAAiB;AACxD,aAAA,CAAA;AACJ;QACA,OAAO,IAAA;AACT;AAEA;;AAEC,MACDc,aAAcC,CAAAA,IAAiB,EAAEC,SAAoB,EAAE;AACrD,QAAA,IAAI,IAAI,CAACxG,YAAY,GAAG,CAAG,EAAA;AACzBwG,YAAAA,SAAAA,CAAUC,UAAU,CAAC,oBAAsB,EAAA,IAAI,CAACvG,aAAa,CAAE,IAAI,CAACF,YAAY,GAAG,IAAK,CAAE,CAAA,CAAA;AAC5F;AACF;AAEA;;AAEC,MACD0G,aAAgB,GAAA;QACd,OAAO,IAAI,CAACzG,KAAK;AACnB;AAEA;;MAGA0G,eAAAA,CAAgBC,EAAkB,EAAE;AAClCA,QAAAA,EAAAA,CAAGC,gBAAgB,EAAGC,CAAAA,MAAM,CAAC,KAAA,CAAA,CAAOC,qBAAqB,CAAC,KAAA,CAAA;AAC1DH,QAAAA,EAAAA,CAAGI,aAAa,EAAGC,CAAAA,UAAU,CAAC,IAAA,CAAA,CAAMC,WAAW,CAAC,KAAA,CAAA;AAEhDN,QAAAA,EAAAA,CAAGO,sBAAsB,CAAC,CACvBL,CAAAA,CAAAA,MAAM,CAAC,IACPC,CAAAA,CAAAA,qBAAqB,CAAC,KAAA,CAAA,CACtBK,gBAAgB,CAAC,KAAA,EAAO,KACxBC,CAAAA,CAAAA,YAAY,CAAC,KAAO,EAAA,KAAA,CAAA;AAEvBT,QAAAA,EAAAA,CAAGO,sBAAsB,CAAC,CAAA,CAAA,CACvBL,MAAM,CAAC,IAAA,CAAA,CACPC,qBAAqB,CAAC,KAAA,CAAA,CACtBK,gBAAgB,CAAC,KAAA,EAAO,OACxBE,eAAe,CAAC,aAAa,KAC7BC,CAAAA,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,eAAA,CAAA;AAE7BX,QAAAA,EAAAA,CAAGO,sBAAsB,CAAC,CAAA,CAAA,CACvBL,MAAM,CAAC,IAAA,CAAA,CACPC,qBAAqB,CAAC,KAAA,CAAA,CACtBK,gBAAgB,CAAC,KAAA,EAAO,OACxBE,eAAe,CAAC,OAAO,eACvBC,CAAAA,CAAAA,iBAAiB,CAAC,KAAO,EAAA,eAAA,CAAA;AAC9B;AAEA,qBACQhF,kBAAmBH,CAAAA,GAAgB,EAAE;QAC3C,MAAMN,MAAAA,GAASM,IAAIN,MAAM;AACzB,QAAA,MAAM0F,KAAQpF,GAAAA,GAAAA,CAAIE,YAAY,CAAEkF,KAAK;AACrC,QAAA,MAAMC,MAASrF,GAAAA,GAAAA,CAAIE,YAAY,CAAEmF,MAAM;QACvC,MAAMC,YAAAA,GAAe5F,OAAO6F,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAO1I,YAAcsI,EAAAA,KAAAA,EAAOC,MAAQ,EAAA,KAAA,CAAA;QAC5F,MAAMI,YAAAA,GAAe/F,OAAO6F,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAO1I,YAAcsI,EAAAA,KAAAA,EAAOC,MAAQ,EAAA,KAAA,CAAA;QAC5F,MAAMK,WAAAA,GAAchG,OAAO6F,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAOzI,YAAcqI,EAAAA,KAAAA,EAAOC,MAAQ,EAAA,KAAA,CAAA;QAC3F,MAAMM,UAAAA,GAAajG,OAAO6F,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAOzI,YAAcqI,EAAAA,KAAAA,EAAOC,MAAQ,EAAA,KAAA,CAAA;AAC1F,QAAA,MAAMO,eAAelG,MAAO6F,CAAAA,IAAI,CAACM,yBAAyB,CACxD,KACA,EAAA;AAACP,YAAAA,YAAAA;AAAcI,YAAAA,WAAAA;AAAaC,YAAAA;AAAW,SAAA,EACvC3F,IAAIE,YAAY,CAAA;AAElB,QAAA,MAAM4F,eAAepG,MAAO6F,CAAAA,IAAI,CAACM,yBAAyB,CACxD,KACA,EAAA;AAACJ,YAAAA,YAAAA;AAAcC,YAAAA,WAAAA;AAAaC,YAAAA;AAAW,SAAA,EACvC3F,IAAIE,YAAY,CAAA;QAElBR,MAAO6F,CAAAA,IAAI,CAACQ,cAAc,CAACT,YAAAA,CAAAA;QAC3B5F,MAAO6F,CAAAA,IAAI,CAACQ,cAAc,CAACN,YAAAA,CAAAA;QAC3B/F,MAAO6F,CAAAA,IAAI,CAACQ,cAAc,CAACL,WAAAA,CAAAA;QAC3BhG,MAAO6F,CAAAA,IAAI,CAACQ,cAAc,CAACJ,UAAAA,CAAAA;QAC3B,IAAI,CAAC7H,aAAa,GAAG;AAACwH,YAAAA,YAAAA;AAAcG,YAAAA;AAAa,SAAA;QACjD,IAAI,CAAC1H,YAAY,GAAG2H,WAAAA;QACpB,IAAI,CAAC1H,WAAW,GAAG2H,UAAAA;QACnB,IAAI,CAAC1H,aAAa,GAAG;AAAC2H,YAAAA,YAAAA;AAAcE,YAAAA;AAAa,SAAA;AACnD;qBAGA,SAAQzF,CAAUL,GAAgB,EAAEN,MAAsB,EAAEgG,WAAsB,EAAEC,UAAqB,EAAE;QACzG,MAAMK,kBAAAA,GAAqBtG,OAAOuG,cAAc,EAAA;AAChD,QAAA,MAAMC,eAAkBF,GAAAA,kBAAAA,EAAoBG,mBAAqB,EAAA,CAAC,EAAE,IAAI,IAAA;QACxE,MAAMC,sBAAAA,GACJJ,sBAAsBA,kBAAmBG,CAAAA,mBAAmB,GAAGE,MAAM,GAAG,KAAKH,eACzExG,GAAAA,MAAAA,CAAO6F,IAAI,CAACe,wBAAwB,CAClC,KACA,EAAA,CAAA,EACA,GACAJ,eACAF,EAAAA,kBAAAA,CAAmBO,kBAAkB,EAAA,EACrC,KAEF,CAAA,GAAA,IAAA;AACN,QAAA,IAAIH,sBAAwB,EAAA;YAC1B,MAAMI,QAAAA,GAAW9G,OAAO+G,WAAW,EAAA;YACnC,MAAMC,OAAAA,GAAUhH,OAAOiH,UAAU,EAAA;AACjCjH,YAAAA,MAAAA,CAAOmB,gBAAgB,EAAA;AACvBnB,YAAAA,MAAAA,CAAOoB,cAAc,CAACsF,sBAAAA,CAAAA;AACtB1G,YAAAA,MAAAA,CAAOkH,WAAW,CAACJ,QAAAA,CAAAA;AACnB9G,YAAAA,MAAAA,CAAOmH,UAAU,CAACH,OAAAA,CAAAA;AACpB;QACA,IAAI;AACFhH,YAAAA,MAAAA,CAAOoH,UAAU,CAAC7J,mBAAoB8J,CAAAA,mBAAmB,CAACrH,MAAAA,CAAAA,CAAAA;AAC1DzC,YAAAA,mBAAAA,CAAoBQ,mBAAmB,CAAE4G,UAAU,CAAC,UAAYqB,EAAAA,WAAAA,CAAAA;AAChEzI,YAAAA,mBAAAA,CAAoBQ,mBAAmB,CAAE4G,UAAU,CAAC,SAAWsB,EAAAA,UAAAA,CAAAA;AAC/DjG,YAAAA,MAAAA,CAAOsH,YAAY,CAAC,CAAG/J,EAAAA,mBAAAA,CAAoBQ,mBAAmB,CAAA;AAC9DwJ,YAAAA,kBAAAA,CAAmBhK,oBAAoBS,sBAAsB,CAAA;SACrD,QAAA;AACR,YAAA,IAAI0I,sBAAwB,EAAA;AAC1B1G,gBAAAA,MAAAA,CAAOwB,eAAe,EAAA;gBACtBxB,MAAO6F,CAAAA,IAAI,CAAC2B,kBAAkB,CAACd,sBAAAA,CAAAA;AACjC;AACF;AACF;qBAGA,mBAA8B,GAAA;QAC5B,IAAI,IAAI,CAAClI,OAAO,EAAE;AAChB,YAAA,IAAI,IAAI,CAACD,aAAa,CAAC,EAAE,EAAE;gBACzB,IAAI,CAACC,OAAO,CAACqH,IAAI,CAAC2B,kBAAkB,CAAC,IAAI,CAACjJ,aAAa,CAAC,CAAE,CAAA,CAAA;AAC5D;AACA,YAAA,IAAI,IAAI,CAACA,aAAa,CAAC,EAAE,EAAE;gBACzB,IAAI,CAACC,OAAO,CAACqH,IAAI,CAAC2B,kBAAkB,CAAC,IAAI,CAACjJ,aAAa,CAAC,CAAE,CAAA,CAAA;AAC5D;AACF;QACA,IAAI,CAACH,aAAa,GAAG;AAAC,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA;QACjC,IAAI,CAACC,YAAY,GAAG,IAAA;QACpB,IAAI,CAACC,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,aAAa,GAAG;AAAC,YAAA,IAAA;AAAM,YAAA;AAAK,SAAA;QACjC,IAAI,CAACC,OAAO,GAAG,IAAA;AACjB;AAEA,qBACA,OAAe6I,mBAAoBrH,CAAAA,MAAsB,EAAE;AACzD,QAAA,IAAI,CAAC,IAAI,CAAClC,iBAAiB,EAAE;AAC3B,YAAA,IAAI,CAACA,iBAAiB,GAAGkC,MAAAA,CAAOyH,kBAAkB,CAAC;AACjDC,gBAAAA,MAAAA,CAAAA,CAAO/F,EAAE,EAAA;oBACP,IAAI,CAACgG,OAAO,CAACC,GAAG,GAAGjG,EAAGI,CAAAA,IAAI,EAAG8F,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAAChG,QAAQ,CAACiG,EAAE,GAAGnG,GAAGI,IAAI,EAAA;AAC1BJ,oBAAAA,EAAAA,CAAGoG,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAAClF,SAAS,CAACmF,QAAQ,GAAGrG,EAAGM,CAAAA,IAAI,CAAC,IAAI,CAAC0F,OAAO,CAACC,GAAG,EAAEK,cAAgB,EAAA,CAAA,CAAA;wBACpE,IAAI,CAACpG,QAAQ,CAACiG,EAAE,GAAGnG,EAAGuC,CAAAA,GAAG,CAACvC,EAAAA,CAAGuG,GAAG,CAAC,IAAI,CAACP,OAAO,CAACC,GAAG,CAACxE,EAAE,EAAE,GAAA,CAAA,EAAMzB,EAAGI,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAI/B,MAAAA,CAAOvC,IAAI,KAAK,QAAU,EAAA;AAC5B,4BAAA,IAAI,CAACoF,SAAS,CAACmF,QAAQ,CAACxE,CAAC,GAAG7B,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACH,SAAS,CAACmF,QAAQ,CAACxE,CAAC,CAAA;AAC9D;AACF,qBAAA,CAAA;AACF,iBAAA;AACA2E,gBAAAA,QAAAA,CAAAA,CAASxG,EAAE,EAAA;AACT,oBAAA,IAAI,CAACE,QAAQ,CAACuG,QAAQ,GAAGzG,GAAGM,IAAI,EAAA;AAChC,oBAAA,IAAI,CAACoG,QAAQ,GAAG1G,GAAGS,KAAK,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACnC,oBAAA,IAAI,CAACiG,OAAO,GAAG3G,GAAGS,KAAK,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAClCV,oBAAAA,EAAAA,CAAGoG,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACtF,EAAE,CAAC8F,UAAU,GAAG5G,GAAG6G,aAAa,CAAC,IAAI,CAACH,QAAQ,EAAE,IAAI,CAACV,OAAO,CAACG,EAAE,CAAA;AACpE,wBAAA,IAAI,CAACrF,EAAE,CAACgG,SAAS,GAAG9G,GAAG6G,aAAa,CAAC,IAAI,CAACF,OAAO,EAAE,IAAI,CAACX,OAAO,CAACG,EAAE,CAAA;wBAClE,IAAI,CAACrF,EAAE,CAACiG,cAAc,GAAG/G,EAAGgH,CAAAA,KAAK,CAAChH,EAAAA,CAAGuG,GAAG,CAAC,IAAI,CAACK,UAAU,CAACzE,CAAC,EAAEnC,EAAGiB,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC6F,SAAS,CAAC3E,CAAC,CAAA,CAAA,EAAI,CAAG,EAAA,CAAA,CAAA;AAC7F,wBAAA,IAAI,CAACjC,QAAQ,CAACuG,QAAQ,GAAGzG,EAAGM,CAAAA,IAAI,CAC9BN,EAAAA,CAAGuC,GAAG,CAAC,IAAI,CAACqE,UAAU,CAAC5E,GAAG,EAAEhC,EAAGuG,CAAAA,GAAG,CAAC,IAAI,CAACK,UAAU,CAACzE,CAAC,EAAE,IAAI,CAAC2E,SAAS,CAAC9E,GAAG,CACxE,CAAA,EAAA,IAAI,CAAC+E,cAAc,CAAA;AAEvB,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;AACA,YAAA,IAAI,CAAC5K,iBAAiB,CAAC8K,IAAI,GAAG,gCAAA;AAC9B,YAAA,IAAI,CAAC7K,mBAAmB,GAAGiC,MAAAA,CAAO6I,eAAe,CAAC,IAAI,CAAC/K,iBAAiB,CAACgL,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAC5F,YAAA,IAAI,CAAC9K,sBAAsB,GAAGgC,MAAAA,CAAO+I,oBAAoB,EAAA;AACzD,YAAA,IAAI,CAAC/K,sBAAsB,CACxB+G,gBAAgB,GAChBC,MAAM,CAAC,IACPQ,CAAAA,CAAAA,eAAe,CAAC,KAAA,EAAO,WACvBC,CAAAA,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,KAAA,CAAA;YAC7B,IAAI,CAACzH,sBAAsB,CAACkH,aAAa,GAAGC,UAAU,CAAC,KAAOC,CAAAA,CAAAA,WAAW,CAAC,KAAA,CAAA;AAC5E;QACA,OAAO,IAAI,CAACtH,iBAAiB;AAC/B;IAEUkL,SAAY,GAAA;AACpB,QAAA,KAAK,CAACA,SAAAA,EAAAA;AACN,QAAA,IAAI,CAACzI,mBAAmB,EAAA;AAC1B;AACF;;;;"}
1
+ {"version":3,"file":"dualdepthpeeling_oit.js","sources":["../../src/render/dualdepthpeeling_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceCaps,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_FARTHEST, REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\nimport { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { tryGetApp } from '../app/api';\r\n\r\nconst DEPTH_FORMAT: TextureFormat = 'rg32f';\r\nconst ACCUM_FORMAT: TextureFormat = 'rgba16f';\r\nconst COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;\r\n\r\n/**\r\n * Dual depth peeling OIT renderer.\r\n *\r\n * @remarks\r\n * This implementation follows the official dual depth peeling pass structure:\r\n * an initialization pass writes the nearest/farthest transparent depth pair, then\r\n * each peel pass ping-pongs the depth pair while accumulating front and back colors.\r\n *\r\n * It requires MRT, per-target blending, min/max blend equations and blendable\r\n * floating-point color targets. If those capabilities are missing, supportDevice()\r\n * returns false and the transparent pass falls back to sorted alpha blending.\r\n *\r\n * @public\r\n */\r\nexport class DualDepthPeelingOIT extends OIT {\r\n /** Type name of DualDepthPeelingOIT */\r\n public static readonly type = 'ddp';\r\n private static readonly DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);\r\n private static readonly FRONT_CLEAR = new Vector4(0, 0, 0, 1);\r\n private static readonly BACK_CLEAR = new Vector4(0, 0, 0, 0);\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private _numPeels: number;\r\n private _currentPass: number;\r\n private _hash: string;\r\n private _depthTargets: [Nullable<Texture2D>, Nullable<Texture2D>];\r\n private _frontTarget: Nullable<Texture2D>;\r\n private _backTarget: Nullable<Texture2D>;\r\n private _framebuffers: [Nullable<FrameBuffer>, Nullable<FrameBuffer>];\r\n private _device: Nullable<AbstractDevice>;\r\n\r\n /**\r\n * Creates an instance of DualDepthPeelingOIT.\r\n *\r\n * @param numPeels - Number of peel iterations after the initialization pass.\r\n */\r\n constructor(numPeels = 8) {\r\n super();\r\n this._numPeels = Math.max(1, Math.floor(numPeels || 0));\r\n this._currentPass = 0;\r\n this._hash = DualDepthPeelingOIT.type;\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** Number of front/back peel iterations after the initialization pass. */\r\n get numPeels() {\r\n return this._numPeels;\r\n }\r\n set numPeels(val: number) {\r\n this._numPeels = Math.max(1, Math.floor(val || 0));\r\n }\r\n\r\n /**\r\n * Checks whether dual depth peeling can run with a capability snapshot.\r\n *\r\n * @param _deviceType - The device type. Unused: every supported backend\r\n * (WebGL2, WebGPU) has the required uniform buffers, so only the\r\n * capabilities decide.\r\n * @param caps - The device capabilities.\r\n * @returns True if dual depth peeling is supported.\r\n */\r\n static supportDeviceCaps(_deviceType: string, caps: DeviceCaps) {\r\n const framebufferCaps = caps.framebufferCaps;\r\n const textureCaps = caps.textureCaps;\r\n const miscCaps = caps.miscCaps;\r\n return (\r\n framebufferCaps.maxDrawBuffers >= 3 &&\r\n framebufferCaps.supportPerTargetBlending &&\r\n framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE &&\r\n miscCaps.supportBlendMinMax &&\r\n textureCaps.supportHalfFloatColorBuffer &&\r\n textureCaps.supportFloatColorBuffer &&\r\n textureCaps.supportFloatBlending\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return DualDepthPeelingOIT.type;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n const device = tryGetApp()?.device;\r\n return (\r\n !!device &&\r\n device.type === deviceType &&\r\n DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps())\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n this.releaseFramebuffers();\r\n if (!ctx.depthTexture) {\r\n return 0;\r\n }\r\n this._device = ctx.device;\r\n this.createFramebuffers(ctx);\r\n return this._numPeels + 1;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n try {\r\n if (this._frontTarget && this._backTarget) {\r\n this.composite(ctx, ctx.device, this._frontTarget, this._backTarget);\r\n }\r\n } finally {\r\n this.releaseFramebuffers();\r\n this._hash = DualDepthPeelingOIT.type;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const targetIndex = pass & 1;\r\n const currentDepthTarget = this._depthTargets[targetIndex];\r\n const previousDepthTarget = this._depthTargets[targetIndex ^ 1];\r\n const framebuffer = this._framebuffers[targetIndex];\r\n if (!currentDepthTarget || !framebuffer || (pass > 0 && !previousDepthTarget)) {\r\n return false;\r\n }\r\n this._hash =\r\n pass === 0\r\n ? `${this.getType()}#init#${currentDepthTarget.uid}`\r\n : `${this.getType()}#peel#${previousDepthTarget!.uid}`;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(framebuffer);\r\n ctx.device.clearFrameBuffer(\r\n pass === 0\r\n ? [DualDepthPeelingOIT.DEPTH_CLEAR, DualDepthPeelingOIT.FRONT_CLEAR, DualDepthPeelingOIT.BACK_CLEAR]\r\n : [DualDepthPeelingOIT.DEPTH_CLEAR, null, null],\r\n null,\r\n null\r\n );\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n ctx.device.popDeviceStates();\r\n }\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.Z_DDP_depth = pb.vec2();\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4();\r\n scope.$outputs.Z_DDP_backColor = pb.vec4();\r\n if (this._currentPass > 0) {\r\n scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4(0, 0, 0, 0);\r\n scope.$outputs.Z_DDP_backColor = pb.vec4(0, 0, 0, 0);\r\n // The peeling depth encoding is internal to this algorithm; normalize\r\n // device depth to standard orientation (0 = near) so the (-front, back)\r\n // encoding, the max/max blend extraction and the peel window logic stay\r\n // convention independent.\r\n scope.$l.Z_DDP_normDepth = REVERSE_Z\r\n ? pb.sub(1, scope.$builtins.fragCoord.z)\r\n : scope.$builtins.fragCoord.z;\r\n if (this._currentPass === 0) {\r\n scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope.Z_DDP_normDepth), scope.Z_DDP_normDepth);\r\n } else {\r\n scope.$l.Z_DDP_prevDepth = pb.textureLoad(\r\n scope.Z_DDP_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).xy;\r\n scope.$l.Z_DDP_frontDepth = pb.neg(scope.Z_DDP_prevDepth.x);\r\n scope.$l.Z_DDP_backDepth = scope.Z_DDP_prevDepth.y;\r\n scope.$l.Z_DDP_curDepth = scope.Z_DDP_normDepth;\r\n scope.$l.Z_DDP_outputColor = pb.vec4(color.rgb, ctx.lightBlending ? pb.float(0) : color.a);\r\n scope\r\n .$if(\r\n pb.or(\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n pb.discard();\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_depth = pb.vec2(pb.neg(this.Z_DDP_normDepth), this.Z_DDP_normDepth);\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.lessThan(scope.Z_DDP_curDepth, pb.add(scope.Z_DDP_frontDepth, 0.000001)),\r\n pb.greaterThan(scope.Z_DDP_curDepth, pb.sub(scope.Z_DDP_frontDepth, 0.000001))\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_frontColor = this.Z_DDP_outputColor;\r\n }\r\n )\r\n .$else(function () {\r\n this.$outputs.Z_DDP_backColor = this.Z_DDP_outputColor;\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, bindGroup: BindGroup) {\r\n if (this._currentPass > 0) {\r\n bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[(this._currentPass & 1) ^ 1]!);\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n rs.useBlendingState().enable(false).enableAlphaToCoverage(false);\r\n rs.useDepthState().enableTest(true).enableWrite(false);\r\n\r\n rs.useTargetBlendingState(0)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('max', 'max')\r\n .setBlendFunc('one', 'one');\r\n\r\n rs.useTargetBlendingState(1)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('dst-alpha', 'one')\r\n .setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n\r\n rs.useTargetBlendingState(2)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'inv-src-alpha')\r\n .setBlendFuncAlpha('one', 'inv-src-alpha');\r\n }\r\n\r\n /** @internal */\r\n private createFramebuffers(ctx: DrawContext) {\r\n const device = ctx.device;\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const depthTarget0 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const depthTarget1 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const frontTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const backTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const framebuffer0 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget0, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n const framebuffer1 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget1, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n device.pool.releaseTexture(depthTarget0);\r\n device.pool.releaseTexture(depthTarget1);\r\n device.pool.releaseTexture(frontTarget);\r\n device.pool.releaseTexture(backTarget);\r\n this._depthTargets = [depthTarget0, depthTarget1];\r\n this._frontTarget = frontTarget;\r\n this._backTarget = backTarget;\r\n this._framebuffers = [framebuffer0, framebuffer1];\r\n }\r\n\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, frontTarget: Texture2D, backTarget: 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(DualDepthPeelingOIT.getCompositeProgram(device));\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('frontTex', frontTarget);\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('backTex', backTarget);\r\n device.setBindGroup(0, DualDepthPeelingOIT._compositeBindGroup!);\r\n drawFullscreenQuad(DualDepthPeelingOIT._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\r\n /** @internal */\r\n private releaseFramebuffers() {\r\n if (this._device) {\r\n if (this._framebuffers[0]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[0]);\r\n }\r\n if (this._framebuffers[1]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[1]);\r\n }\r\n }\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\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.frontTex = pb.tex2D().uniform(0);\r\n this.backTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.frontColor = pb.textureSample(this.frontTex, this.$inputs.uv);\r\n this.$l.backColor = pb.textureSample(this.backTex, this.$inputs.uv);\r\n this.$l.remainingAlpha = pb.clamp(pb.mul(this.frontColor.a, pb.sub(1, this.backColor.a)), 0, 1);\r\n this.$outputs.outColor = pb.vec4(\r\n pb.add(this.frontColor.rgb, pb.mul(this.frontColor.a, this.backColor.rgb)),\r\n this.remainingAlpha\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@DualDepthPeelingOIT_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('one', '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 protected onDispose() {\r\n super.onDispose();\r\n this.releaseFramebuffers();\r\n }\r\n}\r\n"],"names":["DEPTH_FORMAT","ACCUM_FORMAT","COLOR_ATTACHMENT_BYTES_PER_SAMPLE","DualDepthPeelingOIT","OIT","type","DEPTH_CLEAR","Vector4","FRONT_CLEAR","BACK_CLEAR","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_numPeels","_currentPass","_hash","_depthTargets","_frontTarget","_backTarget","_framebuffers","_device","numPeels","Math","max","floor","val","supportDeviceCaps","_deviceType","caps","framebufferCaps","textureCaps","miscCaps","maxDrawBuffers","supportPerTargetBlending","maxColorAttachmentBytesPerSample","supportBlendMinMax","supportHalfFloatColorBuffer","supportFloatColorBuffer","supportFloatBlending","getType","supportDevice","deviceType","device","tryGetApp","getDeviceCaps","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","ctx","releaseFramebuffers","depthTexture","createFramebuffers","end","composite","beginPass","pass","targetIndex","currentDepthTarget","previousDepthTarget","framebuffer","uid","pushDeviceStates","setFramebuffer","clearFrameBuffer","endPass","_pass","popDeviceStates","setupFragmentOutput","scope","pb","$builder","$outputs","Z_DDP_depth","vec2","Z_DDP_frontColor","vec4","Z_DDP_backColor","Z_DDP_depthTexture","tex2D","uniform","noSampler","outputFragmentColor","color","$l","Z_DDP_normDepth","REVERSE_Z","sub","$builtins","fragCoord","z","neg","Z_DDP_prevDepth","textureLoad","ivec2","xy","Z_DDP_frontDepth","x","Z_DDP_backDepth","y","Z_DDP_curDepth","Z_DDP_outputColor","rgb","lightBlending","float","a","$if","or","lessThan","add","greaterThan","discard","$elseif","and","$else","applyUniforms","_ctx","bindGroup","setTexture","calculateHash","setRenderStates","rs","useBlendingState","enable","enableAlphaToCoverage","useDepthState","enableTest","enableWrite","useTargetBlendingState","setBlendEquation","setBlendFunc","setBlendFuncRGB","setBlendFuncAlpha","width","height","depthTarget0","pool","fetchTemporalTexture2D","depthTarget1","frontTarget","backTarget","framebuffer0","createTemporalFramebuffer","framebuffer1","releaseTexture","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","singleColorFramebuffer","length","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","buildRenderProgram","vertex","$inputs","pos","attrib","uv","main","position","DEPTH_FARTHEST","mul","fragment","outColor","frontTex","backTex","frontColor","textureSample","backColor","remainingAlpha","clamp","name","createBindGroup","bindGroupLayouts","createRenderStateSet","onDispose"],"mappings":"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"}