@zephyr3d/scene 0.9.26 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -1 +1 @@
1
- {"version":3,"file":"envlight.js","sources":["../../src/render/envlight.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Matrix4x4, REVERSE_Z, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler, getSamplerOptions } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { DrawContext } from './drawable';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\n\r\n/**\r\n * Depth-proportional term of the SSGI history rejection tolerance.\r\n *\r\n * The surface history stores `linearDepth * cameraFar` in an `rgba16f` alpha\r\n * channel, so its quantization error grows with depth: fp16 carries ~11 bits of\r\n * mantissa, giving a relative error near 4.9e-4 (~0.49 world units at a depth of\r\n * 1000). A purely absolute tolerance is therefore unusable in the distance -- at\r\n * `ssgiDepthReject`'s 0.5 default, storage quantization alone consumes the whole\r\n * budget and the test degenerates into dithered noise. This factor keeps roughly\r\n * 4x headroom over that error while staying far below the depth step of a real\r\n * disocclusion.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_DEPTH_TOLERANCE_RELATIVE = 2e-3;\r\n\r\n/**\r\n * Multiple of the scaled tolerance at which history is dropped outright.\r\n *\r\n * Inside this gate the depth term contributes a smooth `exp(-d/tol)` weight\r\n * rather than a boolean, so confidence decays continuously instead of flipping.\r\n * At 3x the weight is already down to ~0.05, making the cutoff visually\r\n * continuous -- which is what keeps a rejection boundary from reading as a\r\n * staircase after nearest-neighbour sampling quantizes it to texel steps.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_DEPTH_GATE_SCALE = 3;\r\n\r\n/**\r\n * Clamp distance, in texels, at which history repair reaches its widest radius.\r\n *\r\n * The clamp distance says how far the reprojection had to travel to get back on\r\n * screen, which is a direct measure of how unrelated to this pixel the surviving\r\n * history is. It scales the repair radius rather than gating repair off: the\r\n * lighting pass only ever sees the previous frame, so a pixel rotating in from\r\n * off screen has no fresh data anywhere and both alternatives to spreading the\r\n * taps look worse than the blur does.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_REPAIR_WIDE_CLAMP_TEXELS = 8;\r\n\r\n/**\r\n * Repair tap radius in texels, from an interior hole to a camera-edge one.\r\n *\r\n * The radius is what trades structure against smoothness. At one texel the taps\r\n * of neighbouring pixels barely overlap, so detail survives -- correct for a hole\r\n * in the middle of the screen, where the reprojection landed near its true\r\n * position. Wide taps instead overlap heavily between neighbours, which turns the\r\n * one strip of history that survives at a screen edge into a smooth low-frequency\r\n * estimate of the surface's irradiance rather than a per-column copy of single\r\n * texels, and copying single texels is what draws streaks along the direction of\r\n * travel.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_REPAIR_MIN_RADIUS_TEXELS = 1;\r\nconst SSGI_REPAIR_MAX_RADIUS_TEXELS = 16;\r\n\r\n/**\r\n * Environment light type\r\n * @public\r\n */\r\nexport type EnvLightType = 'ibl' | 'hemisphere' | 'constant' | 'none';\r\n\r\n/**\r\n * Base class for any kind of environment light\r\n * @public\r\n */\r\nexport abstract class EnvironmentLighting extends Disposable {\r\n /**\r\n * The environment light type\r\n */\r\n abstract getType(): EnvLightType;\r\n /**\r\n * Initialize shader bindings\r\n * @param pb - The program builder\r\n */\r\n abstract initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext): void;\r\n /**\r\n * Updates the uniform values\r\n * @param bg - The bind group to be updated\r\n */\r\n abstract updateBindGroup(bg: BindGroup, ctx?: DrawContext): void;\r\n /**\r\n * Get radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Surface roughness\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get Charlie-filtered sheen radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Sheen roughness\r\n *\r\n * @returns The sheen radiance for the fragment\r\n */\r\n abstract getSheenRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get irradiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param normal - surface normal\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext): PBShaderExp;\r\n /**\r\n * Returns whether this environment lighting supports reflective light\r\n */\r\n abstract hasRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports sheen reflective light\r\n */\r\n abstract hasSheenRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports diffuse light\r\n */\r\n abstract hasIrradiance(): boolean;\r\n}\r\n\r\n/**\r\n * IBL with SH based environment lighting\r\n * @public\r\n */\r\nexport class EnvShIBL extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP = 'zIBLRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP = 'zIBLSheenRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD = 'zIBLRadianceMapMaxLOD';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_SH = 'zIBLIrradianceSH';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_WINDOW = 'zIBLIrradianceWindow';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_IRRADIANCE = 'zSSGIPreviousIrradiance';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_SURFACE = 'zSSGIPreviousSurface';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_CURRENT_DEPTH = 'zSSGICurrentDepth';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_MOTION = 'zSSGICurrentMotion';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_TARGET_SIZE = 'zSSGITargetSize';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_REPROJECTION = 'zSSGIReprojection';\r\n /**\r\n * Transforms a current-frame view-space position into previous-frame clip\r\n * space, so the reprojected depth can be compared against the surface history\r\n * in the frame that history was written in. @internal\r\n */\r\n public static readonly UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP = 'zSSGIViewToPrevClip';\r\n /** Unprojects a screen-space sample back into current view space. @internal */\r\n public static readonly UNIFORM_NAME_SSGI_INV_PROJECTION = 'zSSGIInvProjection';\r\n /** Scratch for the view -> previous clip composition. @internal */\r\n private static readonly _viewToPrevClip = new Matrix4x4();\r\n /** @internal */\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _sheenRadianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n /** @internal */\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n /** @internal */\r\n private _irraidanceWindow: Vector3;\r\n /**\r\n * Creates an instance of EnvIBL\r\n * @param radianceMap - The radiance map\r\n * @param irradianceSH - The irradiance SH\r\n */\r\n constructor(\r\n radianceMap?: TextureCube,\r\n irradianceSH?: GPUDataBuffer,\r\n irradianceSHFB?: FrameBuffer,\r\n sheenRadianceMap?: TextureCube\r\n ) {\r\n super();\r\n this._radianceMap = new DRef(radianceMap || null);\r\n this._sheenRadianceMap = new DRef(sheenRadianceMap || null);\r\n this._irradianceSH = new DRef(irradianceSH || null);\r\n this._irradianceSHFB = new DRef(irradianceSHFB || null);\r\n this._irraidanceWindow = new Vector3();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'ibl' as const;\r\n }\r\n /** The radiance map */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n }\r\n /** The Charlie-filtered sheen radiance map */\r\n get sheenRadianceMap() {\r\n return this._sheenRadianceMap.get();\r\n }\r\n set sheenRadianceMap(tex) {\r\n this._sheenRadianceMap.set(tex);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n }\r\n /** The irradiance sh window */\r\n get irradianceWindow() {\r\n return this._irraidanceWindow;\r\n }\r\n set irradianceWindow(val) {\r\n this._irraidanceWindow = val;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext) {\r\n if (pb.shaderKind === 'fragment') {\r\n if (this.radianceMap) {\r\n // Prefiltered radiance cube: mipmap chain indexed by roughness\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);\r\n }\r\n if (this.sheenRadianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n }\r\n if (this.irradianceSHFB) {\r\n const tex = pb.tex2D();\r\n const formatInfo = getDevice()\r\n .getDeviceCaps()\r\n .textureCaps.getTextureFormatInfo(this.irradianceSHFB.getColorAttachments()[0].format);\r\n if (formatInfo && !formatInfo.filterable) {\r\n tex.sampleType('unfilterable-float');\r\n }\r\n // SH coefficients are read at texel centers; nearest sampling is exact\r\n tex.withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = tex.uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n } else if (this.irradianceSH) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.vec4[9]().uniformBuffer(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n if (EnvShIBL.hasSSGIHistory(ctx)) {\r\n const irradianceSampler =\r\n pb.getDevice().type === 'webgl' ? 'clamp_nearest_nomip' : 'clamp_linear_nomip';\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions(irradianceSampler));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n if (ctx?.motionVectorTexture) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_MOTION] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n }\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE] = pb.vec2().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP] = pb.mat4().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION] = pb.mat4().uniform(0);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup, ctx?: DrawContext) {\r\n if (this.radianceMap) {\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD, this.radianceMap.mipLevelCount - 1);\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP, this.radianceMap);\r\n }\r\n if (this.sheenRadianceMap) {\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP, this.sheenRadianceMap);\r\n }\r\n if (this.irradianceSHFB) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH,\r\n this.irradianceSHFB.getColorAttachments()[0],\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n } else if (this.irradianceSH) {\r\n bg.setBuffer(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH, this.irradianceSH);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n if (EnvShIBL.hasSSGIHistory(ctx)) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE,\r\n ctx!.SSGIIrradianceHistoryTexture!,\r\n fetchSampler(ctx!.device.type === 'webgl' ? 'clamp_nearest_nomip' : 'clamp_linear_nomip')\r\n );\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_SURFACE,\r\n ctx!.SSGISurfaceHistoryTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH,\r\n ctx!.linearDepthTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n if (ctx!.motionVectorTexture) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_MOTION,\r\n ctx!.motionVectorTexture,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n }\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE, new Vector2(ctx!.renderWidth, ctx!.renderHeight));\r\n bg.setValue(\r\n EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION,\r\n new Vector4(\r\n ctx!.camera.ssgiDepthReject,\r\n ctx!.camera.ssgiNormalReject,\r\n ctx!.camera.getFarPlane(),\r\n ctx!.camera.getNearPlane()\r\n )\r\n );\r\n // View -> world -> previous clip. `prevVPMatrix` is null on the first frame\r\n // after a history reset; falling back to the current VP makes the expected\r\n // previous depth equal the current one, so the depth term is a no-op until\r\n // a real previous frame exists.\r\n const prevVP = ctx!.camera.prevVPMatrix ?? ctx!.camera.viewProjectionMatrix;\r\n Matrix4x4.multiply(prevVP as Matrix4x4, ctx!.camera.worldMatrix as Matrix4x4, EnvShIBL._viewToPrevClip);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP, EnvShIBL._viewToPrevClip);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION, ctx!.camera.getInvProjectionMatrix());\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('Z_sh_Y0', [pb.vec3('v')], function () {\r\n this.$return(0.2820947917);\r\n });\r\n pb.func('Z_sh_Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Z_sh_Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Z_sh_Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Z_sh_Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('Z_sh_eval', [pb.vec3('v')], function () {\r\n this.$l.window = this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW];\r\n if (that.irradianceSHFB) {\r\n this.$l.c = pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y1(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y2(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y3(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y4(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y5(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y6(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y7(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y8(this.v),\r\n this.window.z\r\n )\r\n );\r\n } else {\r\n this.$l.c = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][0].xyz,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][1].xyz, this.Z_sh_Y1(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][2].xyz, this.Z_sh_Y2(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][3].xyz, this.Z_sh_Y3(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][4].xyz, this.Z_sh_Y4(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][5].xyz, this.Z_sh_Y5(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][6].xyz, this.Z_sh_Y6(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][7].xyz, this.Z_sh_Y7(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][8].xyz, this.Z_sh_Y8(this.v), this.window.z)\r\n );\r\n }\r\n this.$return(this.c);\r\n });\r\n const iblIrradiance = pb.getGlobalScope().Z_sh_eval(normal) as PBShaderExp;\r\n if (!EnvShIBL.hasSSGIHistory(ctx)) {\r\n return iblIrradiance;\r\n }\r\n const useMotionReprojection = !!ctx?.motionVectorTexture;\r\n pb.func('Z_ssgi_reprojectIrradiance', [pb.vec3('currentNormal'), pb.vec3('ibl')], function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE]);\r\n if (useMotionReprojection) {\r\n this.$l.motion = pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_SSGI_MOTION], this.uv, 0).xy;\r\n this.$l.previousUV = pb.sub(this.uv, this.motion);\r\n this.$l.motionValid = pb.not(pb.any(pb.greaterThanEqual(pb.abs(this.motion), pb.vec2(5e4))));\r\n } else {\r\n this.$l.previousUV = this.uv;\r\n this.$l.motionValid = pb.bool(true);\r\n }\r\n this.$l.params = this[EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION];\r\n this.$l.fallback = pb.mul(this.ibl, this.light.envLightStrength);\r\n this.$l.normalizedCurrentNormal = pb.normalize(this.currentNormal);\r\n this.$l.depthTolerance = pb.max(this.params.x, 1e-4);\r\n this.$l.texelSize = pb.div(pb.vec2(1), this[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE]);\r\n this.$l.halfTexel = pb.mul(this.texelSize, 0.5);\r\n this.$l.maxUV = pb.sub(pb.vec2(1), this.halfTexel);\r\n this.$l.previousUVInBounds = pb.and(\r\n this.motionValid,\r\n pb.all(pb.greaterThanEqual(this.previousUV, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.previousUV, pb.vec2(1)))\r\n );\r\n this.$l.previousSampleUV = pb.clamp(this.previousUV, this.halfTexel, this.maxUV);\r\n this.$l.previousSurface = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE],\r\n this.previousSampleUV,\r\n 0\r\n );\r\n this.$l.previousNormal = pb.normalize(pb.sub(pb.mul(this.previousSurface.rgb, 2), pb.vec3(1)));\r\n this.$l.currentDepthSample = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH],\r\n this.uv,\r\n 0\r\n );\r\n this.$l.currentDepth = pb.mul(\r\n pb.getDevice().type === 'webgl'\r\n ? decodeNormalizedFloatFromRGBA(this, this.currentDepthSample)\r\n : this.currentDepthSample.r,\r\n this.params.z\r\n );\r\n // The surface history holds a Z measured in the *previous* frame's view\r\n // space, so the current Z cannot be compared against it directly: under\r\n // camera rotation a static, correctly reprojected point has\r\n // `dz ~ r * sin(theta) * dphi`, which crosses any fixed threshold at the\r\n // screen edges and drops history in the exact staircase pattern that\r\n // nearest-neighbour sampling of the reprojected UV produces. Rebuild the\r\n // current view-space position and push it through `view -> previous clip`\r\n // instead; `clip.w` is `-view.z`, i.e. the same positive view-space\r\n // distance the history stores.\r\n this.$l.ndc = pb.sub(pb.mul(this.uv, 2), pb.vec2(1));\r\n this.$l.nearPlaneRay = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION],\r\n pb.vec4(this.ndc, REVERSE_Z ? 1 : -1, 1)\r\n );\r\n // Perspective unprojection of the near-plane NDC depth (GL -1, reverse\r\n // ZO 1) lands on the near plane, where view z is exactly -near; scaling\r\n // that ray by depth/near walks it out to the sample without a\r\n // non-linear depth round trip.\r\n this.$l.viewPos = pb.mul(\r\n pb.div(this.nearPlaneRay.xyz, this.nearPlaneRay.w),\r\n pb.div(this.currentDepth, pb.max(this.params.w, 1e-6))\r\n );\r\n this.$l.expectedPreviousDepth = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP],\r\n pb.vec4(this.viewPos, 1)\r\n ).w;\r\n this.$l.depthDelta = pb.abs(pb.sub(this.previousSurface.a, this.expectedPreviousDepth));\r\n // fp16 storage error scales with depth, so the tolerance has to as well.\r\n this.$l.scaledDepthTolerance = pb.add(\r\n this.depthTolerance,\r\n pb.mul(this.currentDepth, SSGI_DEPTH_TOLERANCE_RELATIVE)\r\n );\r\n this.$l.depthWeight = pb.exp(pb.neg(pb.div(this.depthDelta, this.scaledDepthTolerance)));\r\n this.$l.depthValid = pb.lessThanEqual(\r\n this.depthDelta,\r\n pb.mul(this.scaledDepthTolerance, SSGI_DEPTH_GATE_SCALE)\r\n );\r\n this.$l.normalValid = pb.greaterThanEqual(\r\n pb.dot(this.normalizedCurrentNormal, this.previousNormal),\r\n this.params.y\r\n );\r\n this.$l.previousIrradiance = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE],\r\n this.previousSampleUV,\r\n 0\r\n );\r\n this.$l.previousAlpha = pb.clamp(this.previousIrradiance.a, 0, 1);\r\n this.$l.exactHistoryValid = pb.and(\r\n this.previousUVInBounds,\r\n this.depthValid,\r\n this.normalValid,\r\n pb.greaterThan(this.previousAlpha, 1e-4)\r\n );\r\n this.$if(this.exactHistoryValid, function () {\r\n // Weighting confidence by the depth term keeps the gate boundary a ramp\r\n // rather than a step, so residual reprojection error on moving geometry\r\n // and grazing surfaces fades out instead of outlining itself.\r\n this.$l.exactConfidence = pb.mul(this.previousAlpha, this.depthWeight);\r\n this.$if(pb.greaterThan(this.exactConfidence, 1e-4), function () {\r\n this.$return(pb.mix(this.fallback, this.previousIrradiance.rgb, this.exactConfidence));\r\n });\r\n });\r\n\r\n // Repair disoccluded and off-screen history from nearby samples before\r\n // falling back to IBL. Sampling around the clamped reprojected position\r\n // fills camera-edge holes, while current UV provides a conservative\r\n // screen-stationary candidate for invalid motion vectors.\r\n this.$l.repairCenter = this.$choice(\r\n this.motionValid,\r\n this.previousSampleUV,\r\n pb.clamp(this.uv, this.halfTexel, this.maxUV)\r\n );\r\n // How far the reprojection had to be clamped to land back on screen. For a\r\n // hole in the interior this is zero and the taps really are neighbours of\r\n // the reprojected point, but for geometry rotating in from off screen the\r\n // clamp can travel hundreds of pixels -- and the depth and normal terms\r\n // cannot catch that, because the edge texel it lands on is usually the same\r\n // continuous surface (same normal, similar depth) merely sampled somewhere\r\n // spatially unrelated. Its irradiance therefore belongs to a different part\r\n // of the surface, so reading it as a point sample smears into streaks along\r\n // the direction of travel. Drive the tap radius with it instead, trading\r\n // that structure for a blur.\r\n this.$l.repairClampTexels = pb.div(\r\n pb.length(pb.sub(this.previousSampleUV, this.previousUV)),\r\n pb.max(pb.min(this.texelSize.x, this.texelSize.y), 1e-8)\r\n );\r\n // Widen the taps as the clamp travel grows. Only meaningful while the motion\r\n // vector is usable: without one the centre is already the current UV by\r\n // construction, so there is no travel to react to.\r\n this.$l.repairRadius = pb.mix(\r\n pb.float(SSGI_REPAIR_MIN_RADIUS_TEXELS),\r\n pb.float(SSGI_REPAIR_MAX_RADIUS_TEXELS),\r\n this.$choice(\r\n this.motionValid,\r\n pb.smoothStep(0, SSGI_REPAIR_WIDE_CLAMP_TEXELS, this.repairClampTexels),\r\n pb.float(0)\r\n )\r\n );\r\n // Taps this far apart straddle real depth variation across the surface, so a\r\n // gate tuned for immediate neighbours would reject most of them and bring\r\n // the dark band back. Loosen it with the radius and lean on the normal term,\r\n // which stays strict, to keep the average on one surface.\r\n this.$l.repairDepthTolerance = pb.mul(\r\n this.scaledDepthTolerance,\r\n SSGI_DEPTH_GATE_SCALE,\r\n pb.add(1, this.repairRadius)\r\n );\r\n this.$l.repairSum = pb.vec3(0);\r\n this.$l.repairWeight = pb.float(0);\r\n // A full ring rather than a cross: at the wide end four taps are not an\r\n // average but four distant point copies, and their axis alignment paints\r\n // directional artifacts of its own.\r\n const repairSamples = [\r\n { currentUV: false, x: 0, y: 0, kernel: 1 },\r\n { currentUV: false, x: -1, y: 0, kernel: 0.7 },\r\n { currentUV: false, x: 1, y: 0, kernel: 0.7 },\r\n { currentUV: false, x: 0, y: -1, kernel: 0.7 },\r\n { currentUV: false, x: 0, y: 1, kernel: 0.7 },\r\n { currentUV: false, x: -0.7071, y: -0.7071, kernel: 0.5 },\r\n { currentUV: false, x: 0.7071, y: -0.7071, kernel: 0.5 },\r\n { currentUV: false, x: -0.7071, y: 0.7071, kernel: 0.5 },\r\n { currentUV: false, x: 0.7071, y: 0.7071, kernel: 0.5 },\r\n { currentUV: true, x: 0, y: 0, kernel: 0.5 }\r\n ];\r\n for (let i = 0; i < repairSamples.length; i++) {\r\n const sample = repairSamples[i];\r\n const baseUV = sample.currentUV ? this.uv : this.repairCenter;\r\n this.$l[`repairUV${i}`] = pb.add(\r\n baseUV,\r\n pb.mul(this.texelSize, pb.vec2(sample.x, sample.y), this.repairRadius)\r\n );\r\n this.$l[`repairUVValid${i}`] = pb.and(\r\n pb.all(pb.greaterThanEqual(this[`repairUV${i}`], this.halfTexel)),\r\n pb.all(pb.lessThanEqual(this[`repairUV${i}`], this.maxUV))\r\n );\r\n this.$l[`repairSurface${i}`] = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE],\r\n pb.clamp(this[`repairUV${i}`], this.halfTexel, this.maxUV),\r\n 0\r\n );\r\n this.$l[`repairNormal${i}`] = pb.normalize(\r\n pb.sub(pb.mul(this[`repairSurface${i}`].rgb, 2), pb.vec3(1))\r\n );\r\n // Compared against the reprojected depth, not the current one: the taps\r\n // are samples of the previous frame's surface, so they live in the same\r\n // space as `expectedPreviousDepth`.\r\n this.$l[`repairDepthDelta${i}`] = pb.abs(\r\n pb.sub(this[`repairSurface${i}`].a, this.expectedPreviousDepth)\r\n );\r\n this.$l[`repairNormalDot${i}`] = pb.dot(this.normalizedCurrentNormal, this[`repairNormal${i}`]);\r\n this.$l[`repairSurfaceValid${i}`] = pb.and(\r\n this[`repairUVValid${i}`],\r\n pb.lessThanEqual(this[`repairDepthDelta${i}`], this.repairDepthTolerance),\r\n pb.greaterThanEqual(this[`repairNormalDot${i}`], this.params.y)\r\n );\r\n this.$l[`repairIrradiance${i}`] = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE],\r\n pb.clamp(this[`repairUV${i}`], this.halfTexel, this.maxUV),\r\n 0\r\n );\r\n // Same widening as the hard gate above: a falloff tuned for immediate\r\n // neighbours decays to nothing across a wide tap and starves the average.\r\n this.$l[`repairDepthWeight${i}`] = pb.exp(\r\n pb.neg(pb.div(this[`repairDepthDelta${i}`], this.repairDepthTolerance))\r\n );\r\n this.$l[`repairNormalWeight${i}`] = pb.pow(pb.max(0, this[`repairNormalDot${i}`]), 8);\r\n this.$l[`repairSampleWeight${i}`] = pb.mul(\r\n pb.float(this[`repairSurfaceValid${i}`]),\r\n pb.clamp(this[`repairIrradiance${i}`].a, 0, 1),\r\n this[`repairDepthWeight${i}`],\r\n this[`repairNormalWeight${i}`],\r\n // The screen-stationary tap only exists to cover unusable motion\r\n // vectors; while motion is valid it is a history read at the wrong world\r\n // point, which survives the depth term on any flat surface and leaves a\r\n // stationary ghost.\r\n sample.currentUV ? pb.float(pb.not(this.motionValid)) : pb.float(1),\r\n sample.kernel\r\n );\r\n this.repairSum = pb.add(\r\n this.repairSum,\r\n pb.mul(this[`repairIrradiance${i}`].rgb, this[`repairSampleWeight${i}`])\r\n );\r\n this.repairWeight = pb.add(this.repairWeight, this[`repairSampleWeight${i}`]);\r\n }\r\n this.$if(pb.greaterThan(this.repairWeight, 1e-4), function () {\r\n this.$l.repairedIrradiance = pb.div(this.repairSum, this.repairWeight);\r\n // Repaired samples are intentionally capped below full confidence so\r\n // newly traced irradiance replaces the extrapolation on following frames.\r\n this.$l.repairConfidence = pb.mul(pb.clamp(this.repairWeight, 0, 1), 0.85);\r\n this.$return(pb.mix(this.fallback, this.repairedIrradiance, this.repairConfidence));\r\n });\r\n this.$return(this.fallback);\r\n });\r\n return scope.Z_ssgi_reprojectIrradiance(normal, iblIrradiance) as PBShaderExp;\r\n }\r\n\r\n /** Whether all textures required by the lighting reprojection are scoped. @internal */\r\n static hasSSGIHistory(ctx?: DrawContext) {\r\n return !!(\r\n ctx?.SSGI &&\r\n ctx.SSGIIrradianceHistoryTexture &&\r\n ctx.SSGISurfaceHistoryTexture &&\r\n (ctx.device.type === 'webgl' || ctx.motionVectorTexture) &&\r\n ctx.linearDepthTexture\r\n );\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return !!this._radianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return !!this._sheenRadianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return !!this._irradianceSH.get() || !!this._irradianceSHFB.get();\r\n }\r\n /**\r\n * Disposes the object and releases all GPU resources\r\n * @override\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._radianceMap.dispose();\r\n this._sheenRadianceMap.dispose();\r\n this._irradianceSH.dispose();\r\n this._irradianceSHFB.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Constant ambient light\r\n * @public\r\n */\r\nexport class EnvConstantAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_CONSTANT_AMBIENT = 'zConstantAmbient';\r\n /** @internal */\r\n private readonly _ambientColor: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientColor - The ambient color\r\n */\r\n constructor(ambientColor?: Vector4) {\r\n super();\r\n this._ambientColor = ambientColor ? new Vector4(ambientColor) : new Vector4(0, 0, 0, 1);\r\n }\r\n /** The ambient color */\r\n get ambientColor(): Immutable<Vector4> {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(ambientColor: Immutable<Vector4>) {\r\n if (ambientColor) {\r\n this._ambientColor.set(ambientColor);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'constant' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT, this._ambientColor);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, _normal: PBShaderExp) {\r\n return scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Hemispheric ambient light\r\n * @public\r\n */\r\nexport class EnvHemisphericAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_UP = 'zHemisphericAmbientUp';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_DOWN = 'zHemisphericAmbientDown';\r\n /** @internal */\r\n private readonly _ambientUp: Vector4;\r\n /** @internal */\r\n private readonly _ambientDown: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientUp - The upside ambient color\r\n * @param ambientDown - The downside ambient color\r\n */\r\n constructor(ambientUp: Vector4, ambientDown: Vector4) {\r\n super();\r\n this._ambientUp = new Vector4(ambientUp);\r\n this._ambientDown = new Vector4(ambientDown);\r\n }\r\n /** The upside ambient color */\r\n get ambientUp(): Immutable<Vector4> {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientUp.set(color);\r\n }\r\n }\r\n /** The downside ambient color */\r\n get ambientDown(): Immutable<Vector4> {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientDown.set(color);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'hemisphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP, this._ambientUp);\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN, this._ambientDown);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, _roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(refl.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n return this.getRadiance(scope, refl, roughness);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(normal.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n"],"names":["SSGI_DEPTH_TOLERANCE_RELATIVE","SSGI_DEPTH_GATE_SCALE","SSGI_REPAIR_WIDE_CLAMP_TEXELS","SSGI_REPAIR_MIN_RADIUS_TEXELS","SSGI_REPAIR_MAX_RADIUS_TEXELS","EnvironmentLighting","Disposable","EnvShIBL","UNIFORM_NAME_IBL_RADIANCE_MAP","UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP","UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD","UNIFORM_NAME_IBL_IRRADIANCE_SH","UNIFORM_NAME_IBL_IRRADIANCE_WINDOW","UNIFORM_NAME_SSGI_IRRADIANCE","UNIFORM_NAME_SSGI_SURFACE","UNIFORM_NAME_SSGI_CURRENT_DEPTH","UNIFORM_NAME_SSGI_MOTION","UNIFORM_NAME_SSGI_TARGET_SIZE","UNIFORM_NAME_SSGI_REPROJECTION","UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP","UNIFORM_NAME_SSGI_INV_PROJECTION","_viewToPrevClip","Matrix4x4","radianceMap","irradianceSH","irradianceSHFB","sheenRadianceMap","_radianceMap","DRef","_sheenRadianceMap","_irradianceSH","_irradianceSHFB","_irraidanceWindow","Vector3","getType","get","tex","set","value","irradianceWindow","val","initShaderBindings","pb","ctx","shaderKind","getGlobalScope","texCube","uniform","withSampler","getSamplerOptions","float","tex2D","formatInfo","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","getColorAttachments","format","filterable","sampleType","vec3","vec4","uniformBuffer","hasSSGIHistory","irradianceSampler","type","motionVectorTexture","vec2","mat4","updateBindGroup","bg","setValue","mipLevelCount","setTexture","fetchSampler","setBuffer","SSGIIrradianceHistoryTexture","device","SSGISurfaceHistoryTexture","linearDepthTexture","Vector2","renderWidth","renderHeight","Vector4","camera","ssgiDepthReject","ssgiNormalReject","getFarPlane","getNearPlane","prevVP","prevVPMatrix","viewProjectionMatrix","multiply","worldMatrix","getInvProjectionMatrix","getRadiance","scope","refl","roughness","$builder","shaderCaps","supportShaderTextureLod","textureSampleLevel","mul","rgb","textureSample","getSheenRadiance","getIrradiance","normal","that","func","$return","v","y","z","x","sub","$l","window","c","Z_sh_Y0","add","Z_sh_Y1","Z_sh_Y2","Z_sh_Y3","Z_sh_Y4","Z_sh_Y5","Z_sh_Y6","Z_sh_Y7","Z_sh_Y8","xyz","iblIrradiance","Z_sh_eval","useMotionReprojection","uv","div","$builtins","fragCoord","xy","motion","previousUV","motionValid","not","any","greaterThanEqual","abs","bool","params","fallback","ibl","light","envLightStrength","normalizedCurrentNormal","normalize","currentNormal","depthTolerance","max","texelSize","halfTexel","maxUV","previousUVInBounds","and","all","lessThanEqual","previousSampleUV","clamp","previousSurface","previousNormal","currentDepthSample","currentDepth","decodeNormalizedFloatFromRGBA","r","ndc","nearPlaneRay","REVERSE_Z","viewPos","w","expectedPreviousDepth","depthDelta","a","scaledDepthTolerance","depthWeight","exp","neg","depthValid","normalValid","dot","previousIrradiance","previousAlpha","exactHistoryValid","greaterThan","$if","exactConfidence","mix","repairCenter","$choice","repairClampTexels","length","min","repairRadius","smoothStep","repairDepthTolerance","repairSum","repairWeight","repairSamples","currentUV","kernel","i","sample","baseUV","pow","repairedIrradiance","repairConfidence","Z_ssgi_reprojectIrradiance","SSGI","hasRadiance","hasSheenRadiance","hasIrradiance","onDispose","dispose","EnvConstantAmbient","UNIFORM_NAME_CONSTANT_AMBIENT","ambientColor","_ambientColor","_scope","_refl","_roughness","_normal","EnvHemisphericAmbient","UNIFORM_NAME_AMBIENT_UP","UNIFORM_NAME_AMBIENT_DOWN","ambientUp","ambientDown","_ambientUp","_ambientDown","color","factor"],"mappings":"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"}
1
+ {"version":3,"file":"envlight.js","sources":["../../src/render/envlight.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Matrix4x4, REVERSE_Z, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler, getSamplerOptions } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { DrawContext } from './drawable';\r\nimport { getProbeVolumeForDraw } from './gi/probe_volume';\r\nimport { declareProbeUniforms, sampleProbeIrradiance } from '../shaders/probes';\r\n\r\n/**\r\n * Depth-proportional term of the SSGI history rejection tolerance. fp16 storage of\r\n * `linearDepth * cameraFar` has ~4.9e-4 relative error; this keeps ~4x headroom\r\n * while staying far below a real disocclusion's depth step.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_DEPTH_TOLERANCE_RELATIVE = 2e-3;\r\n\r\n/**\r\n * Multiple of the scaled tolerance at which history is dropped outright. Inside it\r\n * the depth term is a smooth `exp(-d/tol)` weight (~0.05 at 3x), so the cutoff\r\n * does not staircase.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_DEPTH_GATE_SCALE = 3;\r\n\r\n/**\r\n * Clamp distance, in texels, at which history repair reaches its widest radius.\r\n * Clamp travel measures how unrelated the surviving history is, so it scales the\r\n * repair radius rather than gating repair off.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_REPAIR_WIDE_CLAMP_TEXELS = 8;\r\n\r\n/**\r\n * Repair tap radius in texels, from an interior hole to a camera-edge one. Narrow\r\n * taps keep detail; wide taps average the surviving edge strip into a smooth\r\n * estimate instead of copying single texels into streaks.\r\n *\r\n * @internal\r\n */\r\nconst SSGI_REPAIR_MIN_RADIUS_TEXELS = 1;\r\nconst SSGI_REPAIR_MAX_RADIUS_TEXELS = 16;\r\n\r\n/**\r\n * Environment light type\r\n * @public\r\n */\r\nexport type EnvLightType = 'ibl' | 'hemisphere' | 'constant' | 'none';\r\n\r\n/**\r\n * Base class for any kind of environment light\r\n * @public\r\n */\r\nexport abstract class EnvironmentLighting extends Disposable {\r\n /**\r\n * The environment light type\r\n */\r\n abstract getType(): EnvLightType;\r\n /**\r\n * Initialize shader bindings\r\n * @param pb - The program builder\r\n */\r\n abstract initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext): void;\r\n /**\r\n * Updates the uniform values\r\n * @param bg - The bind group to be updated\r\n */\r\n abstract updateBindGroup(bg: BindGroup, ctx?: DrawContext): void;\r\n /**\r\n * Get radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Surface roughness\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get Charlie-filtered sheen radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Sheen roughness\r\n *\r\n * @returns The sheen radiance for the fragment\r\n */\r\n abstract getSheenRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get irradiance for a fragment\r\n *\r\n * @remarks\r\n * With a draw context: the final diffuse environment lighting (sky irradiance times\r\n * the environment strength, replaced by probe GI where covered and refined by SSGI\r\n * history); callers must not scale it again. Without one: raw unscaled sky irradiance.\r\n *\r\n * @param scope - The shader scope\r\n * @param normal - surface normal\r\n * @param ctx - Draw context of the material shading the fragment, if any\r\n *\r\n * @returns The irradiance for the fragment\r\n */\r\n abstract getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext): PBShaderExp;\r\n /**\r\n * Returns whether this environment lighting supports reflective light\r\n */\r\n abstract hasRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports sheen reflective light\r\n */\r\n abstract hasSheenRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports diffuse light\r\n */\r\n abstract hasIrradiance(): boolean;\r\n /**\r\n * Declares the scene's probe volume where the draw reads it (see\r\n * {@link getProbeVolumeForDraw}); call from `initShaderBindings` in the fragment stage.\r\n * @internal\r\n */\r\n protected initProbeBindings(pb: ProgramBuilder, ctx?: DrawContext) {\r\n if (pb.shaderKind === 'fragment' && getProbeVolumeForDraw(ctx)) {\r\n declareProbeUniforms(pb.getGlobalScope(), 0);\r\n }\r\n }\r\n /** Binds what {@link EnvironmentLighting.initProbeBindings} declared. @internal */\r\n protected updateProbeBindGroup(bg: BindGroup, ctx?: DrawContext) {\r\n getProbeVolumeForDraw(ctx)?.applyBindGroup(bg);\r\n }\r\n /**\r\n * Specular occlusion from the probe volume's sky visibility. 1 where probes\r\n * do not cover the fragment or without a `worldPos` varying.\r\n * @internal\r\n */\r\n getSkySpecularOcclusion(\r\n scope: PBInsideFunctionScope,\r\n normal: PBShaderExp,\r\n NoV: PBShaderExp,\r\n roughness: PBShaderExp,\r\n ctx?: DrawContext\r\n ): PBShaderExp {\r\n const pb = scope.$builder;\r\n if (!getProbeVolumeForDraw(ctx)) {\r\n return pb.float(1);\r\n }\r\n const global = pb.getGlobalScope();\r\n const worldPos = global.$inputs.worldPos as PBShaderExp | undefined;\r\n if (!worldPos) {\r\n return pb.float(1);\r\n }\r\n const funcName = 'Z_envSkySpecularOcclusion';\r\n pb.func(funcName, [pb.vec3('n'), pb.vec3('p'), pb.float('NoV'), pb.float('roughness')], function () {\r\n this.$l.sky = sampleProbeIrradiance(\r\n this,\r\n this.p,\r\n this.n,\r\n pb.sub(this.camera.position.xyz, this.p),\r\n 'sky'\r\n );\r\n this.$l.vis = pb.mix(pb.float(1), this.sky.r, this.sky.a);\r\n this.$l.r2 = pb.mul(this.roughness, this.roughness);\r\n this.$return(pb.clamp(pb.add(pb.sub(pb.pow(pb.add(this.NoV, this.vis), this.r2), 1), this.vis), 0, 1));\r\n });\r\n return global[funcName](normal, worldPos, NoV, roughness) as PBShaderExp;\r\n }\r\n /**\r\n * Turns raw sky irradiance into material shading irradiance: scaled by the environment\r\n * strength, then replaced by probe GI where covered (probes are not scaled again).\r\n * Needs the `worldPos` varying; returns the raw irradiance without a draw context.\r\n * @internal\r\n */\r\n protected applyProbes(\r\n scope: PBInsideFunctionScope,\r\n normal: PBShaderExp,\r\n ctx: Nullable<DrawContext>,\r\n irradiance: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n if (!ctx) {\r\n return irradiance;\r\n }\r\n // The light uniforms of the material's light pass; see ShaderHelper.getEnvLightStrength\r\n const sky = pb.mul(irradiance, scope.light.envLightStrength) as PBShaderExp;\r\n if (!getProbeVolumeForDraw(ctx)) {\r\n return sky;\r\n }\r\n const global = pb.getGlobalScope();\r\n const worldPos = global.$inputs.worldPos as PBShaderExp | undefined;\r\n if (!worldPos) {\r\n return sky;\r\n }\r\n const funcName = 'Z_envIrradianceWithProbes';\r\n pb.func(funcName, [pb.vec3('n'), pb.vec3('p'), pb.vec3('env')], function () {\r\n this.$l.probe = sampleProbeIrradiance(this, this.p, this.n, pb.sub(this.camera.position.xyz, this.p));\r\n this.$return(pb.mix(this.env, this.probe.rgb, this.probe.a));\r\n });\r\n return global[funcName](normal, worldPos, sky) as PBShaderExp;\r\n }\r\n}\r\n\r\n/**\r\n * IBL with SH based environment lighting\r\n * @public\r\n */\r\nexport class EnvShIBL extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP = 'zIBLRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP = 'zIBLSheenRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD = 'zIBLRadianceMapMaxLOD';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_SH = 'zIBLIrradianceSH';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_WINDOW = 'zIBLIrradianceWindow';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_IRRADIANCE = 'zSSGIPreviousIrradiance';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_SURFACE = 'zSSGIPreviousSurface';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_CURRENT_DEPTH = 'zSSGICurrentDepth';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_MOTION = 'zSSGICurrentMotion';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_TARGET_SIZE = 'zSSGITargetSize';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_SSGI_REPROJECTION = 'zSSGIReprojection';\r\n /**\r\n * Current view space -> previous-frame clip space. @internal\r\n */\r\n public static readonly UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP = 'zSSGIViewToPrevClip';\r\n /** Unprojects a screen-space sample back into current view space. @internal */\r\n public static readonly UNIFORM_NAME_SSGI_INV_PROJECTION = 'zSSGIInvProjection';\r\n /** Scratch for the view -> previous clip composition. @internal */\r\n private static readonly _viewToPrevClip = new Matrix4x4();\r\n /** @internal */\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _sheenRadianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n /** @internal */\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n /** @internal */\r\n private _irraidanceWindow: Vector3;\r\n /**\r\n * Creates an instance of EnvIBL\r\n * @param radianceMap - The radiance map\r\n * @param irradianceSH - The irradiance SH\r\n */\r\n constructor(\r\n radianceMap?: TextureCube,\r\n irradianceSH?: GPUDataBuffer,\r\n irradianceSHFB?: FrameBuffer,\r\n sheenRadianceMap?: TextureCube\r\n ) {\r\n super();\r\n this._radianceMap = new DRef(radianceMap || null);\r\n this._sheenRadianceMap = new DRef(sheenRadianceMap || null);\r\n this._irradianceSH = new DRef(irradianceSH || null);\r\n this._irradianceSHFB = new DRef(irradianceSHFB || null);\r\n this._irraidanceWindow = new Vector3();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'ibl' as const;\r\n }\r\n /** The radiance map */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n }\r\n /** The Charlie-filtered sheen radiance map */\r\n get sheenRadianceMap() {\r\n return this._sheenRadianceMap.get();\r\n }\r\n set sheenRadianceMap(tex) {\r\n this._sheenRadianceMap.set(tex);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n }\r\n /** The irradiance sh window */\r\n get irradianceWindow() {\r\n return this._irraidanceWindow;\r\n }\r\n set irradianceWindow(val) {\r\n this._irraidanceWindow = val;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext) {\r\n if (pb.shaderKind === 'fragment') {\r\n if (this.radianceMap) {\r\n // Prefiltered radiance cube: mipmap chain indexed by roughness\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);\r\n }\r\n if (this.sheenRadianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n }\r\n if (this.irradianceSHFB) {\r\n const tex = pb.tex2D();\r\n const formatInfo = getDevice()\r\n .getDeviceCaps()\r\n .textureCaps.getTextureFormatInfo(this.irradianceSHFB.getColorAttachments()[0].format);\r\n if (formatInfo && !formatInfo.filterable) {\r\n tex.sampleType('unfilterable-float');\r\n }\r\n // SH coefficients are read at texel centers; nearest sampling is exact\r\n tex.withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = tex.uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n } else if (this.irradianceSH) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.vec4[9]().uniformBuffer(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n if (EnvShIBL.hasSSGIHistory(ctx)) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n if (ctx?.motionVectorTexture) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_MOTION] = pb\r\n .tex2D()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n }\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE] = pb.vec2().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP] = pb.mat4().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION] = pb.mat4().uniform(0);\r\n }\r\n this.initProbeBindings(pb, ctx);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup, ctx?: DrawContext) {\r\n if (this.radianceMap) {\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD, this.radianceMap.mipLevelCount - 1);\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP, this.radianceMap);\r\n }\r\n if (this.sheenRadianceMap) {\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP, this.sheenRadianceMap);\r\n }\r\n if (this.irradianceSHFB) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH,\r\n this.irradianceSHFB.getColorAttachments()[0],\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n } else if (this.irradianceSH) {\r\n bg.setBuffer(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH, this.irradianceSH);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n if (EnvShIBL.hasSSGIHistory(ctx)) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE,\r\n ctx!.SSGIIrradianceHistoryTexture!,\r\n fetchSampler('clamp_linear_nomip')\r\n );\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_SURFACE,\r\n ctx!.SSGISurfaceHistoryTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH,\r\n ctx!.linearDepthTexture!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n if (ctx!.motionVectorTexture) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_SSGI_MOTION,\r\n ctx!.motionVectorTexture,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n }\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE, new Vector2(ctx!.renderWidth, ctx!.renderHeight));\r\n bg.setValue(\r\n EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION,\r\n new Vector4(\r\n ctx!.camera.ssgiDepthReject,\r\n ctx!.camera.ssgiNormalReject,\r\n ctx!.camera.getFarPlane(),\r\n ctx!.camera.getNearPlane()\r\n )\r\n );\r\n // View -> world -> previous clip; without a previous VP the current one makes the depth term a no-op.\r\n const prevVP = ctx!.camera.prevVPMatrix ?? ctx!.camera.viewProjectionMatrix;\r\n Matrix4x4.multiply(prevVP as Matrix4x4, ctx!.camera.worldMatrix as Matrix4x4, EnvShIBL._viewToPrevClip);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP, EnvShIBL._viewToPrevClip);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION, ctx!.camera.getInvProjectionMatrix());\r\n }\r\n this.updateProbeBindGroup(bg, ctx);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('Z_sh_Y0', [pb.vec3('v')], function () {\r\n this.$return(0.2820947917);\r\n });\r\n pb.func('Z_sh_Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Z_sh_Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Z_sh_Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Z_sh_Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('Z_sh_eval', [pb.vec3('v')], function () {\r\n this.$l.window = this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW];\r\n if (that.irradianceSHFB) {\r\n this.$l.c = pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y1(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y2(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y3(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y4(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y5(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y6(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y7(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y8(this.v),\r\n this.window.z\r\n )\r\n );\r\n } else {\r\n this.$l.c = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][0].xyz,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][1].xyz, this.Z_sh_Y1(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][2].xyz, this.Z_sh_Y2(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][3].xyz, this.Z_sh_Y3(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][4].xyz, this.Z_sh_Y4(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][5].xyz, this.Z_sh_Y5(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][6].xyz, this.Z_sh_Y6(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][7].xyz, this.Z_sh_Y7(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][8].xyz, this.Z_sh_Y8(this.v), this.window.z)\r\n );\r\n }\r\n this.$return(this.c);\r\n });\r\n const iblIrradiance = this.applyProbes(\r\n scope,\r\n normal,\r\n ctx ?? null,\r\n pb.getGlobalScope().Z_sh_eval(normal) as PBShaderExp\r\n );\r\n if (!EnvShIBL.hasSSGIHistory(ctx)) {\r\n return iblIrradiance;\r\n }\r\n const useMotionReprojection = !!ctx?.motionVectorTexture;\r\n pb.func('Z_ssgi_reprojectIrradiance', [pb.vec3('currentNormal'), pb.vec3('ibl')], function () {\r\n this.$l.uv = pb.div(pb.vec2(this.$builtins.fragCoord.xy), this[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE]);\r\n if (useMotionReprojection) {\r\n this.$l.motion = pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_SSGI_MOTION], this.uv, 0).xy;\r\n this.$l.previousUV = pb.sub(this.uv, this.motion);\r\n this.$l.motionValid = pb.not(pb.any(pb.greaterThanEqual(pb.abs(this.motion), pb.vec2(5e4))));\r\n } else {\r\n this.$l.previousUV = this.uv;\r\n this.$l.motionValid = pb.bool(true);\r\n }\r\n this.$l.params = this[EnvShIBL.UNIFORM_NAME_SSGI_REPROJECTION];\r\n // Already in the history's units: scaled by the environment strength, probes in place\r\n this.$l.fallback = this.ibl;\r\n this.$l.normalizedCurrentNormal = pb.normalize(this.currentNormal);\r\n this.$l.depthTolerance = pb.max(this.params.x, 1e-4);\r\n this.$l.texelSize = pb.div(pb.vec2(1), this[EnvShIBL.UNIFORM_NAME_SSGI_TARGET_SIZE]);\r\n this.$l.halfTexel = pb.mul(this.texelSize, 0.5);\r\n this.$l.maxUV = pb.sub(pb.vec2(1), this.halfTexel);\r\n this.$l.previousUVInBounds = pb.and(\r\n this.motionValid,\r\n pb.all(pb.greaterThanEqual(this.previousUV, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.previousUV, pb.vec2(1)))\r\n );\r\n this.$l.previousSampleUV = pb.clamp(this.previousUV, this.halfTexel, this.maxUV);\r\n this.$l.previousSurface = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE],\r\n this.previousSampleUV,\r\n 0\r\n );\r\n this.$l.previousNormal = pb.normalize(pb.sub(pb.mul(this.previousSurface.rgb, 2), pb.vec3(1)));\r\n this.$l.currentDepthSample = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_CURRENT_DEPTH],\r\n this.uv,\r\n 0\r\n );\r\n this.$l.currentDepth = pb.mul(this.currentDepthSample.r, this.params.z);\r\n // History Z is in the previous frame's view space; compare via view -> previous\r\n // clip (`clip.w` = positive view distance) to avoid edge staircases under rotation.\r\n this.$l.ndc = pb.sub(pb.mul(this.uv, 2), pb.vec2(1));\r\n this.$l.nearPlaneRay = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_INV_PROJECTION],\r\n pb.vec4(this.ndc, REVERSE_Z ? 1 : -1, 1)\r\n );\r\n // Unprojecting near-plane NDC depth lands at view z = -near; scale by depth/near.\r\n this.$l.viewPos = pb.mul(\r\n pb.div(this.nearPlaneRay.xyz, this.nearPlaneRay.w),\r\n pb.div(this.currentDepth, pb.max(this.params.w, 1e-6))\r\n );\r\n this.$l.expectedPreviousDepth = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP],\r\n pb.vec4(this.viewPos, 1)\r\n ).w;\r\n this.$l.depthDelta = pb.abs(pb.sub(this.previousSurface.a, this.expectedPreviousDepth));\r\n // fp16 storage error scales with depth, so the tolerance has to as well.\r\n this.$l.scaledDepthTolerance = pb.add(\r\n this.depthTolerance,\r\n pb.mul(this.currentDepth, SSGI_DEPTH_TOLERANCE_RELATIVE)\r\n );\r\n this.$l.depthWeight = pb.exp(pb.neg(pb.div(this.depthDelta, this.scaledDepthTolerance)));\r\n this.$l.depthValid = pb.lessThanEqual(\r\n this.depthDelta,\r\n pb.mul(this.scaledDepthTolerance, SSGI_DEPTH_GATE_SCALE)\r\n );\r\n this.$l.normalValid = pb.greaterThanEqual(\r\n pb.dot(this.normalizedCurrentNormal, this.previousNormal),\r\n this.params.y\r\n );\r\n this.$l.previousIrradiance = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE],\r\n this.previousSampleUV,\r\n 0\r\n );\r\n this.$l.previousAlpha = pb.clamp(this.previousIrradiance.a, 0, 1);\r\n this.$l.exactHistoryValid = pb.and(\r\n this.previousUVInBounds,\r\n this.depthValid,\r\n this.normalValid,\r\n pb.greaterThan(this.previousAlpha, 1e-4)\r\n );\r\n this.$if(this.exactHistoryValid, function () {\r\n // Depth-weighted confidence ramps the gate boundary instead of stepping it.\r\n this.$l.exactConfidence = pb.mul(this.previousAlpha, this.depthWeight);\r\n this.$if(pb.greaterThan(this.exactConfidence, 1e-4), function () {\r\n this.$return(pb.mix(this.fallback, this.previousIrradiance.rgb, this.exactConfidence));\r\n });\r\n });\r\n\r\n // Repair disoccluded/off-screen history from nearby samples before falling back to\r\n // IBL: taps around the clamped reprojection, plus current UV for invalid motion.\r\n this.$l.repairCenter = this.$choice(\r\n this.motionValid,\r\n this.previousSampleUV,\r\n pb.clamp(this.uv, this.halfTexel, this.maxUV)\r\n );\r\n // Clamp travel back onto the screen: zero for interior holes, large for geometry\r\n // rotating in, where the edge texel is the same surface but unrelated irradiance.\r\n // It drives the tap radius, trading streaks for blur.\r\n this.$l.repairClampTexels = pb.div(\r\n pb.length(pb.sub(this.previousSampleUV, this.previousUV)),\r\n pb.max(pb.min(this.texelSize.x, this.texelSize.y), 1e-8)\r\n );\r\n // Widen taps with clamp travel; only while motion vectors are usable.\r\n this.$l.repairRadius = pb.mix(\r\n pb.float(SSGI_REPAIR_MIN_RADIUS_TEXELS),\r\n pb.float(SSGI_REPAIR_MAX_RADIUS_TEXELS),\r\n this.$choice(\r\n this.motionValid,\r\n pb.smoothStep(0, SSGI_REPAIR_WIDE_CLAMP_TEXELS, this.repairClampTexels),\r\n pb.float(0)\r\n )\r\n );\r\n // Wide taps straddle real depth variation: loosen the depth gate with the radius\r\n // and rely on the strict normal term.\r\n this.$l.repairDepthTolerance = pb.mul(\r\n this.scaledDepthTolerance,\r\n SSGI_DEPTH_GATE_SCALE,\r\n pb.add(1, this.repairRadius)\r\n );\r\n this.$l.repairSum = pb.vec3(0);\r\n this.$l.repairWeight = pb.float(0);\r\n // Full ring: four wide axis-aligned taps paint directional artifacts.\r\n const repairSamples = [\r\n { currentUV: false, x: 0, y: 0, kernel: 1 },\r\n { currentUV: false, x: -1, y: 0, kernel: 0.7 },\r\n { currentUV: false, x: 1, y: 0, kernel: 0.7 },\r\n { currentUV: false, x: 0, y: -1, kernel: 0.7 },\r\n { currentUV: false, x: 0, y: 1, kernel: 0.7 },\r\n { currentUV: false, x: -0.7071, y: -0.7071, kernel: 0.5 },\r\n { currentUV: false, x: 0.7071, y: -0.7071, kernel: 0.5 },\r\n { currentUV: false, x: -0.7071, y: 0.7071, kernel: 0.5 },\r\n { currentUV: false, x: 0.7071, y: 0.7071, kernel: 0.5 },\r\n { currentUV: true, x: 0, y: 0, kernel: 0.5 }\r\n ];\r\n for (let i = 0; i < repairSamples.length; i++) {\r\n const sample = repairSamples[i];\r\n const baseUV = sample.currentUV ? this.uv : this.repairCenter;\r\n this.$l[`repairUV${i}`] = pb.add(\r\n baseUV,\r\n pb.mul(this.texelSize, pb.vec2(sample.x, sample.y), this.repairRadius)\r\n );\r\n this.$l[`repairUVValid${i}`] = pb.and(\r\n pb.all(pb.greaterThanEqual(this[`repairUV${i}`], this.halfTexel)),\r\n pb.all(pb.lessThanEqual(this[`repairUV${i}`], this.maxUV))\r\n );\r\n this.$l[`repairSurface${i}`] = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_SURFACE],\r\n pb.clamp(this[`repairUV${i}`], this.halfTexel, this.maxUV),\r\n 0\r\n );\r\n this.$l[`repairNormal${i}`] = pb.normalize(\r\n pb.sub(pb.mul(this[`repairSurface${i}`].rgb, 2), pb.vec3(1))\r\n );\r\n // Compared against the reprojected depth: taps sample the previous frame's surface.\r\n this.$l[`repairDepthDelta${i}`] = pb.abs(\r\n pb.sub(this[`repairSurface${i}`].a, this.expectedPreviousDepth)\r\n );\r\n this.$l[`repairNormalDot${i}`] = pb.dot(this.normalizedCurrentNormal, this[`repairNormal${i}`]);\r\n this.$l[`repairSurfaceValid${i}`] = pb.and(\r\n this[`repairUVValid${i}`],\r\n pb.lessThanEqual(this[`repairDepthDelta${i}`], this.repairDepthTolerance),\r\n pb.greaterThanEqual(this[`repairNormalDot${i}`], this.params.y)\r\n );\r\n this.$l[`repairIrradiance${i}`] = pb.textureSampleLevel(\r\n this[EnvShIBL.UNIFORM_NAME_SSGI_IRRADIANCE],\r\n pb.clamp(this[`repairUV${i}`], this.halfTexel, this.maxUV),\r\n 0\r\n );\r\n // Same widening as the hard gate above.\r\n this.$l[`repairDepthWeight${i}`] = pb.exp(\r\n pb.neg(pb.div(this[`repairDepthDelta${i}`], this.repairDepthTolerance))\r\n );\r\n this.$l[`repairNormalWeight${i}`] = pb.pow(pb.max(0, this[`repairNormalDot${i}`]), 8);\r\n this.$l[`repairSampleWeight${i}`] = pb.mul(\r\n pb.float(this[`repairSurfaceValid${i}`]),\r\n pb.clamp(this[`repairIrradiance${i}`].a, 0, 1),\r\n this[`repairDepthWeight${i}`],\r\n this[`repairNormalWeight${i}`],\r\n // The screen-stationary tap only covers unusable motion vectors; otherwise it\r\n // leaves a stationary ghost.\r\n sample.currentUV ? pb.float(pb.not(this.motionValid)) : pb.float(1),\r\n sample.kernel\r\n );\r\n this.repairSum = pb.add(\r\n this.repairSum,\r\n pb.mul(this[`repairIrradiance${i}`].rgb, this[`repairSampleWeight${i}`])\r\n );\r\n this.repairWeight = pb.add(this.repairWeight, this[`repairSampleWeight${i}`]);\r\n }\r\n this.$if(pb.greaterThan(this.repairWeight, 1e-4), function () {\r\n this.$l.repairedIrradiance = pb.div(this.repairSum, this.repairWeight);\r\n // Repaired samples are intentionally capped below full confidence so\r\n // newly traced irradiance replaces the extrapolation on following frames.\r\n this.$l.repairConfidence = pb.mul(pb.clamp(this.repairWeight, 0, 1), 0.85);\r\n this.$return(pb.mix(this.fallback, this.repairedIrradiance, this.repairConfidence));\r\n });\r\n this.$return(this.fallback);\r\n });\r\n return scope.Z_ssgi_reprojectIrradiance(normal, iblIrradiance) as PBShaderExp;\r\n }\r\n\r\n /** Whether all textures required by the lighting reprojection are scoped. @internal */\r\n static hasSSGIHistory(ctx?: DrawContext) {\r\n return !!(\r\n ctx?.SSGI &&\r\n ctx.SSGIIrradianceHistoryTexture &&\r\n ctx.SSGISurfaceHistoryTexture &&\r\n ctx.motionVectorTexture &&\r\n ctx.linearDepthTexture\r\n );\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return !!this._radianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return !!this._sheenRadianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return !!this._irradianceSH.get() || !!this._irradianceSHFB.get();\r\n }\r\n /**\r\n * Disposes the object and releases all GPU resources\r\n * @override\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._radianceMap.dispose();\r\n this._sheenRadianceMap.dispose();\r\n this._irradianceSH.dispose();\r\n this._irradianceSHFB.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Constant ambient light\r\n * @public\r\n */\r\nexport class EnvConstantAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_CONSTANT_AMBIENT = 'zConstantAmbient';\r\n /** @internal */\r\n private readonly _ambientColor: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientColor - The ambient color\r\n */\r\n constructor(ambientColor?: Vector4) {\r\n super();\r\n this._ambientColor = ambientColor ? new Vector4(ambientColor) : new Vector4(0, 0, 0, 1);\r\n }\r\n /** The ambient color */\r\n get ambientColor(): Immutable<Vector4> {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(ambientColor: Immutable<Vector4>) {\r\n if (ambientColor) {\r\n this._ambientColor.set(ambientColor);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'constant' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT] = pb.vec4().uniform(0);\r\n this.initProbeBindings(pb, ctx);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup, ctx?: DrawContext) {\r\n bg.setValue(EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT, this._ambientColor);\r\n this.updateProbeBindGroup(bg, ctx);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n *\r\n * @remarks\r\n * A uniform environment prefilters to itself, so radiance is the ambient color. It\r\n * must be present: at grazing angles specular takes the diffuse energy, else silhouettes go black.\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n return this.getRadiance(scope, refl, roughness);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext) {\r\n return this.applyProbes(\r\n scope,\r\n normal,\r\n ctx ?? null,\r\n scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp\r\n );\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Hemispheric ambient light\r\n * @public\r\n */\r\nexport class EnvHemisphericAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_UP = 'zHemisphericAmbientUp';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_DOWN = 'zHemisphericAmbientDown';\r\n /** @internal */\r\n private readonly _ambientUp: Vector4;\r\n /** @internal */\r\n private readonly _ambientDown: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientUp - The upside ambient color\r\n * @param ambientDown - The downside ambient color\r\n */\r\n constructor(ambientUp: Vector4, ambientDown: Vector4) {\r\n super();\r\n this._ambientUp = new Vector4(ambientUp);\r\n this._ambientDown = new Vector4(ambientDown);\r\n }\r\n /** The upside ambient color */\r\n get ambientUp(): Immutable<Vector4> {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientUp.set(color);\r\n }\r\n }\r\n /** The downside ambient color */\r\n get ambientDown(): Immutable<Vector4> {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientDown.set(color);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'hemisphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN] = pb.vec4().uniform(0);\r\n this.initProbeBindings(pb, ctx);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup, ctx?: DrawContext) {\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP, this._ambientUp);\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN, this._ambientDown);\r\n this.updateProbeBindGroup(bg, ctx);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, _roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(refl.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n return this.getRadiance(scope, refl, roughness);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(normal.y, 0.5), 0.5);\r\n return this.applyProbes(\r\n scope,\r\n normal,\r\n ctx ?? null,\r\n pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp\r\n );\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Environment lighting for type `none`: no sky, only probe-volume GI over black,\r\n * since bounced scene light does not depend on the environment. Used only while\r\n * the probe volume is ready.\r\n * @internal\r\n */\r\nexport class EnvProbesOnly extends EnvironmentLighting {\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'none' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder, ctx?: DrawContext) {\r\n this.initProbeBindings(pb, ctx);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup, ctx?: DrawContext) {\r\n this.updateProbeBindGroup(bg, ctx);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp, ctx?: DrawContext) {\r\n return this.applyProbes(scope, normal, ctx ?? null, scope.$builder.vec3(0));\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n"],"names":["SSGI_DEPTH_TOLERANCE_RELATIVE","SSGI_DEPTH_GATE_SCALE","SSGI_REPAIR_WIDE_CLAMP_TEXELS","SSGI_REPAIR_MIN_RADIUS_TEXELS","SSGI_REPAIR_MAX_RADIUS_TEXELS","EnvironmentLighting","Disposable","initProbeBindings","pb","ctx","shaderKind","getProbeVolumeForDraw","declareProbeUniforms","getGlobalScope","updateProbeBindGroup","bg","applyBindGroup","getSkySpecularOcclusion","scope","normal","NoV","roughness","$builder","float","global","worldPos","$inputs","funcName","func","vec3","$l","sky","sampleProbeIrradiance","p","n","sub","camera","position","xyz","vis","mix","r","a","r2","mul","$return","clamp","add","pow","applyProbes","irradiance","light","envLightStrength","probe","env","rgb","EnvShIBL","UNIFORM_NAME_IBL_RADIANCE_MAP","UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP","UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD","UNIFORM_NAME_IBL_IRRADIANCE_SH","UNIFORM_NAME_IBL_IRRADIANCE_WINDOW","UNIFORM_NAME_SSGI_IRRADIANCE","UNIFORM_NAME_SSGI_SURFACE","UNIFORM_NAME_SSGI_CURRENT_DEPTH","UNIFORM_NAME_SSGI_MOTION","UNIFORM_NAME_SSGI_TARGET_SIZE","UNIFORM_NAME_SSGI_REPROJECTION","UNIFORM_NAME_SSGI_VIEW_TO_PREV_CLIP","UNIFORM_NAME_SSGI_INV_PROJECTION","_viewToPrevClip","Matrix4x4","radianceMap","irradianceSH","irradianceSHFB","sheenRadianceMap","_radianceMap","DRef","_sheenRadianceMap","_irradianceSH","_irradianceSHFB","_irraidanceWindow","Vector3","getType","get","tex","set","value","irradianceWindow","val","initShaderBindings","texCube","uniform","withSampler","getSamplerOptions","tex2D","formatInfo","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","getColorAttachments","format","filterable","sampleType","vec4","uniformBuffer","hasSSGIHistory","motionVectorTexture","vec2","mat4","updateBindGroup","setValue","mipLevelCount","setTexture","fetchSampler","setBuffer","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","linearDepthTexture","Vector2","renderWidth","renderHeight","Vector4","ssgiDepthReject","ssgiNormalReject","getFarPlane","getNearPlane","prevVP","prevVPMatrix","viewProjectionMatrix","multiply","worldMatrix","getInvProjectionMatrix","getRadiance","refl","shaderCaps","supportShaderTextureLod","textureSampleLevel","textureSample","getSheenRadiance","getIrradiance","that","v","y","z","x","window","c","Z_sh_Y0","Z_sh_Y1","Z_sh_Y2","Z_sh_Y3","Z_sh_Y4","Z_sh_Y5","Z_sh_Y6","Z_sh_Y7","Z_sh_Y8","iblIrradiance","Z_sh_eval","useMotionReprojection","uv","div","$builtins","fragCoord","xy","motion","previousUV","motionValid","not","any","greaterThanEqual","abs","bool","params","fallback","ibl","normalizedCurrentNormal","normalize","currentNormal","depthTolerance","max","texelSize","halfTexel","maxUV","previousUVInBounds","and","all","lessThanEqual","previousSampleUV","previousSurface","previousNormal","currentDepthSample","currentDepth","ndc","nearPlaneRay","REVERSE_Z","viewPos","w","expectedPreviousDepth","depthDelta","scaledDepthTolerance","depthWeight","exp","neg","depthValid","normalValid","dot","previousIrradiance","previousAlpha","exactHistoryValid","greaterThan","$if","exactConfidence","repairCenter","$choice","repairClampTexels","length","min","repairRadius","smoothStep","repairDepthTolerance","repairSum","repairWeight","repairSamples","currentUV","kernel","i","sample","baseUV","repairedIrradiance","repairConfidence","Z_ssgi_reprojectIrradiance","SSGI","hasRadiance","hasSheenRadiance","hasIrradiance","onDispose","dispose","EnvConstantAmbient","UNIFORM_NAME_CONSTANT_AMBIENT","ambientColor","_ambientColor","_refl","_roughness","EnvHemisphericAmbient","UNIFORM_NAME_AMBIENT_UP","UNIFORM_NAME_AMBIENT_DOWN","ambientUp","ambientDown","_ambientUp","_ambientDown","color","factor","EnvProbesOnly","_scope"],"mappings":"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"}
@@ -6,12 +6,13 @@ import { ShaderHelper } from '../material/shader/helper.js';
6
6
  import '../material/lambert.js';
7
7
  import '../material/blinn.js';
8
8
  import '../material/unlit.js';
9
+ import '../material/meshmaterial.js';
9
10
  import '../material/particle.js';
10
11
  import '../material/subsurfaceprofile.js';
11
- import '../material/skin.js';
12
+ import '../material/sssprofile.js';
13
+ import '../material/sss.js';
12
14
  import '../material/eye.js';
13
15
  import '../values.js';
14
- import '../material/meshmaterial.js';
15
16
  import '../material/hair.js';
16
17
  import '../material/hairstrand.js';
17
18
  import '../material/grassmaterial.js';
@@ -24,7 +25,6 @@ import '../material/sprite.js';
24
25
  import '../material/sprite_std.js';
25
26
  import '../utility/blueprint/material/texture.js';
26
27
 
27
- const MAX_NUM_OCTAVES = 16;
28
28
  /**
29
29
  * FBM wave generator.
30
30
  * @public
@@ -37,7 +37,7 @@ const MAX_NUM_OCTAVES = 16;
37
37
  _lacunarity;
38
38
  _gain;
39
39
  /**
40
- * Creates a new Gerstner wave generator.
40
+ * Creates a new FBM wave generator.
41
41
  */ constructor(){
42
42
  super();
43
43
  this._version = 0;
@@ -157,12 +157,7 @@ const MAX_NUM_OCTAVES = 16;
157
157
  this.$l.a = pb.float(0);
158
158
  this.$l.b = pb.float(1);
159
159
  this.$l.c = pb.float(0);
160
- this.$for(pb.int('i'), 0, pb.getDevice().type === 'webgl' ? MAX_NUM_OCTAVES : this.numOctaves, function() {
161
- if (pb.getDevice().type === 'webgl') {
162
- this.$if(pb.greaterThanEqual(this.i, this.numOctaves), function() {
163
- this.$break();
164
- });
165
- }
160
+ this.$for(pb.int('i'), 0, this.numOctaves, function() {
166
161
  this.$l.n = pb.sub(valueNoise(this, this.p), 0.5);
167
162
  this.a = pb.add(this.a, pb.mul(this.n, this.b));
168
163
  this.c = pb.add(this.c, this.b);
@@ -182,7 +177,7 @@ const MAX_NUM_OCTAVES = 16;
182
177
  outAABB.minPoint.setXYZ(minX, y - maxHeight, minZ);
183
178
  outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);
184
179
  }
185
- /** {@inheritDoc WaveGenerator.calcFragmentNormal} */ calcFragmentNormal(scope, xz) {
180
+ /** {@inheritDoc WaveGenerator.calcFragmentNormal} */ calcFragmentNormal(scope, xz, _vertexNormal) {
186
181
  const pb = scope.$builder;
187
182
  const that = this;
188
183
  pb.func('calcFragmentNormal', [
@@ -193,8 +188,8 @@ const MAX_NUM_OCTAVES = 16;
193
188
  });
194
189
  return scope.calcFragmentNormal(xz);
195
190
  }
196
- /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */ calcFragmentNormalAndFoam(scope, xz) {
197
- return scope.$builder.vec4(this.calcFragmentNormal(scope, xz), 0);
191
+ /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */ calcFragmentNormalAndFoam(scope, xz, _vertexNormal) {
192
+ return scope.$builder.vec4(this.calcFragmentNormal(scope, xz, _vertexNormal), 0);
198
193
  }
199
194
  /** {@inheritDoc WaveGenerator.setupUniforms} */ setupUniforms(scope, uniformGroup) {
200
195
  const pb = scope.$builder;