@zephyr3d/scene 0.9.22 → 0.9.23
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.
- package/dist/animation/joint_dynamics/collision.js +1 -7
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +2 -17
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +2 -20
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +14 -60
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +3 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/app/app.js +23 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/scriptregistry.js +16 -53
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -0
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +22 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js +3 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +3 -3
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/camera/camera.js +398 -45
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +69 -2
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9113 -8734
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +3 -3
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +8 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +17 -10
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -11
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js +44 -12
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +149 -14
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +7 -4
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +5 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +186 -11
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +2 -2
- package/dist/material/skin.js.map +1 -1
- package/dist/material/terrain-cm.js +5 -5
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/water.js +6 -4
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +54 -4
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +41 -0
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/posteffect.js +35 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +7 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +3 -3
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +988 -436
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +83 -45
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +18 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +5 -4
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +15 -3
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +12 -6
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable_mixin.js +8 -5
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +10 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +298 -5
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gpu_picking.js +7 -5
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +28 -19
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +18 -4
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/render_queue.js +37 -4
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +8 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +20 -48
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +18 -58
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +89 -115
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +1 -1
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
- package/dist/render/rendergraph/history_resource_manager.js +74 -140
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +7 -5
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/render_context.js +19 -0
- package/dist/render/rendergraph/render_context.js.map +1 -0
- package/dist/render/rendergraph/render_pipeline.js +315 -0
- package/dist/render/rendergraph/render_pipeline.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +158 -141
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +267 -0
- package/dist/render/rendergraph/scene_render_context.js.map +1 -0
- package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
- package/dist/render/rendergraph/types.js +19 -31
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +3 -3
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +7 -6
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +197 -35
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +4 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +2 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +10 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +61 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +178 -10
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/meshdrawable.js +89 -2
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +2 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +2 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +2 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +34 -1
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +2 -1
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +2 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +2 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +5 -4
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +10 -3
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/shadow.js +96 -29
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +322 -154
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/esm.js +10 -7
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +12 -12
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +12 -12
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +15 -11
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +20 -2
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +5 -2
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +13 -13
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +7 -7
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/utility/physical.js +74 -0
- package/dist/utility/physical.js.map +1 -0
- package/dist/utility/rendermipmap.js +2 -2
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +3 -1
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +3 -1
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +598 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +180 -9
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +43 -3
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +3 -1
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +3 -1
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +3 -1
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +2 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +70 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +3 -1
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +3 -1
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +3 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +3 -1
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/values.js +2 -3
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
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 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 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 /** Bloom threshold */\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(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : 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.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 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.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.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 this.$outputs.outColor = pb.vec4(\r\n pb.add(this.srcSample.rgb, pb.mul(this.bloomSample.rgb, this.intensity)),\r\n 1\r\n );\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.p = pb.textureSampleLevel(this.tex, this.$inputs.uv, 0);\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.rgb, 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","_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","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","rgb","name","createBindGroup","bindGroupLayouts","p","brightness","r","g","b","soft","clamp","contrib","div","sub","offsets","weights","invTexSize","sum","vec3","offset","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendFuncRGB","setBlendFuncAlpha"],"mappings":";;;AAQA;;;IAIO,MAAMA,KAAcC,SAAAA,kBAAAA,CAAAA;AACzB,IAAA,OAAgBC,YAAY,OAAiB;AAC7C,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;2BAEA,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,CAACF,MAAAA,CAAOG,WAAW,GAAGzB,GAAG0B,cAAc,CAACJ,MAAOG,CAAAA,WAAW,CAAI,GAAA,IAAA,CAAA;AACnF,oBAAA,IAAI,CAACE,YAAY,CAAC1B,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,OAAOM,KAAK;AACrB,SAAA,CAAA;AACF;kDAEAC,MAAMzD,GAAgB,EAAE0D,iBAA4B,EAAEC,kBAA6B,EAAEC,WAAoB,EAAE;QACzG,MAAM/B,MAAAA,GAAS7B,IAAI6B,MAAM;AACzB,QAAA,MAAMgC,qBAAkC,EAAE;QAC1C,IAAI,CAAC7B,QAAQ,CAACH,MAAQ6B,EAAAA,iBAAAA,CAAAA;AACtB7B,QAAAA,MAAAA,CAAOI,gBAAgB,EAAA;AACvB,QAAA,MAAMtB,IAAIP,IAAKC,CAAAA,GAAG,CAACqD,iBAAkBpD,CAAAA,KAAK,IAAI,CAAG,EAAA,CAAA,CAAA;AACjD,QAAA,MAAMM,IAAIR,IAAKC,CAAAA,GAAG,CAACqD,iBAAkBlD,CAAAA,MAAM,IAAI,CAAG,EAAA,CAAA,CAAA;QAClD,MAAMsD,QAAAA,GAAWjC,MAAOkC,CAAAA,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAON,iBAAkBzD,CAAAA,MAAM,EAAEU,CAAAA,EAAGC,CAAG,EAAA,KAAA,CAAA;AAC3F,QAAA,IAAI,CAACsB,SAAS,CAACL,MAAAA,EAAQ6B,iBAAmBI,EAAAA,QAAAA,CAAAA;AAC1C,QAAA,IAAI,CAACG,UAAU,CAACpC,MAAAA,EAAQiC,QAAUD,EAAAA,kBAAAA,CAAAA;QAClC,IAAI,CAACK,QAAQ,CAACrC,MAAQgC,EAAAA,kBAAAA,CAAAA;AACtBhC,QAAAA,MAAAA,CAAOM,eAAe,EAAA;AACtB,QAAA,IAAI,CAACoB,YAAY,CAAC1B,QAAQ6B,iBAAmBG,EAAAA,kBAAkB,CAAC,CAAE,CAAA,CAAA;QAClE,KAAK,MAAMM,OAAON,kBAAoB,CAAA;YACpChC,MAAOkC,CAAAA,IAAI,CAACK,cAAc,CAACD,GAAAA,CAAAA;AAC7B;QACAtC,MAAOkC,CAAAA,IAAI,CAACK,cAAc,CAACN,QAAAA,CAAAA;AAC7B;AACA,qBACA5B,SAAUL,CAAAA,MAAsB,EAAEwC,UAAqB,EAAEC,EAAa,EAAE;QACtE,IAAI,CAAC7F,eAAe,CAAC8F,CAAC,GAAG,IAAI,CAAC1F,UAAU,GAAG,IAAI,CAACA,UAAU;AAC1D,QAAA,IAAI,CAACJ,eAAe,CAAC+F,CAAC,GAAG,IAAI,CAAC/F,eAAe,CAAC8F,CAAC,GAAG,IAAI,CAACzF,cAAc;QACrE,IAAI,CAACL,eAAe,CAACgG,CAAC,GAAG,IAAI,IAAI,CAAChG,eAAe,CAAC+F,CAAC;AACnD,QAAA,IAAI,CAAC/F,eAAe,CAACkC,CAAC,GAAG,IAAA,IAAQ,IAAI,CAAClC,eAAe,CAAC+F,CAAC,GAAG,OAAM,CAAA;QAChE,IAAI,CAAC/F,eAAe,CAAC+F,CAAC,IAAI,IAAI,CAAC/F,eAAe,CAAC8F,CAAC;AAChD1C,QAAAA,MAAAA,CAAOuB,cAAc,CAAC;AAACkB,YAAAA;AAAG,SAAA,CAAA;QAC1BzC,MAAO6C,CAAAA,UAAU,CAAC/G,KAAAA,CAAMO,iBAAiB,CAAA;AACzC2D,QAAAA,MAAAA,CAAO8C,YAAY,CAAC,CAAGhH,EAAAA,KAAAA,CAAMa,mBAAmB,CAAA;AAChDb,QAAAA,KAAAA,CAAMa,mBAAmB,CAAEoG,UAAU,CAAC,KAAOP,EAAAA,UAAAA,CAAAA;QAC7C1G,KAAMa,CAAAA,mBAAmB,CAAEqG,QAAQ,CAAC,QAAQhD,MAAOiD,CAAAA,IAAI,KAAK,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAC3EnH,QAAAA,KAAAA,CAAMa,mBAAmB,CAAEqG,QAAQ,CAAC,WAAa,EAAA,IAAI,CAACpG,eAAe,CAAA;AACrE,QAAA,IAAI,CAACsG,kBAAkB,EAAA;AACzB;AACA,qBACAxB,YAAa1B,CAAAA,MAAsB,EAAEwC,UAAqB,EAAEW,YAAuB,EAAE;QACnFnD,MAAO6C,CAAAA,UAAU,CAAC/G,KAAAA,CAAMM,oBAAoB,CAAA;AAC5C4D,QAAAA,MAAAA,CAAO8C,YAAY,CAAC,CAAGhH,EAAAA,KAAAA,CAAMY,sBAAsB,CAAA;AACnDZ,QAAAA,KAAAA,CAAMY,sBAAsB,CAAEqG,UAAU,CAAC,QAAUP,EAAAA,UAAAA,CAAAA;AACnD1G,QAAAA,KAAAA,CAAMY,sBAAsB,CAAEqG,UAAU,CAAC,UAAYI,EAAAA,YAAAA,CAAAA;AACrDrH,QAAAA,KAAAA,CAAMY,sBAAsB,CAAEsG,QAAQ,CAAC,WAAa,EAAA,IAAI,CAAC9F,UAAU,CAAA;AACnEpB,QAAAA,KAAAA,CAAMY,sBAAsB,CAAEsG,QAAQ,CACpC,MACAhD,EAAAA,MAAAA,CAAOiD,IAAI,KAAK,QAAYjD,IAAAA,MAAAA,CAAOyB,cAAc,EAAA,GAAK,CAAI,GAAA,CAAA,CAAA;AAE5D,QAAA,IAAI,CAACyB,kBAAkB,EAAA;AACzB;AACA,qBACAb,QAAAA,CAASrC,MAAsB,EAAEoD,QAAqB,EAAE;QACtD,IAAK,IAAI3C,IAAI2C,QAASlE,CAAAA,MAAM,GAAG,CAAGuB,EAAAA,CAAAA,IAAK,GAAGA,CAAK,EAAA,CAAA;YAC7C,IAAI,CAACU,YAAY,CAACnB,MAAQoD,EAAAA,QAAQ,CAAC3C,CAAAA,GAAI,CAAE,CAAA,EAAE2C,QAAQ,CAAC3C,CAAE,CAAA,CAAA;AACxD;AACF;qBAEA,YAAqBT,CAAAA,MAAsB,EAAEwC,UAAqB,EAAEa,UAAqB,EAAE;QACzFrD,MAAO6C,CAAAA,UAAU,CAAC/G,KAAAA,CAAMK,gBAAgB,CAAA;AACxC6D,QAAAA,MAAAA,CAAO8C,YAAY,CAAC,CAAGhH,EAAAA,KAAAA,CAAMW,kBAAkB,CAAA;QAC/CX,KAAMW,CAAAA,kBAAkB,CAAEuG,QAAQ,CAAC,QAAQhD,MAAOiD,CAAAA,IAAI,KAAK,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAC1EnH,QAAAA,KAAAA,CAAMW,kBAAkB,CAAEsG,UAAU,CAAC,KAAOP,EAAAA,UAAAA,CAAAA;AAC5CxC,QAAAA,MAAAA,CAAOuB,cAAc,CAAC;AAAC8B,YAAAA;AAAW,SAAA,CAAA;AAClC,QAAA,IAAI,CAACH,kBAAkB,CAACpH,KAAAA,CAAMQ,oBAAoB,CAAA;AACpD;qBAEA,KAAc0D,CAAAA,MAAsB,EAAEwC,UAAqB,EAAEa,UAAqB,EAAE;QAClF,IAAI,CAACxG,WAAW,CAACyG,KAAK,CAAC,CAAId,GAAAA,UAAAA,CAAW/D,KAAK,EAAE,CAAI+D,GAAAA,UAAAA,CAAW7D,MAAM,CAAA;AAClEqB,QAAAA,MAAAA,CAAOuB,cAAc,CAAC;AAAC8B,YAAAA;AAAW,SAAA,CAAA;QAClCrD,MAAO6C,CAAAA,UAAU,CAAC/G,KAAAA,CAAMG,mBAAmB,CAAA;AAC3C+D,QAAAA,MAAAA,CAAO8C,YAAY,CAAC,CAAGhH,EAAAA,KAAAA,CAAMS,qBAAqB,CAAA;AAClDT,QAAAA,KAAAA,CAAMS,qBAAqB,CAAEwG,UAAU,CAAC,KAAOP,EAAAA,UAAAA,CAAAA;AAC/C1G,QAAAA,KAAAA,CAAMS,qBAAqB,CAAEyG,QAAQ,CAAC,YAAc,EAAA,IAAI,CAACnG,WAAW,CAAA;QACpEf,KAAMS,CAAAA,qBAAqB,CAAEyG,QAAQ,CAAC,QAAQhD,MAAOiD,CAAAA,IAAI,KAAK,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAC7E,QAAA,IAAI,CAACC,kBAAkB,EAAA;AACzB;qBAEA,KAAclD,CAAAA,MAAsB,EAAEwC,UAAqB,EAAEa,UAAqB,EAAE;QAClF,IAAI,CAACxG,WAAW,CAACyG,KAAK,CAAC,CAAId,GAAAA,UAAAA,CAAW/D,KAAK,EAAE,CAAI+D,GAAAA,UAAAA,CAAW7D,MAAM,CAAA;AAClEqB,QAAAA,MAAAA,CAAOuB,cAAc,CAAC;AAAC8B,YAAAA;AAAW,SAAA,CAAA;QAClCrD,MAAO6C,CAAAA,UAAU,CAAC/G,KAAAA,CAAMI,mBAAmB,CAAA;AAC3C8D,QAAAA,MAAAA,CAAO8C,YAAY,CAAC,CAAGhH,EAAAA,KAAAA,CAAMU,qBAAqB,CAAA;AAClDV,QAAAA,KAAAA,CAAMU,qBAAqB,CAAEuG,UAAU,CAAC,KAAOP,EAAAA,UAAAA,CAAAA;AAC/C1G,QAAAA,KAAAA,CAAMU,qBAAqB,CAAEwG,QAAQ,CAAC,YAAc,EAAA,IAAI,CAACnG,WAAW,CAAA;QACpEf,KAAMU,CAAAA,qBAAqB,CAAEwG,QAAQ,CAAC,QAAQhD,MAAOiD,CAAAA,IAAI,KAAK,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAC7E,QAAA,IAAI,CAACC,kBAAkB,EAAA;AACzB;AACA,qBACAd,UAAWpC,CAAAA,MAAsB,EAAE6B,iBAA4B,EAAEuB,QAAqB,EAAE;AACtF,QAAA,MAAMxE,IAAIL,IAAKC,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAACzB,gBAAgB,CAAA;AAC3C,QAAA,IAAI+B,IAAIP,IAAKC,CAAAA,GAAG,CAACI,CAAGiD,EAAAA,iBAAAA,CAAkBpD,KAAK,IAAI,CAAA,CAAA;AAC/C,QAAA,IAAIM,IAAIR,IAAKC,CAAAA,GAAG,CAACI,CAAGiD,EAAAA,iBAAAA,CAAkBlD,MAAM,IAAI,CAAA,CAAA;AAChD,QAAA,IAAIK,YAAYT,IAAKC,CAAAA,GAAG,CAAC,IAAI,CAAC1B,oBAAoB,EAAE,CAAA,CAAA;AACpD,QAAA,IAAIyG,SAAY1B,GAAAA,iBAAAA;QAChB,MAAQ/C,CAAAA,CAAKF,IAAAA,CAAAA,IAAKG,KAAKH,CAAAA,KAAMI,YAAY,CAAG,CAAA;YAC1C,MAAMsD,GAAAA,GAAMtC,MAAOkC,CAAAA,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAON,iBAAkBzD,CAAAA,MAAM,EAAEU,CAAAA,EAAGC,CAAG,EAAA,KAAA,CAAA;AACtFqE,YAAAA,QAAAA,CAASnE,IAAI,CAACqD,GAAAA,CAAAA;YAEd,MAAMkB,SAAAA,GAAYxD,MAAOkC,CAAAA,IAAI,CAACC,sBAAsB,CAAC,KAAA,EAAON,iBAAkBzD,CAAAA,MAAM,EAAEU,CAAAA,EAAGC,CAAG,EAAA,KAAA,CAAA;AAE5F,YAAA,IAAI,CAACgC,KAAK,CAACf,MAAAA,EAAQuD,SAAWC,EAAAA,SAAAA,CAAAA;AAC9B,YAAA,IAAI,CAACxC,KAAK,CAAChB,MAAAA,EAAQwD,SAAWlB,EAAAA,GAAAA,CAAAA;AAE9BtD,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;YACrBwE,SAAYjB,GAAAA,GAAAA;YAEZtC,MAAOkC,CAAAA,IAAI,CAACK,cAAc,CAACiB,SAAAA,CAAAA;AAC7B;AACF;AACA,qBACA,QAAQrD,CAASH,MAAsB,EAAEyD,WAAsB,EAAE;QAC/D,IAAI,CAAC3H,KAAMM,CAAAA,oBAAoB,EAAE;AAC/BN,YAAAA,KAAAA,CAAMM,oBAAoB,GAAG4D,MAAO0D,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,CAAClG,SAAS,GAAG+F,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;AAC5E,wBAAA,IAAI,CAACD,QAAQ,CAACiB,QAAQ,GAAGzB,EAAAA,CAAGa,IAAI,CAC9Bb,EAAGc,CAAAA,GAAG,CAAC,IAAI,CAACa,SAAS,CAACG,GAAG,EAAE9B,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACc,WAAW,CAACC,GAAG,EAAE,IAAI,CAAC7H,SAAS,CACtE,CAAA,EAAA,CAAA,CAAA;AAEJ,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACA/B,KAAMM,CAAAA,oBAAoB,CAACuJ,IAAI,GAAG,qBAAA;YAClC7J,KAAMY,CAAAA,sBAAsB,GAAGsD,MAAAA,CAAO4F,eAAe,CAAC9J,MAAMM,oBAAoB,CAACyJ,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACtG;QACA,IAAI,CAAC/J,KAAMO,CAAAA,iBAAiB,EAAE;AAC5BP,YAAAA,KAAAA,CAAMO,iBAAiB,GAAG2D,MAAO0D,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,CAACpG,SAAS,GAAGiG,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,CAACQ,CAAC,GAAGlC,GAAG4B,kBAAkB,CAAC,IAAI,CAAClD,GAAG,EAAE,IAAI,CAAC0B,OAAO,CAACK,EAAE,EAAE,CAAA,CAAA;wBAC7D,IAAI,CAACiB,EAAE,CAACS,UAAU,GAAGnC,EAAGpF,CAAAA,GAAG,CAACoF,EAAAA,CAAGpF,GAAG,CAAC,IAAI,CAACsH,CAAC,CAACE,CAAC,EAAE,IAAI,CAACF,CAAC,CAACG,CAAC,CAAA,EAAG,IAAI,CAACH,CAAC,CAACI,CAAC,CAAA;wBAChE,IAAI,CAACZ,EAAE,CAACa,IAAI,GAAGvC,EAAGwC,CAAAA,KAAK,CAACxC,EAAAA,CAAGc,GAAG,CAAC,IAAI,CAACqB,UAAU,EAAE,IAAI,CAACpI,SAAS,CAACgF,CAAC,CAAG,EAAA,CAAA,EAAG,IAAI,CAAChF,SAAS,CAACiF,CAAC,CAAA;AACtF,wBAAA,IAAI,CAACuD,IAAI,GAAGvC,GAAGe,GAAG,CAAC,IAAI,CAACwB,IAAI,EAAE,IAAI,CAACA,IAAI,EAAE,IAAI,CAACxI,SAAS,CAACmB,CAAC,CAAA;AACzD,wBAAA,IAAI,CAACwG,EAAE,CAACe,OAAO,GAAGzC,EAAG0C,CAAAA,GAAG,CACtB1C,EAAAA,CAAGpF,GAAG,CAAC,IAAI,CAAC2H,IAAI,EAAEvC,EAAG2C,CAAAA,GAAG,CAAC,IAAI,CAACR,UAAU,EAAE,IAAI,CAACpI,SAAS,CAAC+E,CAAC,CAAA,CAAA,EAC1DkB,GAAGpF,GAAG,CAAC,IAAI,CAACuH,UAAU,EAAE,OAAA,CAAA,CAAA;wBAE1B,IAAI,CAAC3B,QAAQ,CAACiB,QAAQ,GAAGzB,EAAGa,CAAAA,IAAI,CAACb,EAAGe,CAAAA,GAAG,CAAC,IAAI,CAACmB,CAAC,CAACJ,GAAG,EAAE,IAAI,CAACW,OAAO,CAAG,EAAA,CAAA,CAAA;AACrE,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACAvK,KAAMO,CAAAA,iBAAiB,CAACsJ,IAAI,GAAG,kBAAA;YAC/B7J,KAAMa,CAAAA,mBAAmB,GAAGqD,MAAAA,CAAO4F,eAAe,CAAC9J,MAAMO,iBAAiB,CAACwJ,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAChG;QACA,IAAI,CAAC/J,KAAMK,CAAAA,gBAAgB,EAAE;AAC3BL,YAAAA,KAAAA,CAAMK,gBAAgB,GAAG6D,MAAO0D,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;YACAvI,KAAMK,CAAAA,gBAAgB,CAACwJ,IAAI,GAAG,iBAAA;YAC9B7J,KAAMW,CAAAA,kBAAkB,GAAGuD,MAAAA,CAAO4F,eAAe,CAAC9J,MAAMK,gBAAgB,CAAC0J,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAC9F;QACA,IAAI,CAAC/J,KAAMG,CAAAA,mBAAmB,EAAE;AAC9B,YAAA,MAAMuK,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;AACD3K,YAAAA,KAAAA,CAAMG,mBAAmB,GAAG+D,MAAO0D,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,CAAC8C,UAAU,GAAG9C,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,CAACqB,GAAG,GAAG/C,EAAAA,CAAGgD,IAAI,CAAC,CAAA,CAAA;AACtB,wBAAA,IAAI,CAACtB,EAAE,CAACuB,MAAM,GAAGjD,GAAGwB,KAAK,EAAA;AACzB,wBAAA,IAAK,IAAI3E,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AAC1B,4BAAA,IAAI,CAACoG,MAAM,GAAGjD,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAAC+B,UAAU,CAAChE,CAAC,EAAE8D,OAAO,CAAC/F,EAAE,GAAG,CAAA,CAAA;AACrD,4BAAA,IAAI,CAACkG,GAAG,GAAG/C,GAAGc,GAAG,CACf,IAAI,CAACiC,GAAG,EACR/C,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,CAAC2C,MAAM,EAAE,CAAK,CAAA,CAAA,EAAA,CAAA,CAAA,CAAGnB,GAAG,EACxFe,OAAO,CAAChG,CAAE,CAAA,CAAA,CAAA;AAGhB;wBACA,IAAI,CAAC2D,QAAQ,CAACiB,QAAQ,GAAGzB,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAACkC,GAAG,EAAE,CAAA,CAAA;AAC7C,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACA7K,KAAMG,CAAAA,mBAAmB,CAAC0J,IAAI,GAAG,oBAAA;YACjC7J,KAAMS,CAAAA,qBAAqB,GAAGyD,MAAAA,CAAO4F,eAAe,CAAC9J,MAAMG,mBAAmB,CAAC4J,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACpG;QACA,IAAI,CAAC/J,KAAMI,CAAAA,mBAAmB,EAAE;AAC9B,YAAA,MAAMsK,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;AAC5E3K,YAAAA,KAAAA,CAAMI,mBAAmB,GAAG8D,MAAO0D,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,CAAC8C,UAAU,GAAG9C,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,CAACqB,GAAG,GAAG/C,EAAAA,CAAGgD,IAAI,CAAC,CAAA,CAAA;AACtB,wBAAA,IAAI,CAACtB,EAAE,CAACuB,MAAM,GAAGjD,GAAGwB,KAAK,EAAA;AACzB,wBAAA,IAAK,IAAI3E,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AAC1B,4BAAA,IAAI,CAACoG,MAAM,GAAGjD,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAAC+B,UAAU,CAAC/D,CAAC,EAAE6D,OAAO,CAAC/F,CAAE,CAAA,CAAA;AAClD,4BAAA,IAAI,CAACkG,GAAG,GAAG/C,GAAGc,GAAG,CACf,IAAI,CAACiC,GAAG,EACR/C,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,CAAC2C,MAAM,CAAI,CAAA,EAAA,CAAA,CAAA,CAAGnB,GAAG,EACxFe,OAAO,CAAChG,CAAE,CAAA,CAAA,CAAA;AAGhB;wBACA,IAAI,CAAC2D,QAAQ,CAACiB,QAAQ,GAAGzB,EAAGa,CAAAA,IAAI,CAAC,IAAI,CAACkC,GAAG,EAAE,CAAA,CAAA;AAC7C,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;YACA7K,KAAMI,CAAAA,mBAAmB,CAACyJ,IAAI,GAAG,oBAAA;YACjC7J,KAAMU,CAAAA,qBAAqB,GAAGwD,MAAAA,CAAO4F,eAAe,CAAC9J,MAAMI,mBAAmB,CAAC2J,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACpG;QACA,IAAI,CAAC/J,KAAMQ,CAAAA,oBAAoB,EAAE;YAC/BR,KAAMQ,CAAAA,oBAAoB,GAAG0D,MAAAA,CAAO8G,oBAAoB,EAAA;AACxDhL,YAAAA,KAAAA,CAAMQ,oBAAoB,CAACyK,kBAAkB,EAAA,CAAGC,WAAW,CAAC,MAAA,CAAA;YAC5DlL,KAAMQ,CAAAA,oBAAoB,CAAC2K,aAAa,EAAA,CAAGC,UAAU,CAAC,KAAA,CAAA,CAAOC,WAAW,CAAC,KAAA,CAAA;AACzErL,YAAAA,KAAAA,CAAMQ,oBAAoB,CACvB8K,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 {\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,5 +1,6 @@
|
|
|
1
1
|
import { PostEffectLayer } from './posteffect.js';
|
|
2
2
|
import { DRef } from '@zephyr3d/base';
|
|
3
|
+
import { mergeFrameResourceRequirements } from '../render/rendergraph/frame_resource_requirements.js';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Post processing compositor
|
|
@@ -17,6 +18,18 @@ import { DRef } from '@zephyr3d/base';
|
|
|
17
18
|
/** @internal */ layerHasEnabledEffect(layer) {
|
|
18
19
|
return this._postEffects[layer].some((ref)=>!!ref.get()?.enabled);
|
|
19
20
|
}
|
|
21
|
+
/** Collect semantic frame resources requested by every enabled effect. @internal */ collectRequirements(ctx) {
|
|
22
|
+
const requirements = {};
|
|
23
|
+
for (const layer of this._postEffects){
|
|
24
|
+
for (const ref of layer){
|
|
25
|
+
const effect = ref.get();
|
|
26
|
+
if (effect?.enabled) {
|
|
27
|
+
mergeFrameResourceRequirements(requirements, effect.getFrameResourceRequirements(ctx));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return requirements;
|
|
32
|
+
}
|
|
20
33
|
/** @internal */ getIntermediateFormat(ctx) {
|
|
21
34
|
return ctx.camera.HDR && ctx.device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';
|
|
22
35
|
}
|
|
@@ -144,6 +157,34 @@ import { DRef } from '@zephyr3d/base';
|
|
|
144
157
|
this._postEffects[postEffect.layer].push(new DRef(postEffect));
|
|
145
158
|
}
|
|
146
159
|
}
|
|
160
|
+
/** Move an existing post effect immediately before another effect in the same layer. @internal */ movePostEffectBefore(postEffect, referenceEffect) {
|
|
161
|
+
const list = this._postEffects[postEffect.layer];
|
|
162
|
+
if (postEffect.layer !== referenceEffect.layer) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const sourceIndex = list.findIndex((val)=>val.get() === postEffect);
|
|
166
|
+
const referenceIndex = list.findIndex((val)=>val.get() === referenceEffect);
|
|
167
|
+
if (sourceIndex < 0 || referenceIndex < 0 || sourceIndex === referenceIndex - 1) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const [ref] = list.splice(sourceIndex, 1);
|
|
171
|
+
const targetIndex = list.findIndex((val)=>val.get() === referenceEffect);
|
|
172
|
+
list.splice(targetIndex, 0, ref);
|
|
173
|
+
}
|
|
174
|
+
/** Move an existing post effect immediately after another effect in the same layer. @internal */ movePostEffectAfter(postEffect, referenceEffect) {
|
|
175
|
+
const list = this._postEffects[postEffect.layer];
|
|
176
|
+
if (postEffect.layer !== referenceEffect.layer) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const sourceIndex = list.findIndex((val)=>val.get() === postEffect);
|
|
180
|
+
const referenceIndex = list.findIndex((val)=>val.get() === referenceEffect);
|
|
181
|
+
if (sourceIndex < 0 || referenceIndex < 0 || sourceIndex === referenceIndex + 1) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const [ref] = list.splice(sourceIndex, 1);
|
|
185
|
+
const targetIndex = list.findIndex((val)=>val.get() === referenceEffect);
|
|
186
|
+
list.splice(targetIndex + 1, 0, ref);
|
|
187
|
+
}
|
|
147
188
|
/**
|
|
148
189
|
* Removes a posteffect that was previously added
|
|
149
190
|
*
|
|
@@ -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\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 /** @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 /**\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","getIntermediateFormat","ctx","camera","HDR","device","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","buildLayer","options","graph","blackboard","input","effects","map","filter","effect","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","removePostEffect","index","dispose","splice","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 } 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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"}
|
|
@@ -62,6 +62,15 @@ import { FrameResources } from '../render/rendergraph/blackboard.js';
|
|
|
62
62
|
*/ requireMotionVectorTexture(_ctx) {
|
|
63
63
|
return false;
|
|
64
64
|
}
|
|
65
|
+
/** Checks whether this post effect requires the Hi-Z depth pyramid. */ requireHiZTexture(_ctx) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
/** Checks whether this post effect requires opaque-scene world normals. */ requireSceneNormalTexture(_ctx) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
/** Checks whether this post effect requires opaque-scene roughness data. */ requireSceneRoughnessTexture(_ctx) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
65
74
|
/**
|
|
66
75
|
* Checks whether this post effect requires the screen-space shadow mask.
|
|
67
76
|
*
|
|
@@ -72,6 +81,15 @@ import { FrameResources } from '../render/rendergraph/blackboard.js';
|
|
|
72
81
|
*/ requireShadowMask(_ctx) {
|
|
73
82
|
return false;
|
|
74
83
|
}
|
|
84
|
+
/** Collect this effect's semantic frame-resource requirements. @internal */ getFrameResourceRequirements(ctx) {
|
|
85
|
+
return {
|
|
86
|
+
motionVector: this.requireMotionVectorTexture(ctx),
|
|
87
|
+
hiZ: this.requireHiZTexture(ctx),
|
|
88
|
+
sceneNormal: this.requireSceneNormalTexture(ctx),
|
|
89
|
+
sceneRoughness: this.requireSceneRoughnessTexture(ctx),
|
|
90
|
+
shadowMask: this.requireShadowMask(ctx)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
75
93
|
/**
|
|
76
94
|
* Apply the post effect
|
|
77
95
|
* @param camera - Camera used the render the scene
|
|
@@ -123,6 +141,18 @@ import { FrameResources } from '../render/rendergraph/blackboard.js';
|
|
|
123
141
|
if (motionVectorHandle) {
|
|
124
142
|
builder.read(motionVectorHandle);
|
|
125
143
|
}
|
|
144
|
+
const hiZHandle = this.requireHiZTexture(s.ctx) ? s.blackboard.get(FrameResources.HiZ) : null;
|
|
145
|
+
if (hiZHandle) {
|
|
146
|
+
builder.read(hiZHandle);
|
|
147
|
+
}
|
|
148
|
+
const sceneNormalHandle = this.requireSceneNormalTexture(s.ctx) ? s.blackboard.get(FrameResources.SceneNormal) : null;
|
|
149
|
+
if (sceneNormalHandle) {
|
|
150
|
+
builder.read(sceneNormalHandle);
|
|
151
|
+
}
|
|
152
|
+
const sceneRoughnessHandle = this.requireSceneRoughnessTexture(s.ctx) ? s.blackboard.get(FrameResources.SceneRoughness) : null;
|
|
153
|
+
if (sceneRoughnessHandle) {
|
|
154
|
+
builder.read(sceneRoughnessHandle);
|
|
155
|
+
}
|
|
126
156
|
// Keep the screen-space shadow mask alive for effects that sample it
|
|
127
157
|
// (via DrawContext.shadowMaskTexture) instead of recomputing shadows.
|
|
128
158
|
const shadowMaskHandle = this.requireShadowMask(s.ctx) ? s.blackboard.get(FrameResources.ShadowMask) : null;
|
|
@@ -140,6 +170,11 @@ import { FrameResources } from '../render/rendergraph/blackboard.js';
|
|
|
140
170
|
device.pushDeviceStates();
|
|
141
171
|
try {
|
|
142
172
|
device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);
|
|
173
|
+
// A framebuffer bind may be a backend no-op when the requested target is already
|
|
174
|
+
// current. Never let a previous multi-resolution effect (for example Bloom) leak its
|
|
175
|
+
// smaller viewport/scissor into this fullscreen pass.
|
|
176
|
+
device.setViewport(null);
|
|
177
|
+
device.setScissor(null);
|
|
143
178
|
this.apply(s.ctx, inputTexture, linearDepthTexture, output.srgbOutput);
|
|
144
179
|
} finally{
|
|
145
180
|
device.popDeviceStates();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posteffect.js","sources":["../../src/posteffect/posteffect.ts"],"sourcesContent":["import type { AbstractDevice, CompareFunc, RenderStateSet, Texture2D, TextureFormat } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { drawFullscreenQuad } from '../render/fullscreenquad';\r\nimport { copyTexture, fetchSampler } from '../utility/misc';\r\nimport { Disposable } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { RenderGraph } from '../render/rendergraph/rendergraph';\r\nimport type { RGHandle, RGPassBuilder } from '../render/rendergraph/types';\r\nimport type { RGBlackboard } from '../render/rendergraph/blackboard';\r\nimport { FrameResources } from '../render/rendergraph/blackboard';\r\nimport type { HistoryResourceManager } from '../render/rendergraph/history_resource_manager';\r\n\r\n/**\r\n * Rendering layer of post processing effects\r\n * @public\r\n *\r\n */\r\nexport enum PostEffectLayer {\r\n opaque = 0,\r\n transparent = 1,\r\n end = 2\r\n}\r\n\r\n/**\r\n * History texture binding required while a post effect executes.\r\n * @public\r\n */\r\nexport interface PostEffectHistoryRead {\r\n /** History resource name (see {@link RGHistoryResources}). */\r\n name: string;\r\n /** Graph handle of the imported previous-frame texture. */\r\n handle: RGHandle;\r\n}\r\n\r\n/**\r\n * Output target of a post effect, created through {@link PostEffectSetupContext.createOutput}.\r\n * @public\r\n */\r\nexport interface PostEffectOutput {\r\n /** Color handle produced by this effect. Return it from {@link AbstractPostEffect.setup}. */\r\n color: RGHandle;\r\n /**\r\n * Graph framebuffer to render into, or null when the effect must render to the\r\n * device default framebuffer (screen).\r\n */\r\n framebuffer: Nullable<RGHandle>;\r\n /** Whether the effect must gamma-correct its final write. */\r\n srgbOutput: boolean;\r\n}\r\n\r\n/**\r\n * Build-time context handed to {@link AbstractPostEffect.setup}.\r\n *\r\n * The context carries everything an effect needs to declare its passes on the\r\n * render graph. Where the effect output physically lands (intermediate texture,\r\n * backbuffer or screen) is decided by {@link PostEffectSetupContext.createOutput};\r\n * effect implementations never deal with final-target selection themselves.\r\n *\r\n * @public\r\n */\r\nexport interface PostEffectSetupContext {\r\n /** The render graph being built for this frame. */\r\n readonly graph: RenderGraph;\r\n /** Frame draw context. Read configuration from it, never textures. */\r\n readonly ctx: DrawContext;\r\n /** Named frame resources (linear depth, motion vectors, GBuffer, ...). */\r\n readonly blackboard: RGBlackboard;\r\n /** Chain input: color output of the previous effect (or the scene color). */\r\n readonly input: RGHandle;\r\n /** Intermediate color format of the post effect chain. */\r\n readonly colorFormat: TextureFormat;\r\n /** Render width in pixels. */\r\n readonly width: number;\r\n /** Render height in pixels. */\r\n readonly height: number;\r\n /** Cross-frame history resources, or null when unavailable. */\r\n readonly history: Nullable<HistoryResourceManager<Texture2D>>;\r\n /**\r\n * Scene depth attachment for intermediate passes that depth-test against\r\n * scene depth: either a graph texture handle or a backend depth texture.\r\n * Pass it as the depthAttachment of intermediate framebuffers; the final\r\n * pass gets it through createOutput({needDepthAttachment: true}).\r\n */\r\n readonly sceneDepthAttachment: unknown;\r\n /**\r\n * Ordering/lifetime dependencies that every pass created by this effect must\r\n * declare with {@link RGPassBuilder.read}.\r\n * @internal\r\n */\r\n readonly dependencies: readonly RGHandle[];\r\n /**\r\n * History texture bindings that must be in a read scope while this effect\r\n * executes (legacy apply path).\r\n * @internal\r\n */\r\n readonly historyReads: readonly PostEffectHistoryRead[];\r\n /**\r\n * Create the output target for the effect's final pass.\r\n *\r\n * Must be called exactly once, inside the setup callback of the pass that\r\n * produces the effect's final color. The compositor decides whether this\r\n * resolves to an intermediate texture or a direct write to the final target.\r\n *\r\n * @param builder - The pass builder of the effect's final pass.\r\n * @param opts - Set needDepthAttachment when the pass depth-tests against scene depth.\r\n * @returns The resolved output target.\r\n */\r\n createOutput(builder: RGPassBuilder, opts?: { needDepthAttachment?: boolean }): PostEffectOutput;\r\n}\r\n\r\n/**\r\n * Base class for any type of post effect\r\n * @public\r\n */\r\nexport class AbstractPostEffect extends Disposable {\r\n private static _defaultRenderStates: { CompareFunc?: RenderStateSet } = {};\r\n protected _enabled: boolean;\r\n protected _layer: PostEffectLayer;\r\n /**\r\n * Creates an instance of a post effect\r\n * @param name - Name of the post effect\r\n */\r\n constructor() {\r\n super();\r\n this._enabled = true;\r\n this._layer = PostEffectLayer.end;\r\n }\r\n /** Whether this post effect is enabled */\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set enabled(val) {\r\n this._enabled = !!val;\r\n }\r\n /** Whether this post effect will be rendered at opaque phase */\r\n get layer() {\r\n return this._layer;\r\n }\r\n /**\r\n * Check if the post effect should be rendered upside down.\r\n * @param device - The device object\r\n * @returns true if the post effect should be rendered upside down\r\n */\r\n needFlip(device: AbstractDevice) {\r\n return device.type === 'webgpu' && !!device.getFramebuffer();\r\n }\r\n /**\r\n * Checks whether this post effect requires the linear depth texture\r\n * @returns true if the linear depth texture is required.\r\n */\r\n requireLinearDepthTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the scene depth buffer\r\n * @returns true if the scene depth buffer is required.\r\n */\r\n requireDepthAttachment(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the motion vector texture\r\n * @returns true if the motion vector texture is required.\r\n */\r\n requireMotionVectorTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the screen-space shadow mask.\r\n *\r\n * When true and the mask was produced this frame, the effect can sample\r\n * `DrawContext.shadowMaskTexture` in its apply() body; the graph keeps the\r\n * mask alive for the effect's pass.\r\n * @returns true if the shadow mask is required.\r\n */\r\n requireShadowMask(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Apply the post effect\r\n * @param camera - Camera used the render the scene\r\n * @param inputColorTexture - The previous scene color texture\r\n * @param sceneDepthTexture - The linear scene depth texture\r\n * @param srgbOutput - Whether the result should be gamma corrected\r\n *\r\n * @remarks\r\n * The frame buffer of the post effect is already set when apply() is called.\r\n */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n }\r\n /**\r\n * Declare this effect's passes on the render graph.\r\n *\r\n * The default implementation wraps {@link AbstractPostEffect.apply} into a\r\n * single graph pass, so effects only overriding apply() work unchanged.\r\n * Multi-pass effects override this method to declare each internal step as\r\n * its own pass, calling {@link PostEffectSetupContext.createOutput} inside\r\n * the final pass.\r\n *\r\n * @param s - Build-time setup context.\r\n * @returns The effect's output color handle.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n return this._setupFromApply(s);\r\n }\r\n /**\r\n * Wraps the legacy apply() entry into a single graph pass.\r\n * @internal\r\n */\r\n protected _setupFromApply(s: PostEffectSetupContext): RGHandle {\r\n const passName = `PostEffect:${this.constructor.name}`;\r\n return s.graph.addPass(passName, (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n for (const binding of s.historyReads) {\r\n builder.read(binding.handle);\r\n }\r\n // Declare reads according to the effect's declared requirements so the\r\n // executor keeps exactly the textures this effect samples alive. Effects\r\n // reaching frame textures through DrawContext fields must declare them\r\n // via requireLinearDepthTexture / requireMotionVectorTexture.\r\n const linearDepthHandle = this.requireLinearDepthTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.LinearDepth)\r\n : null;\r\n if (linearDepthHandle) {\r\n builder.read(linearDepthHandle);\r\n }\r\n const motionVectorHandle = this.requireMotionVectorTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.MotionVector)\r\n : null;\r\n if (motionVectorHandle) {\r\n builder.read(motionVectorHandle);\r\n }\r\n // Keep the screen-space shadow mask alive for effects that sample it\r\n // (via DrawContext.shadowMaskTexture) instead of recomputing shadows.\r\n const shadowMaskHandle = this.requireShadowMask(s.ctx)\r\n ? s.blackboard.get(FrameResources.ShadowMask)\r\n : null;\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n const output = s.createOutput(builder, {\r\n needDepthAttachment: this.requireDepthAttachment(s.ctx)\r\n });\r\n builder.setExecute((rg) => {\r\n const device = s.ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n const linearDepthTexture = linearDepthHandle\r\n ? rg.getTexture<Texture2D>(linearDepthHandle)\r\n : s.ctx.linearDepthTexture!;\r\n const applyEffect = () => {\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(output.framebuffer ? rg.getFramebuffer(output.framebuffer) : null);\r\n this.apply(s.ctx, inputTexture, linearDepthTexture, output.srgbOutput);\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n };\r\n if (s.history && s.historyReads.length > 0) {\r\n s.history.beginReadScope(\r\n s.historyReads.map((binding) => ({\r\n name: binding.name,\r\n texture: rg.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n applyEffect();\r\n } finally {\r\n s.history.endReadScope();\r\n }\r\n } else {\r\n applyEffect();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /**\r\n *\r\n * @param ctx - Draw context\r\n * @param inputColorTexture - Input color texture\r\n * @param srgbOutput - Whether the result should be gamma corrected\r\n */\r\n protected passThrough(\r\n ctx: DrawContext,\r\n inputColorTexture: Texture2D,\r\n srgbOutput: boolean,\r\n renderStates?: RenderStateSet\r\n ) {\r\n copyTexture(\r\n inputColorTexture,\r\n ctx.device.getFramebuffer()!,\r\n fetchSampler('clamp_nearest_nomip'),\r\n renderStates,\r\n 0,\r\n srgbOutput\r\n );\r\n }\r\n /**\r\n * Draws a fullscreen quad\r\n * @param renderStateSet - Render states that will be used when drawing the fullscreen quad.\r\n */\r\n protected drawFullscreenQuad(renderStateSet?: RenderStateSet) {\r\n drawFullscreenQuad(renderStateSet);\r\n }\r\n /** @internal */\r\n protected createVertexLayout(device: AbstractDevice) {\r\n return device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer('position_f32x2', new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]))!\r\n }\r\n ]\r\n });\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this.destroy();\r\n }\r\n /** @internal */\r\n protected createRenderStates(device: AbstractDevice) {\r\n const renderStates = device.createRenderStateSet();\r\n renderStates.useRasterizerState().setCullMode('none');\r\n renderStates.useDepthState().enableTest(false).enableWrite(false);\r\n return renderStates;\r\n }\r\n /** @internal */\r\n protected destroy() {}\r\n /** @internal */\r\n static getDefaultRenderState(ctx: DrawContext, compareFunc: CompareFunc) {\r\n let renderState = this._defaultRenderStates[compareFunc as keyof typeof this._defaultRenderStates];\r\n if (!renderState) {\r\n renderState = ctx.device.createRenderStateSet();\r\n renderState.useRasterizerState().setCullMode('none');\r\n renderState\r\n .useDepthState()\r\n .enableTest(compareFunc !== 'always')\r\n .enableWrite(false)\r\n .setCompareFunc(compareFunc);\r\n this._defaultRenderStates[compareFunc as keyof typeof this._defaultRenderStates] = renderState;\r\n }\r\n return renderState;\r\n }\r\n}\r\n"],"names":["PostEffectLayer","AbstractPostEffect","Disposable","_defaultRenderStates","_enabled","_layer","enabled","val","layer","needFlip","device","type","getFramebuffer","requireLinearDepthTexture","_ctx","requireDepthAttachment","requireMotionVectorTexture","requireShadowMask","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","passThrough","setup","s","_setupFromApply","passName","name","graph","addPass","builder","read","input","dep","dependencies","binding","historyReads","handle","linearDepthHandle","blackboard","get","FrameResources","LinearDepth","motionVectorHandle","MotionVector","shadowMaskHandle","ShadowMask","output","createOutput","needDepthAttachment","setExecute","rg","inputTexture","getTexture","linearDepthTexture","applyEffect","pushDeviceStates","setFramebuffer","framebuffer","popDeviceStates","history","length","beginReadScope","map","texture","endReadScope","color","renderStates","copyTexture","fetchSampler","drawFullscreenQuad","renderStateSet","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","Float32Array","onDispose","destroy","createRenderStates","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","getDefaultRenderState","compareFunc","renderState","setCompareFunc"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"posteffect.js","sources":["../../src/posteffect/posteffect.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n CompareFunc,\r\n FrameBuffer,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { drawFullscreenQuad } from '../render/fullscreenquad';\r\nimport { copyTexture, fetchSampler } from '../utility/misc';\r\nimport { Disposable } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { RenderGraph } from '../render/rendergraph/rendergraph';\r\nimport type { RGHandle, RGPassBuilder } from '../render/rendergraph/types';\r\nimport type { RGBlackboard } from '../render/rendergraph/blackboard';\r\nimport { FrameResources } from '../render/rendergraph/blackboard';\r\nimport type { FrameResourceRequirements } from '../render/rendergraph/frame_resource_requirements';\r\nimport type { HistoryResourceManager } from '../render/rendergraph/history_resource_manager';\r\n\r\n/**\r\n * Rendering layer of post processing effects\r\n * @public\r\n *\r\n */\r\nexport enum PostEffectLayer {\r\n opaque = 0,\r\n transparent = 1,\r\n end = 2\r\n}\r\n\r\n/**\r\n * History texture binding required while a post effect executes.\r\n * @public\r\n */\r\nexport interface PostEffectHistoryRead {\r\n /** History resource name (see {@link RGHistoryResources}). */\r\n name: string;\r\n /** Graph handle of the imported previous-frame texture. */\r\n handle: RGHandle;\r\n}\r\n\r\n/**\r\n * Output target of a post effect, created through {@link PostEffectSetupContext.createOutput}.\r\n * @public\r\n */\r\nexport interface PostEffectOutput {\r\n /** Color handle produced by this effect. Return it from {@link AbstractPostEffect.setup}. */\r\n color: RGHandle;\r\n /**\r\n * Graph framebuffer to render into, or null when the effect must render to the\r\n * device default framebuffer (screen).\r\n */\r\n framebuffer: Nullable<RGHandle>;\r\n /** Whether the effect must gamma-correct its final write. */\r\n srgbOutput: boolean;\r\n}\r\n\r\n/**\r\n * Build-time context handed to {@link AbstractPostEffect.setup}.\r\n *\r\n * The context carries everything an effect needs to declare its passes on the\r\n * render graph. Where the effect output physically lands (intermediate texture,\r\n * backbuffer or screen) is decided by {@link PostEffectSetupContext.createOutput};\r\n * effect implementations never deal with final-target selection themselves.\r\n *\r\n * @public\r\n */\r\nexport interface PostEffectSetupContext {\r\n /** The render graph being built for this frame. */\r\n readonly graph: RenderGraph;\r\n /** Frame draw context. Read configuration from it, never textures. */\r\n readonly ctx: DrawContext;\r\n /** Named frame resources (linear depth, motion vectors, GBuffer, ...). */\r\n readonly blackboard: RGBlackboard;\r\n /** Chain input: color output of the previous effect (or the scene color). */\r\n readonly input: RGHandle;\r\n /** Intermediate color format of the post effect chain. */\r\n readonly colorFormat: TextureFormat;\r\n /** Render width in pixels. */\r\n readonly width: number;\r\n /** Render height in pixels. */\r\n readonly height: number;\r\n /** Cross-frame history resources, or null when unavailable. */\r\n readonly history: Nullable<HistoryResourceManager<Texture2D>>;\r\n /**\r\n * Scene depth attachment for intermediate passes that depth-test against\r\n * scene depth: either a graph texture handle or a backend depth texture.\r\n * Pass it as the depthAttachment of intermediate framebuffers; the final\r\n * pass gets it through createOutput({needDepthAttachment: true}).\r\n */\r\n readonly sceneDepthAttachment: unknown;\r\n /**\r\n * Ordering/lifetime dependencies that every pass created by this effect must\r\n * declare with {@link RGPassBuilder.read}.\r\n * @internal\r\n */\r\n readonly dependencies: readonly RGHandle[];\r\n /**\r\n * History texture bindings that must be in a read scope while this effect\r\n * executes (legacy apply path).\r\n * @internal\r\n */\r\n readonly historyReads: readonly PostEffectHistoryRead[];\r\n /**\r\n * Create the output target for the effect's final pass.\r\n *\r\n * Must be called exactly once, inside the setup callback of the pass that\r\n * produces the effect's final color. The compositor decides whether this\r\n * resolves to an intermediate texture or a direct write to the final target.\r\n *\r\n * @param builder - The pass builder of the effect's final pass.\r\n * @param opts - Set needDepthAttachment when the pass depth-tests against scene depth.\r\n * @returns The resolved output target.\r\n */\r\n createOutput(builder: RGPassBuilder, opts?: { needDepthAttachment?: boolean }): PostEffectOutput;\r\n}\r\n\r\n/**\r\n * Base class for any type of post effect\r\n * @public\r\n */\r\nexport class AbstractPostEffect extends Disposable {\r\n private static _defaultRenderStates: { CompareFunc?: RenderStateSet } = {};\r\n protected _enabled: boolean;\r\n protected _layer: PostEffectLayer;\r\n /**\r\n * Creates an instance of a post effect\r\n * @param name - Name of the post effect\r\n */\r\n constructor() {\r\n super();\r\n this._enabled = true;\r\n this._layer = PostEffectLayer.end;\r\n }\r\n /** Whether this post effect is enabled */\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set enabled(val) {\r\n this._enabled = !!val;\r\n }\r\n /** Whether this post effect will be rendered at opaque phase */\r\n get layer() {\r\n return this._layer;\r\n }\r\n /**\r\n * Check if the post effect should be rendered upside down.\r\n * @param device - The device object\r\n * @returns true if the post effect should be rendered upside down\r\n */\r\n needFlip(device: AbstractDevice) {\r\n return device.type === 'webgpu' && !!device.getFramebuffer();\r\n }\r\n /**\r\n * Checks whether this post effect requires the linear depth texture\r\n * @returns true if the linear depth texture is required.\r\n */\r\n requireLinearDepthTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the scene depth buffer\r\n * @returns true if the scene depth buffer is required.\r\n */\r\n requireDepthAttachment(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the motion vector texture\r\n * @returns true if the motion vector texture is required.\r\n */\r\n requireMotionVectorTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires the Hi-Z depth pyramid. */\r\n requireHiZTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires opaque-scene world normals. */\r\n requireSceneNormalTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Checks whether this post effect requires opaque-scene roughness data. */\r\n requireSceneRoughnessTexture(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /**\r\n * Checks whether this post effect requires the screen-space shadow mask.\r\n *\r\n * When true and the mask was produced this frame, the effect can sample\r\n * `DrawContext.shadowMaskTexture` in its apply() body; the graph keeps the\r\n * mask alive for the effect's pass.\r\n * @returns true if the shadow mask is required.\r\n */\r\n requireShadowMask(_ctx: DrawContext) {\r\n return false;\r\n }\r\n /** Collect this effect's semantic frame-resource requirements. @internal */\r\n getFrameResourceRequirements(ctx: DrawContext): FrameResourceRequirements {\r\n return {\r\n motionVector: this.requireMotionVectorTexture(ctx),\r\n hiZ: this.requireHiZTexture(ctx),\r\n sceneNormal: this.requireSceneNormalTexture(ctx),\r\n sceneRoughness: this.requireSceneRoughnessTexture(ctx),\r\n shadowMask: this.requireShadowMask(ctx)\r\n };\r\n }\r\n /**\r\n * Apply the post effect\r\n * @param camera - Camera used the render the scene\r\n * @param inputColorTexture - The previous scene color texture\r\n * @param sceneDepthTexture - The linear scene depth texture\r\n * @param srgbOutput - Whether the result should be gamma corrected\r\n *\r\n * @remarks\r\n * The frame buffer of the post effect is already set when apply() is called.\r\n */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n }\r\n /**\r\n * Declare this effect's passes on the render graph.\r\n *\r\n * The default implementation wraps {@link AbstractPostEffect.apply} into a\r\n * single graph pass, so effects only overriding apply() work unchanged.\r\n * Multi-pass effects override this method to declare each internal step as\r\n * its own pass, calling {@link PostEffectSetupContext.createOutput} inside\r\n * the final pass.\r\n *\r\n * @param s - Build-time setup context.\r\n * @returns The effect's output color handle.\r\n */\r\n setup(s: PostEffectSetupContext): RGHandle {\r\n return this._setupFromApply(s);\r\n }\r\n /**\r\n * Wraps the legacy apply() entry into a single graph pass.\r\n * @internal\r\n */\r\n protected _setupFromApply(s: PostEffectSetupContext): RGHandle {\r\n const passName = `PostEffect:${this.constructor.name}`;\r\n return s.graph.addPass(passName, (builder) => {\r\n builder.read(s.input);\r\n for (const dep of s.dependencies) {\r\n builder.read(dep);\r\n }\r\n for (const binding of s.historyReads) {\r\n builder.read(binding.handle);\r\n }\r\n // Declare reads according to the effect's declared requirements so the\r\n // executor keeps exactly the textures this effect samples alive. Effects\r\n // reaching frame textures through DrawContext fields must declare them\r\n // via requireLinearDepthTexture / requireMotionVectorTexture.\r\n const linearDepthHandle = this.requireLinearDepthTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.LinearDepth)\r\n : null;\r\n if (linearDepthHandle) {\r\n builder.read(linearDepthHandle);\r\n }\r\n const motionVectorHandle = this.requireMotionVectorTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.MotionVector)\r\n : null;\r\n if (motionVectorHandle) {\r\n builder.read(motionVectorHandle);\r\n }\r\n const hiZHandle = this.requireHiZTexture(s.ctx) ? s.blackboard.get(FrameResources.HiZ) : null;\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n const sceneNormalHandle = this.requireSceneNormalTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.SceneNormal)\r\n : null;\r\n if (sceneNormalHandle) {\r\n builder.read(sceneNormalHandle);\r\n }\r\n const sceneRoughnessHandle = this.requireSceneRoughnessTexture(s.ctx)\r\n ? s.blackboard.get(FrameResources.SceneRoughness)\r\n : null;\r\n if (sceneRoughnessHandle) {\r\n builder.read(sceneRoughnessHandle);\r\n }\r\n // Keep the screen-space shadow mask alive for effects that sample it\r\n // (via DrawContext.shadowMaskTexture) instead of recomputing shadows.\r\n const shadowMaskHandle = this.requireShadowMask(s.ctx)\r\n ? s.blackboard.get(FrameResources.ShadowMask)\r\n : null;\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n const output = s.createOutput(builder, {\r\n needDepthAttachment: this.requireDepthAttachment(s.ctx)\r\n });\r\n builder.setExecute((rg) => {\r\n const device = s.ctx.device;\r\n const inputTexture = rg.getTexture<Texture2D>(s.input);\r\n const linearDepthTexture = linearDepthHandle\r\n ? rg.getTexture<Texture2D>(linearDepthHandle)\r\n : s.ctx.linearDepthTexture!;\r\n const applyEffect = () => {\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 // A framebuffer bind may be a backend no-op when the requested target is already\r\n // current. Never let a previous multi-resolution effect (for example Bloom) leak its\r\n // smaller viewport/scissor into this fullscreen pass.\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n this.apply(s.ctx, inputTexture, linearDepthTexture, output.srgbOutput);\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n };\r\n if (s.history && s.historyReads.length > 0) {\r\n s.history.beginReadScope(\r\n s.historyReads.map((binding) => ({\r\n name: binding.name,\r\n texture: rg.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n applyEffect();\r\n } finally {\r\n s.history.endReadScope();\r\n }\r\n } else {\r\n applyEffect();\r\n }\r\n });\r\n return output.color;\r\n });\r\n }\r\n /**\r\n *\r\n * @param ctx - Draw context\r\n * @param inputColorTexture - Input color texture\r\n * @param srgbOutput - Whether the result should be gamma corrected\r\n */\r\n protected passThrough(\r\n ctx: DrawContext,\r\n inputColorTexture: Texture2D,\r\n srgbOutput: boolean,\r\n renderStates?: RenderStateSet\r\n ) {\r\n copyTexture(\r\n inputColorTexture,\r\n ctx.device.getFramebuffer()!,\r\n fetchSampler('clamp_nearest_nomip'),\r\n renderStates,\r\n 0,\r\n srgbOutput\r\n );\r\n }\r\n /**\r\n * Draws a fullscreen quad\r\n * @param renderStateSet - Render states that will be used when drawing the fullscreen quad.\r\n */\r\n protected drawFullscreenQuad(renderStateSet?: RenderStateSet) {\r\n drawFullscreenQuad(renderStateSet);\r\n }\r\n /** @internal */\r\n protected createVertexLayout(device: AbstractDevice) {\r\n return device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer('position_f32x2', new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]))!\r\n }\r\n ]\r\n });\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this.destroy();\r\n }\r\n /** @internal */\r\n protected createRenderStates(device: AbstractDevice) {\r\n const renderStates = device.createRenderStateSet();\r\n renderStates.useRasterizerState().setCullMode('none');\r\n renderStates.useDepthState().enableTest(false).enableWrite(false);\r\n return renderStates;\r\n }\r\n /** @internal */\r\n protected destroy() {}\r\n /** @internal */\r\n static getDefaultRenderState(ctx: DrawContext, compareFunc: CompareFunc) {\r\n let renderState = this._defaultRenderStates[compareFunc as keyof typeof this._defaultRenderStates];\r\n if (!renderState) {\r\n renderState = ctx.device.createRenderStateSet();\r\n renderState.useRasterizerState().setCullMode('none');\r\n renderState\r\n .useDepthState()\r\n .enableTest(compareFunc !== 'always')\r\n .enableWrite(false)\r\n .setCompareFunc(compareFunc);\r\n this._defaultRenderStates[compareFunc as keyof typeof this._defaultRenderStates] = renderState;\r\n }\r\n return renderState;\r\n }\r\n}\r\n"],"names":["PostEffectLayer","AbstractPostEffect","Disposable","_defaultRenderStates","_enabled","_layer","enabled","val","layer","needFlip","device","type","getFramebuffer","requireLinearDepthTexture","_ctx","requireDepthAttachment","requireMotionVectorTexture","requireHiZTexture","requireSceneNormalTexture","requireSceneRoughnessTexture","requireShadowMask","getFrameResourceRequirements","ctx","motionVector","hiZ","sceneNormal","sceneRoughness","shadowMask","apply","inputColorTexture","sceneDepthTexture","srgbOutput","passThrough","setup","s","_setupFromApply","passName","name","graph","addPass","builder","read","input","dep","dependencies","binding","historyReads","handle","linearDepthHandle","blackboard","get","FrameResources","LinearDepth","motionVectorHandle","MotionVector","hiZHandle","HiZ","sceneNormalHandle","SceneNormal","sceneRoughnessHandle","SceneRoughness","shadowMaskHandle","ShadowMask","output","createOutput","needDepthAttachment","setExecute","rg","inputTexture","getTexture","linearDepthTexture","applyEffect","pushDeviceStates","setFramebuffer","framebuffer","setViewport","setScissor","popDeviceStates","history","length","beginReadScope","map","texture","endReadScope","color","renderStates","copyTexture","fetchSampler","drawFullscreenQuad","renderStateSet","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","Float32Array","onDispose","destroy","createRenderStates","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","getDefaultRenderState","compareFunc","renderState","setCompareFunc"],"mappings":"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"}
|