@zephyr3d/scene 0.9.27 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"shadow_mask_pass.js","sources":["../../src/render/shadow_mask_pass.ts"],"sourcesContent":["import { DEPTH_FARTHEST, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { ShadowMapParams } from '../shadow/shadowmapper';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { LIGHT_TYPE_DIRECTIONAL, MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\nconst UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';\r\n\r\n/**\r\n * Number of shadow-casting lights packed into a single RGBA8 mask array layer.\r\n * One light per color channel.\r\n */\r\nexport const SHADOW_MASK_LIGHTS_PER_LAYER = 4;\r\n\r\n/**\r\n * Maximum number of shadow mask array layers, derived from the per-light cap.\r\n */\r\nexport const MAX_SHADOW_MASK_LAYERS = MAX_SHADOW_MASK_LIGHTS / SHADOW_MASK_LIGHTS_PER_LAYER;\r\n\r\n/**\r\n * Renders the screen-space shadow mask for the Forward+ pipeline.\r\n *\r\n * For each shadow-casting light, the light's visibility factor `[0,1]` (1 = lit,\r\n * 0 = fully shadowed) is reconstructed from the linear depth prepass and written\r\n * into one channel of one layer of an `rgba8unorm` texture array. Four lights are\r\n * packed per layer (one per RGBA channel).\r\n *\r\n * The layer/channel assignment must stay in lockstep with\r\n * {@link ClusteredLight.getVisibleLights}: shadow-casting lights occupy clustered\r\n * buffer indices `1..N` in the order of `renderQueue.shadowedLights`. The zero-based\r\n * light ordinal `s = index - 1` maps to `layer = s >> 2`, `channel = s & 3`. The\r\n * clustered shading pass recovers the same mapping from a light's buffer index, so\r\n * no per-light mask index is stored.\r\n *\r\n * @internal\r\n */\r\nexport class ShadowMaskRenderer {\r\n /** Fullscreen mask programs keyed by a per-light shader signature. */\r\n private _programs: Map<string, GPUProgram>;\r\n /** Bind groups paired with each cached program. */\r\n private _bindGroups: Map<string, BindGroup>;\r\n /** One render state per RGBA channel (color mask selects the target channel). */\r\n private _channelStates: Nullable<RenderStateSet[]>;\r\n private readonly _nearFar: Vector2;\r\n private readonly _invRenderSize: Vector2;\r\n private readonly _cameraPosition: Vector4;\r\n private readonly _cameraParams: Vector4;\r\n\r\n constructor() {\r\n this._programs = new Map();\r\n this._bindGroups = new Map();\r\n this._channelStates = null;\r\n this._nearFar = new Vector2();\r\n this._invRenderSize = new Vector2();\r\n this._cameraPosition = new Vector4();\r\n this._cameraParams = new Vector4();\r\n }\r\n\r\n /**\r\n * Number of array layers required to hold `numLights` shadow lights.\r\n * @param numLights - Number of shadow-casting lights.\r\n * @returns Layer count, clamped to {@link MAX_SHADOW_MASK_LAYERS}.\r\n */\r\n static getLayerCount(numLights: number): number {\r\n const n = Math.min(numLights, MAX_SHADOW_MASK_LIGHTS);\r\n return Math.min(Math.ceil(n / SHADOW_MASK_LIGHTS_PER_LAYER), MAX_SHADOW_MASK_LAYERS);\r\n }\r\n\r\n /**\r\n * Render the shadow mask for the given shadow-casting lights.\r\n *\r\n * @param ctx - Draw context (must carry shadowMapInfo for the lights).\r\n * @param depthTexture - Linear depth texture from the depth prepass.\r\n * @param lights - Shadow-casting lights, in clustered-buffer order (index 1..N).\r\n * @param getLayerFramebuffer - Resolves the framebuffer bound to mask array layer `k`.\r\n */\r\n render(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n lights: PunctualLight[],\r\n getLayerFramebuffer: (layer: number) => FrameBuffer\r\n ): void {\r\n const device = ctx.device;\r\n const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);\r\n if (numLights === 0 || !ctx.shadowMapInfo) {\r\n return;\r\n }\r\n const numLayers = ShadowMaskRenderer.getLayerCount(numLights);\r\n const channelStates = this.getChannelStates(device);\r\n const savedShadowLight = ctx.currentShadowLight;\r\n\r\n device.pushDeviceStates();\r\n for (let layer = 0; layer < numLayers; layer++) {\r\n const framebuffer = getLayerFramebuffer(layer);\r\n device.setFramebuffer(framebuffer);\r\n // Clear to \"fully lit\" (1 = no shadow) so channels without an assigned\r\n // light, and pixels outside any shadow, read as unshadowed. The mask array\r\n // has no depth attachment, so depth/stencil clear args are null.\r\n device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);\r\n for (let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++) {\r\n const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;\r\n if (ordinal >= numLights) {\r\n break;\r\n }\r\n const light = lights[ordinal];\r\n const shadowMapParams = ctx.shadowMapInfo.get(light);\r\n if (!shadowMapParams || !shadowMapParams.shadowMap) {\r\n continue;\r\n }\r\n // Record where this light lives in the mask so downstream samplers (e.g.\r\n // the SSS combine pass) can read its channel without recomputing shadows.\r\n shadowMapParams.maskOrdinal = ordinal;\r\n ctx.currentShadowLight = light;\r\n this.renderLightChannel(ctx, depthTexture, light, shadowMapParams, channelStates[channel]);\r\n }\r\n }\r\n device.popDeviceStates();\r\n ctx.currentShadowLight = savedShadowLight;\r\n }\r\n\r\n /** Render one shadow light into one color channel of the current framebuffer. */\r\n private renderLightChannel(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n light: PunctualLight,\r\n shadowMapParams: ShadowMapParams,\r\n renderState: RenderStateSet\r\n ): void {\r\n const device = ctx.device;\r\n const key = this.getProgramKey(ctx, shadowMapParams);\r\n let program = this._programs.get(key) ?? null;\r\n let bindGroup = this._bindGroups.get(key) ?? null;\r\n if (!program) {\r\n program = this.createProgram(ctx, shadowMapParams);\r\n bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n this._programs.set(key, program);\r\n this._bindGroups.set(key, bindGroup);\r\n }\r\n bindGroup = this._bindGroups.get(key)!;\r\n this.setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(renderState);\r\n }\r\n\r\n /**\r\n * The program signature: distinct shadow implementations, cascade counts and\r\n * shadow map types must not share a compiled program.\r\n */\r\n private getProgramKey(ctx: DrawContext, shadowMapParams: ShadowMapParams): string {\r\n return `${ctx.device.type}|${shadowMapParams.shaderHash}`;\r\n }\r\n\r\n private getChannelStates(device: AbstractDevice): RenderStateSet[] {\r\n if (!this._channelStates) {\r\n this._channelStates = [];\r\n for (let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++) {\r\n const rs = device.createRenderStateSet();\r\n rs.useDepthState().enableTest(false).enableWrite(false);\r\n rs.useRasterizerState().setCullMode('none');\r\n rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);\r\n this._channelStates.push(rs);\r\n }\r\n }\r\n return this._channelStates;\r\n }\r\n\r\n private setUniforms(\r\n bindGroup: BindGroup,\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n light: PunctualLight,\r\n shadowMapParams: ShadowMapParams\r\n ): void {\r\n const camera = ctx.camera;\r\n const near = camera.getNearPlane();\r\n const far = camera.getFarPlane();\r\n const cameraPos = camera.getWorldPosition();\r\n this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);\r\n this._cameraParams.setXYZW(near, far, 1, 1);\r\n this._nearFar.setXY(near, far);\r\n bindGroup.setValue('camera', {\r\n position: this._cameraPosition,\r\n params: this._cameraParams,\r\n shadowDebugCascades: camera.shadowDebugCascades ? 1 : 0,\r\n framestamp: ctx.device.frameInfo.frameCounter\r\n });\r\n // Full shadow light struct (matches helper.ts currentShadowLight lightStruct,\r\n // including implParams which PCSS/VSM impls read via getShadowImplParams).\r\n const implParams = new Vector4();\r\n shadowMapParams.impl!.getParams(implParams);\r\n bindGroup.setValue('light', {\r\n sunDir: ctx.sunLight\r\n ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1)\r\n : new Vector4(0, 1, 0, 0).xyz(),\r\n shadowCascades: shadowMapParams.numShadowCascades,\r\n positionAndRange: light.positionAndRange,\r\n directionAndCutoff: light.directionAndCutoff,\r\n diffuseAndIntensity: ShaderHelper.getPreExposedColorIntensity(light, ctx),\r\n extraParams: light.extraParams,\r\n cascadeDistances: shadowMapParams.cascadeDistances,\r\n depthBiasValues: shadowMapParams.depthBiasValues[0],\r\n shadowCameraParams: shadowMapParams.cameraParams,\r\n depthBiasScales: shadowMapParams.depthBiasScales,\r\n implParams: implParams,\r\n shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),\r\n shadowStrength: light.shadow.shadowStrength,\r\n envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),\r\n envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1\r\n });\r\n bindGroup.setValue('invViewProjMatrix', camera.invViewProjectionMatrix);\r\n bindGroup.setValue('cameraNearFar', this._nearFar);\r\n // Neighbour tap spacing for the depth-based normal reconstruction.\r\n this._invRenderSize.setXY(1 / depthTexture.width, 1 / depthTexture.height);\r\n bindGroup.setValue('invRenderSize', this._invRenderSize);\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture(\r\n UNIFORM_NAME_SHADOW_MAP,\r\n shadowMapParams.shadowMap!,\r\n shadowMapParams.shadowMapSampler\r\n );\r\n }\r\n\r\n /**\r\n * Whether the fullscreen output needs a vertical flip. Mask array layers are\r\n * offscreen render targets, so the convention matches other offscreen passes\r\n * (no flip); WebGPU still flips clip-space Y in the vertex shader.\r\n */\r\n private needFlip(_device: AbstractDevice): boolean {\r\n return false;\r\n }\r\n\r\n private createProgram(ctx: DrawContext, shadowMapParams: ShadowMapParams): GPUProgram {\r\n const device = ctx.device;\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const lightType = shadowMapParams.lightType;\r\n const shadowMap = shadowMapParams.shadowMap!;\r\n const program = device.buildRenderProgram({\r\n label: 'ShadowMask',\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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 this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\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 const cameraStruct = pb.defineStruct([\r\n pb.vec4('position'),\r\n pb.vec4('params'),\r\n pb.float('shadowDebugCascades'),\r\n // Required by PCSS temporal jitter (ShaderHelper.getFramestamp).\r\n pb.int('framestamp')\r\n ]);\r\n // Must match helper.ts currentShadowLight lightStruct field-for-field.\r\n const lightStruct = pb.defineStruct([\r\n pb.vec3('sunDir'),\r\n pb.int('shadowCascades'),\r\n pb.vec4('positionAndRange'),\r\n pb.vec4('directionAndCutoff'),\r\n pb.vec4('diffuseAndIntensity'),\r\n pb.vec4('extraParams'),\r\n pb.vec4('cascadeDistances'),\r\n pb.vec4('depthBiasValues'),\r\n pb.vec4('shadowCameraParams'),\r\n pb.vec4('depthBiasScales'),\r\n pb.vec4('implParams'),\r\n pb.vec4[16]('shadowMatrices'),\r\n pb.float('shadowStrength'),\r\n pb.float('envLightStrength'),\r\n pb.float('envLightSpecularStrength')\r\n ]);\r\n this.camera = cameraStruct().uniform(0);\r\n this.light = lightStruct().uniform(0);\r\n const shadowTex = shadowMap.isTextureCube()\r\n ? shadowMap.isDepth()\r\n ? pb.texCubeShadow()\r\n : pb.texCube()\r\n : shadowMap.isTexture2D()\r\n ? shadowMap.isDepth()\r\n ? pb.tex2DShadow()\r\n : pb.tex2D()\r\n : shadowMap.isDepth()\r\n ? pb.tex2DArrayShadow()\r\n : pb.tex2DArray();\r\n if (\r\n !shadowMap.isDepth() &&\r\n !device.getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMap.format).filterable\r\n ) {\r\n shadowTex.sampleType('unfilterable-float');\r\n }\r\n this[UNIFORM_NAME_SHADOW_MAP] = shadowTex.uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.invViewProjMatrix = pb.mat4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.invRenderSize = pb.vec2().uniform(0);\r\n this.$outputs.color = pb.vec4();\r\n /**\r\n * Geometric normal recovered from the depth prepass.\r\n *\r\n * The opaque queue takes its shadows from this mask rather than from\r\n * each material's calculateShadow, so this is the only place the normal\r\n * offset can be applied on that path - and a fullscreen pass has no\r\n * interpolated normal to use.\r\n *\r\n * Naive cross(dpdx, dpdy) spans depth discontinuities and produces a\r\n * wild normal along every silhouette. Taking the nearer neighbour on\r\n * each axis keeps the basis on one surface instead.\r\n */\r\n pb.func('zReconstructNormal', [pb.vec2('uv'), pb.vec4('center')], function () {\r\n this.$l.dx = pb.vec2(this.invRenderSize.x, 0);\r\n this.$l.dy = pb.vec2(0, this.invRenderSize.y);\r\n this.$l.right = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.add(this.uv, this.dx),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.left = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.sub(this.uv, this.dx),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.up = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.add(this.uv, this.dy),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.down = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.sub(this.uv, this.dy),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.edgeX = pb.sub(this.right.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(\r\n pb.abs(pb.sub(this.left.w, this.center.w)),\r\n pb.abs(pb.sub(this.right.w, this.center.w))\r\n ),\r\n function () {\r\n this.edgeX = pb.sub(this.center.xyz, this.left.xyz);\r\n }\r\n );\r\n this.$l.edgeY = pb.sub(this.up.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(pb.abs(pb.sub(this.down.w, this.center.w)), pb.abs(pb.sub(this.up.w, this.center.w))),\r\n function () {\r\n this.edgeY = pb.sub(this.center.xyz, this.down.xyz);\r\n }\r\n );\r\n this.$l.n = pb.cross(this.edgeX, this.edgeY);\r\n this.$l.len = pb.length(this.n);\r\n // Degenerate footprint (flat depth, or a pixel with no geometry):\r\n // report a zero normal, which yields a zero offset downstream.\r\n this.$if(pb.lessThan(this.len, 1e-12), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.n = pb.div(this.n, this.len);\r\n // The cross product's sign depends on which neighbours were picked, so\r\n // orient it towards the camera rather than tracking that.\r\n this.$l.toEye = pb.sub(this.camera.position.xyz, this.center.xyz);\r\n this.$if(pb.lessThan(pb.dot(this.n, this.toEye), 0), function () {\r\n this.n = pb.neg(this.n);\r\n });\r\n this.$return(this.n);\r\n });\r\n // Explicit-depth cascade selection (fragCoord.z is invalid in a fullscreen\r\n // pass). Mirrors posteffect/sss.ts calculateTransmissionShadow.\r\n pb.func(\r\n 'zShadowMaskFactor',\r\n [pb.vec3('worldPos'), pb.float('depth01'), pb.float('NoL'), pb.vec3('worldNormal')],\r\n function () {\r\n if (numCascades > 1) {\r\n this.$l.linearDepth = pb.mul(this.depth01, this.camera.params.y);\r\n this.$l.splitDistances = this.light.cascadeDistances;\r\n this.$l.comparison = pb.vec4(pb.greaterThan(pb.vec4(this.linearDepth), this.splitDistances));\r\n this.$l.cascadeFlags = pb.vec4(\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 0)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 1)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 2)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 3))\r\n );\r\n this.$l.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));\r\n this.$l.biasedPos = ShaderHelper.applyShadowNormalOffset(\r\n shadowMapParams.lightType,\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.NoL,\r\n ShaderHelper.getShadowCascadeBiasScale(this, this.split)\r\n );\r\n if (device.type === 'webgl') {\r\n this.$l.shadowVertex = pb.vec4();\r\n this.$for(pb.int('cascade'), 0, 4, function () {\r\n this.$if(pb.equal(this.cascade, this.split), function () {\r\n this.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.biasedPos, 1),\r\n this.cascade\r\n );\r\n this.$break();\r\n });\r\n });\r\n } else {\r\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.biasedPos, 1),\r\n this.split\r\n );\r\n }\r\n this.$l.shadow = shadowMapParams.impl!.computeShadowCSM(\r\n shadowMapParams,\r\n this,\r\n this.shadowVertex,\r\n this.NoL,\r\n this.split\r\n );\r\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\r\n this.shadow = pb.mix(\r\n this.shadow,\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(this.shadowDistance, 0.8),\r\n this.shadowDistance,\r\n pb.distance(this.camera.position.xyz, this.worldPos)\r\n )\r\n );\r\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\r\n this.$return(pb.clamp(this.shadow, 0, 1));\r\n } else {\r\n this.$l.biasedPos = ShaderHelper.applyShadowNormalOffset(\r\n shadowMapParams.lightType,\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.NoL\r\n );\r\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.biasedPos, 1)\r\n );\r\n this.$l.shadow = shadowMapParams.impl!.computeShadow(\r\n shadowMapParams,\r\n this,\r\n this.shadowVertex,\r\n this.NoL\r\n );\r\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\r\n this.shadow = pb.mix(\r\n this.shadow,\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(this.shadowDistance, 0.8),\r\n this.shadowDistance,\r\n pb.distance(this.camera.position.xyz, this.worldPos)\r\n )\r\n );\r\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\r\n this.$return(pb.clamp(this.shadow, 0, 1));\r\n }\r\n }\r\n );\r\n pb.main(function () {\r\n this.$l.pos = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n this.$inputs.uv,\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n // The normal is recovered from the depth prepass rather than\r\n // interpolated, because this pass is where the opaque queue's shadows\r\n // are decided and normal offset bias needs one.\r\n this.$l.normal = this.zReconstructNormal(this.$inputs.uv, this.pos);\r\n this.$l.lightDir =\r\n lightType === LIGHT_TYPE_DIRECTIONAL\r\n ? pb.neg(this.light.directionAndCutoff.xyz)\r\n : pb.normalize(pb.sub(this.light.positionAndRange.xyz, this.pos.xyz));\r\n // A zero normal (degenerate reconstruction) gives NoL 0, hence the\r\n // largest offset. Clamp to 1 there instead so those pixels fall back to\r\n // the unoffset behaviour rather than being pushed the furthest.\r\n this.$l.NoL = pb.float(1);\r\n this.$if(pb.greaterThan(pb.dot(this.normal, this.normal), 0.5), function () {\r\n this.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);\r\n });\r\n this.$l.factor = this.zShadowMaskFactor(this.pos.xyz, this.pos.w, this.NoL, this.normal);\r\n this.$outputs.color = pb.vec4(this.factor);\r\n });\r\n }\r\n })!;\r\n program.name = '@ShadowMask';\r\n return program;\r\n }\r\n\r\n /** Release cached GPU resources. */\r\n dispose(): void {\r\n for (const program of this._programs.values()) {\r\n program.dispose();\r\n }\r\n this._programs.clear();\r\n this._bindGroups.clear();\r\n this._channelStates = null;\r\n }\r\n}\r\n\r\n/** Shared type alias to keep the mask factor accessor discoverable. */\r\nexport type ShadowMaskFactorExp = PBShaderExp;\r\n"],"names":["UNIFORM_NAME_SHADOW_MAP","SHADOW_MASK_LIGHTS_PER_LAYER","MAX_SHADOW_MASK_LAYERS","MAX_SHADOW_MASK_LIGHTS","ShadowMaskRenderer","_nearFar","_invRenderSize","_cameraPosition","_cameraParams","_programs","Map","_bindGroups","_channelStates","Vector2","Vector4","getLayerCount","numLights","n","Math","min","ceil","render","ctx","depthTexture","lights","getLayerFramebuffer","device","length","shadowMapInfo","numLayers","channelStates","getChannelStates","savedShadowLight","currentShadowLight","pushDeviceStates","layer","framebuffer","setFramebuffer","clearFrameBuffer","channel","ordinal","light","shadowMapParams","get","shadowMap","maskOrdinal","renderLightChannel","popDeviceStates","renderState","key","getProgramKey","program","bindGroup","createProgram","createBindGroup","bindGroupLayouts","set","setUniforms","setProgram","setBindGroup","drawFullscreenQuad","type","shaderHash","c","rs","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","useColorState","setColorMask","push","camera","near","getNearPlane","far","getFarPlane","cameraPos","getWorldPosition","setXYZW","x","y","z","setXY","setValue","position","params","shadowDebugCascades","framestamp","frameInfo","frameCounter","implParams","impl","getParams","sunDir","sunLight","directionAndCutoff","xyz","scaleBy","shadowCascades","numShadowCascades","positionAndRange","diffuseAndIntensity","ShaderHelper","getPreExposedColorIntensity","extraParams","cascadeDistances","depthBiasValues","shadowCameraParams","cameraParams","depthBiasScales","shadowMatrices","Float32Array","shadowStrength","shadow","envLightStrength","getEnvLightLuminance","envLightSpecularStrength","env","specularStrength","invViewProjectionMatrix","width","height","needFlip","setTexture","fetchSampler","shadowMapSampler","_device","numCascades","lightType","buildRenderProgram","label","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","neg","fragment","cameraStruct","defineStruct","float","lightStruct","vec3","shadowTex","isTextureCube","isDepth","texCubeShadow","texCube","isTexture2D","tex2DShadow","tex2D","tex2DArrayShadow","tex2DArray","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","sampleType","depthTex","invViewProjMatrix","mat4","cameraNearFar","invRenderSize","color","func","$l","dx","dy","right","samplePositionFromDepth","left","sub","up","down","edgeX","center","lessThan","abs","w","edgeY","cross","len","$return","div","toEye","dot","linearDepth","depth01","splitDistances","comparison","greaterThan","cascadeFlags","split","biasedPos","applyShadowNormalOffset","worldPos","worldNormal","NoL","getShadowCascadeBiasScale","shadowVertex","$for","equal","cascade","calculateShadowSpaceVertex","$break","computeShadowCSM","shadowDistance","mix","smoothStep","distance","clamp","computeShadow","normal","zReconstructNormal","lightDir","LIGHT_TYPE_DIRECTIONAL","normalize","factor","zShadowMaskFactor","name","dispose","values","clear"],"mappings":"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"}
1
+ {"version":3,"file":"shadow_mask_pass.js","sources":["../../src/render/shadow_mask_pass.ts"],"sourcesContent":["import { DEPTH_FARTHEST, REVERSE_Z, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { ShadowMapParams } from '../shadow/shadowmapper';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_RECT, MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { SSR_interleavedGradientNoise } from '../shaders/ssr';\r\n\r\nconst UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';\r\nconst CONTACT_SHADOW_STEPS = 8;\r\nconst CONTACT_SHADOW_COMPARE_TOLERANCE_SCALE = 2;\r\n\r\n/**\r\n * Number of shadow-casting lights packed into a single RGBA8 mask array layer.\r\n * One light per color channel.\r\n */\r\nexport const SHADOW_MASK_LIGHTS_PER_LAYER = 4;\r\n\r\n/**\r\n * Maximum number of shadow mask array layers, derived from the per-light cap.\r\n */\r\nexport const MAX_SHADOW_MASK_LAYERS = MAX_SHADOW_MASK_LIGHTS / SHADOW_MASK_LIGHTS_PER_LAYER;\r\n\r\n/**\r\n * Renders the screen-space shadow mask for the Forward+ pipeline.\r\n *\r\n * For each shadow-casting light, the light's visibility factor `[0,1]` (1 = lit,\r\n * 0 = fully shadowed) is reconstructed from the linear depth prepass and written\r\n * into one channel of one layer of an `rgba8unorm` texture array. Four lights are\r\n * packed per layer (one per RGBA channel).\r\n *\r\n * The layer/channel assignment must stay in lockstep with\r\n * {@link ClusteredLight.getVisibleLights}: shadow-casting lights occupy clustered\r\n * buffer indices `1..N` in the order of `renderQueue.shadowedLights`. The zero-based\r\n * light ordinal `s = index - 1` maps to `layer = s >> 2`, `channel = s & 3`. The\r\n * clustered shading pass recovers the same mapping from a light's buffer index, so\r\n * no per-light mask index is stored.\r\n *\r\n * @internal\r\n */\r\nexport class ShadowMaskRenderer {\r\n /** Fullscreen mask programs keyed by a per-light shader signature. */\r\n private _programs: Map<string, GPUProgram>;\r\n /** Bind groups paired with each cached program. */\r\n private _bindGroups: Map<string, BindGroup>;\r\n /** One render state per RGBA channel (color mask selects the target channel). */\r\n private _channelStates: Nullable<RenderStateSet[]>;\r\n private readonly _nearFar: Vector2;\r\n private readonly _invRenderSize: Vector2;\r\n private readonly _cameraPosition: Vector4;\r\n private readonly _cameraParams: Vector4;\r\n private readonly _contactShadow: Vector4;\r\n private readonly _contactScale: Vector2;\r\n private readonly _projZColumn: Vector4;\r\n\r\n constructor() {\r\n this._programs = new Map();\r\n this._bindGroups = new Map();\r\n this._channelStates = null;\r\n this._nearFar = new Vector2();\r\n this._invRenderSize = new Vector2();\r\n this._cameraPosition = new Vector4();\r\n this._cameraParams = new Vector4();\r\n this._contactShadow = new Vector4();\r\n this._contactScale = new Vector2();\r\n this._projZColumn = new Vector4();\r\n }\r\n\r\n /** Whether this light traces contact shadows in the mask pass. */\r\n private static hasContactShadow(ctx: DrawContext, light: PunctualLight): boolean {\r\n return (\r\n ctx.camera.contactShadows && light.contactShadowLength > 0 && light.contactShadowCastingIntensity > 0\r\n );\r\n }\r\n\r\n /**\r\n * Number of array layers required to hold `numLights` shadow lights.\r\n * @param numLights - Number of shadow-casting lights.\r\n * @returns Layer count, clamped to {@link MAX_SHADOW_MASK_LAYERS}.\r\n */\r\n static getLayerCount(numLights: number): number {\r\n const n = Math.min(numLights, MAX_SHADOW_MASK_LIGHTS);\r\n return Math.min(Math.ceil(n / SHADOW_MASK_LIGHTS_PER_LAYER), MAX_SHADOW_MASK_LAYERS);\r\n }\r\n\r\n /**\r\n * Render the shadow mask for the given shadow-casting lights.\r\n *\r\n * @param ctx - Draw context (must carry shadowMapInfo for the lights).\r\n * @param depthTexture - Linear depth texture from the depth prepass.\r\n * @param lights - Shadow-casting lights, in clustered-buffer order (index 1..N).\r\n * @param getLayerFramebuffer - Resolves the framebuffer bound to mask array layer `k`.\r\n */\r\n render(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n lights: PunctualLight[],\r\n getLayerFramebuffer: (layer: number) => FrameBuffer\r\n ): void {\r\n const device = ctx.device;\r\n const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);\r\n if (numLights === 0 || !ctx.shadowMapInfo) {\r\n return;\r\n }\r\n const numLayers = ShadowMaskRenderer.getLayerCount(numLights);\r\n const channelStates = this.getChannelStates(device);\r\n const savedShadowLight = ctx.currentShadowLight;\r\n\r\n device.pushDeviceStates();\r\n for (let layer = 0; layer < numLayers; layer++) {\r\n const framebuffer = getLayerFramebuffer(layer);\r\n device.setFramebuffer(framebuffer);\r\n // Clear to \"fully lit\" (1 = no shadow) so channels without an assigned\r\n // light, and pixels outside any shadow, read as unshadowed. The mask array\r\n // has no depth attachment, so depth/stencil clear args are null.\r\n device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);\r\n for (let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++) {\r\n const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;\r\n if (ordinal >= numLights) {\r\n break;\r\n }\r\n const light = lights[ordinal];\r\n const shadowMapParams = ctx.shadowMapInfo.get(light);\r\n if (!shadowMapParams || !shadowMapParams.shadowMap) {\r\n continue;\r\n }\r\n // Record where this light lives in the mask so downstream samplers (e.g.\r\n // the SSS combine pass) can read its channel without recomputing shadows.\r\n shadowMapParams.maskOrdinal = ordinal;\r\n ctx.currentShadowLight = light;\r\n this.renderLightChannel(ctx, depthTexture, light, shadowMapParams, channelStates[channel]);\r\n }\r\n }\r\n device.popDeviceStates();\r\n ctx.currentShadowLight = savedShadowLight;\r\n }\r\n\r\n /** Render one shadow light into one color channel of the current framebuffer. */\r\n private renderLightChannel(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n light: PunctualLight,\r\n shadowMapParams: ShadowMapParams,\r\n renderState: RenderStateSet\r\n ): void {\r\n const device = ctx.device;\r\n const contactShadow = ShadowMaskRenderer.hasContactShadow(ctx, light);\r\n const key = this.getProgramKey(ctx, shadowMapParams, contactShadow);\r\n let program = this._programs.get(key) ?? null;\r\n let bindGroup = this._bindGroups.get(key) ?? null;\r\n if (!program) {\r\n program = this.createProgram(ctx, shadowMapParams, contactShadow);\r\n bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n this._programs.set(key, program);\r\n this._bindGroups.set(key, bindGroup);\r\n }\r\n bindGroup = this._bindGroups.get(key)!;\r\n this.setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams, contactShadow);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(renderState);\r\n }\r\n\r\n /**\r\n * The program signature: distinct shadow implementations, cascade counts and\r\n * shadow map types must not share a compiled program.\r\n */\r\n private getProgramKey(ctx: DrawContext, shadowMapParams: ShadowMapParams, contactShadow: boolean): string {\r\n return `${ctx.device.type}|${shadowMapParams.shaderHash}|${contactShadow ? 1 : 0}`;\r\n }\r\n\r\n private getChannelStates(device: AbstractDevice): RenderStateSet[] {\r\n if (!this._channelStates) {\r\n this._channelStates = [];\r\n for (let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++) {\r\n const rs = device.createRenderStateSet();\r\n rs.useDepthState().enableTest(false).enableWrite(false);\r\n rs.useRasterizerState().setCullMode('none');\r\n rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);\r\n this._channelStates.push(rs);\r\n }\r\n }\r\n return this._channelStates;\r\n }\r\n\r\n private setUniforms(\r\n bindGroup: BindGroup,\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n light: PunctualLight,\r\n shadowMapParams: ShadowMapParams,\r\n contactShadow: boolean\r\n ): void {\r\n const camera = ctx.camera;\r\n const near = camera.getNearPlane();\r\n const far = camera.getFarPlane();\r\n const cameraPos = camera.getWorldPosition();\r\n this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);\r\n this._cameraParams.setXYZW(near, far, 1, 1);\r\n this._nearFar.setXY(near, far);\r\n bindGroup.setValue('camera', {\r\n position: this._cameraPosition,\r\n params: this._cameraParams,\r\n shadowDebugCascades: camera.shadowDebugCascades ? 1 : 0,\r\n framestamp: ctx.device.frameInfo.frameCounter\r\n });\r\n // Full shadow light struct (matches helper.ts currentShadowLight lightStruct,\r\n // including implParams which PCSS/VSM impls read via getShadowImplParams).\r\n const implParams = new Vector4();\r\n shadowMapParams.impl!.getParams(implParams);\r\n bindGroup.setValue('light', {\r\n sunDir: ctx.sunLight\r\n ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1)\r\n : new Vector4(0, 1, 0, 0).xyz(),\r\n shadowCascades: shadowMapParams.numShadowCascades,\r\n positionAndRange: light.positionAndRange,\r\n directionAndCutoff: light.directionAndCutoff,\r\n diffuseAndIntensity: ShaderHelper.getPreExposedColorIntensity(light, ctx),\r\n extraParams: light.extraParams,\r\n cascadeDistances: shadowMapParams.cascadeDistances,\r\n depthBiasValues: shadowMapParams.depthBiasValues[0],\r\n shadowCameraParams: shadowMapParams.cameraParams,\r\n depthBiasScales: shadowMapParams.depthBiasScales,\r\n implParams: implParams,\r\n shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),\r\n shadowStrength: light.shadow.shadowStrength,\r\n envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),\r\n envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1\r\n });\r\n // The depth prepass draws with the TAA jitter (ShaderHelper.setCameraUniforms),\r\n // so positions are taken back through the same jittered matrices. Undoing\r\n // the jitter with the plain ones moves each point off its surface by part of\r\n // a pixel, a different way every frame; near a light, where the shadow bias\r\n // shrinks with the shadow map texels, that is enough to put the point behind\r\n // its own surface, and patches of it flicker into shadow.\r\n const jittered = ctx.motionVectors;\r\n bindGroup.setValue(\r\n 'invViewProjMatrix',\r\n jittered ? camera.jitteredInvVPMatrix : camera.invViewProjectionMatrix\r\n );\r\n bindGroup.setValue('cameraNearFar', this._nearFar);\r\n // Neighbour tap spacing for the depth-based normal reconstruction.\r\n this._invRenderSize.setXY(1 / depthTexture.width, 1 / depthTexture.height);\r\n bindGroup.setValue('invRenderSize', this._invRenderSize);\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n if (contactShadow) {\r\n const proj = camera.getProjectionMatrix();\r\n if (proj.isPerspective()) {\r\n this._contactScale.setXY(2 / proj[5], 0);\r\n } else {\r\n this._contactScale.setXY(0, 2);\r\n }\r\n this._contactShadow.setXYZW(\r\n light.contactShadowLength,\r\n light.contactShadowLengthInWS ? 1 : 0,\r\n light.contactShadowCastingIntensity,\r\n ctx.device.frameInfo.frameCounter % 8\r\n );\r\n // Third column of the projection matrix: moves a clip-space point along\r\n // the view axis without a separate view-to-clip transform.\r\n this._projZColumn.setXYZW(proj[8], proj[9], proj[10], proj[11]);\r\n bindGroup.setValue('contactShadow', this._contactShadow);\r\n bindGroup.setValue('contactScale', this._contactScale);\r\n bindGroup.setValue('projZColumn', this._projZColumn);\r\n bindGroup.setValue('viewProjMatrix', jittered ? camera.jitteredVPMatrix : camera.viewProjectionMatrix);\r\n }\r\n bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture(\r\n UNIFORM_NAME_SHADOW_MAP,\r\n shadowMapParams.shadowMap!,\r\n shadowMapParams.shadowMapSampler\r\n );\r\n }\r\n\r\n /**\r\n * Whether the fullscreen output needs a vertical flip. Mask array layers are\r\n * offscreen render targets, so the convention matches other offscreen passes\r\n * (no flip); WebGPU still flips clip-space Y in the vertex shader.\r\n */\r\n private needFlip(_device: AbstractDevice): boolean {\r\n return false;\r\n }\r\n\r\n private createProgram(\r\n ctx: DrawContext,\r\n shadowMapParams: ShadowMapParams,\r\n contactShadow: boolean\r\n ): GPUProgram {\r\n const device = ctx.device;\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const lightType = shadowMapParams.lightType;\r\n const shadowMap = shadowMapParams.shadowMap!;\r\n const program = device.buildRenderProgram({\r\n label: 'ShadowMask',\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\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 this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\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 const cameraStruct = pb.defineStruct([\r\n pb.vec4('position'),\r\n pb.vec4('params'),\r\n pb.float('shadowDebugCascades'),\r\n // Required by PCSS temporal jitter (ShaderHelper.getFramestamp).\r\n pb.int('framestamp')\r\n ]);\r\n // Must match helper.ts currentShadowLight lightStruct field-for-field.\r\n const lightStruct = pb.defineStruct([\r\n pb.vec3('sunDir'),\r\n pb.int('shadowCascades'),\r\n pb.vec4('positionAndRange'),\r\n pb.vec4('directionAndCutoff'),\r\n pb.vec4('diffuseAndIntensity'),\r\n pb.vec4('extraParams'),\r\n pb.vec4('cascadeDistances'),\r\n pb.vec4('depthBiasValues'),\r\n pb.vec4('shadowCameraParams'),\r\n pb.vec4('depthBiasScales'),\r\n pb.vec4('implParams'),\r\n pb.vec4[16]('shadowMatrices'),\r\n pb.float('shadowStrength'),\r\n pb.float('envLightStrength'),\r\n pb.float('envLightSpecularStrength')\r\n ]);\r\n this.camera = cameraStruct().uniform(0);\r\n this.light = lightStruct().uniform(0);\r\n const shadowTex = shadowMap.isTextureCube()\r\n ? shadowMap.isDepth()\r\n ? pb.texCubeShadow()\r\n : pb.texCube()\r\n : shadowMap.isTexture2D()\r\n ? shadowMap.isDepth()\r\n ? pb.tex2DShadow()\r\n : pb.tex2D()\r\n : shadowMap.isDepth()\r\n ? pb.tex2DArrayShadow()\r\n : pb.tex2DArray();\r\n if (\r\n !shadowMap.isDepth() &&\r\n !device.getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMap.format).filterable\r\n ) {\r\n shadowTex.sampleType('unfilterable-float');\r\n }\r\n this[UNIFORM_NAME_SHADOW_MAP] = shadowTex.uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.invViewProjMatrix = pb.mat4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.invRenderSize = pb.vec2().uniform(0);\r\n if (contactShadow) {\r\n // x: length, y: 1 if the length is in world units, z: intensity, w: frame index mod 8\r\n this.contactShadow = pb.vec4().uniform(0);\r\n // Screen-relative length multiplier as (depth scale, constant)\r\n this.contactScale = pb.vec2().uniform(0);\r\n this.projZColumn = pb.vec4().uniform(0);\r\n this.viewProjMatrix = pb.mat4().uniform(0);\r\n }\r\n this.$outputs.color = pb.vec4();\r\n /**\r\n * Geometric normal recovered from the depth prepass.\r\n *\r\n * The opaque queue takes its shadows from this mask rather than from\r\n * each material's calculateShadow, so this is the only place the normal\r\n * offset can be applied on that path - and a fullscreen pass has no\r\n * interpolated normal to use.\r\n *\r\n * Naive cross(dpdx, dpdy) spans depth discontinuities and produces a\r\n * wild normal along every silhouette. Taking the nearer neighbour on\r\n * each axis keeps the basis on one surface instead.\r\n *\r\n * Returns the normal in xyz and, in w, how far it can be trusted. The\r\n * nearer-neighbour pick still fails where two surfaces meet at a\r\n * continuous depth - a sphere resting on a floor - because either side\r\n * is equally near, and the normal it builds belongs to neither surface.\r\n */\r\n pb.func('zReconstructNormal', [pb.vec2('uv'), pb.vec4('center')], function () {\r\n this.$l.dx = pb.vec2(this.invRenderSize.x, 0);\r\n this.$l.dy = pb.vec2(0, this.invRenderSize.y);\r\n this.$l.right = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.add(this.uv, this.dx),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.left = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.sub(this.uv, this.dx),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.up = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.add(this.uv, this.dy),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.down = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.sub(this.uv, this.dy),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.edgeX = pb.sub(this.right.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(\r\n pb.abs(pb.sub(this.left.w, this.center.w)),\r\n pb.abs(pb.sub(this.right.w, this.center.w))\r\n ),\r\n function () {\r\n this.edgeX = pb.sub(this.center.xyz, this.left.xyz);\r\n }\r\n );\r\n this.$l.edgeY = pb.sub(this.up.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(pb.abs(pb.sub(this.down.w, this.center.w)), pb.abs(pb.sub(this.up.w, this.center.w))),\r\n function () {\r\n this.edgeY = pb.sub(this.center.xyz, this.down.xyz);\r\n }\r\n );\r\n this.$l.n = pb.cross(this.edgeX, this.edgeY);\r\n this.$l.len = pb.length(this.n);\r\n // Degenerate footprint (flat depth, or a pixel with no geometry):\r\n // report a zero normal, which yields a zero offset downstream.\r\n this.$if(pb.lessThan(this.len, 1e-12), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.n = pb.div(this.n, this.len);\r\n // The cross product's sign depends on which neighbours were picked, so\r\n // orient it towards the camera rather than tracking that.\r\n this.$l.toEye = pb.sub(this.camera.position.xyz, this.center.xyz);\r\n this.$if(pb.lessThan(pb.dot(this.n, this.toEye), 0), function () {\r\n this.n = pb.neg(this.n);\r\n });\r\n // Trust: agreement between the normals built from opposite one-sided\r\n // differences. A crease splits them by its dihedral angle, so the\r\n // tessellation facets of a smooth mesh (a few degrees to a dozen) pass\r\n // while a sphere-on-floor seam or a silhouette does not. Comparing\r\n // depth slopes instead fails on facets facing the camera, where the\r\n // slopes are near zero and any kink looks relatively huge.\r\n const safeNormal = (a: PBShaderExp, b: PBShaderExp) => {\r\n const c = pb.cross(a, b);\r\n return pb.mul(c, pb.inverseSqrt(pb.max(pb.dot(c, c), 1e-24)));\r\n };\r\n this.$l.dR = pb.sub(this.right.xyz, this.center.xyz);\r\n this.$l.dL = pb.sub(this.center.xyz, this.left.xyz);\r\n this.$l.dU = pb.sub(this.up.xyz, this.center.xyz);\r\n this.$l.dD = pb.sub(this.center.xyz, this.down.xyz);\r\n this.$l.agreement = pb.min(\r\n pb.dot(safeNormal(this.dR, this.dU), safeNormal(this.dL, this.dD)),\r\n pb.dot(safeNormal(this.dR, this.dD), safeNormal(this.dL, this.dU))\r\n );\r\n this.$return(pb.vec4(this.n, pb.smoothStep(0.7, 0.9, this.agreement)));\r\n });\r\n // Explicit-depth cascade selection (fragCoord.z is invalid in a fullscreen\r\n // pass). Mirrors posteffect/sss.ts calculateTransmissionShadow.\r\n pb.func(\r\n 'zShadowMaskFactor',\r\n [pb.vec3('worldPos'), pb.float('depth01'), pb.float('NoL'), pb.vec3('worldNormal')],\r\n function () {\r\n if (numCascades > 1) {\r\n this.$l.linearDepth = pb.mul(this.depth01, this.camera.params.y);\r\n this.$l.splitDistances = this.light.cascadeDistances;\r\n this.$l.comparison = pb.vec4(pb.greaterThan(pb.vec4(this.linearDepth), this.splitDistances));\r\n this.$l.cascadeFlags = pb.vec4(\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 0)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 1)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 2)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 3))\r\n );\r\n this.$l.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));\r\n this.$l.biasedPos = ShaderHelper.applyShadowNormalOffset(\r\n shadowMapParams.lightType,\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.NoL,\r\n ShaderHelper.getShadowCascadeBiasScale(this, this.split)\r\n );\r\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.biasedPos, 1),\r\n this.split\r\n );\r\n this.$l.shadow = shadowMapParams.impl!.computeShadowCSM(\r\n shadowMapParams,\r\n this,\r\n this.shadowVertex,\r\n this.NoL,\r\n this.split\r\n );\r\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\r\n this.shadow = pb.mix(\r\n this.shadow,\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(this.shadowDistance, 0.8),\r\n this.shadowDistance,\r\n pb.distance(this.camera.position.xyz, this.worldPos)\r\n )\r\n );\r\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\r\n this.$return(pb.clamp(this.shadow, 0, 1));\r\n } else {\r\n this.$l.biasedPos = ShaderHelper.applyShadowNormalOffset(\r\n shadowMapParams.lightType,\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.NoL\r\n );\r\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.biasedPos, 1)\r\n );\r\n this.$l.shadow = shadowMapParams.impl!.computeShadow(\r\n shadowMapParams,\r\n this,\r\n this.shadowVertex,\r\n this.NoL,\r\n this.worldNormal\r\n );\r\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\r\n this.shadow = pb.mix(\r\n this.shadow,\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(this.shadowDistance, 0.8),\r\n this.shadowDistance,\r\n pb.distance(this.camera.position.xyz, this.worldPos)\r\n )\r\n );\r\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\r\n this.$return(pb.clamp(this.shadow, 0, 1));\r\n }\r\n }\r\n );\r\n if (contactShadow) {\r\n const toDeviceZ = (z: PBShaderExp) => (REVERSE_Z ? z : pb.add(pb.mul(z, 0.5), 0.5));\r\n pb.func(\r\n 'zContactShadow',\r\n [pb.vec3('worldPos'), pb.float('startDepth'), pb.vec3('L'), pb.vec2('pixel')],\r\n function () {\r\n this.$l.sceneDepth = pb.mul(this.startDepth, this.cameraNearFar.y);\r\n this.$l.screenScale = pb.add(pb.mul(this.contactScale.x, this.sceneDepth), this.contactScale.y);\r\n this.$l.rayLength = pb.mul(\r\n this.contactShadow.x,\r\n pb.mix(this.screenScale, 1, this.contactShadow.y)\r\n );\r\n this.$l.rayStartClip = pb.mul(this.viewProjMatrix, pb.vec4(this.worldPos, 1));\r\n this.$l.rayDirClip = pb.mul(this.viewProjMatrix, pb.vec4(pb.mul(this.L, this.rayLength), 0));\r\n this.$l.rayEndClip = pb.add(this.rayStartClip, this.rayDirClip);\r\n this.$l.rayStart = pb.div(this.rayStartClip.xyz, this.rayStartClip.w);\r\n this.$l.rayEnd = pb.div(this.rayEndClip.xyz, this.rayEndClip.w);\r\n this.$l.rayStep = pb.sub(this.rayEnd, this.rayStart);\r\n this.$l.rayDepthClip = pb.add(\r\n this.rayStartClip,\r\n pb.mul(this.projZColumn, pb.neg(this.rayLength))\r\n );\r\n this.$l.rayDepth = pb.div(this.rayDepthClip.xyz, this.rayDepthClip.w);\r\n this.$l.stepSize = pb.float(1 / CONTACT_SHADOW_STEPS);\r\n this.$l.dither = SSR_interleavedGradientNoise(this, this.pixel, this.contactShadow.w);\r\n this.$l.compareTolerance = pb.mul(\r\n pb.abs(pb.sub(toDeviceZ(this.rayDepth.z), toDeviceZ(this.rayStart.z))),\r\n this.stepSize,\r\n CONTACT_SHADOW_COMPARE_TOLERANCE_SCALE\r\n );\r\n this.$l.sampleTime = pb.add(pb.mul(pb.sub(this.dither, 0.5), this.stepSize), this.stepSize);\r\n this.$for(pb.int('i'), 0, CONTACT_SHADOW_STEPS, function () {\r\n this.$l.samplePos = pb.add(this.rayStart, pb.mul(this.rayStep, this.sampleTime));\r\n this.$l.sampleUV = pb.add(pb.mul(this.samplePos.xy, 0.5), pb.vec2(0.5));\r\n this.$l.sampleDepth = ShaderHelper.sampleLinearDepth(this, this.depthTex, this.sampleUV, 0);\r\n // Avoid self-intersection with the start pixel (exact comparison\r\n // due to point sampling the depth buffer).\r\n this.$if(pb.notEqual(this.sampleDepth, this.startDepth), function () {\r\n this.$l.sampleDeviceZ = ShaderHelper.linearNormalizedToNonLinearDepth(\r\n this,\r\n this.sampleDepth,\r\n this.cameraNearFar\r\n );\r\n this.$l.rayDeviceZ = toDeviceZ(this.samplePos.z);\r\n this.$l.depthDiff = REVERSE_Z\r\n ? pb.sub(this.rayDeviceZ, this.sampleDeviceZ)\r\n : pb.sub(this.sampleDeviceZ, this.rayDeviceZ);\r\n this.$if(\r\n pb.lessThan(pb.abs(pb.add(this.depthDiff, this.compareTolerance)), this.compareTolerance),\r\n function () {\r\n // Off screen masking, check NDC position against NDC boundary [-1,1]\r\n this.$if(pb.all(pb.lessThan(pb.abs(this.samplePos.xy), pb.vec2(1))), function () {\r\n this.$return(pb.sub(1, this.contactShadow.z));\r\n });\r\n this.$return(pb.float(1));\r\n }\r\n );\r\n });\r\n this.sampleTime = pb.add(this.sampleTime, this.stepSize);\r\n });\r\n this.$return(pb.float(1));\r\n }\r\n );\r\n }\r\n pb.main(function () {\r\n this.$l.pos = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n this.$inputs.uv,\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n // The normal is recovered from the depth prepass rather than\r\n // interpolated, because this pass is where the opaque queue's shadows\r\n // are decided and normal offset bias needs one.\r\n this.$l.normalInfo = this.zReconstructNormal(this.$inputs.uv, this.pos);\r\n this.$l.normal = this.normalInfo.xyz;\r\n this.$l.lightDir =\r\n lightType === LIGHT_TYPE_DIRECTIONAL\r\n ? pb.neg(this.light.directionAndCutoff.xyz)\r\n : pb.normalize(pb.sub(this.light.positionAndRange.xyz, this.pos.xyz));\r\n // A zero normal (degenerate reconstruction) gives NoL 0, hence the\r\n // largest offset. Clamp to 1 there instead so those pixels fall back to\r\n // the unoffset behaviour rather than being pushed the furthest.\r\n this.$l.NoL = pb.float(1);\r\n this.$if(pb.greaterThan(pb.dot(this.normal, this.normal), 0.5), function () {\r\n this.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);\r\n });\r\n this.$l.factor = this.zShadowMaskFactor(this.pos.xyz, this.pos.w, this.NoL, this.normal);\r\n if (lightType !== LIGHT_TYPE_DIRECTIONAL) {\r\n // Rect lights shadow as point lights (see ShadowMapper), so tell them\r\n // apart by the true type in extraParams.w. A degenerate (zero) normal\r\n // keeps the plain lookup, as NoL does above, and so does one taken\r\n // across a crease: at a sphere resting on a floor the reconstructed\r\n // normal tilts away from the light and would drop the contact shadow.\r\n // The terminator the fade hides lies on smooth surface anyway.\r\n this.$if(\r\n pb.and(\r\n pb.equal(pb.int(this.light.extraParams.w), LIGHT_TYPE_RECT),\r\n pb.greaterThan(pb.dot(this.normal, this.normal), 0.5)\r\n ),\r\n function () {\r\n this.factor = pb.mix(\r\n 1,\r\n this.factor,\r\n pb.mix(\r\n 1,\r\n ShaderHelper.getRectLightShadowWeight(\r\n this,\r\n this.pos.xyz,\r\n this.normal,\r\n this.light.positionAndRange\r\n ),\r\n this.normalInfo.w\r\n )\r\n );\r\n }\r\n );\r\n }\r\n if (contactShadow) {\r\n this.$if(pb.lessThan(this.pos.w, 1), function () {\r\n this.factor = pb.mul(\r\n this.factor,\r\n this.zContactShadow(this.pos.xyz, this.pos.w, this.lightDir, this.$builtins.fragCoord.xy)\r\n );\r\n });\r\n }\r\n this.$outputs.color = pb.vec4(this.factor);\r\n });\r\n }\r\n })!;\r\n program.name = '@ShadowMask';\r\n return program;\r\n }\r\n\r\n /** Release cached GPU resources. */\r\n dispose(): void {\r\n for (const program of this._programs.values()) {\r\n program.dispose();\r\n }\r\n this._programs.clear();\r\n this._bindGroups.clear();\r\n this._channelStates = null;\r\n }\r\n}\r\n\r\n/** Shared type alias to keep the mask factor accessor discoverable. */\r\nexport type ShadowMaskFactorExp = PBShaderExp;\r\n"],"names":["UNIFORM_NAME_SHADOW_MAP","CONTACT_SHADOW_STEPS","CONTACT_SHADOW_COMPARE_TOLERANCE_SCALE","SHADOW_MASK_LIGHTS_PER_LAYER","MAX_SHADOW_MASK_LAYERS","MAX_SHADOW_MASK_LIGHTS","ShadowMaskRenderer","_nearFar","_invRenderSize","_cameraPosition","_cameraParams","_contactShadow","_contactScale","_projZColumn","_programs","Map","_bindGroups","_channelStates","Vector2","Vector4","hasContactShadow","ctx","light","camera","contactShadows","contactShadowLength","contactShadowCastingIntensity","getLayerCount","numLights","n","Math","min","ceil","render","depthTexture","lights","getLayerFramebuffer","device","length","shadowMapInfo","numLayers","channelStates","getChannelStates","savedShadowLight","currentShadowLight","pushDeviceStates","layer","framebuffer","setFramebuffer","clearFrameBuffer","channel","ordinal","shadowMapParams","get","shadowMap","maskOrdinal","renderLightChannel","popDeviceStates","renderState","contactShadow","key","getProgramKey","program","bindGroup","createProgram","createBindGroup","bindGroupLayouts","set","setUniforms","setProgram","setBindGroup","drawFullscreenQuad","type","shaderHash","c","rs","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","useColorState","setColorMask","push","near","getNearPlane","far","getFarPlane","cameraPos","getWorldPosition","setXYZW","x","y","z","setXY","setValue","position","params","shadowDebugCascades","framestamp","frameInfo","frameCounter","implParams","impl","getParams","sunDir","sunLight","directionAndCutoff","xyz","scaleBy","shadowCascades","numShadowCascades","positionAndRange","diffuseAndIntensity","ShaderHelper","getPreExposedColorIntensity","extraParams","cascadeDistances","depthBiasValues","shadowCameraParams","cameraParams","depthBiasScales","shadowMatrices","Float32Array","shadowStrength","shadow","envLightStrength","getEnvLightLuminance","envLightSpecularStrength","env","specularStrength","jittered","motionVectors","jitteredInvVPMatrix","invViewProjectionMatrix","width","height","needFlip","proj","getProjectionMatrix","isPerspective","contactShadowLengthInWS","jitteredVPMatrix","viewProjectionMatrix","setTexture","fetchSampler","shadowMapSampler","_device","numCascades","lightType","buildRenderProgram","label","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","neg","fragment","cameraStruct","defineStruct","float","lightStruct","vec3","shadowTex","isTextureCube","isDepth","texCubeShadow","texCube","isTexture2D","tex2DShadow","tex2D","tex2DArrayShadow","tex2DArray","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","sampleType","depthTex","invViewProjMatrix","mat4","cameraNearFar","invRenderSize","contactScale","projZColumn","viewProjMatrix","color","func","$l","dx","dy","right","samplePositionFromDepth","left","sub","up","down","edgeX","center","lessThan","abs","w","edgeY","cross","len","$return","div","toEye","dot","safeNormal","a","b","inverseSqrt","max","dR","dL","dU","dD","agreement","smoothStep","linearDepth","depth01","splitDistances","comparison","greaterThan","cascadeFlags","split","biasedPos","applyShadowNormalOffset","worldPos","worldNormal","NoL","getShadowCascadeBiasScale","shadowVertex","calculateShadowSpaceVertex","computeShadowCSM","shadowDistance","mix","distance","clamp","computeShadow","toDeviceZ","REVERSE_Z","sceneDepth","startDepth","screenScale","rayLength","rayStartClip","rayDirClip","L","rayEndClip","rayStart","rayEnd","rayStep","rayDepthClip","rayDepth","stepSize","dither","SSR_interleavedGradientNoise","pixel","compareTolerance","sampleTime","$for","samplePos","sampleUV","sampleDepth","sampleLinearDepth","sampleDeviceZ","linearNormalizedToNonLinearDepth","rayDeviceZ","depthDiff","all","normalInfo","zReconstructNormal","normal","lightDir","LIGHT_TYPE_DIRECTIONAL","normalize","factor","zShadowMaskFactor","and","equal","LIGHT_TYPE_RECT","getRectLightShadowWeight","zContactShadow","fragCoord","name","dispose","values","clear"],"mappings":"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"}