@zephyr3d/scene 0.9.25 → 0.9.27

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 (299) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  4. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  5. package/dist/animation/joint_dynamics/controller.js +7 -5
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  8. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  9. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  10. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -4
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/skeleton.js +79 -25
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  16. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  17. package/dist/animation/spring/spring_collider.js +4 -3
  18. package/dist/animation/spring/spring_collider.js.map +1 -1
  19. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  20. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  21. package/dist/animation/spring/spring_particle.js +2 -0
  22. package/dist/animation/spring/spring_particle.js.map +1 -1
  23. package/dist/animation/spring/spring_system.js +11 -3
  24. package/dist/animation/spring/spring_system.js.map +1 -1
  25. package/dist/animation/spring_modifier.js +10 -0
  26. package/dist/animation/spring_modifier.js.map +1 -1
  27. package/dist/app/engine.js +53 -43
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/scriptingsystem.js +119 -6
  30. package/dist/app/scriptingsystem.js.map +1 -1
  31. package/dist/app/scriptregistry.js +3 -2
  32. package/dist/app/scriptregistry.js.map +1 -1
  33. package/dist/asset/assetmanager.js +284 -67
  34. package/dist/asset/assetmanager.js.map +1 -1
  35. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  36. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  37. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  38. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  39. package/dist/asset/model.js +184 -69
  40. package/dist/asset/model.js.map +1 -1
  41. package/dist/camera/camera.js +268 -44
  42. package/dist/camera/camera.js.map +1 -1
  43. package/dist/camera/perspectivecamera.js +3 -1
  44. package/dist/camera/perspectivecamera.js.map +1 -1
  45. package/dist/index.d.ts +9044 -5139
  46. package/dist/index.js +17 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/material/eye.js +932 -0
  49. package/dist/material/eye.js.map +1 -0
  50. package/dist/material/hair.js +917 -0
  51. package/dist/material/hair.js.map +1 -0
  52. package/dist/material/hairstrand.js +842 -0
  53. package/dist/material/hairstrand.js.map +1 -0
  54. package/dist/material/hairstrand_data.js +162 -0
  55. package/dist/material/hairstrand_data.js.map +1 -0
  56. package/dist/material/lambert.js +5 -2
  57. package/dist/material/lambert.js.map +1 -1
  58. package/dist/material/material.js +48 -10
  59. package/dist/material/material.js.map +1 -1
  60. package/dist/material/meshmaterial.js +120 -19
  61. package/dist/material/meshmaterial.js.map +1 -1
  62. package/dist/material/mixins/albedocolor.js +1 -1
  63. package/dist/material/mixins/albedocolor.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  67. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  71. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  72. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  73. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  74. package/dist/material/mixins/lit.js +106 -19
  75. package/dist/material/mixins/lit.js.map +1 -1
  76. package/dist/material/mixins/pbr/common.js +4 -4
  77. package/dist/material/mixins/pbr/common.js.map +1 -1
  78. package/dist/material/mixins/texture.js +48 -11
  79. package/dist/material/mixins/texture.js.map +1 -1
  80. package/dist/material/mtoon.js +6 -5
  81. package/dist/material/mtoon.js.map +1 -1
  82. package/dist/material/pbrblueprint.js +146 -28
  83. package/dist/material/pbrblueprint.js.map +1 -1
  84. package/dist/material/pbrblueprint_instance.js +501 -0
  85. package/dist/material/pbrblueprint_instance.js.map +1 -0
  86. package/dist/material/pbrmr.js +15 -16
  87. package/dist/material/pbrmr.js.map +1 -1
  88. package/dist/material/shader/helper.js +734 -23
  89. package/dist/material/shader/helper.js.map +1 -1
  90. package/dist/material/shader/terrain_blend.js +55 -0
  91. package/dist/material/shader/terrain_blend.js.map +1 -0
  92. package/dist/material/skin.js +192 -32
  93. package/dist/material/skin.js.map +1 -1
  94. package/dist/material/spriteblueprint.js +16 -1
  95. package/dist/material/spriteblueprint.js.map +1 -1
  96. package/dist/material/subsurfaceprofile.js +86 -23
  97. package/dist/material/subsurfaceprofile.js.map +1 -1
  98. package/dist/material/water.js +2059 -72
  99. package/dist/material/water.js.map +1 -1
  100. package/dist/posteffect/bloom.js +167 -7
  101. package/dist/posteffect/bloom.js.map +1 -1
  102. package/dist/posteffect/coloradjust.js +2 -1
  103. package/dist/posteffect/coloradjust.js.map +1 -1
  104. package/dist/posteffect/compositor.js.map +1 -1
  105. package/dist/posteffect/fxaa.js +2 -1
  106. package/dist/posteffect/fxaa.js.map +1 -1
  107. package/dist/posteffect/grayscale.js +3 -1
  108. package/dist/posteffect/grayscale.js.map +1 -1
  109. package/dist/posteffect/motionblur.js +664 -56
  110. package/dist/posteffect/motionblur.js.map +1 -1
  111. package/dist/posteffect/posteffect.js +12 -1
  112. package/dist/posteffect/posteffect.js.map +1 -1
  113. package/dist/posteffect/sao.js +46 -44
  114. package/dist/posteffect/sao.js.map +1 -1
  115. package/dist/posteffect/skinsss.js +368 -69
  116. package/dist/posteffect/skinsss.js.map +1 -1
  117. package/dist/posteffect/ssgi.js +16 -9
  118. package/dist/posteffect/ssgi.js.map +1 -1
  119. package/dist/posteffect/ssr.js +3 -0
  120. package/dist/posteffect/ssr.js.map +1 -1
  121. package/dist/posteffect/sss.js +121 -36
  122. package/dist/posteffect/sss.js.map +1 -1
  123. package/dist/posteffect/taa.js.map +1 -1
  124. package/dist/posteffect/tonemap.js +44 -1
  125. package/dist/posteffect/tonemap.js.map +1 -1
  126. package/dist/render/abuffer_oit.js +8 -2
  127. package/dist/render/abuffer_oit.js.map +1 -1
  128. package/dist/render/clipmap.js +156 -5
  129. package/dist/render/clipmap.js.map +1 -1
  130. package/dist/render/cull_visitor.js +20 -0
  131. package/dist/render/cull_visitor.js.map +1 -1
  132. package/dist/render/depthpass.js +36 -2
  133. package/dist/render/depthpass.js.map +1 -1
  134. package/dist/render/drawable_mixin.js +26 -1
  135. package/dist/render/drawable_mixin.js.map +1 -1
  136. package/dist/render/dualdepthpeeling_oit.js +3 -2
  137. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  138. package/dist/render/envlight.js +1 -1
  139. package/dist/render/envlight.js.map +1 -1
  140. package/dist/render/fbm_wavegenerator.js +6 -3
  141. package/dist/render/fbm_wavegenerator.js.map +1 -1
  142. package/dist/render/fft_wavegenerator.js +57 -15
  143. package/dist/render/fft_wavegenerator.js.map +1 -1
  144. package/dist/render/gerstner_wavegenerator.js +130 -20
  145. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  146. package/dist/render/globalbindgroup_allocator.js +3 -0
  147. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  148. package/dist/render/hzb.js +80 -22
  149. package/dist/render/hzb.js.map +1 -1
  150. package/dist/render/lightpass.js +6 -3
  151. package/dist/render/lightpass.js.map +1 -1
  152. package/dist/render/oit.js +29 -0
  153. package/dist/render/oit.js.map +1 -0
  154. package/dist/render/render_queue.js +39 -0
  155. package/dist/render/render_queue.js.map +1 -1
  156. package/dist/render/renderer.js +4 -0
  157. package/dist/render/renderer.js.map +1 -1
  158. package/dist/render/rendergraph/blackboard.js +1 -0
  159. package/dist/render/rendergraph/blackboard.js.map +1 -1
  160. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  161. package/dist/render/rendergraph/executor.js +2 -0
  162. package/dist/render/rendergraph/executor.js.map +1 -1
  163. package/dist/render/rendergraph/forward_plus_builder.js +379 -10
  164. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  165. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  166. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  167. package/dist/render/rendergraph/history_resources.js +8 -1
  168. package/dist/render/rendergraph/history_resources.js.map +1 -1
  169. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  170. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  171. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  172. package/dist/render/rendergraph/types.js.map +1 -1
  173. package/dist/render/shadow_mask_pass.js +73 -8
  174. package/dist/render/shadow_mask_pass.js.map +1 -1
  175. package/dist/render/sky.js +166 -126
  176. package/dist/render/sky.js.map +1 -1
  177. package/dist/render/underwater.js +624 -0
  178. package/dist/render/underwater.js.map +1 -0
  179. package/dist/render/water_caustics.js +1380 -0
  180. package/dist/render/water_caustics.js.map +1 -0
  181. package/dist/render/weightedblended_oit.js +3 -2
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +8 -0
  184. package/dist/scene/basesprite.js.map +1 -1
  185. package/dist/scene/batchgroup.js +3 -0
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +4 -1
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/hair.js +963 -0
  190. package/dist/scene/hair.js.map +1 -0
  191. package/dist/scene/light.js +5 -1
  192. package/dist/scene/light.js.map +1 -1
  193. package/dist/scene/mesh.js +481 -47
  194. package/dist/scene/mesh.js.map +1 -1
  195. package/dist/scene/meshdrawable.js +6 -0
  196. package/dist/scene/meshdrawable.js.map +1 -1
  197. package/dist/scene/msdftext.js +3 -0
  198. package/dist/scene/msdftext.js.map +1 -1
  199. package/dist/scene/msdftextsprite.js +3 -0
  200. package/dist/scene/msdftextsprite.js.map +1 -1
  201. package/dist/scene/particlesys.js +6 -0
  202. package/dist/scene/particlesys.js.map +1 -1
  203. package/dist/scene/scene.js +3 -0
  204. package/dist/scene/scene.js.map +1 -1
  205. package/dist/scene/scene_node.js +6 -1
  206. package/dist/scene/scene_node.js.map +1 -1
  207. package/dist/scene/terrain-cm/grass.js +3 -0
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  214. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  215. package/dist/scene/water.js +546 -4
  216. package/dist/scene/water.js.map +1 -1
  217. package/dist/shaders/atmosphere.js.map +1 -1
  218. package/dist/shaders/diffusion.js +54 -0
  219. package/dist/shaders/diffusion.js.map +1 -0
  220. package/dist/shaders/shadow.js +33 -21
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/temporal.js +71 -33
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js +22 -19
  225. package/dist/shaders/water.js.map +1 -1
  226. package/dist/shaders/water_medium.js +56 -0
  227. package/dist/shaders/water_medium.js.map +1 -0
  228. package/dist/shadow/dom.js +546 -0
  229. package/dist/shadow/dom.js.map +1 -0
  230. package/dist/shadow/pcf_opt.js +3 -5
  231. package/dist/shadow/pcf_opt.js.map +1 -1
  232. package/dist/shadow/pcf_pd.js +1 -1
  233. package/dist/shadow/pcf_pd.js.map +1 -1
  234. package/dist/shadow/receiver_bias.js +41 -0
  235. package/dist/shadow/receiver_bias.js.map +1 -0
  236. package/dist/shadow/shader.js +20 -60
  237. package/dist/shadow/shader.js.map +1 -1
  238. package/dist/shadow/shadow_impl.js +89 -0
  239. package/dist/shadow/shadow_impl.js.map +1 -1
  240. package/dist/shadow/shadow_region.js +1 -1
  241. package/dist/shadow/shadow_region.js.map +1 -1
  242. package/dist/shadow/shadowmapper.js +150 -37
  243. package/dist/shadow/shadowmapper.js.map +1 -1
  244. package/dist/shapes/shape.js +11 -2
  245. package/dist/shapes/shape.js.map +1 -1
  246. package/dist/shapes/sphere.js +50 -9
  247. package/dist/shapes/sphere.js.map +1 -1
  248. package/dist/utility/blueprint/common/constants.js +112 -2
  249. package/dist/utility/blueprint/common/constants.js.map +1 -1
  250. package/dist/utility/blueprint/material/func.js +142 -49
  251. package/dist/utility/blueprint/material/func.js.map +1 -1
  252. package/dist/utility/blueprint/material/ir.js +490 -25
  253. package/dist/utility/blueprint/material/ir.js.map +1 -1
  254. package/dist/utility/blueprint/material/texture.js +898 -4
  255. package/dist/utility/blueprint/material/texture.js.map +1 -1
  256. package/dist/utility/serialization/manager.js +434 -101
  257. package/dist/utility/serialization/manager.js.map +1 -1
  258. package/dist/utility/serialization/scene/animation.js +401 -5
  259. package/dist/utility/serialization/scene/animation.js.map +1 -1
  260. package/dist/utility/serialization/scene/batch.js +4 -0
  261. package/dist/utility/serialization/scene/batch.js.map +1 -1
  262. package/dist/utility/serialization/scene/camera.js +186 -26
  263. package/dist/utility/serialization/scene/camera.js.map +1 -1
  264. package/dist/utility/serialization/scene/common.js +26 -5
  265. package/dist/utility/serialization/scene/common.js.map +1 -1
  266. package/dist/utility/serialization/scene/hair.js +1141 -0
  267. package/dist/utility/serialization/scene/hair.js.map +1 -0
  268. package/dist/utility/serialization/scene/light.js +84 -4
  269. package/dist/utility/serialization/scene/light.js.map +1 -1
  270. package/dist/utility/serialization/scene/material.js +1867 -166
  271. package/dist/utility/serialization/scene/material.js.map +1 -1
  272. package/dist/utility/serialization/scene/mesh.js +231 -14
  273. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  274. package/dist/utility/serialization/scene/node.js +141 -7
  275. package/dist/utility/serialization/scene/node.js.map +1 -1
  276. package/dist/utility/serialization/scene/particle.js +4 -0
  277. package/dist/utility/serialization/scene/particle.js.map +1 -1
  278. package/dist/utility/serialization/scene/primitive.js +18 -0
  279. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  280. package/dist/utility/serialization/scene/sprite.js +4 -0
  281. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  282. package/dist/utility/serialization/scene/terrain.js +4 -0
  283. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  284. package/dist/utility/serialization/scene/text.js +4 -0
  285. package/dist/utility/serialization/scene/text.js.map +1 -1
  286. package/dist/utility/serialization/scene/water.js +1105 -21
  287. package/dist/utility/serialization/scene/water.js.map +1 -1
  288. package/dist/utility/serialization/types.js.map +1 -1
  289. package/dist/utility/shprojector.js +9 -8
  290. package/dist/utility/shprojector.js.map +1 -1
  291. package/dist/values.js +49 -2
  292. package/dist/values.js.map +1 -1
  293. package/package.json +3 -3
  294. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  295. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  296. package/dist/shaders/ssgi.js +0 -63
  297. package/dist/shaders/ssgi.js.map +0 -1
  298. package/dist/shaders/ssgi_reprojection.js +0 -118
  299. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -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 !== 'webgpu' || 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":";;;;;AAiBA;;;;;;;;;;;;;AAaC,IACD,MAAMA,6BAAgC,GAAA,IAAA;AAEtC;;;;;;;;;;AAUC,IACD,MAAMC,qBAAwB,GAAA,CAAA;AAE9B;;;;;;;;;;;AAWC,IACD,MAAMC,6BAAgC,GAAA,CAAA;AAEtC;;;;;;;;;;;;;AAaC,IACD,MAAMC,6BAAgC,GAAA,CAAA;AACtC,MAAMC,6BAAgC,GAAA,EAAA;AAQtC;;;IAIO,MAAeC,mBAA4BC,SAAAA,UAAAA,CAAAA;AAgElD;AAEA;;;IAIO,MAAMC,QAAiBF,SAAAA,mBAAAA,CAAAA;qBAE5B,OAAuBG,6BAAAA,GAAgC,iBAAkB;qBAEzE,OAAuBC,mCAAAA,GAAsC,sBAAuB;qBAEpF,OAAuBC,qCAAAA,GAAwC,uBAAwB;qBAEvF,OAAuBC,8BAAAA,GAAiC,kBAAmB;qBAE3E,OAAuBC,kCAAAA,GAAqC,sBAAuB;qBAEnF,OAAuBC,4BAAAA,GAA+B,yBAA0B;qBAEhF,OAAuBC,yBAAAA,GAA4B,sBAAuB;qBAE1E,OAAuBC,+BAAAA,GAAkC,mBAAoB;qBAE7E,OAAuBC,wBAAAA,GAA2B,oBAAqB;qBAEvE,OAAuBC,6BAAAA,GAAgC,iBAAkB;qBAEzE,OAAuBC,8BAAAA,GAAiC,mBAAoB;AAC5E;;;;MAKA,OAAuBC,sCAAsC,qBAAsB;oFAEnF,OAAuBC,gCAAAA,GAAmC,oBAAqB;AAC/E,wEACA,OAAwBC,eAAkB,GAAA,IAAIC,SAAY,EAAA;qBAE1D,YAAiD;qBAEjD,iBAAsD;qBAEtD,aAAoD;qBAEpD,eAAoD;qBAEpD,iBAAmC;AACnC;;;;MAKA,WAAA,CACEC,WAAyB,EACzBC,YAA4B,EAC5BC,cAA4B,EAC5BC,gBAA8B,CAC9B;QACA,KAAK,EAAA;AACL,QAAA,IAAI,CAACC,YAAY,GAAG,IAAIC,KAAKL,WAAe,IAAA,IAAA,CAAA;AAC5C,QAAA,IAAI,CAACM,iBAAiB,GAAG,IAAID,KAAKF,gBAAoB,IAAA,IAAA,CAAA;AACtD,QAAA,IAAI,CAACI,aAAa,GAAG,IAAIF,KAAKJ,YAAgB,IAAA,IAAA,CAAA;AAC9C,QAAA,IAAI,CAACO,eAAe,GAAG,IAAIH,KAAKH,cAAkB,IAAA,IAAA,CAAA;QAClD,IAAI,CAACO,iBAAiB,GAAG,IAAIC,OAAAA,EAAAA;AAC/B;AACA;;;AAGC,MACDC,OAAU,GAAA;QACR,OAAO,KAAA;AACT;4BAEA,IAAIX,WAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAACI,YAAY,CAACQ,GAAG,EAAA;AAC9B;IACA,IAAIZ,WAAAA,CAAYa,GAAG,EAAE;AACnB,QAAA,IAAI,CAACT,YAAY,CAACU,GAAG,CAACD,GAAAA,CAAAA;AACxB;mDAEA,IAAIV,gBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAACG,iBAAiB,CAACM,GAAG,EAAA;AACnC;IACA,IAAIT,gBAAAA,CAAiBU,GAAG,EAAE;AACxB,QAAA,IAAI,CAACP,iBAAiB,CAACQ,GAAG,CAACD,GAAAA,CAAAA;AAC7B;0CAEA,IAAIZ,YAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAACM,aAAa,CAACK,GAAG,EAAA;AAC/B;IACA,IAAIX,YAAAA,CAAac,KAAK,EAAE;AACtB,QAAA,IAAI,CAACR,aAAa,CAACO,GAAG,CAACC,KAAAA,CAAAA;AACzB;0CAEA,IAAIb,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAACM,eAAe,CAACI,GAAG,EAAA;AACjC;IACA,IAAIV,cAAAA,CAAea,KAAK,EAAE;AACxB,QAAA,IAAI,CAACP,eAAe,CAACM,GAAG,CAACC,KAAAA,CAAAA;AAC3B;oCAEA,IAAIC,gBAAmB,GAAA;QACrB,OAAO,IAAI,CAACP,iBAAiB;AAC/B;IACA,IAAIO,gBAAAA,CAAiBC,GAAG,EAAE;QACxB,IAAI,CAACR,iBAAiB,GAAGQ,GAAAA;AAC3B;AACA;;;AAGC,MACDC,kBAAmBC,CAAAA,EAAkB,EAAEC,GAAiB,EAAE;QACxD,IAAID,EAAAA,CAAGE,UAAU,KAAK,UAAY,EAAA;YAChC,IAAI,IAAI,CAACrB,WAAW,EAAE;;AAEpBmB,gBAAAA,EAAAA,CAAGG,cAAc,EAAE,CAACtC,QAAAA,CAASC,6BAA6B,CAAC,GAAGkC,EAC3DI,CAAAA,OAAO,GACPC,OAAO,CAAC,CACRC,CAAAA,CAAAA,WAAW,CAACC,iBAAkB,CAAA,cAAA,CAAA,CAAA;gBACjCP,EAAGG,CAAAA,cAAc,EAAE,CAACtC,QAASG,CAAAA,qCAAqC,CAAC,GAAGgC,EAAGQ,CAAAA,KAAK,EAAGH,CAAAA,OAAO,CAAC,CAAA,CAAA;AAC3F;YACA,IAAI,IAAI,CAACrB,gBAAgB,EAAE;AACzBgB,gBAAAA,EAAAA,CAAGG,cAAc,EAAE,CAACtC,QAAAA,CAASE,mCAAmC,CAAC,GAAGiC,EACjEI,CAAAA,OAAO,GACPC,OAAO,CAAC,CACRC,CAAAA,CAAAA,WAAW,CAACC,iBAAkB,CAAA,cAAA,CAAA,CAAA;AACnC;YACA,IAAI,IAAI,CAACxB,cAAc,EAAE;gBACvB,MAAMW,GAAAA,GAAMM,GAAGS,KAAK,EAAA;AACpB,gBAAA,MAAMC,aAAaC,SAChBC,EAAAA,CAAAA,aAAa,EACbC,CAAAA,WAAW,CAACC,oBAAoB,CAAC,IAAI,CAAC/B,cAAc,CAACgC,mBAAmB,EAAE,CAAC,CAAA,CAAE,CAACC,MAAM,CAAA;AACvF,gBAAA,IAAIN,UAAc,IAAA,CAACA,UAAWO,CAAAA,UAAU,EAAE;AACxCvB,oBAAAA,GAAAA,CAAIwB,UAAU,CAAC,oBAAA,CAAA;AACjB;;gBAEAxB,GAAIY,CAAAA,WAAW,CAACC,iBAAkB,CAAA,qBAAA,CAAA,CAAA;gBAClCP,EAAGG,CAAAA,cAAc,EAAE,CAACtC,QAAAA,CAASI,8BAA8B,CAAC,GAAGyB,GAAIW,CAAAA,OAAO,CAAC,CAAA,CAAA;gBAC3EL,EAAGG,CAAAA,cAAc,EAAE,CAACtC,QAASK,CAAAA,kCAAkC,CAAC,GAAG8B,EAAGmB,CAAAA,IAAI,EAAGd,CAAAA,OAAO,CAAC,CAAA,CAAA;AACvF,aAAA,MAAO,IAAI,IAAI,CAACvB,YAAY,EAAE;AAC5BkB,gBAAAA,EAAAA,CAAGG,cAAc,EAAE,CAACtC,QAAAA,CAASI,8BAA8B,CAAC,GAAG+B,EAAAA,CAAGoB,IAAI,CAAC,CAAE,CAAA,EAAA,CAAGC,aAAa,CAAC,CAAA,CAAA;gBAC1FrB,EAAGG,CAAAA,cAAc,EAAE,CAACtC,QAASK,CAAAA,kCAAkC,CAAC,GAAG8B,EAAGmB,CAAAA,IAAI,EAAGd,CAAAA,OAAO,CAAC,CAAA,CAAA;AACvF;YACA,IAAIxC,QAAAA,CAASyD,cAAc,CAACrB,GAAM,CAAA,EAAA;AAChC,gBAAA,MAAMsB,oBACJvB,EAAGW,CAAAA,SAAS,GAAGa,IAAI,KAAK,UAAU,qBAAwB,GAAA,oBAAA;AAC5DxB,gBAAAA,EAAAA,CAAGG,cAAc,EAAE,CAACtC,QAAAA,CAASM,4BAA4B,CAAC,GAAG6B,EAC1DS,CAAAA,KAAK,GACLJ,OAAO,CAAC,CACRC,CAAAA,CAAAA,WAAW,CAACC,iBAAkBgB,CAAAA,iBAAAA,CAAAA,CAAAA;AACjCvB,gBAAAA,EAAAA,CAAGG,cAAc,EAAE,CAACtC,QAAAA,CAASO,yBAAyB,CAAC,GAAG4B,EACvDS,CAAAA,KAAK,GACLJ,OAAO,CAAC,CACRC,CAAAA,CAAAA,WAAW,CAACC,iBAAkB,CAAA,qBAAA,CAAA,CAAA;AACjCP,gBAAAA,EAAAA,CAAGG,cAAc,EAAE,CAACtC,QAAAA,CAASQ,+BAA+B,CAAC,GAAG2B,EAC7DS,CAAAA,KAAK,GACLJ,OAAO,CAAC,CACRC,CAAAA,CAAAA,WAAW,CAACC,iBAAkB,CAAA,qBAAA,CAAA,CAAA;AACjC,gBAAA,IAAIN,KAAKwB,mBAAqB,EAAA;AAC5BzB,oBAAAA,EAAAA,CAAGG,cAAc,EAAE,CAACtC,QAAAA,CAASS,wBAAwB,CAAC,GAAG0B,EACtDS,CAAAA,KAAK,GACLJ,OAAO,CAAC,CACRC,CAAAA,CAAAA,WAAW,CAACC,iBAAkB,CAAA,qBAAA,CAAA,CAAA;AACnC;gBACAP,EAAGG,CAAAA,cAAc,EAAE,CAACtC,QAASU,CAAAA,6BAA6B,CAAC,GAAGyB,EAAG0B,CAAAA,IAAI,EAAGrB,CAAAA,OAAO,CAAC,CAAA,CAAA;gBAChFL,EAAGG,CAAAA,cAAc,EAAE,CAACtC,QAASW,CAAAA,8BAA8B,CAAC,GAAGwB,EAAGoB,CAAAA,IAAI,EAAGf,CAAAA,OAAO,CAAC,CAAA,CAAA;gBACjFL,EAAGG,CAAAA,cAAc,EAAE,CAACtC,QAASY,CAAAA,mCAAmC,CAAC,GAAGuB,EAAG2B,CAAAA,IAAI,EAAGtB,CAAAA,OAAO,CAAC,CAAA,CAAA;gBACtFL,EAAGG,CAAAA,cAAc,EAAE,CAACtC,QAASa,CAAAA,gCAAgC,CAAC,GAAGsB,EAAG2B,CAAAA,IAAI,EAAGtB,CAAAA,OAAO,CAAC,CAAA,CAAA;AACrF;AACF;AACF;AACA;;;AAGC,MACDuB,eAAgBC,CAAAA,EAAa,EAAE5B,GAAiB,EAAE;QAChD,IAAI,IAAI,CAACpB,WAAW,EAAE;YACpBgD,EAAGC,CAAAA,QAAQ,CAACjE,QAAAA,CAASG,qCAAqC,EAAE,IAAI,CAACa,WAAW,CAACkD,aAAa,GAAG,CAAA,CAAA;AAC7FF,YAAAA,EAAAA,CAAGG,UAAU,CAACnE,QAAAA,CAASC,6BAA6B,EAAE,IAAI,CAACe,WAAW,CAAA;AACxE;QACA,IAAI,IAAI,CAACG,gBAAgB,EAAE;AACzB6C,YAAAA,EAAAA,CAAGG,UAAU,CAACnE,QAAAA,CAASE,mCAAmC,EAAE,IAAI,CAACiB,gBAAgB,CAAA;AACnF;QACA,IAAI,IAAI,CAACD,cAAc,EAAE;AACvB8C,YAAAA,EAAAA,CAAGG,UAAU,CACXnE,QAASI,CAAAA,8BAA8B,EACvC,IAAI,CAACc,cAAc,CAACgC,mBAAmB,EAAE,CAAC,CAAA,CAAE,EAC5CkB,YAAa,CAAA,qBAAA,CAAA,CAAA;AAEfJ,YAAAA,EAAAA,CAAGC,QAAQ,CAACjE,QAAAA,CAASK,kCAAkC,EAAE,IAAI,CAAC2B,gBAAgB,CAAA;AAChF,SAAA,MAAO,IAAI,IAAI,CAACf,YAAY,EAAE;AAC5B+C,YAAAA,EAAAA,CAAGK,SAAS,CAACrE,QAAAA,CAASI,8BAA8B,EAAE,IAAI,CAACa,YAAY,CAAA;AACvE+C,YAAAA,EAAAA,CAAGC,QAAQ,CAACjE,QAAAA,CAASK,kCAAkC,EAAE,IAAI,CAAC2B,gBAAgB,CAAA;AAChF;QACA,IAAIhC,QAAAA,CAASyD,cAAc,CAACrB,GAAM,CAAA,EAAA;AAChC4B,YAAAA,EAAAA,CAAGG,UAAU,CACXnE,QAASM,CAAAA,4BAA4B,EACrC8B,GAAKkC,CAAAA,4BAA4B,EACjCF,YAAAA,CAAahC,IAAKmC,MAAM,CAACZ,IAAI,KAAK,UAAU,qBAAwB,GAAA,oBAAA,CAAA,CAAA;YAEtEK,EAAGG,CAAAA,UAAU,CACXnE,QAASO,CAAAA,yBAAyB,EAClC6B,GAAKoC,CAAAA,yBAAyB,EAC9BJ,YAAa,CAAA,qBAAA,CAAA,CAAA;YAEfJ,EAAGG,CAAAA,UAAU,CACXnE,QAASQ,CAAAA,+BAA+B,EACxC4B,GAAKqC,CAAAA,kBAAkB,EACvBL,YAAa,CAAA,qBAAA,CAAA,CAAA;YAEf,IAAIhC,GAAAA,CAAKwB,mBAAmB,EAAE;gBAC5BI,EAAGG,CAAAA,UAAU,CACXnE,QAASS,CAAAA,wBAAwB,EACjC2B,GAAKwB,CAAAA,mBAAmB,EACxBQ,YAAa,CAAA,qBAAA,CAAA,CAAA;AAEjB;YACAJ,EAAGC,CAAAA,QAAQ,CAACjE,QAAAA,CAASU,6BAA6B,EAAE,IAAIgE,OAAAA,CAAQtC,GAAKuC,CAAAA,WAAW,EAAEvC,GAAAA,CAAKwC,YAAY,CAAA,CAAA;YACnGZ,EAAGC,CAAAA,QAAQ,CACTjE,QAAAA,CAASW,8BAA8B,EACvC,IAAIkE,OACFzC,CAAAA,GAAAA,CAAK0C,MAAM,CAACC,eAAe,EAC3B3C,IAAK0C,MAAM,CAACE,gBAAgB,EAC5B5C,GAAK0C,CAAAA,MAAM,CAACG,WAAW,EACvB7C,EAAAA,GAAAA,CAAK0C,MAAM,CAACI,YAAY,EAAA,CAAA,CAAA;;;;;YAO5B,MAAMC,MAAAA,GAAS/C,IAAK0C,MAAM,CAACM,YAAY,IAAIhD,GAAAA,CAAK0C,MAAM,CAACO,oBAAoB;YAC3EtE,SAAUuE,CAAAA,QAAQ,CAACH,MAAqB/C,EAAAA,GAAAA,CAAK0C,MAAM,CAACS,WAAW,EAAevF,QAAAA,CAASc,eAAe,CAAA;AACtGkD,YAAAA,EAAAA,CAAGC,QAAQ,CAACjE,QAAAA,CAASY,mCAAmC,EAAEZ,SAASc,eAAe,CAAA;YAClFkD,EAAGC,CAAAA,QAAQ,CAACjE,QAASa,CAAAA,gCAAgC,EAAEuB,GAAK0C,CAAAA,MAAM,CAACU,sBAAsB,EAAA,CAAA;AAC3F;AACF;AACA;;;AAGC,MACDC,YAAYC,KAA4B,EAAEC,IAAiB,EAAEC,SAAsB,EAAE;QACnF,MAAMzD,EAAAA,GAAKuD,MAAMG,QAAQ;AACzB,QAAA,OAAO/C,YAAYC,aAAa,EAAA,CAAG+C,UAAU,CAACC,uBAAuB,GAChE5D,EAAAA,CAAG6D,kBAAkB,CACpBN,KAAK,CAAC1F,QAAAA,CAASC,6BAA6B,CAAC,EAC7C0F,MACAxD,EAAG8D,CAAAA,GAAG,CAACL,SAAAA,EAAWF,KAAK,CAAC1F,QAAAA,CAASG,qCAAqC,CAAC,CAAA,CAAA,CACvE+F,GAAG,GACJ/D,EAAAA,CAAGgE,aAAa,CAACT,KAAK,CAAC1F,QAAAA,CAASC,6BAA6B,CAAC,EAAE0F,MAAMO,GAAG;AAChF;AACA;;;AAGC,MACDE,iBAAiBV,KAA4B,EAAEC,IAAiB,EAAEC,SAAsB,EAAE;QACxF,MAAMzD,EAAAA,GAAKuD,MAAMG,QAAQ;AACzB,QAAA,OAAO/C,YAAYC,aAAa,EAAA,CAAG+C,UAAU,CAACC,uBAAuB,GAChE5D,EAAAA,CAAG6D,kBAAkB,CACpBN,KAAK,CAAC1F,QAAAA,CAASE,mCAAmC,CAAC,EACnDyF,MACAxD,EAAG8D,CAAAA,GAAG,CAACL,SAAAA,EAAWF,KAAK,CAAC1F,QAAAA,CAASG,qCAAqC,CAAC,CAAA,CAAA,CACvE+F,GAAG,GACJ/D,EAAAA,CAAGgE,aAAa,CAACT,KAAK,CAAC1F,QAAAA,CAASE,mCAAmC,CAAC,EAAEyF,MAAMO,GAAG;AACtF;AACA;;;AAGC,MACDG,cAAcX,KAA4B,EAAEY,MAAmB,EAAElE,GAAiB,EAAE;QAClF,MAAMD,EAAAA,GAAKuD,MAAMG,QAAQ;AACzB,QAAA,MAAMU,OAAO,IAAI;QACjBpE,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;YACjC,IAAI,CAACmD,OAAO,CAAC,YAAA,CAAA;AACf,SAAA,CAAA;QACAtE,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;AACjC,YAAA,IAAI,CAACmD,OAAO,CAACtE,EAAAA,CAAG8D,GAAG,CAAC,IAAI,CAACS,CAAC,CAACC,CAAC,EAAE,aAAC,CAAA,CAAA;AACjC,SAAA,CAAA;QACAxE,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;YACjC,IAAI,CAACmD,OAAO,CAACtE,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACS,CAAC,CAACE,CAAC,EAAE,YAAA,CAAA,CAAA;AAChC,SAAA,CAAA;QACAzE,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;AACjC,YAAA,IAAI,CAACmD,OAAO,CAACtE,EAAAA,CAAG8D,GAAG,CAAC,IAAI,CAACS,CAAC,CAACG,CAAC,EAAE,aAAC,CAAA,CAAA;AACjC,SAAA,CAAA;QACA1E,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;AACjC,YAAA,IAAI,CAACmD,OAAO,CAACtE,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACS,CAAC,CAACG,CAAC,EAAE,IAAI,CAACH,CAAC,CAACC,CAAC,EAAE,YAAA,CAAA,CAAA;AAC1C,SAAA,CAAA;QACAxE,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;AACjC,YAAA,IAAI,CAACmD,OAAO,CAACtE,GAAG8D,GAAG,CAAC,IAAI,CAACS,CAAC,CAACC,CAAC,EAAE,IAAI,CAACD,CAAC,CAACE,CAAC,EAAE,aAAC,CAAA,CAAA;AAC3C,SAAA,CAAA;QACAzE,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;YACjC,IAAI,CAACmD,OAAO,CAACtE,EAAG8D,CAAAA,GAAG,CAAC9D,EAAG2E,CAAAA,GAAG,CAAC3E,EAAAA,CAAG8D,GAAG,CAAC,IAAI,CAACS,CAAC,CAACE,CAAC,EAAE,IAAI,CAACF,CAAC,CAACE,CAAC,EAAE,CAAA,CAAA,EAAI,CAAI,CAAA,EAAA,YAAA,CAAA,CAAA;AAChE,SAAA,CAAA;QACAzE,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;AACjC,YAAA,IAAI,CAACmD,OAAO,CAACtE,GAAG8D,GAAG,CAAC,IAAI,CAACS,CAAC,CAACG,CAAC,EAAE,IAAI,CAACH,CAAC,CAACE,CAAC,EAAE,aAAC,CAAA,CAAA;AAC3C,SAAA,CAAA;QACAzE,EAAGqE,CAAAA,IAAI,CAAC,SAAW,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;AACjC,YAAA,IAAI,CAACmD,OAAO,CAACtE,EAAG8D,CAAAA,GAAG,CAAC9D,EAAG2E,CAAAA,GAAG,CAAC3E,EAAAA,CAAG8D,GAAG,CAAC,IAAI,CAACS,CAAC,CAACG,CAAC,EAAE,IAAI,CAACH,CAAC,CAACG,CAAC,CAAA,EAAG1E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACS,CAAC,CAACC,CAAC,EAAE,IAAI,CAACD,CAAC,CAACC,CAAC,CAAI,CAAA,EAAA,YAAA,CAAA,CAAA;AACtF,SAAA,CAAA;QACAxE,EAAGqE,CAAAA,IAAI,CAAC,WAAa,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,GAAA;SAAK,EAAE,WAAA;YACnC,IAAI,CAACyD,EAAE,CAACC,MAAM,GAAG,IAAI,CAAChH,QAASK,CAAAA,kCAAkC,CAAC;YAClE,IAAIkG,IAAAA,CAAKrF,cAAc,EAAE;AACvB,gBAAA,IAAI,CAAC6F,EAAE,CAACE,CAAC,GAAG9E,GAAG8D,GAAG,CAChB9D,EAAG6D,CAAAA,kBAAkB,CAAC,IAAI,CAAChG,SAASI,8BAA8B,CAAC,EAAE+B,EAAG0B,CAAAA,IAAI,CAAC,GAAA,GAAM,GAAG,GAAM,GAAA,CAAA,CAAA,EAAI,GAC7FqC,GAAG,EACN,IAAI,CAACgB,OAAO,CAAC,IAAI,CAACR,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACH,CAAC,CAAA;gBAEf,IAAI,CAACI,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,GAAG8D,GAAG,CACJ9D,GAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAAAA,CAASI,8BAA8B,CAAC,EAAE+B,GAAG0B,IAAI,CAAC,MAAM,CAAG,EAAA,GAAA,GAAM,IAAI,CAC7FqC,CAAAA,CAAAA,GAAG,EACN,IAAI,CAACkB,OAAO,CAAC,IAAI,CAACV,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACL,CAAC,CAAA,CAAA;gBAGjB,IAAI,CAACM,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,GAAG8D,GAAG,CACJ9D,GAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAAAA,CAASI,8BAA8B,CAAC,EAAE+B,GAAG0B,IAAI,CAAC,MAAM,CAAG,EAAA,GAAA,GAAM,IAAI,CAC7FqC,CAAAA,CAAAA,GAAG,EACN,IAAI,CAACmB,OAAO,CAAC,IAAI,CAACX,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACL,CAAC,CAAA,CAAA;gBAGjB,IAAI,CAACM,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,GAAG8D,GAAG,CACJ9D,GAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAAAA,CAASI,8BAA8B,CAAC,EAAE+B,GAAG0B,IAAI,CAAC,MAAM,CAAG,EAAA,GAAA,GAAM,IAAI,CAC7FqC,CAAAA,CAAAA,GAAG,EACN,IAAI,CAACoB,OAAO,CAAC,IAAI,CAACZ,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACL,CAAC,CAAA,CAAA;gBAGjB,IAAI,CAACM,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,GAAG8D,GAAG,CACJ9D,GAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAAAA,CAASI,8BAA8B,CAAC,EAAE+B,GAAG0B,IAAI,CAAC,MAAM,CAAG,EAAA,GAAA,GAAM,IAAI,CAC7FqC,CAAAA,CAAAA,GAAG,EACN,IAAI,CAACqB,OAAO,CAAC,IAAI,CAACb,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;gBAGjB,IAAI,CAACK,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,GAAG8D,GAAG,CACJ9D,GAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAAAA,CAASI,8BAA8B,CAAC,EAAE+B,GAAG0B,IAAI,CAAC,MAAM,CAAG,EAAA,GAAA,GAAM,IAAI,CAC7FqC,CAAAA,CAAAA,GAAG,EACN,IAAI,CAACsB,OAAO,CAAC,IAAI,CAACd,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;gBAGjB,IAAI,CAACK,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,GAAG8D,GAAG,CACJ9D,GAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAAAA,CAASI,8BAA8B,CAAC,EAAE+B,GAAG0B,IAAI,CAAC,MAAM,CAAG,EAAA,GAAA,GAAM,IAAI,CAC7FqC,CAAAA,CAAAA,GAAG,EACN,IAAI,CAACuB,OAAO,CAAC,IAAI,CAACf,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;gBAGjB,IAAI,CAACK,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,GAAG8D,GAAG,CACJ9D,GAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAAAA,CAASI,8BAA8B,CAAC,EAAE+B,GAAG0B,IAAI,CAAC,MAAM,CAAG,EAAA,GAAA,GAAM,IAAI,CAC7FqC,CAAAA,CAAAA,GAAG,EACN,IAAI,CAACwB,OAAO,CAAC,IAAI,CAAChB,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;gBAGjB,IAAI,CAACK,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,GAAG8D,GAAG,CACJ9D,GAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAAAA,CAASI,8BAA8B,CAAC,EAAE+B,GAAG0B,IAAI,CAAC,MAAM,CAAG,EAAA,GAAA,GAAM,IAAI,CAC7FqC,CAAAA,CAAAA,GAAG,EACN,IAAI,CAACyB,OAAO,CAAC,IAAI,CAACjB,CAAC,CAAA,EACnB,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;aAGZ,MAAA;AACL,gBAAA,IAAI,CAACG,EAAE,CAACE,CAAC,GAAG9E,EAAAA,CAAG8D,GAAG,CAChB,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,CAAA,CAAE,CAACwH,GAAG,EACpD,IAAI,CAACV,OAAO,CAAC,IAAI,CAACR,CAAC,CACnB,EAAA,IAAI,CAACM,MAAM,CAACH,CAAC,CAAA;AAEf,gBAAA,IAAI,CAACI,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,EAAE,CAACwH,GAAG,EAAE,IAAI,CAACR,OAAO,CAAC,IAAI,CAACV,CAAC,CAAG,EAAA,IAAI,CAACM,MAAM,CAACL,CAAC,CAAA,CAAA;AAElG,gBAAA,IAAI,CAACM,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,EAAE,CAACwH,GAAG,EAAE,IAAI,CAACP,OAAO,CAAC,IAAI,CAACX,CAAC,CAAG,EAAA,IAAI,CAACM,MAAM,CAACL,CAAC,CAAA,CAAA;AAElG,gBAAA,IAAI,CAACM,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,EAAE,CAACwH,GAAG,EAAE,IAAI,CAACN,OAAO,CAAC,IAAI,CAACZ,CAAC,CAAG,EAAA,IAAI,CAACM,MAAM,CAACL,CAAC,CAAA,CAAA;AAElG,gBAAA,IAAI,CAACM,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,EAAE,CAACwH,GAAG,EAAE,IAAI,CAACL,OAAO,CAAC,IAAI,CAACb,CAAC,CAAG,EAAA,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;AAElG,gBAAA,IAAI,CAACK,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,EAAE,CAACwH,GAAG,EAAE,IAAI,CAACJ,OAAO,CAAC,IAAI,CAACd,CAAC,CAAG,EAAA,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;AAElG,gBAAA,IAAI,CAACK,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,EAAE,CAACwH,GAAG,EAAE,IAAI,CAACH,OAAO,CAAC,IAAI,CAACf,CAAC,CAAG,EAAA,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;AAElG,gBAAA,IAAI,CAACK,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,EAAE,CAACwH,GAAG,EAAE,IAAI,CAACF,OAAO,CAAC,IAAI,CAAChB,CAAC,CAAG,EAAA,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;AAElG,gBAAA,IAAI,CAACK,CAAC,GAAG9E,EAAAA,CAAGgF,GAAG,CACb,IAAI,CAACF,CAAC,EACN9E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACjG,QAASI,CAAAA,8BAA8B,CAAC,CAAC,EAAE,CAACwH,GAAG,EAAE,IAAI,CAACD,OAAO,CAAC,IAAI,CAACjB,CAAC,CAAG,EAAA,IAAI,CAACM,MAAM,CAACJ,CAAC,CAAA,CAAA;AAEpG;AACA,YAAA,IAAI,CAACH,OAAO,CAAC,IAAI,CAACQ,CAAC,CAAA;AACrB,SAAA,CAAA;AACA,QAAA,MAAMY,aAAgB1F,GAAAA,EAAAA,CAAGG,cAAc,EAAA,CAAGwF,SAAS,CAACxB,MAAAA,CAAAA;AACpD,QAAA,IAAI,CAACtG,QAAAA,CAASyD,cAAc,CAACrB,GAAM,CAAA,EAAA;YACjC,OAAOyF,aAAAA;AACT;QACA,MAAME,qBAAAA,GAAwB,CAAC,CAAC3F,GAAKwB,EAAAA,mBAAAA;QACrCzB,EAAGqE,CAAAA,IAAI,CAAC,4BAA8B,EAAA;AAACrE,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,eAAA,CAAA;AAAkBnB,YAAAA,EAAAA,CAAGmB,IAAI,CAAC,KAAA;SAAO,EAAE,WAAA;YAChF,IAAI,CAACyD,EAAE,CAACiB,EAAE,GAAG7F,EAAG8F,CAAAA,GAAG,CAAC9F,EAAAA,CAAG0B,IAAI,CAAC,IAAI,CAACqE,SAAS,CAACC,SAAS,CAACC,EAAE,GAAG,IAAI,CAACpI,QAASU,CAAAA,6BAA6B,CAAC,CAAA;AACtG,YAAA,IAAIqH,qBAAuB,EAAA;AACzB,gBAAA,IAAI,CAAChB,EAAE,CAACsB,MAAM,GAAGlG,EAAAA,CAAG6D,kBAAkB,CAAC,IAAI,CAAChG,QAASS,CAAAA,wBAAwB,CAAC,EAAE,IAAI,CAACuH,EAAE,EAAE,GAAGI,EAAE;AAC9F,gBAAA,IAAI,CAACrB,EAAE,CAACuB,UAAU,GAAGnG,EAAG2E,CAAAA,GAAG,CAAC,IAAI,CAACkB,EAAE,EAAE,IAAI,CAACK,MAAM,CAAA;gBAChD,IAAI,CAACtB,EAAE,CAACwB,WAAW,GAAGpG,EAAGqG,CAAAA,GAAG,CAACrG,EAAAA,CAAGsG,GAAG,CAACtG,GAAGuG,gBAAgB,CAACvG,EAAGwG,CAAAA,GAAG,CAAC,IAAI,CAACN,MAAM,CAAA,EAAGlG,EAAG0B,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA,CAAA,CAAA;aAChF,MAAA;AACL,gBAAA,IAAI,CAACkD,EAAE,CAACuB,UAAU,GAAG,IAAI,CAACN,EAAE;AAC5B,gBAAA,IAAI,CAACjB,EAAE,CAACwB,WAAW,GAAGpG,EAAAA,CAAGyG,IAAI,CAAC,IAAA,CAAA;AAChC;YACA,IAAI,CAAC7B,EAAE,CAAC8B,MAAM,GAAG,IAAI,CAAC7I,QAASW,CAAAA,8BAA8B,CAAC;AAC9D,YAAA,IAAI,CAACoG,EAAE,CAAC+B,QAAQ,GAAG3G,GAAG8D,GAAG,CAAC,IAAI,CAAC8C,GAAG,EAAE,IAAI,CAACC,KAAK,CAACC,gBAAgB,CAAA;YAC/D,IAAI,CAAClC,EAAE,CAACmC,uBAAuB,GAAG/G,GAAGgH,SAAS,CAAC,IAAI,CAACC,aAAa,CAAA;AACjE,YAAA,IAAI,CAACrC,EAAE,CAACsC,cAAc,GAAGlH,EAAAA,CAAGmH,GAAG,CAAC,IAAI,CAACT,MAAM,CAAChC,CAAC,EAAE,IAAA,CAAA;AAC/C,YAAA,IAAI,CAACE,EAAE,CAACwC,SAAS,GAAGpH,GAAG8F,GAAG,CAAC9F,EAAG0B,CAAAA,IAAI,CAAC,CAAI,CAAA,EAAA,IAAI,CAAC7D,QAAAA,CAASU,6BAA6B,CAAC,CAAA;YACnF,IAAI,CAACqG,EAAE,CAACyC,SAAS,GAAGrH,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACsD,SAAS,EAAE,GAAA,CAAA;AAC3C,YAAA,IAAI,CAACxC,EAAE,CAAC0C,KAAK,GAAGtH,EAAG2E,CAAAA,GAAG,CAAC3E,EAAAA,CAAG0B,IAAI,CAAC,CAAI,CAAA,EAAA,IAAI,CAAC2F,SAAS,CAAA;AACjD,YAAA,IAAI,CAACzC,EAAE,CAAC2C,kBAAkB,GAAGvH,GAAGwH,GAAG,CACjC,IAAI,CAACpB,WAAW,EAChBpG,EAAAA,CAAGyH,GAAG,CAACzH,EAAAA,CAAGuG,gBAAgB,CAAC,IAAI,CAACJ,UAAU,EAAEnG,EAAG0B,CAAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,EACpD1B,GAAGyH,GAAG,CAACzH,EAAG0H,CAAAA,aAAa,CAAC,IAAI,CAACvB,UAAU,EAAEnG,EAAAA,CAAG0B,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA;AAEnD,YAAA,IAAI,CAACkD,EAAE,CAAC+C,gBAAgB,GAAG3H,EAAAA,CAAG4H,KAAK,CAAC,IAAI,CAACzB,UAAU,EAAE,IAAI,CAACkB,SAAS,EAAE,IAAI,CAACC,KAAK,CAAA;AAC/E,YAAA,IAAI,CAAC1C,EAAE,CAACiD,eAAe,GAAG7H,GAAG6D,kBAAkB,CAC7C,IAAI,CAAChG,SAASO,yBAAyB,CAAC,EACxC,IAAI,CAACuJ,gBAAgB,EACrB,CAAA,CAAA;YAEF,IAAI,CAAC/C,EAAE,CAACkD,cAAc,GAAG9H,EAAGgH,CAAAA,SAAS,CAAChH,EAAAA,CAAG2E,GAAG,CAAC3E,GAAG8D,GAAG,CAAC,IAAI,CAAC+D,eAAe,CAAC9D,GAAG,EAAE,CAAA,CAAA,EAAI/D,EAAGmB,CAAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA;AAC1F,YAAA,IAAI,CAACyD,EAAE,CAACmD,kBAAkB,GAAG/H,GAAG6D,kBAAkB,CAChD,IAAI,CAAChG,SAASQ,+BAA+B,CAAC,EAC9C,IAAI,CAACwH,EAAE,EACP,CAAA,CAAA;AAEF,YAAA,IAAI,CAACjB,EAAE,CAACoD,YAAY,GAAGhI,EAAAA,CAAG8D,GAAG,CAC3B9D,EAAGW,CAAAA,SAAS,EAAGa,CAAAA,IAAI,KAAK,OACpByG,GAAAA,6BAAAA,CAA8B,IAAI,EAAE,IAAI,CAACF,kBAAkB,CAAA,GAC3D,IAAI,CAACA,kBAAkB,CAACG,CAAC,EAC7B,IAAI,CAACxB,MAAM,CAACjC,CAAC,CAAA;;;;;;;;;;AAWf,YAAA,IAAI,CAACG,EAAE,CAACuD,GAAG,GAAGnI,EAAAA,CAAG2E,GAAG,CAAC3E,EAAAA,CAAG8D,GAAG,CAAC,IAAI,CAAC+B,EAAE,EAAE,CAAI7F,CAAAA,EAAAA,EAAAA,CAAG0B,IAAI,CAAC,CAAA,CAAA,CAAA;YACjD,IAAI,CAACkD,EAAE,CAACwD,YAAY,GAAGpI,GAAG8D,GAAG,CAC3B,IAAI,CAACjG,QAASa,CAAAA,gCAAgC,CAAC,EAC/CsB,EAAAA,CAAGoB,IAAI,CAAC,IAAI,CAAC+G,GAAG,EAAEE,SAAAA,GAAY,CAAI,GAAA,EAAI,EAAA,CAAA,CAAA,CAAA;;;;;AAMxC,YAAA,IAAI,CAACzD,EAAE,CAAC0D,OAAO,GAAGtI,GAAG8D,GAAG,CACtB9D,EAAG8F,CAAAA,GAAG,CAAC,IAAI,CAACsC,YAAY,CAAC3C,GAAG,EAAE,IAAI,CAAC2C,YAAY,CAACG,CAAC,CACjDvI,EAAAA,EAAAA,CAAG8F,GAAG,CAAC,IAAI,CAACkC,YAAY,EAAEhI,EAAAA,CAAGmH,GAAG,CAAC,IAAI,CAACT,MAAM,CAAC6B,CAAC,EAAE,IAAA,CAAA,CAAA,CAAA;YAElD,IAAI,CAAC3D,EAAE,CAAC4D,qBAAqB,GAAGxI,EAAG8D,CAAAA,GAAG,CACpC,IAAI,CAACjG,QAAAA,CAASY,mCAAmC,CAAC,EAClDuB,GAAGoB,IAAI,CAAC,IAAI,CAACkH,OAAO,EAAE,CAAA,CAAA,CAAA,CACtBC,CAAC;AACH,YAAA,IAAI,CAAC3D,EAAE,CAAC6D,UAAU,GAAGzI,EAAAA,CAAGwG,GAAG,CAACxG,EAAAA,CAAG2E,GAAG,CAAC,IAAI,CAACkD,eAAe,CAACa,CAAC,EAAE,IAAI,CAACF,qBAAqB,CAAA,CAAA;;AAErF,YAAA,IAAI,CAAC5D,EAAE,CAAC+D,oBAAoB,GAAG3I,EAAAA,CAAGgF,GAAG,CACnC,IAAI,CAACkC,cAAc,EACnBlH,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACkE,YAAY,EAAE1K,6BAAAA,CAAAA,CAAAA;YAE5B,IAAI,CAACsH,EAAE,CAACgE,WAAW,GAAG5I,EAAG6I,CAAAA,GAAG,CAAC7I,EAAG8I,CAAAA,GAAG,CAAC9I,EAAG8F,CAAAA,GAAG,CAAC,IAAI,CAAC2C,UAAU,EAAE,IAAI,CAACE,oBAAoB,CAAA,CAAA,CAAA;AACrF,YAAA,IAAI,CAAC/D,EAAE,CAACmE,UAAU,GAAG/I,EAAAA,CAAG0H,aAAa,CACnC,IAAI,CAACe,UAAU,EACfzI,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAAC6E,oBAAoB,EAAEpL,qBAAAA,CAAAA,CAAAA;YAEpC,IAAI,CAACqH,EAAE,CAACoE,WAAW,GAAGhJ,EAAGuG,CAAAA,gBAAgB,CACvCvG,EAAAA,CAAGiJ,GAAG,CAAC,IAAI,CAAClC,uBAAuB,EAAE,IAAI,CAACe,cAAc,GACxD,IAAI,CAACpB,MAAM,CAAClC,CAAC,CAAA;AAEf,YAAA,IAAI,CAACI,EAAE,CAACsE,kBAAkB,GAAGlJ,GAAG6D,kBAAkB,CAChD,IAAI,CAAChG,SAASM,4BAA4B,CAAC,EAC3C,IAAI,CAACwJ,gBAAgB,EACrB,CAAA,CAAA;AAEF,YAAA,IAAI,CAAC/C,EAAE,CAACuE,aAAa,GAAGnJ,EAAG4H,CAAAA,KAAK,CAAC,IAAI,CAACsB,kBAAkB,CAACR,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;YAC/D,IAAI,CAAC9D,EAAE,CAACwE,iBAAiB,GAAGpJ,EAAGwH,CAAAA,GAAG,CAChC,IAAI,CAACD,kBAAkB,EACvB,IAAI,CAACwB,UAAU,EACf,IAAI,CAACC,WAAW,EAChBhJ,EAAGqJ,CAAAA,WAAW,CAAC,IAAI,CAACF,aAAa,EAAE,IAAA,CAAA,CAAA;AAErC,YAAA,IAAI,CAACG,GAAG,CAAC,IAAI,CAACF,iBAAiB,EAAE,WAAA;;;;AAI/B,gBAAA,IAAI,CAACxE,EAAE,CAAC2E,eAAe,GAAGvJ,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACqF,aAAa,EAAE,IAAI,CAACP,WAAW,CAAA;gBACrE,IAAI,CAACU,GAAG,CAACtJ,EAAGqJ,CAAAA,WAAW,CAAC,IAAI,CAACE,eAAe,EAAE,IAAO,CAAA,EAAA,WAAA;AACnD,oBAAA,IAAI,CAACjF,OAAO,CAACtE,GAAGwJ,GAAG,CAAC,IAAI,CAAC7C,QAAQ,EAAE,IAAI,CAACuC,kBAAkB,CAACnF,GAAG,EAAE,IAAI,CAACwF,eAAe,CAAA,CAAA;AACtF,iBAAA,CAAA;AACF,aAAA,CAAA;;;;;AAMA,YAAA,IAAI,CAAC3E,EAAE,CAAC6E,YAAY,GAAG,IAAI,CAACC,OAAO,CACjC,IAAI,CAACtD,WAAW,EAChB,IAAI,CAACuB,gBAAgB,EACrB3H,EAAG4H,CAAAA,KAAK,CAAC,IAAI,CAAC/B,EAAE,EAAE,IAAI,CAACwB,SAAS,EAAE,IAAI,CAACC,KAAK,CAAA,CAAA;;;;;;;;;;;AAY9C,YAAA,IAAI,CAAC1C,EAAE,CAAC+E,iBAAiB,GAAG3J,GAAG8F,GAAG,CAChC9F,EAAG4J,CAAAA,MAAM,CAAC5J,EAAG2E,CAAAA,GAAG,CAAC,IAAI,CAACgD,gBAAgB,EAAE,IAAI,CAACxB,UAAU,IACvDnG,EAAGmH,CAAAA,GAAG,CAACnH,EAAG6J,CAAAA,GAAG,CAAC,IAAI,CAACzC,SAAS,CAAC1C,CAAC,EAAE,IAAI,CAAC0C,SAAS,CAAC5C,CAAC,CAAG,EAAA,IAAA,CAAA,CAAA;;;;AAKrD,YAAA,IAAI,CAACI,EAAE,CAACkF,YAAY,GAAG9J,EAAGwJ,CAAAA,GAAG,CAC3BxJ,EAAAA,CAAGQ,KAAK,CAAC/C,6BAAAA,CAAAA,EACTuC,EAAGQ,CAAAA,KAAK,CAAC9C,6BACT,CAAA,EAAA,IAAI,CAACgM,OAAO,CACV,IAAI,CAACtD,WAAW,EAChBpG,GAAG+J,UAAU,CAAC,CAAGvM,EAAAA,6BAAAA,EAA+B,IAAI,CAACmM,iBAAiB,CACtE3J,EAAAA,EAAAA,CAAGQ,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA;;;;;AAOb,YAAA,IAAI,CAACoE,EAAE,CAACoF,oBAAoB,GAAGhK,EAAAA,CAAG8D,GAAG,CACnC,IAAI,CAAC6E,oBAAoB,EACzBpL,uBACAyC,EAAGgF,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAAC8E,YAAY,CAAA,CAAA;AAE7B,YAAA,IAAI,CAAClF,EAAE,CAACqF,SAAS,GAAGjK,EAAAA,CAAGmB,IAAI,CAAC,CAAA,CAAA;AAC5B,YAAA,IAAI,CAACyD,EAAE,CAACsF,YAAY,GAAGlK,EAAAA,CAAGQ,KAAK,CAAC,CAAA,CAAA;;;;AAIhC,YAAA,MAAM2J,aAAgB,GAAA;AACpB,gBAAA;oBAAEC,SAAW,EAAA,KAAA;oBAAO1F,CAAG,EAAA,CAAA;oBAAGF,CAAG,EAAA,CAAA;oBAAG6F,MAAQ,EAAA;AAAE,iBAAA;AAC1C,gBAAA;oBAAED,SAAW,EAAA,KAAA;AAAO1F,oBAAAA,CAAAA,EAAG,EAAC;oBAAGF,CAAG,EAAA,CAAA;oBAAG6F,MAAQ,EAAA;AAAI,iBAAA;AAC7C,gBAAA;oBAAED,SAAW,EAAA,KAAA;oBAAO1F,CAAG,EAAA,CAAA;oBAAGF,CAAG,EAAA,CAAA;oBAAG6F,MAAQ,EAAA;AAAI,iBAAA;AAC5C,gBAAA;oBAAED,SAAW,EAAA,KAAA;oBAAO1F,CAAG,EAAA,CAAA;AAAGF,oBAAAA,CAAAA,EAAG,EAAC;oBAAG6F,MAAQ,EAAA;AAAI,iBAAA;AAC7C,gBAAA;oBAAED,SAAW,EAAA,KAAA;oBAAO1F,CAAG,EAAA,CAAA;oBAAGF,CAAG,EAAA,CAAA;oBAAG6F,MAAQ,EAAA;AAAI,iBAAA;AAC5C,gBAAA;oBAAED,SAAW,EAAA,KAAA;AAAO1F,oBAAAA,CAAAA,EAAG,OAAC;AAAQF,oBAAAA,CAAAA,EAAG,OAAC;oBAAQ6F,MAAQ,EAAA;AAAI,iBAAA;AACxD,gBAAA;oBAAED,SAAW,EAAA,KAAA;oBAAO1F,CAAG,EAAA,MAAA;AAAQF,oBAAAA,CAAAA,EAAG,OAAC;oBAAQ6F,MAAQ,EAAA;AAAI,iBAAA;AACvD,gBAAA;oBAAED,SAAW,EAAA,KAAA;AAAO1F,oBAAAA,CAAAA,EAAG,OAAC;oBAAQF,CAAG,EAAA,MAAA;oBAAQ6F,MAAQ,EAAA;AAAI,iBAAA;AACvD,gBAAA;oBAAED,SAAW,EAAA,KAAA;oBAAO1F,CAAG,EAAA,MAAA;oBAAQF,CAAG,EAAA,MAAA;oBAAQ6F,MAAQ,EAAA;AAAI,iBAAA;AACtD,gBAAA;oBAAED,SAAW,EAAA,IAAA;oBAAM1F,CAAG,EAAA,CAAA;oBAAGF,CAAG,EAAA,CAAA;oBAAG6F,MAAQ,EAAA;AAAI;AAC5C,aAAA;AACD,YAAA,IAAK,IAAIC,CAAI,GAAA,CAAA,EAAGA,IAAIH,aAAcP,CAAAA,MAAM,EAAEU,CAAK,EAAA,CAAA;gBAC7C,MAAMC,MAAAA,GAASJ,aAAa,CAACG,CAAE,CAAA;gBAC/B,MAAME,MAAAA,GAASD,MAAOH,CAAAA,SAAS,GAAG,IAAI,CAACvE,EAAE,GAAG,IAAI,CAAC4D,YAAY;AAC7D,gBAAA,IAAI,CAAC7E,EAAE,CAAC,CAAC,QAAQ,EAAE0F,CAAG,CAAA,CAAA,CAAC,GAAGtK,EAAAA,CAAGgF,GAAG,CAC9BwF,QACAxK,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACsD,SAAS,EAAEpH,EAAAA,CAAG0B,IAAI,CAAC6I,MAAAA,CAAO7F,CAAC,EAAE6F,MAAO/F,CAAAA,CAAC,CAAG,EAAA,IAAI,CAACsF,YAAY,CAAA,CAAA;gBAEvE,IAAI,CAAClF,EAAE,CAAC,CAAC,aAAa,EAAE0F,CAAAA,CAAAA,CAAG,CAAC,GAAGtK,EAAAA,CAAGwH,GAAG,CACnCxH,EAAAA,CAAGyH,GAAG,CAACzH,EAAAA,CAAGuG,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE+D,GAAG,CAAC,EAAE,IAAI,CAACjD,SAAS,IAC/DrH,EAAGyH,CAAAA,GAAG,CAACzH,EAAG0H,CAAAA,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE4C,GAAG,CAAC,EAAE,IAAI,CAAChD,KAAK,CAAA,CAAA,CAAA;AAE1D,gBAAA,IAAI,CAAC1C,EAAE,CAAC,CAAC,aAAa,EAAE0F,CAAG,CAAA,CAAA,CAAC,GAAGtK,EAAAA,CAAG6D,kBAAkB,CAClD,IAAI,CAAChG,QAAAA,CAASO,yBAAyB,CAAC,EACxC4B,EAAG4H,CAAAA,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE0C,CAAG,CAAA,CAAA,CAAC,EAAE,IAAI,CAACjD,SAAS,EAAE,IAAI,CAACC,KAAK,CACzD,EAAA,CAAA,CAAA;AAEF,gBAAA,IAAI,CAAC1C,EAAE,CAAC,CAAC,YAAY,EAAE0F,CAAG,CAAA,CAAA,CAAC,GAAGtK,EAAAA,CAAGgH,SAAS,CACxChH,GAAG2E,GAAG,CAAC3E,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAEwG,CAAAA,CAAAA,CAAG,CAAC,CAACvG,GAAG,EAAE,CAAI/D,CAAAA,EAAAA,EAAAA,CAAGmB,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA;;;;gBAK3D,IAAI,CAACyD,EAAE,CAAC,CAAC,gBAAgB,EAAE0F,CAAAA,CAAAA,CAAG,CAAC,GAAGtK,EAAGwG,CAAAA,GAAG,CACtCxG,EAAAA,CAAG2E,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE2F,CAAAA,CAAAA,CAAG,CAAC,CAAC5B,CAAC,EAAE,IAAI,CAACF,qBAAqB,CAAA,CAAA;gBAEhE,IAAI,CAAC5D,EAAE,CAAC,CAAC,eAAe,EAAE0F,CAAAA,CAAAA,CAAG,CAAC,GAAGtK,EAAGiJ,CAAAA,GAAG,CAAC,IAAI,CAAClC,uBAAuB,EAAE,IAAI,CAAC,CAAC,YAAY,EAAEuD,CAAAA,CAAAA,CAAG,CAAC,CAAA;gBAC9F,IAAI,CAAC1F,EAAE,CAAC,CAAC,kBAAkB,EAAE0F,CAAAA,CAAAA,CAAG,CAAC,GAAGtK,EAAGwH,CAAAA,GAAG,CACxC,IAAI,CAAC,CAAC,aAAa,EAAE8C,CAAAA,CAAAA,CAAG,CAAC,EACzBtK,EAAAA,CAAG0H,aAAa,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE4C,GAAG,CAAC,EAAE,IAAI,CAACN,oBAAoB,CACxEhK,EAAAA,EAAAA,CAAGuG,gBAAgB,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE+D,CAAG,CAAA,CAAA,CAAC,EAAE,IAAI,CAAC5D,MAAM,CAAClC,CAAC,CAAA,CAAA;AAEhE,gBAAA,IAAI,CAACI,EAAE,CAAC,CAAC,gBAAgB,EAAE0F,CAAG,CAAA,CAAA,CAAC,GAAGtK,EAAAA,CAAG6D,kBAAkB,CACrD,IAAI,CAAChG,QAAAA,CAASM,4BAA4B,CAAC,EAC3C6B,EAAG4H,CAAAA,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE0C,CAAG,CAAA,CAAA,CAAC,EAAE,IAAI,CAACjD,SAAS,EAAE,IAAI,CAACC,KAAK,CACzD,EAAA,CAAA,CAAA;;;AAIF,gBAAA,IAAI,CAAC1C,EAAE,CAAC,CAAC,iBAAiB,EAAE0F,CAAG,CAAA,CAAA,CAAC,GAAGtK,EAAAA,CAAG6I,GAAG,CACvC7I,EAAG8I,CAAAA,GAAG,CAAC9I,EAAAA,CAAG8F,GAAG,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAEwE,CAAAA,CAAAA,CAAG,CAAC,EAAE,IAAI,CAACN,oBAAoB,CAAA,CAAA,CAAA;gBAEvE,IAAI,CAACpF,EAAE,CAAC,CAAC,kBAAkB,EAAE0F,CAAAA,CAAAA,CAAG,CAAC,GAAGtK,EAAGyK,CAAAA,GAAG,CAACzK,EAAGmH,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,CAAC,eAAe,EAAEmD,CAAG,CAAA,CAAA,CAAC,CAAG,EAAA,CAAA,CAAA;gBACnF,IAAI,CAAC1F,EAAE,CAAC,CAAC,kBAAkB,EAAE0F,CAAG,CAAA,CAAA,CAAC,GAAGtK,EAAAA,CAAG8D,GAAG,CACxC9D,GAAGQ,KAAK,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE8J,CAAAA,CAAAA,CAAG,CAAC,CAAA,EACvCtK,EAAG4H,CAAAA,KAAK,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE0C,CAAAA,CAAAA,CAAG,CAAC,CAAC5B,CAAC,EAAE,CAAA,EAAG,CAC5C,CAAA,EAAA,IAAI,CAAC,CAAC,iBAAiB,EAAE4B,CAAAA,CAAAA,CAAG,CAAC,EAC7B,IAAI,CAAC,CAAC,kBAAkB,EAAEA,CAAAA,CAAAA,CAAG,CAAC;;;;AAK9BC,gBAAAA,MAAAA,CAAOH,SAAS,GAAGpK,EAAAA,CAAGQ,KAAK,CAACR,GAAGqG,GAAG,CAAC,IAAI,CAACD,WAAW,CAAKpG,CAAAA,GAAAA,EAAAA,CAAGQ,KAAK,CAAC,CAAA,CAAA,EACjE+J,OAAOF,MAAM,CAAA;AAEf,gBAAA,IAAI,CAACJ,SAAS,GAAGjK,EAAAA,CAAGgF,GAAG,CACrB,IAAI,CAACiF,SAAS,EACdjK,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAEwG,CAAG,CAAA,CAAA,CAAC,CAACvG,GAAG,EAAE,IAAI,CAAC,CAAC,kBAAkB,EAAEuG,GAAG,CAAC,CAAA,CAAA;AAEzE,gBAAA,IAAI,CAACJ,YAAY,GAAGlK,EAAGgF,CAAAA,GAAG,CAAC,IAAI,CAACkF,YAAY,EAAE,IAAI,CAAC,CAAC,kBAAkB,EAAEI,GAAG,CAAC,CAAA;AAC9E;YACA,IAAI,CAAChB,GAAG,CAACtJ,EAAGqJ,CAAAA,WAAW,CAAC,IAAI,CAACa,YAAY,EAAE,IAAO,CAAA,EAAA,WAAA;AAChD,gBAAA,IAAI,CAACtF,EAAE,CAAC8F,kBAAkB,GAAG1K,EAAG8F,CAAAA,GAAG,CAAC,IAAI,CAACmE,SAAS,EAAE,IAAI,CAACC,YAAY,CAAA;;;AAGrE,gBAAA,IAAI,CAACtF,EAAE,CAAC+F,gBAAgB,GAAG3K,GAAG8D,GAAG,CAAC9D,EAAG4H,CAAAA,KAAK,CAAC,IAAI,CAACsC,YAAY,EAAE,GAAG,CAAI,CAAA,EAAA,IAAA,CAAA;AACrE,gBAAA,IAAI,CAAC5F,OAAO,CAACtE,EAAGwJ,CAAAA,GAAG,CAAC,IAAI,CAAC7C,QAAQ,EAAE,IAAI,CAAC+D,kBAAkB,EAAE,IAAI,CAACC,gBAAgB,CAAA,CAAA;AACnF,aAAA,CAAA;AACA,YAAA,IAAI,CAACrG,OAAO,CAAC,IAAI,CAACqC,QAAQ,CAAA;AAC5B,SAAA,CAAA;QACA,OAAOpD,KAAAA,CAAMqH,0BAA0B,CAACzG,MAAQuB,EAAAA,aAAAA,CAAAA;AAClD;AAEA,4FACA,OAAOpE,cAAerB,CAAAA,GAAiB,EAAE;QACvC,OAAO,CAAC,EACNA,GAAK4K,EAAAA,IAAAA,IACL5K,IAAIkC,4BAA4B,IAChClC,GAAIoC,CAAAA,yBAAyB,KAC5BpC,IAAImC,MAAM,CAACZ,IAAI,KAAK,QAAYvB,IAAAA,GAAAA,CAAIwB,mBAAmB,CAAD,IACvDxB,GAAIqC,CAAAA,kBAAkB,CAAD;AAEzB;AACA;;;AAGC,MACDwI,WAAc,GAAA;AACZ,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC7L,YAAY,CAACQ,GAAG,EAAA;AAChC;AACA;;;AAGC,MACDsL,gBAAmB,GAAA;AACjB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC5L,iBAAiB,CAACM,GAAG,EAAA;AACrC;AACA;;;AAGC,MACDuL,aAAgB,GAAA;AACd,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC5L,aAAa,CAACK,GAAG,EAAM,IAAA,CAAC,CAAC,IAAI,CAACJ,eAAe,CAACI,GAAG,EAAA;AACjE;AACA;;;AAGC,MACD,SAAsB,GAAA;AACpB,QAAA,KAAK,CAACwL,SAAAA,EAAAA;QACN,IAAI,CAAChM,YAAY,CAACiM,OAAO,EAAA;QACzB,IAAI,CAAC/L,iBAAiB,CAAC+L,OAAO,EAAA;QAC9B,IAAI,CAAC9L,aAAa,CAAC8L,OAAO,EAAA;QAC1B,IAAI,CAAC7L,eAAe,CAAC6L,OAAO,EAAA;AAC9B;AACF;AAEA;;;IAIO,MAAMC,kBAA2BxN,SAAAA,mBAAAA,CAAAA;qBAEtC,OAAuByN,6BAAAA,GAAgC,kBAAmB;qBAE1E,aAAwC;AACxC;;;MAIA,WAAA,CAAYC,YAAsB,CAAE;QAClC,KAAK,EAAA;QACL,IAAI,CAACC,aAAa,GAAGD,YAAe,GAAA,IAAI3I,OAAQ2I,CAAAA,YAAAA,CAAAA,GAAgB,IAAI3I,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;AACvF;6BAEA,IAAI2I,YAAmC,GAAA;QACrC,OAAO,IAAI,CAACC,aAAa;AAC3B;IACA,IAAID,YAAAA,CAAaA,YAAgC,EAAE;AACjD,QAAA,IAAIA,YAAc,EAAA;AAChB,YAAA,IAAI,CAACC,aAAa,CAAC3L,GAAG,CAAC0L,YAAAA,CAAAA;AACzB;AACF;AACA;;;AAGC,MACD7L,OAAU,GAAA;QACR,OAAO,UAAA;AACT;AACA;;;MAIAO,kBAAAA,CAAmBC,EAAkB,EAAE;QACrC,IAAIA,EAAAA,CAAGE,UAAU,KAAK,UAAY,EAAA;YAChCF,EAAGG,CAAAA,cAAc,EAAE,CAACgL,kBAAmBC,CAAAA,6BAA6B,CAAC,GAAGpL,EAAGoB,CAAAA,IAAI,EAAGf,CAAAA,OAAO,CAAC,CAAA,CAAA;AAC5F;AACF;AACA;;;MAIAuB,eAAAA,CAAgBC,EAAa,EAAE;AAC7BA,QAAAA,EAAAA,CAAGC,QAAQ,CAACqJ,kBAAAA,CAAmBC,6BAA6B,EAAE,IAAI,CAACE,aAAa,CAAA;AAClF;AACA;;;AAGC,MACDhI,YAAYiI,MAA6B,EAAEC,KAAkB,EAAEC,UAAuB,EAAE;QACtF,OAAO,IAAA;AACT;AACA;;;AAGC,MACDxH,iBAAiBsH,MAA6B,EAAEC,KAAkB,EAAEC,UAAuB,EAAE;QAC3F,OAAO,IAAA;AACT;AACA;;;AAGC,MACDvH,aAAcX,CAAAA,KAA4B,EAAEmI,OAAoB,EAAE;AAChE,QAAA,OAAOnI,KAAK,CAAC4H,kBAAAA,CAAmBC,6BAA6B,CAAC,CAACrH,GAAG;AACpE;AACA;;;AAGC,MACD+G,WAAc,GAAA;QACZ,OAAO,KAAA;AACT;AACA;;;AAGC,MACDC,gBAAmB,GAAA;QACjB,OAAO,KAAA;AACT;AACA;;;AAGC,MACDC,aAAgB,GAAA;QACd,OAAO,IAAA;AACT;AACF;AAEA;;;IAIO,MAAMW,qBAA8BhO,SAAAA,mBAAAA,CAAAA;qBAEzC,OAAuBiO,uBAAAA,GAA0B,uBAAwB;qBAEzE,OAAuBC,yBAAAA,GAA4B,yBAA0B;qBAE7E,UAAqC;qBAErC,YAAuC;AACvC;;;;AAIC,MACD,WAAYC,CAAAA,SAAkB,EAAEC,WAAoB,CAAE;QACpD,KAAK,EAAA;AACL,QAAA,IAAI,CAACC,UAAU,GAAG,IAAItJ,OAAQoJ,CAAAA,SAAAA,CAAAA;AAC9B,QAAA,IAAI,CAACG,YAAY,GAAG,IAAIvJ,OAAQqJ,CAAAA,WAAAA,CAAAA;AAClC;oCAEA,IAAID,SAAgC,GAAA;QAClC,OAAO,IAAI,CAACE,UAAU;AACxB;IACA,IAAIF,SAAAA,CAAUI,KAAyB,EAAE;AACvC,QAAA,IAAIA,KAAO,EAAA;AACT,YAAA,IAAI,CAACF,UAAU,CAACrM,GAAG,CAACuM,KAAAA,CAAAA;AACtB;AACF;sCAEA,IAAIH,WAAkC,GAAA;QACpC,OAAO,IAAI,CAACE,YAAY;AAC1B;IACA,IAAIF,WAAAA,CAAYG,KAAyB,EAAE;AACzC,QAAA,IAAIA,KAAO,EAAA;AACT,YAAA,IAAI,CAACD,YAAY,CAACtM,GAAG,CAACuM,KAAAA,CAAAA;AACxB;AACF;AACA;;;AAGC,MACD1M,OAAU,GAAA;QACR,OAAO,YAAA;AACT;AACA;;;MAIAO,kBAAAA,CAAmBC,EAAkB,EAAE;QACrC,IAAIA,EAAAA,CAAGE,UAAU,KAAK,UAAY,EAAA;YAChCF,EAAGG,CAAAA,cAAc,EAAE,CAACwL,qBAAsBC,CAAAA,uBAAuB,CAAC,GAAG5L,EAAGoB,CAAAA,IAAI,EAAGf,CAAAA,OAAO,CAAC,CAAA,CAAA;YACvFL,EAAGG,CAAAA,cAAc,EAAE,CAACwL,qBAAsBE,CAAAA,yBAAyB,CAAC,GAAG7L,EAAGoB,CAAAA,IAAI,EAAGf,CAAAA,OAAO,CAAC,CAAA,CAAA;AAC3F;AACF;AACA;;;MAIAuB,eAAAA,CAAgBC,EAAa,EAAE;AAC7BA,QAAAA,EAAAA,CAAGC,QAAQ,CAAC6J,qBAAAA,CAAsBC,uBAAuB,EAAE,IAAI,CAACI,UAAU,CAAA;AAC1EnK,QAAAA,EAAAA,CAAGC,QAAQ,CAAC6J,qBAAAA,CAAsBE,yBAAyB,EAAE,IAAI,CAACI,YAAY,CAAA;AAChF;AACA;;;AAGC,MACD3I,YAAYC,KAA4B,EAAEC,IAAiB,EAAEiI,UAAuB,EAAE;QACpF,MAAMzL,EAAAA,GAAKuD,MAAMG,QAAQ;QACzB,MAAMyI,MAAAA,GAASnM,EAAGgF,CAAAA,GAAG,CAAChF,EAAAA,CAAG8D,GAAG,CAACN,IAAAA,CAAKgB,CAAC,EAAE,GAAM,CAAA,EAAA,GAAA,CAAA;AAC3C,QAAA,OAAOxE,GAAGwJ,GAAG,CACXjG,KAAK,CAACoI,sBAAsBE,yBAAyB,CAAC,EACtDtI,KAAK,CAACoI,qBAAsBC,CAAAA,uBAAuB,CAAC,EACpDO,QACApI,GAAG;AACP;AACA;;;AAGC,MACDE,iBAAiBV,KAA4B,EAAEC,IAAiB,EAAEC,SAAsB,EAAE;AACxF,QAAA,OAAO,IAAI,CAACH,WAAW,CAACC,OAAOC,IAAMC,EAAAA,SAAAA,CAAAA;AACvC;AACA;;;AAGC,MACDS,aAAcX,CAAAA,KAA4B,EAAEY,MAAmB,EAAE;QAC/D,MAAMnE,EAAAA,GAAKuD,MAAMG,QAAQ;QACzB,MAAMyI,MAAAA,GAASnM,EAAGgF,CAAAA,GAAG,CAAChF,EAAAA,CAAG8D,GAAG,CAACK,MAAAA,CAAOK,CAAC,EAAE,GAAM,CAAA,EAAA,GAAA,CAAA;AAC7C,QAAA,OAAOxE,GAAGwJ,GAAG,CACXjG,KAAK,CAACoI,sBAAsBE,yBAAyB,CAAC,EACtDtI,KAAK,CAACoI,qBAAsBC,CAAAA,uBAAuB,CAAC,EACpDO,QACApI,GAAG;AACP;AACA;;;AAGC,MACD+G,WAAc,GAAA;QACZ,OAAO,IAAA;AACT;AACA;;;AAGC,MACDC,gBAAmB,GAAA;QACjB,OAAO,IAAA;AACT;AACA;;;AAGC,MACDC,aAAgB,GAAA;QACd,OAAO,IAAA;AACT;AACF;;;;"}
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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"}
@@ -9,8 +9,11 @@ import '../material/unlit.js';
9
9
  import '../material/particle.js';
10
10
  import '../material/subsurfaceprofile.js';
11
11
  import '../material/skin.js';
12
+ import '../material/eye.js';
12
13
  import '../values.js';
13
14
  import '../material/meshmaterial.js';
15
+ import '../material/hair.js';
16
+ import '../material/hairstrand.js';
14
17
  import '../material/grassmaterial.js';
15
18
  import '../material/terrain-cm.js';
16
19
  import '../material/pbrmr.js';
@@ -179,7 +182,7 @@ const MAX_NUM_OCTAVES = 16;
179
182
  outAABB.minPoint.setXYZ(minX, y - maxHeight, minZ);
180
183
  outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);
181
184
  }
182
- /** {@inheritDoc WaveGenerator.calcFragmentNormal} */ calcFragmentNormal(scope, xz) {
185
+ /** {@inheritDoc WaveGenerator.calcFragmentNormal} */ calcFragmentNormal(scope, xz, _vertexNormal) {
183
186
  const pb = scope.$builder;
184
187
  const that = this;
185
188
  pb.func('calcFragmentNormal', [
@@ -190,8 +193,8 @@ const MAX_NUM_OCTAVES = 16;
190
193
  });
191
194
  return scope.calcFragmentNormal(xz);
192
195
  }
193
- /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */ calcFragmentNormalAndFoam(scope, xz) {
194
- return scope.$builder.vec4(this.calcFragmentNormal(scope, xz), 0);
196
+ /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */ calcFragmentNormalAndFoam(scope, xz, _vertexNormal) {
197
+ return scope.$builder.vec4(this.calcFragmentNormal(scope, xz, _vertexNormal), 0);
195
198
  }
196
199
  /** {@inheritDoc WaveGenerator.setupUniforms} */ setupUniforms(scope, uniformGroup) {
197
200
  const pb = scope.$builder;
@@ -1 +1 @@
1
- {"version":3,"file":"fbm_wavegenerator.js","sources":["../../src/render/fbm_wavegenerator.ts"],"sourcesContent":["import type { AABB, Immutable } from '@zephyr3d/base';\r\nimport { Disposable, Vector2 } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { valueNoise } from '../shaders';\r\nimport { ShaderHelper } from '../material';\r\n\r\nconst MAX_NUM_OCTAVES = 16;\r\n\r\n/**\r\n * FBM wave generator.\r\n * @public\r\n */\r\nexport class FBMWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private readonly _windVelocity: Vector2;\r\n private _numOctaves: number;\r\n private _amplitude: number;\r\n private _frequency: number;\r\n private readonly _lacunarity: number;\r\n private readonly _gain: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._version = 0;\r\n this._numOctaves = 4;\r\n this._windVelocity = new Vector2(0.1, 0);\r\n this._amplitude = 0.3;\r\n this._frequency = 3;\r\n this._lacunarity = 1.83;\r\n this._gain = 0.57;\r\n }\r\n clone() {\r\n const other = new FBMWaveGenerator();\r\n other.numOctaves = this.numOctaves;\r\n other.wind = this.wind;\r\n other.amplitude = this.amplitude;\r\n other.frequency = this.frequency;\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Number of octaves */\r\n get numOctaves() {\r\n return this._numOctaves;\r\n }\r\n set numOctaves(val) {\r\n if (val !== this.numOctaves) {\r\n this._numOctaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave amplitude */\r\n get amplitude() {\r\n return this._amplitude;\r\n }\r\n set amplitude(val) {\r\n if (val !== this._amplitude) {\r\n this._amplitude = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave frequency */\r\n get frequency() {\r\n return this._frequency;\r\n }\r\n set frequency(val) {\r\n if (val !== this._frequency) {\r\n this._frequency = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wind velocity */\r\n get wind(): Immutable<Vector2> {\r\n return this._windVelocity;\r\n }\r\n set wind(val: Immutable<Vector2>) {\r\n if (!val.equalsTo(this._windVelocity)) {\r\n this._windVelocity.set(val);\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n private calcWaveNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n time: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveNormal';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.float('time'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.epsilon = pb.float(0.1);\r\n this.$l.hr = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hl = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hu = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hd = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.dHdx = pb.div(pb.sub(this.hr, this.hl), pb.mul(this.epsilon, 2));\r\n this.$l.dHdz = pb.div(pb.sub(this.hu, this.hd), pb.mul(this.epsilon, 2));\r\n this.$l.normal = pb.normalize(pb.vec3(pb.neg(this.dHdx), 1, pb.neg(this.dHdz)));\r\n this.$return(this.normal);\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n time,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcWaveHeight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveHeight';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.windOffset = pb.mul(this.windVelocity, ShaderHelper.getElapsedTime(this));\r\n this.$l.height = that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.01), this.windOffset),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.3,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.05), pb.mul(this.windOffset, 1.5)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.1,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.1), pb.mul(this.windOffset, 2)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.$return(pb.mul(this.height, this.amplitude));\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private fbm(\r\n scope: PBInsideFunctionScope,\r\n st: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'FBM';\r\n pb.func(\r\n funcName,\r\n [pb.vec2('st'), pb.float('frequency'), pb.float('gain'), pb.float('lacunarity'), pb.int('numOctaves')],\r\n function () {\r\n this.$l.m2 = pb.mat2(0.8, 0.6, -0.6, 0.8);\r\n this.$l.p = this.st; //pb.mul(this.st, 0.05);\r\n this.$l.a = pb.float(0);\r\n this.$l.b = pb.float(1);\r\n this.$l.c = pb.float(0);\r\n this.$for(\r\n pb.int('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_NUM_OCTAVES : this.numOctaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numOctaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.n = pb.sub(valueNoise(this, this.p), 0.5);\r\n this.a = pb.add(this.a, pb.mul(this.n, this.b));\r\n this.c = pb.add(this.c, this.b);\r\n this.b = pb.mul(this.b, this.gain);\r\n this.p = pb.mul(this.m2, this.p, this.frequency);\r\n }\r\n );\r\n this.$return(pb.div(this.a, this.c));\r\n }\r\n );\r\n return scope[funcName](st, frequency, gain, lacunarity, numOctaves) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n const maxHeight = 1.5 * this._amplitude;\r\n outAABB.minPoint.setXYZ(minX, y - maxHeight, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.normal = that.calcWaveNormal(\r\n this,\r\n this.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$return(this.normal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp) {\r\n return scope.$builder.vec4(this.calcFragmentNormal(scope, xz), 0);\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numOctaves = pb.int().uniform(uniformGroup);\r\n scope.windVelocity = pb.vec2().uniform(uniformGroup);\r\n scope.waveAmplitude = pb.float().uniform(uniformGroup);\r\n scope.waveFrequency = pb.float().uniform(uniformGroup);\r\n scope.waveGain = pb.float().uniform(uniformGroup);\r\n scope.waveLacunarity = pb.float().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outNormal = that.calcWaveNormal(\r\n this,\r\n this.inPos.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.h = that.calcWaveHeight(\r\n this,\r\n this.inPos.xz,\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.outPos = pb.add(this.inPos, pb.vec3(0, this.h, 0));\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numOctaves', this._numOctaves);\r\n bindGroup.setValue('windVelocity', this._windVelocity);\r\n bindGroup.setValue('waveAmplitude', this._amplitude);\r\n bindGroup.setValue('waveFrequency', this._frequency);\r\n bindGroup.setValue('waveGain', this._gain);\r\n bindGroup.setValue('waveLacunarity', this._lacunarity);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'FBMWaveGenerator';\r\n }\r\n}\r\n"],"names":["MAX_NUM_OCTAVES","FBMWaveGenerator","Disposable","_version","_windVelocity","_numOctaves","_amplitude","_frequency","_lacunarity","_gain","Vector2","clone","other","numOctaves","wind","amplitude","frequency","version","val","equalsTo","set","scope","worldPos","time","windVelocity","gain","lacunarity","pb","$builder","funcName","that","func","vec2","float","int","$l","epsilon","hr","calcWaveHeight","add","hl","sub","hu","hd","dHdx","div","mul","dHdz","normal","normalize","vec3","neg","$return","windOffset","ShaderHelper","getElapsedTime","height","fbm","st","m2","mat2","p","a","b","c","$for","getDevice","type","$if","greaterThanEqual","i","$break","n","valueNoise","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","minPoint","setXYZ","maxPoint","calcFragmentNormal","xz","calcWaveNormal","waveAmplitude","waveFrequency","waveGain","waveLacunarity","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","uniform","calcNormalAndPos","inPos","outPos","outNormal","out","h","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
1
+ {"version":3,"file":"fbm_wavegenerator.js","sources":["../../src/render/fbm_wavegenerator.ts"],"sourcesContent":["import type { AABB, Immutable } from '@zephyr3d/base';\r\nimport { Disposable, Vector2 } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { valueNoise } from '../shaders';\r\nimport { ShaderHelper } from '../material';\r\n\r\nconst MAX_NUM_OCTAVES = 16;\r\n\r\n/**\r\n * FBM wave generator.\r\n * @public\r\n */\r\nexport class FBMWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private readonly _windVelocity: Vector2;\r\n private _numOctaves: number;\r\n private _amplitude: number;\r\n private _frequency: number;\r\n private readonly _lacunarity: number;\r\n private readonly _gain: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._version = 0;\r\n this._numOctaves = 4;\r\n this._windVelocity = new Vector2(0.1, 0);\r\n this._amplitude = 0.3;\r\n this._frequency = 3;\r\n this._lacunarity = 1.83;\r\n this._gain = 0.57;\r\n }\r\n clone() {\r\n const other = new FBMWaveGenerator();\r\n other.numOctaves = this.numOctaves;\r\n other.wind = this.wind;\r\n other.amplitude = this.amplitude;\r\n other.frequency = this.frequency;\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Number of octaves */\r\n get numOctaves() {\r\n return this._numOctaves;\r\n }\r\n set numOctaves(val) {\r\n if (val !== this.numOctaves) {\r\n this._numOctaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave amplitude */\r\n get amplitude() {\r\n return this._amplitude;\r\n }\r\n set amplitude(val) {\r\n if (val !== this._amplitude) {\r\n this._amplitude = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave frequency */\r\n get frequency() {\r\n return this._frequency;\r\n }\r\n set frequency(val) {\r\n if (val !== this._frequency) {\r\n this._frequency = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wind velocity */\r\n get wind(): Immutable<Vector2> {\r\n return this._windVelocity;\r\n }\r\n set wind(val: Immutable<Vector2>) {\r\n if (!val.equalsTo(this._windVelocity)) {\r\n this._windVelocity.set(val);\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n private calcWaveNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n time: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveNormal';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.float('time'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.epsilon = pb.float(0.1);\r\n this.$l.hr = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hl = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hu = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hd = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.dHdx = pb.div(pb.sub(this.hr, this.hl), pb.mul(this.epsilon, 2));\r\n this.$l.dHdz = pb.div(pb.sub(this.hu, this.hd), pb.mul(this.epsilon, 2));\r\n this.$l.normal = pb.normalize(pb.vec3(pb.neg(this.dHdx), 1, pb.neg(this.dHdz)));\r\n this.$return(this.normal);\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n time,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcWaveHeight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveHeight';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.windOffset = pb.mul(this.windVelocity, ShaderHelper.getElapsedTime(this));\r\n this.$l.height = that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.01), this.windOffset),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.3,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.05), pb.mul(this.windOffset, 1.5)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.1,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.1), pb.mul(this.windOffset, 2)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.$return(pb.mul(this.height, this.amplitude));\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private fbm(\r\n scope: PBInsideFunctionScope,\r\n st: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'FBM';\r\n pb.func(\r\n funcName,\r\n [pb.vec2('st'), pb.float('frequency'), pb.float('gain'), pb.float('lacunarity'), pb.int('numOctaves')],\r\n function () {\r\n this.$l.m2 = pb.mat2(0.8, 0.6, -0.6, 0.8);\r\n this.$l.p = this.st; //pb.mul(this.st, 0.05);\r\n this.$l.a = pb.float(0);\r\n this.$l.b = pb.float(1);\r\n this.$l.c = pb.float(0);\r\n this.$for(\r\n pb.int('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_NUM_OCTAVES : this.numOctaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numOctaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.n = pb.sub(valueNoise(this, this.p), 0.5);\r\n this.a = pb.add(this.a, pb.mul(this.n, this.b));\r\n this.c = pb.add(this.c, this.b);\r\n this.b = pb.mul(this.b, this.gain);\r\n this.p = pb.mul(this.m2, this.p, this.frequency);\r\n }\r\n );\r\n this.$return(pb.div(this.a, this.c));\r\n }\r\n );\r\n return scope[funcName](st, frequency, gain, lacunarity, numOctaves) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n const maxHeight = 1.5 * this._amplitude;\r\n outAABB.minPoint.setXYZ(minX, y - maxHeight, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.normal = that.calcWaveNormal(\r\n this,\r\n this.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$return(this.normal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n return scope.$builder.vec4(this.calcFragmentNormal(scope, xz, _vertexNormal), 0);\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numOctaves = pb.int().uniform(uniformGroup);\r\n scope.windVelocity = pb.vec2().uniform(uniformGroup);\r\n scope.waveAmplitude = pb.float().uniform(uniformGroup);\r\n scope.waveFrequency = pb.float().uniform(uniformGroup);\r\n scope.waveGain = pb.float().uniform(uniformGroup);\r\n scope.waveLacunarity = pb.float().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outNormal = that.calcWaveNormal(\r\n this,\r\n this.inPos.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.h = that.calcWaveHeight(\r\n this,\r\n this.inPos.xz,\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.outPos = pb.add(this.inPos, pb.vec3(0, this.h, 0));\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numOctaves', this._numOctaves);\r\n bindGroup.setValue('windVelocity', this._windVelocity);\r\n bindGroup.setValue('waveAmplitude', this._amplitude);\r\n bindGroup.setValue('waveFrequency', this._frequency);\r\n bindGroup.setValue('waveGain', this._gain);\r\n bindGroup.setValue('waveLacunarity', this._lacunarity);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'FBMWaveGenerator';\r\n }\r\n}\r\n"],"names":["MAX_NUM_OCTAVES","FBMWaveGenerator","Disposable","_version","_windVelocity","_numOctaves","_amplitude","_frequency","_lacunarity","_gain","Vector2","clone","other","numOctaves","wind","amplitude","frequency","version","val","equalsTo","set","scope","worldPos","time","windVelocity","gain","lacunarity","pb","$builder","funcName","that","func","vec2","float","int","$l","epsilon","hr","calcWaveHeight","add","hl","sub","hu","hd","dHdx","div","mul","dHdz","normal","normalize","vec3","neg","$return","windOffset","ShaderHelper","getElapsedTime","height","fbm","st","m2","mat2","p","a","b","c","$for","getDevice","type","$if","greaterThanEqual","i","$break","n","valueNoise","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","minPoint","setXYZ","maxPoint","calcFragmentNormal","xz","_vertexNormal","calcWaveNormal","waveAmplitude","waveFrequency","waveGain","waveLacunarity","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","uniform","calcNormalAndPos","inPos","outPos","outNormal","out","h","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}