@zephyr3d/scene 0.9.25 → 0.9.26

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 (262) hide show
  1. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  2. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  3. package/dist/animation/joint_dynamics/controller.js +7 -5
  4. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  5. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  6. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  7. package/dist/animation/morphtrack.js +3 -4
  8. package/dist/animation/morphtrack.js.map +1 -1
  9. package/dist/animation/skeleton.js +58 -24
  10. package/dist/animation/skeleton.js.map +1 -1
  11. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  12. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  13. package/dist/animation/spring/spring_collider.js +4 -3
  14. package/dist/animation/spring/spring_collider.js.map +1 -1
  15. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  16. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  17. package/dist/animation/spring/spring_particle.js +2 -0
  18. package/dist/animation/spring/spring_particle.js.map +1 -1
  19. package/dist/animation/spring/spring_system.js +11 -3
  20. package/dist/animation/spring/spring_system.js.map +1 -1
  21. package/dist/animation/spring_modifier.js +10 -0
  22. package/dist/animation/spring_modifier.js.map +1 -1
  23. package/dist/app/engine.js +53 -43
  24. package/dist/app/engine.js.map +1 -1
  25. package/dist/app/scriptingsystem.js +119 -6
  26. package/dist/app/scriptingsystem.js.map +1 -1
  27. package/dist/app/scriptregistry.js +3 -2
  28. package/dist/app/scriptregistry.js.map +1 -1
  29. package/dist/asset/assetmanager.js +284 -67
  30. package/dist/asset/assetmanager.js.map +1 -1
  31. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  32. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  33. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  34. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  35. package/dist/asset/model.js +178 -67
  36. package/dist/asset/model.js.map +1 -1
  37. package/dist/camera/camera.js +193 -21
  38. package/dist/camera/camera.js.map +1 -1
  39. package/dist/camera/perspectivecamera.js +3 -1
  40. package/dist/camera/perspectivecamera.js.map +1 -1
  41. package/dist/index.d.ts +4019 -1278
  42. package/dist/index.js +15 -5
  43. package/dist/index.js.map +1 -1
  44. package/dist/material/eye.js +932 -0
  45. package/dist/material/eye.js.map +1 -0
  46. package/dist/material/hair.js +917 -0
  47. package/dist/material/hair.js.map +1 -0
  48. package/dist/material/hairstrand.js +842 -0
  49. package/dist/material/hairstrand.js.map +1 -0
  50. package/dist/material/hairstrand_data.js +162 -0
  51. package/dist/material/hairstrand_data.js.map +1 -0
  52. package/dist/material/lambert.js +5 -2
  53. package/dist/material/lambert.js.map +1 -1
  54. package/dist/material/material.js +338 -300
  55. package/dist/material/material.js.map +1 -1
  56. package/dist/material/meshmaterial.js +120 -19
  57. package/dist/material/meshmaterial.js.map +1 -1
  58. package/dist/material/mixins/albedocolor.js +1 -1
  59. package/dist/material/mixins/albedocolor.js.map +1 -1
  60. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  61. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  62. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  63. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  65. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  67. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  70. package/dist/material/mixins/lit.js +73 -18
  71. package/dist/material/mixins/lit.js.map +1 -1
  72. package/dist/material/mixins/pbr/common.js +4 -4
  73. package/dist/material/mixins/pbr/common.js.map +1 -1
  74. package/dist/material/mixins/texture.js +48 -11
  75. package/dist/material/mixins/texture.js.map +1 -1
  76. package/dist/material/mtoon.js +6 -5
  77. package/dist/material/mtoon.js.map +1 -1
  78. package/dist/material/pbrblueprint.js +146 -28
  79. package/dist/material/pbrblueprint.js.map +1 -1
  80. package/dist/material/pbrblueprint_instance.js +501 -0
  81. package/dist/material/pbrblueprint_instance.js.map +1 -0
  82. package/dist/material/pbrmr.js +15 -16
  83. package/dist/material/pbrmr.js.map +1 -1
  84. package/dist/material/shader/helper.js +330 -20
  85. package/dist/material/shader/helper.js.map +1 -1
  86. package/dist/material/shader/terrain_blend.js +55 -0
  87. package/dist/material/shader/terrain_blend.js.map +1 -0
  88. package/dist/material/skin.js +192 -32
  89. package/dist/material/skin.js.map +1 -1
  90. package/dist/material/spriteblueprint.js +16 -1
  91. package/dist/material/spriteblueprint.js.map +1 -1
  92. package/dist/material/subsurfaceprofile.js +86 -23
  93. package/dist/material/subsurfaceprofile.js.map +1 -1
  94. package/dist/material/water.js +3 -1
  95. package/dist/material/water.js.map +1 -1
  96. package/dist/posteffect/bloom.js +167 -7
  97. package/dist/posteffect/bloom.js.map +1 -1
  98. package/dist/posteffect/coloradjust.js +2 -1
  99. package/dist/posteffect/coloradjust.js.map +1 -1
  100. package/dist/posteffect/compositor.js.map +1 -1
  101. package/dist/posteffect/fxaa.js +2 -1
  102. package/dist/posteffect/fxaa.js.map +1 -1
  103. package/dist/posteffect/grayscale.js +3 -1
  104. package/dist/posteffect/grayscale.js.map +1 -1
  105. package/dist/posteffect/motionblur.js +4 -1
  106. package/dist/posteffect/motionblur.js.map +1 -1
  107. package/dist/posteffect/posteffect.js.map +1 -1
  108. package/dist/posteffect/skinsss.js +368 -69
  109. package/dist/posteffect/skinsss.js.map +1 -1
  110. package/dist/posteffect/ssgi.js +16 -9
  111. package/dist/posteffect/ssgi.js.map +1 -1
  112. package/dist/posteffect/ssr.js +3 -0
  113. package/dist/posteffect/ssr.js.map +1 -1
  114. package/dist/posteffect/sss.js +91 -34
  115. package/dist/posteffect/sss.js.map +1 -1
  116. package/dist/posteffect/taa.js.map +1 -1
  117. package/dist/posteffect/tonemap.js +44 -1
  118. package/dist/posteffect/tonemap.js.map +1 -1
  119. package/dist/render/abuffer_oit.js +45 -39
  120. package/dist/render/abuffer_oit.js.map +1 -1
  121. package/dist/render/cull_visitor.js +19 -0
  122. package/dist/render/cull_visitor.js.map +1 -1
  123. package/dist/render/depthpass.js +36 -2
  124. package/dist/render/depthpass.js.map +1 -1
  125. package/dist/render/drawable_mixin.js +26 -1
  126. package/dist/render/drawable_mixin.js.map +1 -1
  127. package/dist/render/dualdepthpeeling_oit.js +52 -51
  128. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  129. package/dist/render/envlight.js +1 -1
  130. package/dist/render/envlight.js.map +1 -1
  131. package/dist/render/fbm_wavegenerator.js +3 -0
  132. package/dist/render/fbm_wavegenerator.js.map +1 -1
  133. package/dist/render/gerstner_wavegenerator.js +3 -0
  134. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  135. package/dist/render/globalbindgroup_allocator.js +3 -0
  136. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  137. package/dist/render/oit.js +29 -0
  138. package/dist/render/oit.js.map +1 -0
  139. package/dist/render/render_queue.js +3 -0
  140. package/dist/render/render_queue.js.map +1 -1
  141. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  142. package/dist/render/rendergraph/executor.js +2 -0
  143. package/dist/render/rendergraph/executor.js.map +1 -1
  144. package/dist/render/rendergraph/forward_plus_builder.js +61 -1
  145. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  146. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  147. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  148. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  149. package/dist/render/rendergraph/types.js.map +1 -1
  150. package/dist/render/shadow_mask_pass.js +73 -8
  151. package/dist/render/shadow_mask_pass.js.map +1 -1
  152. package/dist/render/sky.js +166 -126
  153. package/dist/render/sky.js.map +1 -1
  154. package/dist/render/weightedblended_oit.js +36 -35
  155. package/dist/render/weightedblended_oit.js.map +1 -1
  156. package/dist/scene/basesprite.js +8 -0
  157. package/dist/scene/basesprite.js.map +1 -1
  158. package/dist/scene/batchgroup.js +3 -0
  159. package/dist/scene/batchgroup.js.map +1 -1
  160. package/dist/scene/environment.js +4 -1
  161. package/dist/scene/environment.js.map +1 -1
  162. package/dist/scene/hair.js +963 -0
  163. package/dist/scene/hair.js.map +1 -0
  164. package/dist/scene/light.js +5 -1
  165. package/dist/scene/light.js.map +1 -1
  166. package/dist/scene/mesh.js +481 -47
  167. package/dist/scene/mesh.js.map +1 -1
  168. package/dist/scene/meshdrawable.js +6 -0
  169. package/dist/scene/meshdrawable.js.map +1 -1
  170. package/dist/scene/msdftext.js +3 -0
  171. package/dist/scene/msdftext.js.map +1 -1
  172. package/dist/scene/msdftextsprite.js +3 -0
  173. package/dist/scene/msdftextsprite.js.map +1 -1
  174. package/dist/scene/particlesys.js +6 -0
  175. package/dist/scene/particlesys.js.map +1 -1
  176. package/dist/scene/scene.js +3 -0
  177. package/dist/scene/scene.js.map +1 -1
  178. package/dist/scene/scene_node.js +6 -1
  179. package/dist/scene/scene_node.js.map +1 -1
  180. package/dist/scene/terrain-cm/grass.js +3 -0
  181. package/dist/scene/terrain-cm/grass.js.map +1 -1
  182. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  183. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  184. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  185. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  186. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  187. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  188. package/dist/scene/water.js +6 -0
  189. package/dist/scene/water.js.map +1 -1
  190. package/dist/shaders/atmosphere.js.map +1 -1
  191. package/dist/shaders/diffusion.js +54 -0
  192. package/dist/shaders/diffusion.js.map +1 -0
  193. package/dist/shaders/shadow.js +33 -21
  194. package/dist/shaders/shadow.js.map +1 -1
  195. package/dist/shaders/temporal.js +71 -33
  196. package/dist/shaders/temporal.js.map +1 -1
  197. package/dist/shadow/dom.js +546 -0
  198. package/dist/shadow/dom.js.map +1 -0
  199. package/dist/shadow/pcf_opt.js +3 -5
  200. package/dist/shadow/pcf_opt.js.map +1 -1
  201. package/dist/shadow/pcf_pd.js +1 -1
  202. package/dist/shadow/pcf_pd.js.map +1 -1
  203. package/dist/shadow/receiver_bias.js +41 -0
  204. package/dist/shadow/receiver_bias.js.map +1 -0
  205. package/dist/shadow/shader.js +20 -60
  206. package/dist/shadow/shader.js.map +1 -1
  207. package/dist/shadow/shadow_impl.js +89 -0
  208. package/dist/shadow/shadow_impl.js.map +1 -1
  209. package/dist/shadow/shadow_region.js +50 -50
  210. package/dist/shadow/shadow_region.js.map +1 -1
  211. package/dist/shadow/shadowmapper.js +150 -37
  212. package/dist/shadow/shadowmapper.js.map +1 -1
  213. package/dist/shapes/shape.js +11 -2
  214. package/dist/shapes/shape.js.map +1 -1
  215. package/dist/shapes/sphere.js +50 -9
  216. package/dist/shapes/sphere.js.map +1 -1
  217. package/dist/utility/blueprint/common/constants.js +112 -2
  218. package/dist/utility/blueprint/common/constants.js.map +1 -1
  219. package/dist/utility/blueprint/material/func.js +142 -49
  220. package/dist/utility/blueprint/material/func.js.map +1 -1
  221. package/dist/utility/blueprint/material/ir.js +490 -25
  222. package/dist/utility/blueprint/material/ir.js.map +1 -1
  223. package/dist/utility/blueprint/material/texture.js +898 -4
  224. package/dist/utility/blueprint/material/texture.js.map +1 -1
  225. package/dist/utility/serialization/manager.js +431 -100
  226. package/dist/utility/serialization/manager.js.map +1 -1
  227. package/dist/utility/serialization/scene/animation.js +370 -3
  228. package/dist/utility/serialization/scene/animation.js.map +1 -1
  229. package/dist/utility/serialization/scene/batch.js +4 -0
  230. package/dist/utility/serialization/scene/batch.js.map +1 -1
  231. package/dist/utility/serialization/scene/camera.js +133 -1
  232. package/dist/utility/serialization/scene/camera.js.map +1 -1
  233. package/dist/utility/serialization/scene/common.js +26 -5
  234. package/dist/utility/serialization/scene/common.js.map +1 -1
  235. package/dist/utility/serialization/scene/hair.js +1141 -0
  236. package/dist/utility/serialization/scene/hair.js.map +1 -0
  237. package/dist/utility/serialization/scene/light.js +84 -4
  238. package/dist/utility/serialization/scene/light.js.map +1 -1
  239. package/dist/utility/serialization/scene/material.js +1867 -166
  240. package/dist/utility/serialization/scene/material.js.map +1 -1
  241. package/dist/utility/serialization/scene/mesh.js +231 -14
  242. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  243. package/dist/utility/serialization/scene/node.js +141 -7
  244. package/dist/utility/serialization/scene/node.js.map +1 -1
  245. package/dist/utility/serialization/scene/particle.js +4 -0
  246. package/dist/utility/serialization/scene/particle.js.map +1 -1
  247. package/dist/utility/serialization/scene/primitive.js +18 -0
  248. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  249. package/dist/utility/serialization/scene/sprite.js +4 -0
  250. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  251. package/dist/utility/serialization/scene/terrain.js +4 -0
  252. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  253. package/dist/utility/serialization/scene/text.js +4 -0
  254. package/dist/utility/serialization/scene/text.js.map +1 -1
  255. package/dist/utility/serialization/scene/water.js +4 -0
  256. package/dist/utility/serialization/scene/water.js.map +1 -1
  257. package/dist/utility/serialization/types.js.map +1 -1
  258. package/dist/utility/shprojector.js +96 -95
  259. package/dist/utility/shprojector.js.map +1 -1
  260. package/dist/values.js +49 -2
  261. package/dist/values.js.map +1 -1
  262. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.transparent;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(device, rg.getTexture<Texture2D>(src), rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(\r\n output.framebuffer ? rg.getFramebuffer<FrameBuffer>(output.framebuffer) : null\r\n );\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(device, rg.getTexture<Texture2D>(s.input), rg.getTexture<Texture2D>(bloomHandle));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, _srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0]);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i]);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$outputs.outColor = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_layer","PostEffectLayer","transparent","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","ctx","format","colorFormat","prefilterWidth","Math","max","width","prefilterHeight","height","t","levels","w","h","maxLevels","push","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","i","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","color","apply","inputColorTexture","_sceneDepthTexture","_srgbOutput","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","drawFullscreenQuad","bloomTexture","textures","dstTexture","setXY","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","name","createBindGroup","bindGroupLayouts","raw","finite","p","brightness","r","g","b","soft","contrib","div","sub","offsets","weights","invTexSize","sum","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":";;;AAeA;;;IAIO,MAAMA,KAAcC,SAAAA,kBAAAA,CAAAA;AACzB,IAAA,OAAgBC,YAAY,OAAiB;uFAE7C,OAAwBC,cAAAA,GAAiB,KAAM;AAC/C,IAAA,OAAeC,sBAA4C,IAAK;AAChE,IAAA,OAAeC,sBAA4C,IAAK;AAChE,IAAA,OAAeC,mBAAyC,IAAK;AAC7D,IAAA,OAAeC,uBAA6C,IAAK;AACjE,IAAA,OAAeC,oBAA0C,IAAK;AAC9D,IAAA,OAAeC,uBAAiD,IAAK;AACrE,IAAA,OAAeC,wBAA6C,IAAK;AACjE,IAAA,OAAeC,wBAA6C,IAAK;AACjE,IAAA,OAAeC,qBAA0C,IAAK;AAC9D,IAAA,OAAeC,yBAA8C,IAAK;AAClE,IAAA,OAAeC,sBAA2C,IAAK;IAC9CC,eAAyB;IACzBC,WAAqB;IAC9BC,oBAA6B;IAC7BC,gBAAyB;IACzBC,UAAmB;IACnBC,cAAuB;IACvBC,UAAmB;AAC3B;;AAEC,MACD,WAAc,EAAA;QACZ,KAAK,EAAA;AACL,QAAA,IAAI,CAACC,MAAM,GAAGC,eAAAA,CAAgBC,WAAW;QACzC,IAAI,CAACT,eAAe,GAAG,IAAIU,OAAAA,EAAAA;QAC3B,IAAI,CAACT,WAAW,GAAG,IAAIU,OAAAA,EAAAA;QACvB,IAAI,CAACT,oBAAoB,GAAG,CAAA;QAC5B,IAAI,CAACC,gBAAgB,GAAG,EAAA;QACxB,IAAI,CAACC,UAAU,GAAG,GAAA;QAClB,IAAI,CAACC,cAAc,GAAG,CAAA;QACtB,IAAI,CAACC,UAAU,GAAG,CAAA;AACpB;yCAEA,IAAIM,kBAAqB,GAAA;QACvB,OAAO,IAAI,CAACV,oBAAoB;AAClC;IACA,IAAIU,kBAAAA,CAAmBC,GAAG,EAAE;QAC1B,IAAI,CAACX,oBAAoB,GAAGW,GAAAA;AAC9B;4CAEA,IAAIC,eAAkB,GAAA;QACpB,OAAO,IAAI,CAACX,gBAAgB;AAC9B;IACA,IAAIW,eAAAA,CAAgBD,GAAG,EAAE;QACvB,IAAI,CAACV,gBAAgB,GAAGU,GAAAA;AAC1B;AACA;;;;;;;;;;;;;;;;;AAiBC,MACD,IAAIE,SAAY,GAAA;QACd,OAAO,IAAI,CAACX,UAAU;AACxB;IACA,IAAIW,SAAAA,CAAUF,GAAG,EAAE;QACjB,IAAI,CAACT,UAAU,GAAGS,GAAAA;AACpB;gCAEA,IAAIG,aAAgB,GAAA;QAClB,OAAO,IAAI,CAACX,cAAc;AAC5B;IACA,IAAIW,aAAAA,CAAcH,GAAG,EAAE;QACrB,IAAI,CAACR,cAAc,GAAGQ,GAAAA;AACxB;2BAEA,IAAII,SAAY,GAAA;QACd,OAAO,IAAI,CAACX,UAAU;AACxB;IACA,IAAIW,SAAAA,CAAUJ,GAAG,EAAE;QACjB,IAAI,CAACP,UAAU,GAAGO,GAAAA;AACpB;AACA,sEACAK,yBAA4B,GAAA;QAC1B,OAAO,KAAA;AACT;AACA,mEACAC,sBAAyB,GAAA;QACvB,OAAO,KAAA;AACT;AACA;;;;;;MAOAC,KAAAA,CAAMC,CAAyB,EAAY;AACzC,QAAA,MAAM,EAAEC,KAAK,EAAEC,GAAG,EAAE,GAAGF,CAAAA;QACvB,MAAMG,MAAAA,GAASH,EAAEI,WAAW;;AAE5B,QAAA,MAAMC,iBAAiBC,IAAKC,CAAAA,GAAG,CAACP,CAAEQ,CAAAA,KAAK,IAAI,CAAG,EAAA,CAAA,CAAA;AAC9C,QAAA,MAAMC,kBAAkBH,IAAKC,CAAAA,GAAG,CAACP,CAAEU,CAAAA,MAAM,IAAI,CAAG,EAAA,CAAA,CAAA;AAChD,QAAA,MAAMC,IAAIL,IAAKC,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAACzB,gBAAgB,CAAA;AAC3C,QAAA,MAAM8B,SAAmD,EAAE;AAC3D,QAAA;AACE,YAAA,IAAIC,CAAIP,GAAAA,IAAAA,CAAKC,GAAG,CAACI,GAAGN,cAAkB,IAAA,CAAA,CAAA;AACtC,YAAA,IAAIS,CAAIR,GAAAA,IAAAA,CAAKC,GAAG,CAACI,GAAGF,eAAmB,IAAA,CAAA,CAAA;AACvC,YAAA,IAAIM,YAAYT,IAAKC,CAAAA,GAAG,CAAC,IAAI,CAAC1B,oBAAoB,EAAE,CAAA,CAAA;YACpD,MAAQgC,CAAAA,CAAKF,IAAAA,CAAAA,IAAKG,KAAKH,CAAAA,KAAMI,YAAY,CAAG,CAAA;AAC1CH,gBAAAA,MAAAA,CAAOI,IAAI,CAAC;oBAAER,KAAOK,EAAAA,CAAAA;oBAAGH,MAAQI,EAAAA;AAAE,iBAAA,CAAA;AAClCC,gBAAAA,SAAAA,EAAAA;AACAF,gBAAAA,CAAAA,GAAIP,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGM,CAAK,IAAA,CAAA,CAAA;AACrBC,gBAAAA,CAAAA,GAAIR,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGO,CAAK,IAAA,CAAA,CAAA;AACvB;AACF;QACA,IAAIF,MAAAA,CAAOK,MAAM,KAAK,CAAG,EAAA;;AAEvB,YAAA,OAAOjB,EAAEkB,KAAK;AAChB;;AAGA,QAAA,MAAMC,eAAkBlB,GAAAA,KAAAA,CAAMmB,OAAO,CAAC,mBAAmB,CAACC,OAAAA,GAAAA;YACxDA,OAAQC,CAAAA,IAAI,CAACtB,CAAAA,CAAEkB,KAAK,CAAA;AACpB,YAAA,KAAK,MAAMK,GAAAA,IAAOvB,CAAEwB,CAAAA,YAAY,CAAE;AAChCH,gBAAAA,OAAAA,CAAQC,IAAI,CAACC,GAAAA,CAAAA;AACf;YACA,MAAME,GAAAA,GAAMJ,OAAQK,CAAAA,aAAa,CAAC;AAChCvB,gBAAAA,MAAAA;gBACAwB,QAAU,EAAA,UAAA;gBACVnB,KAAOH,EAAAA,cAAAA;gBACPK,MAAQD,EAAAA,eAAAA;gBACRmB,KAAO,EAAA;AACT,aAAA,CAAA;YACAP,OAAQQ,CAAAA,UAAU,CAAC,CAACC,EAAAA,GAAAA;gBAClB,MAAMC,MAAAA,GAAS7B,IAAI6B,MAAM;AACzB,gBAAA,MAAMC,YAAeF,GAAAA,EAAAA,CAAGG,UAAU,CAAYjC,EAAEkB,KAAK,CAAA;gBACrD,IAAI,CAACgB,QAAQ,CAACH,MAAQC,EAAAA,YAAAA,CAAAA;AACtBD,gBAAAA,MAAAA,CAAOI,gBAAgB,EAAA;gBACvB,IAAI;AACF,oBAAA,IAAI,CAACC,SAAS,CAACL,QAAQC,YAAcF,EAAAA,EAAAA,CAAGG,UAAU,CAAYR,GAAAA,CAAAA,CAAAA;iBACtD,QAAA;AACRM,oBAAAA,MAAAA,CAAOM,eAAe,EAAA;AACxB;AACF,aAAA,CAAA;YACA,OAAOZ,GAAAA;AACT,SAAA,CAAA;;;AAIA,QAAA,MAAMa,eAA2B,EAAE;AACnC,QAAA,IAAIC,YAAepB,GAAAA,eAAAA;AACnB,QAAA,IAAK,IAAIqB,CAAI,GAAA,CAAA,EAAGA,IAAI5B,MAAOK,CAAAA,MAAM,EAAEuB,CAAK,EAAA,CAAA;YACtC,MAAMC,KAAAA,GAAQ7B,MAAM,CAAC4B,CAAE,CAAA;AACvB,YAAA,MAAME,GAAMH,GAAAA,YAAAA;YACZ,MAAMI,WAAAA,GAAc1C,MAAMmB,OAAO,CAAC,CAAC,gBAAgB,EAAEoB,CAAG,CAAA,CAAA,EAAE,CAACnB,OAAAA,GAAAA;AACzDA,gBAAAA,OAAAA,CAAQC,IAAI,CAACoB,GAAAA,CAAAA;gBACb,MAAME,MAAAA,GAASvB,OAAQK,CAAAA,aAAa,CAAC;AACnCvB,oBAAAA,MAAAA;oBACAwB,QAAU,EAAA,UAAA;AACVnB,oBAAAA,KAAAA,EAAOiC,MAAMjC,KAAK;AAClBE,oBAAAA,MAAAA,EAAQ+B,MAAM/B,MAAM;AACpBkB,oBAAAA,KAAAA,EAAO,CAAC,gBAAgB,EAAEY,CAAAA,CAAE,OAAO;AACrC,iBAAA,CAAA;gBACA,MAAMf,GAAAA,GAAMJ,OAAQK,CAAAA,aAAa,CAAC;AAChCvB,oBAAAA,MAAAA;oBACAwB,QAAU,EAAA,UAAA;AACVnB,oBAAAA,KAAAA,EAAOiC,MAAMjC,KAAK;AAClBE,oBAAAA,MAAAA,EAAQ+B,MAAM/B,MAAM;oBACpBkB,KAAO,EAAA,CAAC,gBAAgB,EAAEY,CAAG,CAAA;AAC/B,iBAAA,CAAA;gBACAnB,OAAQQ,CAAAA,UAAU,CAAC,CAACC,EAAAA,GAAAA;oBAClB,MAAMC,MAAAA,GAAS7B,IAAI6B,MAAM;AACzBA,oBAAAA,MAAAA,CAAOI,gBAAgB,EAAA;oBACvB,IAAI;wBACF,MAAMU,aAAAA,GAAgBf,EAAGG,CAAAA,UAAU,CAAYW,MAAAA,CAAAA;AAC/C,wBAAA,IAAI,CAACE,KAAK,CAACf,QAAQD,EAAGG,CAAAA,UAAU,CAAYS,GAAMG,CAAAA,EAAAA,aAAAA,CAAAA;AAClD,wBAAA,IAAI,CAACE,KAAK,CAAChB,QAAQc,aAAef,EAAAA,EAAAA,CAAGG,UAAU,CAAYR,GAAAA,CAAAA,CAAAA;qBACnD,QAAA;AACRM,wBAAAA,MAAAA,CAAOM,eAAe,EAAA;AACxB;AACF,iBAAA,CAAA;gBACA,OAAOZ,GAAAA;AACT,aAAA,CAAA;AACAa,YAAAA,YAAAA,CAAatB,IAAI,CAAC2B,WAAAA,CAAAA;YAClBJ,YAAeI,GAAAA,WAAAA;AACjB;;;QAIA,IAAK,IAAIH,IAAI5B,MAAOK,CAAAA,MAAM,GAAG,CAAGuB,EAAAA,CAAAA,IAAK,GAAGA,CAAK,EAAA,CAAA;AAC3C,YAAA,MAAME,GAAMJ,GAAAA,YAAY,CAACE,CAAAA,GAAI,CAAE,CAAA;YAC/B,MAAMQ,GAAAA,GAAMV,YAAY,CAACE,CAAE,CAAA;YAC3BF,YAAY,CAACE,CAAE,CAAA,GAAGvC,KAAMmB,CAAAA,OAAO,CAAC,CAAC,cAAc,EAAEoB,CAAG,CAAA,CAAA,EAAE,CAACnB,OAAAA,GAAAA;AACrDA,gBAAAA,OAAAA,CAAQC,IAAI,CAACoB,GAAAA,CAAAA;AACbrB,gBAAAA,OAAAA,CAAQC,IAAI,CAAC0B,GAAAA,CAAAA;gBACb,MAAMvB,GAAAA,GAAMJ,OAAQ4B,CAAAA,KAAK,CAACD,GAAAA,CAAAA;gBAC1B3B,OAAQQ,CAAAA,UAAU,CAAC,CAACC,EAAAA,GAAAA;oBAClB,MAAMC,MAAAA,GAAS7B,IAAI6B,MAAM;AACzBA,oBAAAA,MAAAA,CAAOI,gBAAgB,EAAA;oBACvB,IAAI;AACF,wBAAA,IAAI,CAACD,QAAQ,CAACH,MAAQD,EAAAA,EAAAA,CAAGG,UAAU,CAAYS,GAAAA,CAAAA,CAAAA;wBAC/C,IAAI,CAACQ,YAAY,CAACnB,MAAQD,EAAAA,EAAAA,CAAGG,UAAU,CAAYS,GAAAA,CAAAA,EAAMZ,EAAGG,CAAAA,UAAU,CAAYR,GAAAA,CAAAA,CAAAA;qBAC1E,QAAA;AACRM,wBAAAA,MAAAA,CAAOM,eAAe,EAAA;AACxB;AACF,iBAAA,CAAA;gBACA,OAAOZ,GAAAA;AACT,aAAA,CAAA;AACF;;QAGA,MAAM0B,WAAAA,GAAcb,YAAY,CAAC,CAAE,CAAA;AACnC,QAAA,OAAOrC,KAAMmB,CAAAA,OAAO,CAAC,eAAA,EAAiB,CAACC,OAAAA,GAAAA;YACrCA,OAAQC,CAAAA,IAAI,CAACtB,CAAAA,CAAEkB,KAAK,CAAA;AACpBG,YAAAA,OAAAA,CAAQC,IAAI,CAAC6B,WAAAA,CAAAA;AACb,YAAA,KAAK,MAAM5B,GAAAA,IAAOvB,CAAEwB,CAAAA,YAAY,CAAE;AAChCH,gBAAAA,OAAAA,CAAQC,IAAI,CAACC,GAAAA,CAAAA;AACf;YACA,MAAM6B,MAAAA,GAASpD,CAAEqD,CAAAA,YAAY,CAAChC,OAAAA,CAAAA;YAC9BA,OAAQQ,CAAAA,UAAU,CAAC,CAACC,EAAAA,GAAAA;gBAClB,MAAMC,MAAAA,GAAS7B,IAAI6B,MAAM;AACzBA,gBAAAA,MAAAA,CAAOI,gBAAgB,EAAA;gBACvB,IAAI;oBACFJ,MAAOuB,CAAAA,cAAc,CACnBF,MAAAA,CAAOG,WAAW,GAAGzB,GAAG0B,cAAc,CAAcJ,MAAOG,CAAAA,WAAW,CAAI,GAAA,IAAA,CAAA;AAE5ExB,oBAAAA,MAAAA,CAAO0B,WAAW,CAAC,IAAA,CAAA;AACnB1B,oBAAAA,MAAAA,CAAO2B,UAAU,CAAC,IAAA,CAAA;AAClB,oBAAA,IAAI,CAACC,YAAY,CAAC5B,MAAAA,EAAQD,EAAGG,CAAAA,UAAU,CAAYjC,CAAAA,CAAEkB,KAAK,CAAA,EAAGY,EAAGG,CAAAA,UAAU,CAAYkB,WAAAA,CAAAA,CAAAA;iBAC9E,QAAA;AACRpB,oBAAAA,MAAAA,CAAOM,eAAe,EAAA;AACxB;AACF,aAAA,CAAA;AACA,YAAA,OAAOe,OAAOQ,KAAK;AACrB,SAAA,CAAA;AACF;kDAEAC,MAAM3D,GAAgB,EAAE4D,iBAA4B,EAAEC,kBAA6B,EAAEC,WAAoB,EAAE;QACzG,MAAMjC,MAAAA,GAAS7B,IAAI6B,MAAM;AACzB,QAAA,MAAMkC,qBAAkC,EAAE;QAC1C,IAAI,CAAC/B,QAAQ,CAACH,MAAQ+B,EAAAA,iBAAAA,CAAAA;AACtB/B,QAAAA,MAAAA,CAAOI,gBAAgB,EAAA;AACvB,QAAA,MAAMtB,IAAIP,IAAKC,CAAAA,GAAG,CAACuD,iBAAkBtD,CAAAA,KAAK,IAAI,CAAG,EAAA,CAAA,CAAA;AACjD,QAAA,MAAMM,IAAIR,IAAKC,CAAAA,GAAG,CAACuD,iBAAkBpD,CAAAA,MAAM,IAAI,CAAG,EAAA,CAAA,CAAA;QAClD,MAAMwD,QAAAA,GAAWnC,MAAOoC,CAAAA,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAON,iBAAkB3D,CAAAA,MAAM,EAAEU,CAAAA,EAAGC,CAAG,EAAA,KAAA,CAAA;AAC3F,QAAA,IAAI,CAACsB,SAAS,CAACL,MAAAA,EAAQ+B,iBAAmBI,EAAAA,QAAAA,CAAAA;AAC1C,QAAA,IAAI,CAACG,UAAU,CAACtC,MAAAA,EAAQmC,QAAUD,EAAAA,kBAAAA,CAAAA;QAClC,IAAI,CAACK,QAAQ,CAACvC,MAAQkC,EAAAA,kBAAAA,CAAAA;AACtBlC,QAAAA,MAAAA,CAAOM,eAAe,EAAA;AACtB,QAAA,IAAI,CAACsB,YAAY,CAAC5B,QAAQ+B,iBAAmBG,EAAAA,kBAAkB,CAAC,CAAE,CAAA,CAAA;QAClE,KAAK,MAAMM,OAAON,kBAAoB,CAAA;YACpClC,MAAOoC,CAAAA,IAAI,CAACK,cAAc,CAACD,GAAAA,CAAAA;AAC7B;QACAxC,MAAOoC,CAAAA,IAAI,CAACK,cAAc,CAACN,QAAAA,CAAAA;AAC7B;AACA,qBACA9B,SAAUL,CAAAA,MAAsB,EAAE0C,UAAqB,EAAEC,EAAa,EAAE;QACtE,IAAI,CAAC/F,eAAe,CAACgG,CAAC,GAAG,IAAI,CAAC5F,UAAU,GAAG,IAAI,CAACA,UAAU;AAC1D,QAAA,IAAI,CAACJ,eAAe,CAACiG,CAAC,GAAG,IAAI,CAACjG,eAAe,CAACgG,CAAC,GAAG,IAAI,CAAC3F,cAAc;QACrE,IAAI,CAACL,eAAe,CAACkG,CAAC,GAAG,IAAI,IAAI,CAAClG,eAAe,CAACiG,CAAC;AACnD,QAAA,IAAI,CAACjG,eAAe,CAACkC,CAAC,GAAG,IAAA,IAAQ,IAAI,CAAClC,eAAe,CAACiG,CAAC,GAAG,OAAM,CAAA;QAChE,IAAI,CAACjG,eAAe,CAACiG,CAAC,IAAI,IAAI,CAACjG,eAAe,CAACgG,CAAC;AAChD5C,QAAAA,MAAAA,CAAOuB,cAAc,CAAC;AAACoB,YAAAA;AAAG,SAAA,CAAA;AAC1B3C,QAAAA,MAAAA,CAAO0B,WAAW,CAAC,IAAA,CAAA;AACnB1B,QAAAA,MAAAA,CAAO2B,UAAU,CAAC,IAAA,CAAA;QAClB3B,MAAO+C,CAAAA,UAAU,CAAClH,KAAAA,CAAMQ,iBAAiB,CAAA;AACzC2D,QAAAA,MAAAA,CAAOgD,YAAY,CAAC,CAAGnH,EAAAA,KAAAA,CAAMc,mBAAmB,CAAA;AAChDd,QAAAA,KAAAA,CAAMc,mBAAmB,CAAEsG,UAAU,CAAC,KAAOP,EAAAA,UAAAA,CAAAA;QAC7C7G,KAAMc,CAAAA,mBAAmB,CAAEuG,QAAQ,CAAC,QAAQlD,MAAOmD,CAAAA,IAAI,KAAK,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAC3EtH,QAAAA,KAAAA,CAAMc,mBAAmB,CAAEuG,QAAQ,CAAC,WAAa,EAAA,IAAI,CAACtG,eAAe,CAAA;AACrE,QAAA,IAAI,CAACwG,kBAAkB,EAAA;AACzB;AACA,qBACAxB,YAAa5B,CAAAA,MAAsB,EAAE0C,UAAqB,EAAEW,YAAuB,EAAE;QACnFrD,MAAO+C,CAAAA,UAAU,CAAClH,KAAAA,CAAMO,oBAAoB,CAAA;AAC5C4D,QAAAA,MAAAA,CAAOgD,YAAY,CAAC,CAAGnH,EAAAA,KAAAA,CAAMa,sBAAsB,CAAA;AACnDb,QAAAA,KAAAA,CAAMa,sBAAsB,CAAEuG,UAAU,CAAC,QAAUP,EAAAA,UAAAA,CAAAA;AACnD7G,QAAAA,KAAAA,CAAMa,sBAAsB,CAAEuG,UAAU,CAAC,UAAYI,EAAAA,YAAAA,CAAAA;AACrDxH,QAAAA,KAAAA,CAAMa,sBAAsB,CAAEwG,QAAQ,CAAC,WAAa,EAAA,IAAI,CAAChG,UAAU,CAAA;AACnErB,QAAAA,KAAAA,CAAMa,sBAAsB,CAAEwG,QAAQ,CACpC,MACAlD,EAAAA,MAAAA,CAAOmD,IAAI,KAAK,QAAYnD,IAAAA,MAAAA,CAAOyB,cAAc,EAAA,GAAK,CAAI,GAAA,CAAA,CAAA;AAE5D,QAAA,IAAI,CAAC2B,kBAAkB,EAAA;AACzB;AACA,qBACAb,QAAAA,CAASvC,MAAsB,EAAEsD,QAAqB,EAAE;QACtD,IAAK,IAAI7C,IAAI6C,QAASpE,CAAAA,MAAM,GAAG,CAAGuB,EAAAA,CAAAA,IAAK,GAAGA,CAAK,EAAA,CAAA;YAC7C,IAAI,CAACU,YAAY,CAACnB,MAAQsD,EAAAA,QAAQ,CAAC7C,CAAAA,GAAI,CAAE,CAAA,EAAE6C,QAAQ,CAAC7C,CAAE,CAAA,CAAA;AACxD;AACF;qBAEA,YAAqBT,CAAAA,MAAsB,EAAE0C,UAAqB,EAAEa,UAAqB,EAAE;QACzFvD,MAAO+C,CAAAA,UAAU,CAAClH,KAAAA,CAAMM,gBAAgB,CAAA;AACxC6D,QAAAA,MAAAA,CAAOgD,YAAY,CAAC,CAAGnH,EAAAA,KAAAA,CAAMY,kBAAkB,CAAA;QAC/CZ,KAAMY,CAAAA,kBAAkB,CAAEyG,QAAQ,CAAC,QAAQlD,MAAOmD,CAAAA,IAAI,KAAK,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAC1EtH,QAAAA,KAAAA,CAAMY,kBAAkB,CAAEwG,UAAU,CAAC,KAAOP,EAAAA,UAAAA,CAAAA;AAC5C1C,QAAAA,MAAAA,CAAOuB,cAAc,CAAC;AAACgC,YAAAA;AAAW,SAAA,CAAA;AAClCvD,QAAAA,MAAAA,CAAO0B,WAAW,CAAC,IAAA,CAAA;AACnB1B,QAAAA,MAAAA,CAAO2B,UAAU,CAAC,IAAA,CAAA;AAClB,QAAA,IAAI,CAACyB,kBAAkB,CAACvH,KAAAA,CAAMS,oBAAoB,CAAA;AACpD;qBAEA,KAAc0D,CAAAA,MAAsB,EAAE0C,UAAqB,EAAEa,UAAqB,EAAE;QAClF,IAAI,CAAC1G,WAAW,CAAC2G,KAAK,CAAC,CAAId,GAAAA,UAAAA,CAAWjE,KAAK,EAAE,CAAIiE,GAAAA,UAAAA,CAAW/D,MAAM,CAAA;AAClEqB,QAAAA,MAAAA,CAAOuB,cAAc,CAAC;AAACgC,YAAAA;AAAW,SAAA,CAAA;AAClCvD,QAAAA,MAAAA,CAAO0B,WAAW,CAAC,IAAA,CAAA;AACnB1B,QAAAA,MAAAA,CAAO2B,UAAU,CAAC,IAAA,CAAA;QAClB3B,MAAO+C,CAAAA,UAAU,CAAClH,KAAAA,CAAMI,mBAAmB,CAAA;AAC3C+D,QAAAA,MAAAA,CAAOgD,YAAY,CAAC,CAAGnH,EAAAA,KAAAA,CAAMU,qBAAqB,CAAA;AAClDV,QAAAA,KAAAA,CAAMU,qBAAqB,CAAE0G,UAAU,CAAC,KAAOP,EAAAA,UAAAA,CAAAA;AAC/C7G,QAAAA,KAAAA,CAAMU,qBAAqB,CAAE2G,QAAQ,CAAC,YAAc,EAAA,IAAI,CAACrG,WAAW,CAAA;QACpEhB,KAAMU,CAAAA,qBAAqB,CAAE2G,QAAQ,CAAC,QAAQlD,MAAOmD,CAAAA,IAAI,KAAK,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAC7E,QAAA,IAAI,CAACC,kBAAkB,EAAA;AACzB;qBAEA,KAAcpD,CAAAA,MAAsB,EAAE0C,UAAqB,EAAEa,UAAqB,EAAE;QAClF,IAAI,CAAC1G,WAAW,CAAC2G,KAAK,CAAC,CAAId,GAAAA,UAAAA,CAAWjE,KAAK,EAAE,CAAIiE,GAAAA,UAAAA,CAAW/D,MAAM,CAAA;AAClEqB,QAAAA,MAAAA,CAAOuB,cAAc,CAAC;AAACgC,YAAAA;AAAW,SAAA,CAAA;AAClCvD,QAAAA,MAAAA,CAAO0B,WAAW,CAAC,IAAA,CAAA;AACnB1B,QAAAA,MAAAA,CAAO2B,UAAU,CAAC,IAAA,CAAA;QAClB3B,MAAO+C,CAAAA,UAAU,CAAClH,KAAAA,CAAMK,mBAAmB,CAAA;AAC3C8D,QAAAA,MAAAA,CAAOgD,YAAY,CAAC,CAAGnH,EAAAA,KAAAA,CAAMW,qBAAqB,CAAA;AAClDX,QAAAA,KAAAA,CAAMW,qBAAqB,CAAEyG,UAAU,CAAC,KAAOP,EAAAA,UAAAA,CAAAA;AAC/C7G,QAAAA,KAAAA,CAAMW,qBAAqB,CAAE0G,QAAQ,CAAC,YAAc,EAAA,IAAI,CAACrG,WAAW,CAAA;QACpEhB,KAAMW,CAAAA,qBAAqB,CAAE0G,QAAQ,CAAC,QAAQlD,MAAOmD,CAAAA,IAAI,KAAK,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAC7E,QAAA,IAAI,CAACC,kBAAkB,EAAA;AACzB;AACA,qBACAd,UAAWtC,CAAAA,MAAsB,EAAE+B,iBAA4B,EAAEuB,QAAqB,EAAE;AACtF,QAAA,MAAM1E,IAAIL,IAAKC,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAACzB,gBAAgB,CAAA;AAC3C,QAAA,IAAI+B,IAAIP,IAAKC,CAAAA,GAAG,CAACI,CAAGmD,EAAAA,iBAAAA,CAAkBtD,KAAK,IAAI,CAAA,CAAA;AAC/C,QAAA,IAAIM,IAAIR,IAAKC,CAAAA,GAAG,CAACI,CAAGmD,EAAAA,iBAAAA,CAAkBpD,MAAM,IAAI,CAAA,CAAA;AAChD,QAAA,IAAIK,YAAYT,IAAKC,CAAAA,GAAG,CAAC,IAAI,CAAC1B,oBAAoB,EAAE,CAAA,CAAA;AACpD,QAAA,IAAI2G,SAAY1B,GAAAA,iBAAAA;QAChB,MAAQjD,CAAAA,CAAKF,IAAAA,CAAAA,IAAKG,KAAKH,CAAAA,KAAMI,YAAY,CAAG,CAAA;YAC1C,MAAMwD,GAAAA,GAAMxC,MAAOoC,CAAAA,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAON,iBAAkB3D,CAAAA,MAAM,EAAEU,CAAAA,EAAGC,CAAG,EAAA,KAAA,CAAA;AACtFuE,YAAAA,QAAAA,CAASrE,IAAI,CAACuD,GAAAA,CAAAA;YAEd,MAAMkB,SAAAA,GAAY1D,MAAOoC,CAAAA,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAON,iBAAkB3D,CAAAA,MAAM,EAAEU,CAAAA,EAAGC,CAAG,EAAA,KAAA,CAAA;AAE5F,YAAA,IAAI,CAACgC,KAAK,CAACf,MAAAA,EAAQyD,SAAWC,EAAAA,SAAAA,CAAAA;AAC9B,YAAA,IAAI,CAAC1C,KAAK,CAAChB,MAAAA,EAAQ0D,SAAWlB,EAAAA,GAAAA,CAAAA;AAE9BxD,YAAAA,SAAAA,EAAAA;AACAF,YAAAA,CAAAA,GAAIP,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGM,CAAK,IAAA,CAAA,CAAA;AACrBC,YAAAA,CAAAA,GAAIR,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGO,CAAK,IAAA,CAAA,CAAA;YACrB0E,SAAYjB,GAAAA,GAAAA;YAEZxC,MAAOoC,CAAAA,IAAI,CAACK,cAAc,CAACiB,SAAAA,CAAAA;AAC7B;AACF;AACA,qBACA,QAAQvD,CAASH,MAAsB,EAAE2D,WAAsB,EAAE;QAC/D,IAAI,CAAC9H,KAAMO,CAAAA,oBAAoB,EAAE;AAC/BP,YAAAA,KAAAA,CAAMO,oBAAoB,GAAG4D,MAAO4D,CAAAA,kBAAkB,CAAC;AACrDC,gBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;AACP,oBAAA,IAAI,CAACC,IAAI,GAAGD,GAAGE,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;oBAC7B,IAAI,CAACC,OAAO,CAACC,GAAG,GAAGL,EAAGM,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAACC,QAAQ,CAACC,EAAE,GAAGT,GAAGM,IAAI,EAAA;AAC1BN,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGZ,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,CAAG,EAAA,CAAA,CAAA;wBACvD,IAAI,CAACG,QAAQ,CAACC,EAAE,GAAGT,EAAGc,CAAAA,GAAG,CAACd,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACX,OAAO,CAACC,GAAG,CAACW,EAAE,EAAE,GAAA,CAAA,EAAMhB,EAAGM,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAI,CAACW,GAAG,CAACjB,EAAGkB,CAAAA,QAAQ,CAAC,IAAI,CAACjB,IAAI,EAAE,CAAI,CAAA,EAAA,WAAA;AAClC,4BAAA,IAAI,CAACU,SAAS,CAACC,QAAQ,CAAC7B,CAAC,GAAGiB,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACR,SAAS,CAACC,QAAQ,CAAC7B,CAAC,CAAA;AAC9D,yBAAA,CAAA;AACF,qBAAA,CAAA;AACF,iBAAA;AACAqC,gBAAAA,QAAAA,CAAAA,CAASpB,EAAE,EAAA;AACT,oBAAA,IAAI,CAACqB,MAAM,GAAGrB,GAAGsB,KAAK,EAAA,CAAGnB,OAAO,CAAC,CAAA,CAAA;AACjC,oBAAA,IAAI,CAACoB,QAAQ,GAAGvB,GAAGsB,KAAK,EAAA,CAAGnB,OAAO,CAAC,CAAA,CAAA;AACnC,oBAAA,IAAI,CAACpG,SAAS,GAAGiG,GAAGwB,KAAK,EAAA,CAAGrB,OAAO,CAAC,CAAA,CAAA;AACpC,oBAAA,IAAI,CAACK,QAAQ,CAACiB,QAAQ,GAAGzB,GAAGa,IAAI,EAAA;AAChCb,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACgB,EAAE,CAACC,SAAS,GAAG3B,GAAG4B,kBAAkB,CAAC,IAAI,CAACP,MAAM,EAAE,IAAI,CAACjB,OAAO,CAACK,EAAE,EAAE,CAAA,CAAA;AACxE,wBAAA,IAAI,CAACiB,EAAE,CAACG,WAAW,GAAG7B,GAAG4B,kBAAkB,CAAC,IAAI,CAACL,QAAQ,EAAE,IAAI,CAACnB,OAAO,CAACK,EAAE,EAAE,CAAA,CAAA;;;;;;;AAO5E,wBAAA,IAAI,CAACiB,EAAE,CAAC7E,GAAG,GAAG,IAAI,CAACiF,OAAO,CACxB9B,EAAAA,CAAG+B,GAAG,CAAC/B,EAAAA,CAAGgC,QAAQ,CAAChC,GAAGiC,GAAG,CAAC,IAAI,CAACN,SAAS,CAACO,GAAG,CAAGlC,EAAAA,EAAAA,CAAGmC,IAAI,CAAC,IAAA,CAAA,CAAA,CAAA,EACvD,IAAI,CAACR,SAAS,CAACO,GAAG,EAClBlC,EAAAA,CAAGmC,IAAI,CAAC,CAAA,CAAA,CAAA;AAEV,wBAAA,IAAI,CAACT,EAAE,CAACU,KAAK,GAAG,IAAI,CAACN,OAAO,CAC1B9B,EAAAA,CAAG+B,GAAG,CAAC/B,EAAAA,CAAGgC,QAAQ,CAAChC,GAAGiC,GAAG,CAAC,IAAI,CAACJ,WAAW,CAACK,GAAG,CAAGlC,EAAAA,EAAAA,CAAGmC,IAAI,CAAC,IAAA,CAAA,CAAA,CAAA,EACzD,IAAI,CAACN,WAAW,CAACK,GAAG,EACpBlC,EAAAA,CAAGmC,IAAI,CAAC,CAAA,CAAA,CAAA;;AAGV,wBAAA,IAAI,CAACT,EAAE,CAACW,QAAQ,GAAGrC,EAAGsC,CAAAA,KAAK,CACzBtC,EAAAA,CAAGc,GAAG,CAAC,IAAI,CAACjE,GAAG,EAAEmD,EAAGe,CAAAA,GAAG,CAAC,IAAI,CAACqB,KAAK,EAAE,IAAI,CAACrI,SAAS,CAAA,CAAA,EAClDiG,EAAGmC,CAAAA,IAAI,CAAC,CACRnC,CAAAA,EAAAA,EAAAA,CAAGmC,IAAI,CAACpK,MAAMG,cAAc,CAAA,CAAA;wBAE9B,IAAI,CAACsI,QAAQ,CAACiB,QAAQ,GAAGzB,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAACwB,QAAQ,EAAE,CAAA,CAAA;AAClD,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACAtK,KAAMO,CAAAA,oBAAoB,CAACiK,IAAI,GAAG,qBAAA;YAClCxK,KAAMa,CAAAA,sBAAsB,GAAGsD,MAAAA,CAAOsG,eAAe,CAACzK,MAAMO,oBAAoB,CAACmK,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACtG;QACA,IAAI,CAAC1K,KAAMQ,CAAAA,iBAAiB,EAAE;AAC5BR,YAAAA,KAAAA,CAAMQ,iBAAiB,GAAG2D,MAAO4D,CAAAA,kBAAkB,CAAC;AAClDC,gBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;AACP,oBAAA,IAAI,CAACC,IAAI,GAAGD,GAAGE,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;oBAC7B,IAAI,CAACC,OAAO,CAACC,GAAG,GAAGL,EAAGM,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAACC,QAAQ,CAACC,EAAE,GAAGT,GAAGM,IAAI,EAAA;AAC1BN,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGZ,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,CAAG,EAAA,CAAA,CAAA;wBACvD,IAAI,CAACG,QAAQ,CAACC,EAAE,GAAGT,EAAGc,CAAAA,GAAG,CAACd,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACX,OAAO,CAACC,GAAG,CAACW,EAAE,EAAE,GAAA,CAAA,EAAMhB,EAAGM,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAI,CAACW,GAAG,CAACjB,EAAGkB,CAAAA,QAAQ,CAAC,IAAI,CAACjB,IAAI,EAAE,CAAI,CAAA,EAAA,WAAA;AAClC,4BAAA,IAAI,CAACU,SAAS,CAACC,QAAQ,CAAC7B,CAAC,GAAGiB,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACR,SAAS,CAACC,QAAQ,CAAC7B,CAAC,CAAA;AAC9D,yBAAA,CAAA;AACF,qBAAA,CAAA;AACF,iBAAA;AACAqC,gBAAAA,QAAAA,CAAAA,CAASpB,EAAE,EAAA;AACT,oBAAA,IAAI,CAACtB,GAAG,GAAGsB,GAAGsB,KAAK,EAAA,CAAGnB,OAAO,CAAC,CAAA,CAAA;AAC9B,oBAAA,IAAI,CAACtG,SAAS,GAAGmG,GAAGa,IAAI,EAAA,CAAGV,OAAO,CAAC,CAAA,CAAA;AACnC,oBAAA,IAAI,CAACK,QAAQ,CAACiB,QAAQ,GAAGzB,GAAGa,IAAI,EAAA;AAChCb,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACgB,EAAE,CAACgB,GAAG,GAAG1C,GAAG4B,kBAAkB,CAAC,IAAI,CAAClD,GAAG,EAAE,IAAI,CAAC0B,OAAO,CAACK,EAAE,EAAE,CAAA,CAAA;;;;;;;;;;;wBAW/D,IAAI,CAACiB,EAAE,CAACiB,MAAM,GAAG3C,EAAG+B,CAAAA,GAAG,CAAC/B,EAAAA,CAAGgC,QAAQ,CAAChC,GAAGiC,GAAG,CAAC,IAAI,CAACS,GAAG,CAACR,GAAG,CAAA,EAAGlC,EAAGmC,CAAAA,IAAI,CAAC,IAAA,CAAA,CAAA,CAAA;AAClE,wBAAA,IAAI,CAACT,EAAE,CAACkB,CAAC,GAAG,IAAI,CAACd,OAAO,CACtB,IAAI,CAACa,MAAM,EACX3C,EAAAA,CAAGsC,KAAK,CAAC,IAAI,CAACI,GAAG,CAACR,GAAG,EAAElC,EAAAA,CAAGmC,IAAI,CAAC,CAAA,CAAA,EAAInC,EAAGmC,CAAAA,IAAI,CAACpK,KAAMG,CAAAA,cAAc,CAC/D8H,CAAAA,EAAAA,EAAAA,CAAGmC,IAAI,CAAC,CAAA,CAAA,CAAA;wBAEV,IAAI,CAACT,EAAE,CAACmB,UAAU,GAAG7C,EAAGtF,CAAAA,GAAG,CAACsF,EAAAA,CAAGtF,GAAG,CAAC,IAAI,CAACkI,CAAC,CAACE,CAAC,EAAE,IAAI,CAACF,CAAC,CAACG,CAAC,CAAA,EAAG,IAAI,CAACH,CAAC,CAACI,CAAC,CAAA;wBAChE,IAAI,CAACtB,EAAE,CAACuB,IAAI,GAAGjD,EAAGsC,CAAAA,KAAK,CAACtC,EAAAA,CAAGc,GAAG,CAAC,IAAI,CAAC+B,UAAU,EAAE,IAAI,CAAChJ,SAAS,CAACkF,CAAC,CAAG,EAAA,CAAA,EAAG,IAAI,CAAClF,SAAS,CAACmF,CAAC,CAAA;AACtF,wBAAA,IAAI,CAACiE,IAAI,GAAGjD,GAAGe,GAAG,CAAC,IAAI,CAACkC,IAAI,EAAE,IAAI,CAACA,IAAI,EAAE,IAAI,CAACpJ,SAAS,CAACmB,CAAC,CAAA;AACzD,wBAAA,IAAI,CAAC0G,EAAE,CAACwB,OAAO,GAAGlD,EAAGmD,CAAAA,GAAG,CACtBnD,EAAAA,CAAGtF,GAAG,CAAC,IAAI,CAACuI,IAAI,EAAEjD,EAAGoD,CAAAA,GAAG,CAAC,IAAI,CAACP,UAAU,EAAE,IAAI,CAAChJ,SAAS,CAACiF,CAAC,CAAA,CAAA,EAC1DkB,GAAGtF,GAAG,CAAC,IAAI,CAACmI,UAAU,EAAE,OAAA,CAAA,CAAA;AAE1B,wBAAA,IAAI,CAACrC,QAAQ,CAACiB,QAAQ,GAAGzB,EAAAA,CAAGa,IAAI,CAACb,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAAC6B,CAAC,EAAE,IAAI,CAACM,OAAO,CAAG,EAAA,CAAA,CAAA;AACjE,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACAnL,KAAMQ,CAAAA,iBAAiB,CAACgK,IAAI,GAAG,kBAAA;YAC/BxK,KAAMc,CAAAA,mBAAmB,GAAGqD,MAAAA,CAAOsG,eAAe,CAACzK,MAAMQ,iBAAiB,CAACkK,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAChG;QACA,IAAI,CAAC1K,KAAMM,CAAAA,gBAAgB,EAAE;AAC3BN,YAAAA,KAAAA,CAAMM,gBAAgB,GAAG6D,MAAO4D,CAAAA,kBAAkB,CAAC;AACjDC,gBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;AACP,oBAAA,IAAI,CAACC,IAAI,GAAGD,GAAGE,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;oBAC7B,IAAI,CAACC,OAAO,CAACC,GAAG,GAAGL,EAAGM,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAACC,QAAQ,CAACC,EAAE,GAAGT,GAAGM,IAAI,EAAA;AAC1BN,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGZ,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,CAAG,EAAA,CAAA,CAAA;wBACvD,IAAI,CAACG,QAAQ,CAACC,EAAE,GAAGT,EAAGc,CAAAA,GAAG,CAACd,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACX,OAAO,CAACC,GAAG,CAACW,EAAE,EAAE,GAAA,CAAA,EAAMhB,EAAGM,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAI,CAACW,GAAG,CAACjB,EAAGkB,CAAAA,QAAQ,CAAC,IAAI,CAACjB,IAAI,EAAE,CAAI,CAAA,EAAA,WAAA;AAClC,4BAAA,IAAI,CAACU,SAAS,CAACC,QAAQ,CAAC7B,CAAC,GAAGiB,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACR,SAAS,CAACC,QAAQ,CAAC7B,CAAC,CAAA;AAC9D,yBAAA,CAAA;AACF,qBAAA,CAAA;AACF,iBAAA;AACAqC,gBAAAA,QAAAA,CAAAA,CAASpB,EAAE,EAAA;AACT,oBAAA,IAAI,CAACtB,GAAG,GAAGsB,GAAGsB,KAAK,EAAA,CAAGnB,OAAO,CAAC,CAAA,CAAA;AAC9B,oBAAA,IAAI,CAACK,QAAQ,CAACiB,QAAQ,GAAGzB,GAAGa,IAAI,EAAA;AAChCb,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACF,QAAQ,CAACiB,QAAQ,GAAGzB,GAAG4B,kBAAkB,CAAC,IAAI,CAAClD,GAAG,EAAE,IAAI,CAAC0B,OAAO,CAACK,EAAE,EAAE,CAAA,CAAA;AAC5E,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACA1I,KAAMM,CAAAA,gBAAgB,CAACkK,IAAI,GAAG,iBAAA;YAC9BxK,KAAMY,CAAAA,kBAAkB,GAAGuD,MAAAA,CAAOsG,eAAe,CAACzK,MAAMM,gBAAgB,CAACoK,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAC9F;QACA,IAAI,CAAC1K,KAAMI,CAAAA,mBAAmB,EAAE;AAC9B,YAAA,MAAMkL,OAAU,GAAA;gBAAC,EAAC;gBAAG,EAAC;gBAAG,EAAC;gBAAG,EAAC;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA;AAAE,aAAA;AAC/C,YAAA,MAAMC,OAAU,GAAA;AACd,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA,UAAA;AACpF,gBAAA;AACD,aAAA;AACDvL,YAAAA,KAAAA,CAAMI,mBAAmB,GAAG+D,MAAO4D,CAAAA,kBAAkB,CAAC;AACpDC,gBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;AACP,oBAAA,IAAI,CAACC,IAAI,GAAGD,GAAGE,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;oBAC7B,IAAI,CAACC,OAAO,CAACC,GAAG,GAAGL,EAAGM,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAACC,QAAQ,CAACC,EAAE,GAAGT,GAAGM,IAAI,EAAA;AAC1BN,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGZ,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,CAAG,EAAA,CAAA,CAAA;wBACvD,IAAI,CAACG,QAAQ,CAACC,EAAE,GAAGT,EAAGc,CAAAA,GAAG,CAACd,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACX,OAAO,CAACC,GAAG,CAACW,EAAE,EAAE,GAAA,CAAA,EAAMhB,EAAGM,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAI,CAACW,GAAG,CAACjB,EAAGkB,CAAAA,QAAQ,CAAC,IAAI,CAACjB,IAAI,EAAE,CAAI,CAAA,EAAA,WAAA;AAClC,4BAAA,IAAI,CAACU,SAAS,CAACC,QAAQ,CAAC7B,CAAC,GAAGiB,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACR,SAAS,CAACC,QAAQ,CAAC7B,CAAC,CAAA;AAC9D,yBAAA,CAAA;AACF,qBAAA,CAAA;AACF,iBAAA;AACAqC,gBAAAA,QAAAA,CAAAA,CAASpB,EAAE,EAAA;AACT,oBAAA,IAAI,CAACuD,UAAU,GAAGvD,GAAGM,IAAI,EAAA,CAAGH,OAAO,CAAC,CAAA,CAAA;AACpC,oBAAA,IAAI,CAACzB,GAAG,GAAGsB,GAAGsB,KAAK,EAAA,CAAGnB,OAAO,CAAC,CAAA,CAAA;AAC9B,oBAAA,IAAI,CAACK,QAAQ,CAACiB,QAAQ,GAAGzB,GAAGa,IAAI,EAAA;AAChCb,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACgB,EAAE,CAAC8B,GAAG,GAAGxD,EAAAA,CAAGmC,IAAI,CAAC,CAAA,CAAA;AACtB,wBAAA,IAAI,CAACT,EAAE,CAAC+B,MAAM,GAAGzD,GAAGwB,KAAK,EAAA;AACzB,wBAAA,IAAK,IAAI7E,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AAC1B,4BAAA,IAAI,CAAC8G,MAAM,GAAGzD,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACwC,UAAU,CAACzE,CAAC,EAAEuE,OAAO,CAAC1G,EAAE,GAAG,CAAA,CAAA;AACrD,4BAAA,IAAI,CAAC6G,GAAG,GAAGxD,GAAGc,GAAG,CACf,IAAI,CAAC0C,GAAG,EACRxD,EAAGe,CAAAA,GAAG,CACJf,EAAG4B,CAAAA,kBAAkB,CAAC,IAAI,CAAClD,GAAG,EAAEsB,EAAAA,CAAGc,GAAG,CAAC,IAAI,CAACV,OAAO,CAACK,EAAE,EAAET,GAAGM,IAAI,CAAC,IAAI,CAACmD,MAAM,EAAE,CAAK,CAAA,CAAA,EAAA,CAAA,CAAA,CAAGvB,GAAG,EACxFoB,OAAO,CAAC3G,CAAE,CAAA,CAAA,CAAA;AAGhB;wBACA,IAAI,CAAC6D,QAAQ,CAACiB,QAAQ,GAAGzB,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAAC2C,GAAG,EAAE,CAAA,CAAA;AAC7C,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACAzL,KAAMI,CAAAA,mBAAmB,CAACoK,IAAI,GAAG,oBAAA;YACjCxK,KAAMU,CAAAA,qBAAqB,GAAGyD,MAAAA,CAAOsG,eAAe,CAACzK,MAAMI,mBAAmB,CAACsK,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACpG;QACA,IAAI,CAAC1K,KAAMK,CAAAA,mBAAmB,EAAE;AAC9B,YAAA,MAAMiL,OAAU,GAAA;gBAAC,WAAC;gBAAY,WAAC;AAAY,gBAAA,GAAA;AAAK,gBAAA,UAAA;AAAY,gBAAA;AAAW,aAAA;AACvE,YAAA,MAAMC,OAAU,GAAA;AAAC,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA,UAAA;AAAY,gBAAA;AAAW,aAAA;AAC5EvL,YAAAA,KAAAA,CAAMK,mBAAmB,GAAG8D,MAAO4D,CAAAA,kBAAkB,CAAC;AACpDC,gBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;AACP,oBAAA,IAAI,CAACC,IAAI,GAAGD,GAAGE,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;oBAC7B,IAAI,CAACC,OAAO,CAACC,GAAG,GAAGL,EAAGM,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAACC,QAAQ,CAACC,EAAE,GAAGT,GAAGM,IAAI,EAAA;AAC1BN,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGZ,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,CAAG,EAAA,CAAA,CAAA;wBACvD,IAAI,CAACG,QAAQ,CAACC,EAAE,GAAGT,EAAGc,CAAAA,GAAG,CAACd,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACX,OAAO,CAACC,GAAG,CAACW,EAAE,EAAE,GAAA,CAAA,EAAMhB,EAAGM,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;wBACpE,IAAI,CAACW,GAAG,CAACjB,EAAGkB,CAAAA,QAAQ,CAAC,IAAI,CAACjB,IAAI,EAAE,CAAI,CAAA,EAAA,WAAA;AAClC,4BAAA,IAAI,CAACU,SAAS,CAACC,QAAQ,CAAC7B,CAAC,GAAGiB,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACR,SAAS,CAACC,QAAQ,CAAC7B,CAAC,CAAA;AAC9D,yBAAA,CAAA;AACF,qBAAA,CAAA;AACF,iBAAA;AACAqC,gBAAAA,QAAAA,CAAAA,CAASpB,EAAE,EAAA;AACT,oBAAA,IAAI,CAACuD,UAAU,GAAGvD,GAAGM,IAAI,EAAA,CAAGH,OAAO,CAAC,CAAA,CAAA;AACpC,oBAAA,IAAI,CAACzB,GAAG,GAAGsB,GAAGsB,KAAK,EAAA,CAAGnB,OAAO,CAAC,CAAA,CAAA;AAC9B,oBAAA,IAAI,CAACK,QAAQ,CAACiB,QAAQ,GAAGzB,GAAGa,IAAI,EAAA;AAChCb,oBAAAA,EAAAA,CAAGU,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACgB,EAAE,CAAC8B,GAAG,GAAGxD,EAAAA,CAAGmC,IAAI,CAAC,CAAA,CAAA;AACtB,wBAAA,IAAI,CAACT,EAAE,CAAC+B,MAAM,GAAGzD,GAAGwB,KAAK,EAAA;AACzB,wBAAA,IAAK,IAAI7E,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AAC1B,4BAAA,IAAI,CAAC8G,MAAM,GAAGzD,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACwC,UAAU,CAACxE,CAAC,EAAEsE,OAAO,CAAC1G,CAAE,CAAA,CAAA;AAClD,4BAAA,IAAI,CAAC6G,GAAG,GAAGxD,GAAGc,GAAG,CACf,IAAI,CAAC0C,GAAG,EACRxD,EAAGe,CAAAA,GAAG,CACJf,EAAG4B,CAAAA,kBAAkB,CAAC,IAAI,CAAClD,GAAG,EAAEsB,EAAAA,CAAGc,GAAG,CAAC,IAAI,CAACV,OAAO,CAACK,EAAE,EAAET,GAAGM,IAAI,CAAC,GAAG,IAAI,CAACmD,MAAM,CAAI,CAAA,EAAA,CAAA,CAAA,CAAGvB,GAAG,EACxFoB,OAAO,CAAC3G,CAAE,CAAA,CAAA,CAAA;AAGhB;wBACA,IAAI,CAAC6D,QAAQ,CAACiB,QAAQ,GAAGzB,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAAC2C,GAAG,EAAE,CAAA,CAAA;AAC7C,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACAzL,KAAMK,CAAAA,mBAAmB,CAACmK,IAAI,GAAG,oBAAA;YACjCxK,KAAMW,CAAAA,qBAAqB,GAAGwD,MAAAA,CAAOsG,eAAe,CAACzK,MAAMK,mBAAmB,CAACqK,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACpG;QACA,IAAI,CAAC1K,KAAMS,CAAAA,oBAAoB,EAAE;YAC/BT,KAAMS,CAAAA,oBAAoB,GAAG0D,MAAAA,CAAOwH,oBAAoB,EAAA;AACxD3L,YAAAA,KAAAA,CAAMS,oBAAoB,CAACmL,kBAAkB,EAAA,CAAGC,WAAW,CAAC,MAAA,CAAA;YAC5D7L,KAAMS,CAAAA,oBAAoB,CAACqL,aAAa,EAAA,CAAGC,UAAU,CAAC,KAAA,CAAA,CAAOC,WAAW,CAAC,KAAA,CAAA;AACzEhM,YAAAA,KAAAA,CAAMS,oBAAoB,CACvBwL,gBAAgB,EAAA,CAChBC,MAAM,CAAC,IACPC,CAAAA,CAAAA,eAAe,CAAC,KAAA,EAAO,KACvBC,CAAAA,CAAAA,iBAAiB,CAAC,KAAO,EAAA,MAAA,CAAA;AAC9B;AACF;AACF;;;;"}
1
+ {"version":3,"file":"bloom.js","sources":["../../src/posteffect/bloom.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet, Texture2D } from '@zephyr3d/device';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport type { PostEffectSetupContext } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\n\r\n/**\r\n * The bloom post effect\r\n * @public\r\n */\r\nexport class Bloom extends AbstractPostEffect {\r\n static readonly className = 'Bloom' as const;\r\n /** Largest finite IEEE-754 half-float value used by the HDR post-effect chain. */\r\n private static readonly HALF_FLOAT_MAX = 65504;\r\n private static _programDownsampleH: Nullable<GPUProgram> = null;\r\n private static _programDownsampleV: Nullable<GPUProgram> = null;\r\n private static _programUpsample: Nullable<GPUProgram> = null;\r\n private static _programFinalCompose: Nullable<GPUProgram> = null;\r\n private static _programPrefilter: Nullable<GPUProgram> = null;\r\n private static _renderStateAdditive: Nullable<RenderStateSet> = null;\r\n private static _bindgroupDownsampleH: Nullable<BindGroup> = null;\r\n private static _bindgroupDownsampleV: Nullable<BindGroup> = null;\r\n private static _bindgroupUpsample: Nullable<BindGroup> = null;\r\n private static _bindgroupFinalCompose: Nullable<BindGroup> = null;\r\n private static _bindgroupPrefilter: Nullable<BindGroup> = null;\r\n private readonly _thresholdValue: Vector4;\r\n private readonly _invTexSize: Vector2;\r\n private _maxDownsampleLevels: number;\r\n private _downsampleLimit: number;\r\n private _threshold: number;\r\n private _thresholdKnee: number;\r\n private _intensity: number;\r\n private _filterRadius: number;\r\n private _karisAverage: boolean;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n // End layer, so the pyramid is built from the TAA-resolved frame rather than the\r\n // jittered one (see Camera.setupPostEffects). Bloom does not read depth, so nothing\r\n // here depends on the transmission depth rewrite the transparent layer sits ahead of.\r\n this._layer = PostEffectLayer.end;\r\n this._thresholdValue = new Vector4();\r\n this._invTexSize = new Vector2();\r\n this._maxDownsampleLevels = 4;\r\n this._downsampleLimit = 32;\r\n this._threshold = 0.8;\r\n this._thresholdKnee = 0;\r\n this._intensity = 1;\r\n this._filterRadius = 1;\r\n this._karisAverage = true;\r\n }\r\n /** The maximum downsample levels */\r\n get maxDownsampleLevel() {\r\n return this._maxDownsampleLevels;\r\n }\r\n set maxDownsampleLevel(val) {\r\n this._maxDownsampleLevels = val;\r\n }\r\n /** Downsample resolution limitation */\r\n get downsampleLimit() {\r\n return this._downsampleLimit;\r\n }\r\n set downsampleLimit(val) {\r\n this._downsampleLimit = val;\r\n }\r\n /**\r\n * Luminance above which a pixel starts to bloom.\r\n *\r\n * @remarks\r\n * Compared against the value in the color buffer, whose meaning depends on the scene's lighting\r\n * mode -- the same number is a different physical brightness in each:\r\n *\r\n * - `legacy`: the buffer is display-referred, so the default 0.8 means \"near white\".\r\n * - `physical`: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to\r\n * `0.8 / cameraExposure` cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost\r\n * exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is\r\n * brighter than that, so only genuine emitters and specular highlights bloom.\r\n *\r\n * Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface\r\n * bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed\r\n * threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it\r\n * would on a real sensor.\r\n */\r\n get threshold() {\r\n return this._threshold;\r\n }\r\n set threshold(val) {\r\n this._threshold = val;\r\n }\r\n /** Bloom threshold knee */\r\n get thresholdKnee() {\r\n return this._thresholdKnee;\r\n }\r\n set thresholdKnee(val) {\r\n this._thresholdKnee = val;\r\n }\r\n /** Bloom intensity */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this._intensity = val;\r\n }\r\n /**\r\n * Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.\r\n *\r\n * @remarks\r\n * 1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each\r\n * level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the\r\n * three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to\r\n * remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky\r\n * banding returns.\r\n */\r\n get filterRadius() {\r\n return this._filterRadius;\r\n }\r\n set filterRadius(val) {\r\n this._filterRadius = Math.max(0, val);\r\n }\r\n /**\r\n * Whether the first downsample weights its taps by `1 / (1 + luma)` (the \"Karis average\").\r\n *\r\n * @remarks\r\n * Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel\r\n * dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on\r\n * NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo,\r\n * because the weighting deliberately holds the brightest samples back. Turn it off for a static\r\n * scene that wants maximum reach and has no high-frequency speculars to stabilize.\r\n */\r\n get karisAverage() {\r\n return this._karisAverage;\r\n }\r\n set karisAverage(val) {\r\n this._karisAverage = !!val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.setup}\r\n *\r\n * Native multi-pass implementation: prefilter, one pass per pyramid level\r\n * (separable blur), one additive upsample pass per level, and a final\r\n * compose pass. Pyramid sizes are computed at build time with the same math\r\n * as {@link Bloom.apply}, so both paths produce identical results.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n const { graph, ctx } = s;\r\n const format = s.colorFormat;\r\n // Mirror apply()'s runtime sizing math at build time.\r\n const prefilterWidth = Math.max(s.width >> 1, 1);\r\n const prefilterHeight = Math.max(s.height >> 1, 1);\r\n const t = Math.max(2, this._downsampleLimit);\r\n const levels: Array<{ width: number; height: number }> = [];\r\n {\r\n let w = Math.max(t, prefilterWidth >> 1);\r\n let h = Math.max(t, prefilterHeight >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n levels.push({ width: w, height: h });\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n }\r\n }\r\n if (levels.length === 0) {\r\n // Degenerate viewport: no pyramid possible, bloom contributes nothing.\r\n return s.input;\r\n }\r\n\r\n // 1. Prefilter (threshold/knee) at half resolution.\r\n const prefilterHandle = graph.addPass('Bloom:Prefilter', (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: prefilterWidth,\r\n height: prefilterHeight,\r\n label: 'Bloom:prefilter'\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n this._prepare(device, inputTexture);\r\n device.pushDeviceStates();\r\n try {\r\n this.prefilter(device, inputTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n\r\n // 2. Downsample pyramid: one pass per level (separable blur through a\r\n // pass-local intermediate texture).\r\n const levelHandles: RGHandle[] = [];\r\n let sourceHandle = prefilterHandle;\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i];\r\n const src = sourceHandle;\r\n const levelHandle = graph.addPass(`Bloom:Downsample${i}`, (builder) => {\r\n builder.read(src);\r\n const middle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}:middle`\r\n });\r\n const out = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: level.width,\r\n height: level.height,\r\n label: `Bloom:downsample${i}`\r\n });\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n const middleTexture = rg.getTexture<Texture2D>(middle);\r\n this.blurH(device, rg.getTexture<Texture2D>(src), middleTexture);\r\n this.blurV(device, middleTexture, rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n levelHandles.push(levelHandle);\r\n sourceHandle = levelHandle;\r\n }\r\n\r\n // 3. Upsample: additively blend each level into the level above (in-place\r\n // write, so each pass produces a new version of the target texture).\r\n for (let i = levels.length - 2; i >= 0; i--) {\r\n const src = levelHandles[i + 1];\r\n const dst = levelHandles[i];\r\n levelHandles[i] = graph.addPass(`Bloom:Upsample${i}`, (builder) => {\r\n builder.read(src);\r\n builder.read(dst);\r\n const out = builder.write(dst);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n this._prepare(device, rg.getTexture<Texture2D>(src));\r\n this.upsampleInto(device, rg.getTexture<Texture2D>(src), rg.getTexture<Texture2D>(out));\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return out;\r\n });\r\n }\r\n\r\n // 4. Compose: scene color + bloom * intensity.\r\n const bloomHandle = levelHandles[0];\r\n return graph.addPass('Bloom:Compose', (builder) => {\r\n builder.read(s.input);\r\n builder.read(bloomHandle);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n const output = s.createOutput(builder);\r\n builder.setExecute((rg) => {\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.finalCompose(\r\n device,\r\n rg.getTexture<Texture2D>(s.input),\r\n rg.getTexture<Texture2D>(bloomHandle),\r\n output.srgbOutput\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n const downsampleTextures: Texture2D[] = [];\r\n this._prepare(device, inputColorTexture);\r\n device.pushDeviceStates();\r\n const w = Math.max(inputColorTexture.width >> 1, 1);\r\n const h = Math.max(inputColorTexture.height >> 1, 1);\r\n const colorTex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n this.prefilter(device, inputColorTexture, colorTex);\r\n this.downsample(device, colorTex, downsampleTextures);\r\n this.upsample(device, downsampleTextures);\r\n device.popDeviceStates();\r\n this.finalCompose(device, inputColorTexture, downsampleTextures[0], srgbOutput);\r\n for (const tex of downsampleTextures) {\r\n device.pool.releaseTexture(tex);\r\n }\r\n device.pool.releaseTexture(colorTex);\r\n }\r\n /** @internal */\r\n prefilter(device: AbstractDevice, srcTexture: Texture2D, rt: Texture2D) {\r\n this._thresholdValue.x = this._threshold * this._threshold;\r\n this._thresholdValue.y = this._thresholdValue.x * this._thresholdKnee;\r\n this._thresholdValue.z = 2 * this._thresholdValue.y;\r\n this._thresholdValue.w = 0.25 / (this._thresholdValue.y + 0.00001);\r\n this._thresholdValue.y -= this._thresholdValue.x;\r\n device.setFramebuffer([rt]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programPrefilter);\r\n device.setBindGroup(0, Bloom._bindgroupPrefilter!);\r\n Bloom._bindgroupPrefilter!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupPrefilter!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupPrefilter!.setValue('threshold', this._thresholdValue);\r\n // Half-texel diagonals of the *source*, so each fetch lands on a 2x2 group boundary.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupPrefilter!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupPrefilter!.setValue('karis', this._karisAverage ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n finalCompose(device: AbstractDevice, srcTexture: Texture2D, bloomTexture: Texture2D, srgbOutput: boolean) {\r\n device.setProgram(Bloom._programFinalCompose);\r\n device.setBindGroup(0, Bloom._bindgroupFinalCompose!);\r\n Bloom._bindgroupFinalCompose!.setTexture('srcTex', srcTexture);\r\n Bloom._bindgroupFinalCompose!.setTexture('bloomTex', bloomTexture);\r\n Bloom._bindgroupFinalCompose!.setValue('intensity', this._intensity);\r\n // Legacy lighting puts Bloom last in the chain (see Camera.syncPostProcessingMode), so this\r\n // pass may be the one writing the sRGB screen. Without this the whole frame is handed to the\r\n // display scene-linear and everything darkens the moment bloom is switched on.\r\n Bloom._bindgroupFinalCompose!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n Bloom._bindgroupFinalCompose!.setValue(\r\n 'flip',\r\n device.type === 'webgpu' && device.getFramebuffer() ? 1 : 0\r\n );\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n upsample(device: AbstractDevice, textures: Texture2D[]) {\r\n for (let i = textures.length - 2; i >= 0; i--) {\r\n this.upsampleInto(device, textures[i + 1], textures[i]);\r\n }\r\n }\r\n /** @internal */\r\n private upsampleInto(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n device.setProgram(Bloom._programUpsample);\r\n device.setBindGroup(0, Bloom._bindgroupUpsample!);\r\n Bloom._bindgroupUpsample!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n Bloom._bindgroupUpsample!.setTexture('tex', srcTexture);\r\n // Tent offsets are in source-texel units, so the filter widens with the level it reads\r\n // from and every level contributes a similarly shaped blur in screen space.\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n Bloom._bindgroupUpsample!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupUpsample!.setValue('radius', this._filterRadius);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.drawFullscreenQuad(Bloom._renderStateAdditive!);\r\n }\r\n /** @internal */\r\n private blurH(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleH);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleH!);\r\n Bloom._bindgroupDownsampleH!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleH!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleH!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private blurV(device: AbstractDevice, srcTexture: Texture2D, dstTexture: Texture2D) {\r\n this._invTexSize.setXY(1 / srcTexture.width, 1 / srcTexture.height);\r\n device.setFramebuffer([dstTexture]);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(Bloom._programDownsampleV);\r\n device.setBindGroup(0, Bloom._bindgroupDownsampleV!);\r\n Bloom._bindgroupDownsampleV!.setTexture('tex', srcTexture);\r\n Bloom._bindgroupDownsampleV!.setValue('invTexSize', this._invTexSize);\r\n Bloom._bindgroupDownsampleV!.setValue('flip', device.type === 'webgpu' ? 1 : 0);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n downsample(device: AbstractDevice, inputColorTexture: Texture2D, textures: Texture2D[]) {\r\n const t = Math.max(2, this._downsampleLimit);\r\n let w = Math.max(t, inputColorTexture.width >> 1);\r\n let h = Math.max(t, inputColorTexture.height >> 1);\r\n let maxLevels = Math.max(this._maxDownsampleLevels, 1);\r\n let sourceTex = inputColorTexture;\r\n while ((w >= t || h >= t) && maxLevels > 0) {\r\n const tex = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n textures.push(tex);\r\n\r\n const texMiddle = device.pool.fetchTemporalTexture2D(false, inputColorTexture.format, w, h, false);\r\n\r\n this.blurH(device, sourceTex, texMiddle);\r\n this.blurV(device, texMiddle, tex);\r\n\r\n maxLevels--;\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n sourceTex = tex;\r\n\r\n device.pool.releaseTexture(texMiddle);\r\n }\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Bloom._programFinalCompose) {\r\n Bloom._programFinalCompose = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.bloomTex = pb.tex2D().uniform(0);\r\n this.intensity = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.srcSample = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.bloomSample = pb.textureSampleLevel(this.bloomTex, this.$inputs.uv, 0);\r\n // Both inputs are camera pre-exposed (~1.0), so no unit conversion is needed.\r\n //\r\n // Sanitize each input explicitly rather than relying on clamp() to absorb a NaN: for a\r\n // NaN operand clamp only yields 0 because max(NaN, 0) happens to return its second\r\n // argument on most hardware, which the spec does not require. The scene color reaches\r\n // this pass without going through the prefilter, so this is its only guard.\r\n this.$l.src = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.srcSample.rgb), pb.vec3(1e30))),\r\n this.srcSample.rgb,\r\n pb.vec3(0)\r\n );\r\n this.$l.bloom = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.bloomSample.rgb), pb.vec3(1e30))),\r\n this.bloomSample.rgb,\r\n pb.vec3(0)\r\n );\r\n // The clamp then only guards the half-float write against accumulated overshoot.\r\n this.$l.composed = pb.clamp(\r\n pb.add(this.src, pb.mul(this.bloom, this.intensity)),\r\n pb.vec3(0),\r\n pb.vec3(Bloom.HALF_FLOAT_MAX)\r\n );\r\n // Only when this pass writes the screen directly; intermediate targets stay linear.\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.composed = linearToGamma(this, pb.clamp(this.composed, pb.vec3(0), pb.vec3(1)));\r\n });\r\n this.$outputs.outColor = pb.vec4(this.composed, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programFinalCompose.name = '@Bloom_FinalCompose';\r\n Bloom._bindgroupFinalCompose = device.createBindGroup(Bloom._programFinalCompose.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programPrefilter) {\r\n Bloom._programPrefilter = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.threshold = pb.vec4().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.karis = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // This pass is also the first (full -> half resolution) downsample, which is where the\r\n // Call of Duty presentation puts the Karis average: a lone very bright texel -- a\r\n // specular hit where a normal map happens to put NdotL near 1 -- otherwise dominates\r\n // its 2x2 group, and flickers violently as the surface moves. Weighting each tap by\r\n // 1/(1+luma) lets the group's dimmer texels hold that spike down.\r\n //\r\n // The four taps sit at half-texel diagonals so each bilinear fetch already averages a\r\n // 2x2 block of the source, giving 4 groups (16 source texels) for 4 fetches.\r\n this.$l.raw = pb.vec4(0);\r\n this.$if(pb.notEqual(this.karis, 0), function () {\r\n this.$l.o = pb.mul(this.invTexSize, 0.5);\r\n this.$l.acc = pb.vec3(0);\r\n this.$l.wsum = pb.float(0);\r\n const quad: [number, number][] = [\r\n [-1, -1],\r\n [1, -1],\r\n [-1, 1],\r\n [1, 1]\r\n ];\r\n for (const [dx, dy] of quad) {\r\n this.$l.s = pb.textureSampleLevel(\r\n this.tex,\r\n pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))),\r\n 0\r\n ).rgb;\r\n // Reject non-finite taps here too; see the guard below for why.\r\n this.s = this.$choice(\r\n pb.all(pb.lessThan(pb.abs(this.s), pb.vec3(1e30))),\r\n pb.clamp(this.s, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n // Karis weight uses perceived luminance, matching the original.\r\n this.$l.w = pb.div(1, pb.add(1, pb.dot(this.s, pb.vec3(0.2126, 0.7152, 0.0722))));\r\n this.acc = pb.add(this.acc, pb.mul(this.s, this.w));\r\n this.wsum = pb.add(this.wsum, this.w);\r\n }\r\n this.raw = pb.vec4(pb.div(this.acc, pb.max(this.wsum, 0.0001)), 1);\r\n }).$else(function () {\r\n this.raw = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\r\n });\r\n // Reject non-finite input before any arithmetic. An Inf makes the contribution below\r\n // evaluate Inf/Inf = NaN, and a NaN survives every subsequent operation: the separable\r\n // blur smears it across the coarsest mip and the upsample chain expands that single\r\n // texel into a 2^maxDownsampleLevels black block on screen.\r\n //\r\n // Non-finite samples are dropped rather than clamped. With CPU pre-exposure the HDR\r\n // target sits near 1.0, so an Inf/NaN here means an upstream pass (SSR, SSGI, TAA\r\n // reprojection) produced garbage; contributing nothing is the conservative choice and\r\n // matches how SSGI sanitizes its own ray payloads. Finite values are still clamped so\r\n // the additive upsample cannot overflow the half-float target either.\r\n this.$l.finite = pb.all(pb.lessThan(pb.abs(this.raw.rgb), pb.vec3(1e30)));\r\n this.$l.p = this.$choice(\r\n this.finite,\r\n pb.clamp(this.raw.rgb, pb.vec3(0), pb.vec3(Bloom.HALF_FLOAT_MAX)),\r\n pb.vec3(0)\r\n );\r\n this.$l.brightness = pb.max(pb.max(this.p.r, this.p.g), this.p.b);\r\n this.$l.soft = pb.clamp(pb.add(this.brightness, this.threshold.y), 0, this.threshold.z);\r\n this.soft = pb.mul(this.soft, this.soft, this.threshold.w);\r\n this.$l.contrib = pb.div(\r\n pb.max(this.soft, pb.sub(this.brightness, this.threshold.x)),\r\n pb.max(this.brightness, 0.00001)\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.p, this.contrib), 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programPrefilter.name = '@Bloom_Prefilter';\r\n Bloom._bindgroupPrefilter = device.createBindGroup(Bloom._programPrefilter.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programUpsample) {\r\n Bloom._programUpsample = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.tex = pb.tex2D().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.radius = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // 3x3 tent filter, the upsample kernel from \"Next Generation Post Processing in\r\n // Call of Duty: Advanced Warfare\". A bare bilinear tap here is what produced the\r\n // blocky halo: one coarse texel covers a large screen area, so the level's square\r\n // texel grid survives magnification and shows up as axis-aligned banding. The tent\r\n // weights (1 2 1 / 2 4 2 / 1 2 1) / 16 reconstruct a smooth ramp between texels.\r\n this.$l.o = pb.mul(this.invTexSize, this.radius);\r\n this.$l.sum = pb.vec3(0);\r\n const taps: [number, number, number][] = [\r\n [-1, -1, 1],\r\n [0, -1, 2],\r\n [1, -1, 1],\r\n [-1, 0, 2],\r\n [0, 0, 4],\r\n [1, 0, 2],\r\n [-1, 1, 1],\r\n [0, 1, 2],\r\n [1, 1, 1]\r\n ];\r\n for (const [dx, dy, w] of taps) {\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.mul(this.o, pb.vec2(dx, dy))), 0)\r\n .rgb,\r\n w / 16\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programUpsample.name = '@Bloom_Upsample';\r\n Bloom._bindgroupUpsample = device.createBindGroup(Bloom._programUpsample.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleH) {\r\n const offsets = [-4, -3, -2, -1, 0, 1, 2, 3, 4];\r\n const weights = [\r\n 0.01621622, 0.05405405, 0.12162162, 0.19459459, 0.22702703, 0.19459459, 0.12162162, 0.05405405,\r\n 0.01621622\r\n ];\r\n Bloom._programDownsampleH = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 9; i++) {\r\n this.offset = pb.mul(this.invTexSize.x, offsets[i] * 2);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(this.offset, 0)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleH.name = '@Bloom_DownsampleH';\r\n Bloom._bindgroupDownsampleH = device.createBindGroup(Bloom._programDownsampleH.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._programDownsampleV) {\r\n const offsets = [-3.23076923, -1.38461538, 0.0, 1.38461538, 3.23076923];\r\n const weights = [0.07027027, 0.31621622, 0.22702703, 0.31621622, 0.07027027];\r\n Bloom._programDownsampleV = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.offset = pb.float();\r\n for (let i = 0; i < 5; i++) {\r\n this.offset = pb.mul(this.invTexSize.y, offsets[i]);\r\n this.sum = pb.add(\r\n this.sum,\r\n pb.mul(\r\n pb.textureSampleLevel(this.tex, pb.add(this.$inputs.uv, pb.vec2(0, this.offset)), 0).rgb,\r\n weights[i]\r\n )\r\n );\r\n }\r\n this.$outputs.outColor = pb.vec4(this.sum, 1);\r\n });\r\n }\r\n })!;\r\n Bloom._programDownsampleV.name = '@Bloom_DownsampleV';\r\n Bloom._bindgroupDownsampleV = device.createBindGroup(Bloom._programDownsampleV.bindGroupLayouts[0]);\r\n }\r\n if (!Bloom._renderStateAdditive) {\r\n Bloom._renderStateAdditive = device.createRenderStateSet();\r\n Bloom._renderStateAdditive.useRasterizerState().setCullMode('none');\r\n Bloom._renderStateAdditive.useDepthState().enableTest(false).enableWrite(false);\r\n Bloom._renderStateAdditive\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('one', 'zero');\r\n }\r\n }\r\n}\r\n"],"names":["Bloom","AbstractPostEffect","className","HALF_FLOAT_MAX","_programDownsampleH","_programDownsampleV","_programUpsample","_programFinalCompose","_programPrefilter","_renderStateAdditive","_bindgroupDownsampleH","_bindgroupDownsampleV","_bindgroupUpsample","_bindgroupFinalCompose","_bindgroupPrefilter","_thresholdValue","_invTexSize","_maxDownsampleLevels","_downsampleLimit","_threshold","_thresholdKnee","_intensity","_filterRadius","_karisAverage","_layer","PostEffectLayer","end","Vector4","Vector2","maxDownsampleLevel","val","downsampleLimit","threshold","thresholdKnee","intensity","filterRadius","Math","max","karisAverage","requireLinearDepthTexture","requireDepthAttachment","setup","s","graph","ctx","format","colorFormat","prefilterWidth","width","prefilterHeight","height","t","levels","w","h","maxLevels","push","length","input","prefilterHandle","addPass","builder","read","dep","dependencies","out","createTexture","sizeMode","label","setExecute","rg","device","inputTexture","getTexture","_prepare","pushDeviceStates","prefilter","popDeviceStates","levelHandles","sourceHandle","i","level","src","levelHandle","middle","middleTexture","blurH","blurV","dst","write","upsampleInto","bloomHandle","output","createOutput","setFramebuffer","framebuffer","getFramebuffer","setViewport","setScissor","finalCompose","srgbOutput","color","apply","inputColorTexture","_sceneDepthTexture","downsampleTextures","colorTex","pool","fetchTemporalTexture2D","downsample","upsample","tex","releaseTexture","srcTexture","rt","x","y","z","setProgram","setBindGroup","setTexture","setValue","type","setXY","drawFullscreenQuad","bloomTexture","textures","dstTexture","sourceTex","texMiddle","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","neg","fragment","srcTex","tex2D","bloomTex","float","srgbOut","outColor","$l","srcSample","textureSampleLevel","bloomSample","$choice","all","lessThan","abs","rgb","vec3","bloom","composed","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts","invTexSize","karis","raw","o","acc","wsum","quad","dx","dy","div","dot","$else","finite","p","brightness","r","g","b","soft","contrib","sub","radius","sum","taps","offsets","weights","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":"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"}
@@ -18,7 +18,8 @@ import { fetchSampler } from '../utility/misc.js';
18
18
  * Creates an instance of color adjust post effect.
19
19
  */ constructor(){
20
20
  super();
21
- this._layer = PostEffectLayer.transparent;
21
+ // End layer: the display chain runs after the TAA resolve (see Camera.setupPostEffects).
22
+ this._layer = PostEffectLayer.end;
22
23
  this._invTexSize = new Vector2();
23
24
  this._saturation = 1;
24
25
  this._contrast = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"coloradjust.js","sources":["../../src/posteffect/coloradjust.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2 } from '@zephyr3d/base';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { AbstractDevice, BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\n/**\r\n * Color adjustment post effect with optional sharpen.\r\n * @public\r\n */\r\nexport class ColorAdjust extends AbstractPostEffect {\r\n private static _program: Nullable<GPUProgram> = null;\r\n private static _bindgroup: Nullable<BindGroup> = null;\r\n private readonly _invTexSize: Vector2;\r\n private _saturation: number;\r\n private _contrast: number;\r\n private _hue: number;\r\n private _sharpen: number;\r\n /**\r\n * Creates an instance of color adjust post effect.\r\n */\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.transparent;\r\n this._invTexSize = new Vector2();\r\n this._saturation = 1;\r\n this._contrast = 1;\r\n this._hue = 0;\r\n this._sharpen = 0;\r\n }\r\n /** Saturation multiplier, 1 means unchanged. */\r\n get saturation() {\r\n return this._saturation;\r\n }\r\n set saturation(val: number) {\r\n this._saturation = val;\r\n }\r\n /** Contrast multiplier, 1 means unchanged. */\r\n get contrast() {\r\n return this._contrast;\r\n }\r\n set contrast(val: number) {\r\n this._contrast = val;\r\n }\r\n /** Hue rotation in degrees. */\r\n get hue() {\r\n return this._hue;\r\n }\r\n set hue(val: number) {\r\n this._hue = val;\r\n }\r\n /** Sharpen amount, 0 means disabled. */\r\n get sharpen() {\r\n return this._sharpen;\r\n }\r\n set sharpen(val: number) {\r\n this._sharpen = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n try {\r\n this._prepare(device);\r\n } catch (err) {\r\n console.error(err);\r\n // Fail-safe: if shader compilation fails, disable this effect and pass through\r\n // so the editor/render loop keeps running.\r\n this.enabled = false;\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n return;\r\n }\r\n this._invTexSize.setXY(1 / inputColorTexture.width, 1 / inputColorTexture.height);\r\n ColorAdjust._bindgroup!.setTexture('srcTex', inputColorTexture, fetchSampler('clamp_linear_nomip'));\r\n ColorAdjust._bindgroup!.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n ColorAdjust._bindgroup!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n ColorAdjust._bindgroup!.setValue('invTexSize', this._invTexSize);\r\n ColorAdjust._bindgroup!.setValue('saturation', this._saturation);\r\n ColorAdjust._bindgroup!.setValue('contrast', this._contrast);\r\n ColorAdjust._bindgroup!.setValue('hue', (this._hue * Math.PI) / 180);\r\n ColorAdjust._bindgroup!.setValue('sharpen', this._sharpen);\r\n device.setProgram(ColorAdjust._program);\r\n device.setBindGroup(0, ColorAdjust._bindgroup!);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice) {\r\n if (!ColorAdjust._program) {\r\n ColorAdjust._program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.saturation = pb.float().uniform(0);\r\n this.contrast = pb.float().uniform(0);\r\n this.hue = pb.float().uniform(0);\r\n this.sharpen = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sample0 = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.color3 = this.sample0.rgb;\r\n this.$l.alpha = this.sample0.a;\r\n\r\n this.$if(pb.greaterThan(this.sharpen, 0), function () {\r\n this.$l.north = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(0, -1), this.invTexSize)),\r\n 0\r\n ).rgb;\r\n this.$l.south = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(0, 1), this.invTexSize)),\r\n 0\r\n ).rgb;\r\n this.$l.west = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(-1, 0), this.invTexSize)),\r\n 0\r\n ).rgb;\r\n this.$l.east = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(1, 0), this.invTexSize)),\r\n 0\r\n ).rgb;\r\n this.$l.lap = pb.sub(\r\n pb.mul(this.color3, 4),\r\n pb.add(pb.add(this.north, this.south), pb.add(this.west, this.east))\r\n );\r\n this.color3 = pb.add(this.color3, pb.mul(this.lap, this.sharpen));\r\n });\r\n\r\n this.$l.luma = pb.dot(this.color3, pb.vec3(0.299, 0.587, 0.114));\r\n this.color3 = pb.mix(pb.vec3(this.luma), this.color3, this.saturation);\r\n this.color3 = pb.add(pb.mul(pb.sub(this.color3, pb.vec3(0.5)), this.contrast), pb.vec3(0.5));\r\n\r\n this.$l.cosHue = pb.cos(this.hue);\r\n this.$l.sinHue = pb.sin(this.hue);\r\n this.$l.r = pb.dot(\r\n this.color3,\r\n pb.vec3(\r\n pb.add(pb.add(0.299, pb.mul(0.701, this.cosHue)), pb.mul(0.168, this.sinHue)),\r\n pb.add(pb.sub(0.587, pb.mul(0.587, this.cosHue)), pb.mul(0.33, this.sinHue)),\r\n pb.sub(pb.sub(0.114, pb.mul(0.114, this.cosHue)), pb.mul(0.497, this.sinHue))\r\n )\r\n );\r\n this.$l.g = pb.dot(\r\n this.color3,\r\n pb.vec3(\r\n pb.sub(pb.sub(0.299, pb.mul(0.299, this.cosHue)), pb.mul(0.328, this.sinHue)),\r\n pb.add(pb.add(0.587, pb.mul(0.413, this.cosHue)), pb.mul(0.035, this.sinHue)),\r\n pb.add(pb.sub(0.114, pb.mul(0.114, this.cosHue)), pb.mul(0.292, this.sinHue))\r\n )\r\n );\r\n this.$l.b = pb.dot(\r\n this.color3,\r\n pb.vec3(\r\n pb.add(pb.sub(0.299, pb.mul(0.3, this.cosHue)), pb.mul(1.25, this.sinHue)),\r\n pb.sub(pb.sub(0.587, pb.mul(0.588, this.cosHue)), pb.mul(1.05, this.sinHue)),\r\n pb.sub(pb.add(0.114, pb.mul(0.886, this.cosHue)), pb.mul(0.203, this.sinHue))\r\n )\r\n );\r\n\r\n this.$l.result = pb.clamp(pb.vec3(this.r, this.g, this.b), pb.vec3(0), pb.vec3(1));\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.result = linearToGamma(this, this.result);\r\n });\r\n this.$outputs.outColor = pb.vec4(this.result, this.alpha);\r\n });\r\n }\r\n });\r\n if (!ColorAdjust._program) {\r\n throw new Error('ColorAdjust: failed to build GPU program');\r\n }\r\n ColorAdjust._program.name = '@ColorAdjust';\r\n ColorAdjust._bindgroup = device.createBindGroup(ColorAdjust._program.bindGroupLayouts[0]);\r\n }\r\n }\r\n}\r\n"],"names":["ColorAdjust","AbstractPostEffect","_program","_bindgroup","_invTexSize","_saturation","_contrast","_hue","_sharpen","_layer","PostEffectLayer","transparent","Vector2","saturation","val","contrast","hue","sharpen","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","_sceneDepthTexture","srgbOutput","device","_prepare","err","console","error","enabled","passThrough","setXY","width","height","setTexture","fetchSampler","setValue","needFlip","Math","PI","setProgram","setBindGroup","drawFullscreenQuad","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","srcTex","tex2D","srgbOut","invTexSize","float","outColor","$l","sample0","textureSampleLevel","color3","rgb","alpha","a","greaterThan","north","south","west","east","lap","sub","luma","dot","vec3","mix","cosHue","cos","sinHue","sin","r","g","b","result","clamp","linearToGamma","Error","name","createBindGroup","bindGroupLayouts"],"mappings":"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"}
1
+ {"version":3,"file":"coloradjust.js","sources":["../../src/posteffect/coloradjust.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector2 } from '@zephyr3d/base';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { AbstractDevice, BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\n/**\r\n * Color adjustment post effect with optional sharpen.\r\n * @public\r\n */\r\nexport class ColorAdjust extends AbstractPostEffect {\r\n private static _program: Nullable<GPUProgram> = null;\r\n private static _bindgroup: Nullable<BindGroup> = null;\r\n private readonly _invTexSize: Vector2;\r\n private _saturation: number;\r\n private _contrast: number;\r\n private _hue: number;\r\n private _sharpen: number;\r\n /**\r\n * Creates an instance of color adjust post effect.\r\n */\r\n constructor() {\r\n super();\r\n // End layer: the display chain runs after the TAA resolve (see Camera.setupPostEffects).\r\n this._layer = PostEffectLayer.end;\r\n this._invTexSize = new Vector2();\r\n this._saturation = 1;\r\n this._contrast = 1;\r\n this._hue = 0;\r\n this._sharpen = 0;\r\n }\r\n /** Saturation multiplier, 1 means unchanged. */\r\n get saturation() {\r\n return this._saturation;\r\n }\r\n set saturation(val: number) {\r\n this._saturation = val;\r\n }\r\n /** Contrast multiplier, 1 means unchanged. */\r\n get contrast() {\r\n return this._contrast;\r\n }\r\n set contrast(val: number) {\r\n this._contrast = val;\r\n }\r\n /** Hue rotation in degrees. */\r\n get hue() {\r\n return this._hue;\r\n }\r\n set hue(val: number) {\r\n this._hue = val;\r\n }\r\n /** Sharpen amount, 0 means disabled. */\r\n get sharpen() {\r\n return this._sharpen;\r\n }\r\n set sharpen(val: number) {\r\n this._sharpen = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, _sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n try {\r\n this._prepare(device);\r\n } catch (err) {\r\n console.error(err);\r\n // Fail-safe: if shader compilation fails, disable this effect and pass through\r\n // so the editor/render loop keeps running.\r\n this.enabled = false;\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n return;\r\n }\r\n this._invTexSize.setXY(1 / inputColorTexture.width, 1 / inputColorTexture.height);\r\n ColorAdjust._bindgroup!.setTexture('srcTex', inputColorTexture, fetchSampler('clamp_linear_nomip'));\r\n ColorAdjust._bindgroup!.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n ColorAdjust._bindgroup!.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n ColorAdjust._bindgroup!.setValue('invTexSize', this._invTexSize);\r\n ColorAdjust._bindgroup!.setValue('saturation', this._saturation);\r\n ColorAdjust._bindgroup!.setValue('contrast', this._contrast);\r\n ColorAdjust._bindgroup!.setValue('hue', (this._hue * Math.PI) / 180);\r\n ColorAdjust._bindgroup!.setValue('sharpen', this._sharpen);\r\n device.setProgram(ColorAdjust._program);\r\n device.setBindGroup(0, ColorAdjust._bindgroup!);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice) {\r\n if (!ColorAdjust._program) {\r\n ColorAdjust._program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.invTexSize = pb.vec2().uniform(0);\r\n this.saturation = pb.float().uniform(0);\r\n this.contrast = pb.float().uniform(0);\r\n this.hue = pb.float().uniform(0);\r\n this.sharpen = pb.float().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.sample0 = pb.textureSampleLevel(this.srcTex, this.$inputs.uv, 0);\r\n this.$l.color3 = this.sample0.rgb;\r\n this.$l.alpha = this.sample0.a;\r\n\r\n this.$if(pb.greaterThan(this.sharpen, 0), function () {\r\n this.$l.north = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(0, -1), this.invTexSize)),\r\n 0\r\n ).rgb;\r\n this.$l.south = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(0, 1), this.invTexSize)),\r\n 0\r\n ).rgb;\r\n this.$l.west = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(-1, 0), this.invTexSize)),\r\n 0\r\n ).rgb;\r\n this.$l.east = pb.textureSampleLevel(\r\n this.srcTex,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(1, 0), this.invTexSize)),\r\n 0\r\n ).rgb;\r\n this.$l.lap = pb.sub(\r\n pb.mul(this.color3, 4),\r\n pb.add(pb.add(this.north, this.south), pb.add(this.west, this.east))\r\n );\r\n this.color3 = pb.add(this.color3, pb.mul(this.lap, this.sharpen));\r\n });\r\n\r\n this.$l.luma = pb.dot(this.color3, pb.vec3(0.299, 0.587, 0.114));\r\n this.color3 = pb.mix(pb.vec3(this.luma), this.color3, this.saturation);\r\n this.color3 = pb.add(pb.mul(pb.sub(this.color3, pb.vec3(0.5)), this.contrast), pb.vec3(0.5));\r\n\r\n this.$l.cosHue = pb.cos(this.hue);\r\n this.$l.sinHue = pb.sin(this.hue);\r\n this.$l.r = pb.dot(\r\n this.color3,\r\n pb.vec3(\r\n pb.add(pb.add(0.299, pb.mul(0.701, this.cosHue)), pb.mul(0.168, this.sinHue)),\r\n pb.add(pb.sub(0.587, pb.mul(0.587, this.cosHue)), pb.mul(0.33, this.sinHue)),\r\n pb.sub(pb.sub(0.114, pb.mul(0.114, this.cosHue)), pb.mul(0.497, this.sinHue))\r\n )\r\n );\r\n this.$l.g = pb.dot(\r\n this.color3,\r\n pb.vec3(\r\n pb.sub(pb.sub(0.299, pb.mul(0.299, this.cosHue)), pb.mul(0.328, this.sinHue)),\r\n pb.add(pb.add(0.587, pb.mul(0.413, this.cosHue)), pb.mul(0.035, this.sinHue)),\r\n pb.add(pb.sub(0.114, pb.mul(0.114, this.cosHue)), pb.mul(0.292, this.sinHue))\r\n )\r\n );\r\n this.$l.b = pb.dot(\r\n this.color3,\r\n pb.vec3(\r\n pb.add(pb.sub(0.299, pb.mul(0.3, this.cosHue)), pb.mul(1.25, this.sinHue)),\r\n pb.sub(pb.sub(0.587, pb.mul(0.588, this.cosHue)), pb.mul(1.05, this.sinHue)),\r\n pb.sub(pb.add(0.114, pb.mul(0.886, this.cosHue)), pb.mul(0.203, this.sinHue))\r\n )\r\n );\r\n\r\n this.$l.result = pb.clamp(pb.vec3(this.r, this.g, this.b), pb.vec3(0), pb.vec3(1));\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.result = linearToGamma(this, this.result);\r\n });\r\n this.$outputs.outColor = pb.vec4(this.result, this.alpha);\r\n });\r\n }\r\n });\r\n if (!ColorAdjust._program) {\r\n throw new Error('ColorAdjust: failed to build GPU program');\r\n }\r\n ColorAdjust._program.name = '@ColorAdjust';\r\n ColorAdjust._bindgroup = device.createBindGroup(ColorAdjust._program.bindGroupLayouts[0]);\r\n }\r\n }\r\n}\r\n"],"names":["ColorAdjust","AbstractPostEffect","_program","_bindgroup","_invTexSize","_saturation","_contrast","_hue","_sharpen","_layer","PostEffectLayer","end","Vector2","saturation","val","contrast","hue","sharpen","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","_sceneDepthTexture","srgbOutput","device","_prepare","err","console","error","enabled","passThrough","setXY","width","height","setTexture","fetchSampler","setValue","needFlip","Math","PI","setProgram","setBindGroup","drawFullscreenQuad","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","srcTex","tex2D","srgbOut","invTexSize","float","outColor","$l","sample0","textureSampleLevel","color3","rgb","alpha","a","greaterThan","north","south","west","east","lap","sub","luma","dot","vec3","mix","cosHue","cos","sinHue","sin","r","g","b","result","clamp","linearToGamma","Error","name","createBindGroup","bindGroupLayouts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compositor.js","sources":["../../src/posteffect/compositor.ts"],"sourcesContent":["import type { DrawContext } from '../render';\r\nimport type { Texture2D, TextureFormat } from '@zephyr3d/device';\r\nimport type { AbstractPostEffect, PostEffectHistoryRead, PostEffectSetupContext } from './posteffect';\r\nimport { PostEffectLayer } from './posteffect';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport type { RenderGraph } from '../render/rendergraph/rendergraph';\r\nimport type { RGHandle } from '../render/rendergraph/types';\r\nimport type { RGBlackboard } from '../render/rendergraph/blackboard';\r\nimport type { HistoryResourceManager } from '../render/rendergraph/history_resource_manager';\r\nimport type { FrameResourceRequirements } from '../render/rendergraph/frame_resource_requirements';\r\nimport { mergeFrameResourceRequirements } from '../render/rendergraph/frame_resource_requirements';\r\n\r\n/**\r\n * Options for building a post effect layer as render graph passes.\r\n * @public\r\n */\r\nexport interface CompositorBuildLayerOptions {\r\n /** The render graph being built. */\r\n graph: RenderGraph;\r\n /** Frame draw context. */\r\n ctx: DrawContext;\r\n /** The layer to build. */\r\n layer: PostEffectLayer;\r\n /** Named frame resources. */\r\n blackboard: RGBlackboard;\r\n /** Chain input color handle. */\r\n input: RGHandle;\r\n /**\r\n * Direct final target for the last effect of the chain, or null to always\r\n * end the chain in an intermediate texture. Pass the imported backbuffer\r\n * handle together with isScreen=false when rendering into a framebuffer,\r\n * or isScreen=true when the final target is the device default framebuffer.\r\n */\r\n finalOutput?: Nullable<{ handle: RGHandle; isScreen: boolean }>;\r\n /**\r\n * True when the chain input physically resides in the final target (final\r\n * framebuffer used as scene intermediate). An effect whose input is the\r\n * final target must never direct-write it — sampling and rendering the same\r\n * texture in one pass is a feedback loop.\r\n */\r\n inputResidesInFinalTarget?: boolean;\r\n /**\r\n * Depth attachment for intermediate effect outputs that request one:\r\n * either a graph texture handle or a backend depth texture.\r\n */\r\n sceneDepthAttachment?: unknown;\r\n /** Ordering/lifetime dependencies declared by every effect pass. */\r\n dependencies?: RGHandle[];\r\n /** History bindings kept in a read scope while effects execute. */\r\n historyReads?: PostEffectHistoryRead[];\r\n /** Cross-frame history resource manager. */\r\n history?: Nullable<HistoryResourceManager<Texture2D>>;\r\n}\r\n\r\n/**\r\n * Result of {@link Compositor.buildLayer}.\r\n * @public\r\n */\r\nexport interface CompositorBuildLayerResult {\r\n /** Chain output color handle. Equals the input when no effect is enabled. */\r\n color: RGHandle;\r\n /** True when the last effect wrote the final target directly. */\r\n wroteFinal: boolean;\r\n}\r\n\r\n/**\r\n * Post processing compositor\r\n * @public\r\n */\r\nexport class Compositor {\r\n /** @internal */\r\n protected _postEffects: DRef<AbstractPostEffect>[][];\r\n /**\r\n * Creates an instance of Compositor\r\n */\r\n constructor() {\r\n this._postEffects = [];\r\n this._postEffects[PostEffectLayer.opaque] = [];\r\n this._postEffects[PostEffectLayer.transparent] = [];\r\n this._postEffects[PostEffectLayer.end] = [];\r\n }\r\n /** @internal */\r\n layerHasEnabledEffect(layer: PostEffectLayer): boolean {\r\n return this._postEffects[layer].some((ref) => !!ref.get()?.enabled);\r\n }\r\n /** Collect semantic frame resources requested by every enabled effect. @internal */\r\n collectRequirements(ctx: DrawContext): FrameResourceRequirements {\r\n const requirements: FrameResourceRequirements = {};\r\n for (const layer of this._postEffects) {\r\n for (const ref of layer) {\r\n const effect = ref.get();\r\n if (effect?.enabled) {\r\n mergeFrameResourceRequirements(requirements, effect.getFrameResourceRequirements(ctx));\r\n }\r\n }\r\n }\r\n return requirements;\r\n }\r\n /** @internal */\r\n private getIntermediateFormat(ctx: DrawContext): TextureFormat {\r\n return ctx.camera.HDR && ctx.device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'rgba16f'\r\n : 'rgba8unorm';\r\n }\r\n /**\r\n * Build the enabled effects of a layer as render graph passes.\r\n *\r\n * Effects are chained through graph texture handles: each effect's setup()\r\n * declares its passes reading the previous output. Where each effect output\r\n * lands (intermediate texture or the final target) is decided here through\r\n * the {@link PostEffectSetupContext.createOutput} implementation, so effect\r\n * code never handles final-target selection.\r\n *\r\n * @param options - Build inputs.\r\n * @returns The chain output handle and whether the final target was written directly.\r\n */\r\n buildLayer(options: CompositorBuildLayerOptions): CompositorBuildLayerResult {\r\n const { graph, ctx, layer, blackboard, input } = options;\r\n const effects = this._postEffects[layer]\r\n .map((ref) => ref.get())\r\n .filter((effect): effect is AbstractPostEffect => !!effect && effect.enabled);\r\n if (effects.length === 0) {\r\n return { color: input, wroteFinal: false };\r\n }\r\n const colorFormat = this.getIntermediateFormat(ctx);\r\n const finalOutput = options.finalOutput ?? null;\r\n const history = options.history ?? null;\r\n const dependencies = options.dependencies ?? [];\r\n const historyReads = options.historyReads ?? [];\r\n const sceneDepthAttachment = options.sceneDepthAttachment ?? null;\r\n const inputResidesInFinalTarget = !!options.inputResidesInFinalTarget;\r\n const width = ctx.renderWidth;\r\n const height = ctx.renderHeight;\r\n let chain = input;\r\n let wroteFinal = false;\r\n for (let i = 0; i < effects.length; i++) {\r\n const effect = effects[i];\r\n const isLast = i === effects.length - 1;\r\n // An effect that samples the final target's texture must not render into\r\n // it in the same pass (feedback loop); force an intermediate output.\r\n const inputIsFinalTarget = inputResidesInFinalTarget && chain === input;\r\n const label = `PostEffect:${effect.constructor.name}`;\r\n const setupContext: PostEffectSetupContext = {\r\n graph,\r\n ctx,\r\n blackboard,\r\n input: chain,\r\n colorFormat,\r\n width,\r\n height,\r\n history,\r\n sceneDepthAttachment,\r\n dependencies,\r\n historyReads,\r\n createOutput(builder, opts) {\r\n const needDepthAttachment = !!opts?.needDepthAttachment;\r\n // Direct write to the final target is only allowed for the last effect\r\n // of the chain, only when the effect does not depth-test against\r\n // scene depth (the final target does not carry the scene depth\r\n // buffer), and only when the effect does not sample the final\r\n // target's own texture as its input.\r\n if (isLast && finalOutput && !needDepthAttachment && !inputIsFinalTarget) {\r\n wroteFinal = true;\r\n const color = builder.write(finalOutput.handle);\r\n if (finalOutput.isScreen) {\r\n // Device default framebuffer: not a graph resource; the effect\r\n // must gamma-correct since the screen is sRGB.\r\n return { color, framebuffer: null, srgbOutput: true };\r\n }\r\n const framebuffer = builder.createFramebuffer({\r\n label: `${label}:finalFB`,\r\n width,\r\n height,\r\n colorAttachments: color,\r\n depthAttachment: null\r\n });\r\n return { color, framebuffer, srgbOutput: false };\r\n }\r\n const color = builder.createTexture({ format: colorFormat, label: `${label}:out` });\r\n const framebuffer = builder.createFramebuffer({\r\n label: `${label}:outFB`,\r\n width,\r\n height,\r\n colorAttachments: color,\r\n depthAttachment: needDepthAttachment ? sceneDepthAttachment : null,\r\n ignoreDepthStencil: !needDepthAttachment\r\n });\r\n return { color, framebuffer, srgbOutput: false };\r\n }\r\n };\r\n chain = effect.setup(setupContext);\r\n }\r\n return { color: chain, wroteFinal };\r\n }\r\n /**\r\n * Adds a posteffect\r\n *\r\n * @param postEffect - The post effect to add\r\n * @param opaque - true if the post effect should be applied after the opaque pass and before the transparent pass, otherwise the post effect should be applied after the transparent pass\r\n */\r\n appendPostEffect(postEffect: AbstractPostEffect) {\r\n if (postEffect) {\r\n for (const list of this._postEffects) {\r\n if (list.findIndex((val) => val.get() === postEffect) >= 0) {\r\n console.error(`Posteffect cannot be added to same compositor multiple times`);\r\n return;\r\n }\r\n }\r\n this._postEffects[postEffect.layer].push(new DRef(postEffect));\r\n }\r\n }\r\n /** Move an existing post effect immediately before another effect in the same layer. @internal */\r\n movePostEffectBefore(postEffect: AbstractPostEffect, referenceEffect: AbstractPostEffect) {\r\n const list = this._postEffects[postEffect.layer];\r\n if (postEffect.layer !== referenceEffect.layer) {\r\n return;\r\n }\r\n const sourceIndex = list.findIndex((val) => val.get() === postEffect);\r\n const referenceIndex = list.findIndex((val) => val.get() === referenceEffect);\r\n if (sourceIndex < 0 || referenceIndex < 0 || sourceIndex === referenceIndex - 1) {\r\n return;\r\n }\r\n const [ref] = list.splice(sourceIndex, 1);\r\n const targetIndex = list.findIndex((val) => val.get() === referenceEffect);\r\n list.splice(targetIndex, 0, ref);\r\n }\r\n /** Move an existing post effect immediately after another effect in the same layer. @internal */\r\n movePostEffectAfter(postEffect: AbstractPostEffect, referenceEffect: AbstractPostEffect) {\r\n const list = this._postEffects[postEffect.layer];\r\n if (postEffect.layer !== referenceEffect.layer) {\r\n return;\r\n }\r\n const sourceIndex = list.findIndex((val) => val.get() === postEffect);\r\n const referenceIndex = list.findIndex((val) => val.get() === referenceEffect);\r\n if (sourceIndex < 0 || referenceIndex < 0 || sourceIndex === referenceIndex + 1) {\r\n return;\r\n }\r\n const [ref] = list.splice(sourceIndex, 1);\r\n const targetIndex = list.findIndex((val) => val.get() === referenceEffect);\r\n list.splice(targetIndex + 1, 0, ref);\r\n }\r\n /**\r\n * Removes a posteffect that was previously added\r\n *\r\n * @param postEffect - The posteffect to be remove.\r\n */\r\n removePostEffect(postEffect: AbstractPostEffect) {\r\n for (const list of this._postEffects) {\r\n const index = list.findIndex((val) => val.get() === postEffect);\r\n if (index >= 0) {\r\n list[index].dispose();\r\n list.splice(index, 1);\r\n return;\r\n }\r\n }\r\n }\r\n /**\r\n * Removes all post effects\r\n */\r\n clear() {\r\n for (const list of this._postEffects) {\r\n for (const p of list) {\r\n p.dispose();\r\n }\r\n list.splice(0, list.length);\r\n }\r\n }\r\n}\r\n"],"names":["Compositor","_postEffects","PostEffectLayer","opaque","transparent","end","layerHasEnabledEffect","layer","some","ref","get","enabled","collectRequirements","ctx","requirements","effect","mergeFrameResourceRequirements","getFrameResourceRequirements","getIntermediateFormat","camera","HDR","device","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","buildLayer","options","graph","blackboard","input","effects","map","filter","length","color","wroteFinal","colorFormat","finalOutput","history","dependencies","historyReads","sceneDepthAttachment","inputResidesInFinalTarget","width","renderWidth","height","renderHeight","chain","i","isLast","inputIsFinalTarget","label","name","setupContext","createOutput","builder","opts","needDepthAttachment","write","handle","isScreen","framebuffer","srgbOutput","createFramebuffer","colorAttachments","depthAttachment","createTexture","format","ignoreDepthStencil","setup","appendPostEffect","postEffect","list","findIndex","val","console","error","push","DRef","movePostEffectBefore","referenceEffect","sourceIndex","referenceIndex","splice","targetIndex","movePostEffectAfter","removePostEffect","index","dispose","clear","p"],"mappings":"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"}
1
+ {"version":3,"file":"compositor.js","sources":["../../src/posteffect/compositor.ts"],"sourcesContent":["import type { DrawContext } from '../render';\r\nimport type { Texture2D, TextureFormat } from '@zephyr3d/device';\r\nimport type { AbstractPostEffect, PostEffectHistoryRead, PostEffectSetupContext } from './posteffect';\r\nimport { PostEffectLayer } from './posteffect';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport type { RenderGraph } from '../render/rendergraph/rendergraph';\r\nimport type { RGHandle, RGTextureAttachment } from '../render/rendergraph/types';\r\nimport type { RGBlackboard } from '../render/rendergraph/blackboard';\r\nimport type { HistoryResourceManager } from '../render/rendergraph/history_resource_manager';\r\nimport type { FrameResourceRequirements } from '../render/rendergraph/frame_resource_requirements';\r\nimport { mergeFrameResourceRequirements } from '../render/rendergraph/frame_resource_requirements';\r\n\r\n/**\r\n * Options for building a post effect layer as render graph passes.\r\n * @public\r\n */\r\nexport interface CompositorBuildLayerOptions {\r\n /** The render graph being built. */\r\n graph: RenderGraph;\r\n /** Frame draw context. */\r\n ctx: DrawContext;\r\n /** The layer to build. */\r\n layer: PostEffectLayer;\r\n /** Named frame resources. */\r\n blackboard: RGBlackboard;\r\n /** Chain input color handle. */\r\n input: RGHandle;\r\n /**\r\n * Direct final target for the last effect of the chain, or null to always\r\n * end the chain in an intermediate texture. Pass the imported backbuffer\r\n * handle together with isScreen=false when rendering into a framebuffer,\r\n * or isScreen=true when the final target is the device default framebuffer.\r\n */\r\n finalOutput?: Nullable<{ handle: RGHandle; isScreen: boolean }>;\r\n /**\r\n * True when the chain input physically resides in the final target (final\r\n * framebuffer used as scene intermediate). An effect whose input is the\r\n * final target must never direct-write it — sampling and rendering the same\r\n * texture in one pass is a feedback loop.\r\n */\r\n inputResidesInFinalTarget?: boolean;\r\n /**\r\n * Depth attachment for intermediate effect outputs that request one:\r\n * either a graph texture handle or a backend depth texture.\r\n */\r\n sceneDepthAttachment?: Nullable<RGTextureAttachment>;\r\n /** Ordering/lifetime dependencies declared by every effect pass. */\r\n dependencies?: RGHandle[];\r\n /** History bindings kept in a read scope while effects execute. */\r\n historyReads?: PostEffectHistoryRead[];\r\n /** Cross-frame history resource manager. */\r\n history?: Nullable<HistoryResourceManager<Texture2D>>;\r\n}\r\n\r\n/**\r\n * Result of {@link Compositor.buildLayer}.\r\n * @public\r\n */\r\nexport interface CompositorBuildLayerResult {\r\n /** Chain output color handle. Equals the input when no effect is enabled. */\r\n color: RGHandle;\r\n /** True when the last effect wrote the final target directly. */\r\n wroteFinal: boolean;\r\n}\r\n\r\n/**\r\n * Post processing compositor\r\n * @public\r\n */\r\nexport class Compositor {\r\n /** @internal */\r\n protected _postEffects: DRef<AbstractPostEffect>[][];\r\n /**\r\n * Creates an instance of Compositor\r\n */\r\n constructor() {\r\n this._postEffects = [];\r\n this._postEffects[PostEffectLayer.opaque] = [];\r\n this._postEffects[PostEffectLayer.transparent] = [];\r\n this._postEffects[PostEffectLayer.end] = [];\r\n }\r\n /** @internal */\r\n layerHasEnabledEffect(layer: PostEffectLayer): boolean {\r\n return this._postEffects[layer].some((ref) => !!ref.get()?.enabled);\r\n }\r\n /** Collect semantic frame resources requested by every enabled effect. @internal */\r\n collectRequirements(ctx: DrawContext): FrameResourceRequirements {\r\n const requirements: FrameResourceRequirements = {};\r\n for (const layer of this._postEffects) {\r\n for (const ref of layer) {\r\n const effect = ref.get();\r\n if (effect?.enabled) {\r\n mergeFrameResourceRequirements(requirements, effect.getFrameResourceRequirements(ctx));\r\n }\r\n }\r\n }\r\n return requirements;\r\n }\r\n /** @internal */\r\n private getIntermediateFormat(ctx: DrawContext): TextureFormat {\r\n return ctx.camera.HDR && ctx.device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'rgba16f'\r\n : 'rgba8unorm';\r\n }\r\n /**\r\n * Build the enabled effects of a layer as render graph passes.\r\n *\r\n * Effects are chained through graph texture handles: each effect's setup()\r\n * declares its passes reading the previous output. Where each effect output\r\n * lands (intermediate texture or the final target) is decided here through\r\n * the {@link PostEffectSetupContext.createOutput} implementation, so effect\r\n * code never handles final-target selection.\r\n *\r\n * @param options - Build inputs.\r\n * @returns The chain output handle and whether the final target was written directly.\r\n */\r\n buildLayer(options: CompositorBuildLayerOptions): CompositorBuildLayerResult {\r\n const { graph, ctx, layer, blackboard, input } = options;\r\n const effects = this._postEffects[layer]\r\n .map((ref) => ref.get())\r\n .filter((effect): effect is AbstractPostEffect => !!effect && effect.enabled);\r\n if (effects.length === 0) {\r\n return { color: input, wroteFinal: false };\r\n }\r\n const colorFormat = this.getIntermediateFormat(ctx);\r\n const finalOutput = options.finalOutput ?? null;\r\n const history = options.history ?? null;\r\n const dependencies = options.dependencies ?? [];\r\n const historyReads = options.historyReads ?? [];\r\n const sceneDepthAttachment = options.sceneDepthAttachment ?? null;\r\n const inputResidesInFinalTarget = !!options.inputResidesInFinalTarget;\r\n const width = ctx.renderWidth;\r\n const height = ctx.renderHeight;\r\n let chain = input;\r\n let wroteFinal = false;\r\n for (let i = 0; i < effects.length; i++) {\r\n const effect = effects[i];\r\n const isLast = i === effects.length - 1;\r\n // An effect that samples the final target's texture must not render into\r\n // it in the same pass (feedback loop); force an intermediate output.\r\n const inputIsFinalTarget = inputResidesInFinalTarget && chain === input;\r\n const label = `PostEffect:${effect.constructor.name}`;\r\n const setupContext: PostEffectSetupContext = {\r\n graph,\r\n ctx,\r\n blackboard,\r\n input: chain,\r\n colorFormat,\r\n width,\r\n height,\r\n history,\r\n sceneDepthAttachment,\r\n dependencies,\r\n historyReads,\r\n createOutput(builder, opts) {\r\n const needDepthAttachment = !!opts?.needDepthAttachment;\r\n // Direct write to the final target is only allowed for the last effect\r\n // of the chain, only when the effect does not depth-test against\r\n // scene depth (the final target does not carry the scene depth\r\n // buffer), and only when the effect does not sample the final\r\n // target's own texture as its input.\r\n if (isLast && finalOutput && !needDepthAttachment && !inputIsFinalTarget) {\r\n wroteFinal = true;\r\n const color = builder.write(finalOutput.handle);\r\n if (finalOutput.isScreen) {\r\n // Device default framebuffer: not a graph resource; the effect\r\n // must gamma-correct since the screen is sRGB.\r\n return { color, framebuffer: null, srgbOutput: true };\r\n }\r\n const framebuffer = builder.createFramebuffer({\r\n label: `${label}:finalFB`,\r\n width,\r\n height,\r\n colorAttachments: color,\r\n depthAttachment: null\r\n });\r\n return { color, framebuffer, srgbOutput: false };\r\n }\r\n const color = builder.createTexture({ format: colorFormat, label: `${label}:out` });\r\n const framebuffer = builder.createFramebuffer({\r\n label: `${label}:outFB`,\r\n width,\r\n height,\r\n colorAttachments: color,\r\n depthAttachment: needDepthAttachment ? sceneDepthAttachment : null,\r\n ignoreDepthStencil: !needDepthAttachment\r\n });\r\n return { color, framebuffer, srgbOutput: false };\r\n }\r\n };\r\n chain = effect.setup(setupContext);\r\n }\r\n return { color: chain, wroteFinal };\r\n }\r\n /**\r\n * Adds a posteffect\r\n *\r\n * @param postEffect - The post effect to add\r\n * @param opaque - true if the post effect should be applied after the opaque pass and before the transparent pass, otherwise the post effect should be applied after the transparent pass\r\n */\r\n appendPostEffect(postEffect: AbstractPostEffect) {\r\n if (postEffect) {\r\n for (const list of this._postEffects) {\r\n if (list.findIndex((val) => val.get() === postEffect) >= 0) {\r\n console.error(`Posteffect cannot be added to same compositor multiple times`);\r\n return;\r\n }\r\n }\r\n this._postEffects[postEffect.layer].push(new DRef(postEffect));\r\n }\r\n }\r\n /** Move an existing post effect immediately before another effect in the same layer. @internal */\r\n movePostEffectBefore(postEffect: AbstractPostEffect, referenceEffect: AbstractPostEffect) {\r\n const list = this._postEffects[postEffect.layer];\r\n if (postEffect.layer !== referenceEffect.layer) {\r\n return;\r\n }\r\n const sourceIndex = list.findIndex((val) => val.get() === postEffect);\r\n const referenceIndex = list.findIndex((val) => val.get() === referenceEffect);\r\n if (sourceIndex < 0 || referenceIndex < 0 || sourceIndex === referenceIndex - 1) {\r\n return;\r\n }\r\n const [ref] = list.splice(sourceIndex, 1);\r\n const targetIndex = list.findIndex((val) => val.get() === referenceEffect);\r\n list.splice(targetIndex, 0, ref);\r\n }\r\n /** Move an existing post effect immediately after another effect in the same layer. @internal */\r\n movePostEffectAfter(postEffect: AbstractPostEffect, referenceEffect: AbstractPostEffect) {\r\n const list = this._postEffects[postEffect.layer];\r\n if (postEffect.layer !== referenceEffect.layer) {\r\n return;\r\n }\r\n const sourceIndex = list.findIndex((val) => val.get() === postEffect);\r\n const referenceIndex = list.findIndex((val) => val.get() === referenceEffect);\r\n if (sourceIndex < 0 || referenceIndex < 0 || sourceIndex === referenceIndex + 1) {\r\n return;\r\n }\r\n const [ref] = list.splice(sourceIndex, 1);\r\n const targetIndex = list.findIndex((val) => val.get() === referenceEffect);\r\n list.splice(targetIndex + 1, 0, ref);\r\n }\r\n /**\r\n * Removes a posteffect that was previously added\r\n *\r\n * @param postEffect - The posteffect to be remove.\r\n */\r\n removePostEffect(postEffect: AbstractPostEffect) {\r\n for (const list of this._postEffects) {\r\n const index = list.findIndex((val) => val.get() === postEffect);\r\n if (index >= 0) {\r\n list[index].dispose();\r\n list.splice(index, 1);\r\n return;\r\n }\r\n }\r\n }\r\n /**\r\n * Removes all post effects\r\n */\r\n clear() {\r\n for (const list of this._postEffects) {\r\n for (const p of list) {\r\n p.dispose();\r\n }\r\n list.splice(0, list.length);\r\n }\r\n }\r\n}\r\n"],"names":["Compositor","_postEffects","PostEffectLayer","opaque","transparent","end","layerHasEnabledEffect","layer","some","ref","get","enabled","collectRequirements","ctx","requirements","effect","mergeFrameResourceRequirements","getFrameResourceRequirements","getIntermediateFormat","camera","HDR","device","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","buildLayer","options","graph","blackboard","input","effects","map","filter","length","color","wroteFinal","colorFormat","finalOutput","history","dependencies","historyReads","sceneDepthAttachment","inputResidesInFinalTarget","width","renderWidth","height","renderHeight","chain","i","isLast","inputIsFinalTarget","label","name","setupContext","createOutput","builder","opts","needDepthAttachment","write","handle","isScreen","framebuffer","srgbOutput","createFramebuffer","colorAttachments","depthAttachment","createTexture","format","ignoreDepthStencil","setup","appendPostEffect","postEffect","list","findIndex","val","console","error","push","DRef","movePostEffectBefore","referenceEffect","sourceIndex","referenceIndex","splice","targetIndex","movePostEffectAfter","removePostEffect","index","dispose","clear","p"],"mappings":"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"}
@@ -14,7 +14,8 @@ import { fetchSampler } from '../utility/misc.js';
14
14
  * Creates an instance of grayscale post effect
15
15
  */ constructor(){
16
16
  super();
17
- this._layer = PostEffectLayer.transparent;
17
+ // End layer: the display chain runs after the TAA resolve (see Camera.setupPostEffects).
18
+ this._layer = PostEffectLayer.end;
18
19
  this._invTexSize = new Vector2();
19
20
  }
20
21
  /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */ requireLinearDepthTexture() {