@zephyr3d/scene 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/dist/animation/animationset.js +563 -128
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/cloth/gpu_cloth_system.js +2516 -0
  4. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -0
  5. package/dist/animation/fixed_geometry_cache_track.js +138 -0
  6. package/dist/animation/fixed_geometry_cache_track.js.map +1 -0
  7. package/dist/animation/geometry_cache_utils.js +120 -0
  8. package/dist/animation/geometry_cache_utils.js.map +1 -0
  9. package/dist/animation/ik_modifier.js +9 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +469 -0
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -0
  13. package/dist/animation/joint_dynamics/constraints.js +329 -0
  14. package/dist/animation/joint_dynamics/constraints.js.map +1 -0
  15. package/dist/animation/joint_dynamics/controller.js +699 -0
  16. package/dist/animation/joint_dynamics/controller.js.map +1 -0
  17. package/dist/animation/joint_dynamics/joint_dynamics_system.js +393 -0
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -0
  19. package/dist/animation/joint_dynamics/solver.js +794 -0
  20. package/dist/animation/joint_dynamics/solver.js.map +1 -0
  21. package/dist/animation/joint_dynamics/types.js +19 -0
  22. package/dist/animation/joint_dynamics/types.js.map +1 -0
  23. package/dist/animation/joint_dynamics/vrm_spring_bone.js +46 -0
  24. package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +1 -0
  25. package/dist/animation/joint_dynamics_modifier.js +51 -0
  26. package/dist/animation/joint_dynamics_modifier.js.map +1 -0
  27. package/dist/animation/pca_geometry_cache_track.js +222 -0
  28. package/dist/animation/pca_geometry_cache_track.js.map +1 -0
  29. package/dist/animation/skeleton.js +1907 -3
  30. package/dist/animation/skeleton.js.map +1 -1
  31. package/dist/animation/skeleton_modifier.js +3 -5
  32. package/dist/animation/skeleton_modifier.js.map +1 -1
  33. package/dist/animation/spring/multi_chain_spring_system.js +2 -0
  34. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  35. package/dist/animation/spring/spring_chain.js +3 -2
  36. package/dist/animation/spring/spring_chain.js.map +1 -1
  37. package/dist/animation/spring/spring_collider.js +35 -5
  38. package/dist/animation/spring/spring_collider.js.map +1 -1
  39. package/dist/animation/spring/spring_particle.js +1 -0
  40. package/dist/animation/spring/spring_particle.js.map +1 -1
  41. package/dist/animation/spring/spring_system.js +325 -28
  42. package/dist/animation/spring/spring_system.js.map +1 -1
  43. package/dist/animation/spring2/collision.js +469 -0
  44. package/dist/animation/spring2/collision.js.map +1 -0
  45. package/dist/animation/spring2/constraints.js +329 -0
  46. package/dist/animation/spring2/constraints.js.map +1 -0
  47. package/dist/animation/spring2/controller.js +434 -0
  48. package/dist/animation/spring2/controller.js.map +1 -0
  49. package/dist/animation/spring2/math.js +16 -0
  50. package/dist/animation/spring2/math.js.map +1 -0
  51. package/dist/animation/spring2/solver.js +624 -0
  52. package/dist/animation/spring2/solver.js.map +1 -0
  53. package/dist/animation/spring2/spring_system.js +118 -0
  54. package/dist/animation/spring2/spring_system.js.map +1 -0
  55. package/dist/animation/spring2/types.js +19 -0
  56. package/dist/animation/spring2/types.js.map +1 -0
  57. package/dist/animation/spring_modifier.js +17 -1
  58. package/dist/animation/spring_modifier.js.map +1 -1
  59. package/dist/app/engine.js +42 -15
  60. package/dist/app/engine.js.map +1 -1
  61. package/dist/app/runtimescript.js +132 -1
  62. package/dist/app/runtimescript.js.map +1 -1
  63. package/dist/app/screen.js +3 -3
  64. package/dist/app/screen.js.map +1 -1
  65. package/dist/app/scriptingsystem.js +69 -37
  66. package/dist/app/scriptingsystem.js.map +1 -1
  67. package/dist/app/scriptregistry.js +157 -146
  68. package/dist/app/scriptregistry.js.map +1 -1
  69. package/dist/asset/assetmanager.js +2 -1
  70. package/dist/asset/assetmanager.js.map +1 -1
  71. package/dist/asset/loaders/zabc/zabc_loader.js +570 -0
  72. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -0
  73. package/dist/asset/model.js +192 -0
  74. package/dist/asset/model.js.map +1 -1
  75. package/dist/camera/base.js +26 -7
  76. package/dist/camera/base.js.map +1 -1
  77. package/dist/camera/camera.js +146 -24
  78. package/dist/camera/camera.js.map +1 -1
  79. package/dist/camera/fps.js +2 -2
  80. package/dist/camera/fps.js.map +1 -1
  81. package/dist/camera/orbit.js +2 -2
  82. package/dist/camera/orbit.js.map +1 -1
  83. package/dist/index.d.ts +11701 -8506
  84. package/dist/index.js +29 -8
  85. package/dist/index.js.map +1 -1
  86. package/dist/material/lambert.js +1 -1
  87. package/dist/material/lambert.js.map +1 -1
  88. package/dist/material/material.js +9 -3
  89. package/dist/material/material.js.map +1 -1
  90. package/dist/material/meshmaterial.js +54 -7
  91. package/dist/material/meshmaterial.js.map +1 -1
  92. package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
  93. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  94. package/dist/material/mixins/lightmodel/lambert.js +7 -2
  95. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  96. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +108 -16
  97. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  98. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +222 -14
  99. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  100. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +24 -12
  101. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  102. package/dist/material/mixins/lit.js +11 -8
  103. package/dist/material/mixins/lit.js.map +1 -1
  104. package/dist/material/mixins/pbr/common.js +72 -5
  105. package/dist/material/mixins/pbr/common.js.map +1 -1
  106. package/dist/material/pbrblueprint.js +148 -1
  107. package/dist/material/pbrblueprint.js.map +1 -1
  108. package/dist/material/pbrmr.js +125 -2
  109. package/dist/material/pbrmr.js.map +1 -1
  110. package/dist/material/shader/helper.js +10 -4
  111. package/dist/material/shader/helper.js.map +1 -1
  112. package/dist/material/water.js +2 -2
  113. package/dist/material/water.js.map +1 -1
  114. package/dist/posteffect/coloradjust.js +145 -0
  115. package/dist/posteffect/coloradjust.js.map +1 -0
  116. package/dist/posteffect/taa.js +68 -32
  117. package/dist/posteffect/taa.js.map +1 -1
  118. package/dist/render/cluster_light.js +17 -12
  119. package/dist/render/cluster_light.js.map +1 -1
  120. package/dist/render/deferredlightpass.js +510 -0
  121. package/dist/render/deferredlightpass.js.map +1 -0
  122. package/dist/render/deferredshadowlightpass.js +428 -0
  123. package/dist/render/deferredshadowlightpass.js.map +1 -0
  124. package/dist/render/drawable.js.map +1 -1
  125. package/dist/render/drawable_mixin.js +21 -12
  126. package/dist/render/drawable_mixin.js.map +1 -1
  127. package/dist/render/envlight.js +20 -22
  128. package/dist/render/envlight.js.map +1 -1
  129. package/dist/render/gbufferpass.js +50 -0
  130. package/dist/render/gbufferpass.js.map +1 -0
  131. package/dist/render/lightpass.js +1 -2
  132. package/dist/render/lightpass.js.map +1 -1
  133. package/dist/render/primitive.js +1 -1
  134. package/dist/render/primitive.js.map +1 -1
  135. package/dist/render/render_queue.js +3 -2
  136. package/dist/render/render_queue.js.map +1 -1
  137. package/dist/render/renderer.js +5 -358
  138. package/dist/render/renderer.js.map +1 -1
  139. package/dist/render/rendergraph/executor.js +15 -12
  140. package/dist/render/rendergraph/executor.js.map +1 -1
  141. package/dist/render/rendergraph/forward_plus_builder.js +144 -88
  142. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  143. package/dist/render/rendergraph/history_resource_manager.js +178 -0
  144. package/dist/render/rendergraph/history_resource_manager.js.map +1 -0
  145. package/dist/render/rendergraph/rendergraph.js +12 -1
  146. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  147. package/dist/render/rendergraph/types.js +2 -2
  148. package/dist/render/rendergraph/types.js.map +1 -1
  149. package/dist/render/sky.js +26 -9
  150. package/dist/render/sky.js.map +1 -1
  151. package/dist/scene/basesprite.js +4 -3
  152. package/dist/scene/basesprite.js.map +1 -1
  153. package/dist/scene/batchgroup.js +4 -4
  154. package/dist/scene/environment.js +7 -4
  155. package/dist/scene/environment.js.map +1 -1
  156. package/dist/scene/light.js +184 -18
  157. package/dist/scene/light.js.map +1 -1
  158. package/dist/scene/mesh.js +30 -0
  159. package/dist/scene/mesh.js.map +1 -1
  160. package/dist/scene/particlesys.js +3 -2
  161. package/dist/scene/particlesys.js.map +1 -1
  162. package/dist/scene/raycast_visitor.js +29 -3
  163. package/dist/scene/raycast_visitor.js.map +1 -1
  164. package/dist/scene/scene.js +86 -19
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/scene_node.js +87 -31
  167. package/dist/scene/scene_node.js.map +1 -1
  168. package/dist/scene/script_attachment.js +59 -0
  169. package/dist/scene/script_attachment.js.map +1 -0
  170. package/dist/scene/terrain-cm/grass.js +3 -2
  171. package/dist/scene/terrain-cm/grass.js.map +1 -1
  172. package/dist/scene/terrain-cm/terrain-cm.js +4 -3
  173. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  174. package/dist/scene/water.js +3 -2
  175. package/dist/scene/water.js.map +1 -1
  176. package/dist/shaders/shadow.js +2 -2
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shadow/shadowmapper.js +74 -4
  179. package/dist/shadow/shadowmapper.js.map +1 -1
  180. package/dist/shapes/box.js +163 -0
  181. package/dist/shapes/box.js.map +1 -1
  182. package/dist/shapes/capsule.js +216 -0
  183. package/dist/shapes/capsule.js.map +1 -0
  184. package/dist/shapes/cylinder.js +91 -0
  185. package/dist/shapes/cylinder.js.map +1 -1
  186. package/dist/shapes/plane.js +32 -0
  187. package/dist/shapes/plane.js.map +1 -1
  188. package/dist/shapes/tetrahedron.js +211 -0
  189. package/dist/shapes/tetrahedron.js.map +1 -1
  190. package/dist/shapes/torus.js +173 -0
  191. package/dist/shapes/torus.js.map +1 -1
  192. package/dist/utility/blueprint/common/math.js +111 -1
  193. package/dist/utility/blueprint/common/math.js.map +1 -1
  194. package/dist/utility/blueprint/material/inputs.js +235 -1
  195. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  196. package/dist/utility/blueprint/material/ir.js +154 -10
  197. package/dist/utility/blueprint/material/ir.js.map +1 -1
  198. package/dist/utility/blueprint/material/texture.js +273 -19
  199. package/dist/utility/blueprint/material/texture.js.map +1 -1
  200. package/dist/utility/serialization/json.js +12 -2
  201. package/dist/utility/serialization/json.js.map +1 -1
  202. package/dist/utility/serialization/manager.js +30 -11
  203. package/dist/utility/serialization/manager.js.map +1 -1
  204. package/dist/utility/serialization/scene/animation.js +250 -7
  205. package/dist/utility/serialization/scene/animation.js.map +1 -1
  206. package/dist/utility/serialization/scene/batch.js +4 -2
  207. package/dist/utility/serialization/scene/batch.js.map +1 -1
  208. package/dist/utility/serialization/scene/camera.js +154 -2
  209. package/dist/utility/serialization/scene/camera.js.map +1 -1
  210. package/dist/utility/serialization/scene/cloth_script.js +834 -0
  211. package/dist/utility/serialization/scene/cloth_script.js.map +1 -0
  212. package/dist/utility/serialization/scene/common.js +7 -0
  213. package/dist/utility/serialization/scene/common.js.map +1 -1
  214. package/dist/utility/serialization/scene/light.js +120 -4
  215. package/dist/utility/serialization/scene/light.js.map +1 -1
  216. package/dist/utility/serialization/scene/material.js +453 -1
  217. package/dist/utility/serialization/scene/material.js.map +1 -1
  218. package/dist/utility/serialization/scene/mesh.js +4 -2
  219. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  220. package/dist/utility/serialization/scene/node.js +298 -10
  221. package/dist/utility/serialization/scene/node.js.map +1 -1
  222. package/dist/utility/serialization/scene/particle.js +4 -2
  223. package/dist/utility/serialization/scene/particle.js.map +1 -1
  224. package/dist/utility/serialization/scene/primitive.js +100 -3
  225. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  226. package/dist/utility/serialization/scene/scene.js +130 -3
  227. package/dist/utility/serialization/scene/scene.js.map +1 -1
  228. package/dist/utility/serialization/scene/script.js +66 -0
  229. package/dist/utility/serialization/scene/script.js.map +1 -0
  230. package/dist/utility/serialization/scene/spring_script.js +596 -0
  231. package/dist/utility/serialization/scene/spring_script.js.map +1 -0
  232. package/dist/utility/serialization/scene/sprite.js +5 -3
  233. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  234. package/dist/utility/serialization/scene/terrain.js +4 -2
  235. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  236. package/dist/utility/serialization/scene/water.js +4 -2
  237. package/dist/utility/serialization/scene/water.js.map +1 -1
  238. package/dist/utility/serialization/types.js.map +1 -1
  239. package/dist/values.js +5 -1
  240. package/dist/values.js.map +1 -1
  241. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { LightPass } from './lightpass';\r\nimport { ShadowMapPass } from './shadowmap_pass';\r\nimport { DepthPass } from './depthpass';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { isPowerOf2, Matrix4x4, nextPowerOf2, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n ColorState,\r\n FrameBuffer,\r\n GPUProgram,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { PunctualLight, Scene } from '../scene';\r\nimport { type PickResult, Camera } from '../camera';\r\nimport { AbstractPostEffect, PostEffectLayer } from '../posteffect/posteffect';\r\nimport { ClusteredLight } from './cluster_light';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { ObjectColorPass } from './objectcolorpass';\r\nimport { buildHiZ } from './hzb';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Primitive } from '.';\r\nimport { BoxShape } from '../shapes';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /** @internal */\r\n private static _skyMotionVectorProgram: Nullable<GPUProgram> = null;\r\n /** @internal */\r\n private static _skyMotionVectorBindGroup: Nullable<BindGroup> = null;\r\n private static _box: Nullable<Primitive> = null;\r\n /** @internal */\r\n private static readonly _pickCamera = new Camera(null);\r\n /** @internal */\r\n private static readonly _scenePass = new LightPass();\r\n /** @internal */\r\n private static readonly _depthPass = new DepthPass();\r\n /** @internal */\r\n private static readonly _shadowMapPass = new ShadowMapPass();\r\n /** @internal */\r\n private static readonly _objectColorPass = new ObjectColorPass();\r\n /** @internal */\r\n private static _frontDepthColorState: Nullable<ColorState> = null;\r\n /** @internal */\r\n private static _backDepthColorState: Nullable<ColorState> = null;\r\n /** @internal */\r\n private static readonly _clusters: ClusteredLight[] = [];\r\n /** lighting render pass */\r\n static get sceneRenderPass() {\r\n return this._scenePass;\r\n }\r\n /** depth render pass */\r\n static get depthRenderPass() {\r\n return this._depthPass;\r\n }\r\n /** shadow map render pass */\r\n static get shadowMapRenderPass() {\r\n return this._shadowMapPass;\r\n }\r\n /** @internal */\r\n static getClusteredLight() {\r\n if (this._clusters.length > 0) {\r\n return this._clusters.pop()!;\r\n }\r\n return new ClusteredLight();\r\n }\r\n /** @internal */\r\n static freeClusteredLight(clusteredLight: ClusteredLight) {\r\n this._clusters.push(clusteredLight);\r\n }\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene tondered\r\n * @param camera - The camera that will be used to render the scene\r\n * @param compositor - The compositor that will be used to apply postprocess effects\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const colorFormat =\r\n camera.HDR && device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth <= 0 || renderHeight <= 0) {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors: device.type !== 'webgl' && (camera.TAA || camera.motionBlur),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n SSRRoughnessTexture: device.pool.fetchTemporalTexture2D(\r\n true,\r\n 'rgba8unorm',\r\n renderWidth,\r\n renderHeight\r\n ),\r\n SSRNormalTexture: device.pool.fetchTemporalTexture2D(true, 'rgba8unorm', renderWidth, renderHeight),\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n private static renderSceneDepth(\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n depthFramebuffer: Nullable<FrameBuffer>\r\n ) {\r\n const transmission = !!depthFramebuffer;\r\n if (!depthFramebuffer) {\r\n const format: TextureFormat =\r\n ctx.device.type === 'webgl'\r\n ? ctx.SSRCalcThickness\r\n ? 'rgba16f'\r\n : 'rgba8unorm'\r\n : ctx.SSRCalcThickness\r\n ? 'rg32f'\r\n : 'r32f';\r\n const mvFormat: TextureFormat = 'rgba16f';\r\n if (!ctx.finalFramebuffer) {\r\n depthFramebuffer = ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.renderWidth,\r\n ctx.renderHeight,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n ctx.depthFormat,\r\n false\r\n );\r\n } else {\r\n const originDepth = ctx.finalFramebuffer?.getDepthAttachment();\r\n depthFramebuffer = originDepth?.isTexture2D()\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n originDepth.width,\r\n originDepth.height,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n originDepth,\r\n false\r\n )\r\n : ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.renderWidth,\r\n ctx.renderHeight,\r\n ctx.motionVectors ? [format, mvFormat] : format,\r\n ctx.depthFormat,\r\n false\r\n );\r\n }\r\n }\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(depthFramebuffer);\r\n this._depthPass.encodeDepth = depthFramebuffer.getColorAttachments()[0].format === 'rgba8unorm';\r\n this._depthPass.clearColor = transmission\r\n ? null\r\n : this._depthPass.encodeDepth\r\n ? new Vector4(0, 0, 0, 1)\r\n : new Vector4(1, 1, 1, 1);\r\n this._depthPass.clearDepth = transmission ? null : 1;\r\n this._depthPass.clearStencil = null;\r\n this._depthPass.transmission = transmission;\r\n if (ctx.SSRCalcThickness && !transmission) {\r\n if (!this._backDepthColorState) {\r\n this._backDepthColorState = ctx.device.createColorState().setColorMask(false, true, false, false);\r\n }\r\n if (!this._frontDepthColorState) {\r\n this._frontDepthColorState = ctx.device.createColorState().setColorMask(true, false, false, false);\r\n }\r\n ctx.forceColorState = this._backDepthColorState;\r\n ctx.forceCullMode = 'front';\r\n this._depthPass.renderBackface = true;\r\n this._depthPass.transmission = false;\r\n this._depthPass.render(ctx, null, null, renderQueue);\r\n this._depthPass.clearColor = null;\r\n this._depthPass.renderBackface = false;\r\n ctx.forceColorState = this._frontDepthColorState;\r\n ctx.forceCullMode = null;\r\n }\r\n this._depthPass.render(ctx, null, null, renderQueue);\r\n ctx.forceColorState = null;\r\n ctx.device.popDeviceStates();\r\n\r\n if (!transmission) {\r\n ctx.motionVectorTexture = ctx.motionVectors\r\n ? (depthFramebuffer.getColorAttachments()[1] as Texture2D)\r\n : null;\r\n ctx.linearDepthTexture = depthFramebuffer.getColorAttachments()[0] as Texture2D;\r\n ctx.depthTexture = depthFramebuffer.getDepthAttachment() as Texture2D;\r\n if (ctx.motionVectorTexture) {\r\n this.renderSkyMotionVectors(ctx);\r\n }\r\n if (ctx.HiZ) {\r\n let w = isPowerOf2(ctx.linearDepthTexture.width)\r\n ? ctx.linearDepthTexture.width\r\n : nextPowerOf2(ctx.linearDepthTexture.width);\r\n let h = isPowerOf2(ctx.linearDepthTexture.height)\r\n ? ctx.linearDepthTexture.height\r\n : nextPowerOf2(ctx.linearDepthTexture.height);\r\n w = Math.max(1, w >> 1);\r\n h = Math.max(1, h >> 1);\r\n w = ctx.linearDepthTexture.width;\r\n h = ctx.linearDepthTexture.height;\r\n const HiZFrameBuffer = ctx.device.pool.fetchTemporalFramebuffer(\r\n true,\r\n w,\r\n h,\r\n ctx.linearDepthTexture.format,\r\n null,\r\n true\r\n );\r\n buildHiZ(ctx.depthTexture, HiZFrameBuffer);\r\n ctx.HiZTexture = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n }\r\n }\r\n return depthFramebuffer;\r\n }\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext) {\r\n const device = ctx.device;\r\n\r\n // Cull scene\r\n const renderQueue = this._scenePass.cullScene(ctx, ctx.camera);\r\n\r\n // Update sky\r\n const sunLightColor = ctx.scene.env.sky.update(ctx);\r\n\r\n // Gather lights\r\n ctx.clusteredLight = this.getClusteredLight();\r\n ctx.clusteredLight.calculateLightIndex(ctx.camera, renderQueue);\r\n\r\n // Do GPU ray picking if required\r\n const pickResolveFunc = ctx.camera.getPickResultResolveFunc();\r\n if (pickResolveFunc) {\r\n this.renderObjectColors(ctx, pickResolveFunc, renderQueue);\r\n }\r\n\r\n // Render shadow maps\r\n this.renderShadowMaps(ctx, renderQueue.shadowedLights);\r\n\r\n // Render scene depth first\r\n const depthFramebuffer = this.renderSceneDepth(ctx, renderQueue, null);\r\n if (ctx.depthTexture === ctx.finalFramebuffer?.getDepthAttachment()) {\r\n ctx.intermediateFramebuffer = ctx.finalFramebuffer;\r\n } else {\r\n // TODO: fetch resizable framebuffer if ctx.defaultViewport is true\r\n ctx.intermediateFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.depthTexture!.width,\r\n ctx.depthTexture!.height,\r\n ctx.colorFormat!,\r\n ctx.depthTexture\r\n );\r\n }\r\n if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(ctx.intermediateFramebuffer);\r\n } else {\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n this._scenePass.transmission = false; // transmission\r\n this._scenePass.clearDepth = ctx.depthTexture ? null : 1;\r\n this._scenePass.clearStencil = ctx.depthTexture ? null : 0;\r\n if (ctx.SSR && !renderQueue.needSceneColor()) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n }\r\n ctx.compositor?.begin(ctx);\r\n if (renderQueue.needSceneColor()) {\r\n const compositor = ctx.compositor;\r\n ctx.compositor = null;\r\n const sceneColorFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n true,\r\n ctx.depthTexture!.width,\r\n ctx.depthTexture!.height,\r\n ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS\r\n ? [\r\n ctx.colorFormat!,\r\n device.getFramebuffer()!.getColorAttachments()[1]!,\r\n device.getFramebuffer()!.getColorAttachments()[2]!\r\n ]\r\n : ctx.colorFormat!,\r\n ctx.depthTexture,\r\n false\r\n );\r\n device.pushDeviceStates();\r\n device.setFramebuffer(sceneColorFramebuffer);\r\n this._scenePass.transmission = false;\r\n this._scenePass.render(ctx, null, null, renderQueue);\r\n device.popDeviceStates();\r\n ctx.sceneColorTexture = sceneColorFramebuffer.getColorAttachments()[0] as Texture2D;\r\n new CopyBlitter().blit(\r\n ctx.sceneColorTexture,\r\n device.getFramebuffer() ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n this._scenePass.transmission = true;\r\n this._scenePass.clearColor = null;\r\n this._scenePass.clearDepth = null;\r\n this._scenePass.clearStencil = null;\r\n ctx.compositor = compositor;\r\n }\r\n this._scenePass.render(ctx, null, null, renderQueue);\r\n if (renderQueue.needSceneColor()) {\r\n this.renderSceneDepth(ctx, renderQueue, depthFramebuffer);\r\n }\r\n ctx.compositor?.drawPostEffects(ctx, PostEffectLayer.end, ctx.linearDepthTexture!);\r\n ctx.compositor?.end(ctx);\r\n renderQueue.dispose();\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n\r\n if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {\r\n const blitter = new CopyBlitter();\r\n blitter.srgbOut = !ctx.finalFramebuffer;\r\n const srcTex = ctx.intermediateFramebuffer.getColorAttachments()[0] as Texture2D;\r\n blitter.blit(srcTex, ctx.finalFramebuffer ?? null, fetchSampler('clamp_nearest_nomip'));\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(ctx.intermediateFramebuffer);\r\n }\r\n //ShadowMapper.releaseTemporalResources(ctx);\r\n this.freeClusteredLight(ctx.clusteredLight);\r\n\r\n // Restore sun color\r\n if (sunLightColor) {\r\n ctx.sunLight!.color = sunLightColor;\r\n }\r\n }\r\n private static _getSkyMotionVectorProgram(ctx: DrawContext) {\r\n if (!this._skyMotionVectorProgram) {\r\n this._skyMotionVectorProgram = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec3().attrib('position');\r\n this.VPMatrix = pb.mat4().uniform(0);\r\n this.prevVPMatrix = pb.mat4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n this.prevCameraPos = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.add(this.$inputs.pos, this.cameraPos);\r\n this.$l.prevWorldPos = pb.add(this.$inputs.pos, this.prevCameraPos);\r\n this.$l.clipPos = pb.mul(this.VPMatrix, pb.vec4(this.worldPos, 1));\r\n this.$l.prevClipPos = pb.mul(this.prevVPMatrix, pb.vec4(this.prevWorldPos, 1));\r\n this.clipPos.z = this.clipPos.w;\r\n this.$builtins.position = this.clipPos;\r\n this.$outputs.currentPos = this.clipPos;\r\n this.$outputs.prevPos = this.prevClipPos;\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n pb.main(function () {\r\n this.$l.motionVector = pb.mul(\r\n pb.sub(\r\n pb.div(this.$inputs.currentPos.xy, this.$inputs.currentPos.w),\r\n pb.div(this.$inputs.prevPos.xy, this.$inputs.prevPos.w)\r\n ),\r\n 0.5\r\n );\r\n this.$outputs.color = pb.vec4(this.motionVector, 0, 1);\r\n });\r\n }\r\n })!;\r\n this._skyMotionVectorProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n return this._skyMotionVectorProgram;\r\n }\r\n private static _getBox(_ctx: DrawContext) {\r\n if (!this._box) {\r\n this._box = new BoxShape({\r\n size: 2,\r\n needNormal: false,\r\n needUV: false\r\n });\r\n }\r\n return this._box;\r\n }\r\n /** @internal */\r\n private static renderSkyMotionVectors(ctx: DrawContext) {\r\n if (!ctx.motionVectorTexture) {\r\n return;\r\n }\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n ctx.motionVectorTexture,\r\n ctx.depthTexture\r\n );\r\n const program = this._getSkyMotionVectorProgram(ctx);\r\n if (!this._skyMotionVectorBindGroup) {\r\n this._skyMotionVectorBindGroup = ctx.device.createBindGroup(program.bindGroupLayouts[0]);\r\n }\r\n const box = this._getBox(ctx);\r\n this._skyMotionVectorBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n this._skyMotionVectorBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n this._skyMotionVectorBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n this._skyMotionVectorBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setProgram(program);\r\n ctx.device.setBindGroup(0, this._skyMotionVectorBindGroup);\r\n ctx.device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, 'le'));\r\n ctx.device.setFramebuffer(fb);\r\n box.draw();\r\n ctx.device.popDeviceStates();\r\n ctx.device.pool.releaseFrameBuffer(fb);\r\n }\r\n /** @internal */\r\n private static renderShadowMaps(ctx: DrawContext, lights: PunctualLight[]) {\r\n ctx.renderPass = this._shadowMapPass;\r\n ctx.device.pushDeviceStates();\r\n for (const light of lights) {\r\n light.shadow.render(ctx, this._shadowMapPass);\r\n }\r\n ctx.device.popDeviceStates();\r\n }\r\n /** @internal */\r\n private static decodeNormalizedFloat(rgba: Uint8Array<ArrayBuffer>) {\r\n const a = rgba[0] / 255;\r\n const b = rgba[1] / 255;\r\n const c = rgba[2] / 255;\r\n const d = rgba[3] / 255;\r\n return a / (256 * 256 * 256) + b / (256 * 256) + c / 256 + d;\r\n }\r\n /** @internal */\r\n private static renderObjectColors(\r\n ctx: DrawContext,\r\n pickResolveFunc: (result: Nullable<PickResult>) => void,\r\n renderQueue: RenderQueue\r\n ) {\r\n const camera = ctx.camera;\r\n const isWebGL1 = ctx.device.type === 'webgl';\r\n ctx.renderPass = this._objectColorPass;\r\n ctx.device.pushDeviceStates();\r\n const fb = ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 1,\r\n 1,\r\n isWebGL1 ? ['rgba8unorm', 'rgba8unorm'] : ['rgba8unorm', 'rgba32f'],\r\n ctx.depthFormat,\r\n false\r\n );\r\n ctx.device.setViewport(camera.viewport);\r\n const vp = ctx.device.getViewport();\r\n const windowX = camera.getPickPosX() / vp.width;\r\n const windowY = (vp.height - camera.getPickPosY() - 1) / vp.height;\r\n const windowW = 1 / vp.width;\r\n const windowH = 1 / vp.height;\r\n const pickCamera = this._pickCamera;\r\n camera.worldMatrix.decompose(pickCamera.scale, pickCamera.rotation, pickCamera.position);\r\n let left = camera.getProjectionMatrix().getLeftPlane();\r\n let right = camera.getProjectionMatrix().getRightPlane();\r\n let bottom = camera.getProjectionMatrix().getBottomPlane();\r\n let top = camera.getProjectionMatrix().getTopPlane();\r\n const near = camera.getProjectionMatrix().getNearPlane();\r\n const far = camera.getProjectionMatrix().getFarPlane();\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * windowX;\r\n bottom += height * windowY;\r\n right = left + width * windowW;\r\n top = bottom + height * windowH;\r\n pickCamera.setProjectionMatrix(\r\n camera.isPerspective()\r\n ? Matrix4x4.frustum(left, right, bottom, top, near, far)\r\n : Matrix4x4.ortho(left, right, bottom, top, near, far)\r\n );\r\n const cameraPos = isWebGL1 ? new Vector3(pickCamera.position) : null;\r\n const ray = isWebGL1 ? camera.constructRay(camera.getPickPosX(), camera.getPickPosY()) : null;\r\n ctx.device.setFramebuffer(fb);\r\n this._objectColorPass.clearColor = Vector4.zero();\r\n this._objectColorPass.clearDepth = 1;\r\n const rq = this._objectColorPass.cullScene(ctx, pickCamera);\r\n this._objectColorPass.render(ctx, pickCamera, null, rq);\r\n rq.dispose();\r\n ctx.device.popDeviceStates();\r\n const colorTex = fb.getColorAttachments()[0];\r\n const distanceTex = fb.getColorAttachments()[1];\r\n const colorPixels = new Uint8Array(4);\r\n const distancePixels = isWebGL1 ? new Uint8Array(4) : new Float32Array(4);\r\n const device = ctx.device;\r\n let fence: Promise<void[]>;\r\n if (ctx.device.type === 'webgl') {\r\n fence = Promise.all([\r\n ctx.device.runNextFrameAsync(() => colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels)),\r\n ctx.device.runNextFrameAsync(() => distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels))\r\n ]);\r\n } else {\r\n fence = Promise.all([\r\n colorTex.readPixels(0, 0, 1, 1, 0, 0, colorPixels),\r\n distanceTex.readPixels(0, 0, 1, 1, 0, 0, distancePixels)\r\n ]);\r\n }\r\n fence\r\n .then(() => {\r\n const drawable = renderQueue.getDrawableByColor(colorPixels);\r\n let d = isWebGL1\r\n ? this.decodeNormalizedFloat(distancePixels as Uint8Array<ArrayBuffer>) * far\r\n : distancePixels[0];\r\n const intersectedPoint = new Vector3(distancePixels[0], distancePixels[1], distancePixels[2]);\r\n if (isWebGL1) {\r\n intersectedPoint.x = cameraPos!.x + ray!.direction.x * d;\r\n intersectedPoint.y = cameraPos!.y + ray!.direction.y * d;\r\n intersectedPoint.z = cameraPos!.z + ray!.direction.z * d;\r\n d = Vector3.distance(intersectedPoint, cameraPos!);\r\n }\r\n pickResolveFunc(\r\n drawable\r\n ? {\r\n distance: d,\r\n intersectedPoint,\r\n drawable,\r\n target: drawable.getPickTarget()\r\n }\r\n : null\r\n );\r\n device.pool.releaseFrameBuffer(fb);\r\n })\r\n .catch((_err) => {\r\n camera.getPickResultResolveFunc()?.(null);\r\n device.pool.releaseFrameBuffer(fb);\r\n });\r\n }\r\n}\r\n"],"names":["SceneRenderer","_skyMotionVectorProgram","_skyMotionVectorBindGroup","_box","_pickCamera","Camera","_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_objectColorPass","ObjectColorPass","_frontDepthColorState","_backDepthColorState","_clusters","sceneRenderPass","depthRenderPass","shadowMapRenderPass","getClusteredLight","length","pop","ClusteredLight","freeClusteredLight","clusteredLight","push","renderScene","scene","camera","device","getDevice","colorFormat","HDR","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","getPickResultResolveFunc","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","ctx","oit","motionVectors","type","TAA","motionBlur","HiZ","HiZTexture","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","fetchTemporalTexture2D","SSRNormalTexture","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","release","renderSceneDepth","renderQueue","depthFramebuffer","transmission","format","mvFormat","originDepth","getDepthAttachment","isTexture2D","width","height","encodeDepth","Vector4","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","render","motionVectorTexture","linearDepthTexture","depthTexture","renderSkyMotionVectors","w","isPowerOf2","nextPowerOf2","h","Math","max","HiZFrameBuffer","buildHiZ","cullScene","sunLightColor","sky","update","calculateLightIndex","pickResolveFunc","renderObjectColors","renderShadowMaps","shadowedLights","setViewport","setScissor","needSceneColor","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","begin","sceneColorFramebuffer","sceneColorTexture","drawPostEffects","PostEffectLayer","end","dispose","srcTex","sunLight","color","_getSkyMotionVectorProgram","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","add","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","name","_getBox","_ctx","BoxShape","size","needNormal","needUV","fb","program","createBindGroup","bindGroupLayouts","box","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","draw","lights","shadow","decodeNormalizedFloat","rgba","a","b","c","d","isWebGL1","vp","getViewport","windowX","getPickPosX","windowY","getPickPosY","windowW","windowH","pickCamera","worldMatrix","decompose","scale","rotation","left","getProjectionMatrix","getLeftPlane","right","getRightPlane","bottom","getBottomPlane","top","getTopPlane","near","getNearPlane","far","getFarPlane","setProjectionMatrix","isPerspective","Matrix4x4","frustum","ortho","Vector3","ray","constructRay","zero","rq","colorTex","distanceTex","colorPixels","Uint8Array","distancePixels","Float32Array","fence","Promise","all","runNextFrameAsync","readPixels","then","drawable","getDrawableByColor","intersectedPoint","x","direction","y","distance","target","getPickTarget","catch","_err"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA6BA;;;AAGC,IACM,MAAMA,aAAAA,CAAAA;qBAEX,OAAeC,uBAAAA,GAAgD,IAAK;qBAEpE,OAAeC,yBAAAA,GAAiD,IAAK;AACrE,IAAA,OAAeC,OAA4B,IAAK;AAChD,qBACA,OAAwBC,WAAc,GAAA,IAAIC,OAAO,IAAM,CAAA;AACvD,qBACA,OAAwBC,UAAa,GAAA,IAAIC,SAAY,EAAA;AACrD,qBACA,OAAwBC,UAAa,GAAA,IAAIC,SAAY,EAAA;AACrD,qBACA,OAAwBC,cAAiB,GAAA,IAAIC,aAAgB,EAAA;AAC7D,qBACA,OAAwBC,gBAAmB,GAAA,IAAIC,eAAkB,EAAA;qBAEjE,OAAeC,qBAAAA,GAA8C,IAAK;qBAElE,OAAeC,oBAAAA,GAA6C,IAAK;AACjE,qBACA,OAAwBC,SAA8B,GAAA,EAAE;gCAExD,WAAWC,eAAkB,GAAA;QAC3B,OAAO,IAAI,CAACX,UAAU;AACxB;6BAEA,WAAWY,eAAkB,GAAA;QAC3B,OAAO,IAAI,CAACV,UAAU;AACxB;kCAEA,WAAWW,mBAAsB,GAAA;QAC/B,OAAO,IAAI,CAACT,cAAc;AAC5B;qBAEA,OAAOU,iBAAoB,GAAA;AACzB,QAAA,IAAI,IAAI,CAACJ,SAAS,CAACK,MAAM,GAAG,CAAG,EAAA;AAC7B,YAAA,OAAO,IAAI,CAACL,SAAS,CAACM,GAAG,EAAA;AAC3B;AACA,QAAA,OAAO,IAAIC,cAAAA,EAAAA;AACb;AACA,qBACA,OAAOC,kBAAmBC,CAAAA,cAA8B,EAAE;AACxD,QAAA,IAAI,CAACT,SAAS,CAACU,IAAI,CAACD,cAAAA,CAAAA;AACtB;AACA;;;;;AAKC,MACD,OAAOE,WAAAA,CAAYC,KAAY,EAAEC,MAAc,EAAQ;AACrD,QAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;QACf,MAAMC,WAAAA,GACJH,MAAOI,CAAAA,GAAG,IAAIH,MAAAA,CAAOI,aAAa,EAAA,CAAGC,WAAW,CAACC,2BAA2B,GAAG,SAAY,GAAA,YAAA;QAC7F,MAAMC,WAAAA,GAAcP,OAAOI,aAAa,EAAA,CAAGI,eAAe,CAACC,2BAA2B,GAClF,QACA,GAAA,OAAA;QACJ,MAAMC,wBAAAA,GAA2BC,yBAAyBC,GAAG,EAAA;AAC7Dd,QAAAA,KAAAA,CAAMe,WAAW,EAAA;AACjBf,QAAAA,KAAAA,CAAMgB,oBAAoB,CAACf,MAAAA,CAAAA;AAC3B,QAAA,IAAIA,MAAU,IAAA,CAACC,MAAOe,CAAAA,aAAa,EAAI,EAAA;AACrC,YAAA,MAAMC,kBAAkB,CAACjB,MAAAA,CAAOkB,QAAQ,IAAI,CAAClB,OAAOmB,OAAO;YAC3D,MAAMC,OAAAA,GAAUpB,MAAOkB,CAAAA,QAAQ,GAAGjB,MAAAA,CAAOoB,eAAe,CAACrB,MAAOkB,CAAAA,QAAQ,CAAC,CAAA,CAAE,CAAI,GAAA,CAAA;YAC/E,MAAMI,OAAAA,GAAUtB,MAAOkB,CAAAA,QAAQ,GAAGjB,MAAAA,CAAOsB,eAAe,CAACvB,MAAOkB,CAAAA,QAAQ,CAAC,CAAA,CAAE,CAAI,GAAA,CAAA;AAC/E,YAAA,MAAMM,WAAcxB,GAAAA,MAAAA,CAAOkB,QAAQ,GAC/BjB,MAAOoB,CAAAA,eAAe,CAACrB,MAAAA,CAAOkB,QAAQ,CAAC,CAAE,CAAA,CAAA,GACzCjB,OAAOwB,qBAAqB,EAAA;AAChC,YAAA,MAAMC,YAAe1B,GAAAA,MAAAA,CAAOkB,QAAQ,GAChCjB,MAAOsB,CAAAA,eAAe,CAACvB,MAAAA,CAAOkB,QAAQ,CAAC,CAAE,CAAA,CAAA,GACzCjB,OAAO0B,sBAAsB,EAAA;YACjC,IAAIH,WAAAA,IAAe,CAAKE,IAAAA,YAAAA,IAAgB,CAAG,EAAA;AACzC1B,gBAAAA,MAAAA,CAAO4B,wBAAwB,EAAK,GAAA,IAAA,CAAA;AACpC,gBAAA;AACF;YACA,MAAMC,cAAAA,GAAiBZ,eACnB,GAAA,IAAA,GACAhB,MAAO6B,CAAAA,IAAI,CAACC,wBAAwB,CAAC,KAAA,EAAOP,WAAaE,EAAAA,YAAAA,EAAcvB,WAAaK,EAAAA,WAAAA,CAAAA;YACxF,MAAMwB,iBAAAA,GAAoB/B,OAAOgC,cAAc,EAAA;AAC/C,YAAA,IAAIJ,cAAgB,EAAA;AAClB5B,gBAAAA,MAAAA,CAAOiC,gBAAgB,EAAA;AACvBjC,gBAAAA,MAAAA,CAAOkC,cAAc,CAACN,cAAAA,CAAAA;AACxB;YACA5B,MAAOmC,CAAAA,gBAAgB,CAACpC,MAAOqC,CAAAA,UAAU,EAAErC,MAAOsC,CAAAA,UAAU,EAAEtC,MAAAA,CAAOuC,YAAY,CAAA;AACjF,YAAA,MAAMC,MAAMxC,MAAOwC,CAAAA,GAAG,IAAIzC,KAAM0C,CAAAA,GAAG,CAACC,KAAK,CAACC,QAAQ,IAAI5C,MAAM0C,GAAG,CAACC,KAAK,CAACC,QAAQ,CAACC,WAAW,EAAA;AAC1F,YAAA,MAAMC,GAAmB,GAAA;AACvB5C,gBAAAA,MAAAA;AACAF,gBAAAA,KAAAA;AACAyB,gBAAAA,WAAAA;AACAE,gBAAAA,YAAAA;gBACAoB,GAAK,EAAA,IAAA;gBACLC,aAAe9C,EAAAA,MAAAA,CAAO+C,IAAI,KAAK,OAAYhD,KAAAA,OAAOiD,GAAG,IAAIjD,MAAOkD,CAAAA,UAAU,CAAD;AACzEC,gBAAAA,GAAAA,EAAKnD,MAAOmD,CAAAA,GAAG,IAAIlD,MAAAA,CAAO+C,IAAI,KAAK,OAAA;gBACnCI,UAAY,EAAA,IAAA;AACZzC,gBAAAA,wBAAAA;AACAX,gBAAAA,MAAAA;AACAqD,gBAAAA,UAAAA,EAAYrD,OAAOqD,UAAU;gBAC7BC,KAAO,EAAA,CAAA;gBACPC,aAAe,EAAA,KAAA;gBACfC,UAAY,EAAA,IAAA;gBACZC,cAAgB,EAAA,IAAA;gBAChBC,IAAM,EAAA,KAAA;AACNlD,gBAAAA,WAAAA;AACAL,gBAAAA,WAAAA;gBACAwD,YAAc,EAAA,KAAA;gBACdlB,GAAK,EAAA,IAAA;gBACLmB,aAAe,EAAA,CAAA;AACfpB,gBAAAA,GAAAA;gBACAqB,gBAAkBrB,EAAAA,GAAAA,IAAOxC,OAAO8D,gBAAgB;AAChDC,gBAAAA,mBAAAA,EAAqB9D,OAAO6B,IAAI,CAACkC,sBAAsB,CACrD,IAAA,EACA,cACAxC,WACAE,EAAAA,YAAAA,CAAAA;AAEFuC,gBAAAA,gBAAAA,EAAkBhE,OAAO6B,IAAI,CAACkC,sBAAsB,CAAC,IAAA,EAAM,cAAcxC,WAAaE,EAAAA,YAAAA,CAAAA;AACtFwC,gBAAAA,gBAAAA,EAAkBjE,OAAOgC,cAAc,EAAA;gBACvCkC,uBAAyB,EAAA;AAC3B,aAAA;YACA,IAAI,CAACC,YAAY,CAACvB,GAAAA,CAAAA;AAClB,YAAA,IAAIhB,cAAgB,EAAA;AAClB5B,gBAAAA,MAAAA,CAAOoE,eAAe,EAAA;AACtB,gBAAA,MAAMC,iBACJlD,GAAAA,OAAAA,GAAU,CACVE,IAAAA,OAAAA,GAAU,CACVF,IAAAA,OAAAA,GAAUI,WAAcvB,GAAAA,MAAAA,CAAOwB,qBAAqB,EAAA,IACpDH,OAAUI,GAAAA,YAAAA,GAAezB,OAAO0B,sBAAsB,EAAA;AACxD,gBAAA,MAAM4C,UAAU,IAAIC,WAAAA,EAAAA;AACpB,gBAAA,IAAIF,iBAAmB,EAAA;AACrBC,oBAAAA,OAAAA,CAAQE,QAAQ,GAAG;AAACrD,wBAAAA,OAAAA;AAASE,wBAAAA,OAAAA;AAASE,wBAAAA,WAAAA;AAAaE,wBAAAA;AAAa,qBAAA;iBAC3D,MAAA;oBACL6C,OAAQrD,CAAAA,QAAQ,GAAGlB,MAAOkB,CAAAA,QAAQ,GAAGlB,MAAOkB,CAAAA,QAAQ,CAACwD,KAAK,EAAK,GAAA,IAAA;AACjE;gBACAH,OAAQpD,CAAAA,OAAO,GAAGnB,MAAOmB,CAAAA,OAAO,GAAGnB,MAAOmB,CAAAA,OAAO,CAACuD,KAAK,EAAK,GAAA,IAAA;gBAC5DH,OAAQI,CAAAA,OAAO,GAAG,CAAC3C,iBAAAA;gBACnBuC,OAAQK,CAAAA,IAAI,CACV/C,cAAAA,CAAegD,mBAAmB,EAAE,CAAC,CAAE,CAAA,EACvC7C,iBAAqB,IAAA,IAAA,EACrB8C,YAAa,CAAA,qBAAA,CAAA,CAAA;gBAEf7E,MAAO6B,CAAAA,IAAI,CAACiD,kBAAkB,CAAClD,cAAAA,CAAAA;AACjC;AACF;AACAjB,QAAAA,wBAAAA,CAAyBoE,OAAO,CAACrE,wBAAAA,CAAAA;AACnC;AACA,IAAA,OAAesE,iBACbpC,GAAgB,EAChBqC,WAAwB,EACxBC,gBAAuC,EACvC;QACA,MAAMC,YAAAA,GAAe,CAAC,CAACD,gBAAAA;AACvB,QAAA,IAAI,CAACA,gBAAkB,EAAA;AACrB,YAAA,MAAME,MACJxC,GAAAA,GAAAA,CAAI5C,MAAM,CAAC+C,IAAI,KAAK,OAAA,GAChBH,GAAIgB,CAAAA,gBAAgB,GAClB,SACA,GAAA,YAAA,GACFhB,GAAIgB,CAAAA,gBAAgB,GAClB,OACA,GAAA,MAAA;AACR,YAAA,MAAMyB,QAA0B,GAAA,SAAA;YAChC,IAAI,CAACzC,GAAIqB,CAAAA,gBAAgB,EAAE;AACzBiB,gBAAAA,gBAAAA,GAAmBtC,IAAI5C,MAAM,CAAC6B,IAAI,CAACC,wBAAwB,CACzD,IAAA,EACAc,GAAIrB,CAAAA,WAAW,EACfqB,GAAInB,CAAAA,YAAY,EAChBmB,GAAAA,CAAIE,aAAa,GAAG;AAACsC,oBAAAA,MAAAA;AAAQC,oBAAAA;iBAAS,GAAGD,MAAAA,EACzCxC,GAAIrC,CAAAA,WAAW,EACf,KAAA,CAAA;aAEG,MAAA;gBACL,MAAM+E,WAAAA,GAAc1C,GAAIqB,CAAAA,gBAAgB,EAAEsB,kBAAAA,EAAAA;AAC1CL,gBAAAA,gBAAAA,GAAmBI,aAAaE,WAC5B5C,EAAAA,GAAAA,GAAAA,CAAI5C,MAAM,CAAC6B,IAAI,CAACC,wBAAwB,CACtC,IACAwD,EAAAA,WAAAA,CAAYG,KAAK,EACjBH,WAAAA,CAAYI,MAAM,EAClB9C,GAAAA,CAAIE,aAAa,GAAG;AAACsC,oBAAAA,MAAAA;AAAQC,oBAAAA;AAAS,iBAAA,GAAGD,QACzCE,WACA,EAAA,KAAA,CAAA,GAEF1C,IAAI5C,MAAM,CAAC6B,IAAI,CAACC,wBAAwB,CACtC,IACAc,EAAAA,GAAAA,CAAIrB,WAAW,EACfqB,GAAAA,CAAInB,YAAY,EAChBmB,GAAAA,CAAIE,aAAa,GAAG;AAACsC,oBAAAA,MAAAA;AAAQC,oBAAAA;iBAAS,GAAGD,MAAAA,EACzCxC,GAAIrC,CAAAA,WAAW,EACf,KAAA,CAAA;AAER;AACF;QACAqC,GAAI5C,CAAAA,MAAM,CAACiC,gBAAgB,EAAA;QAC3BW,GAAI5C,CAAAA,MAAM,CAACkC,cAAc,CAACgD,gBAAAA,CAAAA;AAC1B,QAAA,IAAI,CAACxG,UAAU,CAACiH,WAAW,GAAGT,gBAAAA,CAAiBN,mBAAmB,EAAE,CAAC,CAAA,CAAE,CAACQ,MAAM,KAAK,YAAA;QACnF,IAAI,CAAC1G,UAAU,CAAC0D,UAAU,GAAG+C,YACzB,GAAA,IAAA,GACA,IAAI,CAACzG,UAAU,CAACiH,WAAW,GACzB,IAAIC,OAAQ,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,KACrB,IAAIA,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;AAC3B,QAAA,IAAI,CAAClH,UAAU,CAAC2D,UAAU,GAAG8C,eAAe,IAAO,GAAA,CAAA;AACnD,QAAA,IAAI,CAACzG,UAAU,CAAC4D,YAAY,GAAG,IAAA;AAC/B,QAAA,IAAI,CAAC5D,UAAU,CAACyG,YAAY,GAAGA,YAAAA;AAC/B,QAAA,IAAIvC,GAAIgB,CAAAA,gBAAgB,IAAI,CAACuB,YAAc,EAAA;AACzC,YAAA,IAAI,CAAC,IAAI,CAAClG,oBAAoB,EAAE;AAC9B,gBAAA,IAAI,CAACA,oBAAoB,GAAG2D,GAAAA,CAAI5C,MAAM,CAAC6F,gBAAgB,EAAA,CAAGC,YAAY,CAAC,KAAO,EAAA,IAAA,EAAM,KAAO,EAAA,KAAA,CAAA;AAC7F;AACA,YAAA,IAAI,CAAC,IAAI,CAAC9G,qBAAqB,EAAE;AAC/B,gBAAA,IAAI,CAACA,qBAAqB,GAAG4D,GAAAA,CAAI5C,MAAM,CAAC6F,gBAAgB,EAAA,CAAGC,YAAY,CAAC,IAAM,EAAA,KAAA,EAAO,KAAO,EAAA,KAAA,CAAA;AAC9F;AACAlD,YAAAA,GAAAA,CAAImD,eAAe,GAAG,IAAI,CAAC9G,oBAAoB;AAC/C2D,YAAAA,GAAAA,CAAIoD,aAAa,GAAG,OAAA;AACpB,YAAA,IAAI,CAACtH,UAAU,CAACuH,cAAc,GAAG,IAAA;AACjC,YAAA,IAAI,CAACvH,UAAU,CAACyG,YAAY,GAAG,KAAA;AAC/B,YAAA,IAAI,CAACzG,UAAU,CAACwH,MAAM,CAACtD,GAAAA,EAAK,MAAM,IAAMqC,EAAAA,WAAAA,CAAAA;AACxC,YAAA,IAAI,CAACvG,UAAU,CAAC0D,UAAU,GAAG,IAAA;AAC7B,YAAA,IAAI,CAAC1D,UAAU,CAACuH,cAAc,GAAG,KAAA;AACjCrD,YAAAA,GAAAA,CAAImD,eAAe,GAAG,IAAI,CAAC/G,qBAAqB;AAChD4D,YAAAA,GAAAA,CAAIoD,aAAa,GAAG,IAAA;AACtB;AACA,QAAA,IAAI,CAACtH,UAAU,CAACwH,MAAM,CAACtD,GAAAA,EAAK,MAAM,IAAMqC,EAAAA,WAAAA,CAAAA;AACxCrC,QAAAA,GAAAA,CAAImD,eAAe,GAAG,IAAA;QACtBnD,GAAI5C,CAAAA,MAAM,CAACoE,eAAe,EAAA;AAE1B,QAAA,IAAI,CAACe,YAAc,EAAA;YACjBvC,GAAIuD,CAAAA,mBAAmB,GAAGvD,GAAAA,CAAIE,aAAa,GACtCoC,iBAAiBN,mBAAmB,EAAE,CAAC,CAAA,CAAE,GAC1C,IAAA;AACJhC,YAAAA,GAAAA,CAAIwD,kBAAkB,GAAGlB,gBAAAA,CAAiBN,mBAAmB,EAAE,CAAC,CAAE,CAAA;YAClEhC,GAAIyD,CAAAA,YAAY,GAAGnB,gBAAAA,CAAiBK,kBAAkB,EAAA;YACtD,IAAI3C,GAAAA,CAAIuD,mBAAmB,EAAE;gBAC3B,IAAI,CAACG,sBAAsB,CAAC1D,GAAAA,CAAAA;AAC9B;YACA,IAAIA,GAAAA,CAAIM,GAAG,EAAE;AACX,gBAAA,IAAIqD,IAAIC,UAAW5D,CAAAA,GAAAA,CAAIwD,kBAAkB,CAACX,KAAK,CAC3C7C,GAAAA,GAAAA,CAAIwD,kBAAkB,CAACX,KAAK,GAC5BgB,YAAAA,CAAa7D,GAAIwD,CAAAA,kBAAkB,CAACX,KAAK,CAAA;AAC7C,gBAAA,IAAIiB,IAAIF,UAAW5D,CAAAA,GAAAA,CAAIwD,kBAAkB,CAACV,MAAM,CAC5C9C,GAAAA,GAAAA,CAAIwD,kBAAkB,CAACV,MAAM,GAC7Be,YAAAA,CAAa7D,GAAIwD,CAAAA,kBAAkB,CAACV,MAAM,CAAA;AAC9Ca,gBAAAA,CAAAA,GAAII,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGL,CAAK,IAAA,CAAA,CAAA;AACrBG,gBAAAA,CAAAA,GAAIC,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGF,CAAK,IAAA,CAAA,CAAA;gBACrBH,CAAI3D,GAAAA,GAAAA,CAAIwD,kBAAkB,CAACX,KAAK;gBAChCiB,CAAI9D,GAAAA,GAAAA,CAAIwD,kBAAkB,CAACV,MAAM;AACjC,gBAAA,MAAMmB,iBAAiBjE,GAAI5C,CAAAA,MAAM,CAAC6B,IAAI,CAACC,wBAAwB,CAC7D,IACAyE,EAAAA,CAAAA,EACAG,GACA9D,GAAIwD,CAAAA,kBAAkB,CAAChB,MAAM,EAC7B,IACA,EAAA,IAAA,CAAA;gBAEF0B,QAASlE,CAAAA,GAAAA,CAAIyD,YAAY,EAAEQ,cAAAA,CAAAA;AAC3BjE,gBAAAA,GAAAA,CAAIO,UAAU,GAAG0D,cAAAA,CAAejC,mBAAmB,EAAE,CAAC,CAAE,CAAA;AAC1D;AACF;QACA,OAAOM,gBAAAA;AACT;AACA,qBACA,OAAiBf,YAAavB,CAAAA,GAAgB,EAAE;QAC9C,MAAM5C,MAAAA,GAAS4C,IAAI5C,MAAM;;QAGzB,MAAMiF,WAAAA,GAAc,IAAI,CAACzG,UAAU,CAACuI,SAAS,CAACnE,GAAKA,EAAAA,GAAAA,CAAI7C,MAAM,CAAA;;QAG7D,MAAMiH,aAAAA,GAAgBpE,IAAI9C,KAAK,CAAC0C,GAAG,CAACyE,GAAG,CAACC,MAAM,CAACtE,GAAAA,CAAAA;;AAG/CA,QAAAA,GAAAA,CAAIjD,cAAc,GAAG,IAAI,CAACL,iBAAiB,EAAA;AAC3CsD,QAAAA,GAAAA,CAAIjD,cAAc,CAACwH,mBAAmB,CAACvE,GAAAA,CAAI7C,MAAM,EAAEkF,WAAAA,CAAAA;;AAGnD,QAAA,MAAMmC,eAAkBxE,GAAAA,GAAAA,CAAI7C,MAAM,CAAC4B,wBAAwB,EAAA;AAC3D,QAAA,IAAIyF,eAAiB,EAAA;AACnB,YAAA,IAAI,CAACC,kBAAkB,CAACzE,GAAAA,EAAKwE,eAAiBnC,EAAAA,WAAAA,CAAAA;AAChD;;AAGA,QAAA,IAAI,CAACqC,gBAAgB,CAAC1E,GAAAA,EAAKqC,YAAYsC,cAAc,CAAA;;AAGrD,QAAA,MAAMrC,mBAAmB,IAAI,CAACF,gBAAgB,CAACpC,KAAKqC,WAAa,EAAA,IAAA,CAAA;AACjE,QAAA,IAAIrC,IAAIyD,YAAY,KAAKzD,GAAIqB,CAAAA,gBAAgB,EAAEsB,kBAAsB,EAAA,EAAA;YACnE3C,GAAIsB,CAAAA,uBAAuB,GAAGtB,GAAAA,CAAIqB,gBAAgB;SAC7C,MAAA;;YAELrB,GAAIsB,CAAAA,uBAAuB,GAAGlE,MAAO6B,CAAAA,IAAI,CAACC,wBAAwB,CAChE,KACAc,EAAAA,GAAAA,CAAIyD,YAAY,CAAEZ,KAAK,EACvB7C,GAAAA,CAAIyD,YAAY,CAAEX,MAAM,EACxB9C,GAAI1C,CAAAA,WAAW,EACf0C,GAAAA,CAAIyD,YAAY,CAAA;AAEpB;QACA,IAAIzD,GAAAA,CAAIsB,uBAAuB,IAAItB,GAAAA,CAAIsB,uBAAuB,KAAKtB,GAAAA,CAAIqB,gBAAgB,EAAE;AACvFjE,YAAAA,MAAAA,CAAOiC,gBAAgB,EAAA;YACvBjC,MAAOkC,CAAAA,cAAc,CAACU,GAAAA,CAAIsB,uBAAuB,CAAA;SAC5C,MAAA;AACLlE,YAAAA,MAAAA,CAAOwH,WAAW,CAAC,IAAA,CAAA;AACnBxH,YAAAA,MAAAA,CAAOyH,UAAU,CAAC,IAAA,CAAA;AACpB;AACA,QAAA,IAAI,CAACjJ,UAAU,CAAC2G,YAAY,GAAG;QAC/B,IAAI,CAAC3G,UAAU,CAAC6D,UAAU,GAAGO,GAAIyD,CAAAA,YAAY,GAAG,IAAO,GAAA,CAAA;QACvD,IAAI,CAAC7H,UAAU,CAAC8D,YAAY,GAAGM,GAAIyD,CAAAA,YAAY,GAAG,IAAO,GAAA,CAAA;AACzD,QAAA,IAAIzD,IAAIL,GAAG,IAAI,CAAC0C,WAAAA,CAAYyC,cAAc,EAAI,EAAA;YAC5C9E,GAAIe,CAAAA,aAAa,IAAIgE,oBAAAA,CAAqBC,mBAAmB;AAC/D;QACAhF,GAAIQ,CAAAA,UAAU,EAAEyE,KAAMjF,CAAAA,GAAAA,CAAAA;QACtB,IAAIqC,WAAAA,CAAYyC,cAAc,EAAI,EAAA;YAChC,MAAMtE,UAAAA,GAAaR,IAAIQ,UAAU;AACjCR,YAAAA,GAAAA,CAAIQ,UAAU,GAAG,IAAA;YACjB,MAAM0E,qBAAAA,GAAwB9H,OAAO6B,IAAI,CAACC,wBAAwB,CAChE,IAAA,EACAc,GAAIyD,CAAAA,YAAY,CAAEZ,KAAK,EACvB7C,GAAIyD,CAAAA,YAAY,CAAEX,MAAM,EACxB9C,IAAIe,aAAa,GAAGgE,oBAAqBC,CAAAA,mBAAmB,GACxD;AACEhF,gBAAAA,GAAAA,CAAI1C,WAAW;AACfF,gBAAAA,MAAAA,CAAOgC,cAAc,EAAA,CAAI4C,mBAAmB,EAAE,CAAC,CAAE,CAAA;AACjD5E,gBAAAA,MAAAA,CAAOgC,cAAc,EAAA,CAAI4C,mBAAmB,EAAE,CAAC,CAAE;AAClD,aAAA,GACDhC,GAAI1C,CAAAA,WAAW,EACnB0C,GAAAA,CAAIyD,YAAY,EAChB,KAAA,CAAA;AAEFrG,YAAAA,MAAAA,CAAOiC,gBAAgB,EAAA;AACvBjC,YAAAA,MAAAA,CAAOkC,cAAc,CAAC4F,qBAAAA,CAAAA;AACtB,YAAA,IAAI,CAACtJ,UAAU,CAAC2G,YAAY,GAAG,KAAA;AAC/B,YAAA,IAAI,CAAC3G,UAAU,CAAC0H,MAAM,CAACtD,GAAAA,EAAK,MAAM,IAAMqC,EAAAA,WAAAA,CAAAA;AACxCjF,YAAAA,MAAAA,CAAOoE,eAAe,EAAA;AACtBxB,YAAAA,GAAAA,CAAImF,iBAAiB,GAAGD,qBAAAA,CAAsBlD,mBAAmB,EAAE,CAAC,CAAE,CAAA;YACtE,IAAIL,WAAAA,EAAAA,CAAcI,IAAI,CACpB/B,GAAImF,CAAAA,iBAAiB,EACrB/H,MAAOgC,CAAAA,cAAc,EAAM,IAAA,IAAA,EAC3B6C,YAAa,CAAA,qBAAA,CAAA,CAAA;AAEf,YAAA,IAAI,CAACrG,UAAU,CAAC2G,YAAY,GAAG,IAAA;AAC/B,YAAA,IAAI,CAAC3G,UAAU,CAAC4D,UAAU,GAAG,IAAA;AAC7B,YAAA,IAAI,CAAC5D,UAAU,CAAC6D,UAAU,GAAG,IAAA;AAC7B,YAAA,IAAI,CAAC7D,UAAU,CAAC8D,YAAY,GAAG,IAAA;AAC/BM,YAAAA,GAAAA,CAAIQ,UAAU,GAAGA,UAAAA;AACnB;AACA,QAAA,IAAI,CAAC5E,UAAU,CAAC0H,MAAM,CAACtD,GAAAA,EAAK,MAAM,IAAMqC,EAAAA,WAAAA,CAAAA;QACxC,IAAIA,WAAAA,CAAYyC,cAAc,EAAI,EAAA;AAChC,YAAA,IAAI,CAAC1C,gBAAgB,CAACpC,GAAAA,EAAKqC,WAAaC,EAAAA,gBAAAA,CAAAA;AAC1C;QACAtC,GAAIQ,CAAAA,UAAU,EAAE4E,eAAgBpF,CAAAA,GAAAA,EAAKqF,gBAAgBC,GAAG,EAAEtF,IAAIwD,kBAAkB,CAAA;QAChFxD,GAAIQ,CAAAA,UAAU,EAAE8E,GAAItF,CAAAA,GAAAA,CAAAA;AACpBqC,QAAAA,WAAAA,CAAYkD,OAAO,EAAA;AACnBvF,QAAAA,GAAAA,CAAIe,aAAa,IAAI,CAACgE,oBAAAA,CAAqBC,mBAAmB;QAE9D,IAAIhF,GAAAA,CAAIsB,uBAAuB,IAAItB,GAAAA,CAAIsB,uBAAuB,KAAKtB,GAAAA,CAAIqB,gBAAgB,EAAE;AACvF,YAAA,MAAMK,UAAU,IAAIC,WAAAA,EAAAA;AACpBD,YAAAA,OAAAA,CAAQI,OAAO,GAAG,CAAC9B,GAAAA,CAAIqB,gBAAgB;AACvC,YAAA,MAAMmE,SAASxF,GAAIsB,CAAAA,uBAAuB,CAACU,mBAAmB,EAAE,CAAC,CAAE,CAAA;AACnEN,YAAAA,OAAAA,CAAQK,IAAI,CAACyD,MAAAA,EAAQxF,IAAIqB,gBAAgB,IAAI,MAAMY,YAAa,CAAA,qBAAA,CAAA,CAAA;AAChE7E,YAAAA,MAAAA,CAAOoE,eAAe,EAAA;AACtBpE,YAAAA,MAAAA,CAAO6B,IAAI,CAACiD,kBAAkB,CAAClC,IAAIsB,uBAAuB,CAAA;AAC5D;;AAEA,QAAA,IAAI,CAACxE,kBAAkB,CAACkD,GAAAA,CAAIjD,cAAc,CAAA;;AAG1C,QAAA,IAAIqH,aAAe,EAAA;YACjBpE,GAAIyF,CAAAA,QAAQ,CAAEC,KAAK,GAAGtB,aAAAA;AACxB;AACF;IACA,OAAeuB,0BAAAA,CAA2B3F,GAAgB,EAAE;AAC1D,QAAA,IAAI,CAAC,IAAI,CAACzE,uBAAuB,EAAE;AACjC,YAAA,IAAI,CAACA,uBAAuB,GAAGyE,IAAI5C,MAAM,CAACwI,kBAAkB,CAAC;AAC3DC,gBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;oBACP,IAAI,CAACC,OAAO,CAACC,GAAG,GAAGF,EAAGG,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,oBAAA,IAAI,CAACC,QAAQ,GAAGL,GAAGM,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAClC,oBAAA,IAAI,CAACC,YAAY,GAAGR,GAAGM,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACtC,oBAAA,IAAI,CAACE,SAAS,GAAGT,GAAGG,IAAI,EAAA,CAAGI,OAAO,CAAC,CAAA,CAAA;AACnC,oBAAA,IAAI,CAACG,aAAa,GAAGV,GAAGG,IAAI,EAAA,CAAGI,OAAO,CAAC,CAAA,CAAA;AACvCP,oBAAAA,EAAAA,CAAGW,IAAI,CAAC,WAAA;AACN,wBAAA,IAAI,CAACC,EAAE,CAACC,QAAQ,GAAGb,GAAGc,GAAG,CAAC,IAAI,CAACb,OAAO,CAACC,GAAG,EAAE,IAAI,CAACO,SAAS,CAAA;AAC1D,wBAAA,IAAI,CAACG,EAAE,CAACG,YAAY,GAAGf,GAAGc,GAAG,CAAC,IAAI,CAACb,OAAO,CAACC,GAAG,EAAE,IAAI,CAACQ,aAAa,CAAA;AAClE,wBAAA,IAAI,CAACE,EAAE,CAACI,OAAO,GAAGhB,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAACZ,QAAQ,EAAEL,EAAGkB,CAAAA,IAAI,CAAC,IAAI,CAACL,QAAQ,EAAE,CAAA,CAAA,CAAA;AAC/D,wBAAA,IAAI,CAACD,EAAE,CAACO,WAAW,GAAGnB,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAACT,YAAY,EAAER,EAAGkB,CAAAA,IAAI,CAAC,IAAI,CAACH,YAAY,EAAE,CAAA,CAAA,CAAA;wBAC3E,IAAI,CAACC,OAAO,CAACI,CAAC,GAAG,IAAI,CAACJ,OAAO,CAACnD,CAAC;AAC/B,wBAAA,IAAI,CAACwD,SAAS,CAACC,QAAQ,GAAG,IAAI,CAACN,OAAO;AACtC,wBAAA,IAAI,CAACO,QAAQ,CAACC,UAAU,GAAG,IAAI,CAACR,OAAO;AACvC,wBAAA,IAAI,CAACO,QAAQ,CAACE,OAAO,GAAG,IAAI,CAACN,WAAW;AAC1C,qBAAA,CAAA;AACF,iBAAA;AACAO,gBAAAA,QAAAA,CAAAA,CAAS1B,EAAE,EAAA;AACT,oBAAA,IAAI,CAACuB,QAAQ,CAAC3B,KAAK,GAAGI,GAAGkB,IAAI,EAAA;AAC7BlB,oBAAAA,EAAAA,CAAGW,IAAI,CAAC,WAAA;wBACN,IAAI,CAACC,EAAE,CAACe,YAAY,GAAG3B,EAAGiB,CAAAA,GAAG,CAC3BjB,EAAAA,CAAG4B,GAAG,CACJ5B,GAAG6B,GAAG,CAAC,IAAI,CAAC5B,OAAO,CAACuB,UAAU,CAACM,EAAE,EAAE,IAAI,CAAC7B,OAAO,CAACuB,UAAU,CAAC3D,CAAC,CAAA,EAC5DmC,GAAG6B,GAAG,CAAC,IAAI,CAAC5B,OAAO,CAACwB,OAAO,CAACK,EAAE,EAAE,IAAI,CAAC7B,OAAO,CAACwB,OAAO,CAAC5D,CAAC,CAExD,CAAA,EAAA,GAAA,CAAA;AAEF,wBAAA,IAAI,CAAC0D,QAAQ,CAAC3B,KAAK,GAAGI,EAAAA,CAAGkB,IAAI,CAAC,IAAI,CAACS,YAAY,EAAE,CAAG,EAAA,CAAA,CAAA;AACtD,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;AACA,YAAA,IAAI,CAAClM,uBAAuB,CAACsM,IAAI,GAAG,sBAAA;AACtC;QACA,OAAO,IAAI,CAACtM,uBAAuB;AACrC;IACA,OAAeuM,OAAAA,CAAQC,IAAiB,EAAE;AACxC,QAAA,IAAI,CAAC,IAAI,CAACtM,IAAI,EAAE;AACd,YAAA,IAAI,CAACA,IAAI,GAAG,IAAIuM,QAAS,CAAA;gBACvBC,IAAM,EAAA,CAAA;gBACNC,UAAY,EAAA,KAAA;gBACZC,MAAQ,EAAA;AACV,aAAA,CAAA;AACF;QACA,OAAO,IAAI,CAAC1M,IAAI;AAClB;AACA,qBACA,OAAeiI,sBAAuB1D,CAAAA,GAAgB,EAAE;QACtD,IAAI,CAACA,GAAIuD,CAAAA,mBAAmB,EAAE;AAC5B,YAAA;AACF;AACA,QAAA,MAAM6E,EAAKpI,GAAAA,GAAAA,CAAI5C,MAAM,CAAC6B,IAAI,CAACC,wBAAwB,CACjD,KAAA,EACA,GACA,CACAc,EAAAA,GAAAA,CAAIuD,mBAAmB,EACvBvD,IAAIyD,YAAY,CAAA;AAElB,QAAA,MAAM4E,OAAU,GAAA,IAAI,CAAC1C,0BAA0B,CAAC3F,GAAAA,CAAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAACxE,yBAAyB,EAAE;YACnC,IAAI,CAACA,yBAAyB,GAAGwE,GAAI5C,CAAAA,MAAM,CAACkL,eAAe,CAACD,OAAAA,CAAQE,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACzF;AACA,QAAA,MAAMC,GAAM,GAAA,IAAI,CAACV,OAAO,CAAC9H,GAAAA,CAAAA;QACzB,IAAI,CAACxE,yBAAyB,CAACiN,QAAQ,CAAC,UAAYzI,EAAAA,GAAAA,CAAI7C,MAAM,CAACuL,oBAAoB,CAAA;QACnF,IAAI,CAAClN,yBAAyB,CAACiN,QAAQ,CAAC,cAAgBzI,EAAAA,GAAAA,CAAI7C,MAAM,CAACmJ,YAAY,CAAA;QAC/E,IAAI,CAAC9K,yBAAyB,CAACiN,QAAQ,CAAC,WAAazI,EAAAA,GAAAA,CAAI7C,MAAM,CAACwL,gBAAgB,EAAA,CAAA;QAChF,IAAI,CAACnN,yBAAyB,CAACiN,QAAQ,CAAC,eAAiBzI,EAAAA,GAAAA,CAAI7C,MAAM,CAACyL,YAAY,CAAA;QAChF5I,GAAI5C,CAAAA,MAAM,CAACiC,gBAAgB,EAAA;QAC3BW,GAAI5C,CAAAA,MAAM,CAACyL,UAAU,CAACR,OAAAA,CAAAA;AACtBrI,QAAAA,GAAAA,CAAI5C,MAAM,CAAC0L,YAAY,CAAC,CAAG,EAAA,IAAI,CAACtN,yBAAyB,CAAA;AACzDwE,QAAAA,GAAAA,CAAI5C,MAAM,CAAC2L,eAAe,CAACC,kBAAmBC,CAAAA,qBAAqB,CAACjJ,GAAK,EAAA,IAAA,CAAA,CAAA;QACzEA,GAAI5C,CAAAA,MAAM,CAACkC,cAAc,CAAC8I,EAAAA,CAAAA;AAC1BI,QAAAA,GAAAA,CAAIU,IAAI,EAAA;QACRlJ,GAAI5C,CAAAA,MAAM,CAACoE,eAAe,EAAA;AAC1BxB,QAAAA,GAAAA,CAAI5C,MAAM,CAAC6B,IAAI,CAACiD,kBAAkB,CAACkG,EAAAA,CAAAA;AACrC;AACA,qBACA,OAAe1D,gBAAAA,CAAiB1E,GAAgB,EAAEmJ,MAAuB,EAAE;AACzEnJ,QAAAA,GAAAA,CAAIW,UAAU,GAAG,IAAI,CAAC3E,cAAc;QACpCgE,GAAI5C,CAAAA,MAAM,CAACiC,gBAAgB,EAAA;QAC3B,KAAK,MAAMQ,SAASsJ,MAAQ,CAAA;AAC1BtJ,YAAAA,KAAAA,CAAMuJ,MAAM,CAAC9F,MAAM,CAACtD,GAAK,EAAA,IAAI,CAAChE,cAAc,CAAA;AAC9C;QACAgE,GAAI5C,CAAAA,MAAM,CAACoE,eAAe,EAAA;AAC5B;AACA,qBACA,OAAe6H,qBAAsBC,CAAAA,IAA6B,EAAE;AAClE,QAAA,MAAMC,CAAID,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,QAAA,MAAME,CAAIF,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,QAAA,MAAMG,CAAIH,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,QAAA,MAAMI,CAAIJ,GAAAA,IAAI,CAAC,CAAA,CAAE,GAAG,GAAA;AACpB,QAAA,OAAOC,CAAK,IAAA,GAAM,GAAA,GAAA,GAAM,GAAE,CAAA,GAAKC,CAAK,IAAA,GAAM,GAAA,GAAE,CAAKC,GAAAA,CAAAA,GAAI,GAAMC,GAAAA,CAAAA;AAC7D;qBAEA,OAAejF,kBACbzE,CAAAA,GAAgB,EAChBwE,eAAuD,EACvDnC,WAAwB,EACxB;QACA,MAAMlF,MAAAA,GAAS6C,IAAI7C,MAAM;AACzB,QAAA,MAAMwM,QAAW3J,GAAAA,GAAAA,CAAI5C,MAAM,CAAC+C,IAAI,KAAK,OAAA;AACrCH,QAAAA,GAAAA,CAAIW,UAAU,GAAG,IAAI,CAACzE,gBAAgB;QACtC8D,GAAI5C,CAAAA,MAAM,CAACiC,gBAAgB,EAAA;QAC3B,MAAM+I,EAAAA,GAAKpI,GAAI5C,CAAAA,MAAM,CAAC6B,IAAI,CAACC,wBAAwB,CACjD,KAAA,EACA,CACA,EAAA,CAAA,EACAyK,QAAW,GAAA;AAAC,YAAA,YAAA;AAAc,YAAA;SAAa,GAAG;AAAC,YAAA,YAAA;AAAc,YAAA;SAAU,EACnE3J,GAAAA,CAAIrC,WAAW,EACf,KAAA,CAAA;AAEFqC,QAAAA,GAAAA,CAAI5C,MAAM,CAACwH,WAAW,CAACzH,OAAOkB,QAAQ,CAAA;AACtC,QAAA,MAAMuL,EAAK5J,GAAAA,GAAAA,CAAI5C,MAAM,CAACyM,WAAW,EAAA;AACjC,QAAA,MAAMC,OAAU3M,GAAAA,MAAAA,CAAO4M,WAAW,EAAA,GAAKH,GAAG/G,KAAK;AAC/C,QAAA,MAAMmH,OAAU,GAACJ,CAAAA,EAAAA,CAAG9G,MAAM,GAAG3F,MAAO8M,CAAAA,WAAW,EAAK,GAAA,CAAA,IAAKL,EAAAA,CAAG9G,MAAM;QAClE,MAAMoH,OAAAA,GAAU,CAAIN,GAAAA,EAAAA,CAAG/G,KAAK;QAC5B,MAAMsH,OAAAA,GAAU,CAAIP,GAAAA,EAAAA,CAAG9G,MAAM;QAC7B,MAAMsH,UAAAA,GAAa,IAAI,CAAC1O,WAAW;QACnCyB,MAAOkN,CAAAA,WAAW,CAACC,SAAS,CAACF,UAAAA,CAAWG,KAAK,EAAEH,UAAWI,CAAAA,QAAQ,EAAEJ,UAAAA,CAAWhD,QAAQ,CAAA;AACvF,QAAA,IAAIqD,IAAOtN,GAAAA,MAAAA,CAAOuN,mBAAmB,EAAA,CAAGC,YAAY,EAAA;AACpD,QAAA,IAAIC,KAAQzN,GAAAA,MAAAA,CAAOuN,mBAAmB,EAAA,CAAGG,aAAa,EAAA;AACtD,QAAA,IAAIC,MAAS3N,GAAAA,MAAAA,CAAOuN,mBAAmB,EAAA,CAAGK,cAAc,EAAA;AACxD,QAAA,IAAIC,GAAM7N,GAAAA,MAAAA,CAAOuN,mBAAmB,EAAA,CAAGO,WAAW,EAAA;AAClD,QAAA,MAAMC,IAAO/N,GAAAA,MAAAA,CAAOuN,mBAAmB,EAAA,CAAGS,YAAY,EAAA;AACtD,QAAA,MAAMC,GAAMjO,GAAAA,MAAAA,CAAOuN,mBAAmB,EAAA,CAAGW,WAAW,EAAA;AACpD,QAAA,MAAMxI,QAAQ+H,KAAQH,GAAAA,IAAAA;AACtB,QAAA,MAAM3H,SAASkI,GAAMF,GAAAA,MAAAA;AACrBL,QAAAA,IAAAA,IAAQ5H,KAAQiH,GAAAA,OAAAA;AAChBgB,QAAAA,MAAAA,IAAUhI,MAASkH,GAAAA,OAAAA;AACnBY,QAAAA,KAAAA,GAAQH,OAAO5H,KAAQqH,GAAAA,OAAAA;AACvBc,QAAAA,GAAAA,GAAMF,SAAShI,MAASqH,GAAAA,OAAAA;QACxBC,UAAWkB,CAAAA,mBAAmB,CAC5BnO,MAAOoO,CAAAA,aAAa,KAChBC,SAAUC,CAAAA,OAAO,CAAChB,IAAMG,EAAAA,KAAAA,EAAOE,QAAQE,GAAKE,EAAAA,IAAAA,EAAME,OAClDI,SAAUE,CAAAA,KAAK,CAACjB,IAAMG,EAAAA,KAAAA,EAAOE,MAAQE,EAAAA,GAAAA,EAAKE,IAAME,EAAAA,GAAAA,CAAAA,CAAAA;AAEtD,QAAA,MAAM7E,YAAYoD,QAAW,GAAA,IAAIgC,OAAQvB,CAAAA,UAAAA,CAAWhD,QAAQ,CAAI,GAAA,IAAA;QAChE,MAAMwE,GAAAA,GAAMjC,QAAWxM,GAAAA,MAAAA,CAAO0O,YAAY,CAAC1O,OAAO4M,WAAW,EAAA,EAAI5M,MAAO8M,CAAAA,WAAW,EAAM,CAAA,GAAA,IAAA;QACzFjK,GAAI5C,CAAAA,MAAM,CAACkC,cAAc,CAAC8I,EAAAA,CAAAA;AAC1B,QAAA,IAAI,CAAClM,gBAAgB,CAACsD,UAAU,GAAGwD,QAAQ8I,IAAI,EAAA;AAC/C,QAAA,IAAI,CAAC5P,gBAAgB,CAACuD,UAAU,GAAG,CAAA;AACnC,QAAA,MAAMsM,KAAK,IAAI,CAAC7P,gBAAgB,CAACiI,SAAS,CAACnE,GAAKoK,EAAAA,UAAAA,CAAAA;AAChD,QAAA,IAAI,CAAClO,gBAAgB,CAACoH,MAAM,CAACtD,GAAAA,EAAKoK,YAAY,IAAM2B,EAAAA,EAAAA,CAAAA;AACpDA,QAAAA,EAAAA,CAAGxG,OAAO,EAAA;QACVvF,GAAI5C,CAAAA,MAAM,CAACoE,eAAe,EAAA;AAC1B,QAAA,MAAMwK,QAAW5D,GAAAA,EAAAA,CAAGpG,mBAAmB,EAAE,CAAC,CAAE,CAAA;AAC5C,QAAA,MAAMiK,WAAc7D,GAAAA,EAAAA,CAAGpG,mBAAmB,EAAE,CAAC,CAAE,CAAA;QAC/C,MAAMkK,WAAAA,GAAc,IAAIC,UAAW,CAAA,CAAA,CAAA;AACnC,QAAA,MAAMC,iBAAiBzC,QAAW,GAAA,IAAIwC,UAAW,CAAA,CAAA,CAAA,GAAK,IAAIE,YAAa,CAAA,CAAA,CAAA;QACvE,MAAMjP,MAAAA,GAAS4C,IAAI5C,MAAM;QACzB,IAAIkP,KAAAA;AACJ,QAAA,IAAItM,GAAI5C,CAAAA,MAAM,CAAC+C,IAAI,KAAK,OAAS,EAAA;YAC/BmM,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAAC;AAClBxM,gBAAAA,GAAAA,CAAI5C,MAAM,CAACqP,iBAAiB,CAAC,IAAMT,QAAAA,CAASU,UAAU,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGR,EAAAA,WAAAA,CAAAA,CAAAA;AACzElM,gBAAAA,GAAAA,CAAI5C,MAAM,CAACqP,iBAAiB,CAAC,IAAMR,WAAAA,CAAYS,UAAU,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGN,EAAAA,cAAAA,CAAAA;AAC7E,aAAA,CAAA;SACI,MAAA;YACLE,KAAQC,GAAAA,OAAAA,CAAQC,GAAG,CAAC;AAClBR,gBAAAA,QAAAA,CAASU,UAAU,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGR,EAAAA,WAAAA,CAAAA;AACtCD,gBAAAA,WAAAA,CAAYS,UAAU,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGN,EAAAA,cAAAA;AAC1C,aAAA,CAAA;AACH;AACAE,QAAAA,KAAAA,CACGK,IAAI,CAAC,IAAA;YACJ,MAAMC,QAAAA,GAAWvK,WAAYwK,CAAAA,kBAAkB,CAACX,WAAAA,CAAAA;YAChD,IAAIxC,CAAAA,GAAIC,QACJ,GAAA,IAAI,CAACN,qBAAqB,CAAC+C,cAA6ChB,CAAAA,GAAAA,GAAAA,GACxEgB,cAAc,CAAC,CAAE,CAAA;AACrB,YAAA,MAAMU,gBAAmB,GAAA,IAAInB,OAAQS,CAAAA,cAAc,CAAC,CAAA,CAAE,EAAEA,cAAc,CAAC,CAAA,CAAE,EAAEA,cAAc,CAAC,CAAE,CAAA,CAAA;AAC5F,YAAA,IAAIzC,QAAU,EAAA;gBACZmD,gBAAiBC,CAAAA,CAAC,GAAGxG,SAAWwG,CAAAA,CAAC,GAAGnB,GAAKoB,CAAAA,SAAS,CAACD,CAAC,GAAGrD,CAAAA;gBACvDoD,gBAAiBG,CAAAA,CAAC,GAAG1G,SAAW0G,CAAAA,CAAC,GAAGrB,GAAKoB,CAAAA,SAAS,CAACC,CAAC,GAAGvD,CAAAA;gBACvDoD,gBAAiB5F,CAAAA,CAAC,GAAGX,SAAWW,CAAAA,CAAC,GAAG0E,GAAKoB,CAAAA,SAAS,CAAC9F,CAAC,GAAGwC,CAAAA;gBACvDA,CAAIiC,GAAAA,OAAAA,CAAQuB,QAAQ,CAACJ,gBAAkBvG,EAAAA,SAAAA,CAAAA;AACzC;AACA/B,YAAAA,eAAAA,CACEoI,QACI,GAAA;gBACEM,QAAUxD,EAAAA,CAAAA;AACVoD,gBAAAA,gBAAAA;AACAF,gBAAAA,QAAAA;AACAO,gBAAAA,MAAAA,EAAQP,SAASQ,aAAa;aAEhC,GAAA,IAAA,CAAA;YAENhQ,MAAO6B,CAAAA,IAAI,CAACiD,kBAAkB,CAACkG,EAAAA,CAAAA;SAEhCiF,CAAAA,CAAAA,KAAK,CAAC,CAACC,IAAAA,GAAAA;AACNnQ,YAAAA,MAAAA,CAAO4B,wBAAwB,EAAK,GAAA,IAAA,CAAA;YACpC3B,MAAO6B,CAAAA,IAAI,CAACiD,kBAAkB,CAACkG,EAAAA,CAAAA;AACjC,SAAA,CAAA;AACJ;AACF;;;;"}
1
+ {"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const colorFormat =\r\n camera.HDR && device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth <= 0 || renderHeight <= 0) {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors: device.type !== 'webgl' && (camera.TAA || camera.motionBlur),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n SSRRoughnessTexture: device.pool.fetchTemporalTexture2D(\r\n true,\r\n 'rgba8unorm',\r\n renderWidth,\r\n renderHeight\r\n ),\r\n SSRNormalTexture: device.pool.fetchTemporalTexture2D(true, 'rgba8unorm', renderWidth, renderHeight),\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext) {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","colorFormat","HDR","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","getPickResultResolveFunc","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","ctx","oit","motionVectors","motionBlur","HiZ","HiZTexture","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","fetchTemporalTexture2D","SSRNormalTexture","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","release","executeForwardPlusGraph"],"mappings":"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"}
@@ -77,18 +77,21 @@
77
77
  this._allocatedTextures.set(resId, texture);
78
78
  }
79
79
  }
80
- // Execute the pass
81
- if (pass.executeFn) {
82
- pass.executeFn(ctx, pass.data);
83
- }
84
- // Release resources that end at this pass
85
- const toRelease = releaseAt.get(i);
86
- if (toRelease) {
87
- for (const resId of toRelease){
88
- const texture = this._allocatedTextures.get(resId);
89
- if (texture !== undefined) {
90
- this._allocator.release(texture);
91
- this._allocatedTextures.delete(resId);
80
+ // Execute the pass with exception safety for resource cleanup
81
+ try {
82
+ if (pass.executeFn) {
83
+ pass.executeFn(ctx, pass.data);
84
+ }
85
+ } finally{
86
+ // Release resources that end at this pass (always runs even if pass throws)
87
+ const toRelease = releaseAt.get(i);
88
+ if (toRelease) {
89
+ for (const resId of toRelease){
90
+ const texture = this._allocatedTextures.get(resId);
91
+ if (texture !== undefined) {
92
+ this._allocator.release(texture);
93
+ this._allocatedTextures.delete(resId);
94
+ }
92
95
  }
93
96
  }
94
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sources":["../../../src/render/rendergraph/executor.ts"],"sourcesContent":["import type {\r\n CompiledRenderGraph,\r\n RGTextureAllocator,\r\n RGTextureDesc,\r\n RGResolvedSize,\r\n RGExecuteContext,\r\n RGExecuteFn\r\n} from './types';\r\nimport type { RGHandle } from './types';\r\n\r\n/**\r\n * Executes a compiled render graph with automatic resource lifecycle management.\r\n *\r\n * The executor allocates transient textures before their first use and releases\r\n * them after their last use, using the provided {@link RGTextureAllocator}.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const executor = new RenderGraphExecutor(myAllocator, backbufferWidth, backbufferHeight);\r\n * executor.setImportedTexture(backbufferHandle, actualBackbufferTexture);\r\n * executor.execute(compiledGraph);\r\n * ```\r\n *\r\n * @typeParam TTexture - The concrete texture type (e.g. `Texture2D`).\r\n * @public\r\n */\r\nexport class RenderGraphExecutor<TTexture = unknown> {\r\n /** @internal */\r\n private _allocator: RGTextureAllocator<TTexture>;\r\n /** @internal */\r\n private _backbufferWidth: number;\r\n /** @internal */\r\n private _backbufferHeight: number;\r\n /** @internal */\r\n private _importedTextures: Map<number, TTexture> = new Map();\r\n /** @internal */\r\n private _allocatedTextures: Map<number, TTexture> = new Map();\r\n\r\n constructor(allocator: RGTextureAllocator<TTexture>, backbufferWidth: number, backbufferHeight: number) {\r\n this._allocator = allocator;\r\n this._backbufferWidth = backbufferWidth;\r\n this._backbufferHeight = backbufferHeight;\r\n }\r\n\r\n /**\r\n * Update the backbuffer dimensions used for 'backbuffer-relative' sizing.\r\n */\r\n setBackbufferSize(width: number, height: number): void {\r\n this._backbufferWidth = width;\r\n this._backbufferHeight = height;\r\n }\r\n\r\n /**\r\n * Register an imported (external) texture so it can be resolved during execution.\r\n *\r\n * @param handle - The handle returned from {@link RenderGraph.importTexture}.\r\n * @param texture - The actual GPU texture object.\r\n */\r\n setImportedTexture(handle: RGHandle, texture: TTexture): void {\r\n this._importedTextures.set(handle._id, texture);\r\n }\r\n\r\n /**\r\n * Execute the compiled graph with full resource lifecycle management.\r\n *\r\n * For each pass in topological order:\r\n * 1. Allocate any transient resources whose lifetime begins at this pass\r\n * 2. Invoke the pass's execute callback with a context that resolves handles\r\n * 3. Release any transient resources whose lifetime ends at this pass\r\n *\r\n * @param compiled - The compiled graph from {@link RenderGraph.compile}.\r\n */\r\n execute(compiled: CompiledRenderGraph): void {\r\n // Build per-pass allocation and release schedules\r\n const allocateAt = new Map<number, number[]>(); // passIndex -> resourceIds to allocate\r\n const releaseAt = new Map<number, number[]>(); // passIndex -> resourceIds to release\r\n\r\n for (const [resId, lifetime] of compiled.lifetimes) {\r\n if (lifetime.resource.kind === 'transient') {\r\n if (!allocateAt.has(lifetime.firstUse)) {\r\n allocateAt.set(lifetime.firstUse, []);\r\n }\r\n allocateAt.get(lifetime.firstUse)!.push(resId);\r\n\r\n if (!releaseAt.has(lifetime.lastUse)) {\r\n releaseAt.set(lifetime.lastUse, []);\r\n }\r\n releaseAt.get(lifetime.lastUse)!.push(resId);\r\n }\r\n }\r\n\r\n const ctx = this._createContext();\r\n\r\n for (let i = 0; i < compiled.orderedPasses.length; i++) {\r\n const pass = compiled.orderedPasses[i];\r\n\r\n // Allocate resources that start at this pass\r\n const toAllocate = allocateAt.get(i);\r\n if (toAllocate) {\r\n for (const resId of toAllocate) {\r\n const lifetime = compiled.lifetimes.get(resId)!;\r\n const desc = lifetime.resource.desc!;\r\n const size = this._resolveSize(desc);\r\n const texture = this._allocator.allocate(desc, size);\r\n this._allocatedTextures.set(resId, texture);\r\n }\r\n }\r\n\r\n // Execute the pass\r\n if (pass.executeFn) {\r\n (pass.executeFn as RGExecuteFn<unknown>)(ctx, pass.data);\r\n }\r\n\r\n // Release resources that end at this pass\r\n const toRelease = releaseAt.get(i);\r\n if (toRelease) {\r\n for (const resId of toRelease) {\r\n const texture = this._allocatedTextures.get(resId);\r\n if (texture !== undefined) {\r\n this._allocator.release(texture);\r\n this._allocatedTextures.delete(resId);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear imported texture registrations and any leftover allocated textures.\r\n * Call this after execution or when resetting for a new frame.\r\n */\r\n reset(): void {\r\n // Release any textures that weren't released (shouldn't happen in normal flow)\r\n for (const texture of this._allocatedTextures.values()) {\r\n this._allocator.release(texture);\r\n }\r\n this._allocatedTextures.clear();\r\n this._importedTextures.clear();\r\n }\r\n\r\n // ─── Private ────────────────────────────────────────────────────────\r\n\r\n /** @internal */\r\n private _resolveSize(desc: RGTextureDesc): RGResolvedSize {\r\n const mode = desc.sizeMode ?? 'backbuffer-relative';\r\n if (mode === 'absolute') {\r\n return {\r\n width: desc.width ?? 1,\r\n height: desc.height ?? 1\r\n };\r\n }\r\n // backbuffer-relative: width/height are scale factors (default 1.0)\r\n const scaleX = desc.width ?? 1.0;\r\n const scaleY = desc.height ?? 1.0;\r\n return {\r\n width: Math.max(1, Math.floor(this._backbufferWidth * scaleX)),\r\n height: Math.max(1, Math.floor(this._backbufferHeight * scaleY))\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _createContext(): RGExecuteContext {\r\n const self = this;\r\n return {\r\n getTexture<T>(handle: RGHandle): T {\r\n // Check imported first\r\n const imported = self._importedTextures.get(handle._id);\r\n if (imported !== undefined) {\r\n return imported as unknown as T;\r\n }\r\n // Check allocated transient\r\n const allocated = self._allocatedTextures.get(handle._id);\r\n if (allocated !== undefined) {\r\n return allocated as unknown as T;\r\n }\r\n throw new Error(\r\n `RenderGraphExecutor: cannot resolve resource \"${handle.name}\" (id=${handle._id}). ` +\r\n `It may not have been allocated yet or was already released.`\r\n );\r\n }\r\n };\r\n }\r\n}\r\n"],"names":["RenderGraphExecutor","_importedTextures","Map","_allocatedTextures","allocator","backbufferWidth","backbufferHeight","_allocator","_backbufferWidth","_backbufferHeight","setBackbufferSize","width","height","setImportedTexture","handle","texture","set","_id","execute","compiled","allocateAt","releaseAt","resId","lifetime","lifetimes","resource","kind","has","firstUse","get","push","lastUse","ctx","_createContext","i","orderedPasses","length","pass","toAllocate","desc","size","_resolveSize","allocate","executeFn","data","toRelease","undefined","release","delete","reset","values","clear","mode","sizeMode","scaleX","scaleY","Math","max","floor","self","getTexture","imported","allocated","Error","name"],"mappings":"AAUA;;;;;;;;;;;;;;;AAeC,IACM,MAAMA,mBAAAA,CAAAA;qBAEX,UAAiD;qBAEjD,gBAAiC;qBAEjC,iBAAkC;AAClC,qBACQC,iBAA2C,GAAA,IAAIC,GAAM,EAAA;AAC7D,qBACQC,kBAA4C,GAAA,IAAID,GAAM,EAAA;AAE9D,IAAA,WAAA,CAAYE,SAAuC,EAAEC,eAAuB,EAAEC,gBAAwB,CAAE;QACtG,IAAI,CAACC,UAAU,GAAGH,SAAAA;QAClB,IAAI,CAACI,gBAAgB,GAAGH,eAAAA;QACxB,IAAI,CAACI,iBAAiB,GAAGH,gBAAAA;AAC3B;AAEA;;AAEC,MACDI,iBAAkBC,CAAAA,KAAa,EAAEC,MAAc,EAAQ;QACrD,IAAI,CAACJ,gBAAgB,GAAGG,KAAAA;QACxB,IAAI,CAACF,iBAAiB,GAAGG,MAAAA;AAC3B;AAEA;;;;;AAKC,MACDC,kBAAmBC,CAAAA,MAAgB,EAAEC,OAAiB,EAAQ;AAC5D,QAAA,IAAI,CAACd,iBAAiB,CAACe,GAAG,CAACF,MAAAA,CAAOG,GAAG,EAAEF,OAAAA,CAAAA;AACzC;AAEA;;;;;;;;;MAUAG,OAAAA,CAAQC,QAA6B,EAAQ;;QAE3C,MAAMC,UAAAA,GAAa,IAAIlB,GAAAA,EAAAA,CAAAA;QACvB,MAAMmB,SAAAA,GAAY,IAAInB,GAAAA,EAAAA,CAAAA;AAEtB,QAAA,KAAK,MAAM,CAACoB,KAAAA,EAAOC,SAAS,IAAIJ,QAAAA,CAASK,SAAS,CAAE;AAClD,YAAA,IAAID,QAASE,CAAAA,QAAQ,CAACC,IAAI,KAAK,WAAa,EAAA;AAC1C,gBAAA,IAAI,CAACN,UAAWO,CAAAA,GAAG,CAACJ,QAAAA,CAASK,QAAQ,CAAG,EAAA;AACtCR,oBAAAA,UAAAA,CAAWJ,GAAG,CAACO,QAASK,CAAAA,QAAQ,EAAE,EAAE,CAAA;AACtC;AACAR,gBAAAA,UAAAA,CAAWS,GAAG,CAACN,QAAAA,CAASK,QAAQ,CAAA,CAAGE,IAAI,CAACR,KAAAA,CAAAA;AAExC,gBAAA,IAAI,CAACD,SAAUM,CAAAA,GAAG,CAACJ,QAAAA,CAASQ,OAAO,CAAG,EAAA;AACpCV,oBAAAA,SAAAA,CAAUL,GAAG,CAACO,QAASQ,CAAAA,OAAO,EAAE,EAAE,CAAA;AACpC;AACAV,gBAAAA,SAAAA,CAAUQ,GAAG,CAACN,QAAAA,CAASQ,OAAO,CAAA,CAAGD,IAAI,CAACR,KAAAA,CAAAA;AACxC;AACF;QAEA,MAAMU,GAAAA,GAAM,IAAI,CAACC,cAAc,EAAA;QAE/B,IAAK,IAAIC,IAAI,CAAGA,EAAAA,CAAAA,GAAIf,SAASgB,aAAa,CAACC,MAAM,EAAEF,CAAK,EAAA,CAAA;AACtD,YAAA,MAAMG,IAAOlB,GAAAA,QAAAA,CAASgB,aAAa,CAACD,CAAE,CAAA;;YAGtC,MAAMI,UAAAA,GAAalB,UAAWS,CAAAA,GAAG,CAACK,CAAAA,CAAAA;AAClC,YAAA,IAAII,UAAY,EAAA;gBACd,KAAK,MAAMhB,SAASgB,UAAY,CAAA;AAC9B,oBAAA,MAAMf,QAAWJ,GAAAA,QAAAA,CAASK,SAAS,CAACK,GAAG,CAACP,KAAAA,CAAAA;AACxC,oBAAA,MAAMiB,IAAOhB,GAAAA,QAAAA,CAASE,QAAQ,CAACc,IAAI;AACnC,oBAAA,MAAMC,IAAO,GAAA,IAAI,CAACC,YAAY,CAACF,IAAAA,CAAAA;AAC/B,oBAAA,MAAMxB,UAAU,IAAI,CAACR,UAAU,CAACmC,QAAQ,CAACH,IAAMC,EAAAA,IAAAA,CAAAA;AAC/C,oBAAA,IAAI,CAACrC,kBAAkB,CAACa,GAAG,CAACM,KAAOP,EAAAA,OAAAA,CAAAA;AACrC;AACF;;YAGA,IAAIsB,IAAAA,CAAKM,SAAS,EAAE;AACjBN,gBAAAA,IAAAA,CAAKM,SAAS,CAA0BX,GAAKK,EAAAA,IAAAA,CAAKO,IAAI,CAAA;AACzD;;YAGA,MAAMC,SAAAA,GAAYxB,SAAUQ,CAAAA,GAAG,CAACK,CAAAA,CAAAA;AAChC,YAAA,IAAIW,SAAW,EAAA;gBACb,KAAK,MAAMvB,SAASuB,SAAW,CAAA;AAC7B,oBAAA,MAAM9B,UAAU,IAAI,CAACZ,kBAAkB,CAAC0B,GAAG,CAACP,KAAAA,CAAAA;AAC5C,oBAAA,IAAIP,YAAY+B,SAAW,EAAA;AACzB,wBAAA,IAAI,CAACvC,UAAU,CAACwC,OAAO,CAAChC,OAAAA,CAAAA;AACxB,wBAAA,IAAI,CAACZ,kBAAkB,CAAC6C,MAAM,CAAC1B,KAAAA,CAAAA;AACjC;AACF;AACF;AACF;AACF;AAEA;;;AAGC,MACD2B,KAAc,GAAA;;AAEZ,QAAA,KAAK,MAAMlC,OAAW,IAAA,IAAI,CAACZ,kBAAkB,CAAC+C,MAAM,EAAI,CAAA;AACtD,YAAA,IAAI,CAAC3C,UAAU,CAACwC,OAAO,CAAChC,OAAAA,CAAAA;AAC1B;QACA,IAAI,CAACZ,kBAAkB,CAACgD,KAAK,EAAA;QAC7B,IAAI,CAAClD,iBAAiB,CAACkD,KAAK,EAAA;AAC9B;;AAIA,qBACQV,YAAaF,CAAAA,IAAmB,EAAkB;QACxD,MAAMa,IAAAA,GAAOb,IAAKc,CAAAA,QAAQ,IAAI,qBAAA;AAC9B,QAAA,IAAID,SAAS,UAAY,EAAA;YACvB,OAAO;gBACLzC,KAAO4B,EAAAA,IAAAA,CAAK5B,KAAK,IAAI,CAAA;gBACrBC,MAAQ2B,EAAAA,IAAAA,CAAK3B,MAAM,IAAI;AACzB,aAAA;AACF;;QAEA,MAAM0C,MAAAA,GAASf,IAAK5B,CAAAA,KAAK,IAAI,GAAA;QAC7B,MAAM4C,MAAAA,GAAShB,IAAK3B,CAAAA,MAAM,IAAI,GAAA;QAC9B,OAAO;YACLD,KAAO6C,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,KAAK,CAAC,IAAI,CAAClD,gBAAgB,GAAG8C,MAAAA,CAAAA,CAAAA;YACtD1C,MAAQ4C,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,KAAK,CAAC,IAAI,CAACjD,iBAAiB,GAAG8C,MAAAA,CAAAA;AAC1D,SAAA;AACF;qBAGA,cAA2C,GAAA;AACzC,QAAA,MAAMI,OAAO,IAAI;QACjB,OAAO;AACLC,YAAAA,UAAAA,CAAAA,CAAc9C,MAAgB,EAAA;;AAE5B,gBAAA,MAAM+C,WAAWF,IAAK1D,CAAAA,iBAAiB,CAAC4B,GAAG,CAACf,OAAOG,GAAG,CAAA;AACtD,gBAAA,IAAI4C,aAAaf,SAAW,EAAA;oBAC1B,OAAOe,QAAAA;AACT;;AAEA,gBAAA,MAAMC,YAAYH,IAAKxD,CAAAA,kBAAkB,CAAC0B,GAAG,CAACf,OAAOG,GAAG,CAAA;AACxD,gBAAA,IAAI6C,cAAchB,SAAW,EAAA;oBAC3B,OAAOgB,SAAAA;AACT;AACA,gBAAA,MAAM,IAAIC,KACR,CAAA,CAAC,8CAA8C,EAAEjD,MAAAA,CAAOkD,IAAI,CAAC,MAAM,EAAElD,MAAAA,CAAOG,GAAG,CAAC,GAAG,CAAC,GAClF,CAAC,2DAA2D,CAAC,CAAA;AAEnE;AACF,SAAA;AACF;AACF;;;;"}
1
+ {"version":3,"file":"executor.js","sources":["../../../src/render/rendergraph/executor.ts"],"sourcesContent":["import type {\r\n CompiledRenderGraph,\r\n RGTextureAllocator,\r\n RGTextureDesc,\r\n RGResolvedSize,\r\n RGExecuteContext,\r\n RGExecuteFn\r\n} from './types';\r\nimport type { RGHandle } from './types';\r\n\r\n/**\r\n * Executes a compiled render graph with automatic resource lifecycle management.\r\n *\r\n * The executor allocates transient textures before their first use and releases\r\n * them after their last use, using the provided {@link RGTextureAllocator}.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const executor = new RenderGraphExecutor(myAllocator, backbufferWidth, backbufferHeight);\r\n * executor.setImportedTexture(backbufferHandle, actualBackbufferTexture);\r\n * executor.execute(compiledGraph);\r\n * ```\r\n *\r\n * @typeParam TTexture - The concrete texture type (e.g. `Texture2D`).\r\n * @public\r\n */\r\nexport class RenderGraphExecutor<TTexture = unknown> {\r\n /** @internal */\r\n private _allocator: RGTextureAllocator<TTexture>;\r\n /** @internal */\r\n private _backbufferWidth: number;\r\n /** @internal */\r\n private _backbufferHeight: number;\r\n /** @internal */\r\n private _importedTextures: Map<number, TTexture> = new Map();\r\n /** @internal */\r\n private _allocatedTextures: Map<number, TTexture> = new Map();\r\n\r\n constructor(allocator: RGTextureAllocator<TTexture>, backbufferWidth: number, backbufferHeight: number) {\r\n this._allocator = allocator;\r\n this._backbufferWidth = backbufferWidth;\r\n this._backbufferHeight = backbufferHeight;\r\n }\r\n\r\n /**\r\n * Update the backbuffer dimensions used for 'backbuffer-relative' sizing.\r\n */\r\n setBackbufferSize(width: number, height: number): void {\r\n this._backbufferWidth = width;\r\n this._backbufferHeight = height;\r\n }\r\n\r\n /**\r\n * Register an imported (external) texture so it can be resolved during execution.\r\n *\r\n * @param handle - The handle returned from {@link RenderGraph.importTexture}.\r\n * @param texture - The actual GPU texture object.\r\n */\r\n setImportedTexture(handle: RGHandle, texture: TTexture): void {\r\n this._importedTextures.set(handle._id, texture);\r\n }\r\n\r\n /**\r\n * Execute the compiled graph with full resource lifecycle management.\r\n *\r\n * For each pass in topological order:\r\n * 1. Allocate any transient resources whose lifetime begins at this pass\r\n * 2. Invoke the pass's execute callback with a context that resolves handles\r\n * 3. Release any transient resources whose lifetime ends at this pass\r\n *\r\n * @param compiled - The compiled graph from {@link RenderGraph.compile}.\r\n */\r\n execute(compiled: CompiledRenderGraph): void {\r\n // Build per-pass allocation and release schedules\r\n const allocateAt = new Map<number, number[]>(); // passIndex -> resourceIds to allocate\r\n const releaseAt = new Map<number, number[]>(); // passIndex -> resourceIds to release\r\n\r\n for (const [resId, lifetime] of compiled.lifetimes) {\r\n if (lifetime.resource.kind === 'transient') {\r\n if (!allocateAt.has(lifetime.firstUse)) {\r\n allocateAt.set(lifetime.firstUse, []);\r\n }\r\n allocateAt.get(lifetime.firstUse)!.push(resId);\r\n\r\n if (!releaseAt.has(lifetime.lastUse)) {\r\n releaseAt.set(lifetime.lastUse, []);\r\n }\r\n releaseAt.get(lifetime.lastUse)!.push(resId);\r\n }\r\n }\r\n\r\n const ctx = this._createContext();\r\n\r\n for (let i = 0; i < compiled.orderedPasses.length; i++) {\r\n const pass = compiled.orderedPasses[i];\r\n\r\n // Allocate resources that start at this pass\r\n const toAllocate = allocateAt.get(i);\r\n if (toAllocate) {\r\n for (const resId of toAllocate) {\r\n const lifetime = compiled.lifetimes.get(resId)!;\r\n const desc = lifetime.resource.desc!;\r\n const size = this._resolveSize(desc);\r\n const texture = this._allocator.allocate(desc, size);\r\n this._allocatedTextures.set(resId, texture);\r\n }\r\n }\r\n\r\n // Execute the pass with exception safety for resource cleanup\r\n try {\r\n if (pass.executeFn) {\r\n (pass.executeFn as RGExecuteFn<unknown>)(ctx, pass.data);\r\n }\r\n } finally {\r\n // Release resources that end at this pass (always runs even if pass throws)\r\n const toRelease = releaseAt.get(i);\r\n if (toRelease) {\r\n for (const resId of toRelease) {\r\n const texture = this._allocatedTextures.get(resId);\r\n if (texture !== undefined) {\r\n this._allocator.release(texture);\r\n this._allocatedTextures.delete(resId);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear imported texture registrations and any leftover allocated textures.\r\n * Call this after execution or when resetting for a new frame.\r\n */\r\n reset(): void {\r\n // Release any textures that weren't released (shouldn't happen in normal flow)\r\n for (const texture of this._allocatedTextures.values()) {\r\n this._allocator.release(texture);\r\n }\r\n this._allocatedTextures.clear();\r\n this._importedTextures.clear();\r\n }\r\n\r\n // ─── Private ────────────────────────────────────────────────────────\r\n\r\n /** @internal */\r\n private _resolveSize(desc: RGTextureDesc): RGResolvedSize {\r\n const mode = desc.sizeMode ?? 'backbuffer-relative';\r\n if (mode === 'absolute') {\r\n return {\r\n width: desc.width ?? 1,\r\n height: desc.height ?? 1\r\n };\r\n }\r\n // backbuffer-relative: width/height are scale factors (default 1.0)\r\n const scaleX = desc.width ?? 1.0;\r\n const scaleY = desc.height ?? 1.0;\r\n return {\r\n width: Math.max(1, Math.floor(this._backbufferWidth * scaleX)),\r\n height: Math.max(1, Math.floor(this._backbufferHeight * scaleY))\r\n };\r\n }\r\n\r\n /** @internal */\r\n private _createContext(): RGExecuteContext {\r\n const self = this;\r\n return {\r\n getTexture<T>(handle: RGHandle): T {\r\n // Check imported first\r\n const imported = self._importedTextures.get(handle._id);\r\n if (imported !== undefined) {\r\n return imported as unknown as T;\r\n }\r\n // Check allocated transient\r\n const allocated = self._allocatedTextures.get(handle._id);\r\n if (allocated !== undefined) {\r\n return allocated as unknown as T;\r\n }\r\n throw new Error(\r\n `RenderGraphExecutor: cannot resolve resource \"${handle.name}\" (id=${handle._id}). ` +\r\n `It may not have been allocated yet or was already released.`\r\n );\r\n }\r\n };\r\n }\r\n}\r\n"],"names":["RenderGraphExecutor","_importedTextures","Map","_allocatedTextures","allocator","backbufferWidth","backbufferHeight","_allocator","_backbufferWidth","_backbufferHeight","setBackbufferSize","width","height","setImportedTexture","handle","texture","set","_id","execute","compiled","allocateAt","releaseAt","resId","lifetime","lifetimes","resource","kind","has","firstUse","get","push","lastUse","ctx","_createContext","i","orderedPasses","length","pass","toAllocate","desc","size","_resolveSize","allocate","executeFn","data","toRelease","undefined","release","delete","reset","values","clear","mode","sizeMode","scaleX","scaleY","Math","max","floor","self","getTexture","imported","allocated","Error","name"],"mappings":"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"}
@@ -11,8 +11,12 @@ import { fetchSampler } from '../../utility/misc.js';
11
11
  import { MaterialVaryingFlags } from '../../values.js';
12
12
  import { AbstractPostEffect, PostEffectLayer } from '../../posteffect/posteffect.js';
13
13
  import { RenderGraph } from './rendergraph.js';
14
+ import { RenderGraphExecutor } from './executor.js';
15
+ import { DevicePoolAllocator } from './device_pool_allocator.js';
16
+ import { HistoryResourceManager } from './history_resource_manager.js';
14
17
  import { renderObjectColors } from '../gpu_picking.js';
15
18
  import { BoxShape } from '../../shapes/box.js';
19
+ import '../../shapes/capsule.js';
16
20
  import '../../shapes/cylinder.js';
17
21
  import '../../shapes/torus.js';
18
22
  import '../../shapes/plane.js';
@@ -24,6 +28,7 @@ const _scenePass = new LightPass();
24
28
  const _depthPass = new DepthPass();
25
29
  const _shadowMapPass = new ShadowMapPass();
26
30
  const _clusters = [];
31
+ const _devicePoolAllocator = new DevicePoolAllocator();
27
32
  let _backDepthColorState = null;
28
33
  let _frontDepthColorState = null;
29
34
  function getClusteredLight() {
@@ -32,9 +37,9 @@ function getClusteredLight() {
32
37
  function freeClusteredLight(cl) {
33
38
  _clusters.push(cl);
34
39
  }
35
- /**
36
- * Derive pipeline options from the current scene/camera state.
37
- * @internal
40
+ /**
41
+ * Derive pipeline options from the current scene/camera state.
42
+ * @internal
38
43
  */ function deriveForwardPlusOptions(scene, camera, deviceType, renderQueue) {
39
44
  const ssr = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();
40
45
  return {
@@ -48,22 +53,21 @@ function freeClusteredLight(cl) {
48
53
  };
49
54
  }
50
55
  // ─── Forward+ Graph Builder ─────────────────────────────────────────
51
- /**
52
- * Constructs a render graph representing the forward+ pipeline.
53
- *
54
- * Each step in the existing `SceneRenderer._renderScene` becomes a graph pass.
55
- * Execute callbacks delegate to the existing rendering code, sharing a mutable
56
- * {@link FrameState}.
57
- *
58
- * @param graph - The render graph to populate.
59
- * @param ctx - The draw context for this frame.
60
- * @param renderQueue - The culled render queue.
61
- * @param options - Pipeline feature toggles.
62
- * @returns The backbuffer handle (graph output).
63
- *
64
- * @public
56
+ /**
57
+ * Constructs a render graph representing the forward+ pipeline.
58
+ *
59
+ * Each step in the existing `SceneRenderer._renderScene` becomes a graph pass.
60
+ * Execute callbacks delegate to the existing rendering code, sharing a mutable
61
+ * {@link FrameState}.
62
+ *
63
+ * @param graph - The render graph to populate.
64
+ * @param ctx - The draw context for this frame.
65
+ * @param renderQueue - The culled render queue.
66
+ * @param options - Pipeline feature toggles.
67
+ * @returns The backbuffer handle (graph output).
68
+ *
69
+ * @public
65
70
  */ function buildForwardPlusGraph(graph, ctx, renderQueue, options) {
66
- const device = ctx.device;
67
71
  const backbuffer = graph.importTexture('backbuffer');
68
72
  // Shared mutable frame state
69
73
  const frame = {
@@ -101,36 +105,40 @@ function freeClusteredLight(cl) {
101
105
  });
102
106
  }
103
107
  // ── 4. Shadow Maps ────────────────────────────────────────────────
104
- let shadowMapsHandle;
108
+ // Shadow maps are managed internally by lights, mark as side effect
105
109
  if (renderQueue.shadowedLights.length > 0) {
106
110
  graph.addPass('ShadowMaps', (builder)=>{
107
- shadowMapsHandle = builder.createTexture({
108
- format: 'r32f',
109
- label: 'shadowMaps'
110
- });
111
+ builder.sideEffect();
111
112
  builder.setExecute(()=>{
112
113
  renderShadowMaps(ctx, renderQueue.shadowedLights);
113
114
  });
114
115
  });
115
116
  }
116
117
  // ── 5. Depth Prepass ──────────────────────────────────────────────
117
- let depthHandle;
118
- let motionVectorHandle;
119
- graph.addPass('DepthPrepass', (builder)=>{
120
- depthHandle = builder.createTexture({
121
- format: ctx.SSRCalcThickness ? device.type === 'webgl' ? 'rgba16f' : 'rg32f' : device.type === 'webgl' ? 'rgba8unorm' : 'r32f',
118
+ // Declare transient depth and motion vector textures
119
+ const depthPassResult = graph.addPass('DepthPrepass', (builder)=>{
120
+ const format = ctx.device.type === 'webgl' ? ctx.SSRCalcThickness ? 'rgba16f' : 'rgba8unorm' : ctx.SSRCalcThickness ? 'rg32f' : 'r32f';
121
+ const mvFormat = 'rgba16f';
122
+ const depthHandle = builder.createTexture({
123
+ format,
122
124
  label: 'linearDepth'
123
125
  });
124
- if (options.motionVectors) {
125
- motionVectorHandle = builder.createTexture({
126
- format: 'rgba16f',
127
- label: 'motionVector'
128
- });
129
- }
130
- builder.setExecute(()=>{
131
- frame.depthFramebuffer = renderSceneDepth(frame, null);
126
+ const motionVectorHandle = options.motionVectors ? builder.createTexture({
127
+ format: mvFormat,
128
+ label: 'motionVector'
129
+ }) : undefined;
130
+ builder.setExecute((rgCtx)=>{
131
+ const depthTex = rgCtx.getTexture(depthHandle);
132
+ const mvTex = motionVectorHandle ? rgCtx.getTexture(motionVectorHandle) : null;
133
+ frame.depthFramebuffer = renderSceneDepth(frame, null, depthTex, mvTex);
132
134
  });
135
+ return {
136
+ depthHandle,
137
+ motionVectorHandle
138
+ };
133
139
  });
140
+ const depthHandle = depthPassResult.depthHandle;
141
+ const motionVectorHandle = depthPassResult.motionVectorHandle;
134
142
  // ── 6. Hi-Z (optional) ───────────────────────────────────────────
135
143
  let hiZHandle;
136
144
  if (options.hiZ) {
@@ -141,30 +149,53 @@ function freeClusteredLight(cl) {
141
149
  label: 'hiZ',
142
150
  mipLevels: 10
143
151
  });
144
- builder.setExecute(()=>{
145
- // HiZ is already built inside renderSceneDepth, but we declare it
146
- // for graph dependency tracking. In the future this will be split out.
152
+ builder.setExecute((rgCtx)=>{
153
+ const ctx = frame.ctx;
154
+ // Use the depth texture from the framebuffer (which contains the RenderGraph texture)
155
+ const depthTex = frame.depthFramebuffer?.getDepthAttachment();
156
+ if (depthTex) {
157
+ // Get the HiZ texture allocated by the executor
158
+ const hiZTex = rgCtx.getTexture(hiZHandle);
159
+ const w = hiZTex.width;
160
+ const h = hiZTex.height;
161
+ const HiZFrameBuffer = ctx.device.pool.fetchTemporalFramebuffer(false, w, h, hiZTex, null, false);
162
+ buildHiZ(depthTex, HiZFrameBuffer);
163
+ ctx.HiZTexture = hiZTex;
164
+ ctx.device.pool.releaseFrameBuffer(HiZFrameBuffer);
165
+ }
147
166
  });
148
167
  });
149
168
  }
150
169
  // ── 7. Main Light Pass ────────────────────────────────────────────
151
- let sceneColorHandle;
152
- graph.addPass('LightPass', (builder)=>{
170
+ const lightPassResult = graph.addPass('LightPass', (builder)=>{
153
171
  builder.read(depthHandle);
154
- if (shadowMapsHandle) {
155
- builder.read(shadowMapsHandle);
156
- }
157
172
  if (hiZHandle) {
158
173
  builder.read(hiZHandle);
159
174
  }
160
- sceneColorHandle = builder.createTexture({
175
+ // Create scene color texture (intermediate render target)
176
+ const sceneColorHandle = builder.createTexture({
161
177
  format: ctx.colorFormat,
162
178
  label: 'sceneColor'
163
179
  });
164
- builder.setExecute(()=>{
165
- renderMainLightPass(frame);
180
+ // Create optional sceneColorCopy for transmission/refraction materials
181
+ let sceneColorCopyHandle;
182
+ if (options.needSceneColor) {
183
+ sceneColorCopyHandle = builder.createTexture({
184
+ format: ctx.colorFormat,
185
+ label: 'sceneColorCopy'
186
+ });
187
+ }
188
+ builder.setExecute((rgCtx)=>{
189
+ const sceneColorTex = rgCtx.getTexture(sceneColorHandle);
190
+ const sceneColorCopyTex = sceneColorCopyHandle ? rgCtx.getTexture(sceneColorCopyHandle) : null;
191
+ renderMainLightPass(frame, sceneColorTex, sceneColorCopyTex);
166
192
  });
193
+ return {
194
+ sceneColorHandle,
195
+ sceneColorCopyHandle
196
+ };
167
197
  });
198
+ const sceneColorHandle = lightPassResult.sceneColorHandle;
168
199
  // ── 8. Post Effects + Final Composite ─────────────────────────────
169
200
  graph.addPass('Composite', (builder)=>{
170
201
  builder.read(sceneColorHandle);
@@ -190,28 +221,40 @@ function freeClusteredLight(cl) {
190
221
  }
191
222
  ctx.device.popDeviceStates();
192
223
  }
193
- /** @internal */ function renderSceneDepth(frame, existingDepthFb) {
224
+ /** @internal */ function renderSceneDepth(frame, existingDepthFb, depthTex, motionVectorTex) {
194
225
  const ctx = frame.ctx;
195
226
  const renderQueue = frame.renderQueue;
196
227
  const transmission = !!existingDepthFb;
197
228
  let depthFramebuffer = existingDepthFb;
198
229
  if (!depthFramebuffer) {
199
- const format = ctx.device.type === 'webgl' ? ctx.SSRCalcThickness ? 'rgba16f' : 'rgba8unorm' : ctx.SSRCalcThickness ? 'rg32f' : 'r32f';
200
- const mvFormat = 'rgba16f';
201
- if (!ctx.finalFramebuffer) {
202
- depthFramebuffer = ctx.device.pool.fetchTemporalFramebuffer(true, ctx.renderWidth, ctx.renderHeight, ctx.motionVectors ? [
203
- format,
204
- mvFormat
205
- ] : format, ctx.depthFormat, false);
230
+ // Use RenderGraph-allocated textures if provided
231
+ if (depthTex) {
232
+ const colorAttachments = motionVectorTex ? [
233
+ depthTex,
234
+ motionVectorTex
235
+ ] : depthTex;
236
+ const depthAttachment = ctx.finalFramebuffer?.getDepthAttachment();
237
+ const depthTexOrFormat = depthAttachment?.isTexture2D() ? depthAttachment : ctx.depthFormat;
238
+ depthFramebuffer = ctx.device.pool.fetchTemporalFramebuffer(true, depthTex.width, depthTex.height, colorAttachments, depthTexOrFormat, false);
206
239
  } else {
207
- const originDepth = ctx.finalFramebuffer?.getDepthAttachment();
208
- depthFramebuffer = originDepth?.isTexture2D() ? ctx.device.pool.fetchTemporalFramebuffer(true, originDepth.width, originDepth.height, ctx.motionVectors ? [
209
- format,
210
- mvFormat
211
- ] : format, originDepth, false) : ctx.device.pool.fetchTemporalFramebuffer(true, ctx.renderWidth, ctx.renderHeight, ctx.motionVectors ? [
212
- format,
213
- mvFormat
214
- ] : format, ctx.depthFormat, false);
240
+ // Fallback: allocate from pool (legacy path)
241
+ const format = ctx.device.type === 'webgl' ? ctx.SSRCalcThickness ? 'rgba16f' : 'rgba8unorm' : ctx.SSRCalcThickness ? 'rg32f' : 'r32f';
242
+ const mvFormat = 'rgba16f';
243
+ if (!ctx.finalFramebuffer) {
244
+ depthFramebuffer = ctx.device.pool.fetchTemporalFramebuffer(true, ctx.renderWidth, ctx.renderHeight, ctx.motionVectors ? [
245
+ format,
246
+ mvFormat
247
+ ] : format, ctx.depthFormat, false);
248
+ } else {
249
+ const originDepth = ctx.finalFramebuffer?.getDepthAttachment();
250
+ depthFramebuffer = originDepth?.isTexture2D() ? ctx.device.pool.fetchTemporalFramebuffer(true, originDepth.width, originDepth.height, ctx.motionVectors ? [
251
+ format,
252
+ mvFormat
253
+ ] : format, originDepth, false) : ctx.device.pool.fetchTemporalFramebuffer(true, ctx.renderWidth, ctx.renderHeight, ctx.motionVectors ? [
254
+ format,
255
+ mvFormat
256
+ ] : format, ctx.depthFormat, false);
257
+ }
215
258
  }
216
259
  }
217
260
  ctx.device.pushDeviceStates();
@@ -249,13 +292,7 @@ function freeClusteredLight(cl) {
249
292
  // Sky motion vectors rendering is handled inline
250
293
  renderSkyMotionVectors(ctx);
251
294
  }
252
- if (ctx.HiZ) {
253
- const w = ctx.linearDepthTexture.width;
254
- const h = ctx.linearDepthTexture.height;
255
- const HiZFrameBuffer = ctx.device.pool.fetchTemporalFramebuffer(true, w, h, ctx.linearDepthTexture.format, null, true);
256
- buildHiZ(ctx.depthTexture, HiZFrameBuffer);
257
- ctx.HiZTexture = HiZFrameBuffer.getColorAttachments()[0];
258
- }
295
+ // HiZ is now built in the dedicated HiZ pass
259
296
  }
260
297
  return depthFramebuffer;
261
298
  }
@@ -321,13 +358,15 @@ let _skyMVBox = null;
321
358
  device.popDeviceStates();
322
359
  device.pool.releaseFrameBuffer(fb);
323
360
  }
324
- /** @internal */ function renderMainLightPass(frame) {
361
+ /** @internal */ function renderMainLightPass(frame, sceneColorTex, sceneColorCopyTex) {
325
362
  const { ctx, renderQueue } = frame;
326
363
  const device = ctx.device;
327
- if (ctx.depthTexture === ctx.finalFramebuffer?.getDepthAttachment()) {
364
+ // Use RenderGraph-allocated scene color texture
365
+ const depthTex = frame.depthFramebuffer?.getDepthAttachment();
366
+ if (depthTex === ctx.finalFramebuffer?.getDepthAttachment()) {
328
367
  ctx.intermediateFramebuffer = ctx.finalFramebuffer;
329
368
  } else {
330
- ctx.intermediateFramebuffer = device.pool.fetchTemporalFramebuffer(false, ctx.depthTexture.width, ctx.depthTexture.height, ctx.colorFormat, ctx.depthTexture);
369
+ ctx.intermediateFramebuffer = device.pool.fetchTemporalFramebuffer(false, sceneColorTex.width, sceneColorTex.height, sceneColorTex, depthTex);
331
370
  }
332
371
  if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {
333
372
  device.pushDeviceStates();
@@ -337,26 +376,27 @@ let _skyMVBox = null;
337
376
  device.setScissor(null);
338
377
  }
339
378
  _scenePass.transmission = false;
340
- _scenePass.clearDepth = ctx.depthTexture ? null : 1;
341
- _scenePass.clearStencil = ctx.depthTexture ? null : 0;
379
+ _scenePass.clearDepth = depthTex ? null : 1;
380
+ _scenePass.clearStencil = depthTex ? null : 0;
342
381
  if (ctx.SSR && !renderQueue.needSceneColor()) {
343
382
  ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;
344
383
  }
345
384
  ctx.compositor?.begin(ctx);
346
- if (renderQueue.needSceneColor()) {
385
+ if (renderQueue.needSceneColor() && sceneColorCopyTex) {
347
386
  const compositor = ctx.compositor;
348
387
  ctx.compositor = null;
349
- const sceneColorFramebuffer = device.pool.fetchTemporalFramebuffer(true, ctx.depthTexture.width, ctx.depthTexture.height, ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS ? [
350
- ctx.colorFormat,
388
+ // Use RenderGraph-allocated sceneColorCopy texture
389
+ const sceneColorFramebuffer = device.pool.fetchTemporalFramebuffer(true, sceneColorCopyTex.width, sceneColorCopyTex.height, ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS ? [
390
+ sceneColorCopyTex,
351
391
  device.getFramebuffer().getColorAttachments()[1],
352
392
  device.getFramebuffer().getColorAttachments()[2]
353
- ] : ctx.colorFormat, ctx.depthTexture, false);
393
+ ] : sceneColorCopyTex, depthTex, false);
354
394
  device.pushDeviceStates();
355
395
  device.setFramebuffer(sceneColorFramebuffer);
356
396
  _scenePass.transmission = false;
357
397
  _scenePass.render(ctx, null, null, renderQueue);
358
398
  device.popDeviceStates();
359
- ctx.sceneColorTexture = sceneColorFramebuffer.getColorAttachments()[0];
399
+ ctx.sceneColorTexture = sceneColorCopyTex;
360
400
  new CopyBlitter().blit(ctx.sceneColorTexture, device.getFramebuffer() ?? null, fetchSampler('clamp_nearest_nomip'));
361
401
  _scenePass.transmission = true;
362
402
  _scenePass.clearColor = null;
@@ -390,24 +430,40 @@ let _skyMVBox = null;
390
430
  }
391
431
  }
392
432
  // ─── Convenience: Execute Full Pipeline ─────────────────────────────
393
- /**
394
- * Build, compile, and execute the forward+ pipeline as a render graph.
395
- *
396
- * This is the drop-in replacement for `SceneRenderer._renderScene`.
397
- *
398
- * @param ctx - The draw context for this frame.
399
- * @public
433
+ /**
434
+ * Build, compile, and execute the forward+ pipeline as a render graph.
435
+ *
436
+ * This is the drop-in replacement for `SceneRenderer._renderScene`.
437
+ *
438
+ * @param ctx - The draw context for this frame.
439
+ * @public
400
440
  */ function executeForwardPlusGraph(ctx) {
401
441
  const device = ctx.device;
402
442
  const graph = new RenderGraph();
403
443
  // Cull scene first (needed to derive options)
404
444
  const renderQueue = _scenePass.cullScene(ctx, ctx.camera);
405
445
  const options = deriveForwardPlusOptions(ctx.scene, ctx.camera, device.type, renderQueue);
446
+ // Ensure the camera has a history resource manager for temporal effects (TAA, motion blur)
447
+ let historyManager = ctx.camera.getHistoryResourceManager();
448
+ if (!historyManager) {
449
+ historyManager = new HistoryResourceManager(_devicePoolAllocator);
450
+ ctx.camera.setHistoryResourceManager(historyManager);
451
+ }
406
452
  const backbuffer = buildForwardPlusGraph(graph, ctx, renderQueue, options);
407
453
  const compiled = graph.compile([
408
454
  backbuffer
409
455
  ]);
410
- graph.execute(compiled);
456
+ // Use RenderGraphExecutor for automatic resource management
457
+ const executor = new RenderGraphExecutor(_devicePoolAllocator, ctx.renderWidth, ctx.renderHeight);
458
+ // Register imported backbuffer (if using finalFramebuffer)
459
+ if (ctx.finalFramebuffer) {
460
+ const backbufferTex = ctx.finalFramebuffer.getColorAttachments()[0];
461
+ executor.setImportedTexture(backbuffer, backbufferTex);
462
+ }
463
+ executor.execute(compiled);
464
+ executor.reset();
465
+ // Swap history buffers at frame end (ping-pong)
466
+ historyManager.swap();
411
467
  }
412
468
 
413
469
  export { buildForwardPlusGraph, deriveForwardPlusOptions, executeForwardPlusGraph };