@zephyr3d/editor 0.3.8 → 0.3.9

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 (137) hide show
  1. package/dist/assets/{index-BZ1L8ggE.js → index-CO6yA4Rj.js} +313 -11
  2. package/dist/assistant/zephyr-types-index.json +13834 -11679
  3. package/dist/index.html +1 -1
  4. package/dist/modules/zephyr3d_backend-webgpu.js +1 -1
  5. package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
  6. package/dist/modules/zephyr3d_device.js +2 -2
  7. package/dist/modules/zephyr3d_device.js.map +1 -1
  8. package/dist/modules/zephyr3d_scene.js +2325 -515
  9. package/dist/modules/zephyr3d_scene.js.map +1 -1
  10. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +1 -1
  11. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
  12. package/dist/vendor/zephyr3d/device/dist/device.js +2 -2
  13. package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
  14. package/dist/vendor/zephyr3d/scene/dist/app/engine.js +3 -1
  15. package/dist/vendor/zephyr3d/scene/dist/app/engine.js.map +1 -1
  16. package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js +1 -0
  17. package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js.map +1 -1
  18. package/dist/vendor/zephyr3d/scene/dist/camera/camera.js +87 -0
  19. package/dist/vendor/zephyr3d/scene/dist/camera/camera.js.map +1 -1
  20. package/dist/vendor/zephyr3d/scene/dist/index.d.ts +158 -4
  21. package/dist/vendor/zephyr3d/scene/dist/index.js +3 -0
  22. package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
  23. package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js +8 -1
  24. package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js.map +1 -1
  25. package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js +6 -0
  26. package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js.map +1 -1
  27. package/dist/vendor/zephyr3d/scene/dist/material/skin.js +263 -0
  28. package/dist/vendor/zephyr3d/scene/dist/material/skin.js.map +1 -0
  29. package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js +3 -0
  30. package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js.map +1 -1
  31. package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js +194 -0
  32. package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js.map +1 -0
  33. package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js +26 -49
  34. package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js.map +1 -1
  35. package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js +1 -0
  36. package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js.map +1 -1
  37. package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js +2 -40
  38. package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js.map +1 -1
  39. package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js +1 -0
  40. package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js.map +1 -1
  41. package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js +1 -0
  42. package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js.map +1 -1
  43. package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js +1 -0
  44. package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js.map +1 -1
  45. package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js +1 -0
  46. package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js.map +1 -1
  47. package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js +1 -0
  48. package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js.map +1 -1
  49. package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js +4 -1
  50. package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js.map +1 -1
  51. package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js +1 -0
  52. package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js.map +1 -1
  53. package/dist/vendor/zephyr3d/scene/dist/render/renderer.js +1 -0
  54. package/dist/vendor/zephyr3d/scene/dist/render/renderer.js.map +1 -1
  55. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js +12 -5
  56. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  57. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +78 -8
  58. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  59. package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js +1 -0
  60. package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js.map +1 -1
  61. package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js +1 -0
  62. package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js.map +1 -1
  63. package/dist/vendor/zephyr3d/scene/dist/scene/environment.js +1 -0
  64. package/dist/vendor/zephyr3d/scene/dist/scene/environment.js.map +1 -1
  65. package/dist/vendor/zephyr3d/scene/dist/scene/light.js +158 -154
  66. package/dist/vendor/zephyr3d/scene/dist/scene/light.js.map +1 -1
  67. package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js +1 -0
  68. package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js.map +1 -1
  69. package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js +1 -0
  70. package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js.map +1 -1
  71. package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js +1 -0
  72. package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js.map +1 -1
  73. package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js +1 -0
  74. package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js.map +1 -1
  75. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
  76. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
  77. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js +1 -0
  78. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js.map +1 -1
  79. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js +1 -0
  80. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  81. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js +1 -0
  82. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  83. package/dist/vendor/zephyr3d/scene/dist/scene/water.js +1 -0
  84. package/dist/vendor/zephyr3d/scene/dist/scene/water.js.map +1 -1
  85. package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js +617 -1
  86. package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js.map +1 -1
  87. package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js +1 -0
  88. package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js.map +1 -1
  89. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js +1 -0
  90. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js.map +1 -1
  91. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js +1 -0
  92. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js.map +1 -1
  93. package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js +182 -0
  94. package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js.map +1 -0
  95. package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js +1 -0
  96. package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js.map +1 -1
  97. package/dist/vendor/zephyr3d/scene/dist/shadow/shadow_impl.js.map +1 -1
  98. package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js +183 -105
  99. package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js.map +1 -1
  100. package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js +1 -0
  101. package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js.map +1 -1
  102. package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js +1 -0
  103. package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js.map +1 -1
  104. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +3 -1
  105. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
  106. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +1 -0
  107. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
  108. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js +1 -0
  109. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js.map +1 -1
  110. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js +122 -0
  111. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
  112. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js +1 -0
  113. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js.map +1 -1
  114. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js +102 -21
  115. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js.map +1 -1
  116. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js +195 -3
  117. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js.map +1 -1
  118. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js +1 -0
  119. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js.map +1 -1
  120. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js +1 -0
  121. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js.map +1 -1
  122. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js +1 -0
  123. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js.map +1 -1
  124. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js +1 -0
  125. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js.map +1 -1
  126. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js +1 -0
  127. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js.map +1 -1
  128. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js +1 -0
  129. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js.map +1 -1
  130. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js +1 -0
  131. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js.map +1 -1
  132. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js +1 -0
  133. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js.map +1 -1
  134. package/dist/vendor/zephyr3d/scene/dist/values.js +1 -0
  135. package/dist/vendor/zephyr3d/scene/dist/values.js.map +1 -1
  136. package/electron/main.cjs +30 -6
  137. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"forward_plus_builder.js","sources":["../../../src/render/rendergraph/forward_plus_builder.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { 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 type { DrawContext } from '../drawable';\r\nimport {\r\n RenderQueue,\r\n type RenderItemList,\r\n type RenderItemListInfo,\r\n type RenderQueueItem\r\n} from '../render_queue';\r\nimport type { PunctualLight, Scene } from '../../scene';\r\nimport type { Camera } from '../../camera';\r\nimport { LightPass } from '../lightpass';\r\nimport { ShadowMapPass } from '../shadowmap_pass';\r\nimport { DepthPass } from '../depthpass';\r\nimport { ClusteredLight } from '../cluster_light';\r\nimport { buildHiZ } from '../hzb';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { MaterialVaryingFlags } from '../../values';\r\nimport { AbstractPostEffect, PostEffectLayer } from '../../posteffect/posteffect';\r\nimport { RenderGraph } from './rendergraph';\r\nimport { RenderGraphExecutor } from './executor';\r\nimport { DevicePoolAllocator } from './device_pool_allocator';\r\nimport { HistoryResourceManager } from './history_resource_manager';\r\nimport { RGHistoryResources } from './history_resources';\r\nimport type { RGExecuteContext, RGHandle } from './types';\r\nimport { renderObjectColors } from '../gpu_picking';\r\nimport type { Primitive } from '../primitive';\r\nimport { BoxShape } from '../../shapes';\r\n\r\n// ─── Shared Pass Instances ──────────────────────────────────────────\r\n\r\nconst _scenePass = new LightPass();\r\nconst _depthPass = new DepthPass();\r\nconst _shadowMapPass = new ShadowMapPass();\r\nconst _clusters: ClusteredLight[] = [];\r\nconst _devicePoolAllocator = new DevicePoolAllocator();\r\nlet _backDepthColorState: Nullable<ColorState> = null;\r\nlet _frontDepthColorState: Nullable<ColorState> = null;\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n\r\nfunction getClusteredLight(): ClusteredLight {\r\n return _clusters.length > 0 ? _clusters.pop()! : new ClusteredLight();\r\n}\r\nfunction freeClusteredLight(cl: ClusteredLight): void {\r\n _clusters.push(cl);\r\n}\r\n\r\nfunction getCoreMaterial(material: unknown): unknown {\r\n return (material as { coreMaterial?: unknown } | null | undefined)?.coreMaterial ?? material ?? null;\r\n}\r\n\r\nfunction hasSSSMaterialCore(material: unknown): boolean {\r\n return !!(getCoreMaterial(material) as { subsurfaceProfile?: unknown } | null)?.subsurfaceProfile;\r\n}\r\n\r\nfunction renderQueueHasActiveSSS(renderQueue: RenderQueue): boolean {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return false;\r\n }\r\n const lists = [...itemList.opaque.lit, ...itemList.opaque.unlit];\r\n for (const list of lists) {\r\n for (const material of list.materialList) {\r\n if (hasSSSMaterialCore(material)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction filterActualSSSItemList(items: RenderQueueItem[]): RenderQueueItem[] {\r\n return items.filter((item) => hasSSSMaterialCore(item.drawable.getMaterial?.()));\r\n}\r\n\r\nfunction filterActualSSSMaterialList(materialList: Set<any>): Set<any> {\r\n const filtered = new Set<any>();\r\n materialList.forEach((mat) => {\r\n if (hasSSSMaterialCore(mat)) {\r\n filtered.add(mat);\r\n }\r\n });\r\n return filtered;\r\n}\r\n\r\nfunction cloneActualSSSListInfo(source: RenderItemListInfo, _targetQueue: RenderQueue): RenderItemListInfo {\r\n return {\r\n itemList: filterActualSSSItemList(source.itemList),\r\n skinItemList: filterActualSSSItemList(source.skinItemList),\r\n morphItemList: filterActualSSSItemList(source.morphItemList),\r\n skinAndMorphItemList: filterActualSSSItemList(source.skinAndMorphItemList),\r\n instanceItemList: filterActualSSSItemList(source.instanceItemList),\r\n materialList: filterActualSSSMaterialList(source.materialList),\r\n instanceList: {},\r\n renderQueue: source.renderQueue\r\n };\r\n}\r\n\r\nfunction cloneActualSSSBundle(\r\n source: RenderItemList['opaque'],\r\n targetQueue: RenderQueue\r\n): RenderItemList['opaque'] {\r\n return {\r\n lit: source.lit.map((info) => cloneActualSSSListInfo(info, targetQueue)),\r\n unlit: source.unlit.map((info) => cloneActualSSSListInfo(info, targetQueue))\r\n };\r\n}\r\n\r\nfunction hasAnyActualSSSItems(renderItems: RenderItemListInfo[]): boolean {\r\n return renderItems.some(\r\n (info) =>\r\n info.itemList.length > 0 ||\r\n info.skinItemList.length > 0 ||\r\n info.morphItemList.length > 0 ||\r\n info.skinAndMorphItemList.length > 0 ||\r\n info.instanceItemList.length > 0\r\n );\r\n}\r\n\r\nfunction createActualSSSRenderQueue(renderQueue: RenderQueue): RenderQueue | null {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return null;\r\n }\r\n const queue = new RenderQueue(_scenePass);\r\n const sssOpaque = cloneActualSSSBundle(itemList.opaque, queue);\r\n if (!hasAnyActualSSSItems([...sssOpaque.lit, ...sssOpaque.unlit])) {\r\n queue.dispose();\r\n return null;\r\n }\r\n const emptyBundle = { lit: [], unlit: [] };\r\n const target = queue as unknown as {\r\n _itemList: RenderItemList;\r\n _shadowedLightList: PunctualLight[];\r\n _unshadowedLightList: PunctualLight[];\r\n _sunLight: typeof renderQueue.sunLight;\r\n _primaryDirectionalLight: typeof renderQueue.primaryDirectionalLight;\r\n _primaryTransmissionLight: typeof renderQueue.primaryTransmissionLight;\r\n _needSceneColor: boolean;\r\n _needSceneDepth: boolean;\r\n _needSceneColorWithDepth: boolean;\r\n _drawTransparent: boolean;\r\n };\r\n target._itemList = {\r\n opaque: sssOpaque,\r\n transmission: emptyBundle,\r\n transparent: emptyBundle,\r\n transmission_trans: emptyBundle\r\n };\r\n target._shadowedLightList = renderQueue.shadowedLights;\r\n target._unshadowedLightList = renderQueue.unshadowedLights;\r\n target._sunLight = renderQueue.sunLight;\r\n target._primaryDirectionalLight = renderQueue.primaryDirectionalLight;\r\n target._primaryTransmissionLight = renderQueue.primaryTransmissionLight;\r\n target._needSceneColor = false;\r\n target._needSceneDepth = false;\r\n target._needSceneColorWithDepth = false;\r\n target._drawTransparent = false;\r\n return queue;\r\n}\r\n\r\nfunction getSurfaceTextureFormat(ctx: DrawContext): TextureFormat {\r\n const caps = ctx.device.getDeviceCaps?.();\r\n return caps?.textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n}\r\n\r\nfunction getTextureFormatBytes(ctx: DrawContext, format: TextureFormat): number {\r\n return ctx.device.getDeviceCaps().textureCaps.getTextureFormatInfo(format).size;\r\n}\r\n\r\nfunction shouldStoreSSSDiffuse(ctx: DrawContext): boolean {\r\n return ctx.camera.sssStrength > 0 && ctx.camera.sssBlurScale > 0;\r\n}\r\n\r\nfunction shouldStoreSSSTransmission(ctx: DrawContext): boolean {\r\n return ctx.camera.sssStrength > 0 && ctx.camera.sssTransmissionStrength > 0;\r\n}\r\n\r\nfunction getSSSLightingTextureFormat(\r\n ctx: DrawContext,\r\n attachmentCount: number,\r\n includeSSRSurfaceMRT: boolean\r\n): TextureFormat {\r\n const colorFormat = ctx.colorFormat!;\r\n if (!includeSSRSurfaceMRT || attachmentCount === 0) {\r\n return colorFormat;\r\n }\r\n const caps = ctx.device.getDeviceCaps();\r\n const roughnessFormat = ctx.SSRRoughnessTexture?.format ?? colorFormat;\r\n const normalFormat = ctx.SSRNormalTexture?.format ?? colorFormat;\r\n const colorBytes =\r\n getTextureFormatBytes(ctx, colorFormat) +\r\n getTextureFormatBytes(ctx, roughnessFormat) +\r\n getTextureFormatBytes(ctx, normalFormat);\r\n const fullPrecisionBytes = colorBytes + getTextureFormatBytes(ctx, colorFormat) * attachmentCount;\r\n if (fullPrecisionBytes <= caps.framebufferCaps.maxColorAttachmentBytesPerSample) {\r\n return colorFormat;\r\n }\r\n return 'rgba8unorm';\r\n}\r\n\r\nfunction getFullMipLevelCount(width: number, height: number): number {\r\n return Math.max(1, Math.floor(Math.log2(Math.max(1, width, height))) + 1);\r\n}\r\n\r\nfunction hasSurfaceMRT(ctx: DrawContext): boolean {\r\n return !!(ctx.materialFlags & SURFACE_MRT_FLAGS);\r\n}\r\n\r\nfunction getLightPassColorAttachments(\r\n ctx: DrawContext,\r\n colorAttachment: TextureFormat | Texture2D\r\n): TextureFormat | Texture2D | Array<TextureFormat | Texture2D> {\r\n const attachments: Array<TextureFormat | Texture2D> = [colorAttachment];\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {\r\n attachments.push(ctx.SSRRoughnessTexture!, ctx.SSRNormalTexture!);\r\n } else if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_NORMAL) {\r\n attachments.push(ctx.SSRNormalTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_PROFILE) {\r\n attachments.push(ctx.SSSProfileTexture!, ctx.SSSParamTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n}\r\n\r\n// ─── Pipeline Options ───────────────────────────────────────────────\r\n\r\n/**\r\n * Options controlling which features are enabled in the forward+ pipeline.\r\n *\r\n * Derived from camera settings and device capabilities each frame.\r\n *\r\n * @public\r\n */\r\nexport interface ForwardPlusOptions {\r\n /** Enable depth prepass (always true for now). */\r\n depthPrepass: boolean;\r\n /** Enable motion vectors (requires TAA or motionBlur). */\r\n motionVectors: boolean;\r\n /** Enable Hi-Z pyramid (for SSR ray tracing). */\r\n hiZ: boolean;\r\n /** Enable screen-space reflections. */\r\n ssr: boolean;\r\n /** Whether to compute SSR thickness. */\r\n ssrCalcThickness: boolean;\r\n /** Whether GPU picking is requested this frame. */\r\n gpuPicking: boolean;\r\n /** Whether transmission/refraction materials are present. */\r\n needSceneColor: boolean;\r\n /** Whether scene-color-dependent materials also require scene depth. */\r\n needSceneColorWithDepth: boolean;\r\n /** Whether SSR needs transmission depth before the main light pass. */\r\n needsTransmissionDepthForSSR: boolean;\r\n /** Enable screen-space subsurface scattering. */\r\n sss: boolean;\r\n}\r\n\r\n/**\r\n * Derive pipeline options from the current scene/camera state.\r\n * @internal\r\n */\r\nexport function deriveForwardPlusOptions(\r\n scene: Scene,\r\n camera: Camera,\r\n deviceType: string,\r\n renderQueue: RenderQueue\r\n): ForwardPlusOptions {\r\n const ssr = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const sss = camera.SSS && renderQueueHasActiveSSS(renderQueue);\r\n const needSceneColor = renderQueue.needSceneColor();\r\n const needSceneColorWithDepth = renderQueue.needSceneColorWithDepth();\r\n return {\r\n depthPrepass: true,\r\n motionVectors:\r\n deviceType !== 'webgl' && (camera.TAA || camera.motionBlur || (!!ssr && camera.ssrTemporal)),\r\n hiZ: camera.HiZ && deviceType !== 'webgl',\r\n ssr: !!ssr,\r\n ssrCalcThickness: !!ssr && camera.ssrCalcThickness,\r\n gpuPicking: !!camera.getPickResultResolveFunc(),\r\n needSceneColor,\r\n needSceneColorWithDepth,\r\n needsTransmissionDepthForSSR: !!ssr && needSceneColor && !needSceneColorWithDepth,\r\n sss: !!sss\r\n };\r\n}\r\n\r\n// ─── Shared Frame State ─────────────────────────────────────────────\r\n\r\n/**\r\n * Mutable state shared between pass execute callbacks within a single frame.\r\n *\r\n * This replaces the monolithic DrawContext mutation pattern with an explicit\r\n * object that graph passes can read from and write to.\r\n *\r\n * @internal\r\n */\r\nexport interface FrameState {\r\n ctx: DrawContext;\r\n renderQueue: RenderQueue;\r\n depthFramebuffer: Nullable<FrameBuffer>;\r\n sunLightColor: Nullable<any>;\r\n options: ForwardPlusOptions;\r\n intermediateDeviceStatePushed: boolean;\r\n renderQueueDisposed: boolean;\r\n clusteredLightReleased: boolean;\r\n sunLightRestored: boolean;\r\n}\r\n\r\ninterface ForwardPlusGraphBuildResult {\r\n backbuffer: RGHandle;\r\n frame: FrameState;\r\n}\r\n\r\ninterface HistoryReadBinding {\r\n name: string;\r\n handle: RGHandle;\r\n}\r\n\r\ninterface SSSProfilePassResult {\r\n profileHandle: RGHandle;\r\n paramHandle: RGHandle;\r\n normalHandle?: RGHandle;\r\n framebufferHandle: RGHandle;\r\n}\r\n\r\n// ─── Forward+ Graph Builder ─────────────────────────────────────────\r\n\r\n/**\r\n * Constructs a render graph representing the forward+ pipeline.\r\n *\r\n * Each step in the existing `SceneRenderer._renderScene` becomes a graph pass.\r\n * Execute callbacks delegate to the existing rendering code, sharing a mutable\r\n * `FrameState`.\r\n *\r\n * @param graph - The render graph to populate.\r\n * @param ctx - The draw context for this frame.\r\n * @param renderQueue - The culled render queue.\r\n * @param options - Pipeline feature toggles.\r\n * @returns The backbuffer handle (graph output).\r\n *\r\n * @public\r\n */\r\nexport function buildForwardPlusGraph(\r\n graph: RenderGraph,\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n options: ForwardPlusOptions\r\n): RGHandle {\r\n return buildForwardPlusGraphInternal(graph, ctx, renderQueue, options).backbuffer;\r\n}\r\n\r\nfunction buildForwardPlusGraphInternal(\r\n graph: RenderGraph,\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n options: ForwardPlusOptions\r\n): ForwardPlusGraphBuildResult {\r\n const backbuffer = graph.importTexture('backbuffer');\r\n ctx.SSS = !!options.sss;\r\n\r\n // Shared mutable frame state\r\n const frame: FrameState = {\r\n ctx,\r\n renderQueue,\r\n depthFramebuffer: null,\r\n sunLightColor: null,\r\n options,\r\n intermediateDeviceStatePushed: false,\r\n renderQueueDisposed: false,\r\n clusteredLightReleased: false,\r\n sunLightRestored: false\r\n };\r\n\r\n // ── 1. Sky Update ─────────────────────────────────────────────────\r\n let orderToken = graph.addPass('SkyUpdate', (builder) => {\r\n const done = builder.createToken('SkyUpdateDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n frame.sunLightColor = ctx.scene.env.sky.update(ctx);\r\n });\r\n return done;\r\n });\r\n\r\n // ── 2. Clustered Light Setup ──────────────────────────────────────\r\n orderToken = graph.addPass('ClusterLights', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('ClusterLightsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n ctx.clusteredLight = getClusteredLight();\r\n ctx.clusteredLight.calculateLightIndex(ctx.camera, renderQueue);\r\n });\r\n return done;\r\n });\r\n\r\n // ── 3. GPU Picking (optional, sideEffect) ─────────────────────────\r\n if (options.gpuPicking) {\r\n orderToken = graph.addPass('GPUPicking', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('GPUPickingDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n const pickResolveFunc = ctx.camera.getPickResultResolveFunc();\r\n if (pickResolveFunc) {\r\n renderObjectColors(ctx, pickResolveFunc, renderQueue);\r\n }\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // ── 4. Shadow Maps ────────────────────────────────────────────────\r\n // Shadow maps are managed internally by lights, mark as side effect\r\n if (renderQueue.shadowedLights.length > 0) {\r\n orderToken = graph.addPass('ShadowMaps', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('ShadowMapsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n renderShadowMaps(ctx, renderQueue.shadowedLights);\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // ── 5. Depth Prepass ──────────────────────────────────────────────\r\n // Declare transient depth and motion vector textures\r\n const depthPassResult = graph.addPass('DepthPrepass', (builder) => {\r\n builder.read(orderToken);\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\r\n const depthHandle = builder.createTexture({ format, label: 'linearDepth' });\r\n const motionVectorHandle = options.motionVectors\r\n ? builder.createTexture({ format: mvFormat, label: 'motionVector' })\r\n : undefined;\r\n const finalDepthAttachment = ctx.finalFramebuffer?.getDepthAttachment();\r\n const externalDepthAttachment = finalDepthAttachment?.isTexture2D()\r\n ? (finalDepthAttachment as Texture2D)\r\n : null;\r\n const graphDepthAttachmentHandle = externalDepthAttachment\r\n ? undefined\r\n : builder.createTexture({ format: ctx.depthFormat, label: 'sceneDepth' });\r\n const depthAttachmentOrFormat = externalDepthAttachment ?? graphDepthAttachmentHandle ?? ctx.depthFormat;\r\n const depthFramebufferHandle = builder.createFramebuffer({\r\n label: 'DepthPrepassFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: motionVectorHandle ? [depthHandle, motionVectorHandle] : depthHandle,\r\n depthAttachment: depthAttachmentOrFormat,\r\n ignoreDepthStencil: false\r\n });\r\n const skyMotionVectorFramebufferHandle = motionVectorHandle\r\n ? builder.createFramebuffer({\r\n label: 'SkyMotionVectorFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: motionVectorHandle,\r\n depthAttachment: depthAttachmentOrFormat\r\n })\r\n : undefined;\r\n\r\n builder.addSubpass('SceneDepth', (rgCtx) => {\r\n const depthFramebuffer = rgCtx.getFramebuffer<FrameBuffer>(depthFramebufferHandle);\r\n frame.depthFramebuffer = renderSceneDepth(frame, depthFramebuffer, rgCtx, undefined, undefined, false);\r\n });\r\n if (skyMotionVectorFramebufferHandle) {\r\n builder.addSubpass('SkyMotionVectors', (rgCtx) => {\r\n renderSkyMotionVectors(ctx, rgCtx, skyMotionVectorFramebufferHandle);\r\n });\r\n }\r\n\r\n return {\r\n depthHandle,\r\n motionVectorHandle,\r\n graphDepthAttachmentHandle,\r\n externalDepthAttachment,\r\n depthFramebufferHandle\r\n };\r\n });\r\n\r\n const depthHandle = depthPassResult.depthHandle;\r\n const motionVectorHandle = depthPassResult.motionVectorHandle;\r\n const renderDepthAttachment =\r\n depthPassResult.graphDepthAttachmentHandle ?? depthPassResult.externalDepthAttachment ?? null;\r\n\r\n let preLightTransmissionDepthToken: RGHandle | undefined;\r\n if (options.needsTransmissionDepthForSSR) {\r\n preLightTransmissionDepthToken = graph.addPass('TransmissionDepthForSSR', (builder) => {\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n const done = builder.createToken('TransmissionDepthForSSRDone');\r\n builder.sideEffect();\r\n builder.setExecute((rgCtx) => {\r\n renderTransmissionDepthPass(frame, rgCtx);\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // ── 6. Hi-Z (optional) ───────────────────────────────────────────\r\n let hiZHandle: RGHandle | undefined;\r\n if (options.hiZ) {\r\n graph.addPass('HiZ', (builder) => {\r\n builder.read(depthHandle!);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n hiZHandle = builder.createTexture({\r\n format: 'r32f',\r\n label: 'hiZ',\r\n mipLevels: getFullMipLevelCount(ctx.renderWidth, ctx.renderHeight)\r\n });\r\n const hiZFramebufferHandle = builder.createFramebuffer({\r\n label: 'HiZFramebuffer',\r\n colorAttachments: hiZHandle,\r\n depthAttachment: null\r\n });\r\n builder.setExecute((rgCtx) => {\r\n const ctx = frame.ctx;\r\n // Use the depth texture from the framebuffer (which contains the RenderGraph texture)\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n if (depthTex) {\r\n // Get the HiZ texture allocated by the executor\r\n const hiZTex = rgCtx.getTexture<Texture2D>(hiZHandle!);\r\n const HiZFrameBuffer = rgCtx.getFramebuffer<FrameBuffer>(hiZFramebufferHandle);\r\n buildHiZ(depthTex, HiZFrameBuffer);\r\n ctx.HiZTexture = hiZTex;\r\n }\r\n });\r\n });\r\n }\r\n\r\n // ── 7. Main Light Pass ────────────────────────────────────────────\r\n const historyManager = ctx.camera?.getHistoryResourceManager?.() ?? null;\r\n const lightHistoryReadBindings: HistoryReadBinding[] = [];\r\n const compositeHistoryReadBindings: HistoryReadBinding[] = [];\r\n const historySize = { width: ctx.renderWidth, height: ctx.renderHeight };\r\n if (historyManager && options.ssr && ctx.camera?.ssrTemporal && options.motionVectors) {\r\n const reflectHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSR_REFLECT,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n const motionVectorHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSR_MOTION_VECTOR,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n if (reflectHistoryHandle && motionVectorHistoryHandle) {\r\n lightHistoryReadBindings.push(\r\n { name: RGHistoryResources.SSR_REFLECT, handle: reflectHistoryHandle },\r\n { name: RGHistoryResources.SSR_MOTION_VECTOR, handle: motionVectorHistoryHandle }\r\n );\r\n }\r\n }\r\n if (historyManager && ctx.camera?.TAA && options.motionVectors) {\r\n const colorHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.TAA_COLOR,\r\n {\r\n format: ctx.colorFormat!,\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n const motionVectorHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.TAA_MOTION_VECTOR,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n if (colorHistoryHandle && motionVectorHistoryHandle) {\r\n compositeHistoryReadBindings.push(\r\n { name: RGHistoryResources.TAA_COLOR, handle: colorHistoryHandle },\r\n { name: RGHistoryResources.TAA_MOTION_VECTOR, handle: motionVectorHistoryHandle }\r\n );\r\n }\r\n }\r\n\r\n let sssProfileResult: SSSProfilePassResult | undefined;\r\n if (options.sss) {\r\n sssProfileResult = graph.addPass('SSSProfile', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n const profileHandle = builder.createTexture({ format: 'rgba16f', label: 'sssProfile' });\r\n const paramHandle = builder.createTexture({ format: 'rgba8unorm', label: 'sssParam' });\r\n const normalHandle = options.ssr\r\n ? undefined\r\n : builder.createTexture({ format: getSurfaceTextureFormat(ctx), label: 'sssNormal' });\r\n const colorAttachments = normalHandle\r\n ? [ctx.colorFormat!, normalHandle, profileHandle, paramHandle]\r\n : [ctx.colorFormat!, profileHandle, paramHandle];\r\n const framebufferHandle = builder.createFramebuffer({\r\n label: 'SSSProfileFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments,\r\n depthAttachment: renderDepthAttachment,\r\n ignoreDepthStencil: false\r\n });\r\n\r\n builder.setExecute((rgCtx) => {\r\n renderForwardSSSProfile(\r\n frame,\r\n rgCtx.getFramebuffer<FrameBuffer>(framebufferHandle),\r\n rgCtx.getTexture<Texture2D>(profileHandle),\r\n rgCtx.getTexture<Texture2D>(paramHandle),\r\n normalHandle ? rgCtx.getTexture<Texture2D>(normalHandle) : null\r\n );\r\n });\r\n\r\n return {\r\n profileHandle,\r\n paramHandle,\r\n normalHandle,\r\n framebufferHandle\r\n };\r\n });\r\n }\r\n\r\n const lightPassResult = graph.addPass('LightPass', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n for (const binding of lightHistoryReadBindings) {\r\n builder.read(binding.handle);\r\n }\r\n\r\n // Create scene color texture (intermediate render target)\r\n const sceneColorHandle = builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColor'\r\n });\r\n\r\n // Create optional sceneColorCopy for transmission/refraction materials\r\n let sceneColorCopyHandle: RGHandle | undefined;\r\n if (options.needSceneColor) {\r\n sceneColorCopyHandle = builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColorCopy'\r\n });\r\n }\r\n if (sssProfileResult) {\r\n builder.read(sssProfileResult.profileHandle);\r\n builder.read(sssProfileResult.paramHandle);\r\n if (sssProfileResult.normalHandle) {\r\n builder.read(sssProfileResult.normalHandle);\r\n }\r\n }\r\n const includeSSRSurfaceMRT = !!options.ssr;\r\n const writeSSSDiffuse = options.sss && shouldStoreSSSDiffuse(ctx);\r\n let writeSSSTransmission = options.sss && shouldStoreSSSTransmission(ctx);\r\n if (\r\n writeSSSDiffuse &&\r\n writeSSSTransmission &&\r\n includeSSRSurfaceMRT &&\r\n getSSSLightingTextureFormat(ctx, 2, includeSSRSurfaceMRT) !== ctx.colorFormat\r\n ) {\r\n writeSSSTransmission = false;\r\n }\r\n const sssLightingAttachmentCount = (writeSSSDiffuse ? 1 : 0) + (writeSSSTransmission ? 1 : 0);\r\n const sssLightingFormat = getSSSLightingTextureFormat(\r\n ctx,\r\n sssLightingAttachmentCount,\r\n includeSSRSurfaceMRT\r\n );\r\n const sssDiffuseHandle = writeSSSDiffuse\r\n ? builder.createTexture({ format: sssLightingFormat, label: 'sssDiffuse' })\r\n : undefined;\r\n const sssTransmissionHandle = writeSSSTransmission\r\n ? builder.createTexture({ format: sssLightingFormat, label: 'sssTransmission' })\r\n : undefined;\r\n const useFinalFramebufferAsIntermediate =\r\n !!depthPassResult.externalDepthAttachment &&\r\n depthPassResult.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment();\r\n const sceneColorFramebufferHandle = useFinalFramebufferAsIntermediate\r\n ? undefined\r\n : builder.createFramebuffer({\r\n label: 'SceneColorFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: sceneColorHandle,\r\n depthAttachment: renderDepthAttachment\r\n });\r\n // SSR may pre-insert transmission depth before LightPass for Hi-Z. In that case the\r\n // refraction scene-color copy needs an isolated depth buffer so transmission surfaces\r\n // do not occlude the background color they are about to sample.\r\n const sceneColorCopyFramebufferHandle =\r\n sceneColorCopyHandle && !options.needsTransmissionDepthForSSR\r\n ? builder.createFramebuffer({\r\n label: 'SceneColorCopyFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: sceneColorCopyHandle,\r\n depthAttachment: renderDepthAttachment,\r\n ignoreDepthStencil: false\r\n })\r\n : undefined;\r\n\r\n builder.setExecute((rgCtx) => {\r\n const sceneColorTex = rgCtx.getTexture<Texture2D>(sceneColorHandle);\r\n const sceneColorCopyTex = sceneColorCopyHandle\r\n ? rgCtx.getTexture<Texture2D>(sceneColorCopyHandle)\r\n : null;\r\n if (sssProfileResult) {\r\n ctx.SSSProfileTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.profileHandle);\r\n ctx.SSSParamTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.paramHandle);\r\n if (sssProfileResult.normalHandle) {\r\n ctx.SSRNormalTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.normalHandle);\r\n }\r\n }\r\n ctx.SSSDiffuseTexture = sssDiffuseHandle ? rgCtx.getTexture<Texture2D>(sssDiffuseHandle) : null;\r\n ctx.SSSTransmissionTexture = sssTransmissionHandle\r\n ? rgCtx.getTexture<Texture2D>(sssTransmissionHandle)\r\n : null;\r\n const renderLightPass = () =>\r\n renderMainLightPass(\r\n frame,\r\n sceneColorTex,\r\n sceneColorCopyTex,\r\n rgCtx,\r\n sceneColorFramebufferHandle,\r\n sceneColorCopyFramebufferHandle\r\n );\r\n if (historyManager && lightHistoryReadBindings.length > 0) {\r\n historyManager.beginReadScope(\r\n lightHistoryReadBindings.map((binding) => ({\r\n name: binding.name,\r\n texture: rgCtx.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n renderLightPass();\r\n } finally {\r\n historyManager.endReadScope();\r\n }\r\n } else {\r\n renderLightPass();\r\n }\r\n });\r\n\r\n return { sceneColorHandle, sceneColorCopyHandle, sceneColorFramebufferHandle };\r\n });\r\n\r\n const sceneColorHandle = lightPassResult.sceneColorHandle;\r\n\r\n // 8. Transmission depth pass (optional)\r\n let transmissionDepthToken: RGHandle | undefined;\r\n if (options.needSceneColor && !options.needsTransmissionDepthForSSR) {\r\n transmissionDepthToken = graph.addPass('TransmissionDepth', (builder) => {\r\n builder.read(sceneColorHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n const done = builder.createToken('TransmissionDepthDone');\r\n builder.sideEffect();\r\n builder.setExecute((rgCtx) => {\r\n renderTransmissionDepthPass(frame, rgCtx);\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // 9. Post effects + final composite\r\n const presentedBackbuffer = graph.addPass('Composite', (builder) => {\r\n builder.read(sceneColorHandle);\r\n builder.read(depthHandle);\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n if (motionVectorHandle) {\r\n builder.read(motionVectorHandle);\r\n }\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n builder.read(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n if (transmissionDepthToken) {\r\n builder.read(transmissionDepthToken);\r\n }\r\n for (const binding of compositeHistoryReadBindings) {\r\n builder.read(binding.handle);\r\n }\r\n const outputBackbuffer = builder.write(backbuffer);\r\n builder.setExecute((rgCtx) => {\r\n if (historyManager && compositeHistoryReadBindings.length > 0) {\r\n historyManager.beginReadScope(\r\n compositeHistoryReadBindings.map((binding) => ({\r\n name: binding.name,\r\n texture: rgCtx.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n renderComposite(frame);\r\n } finally {\r\n historyManager.endReadScope();\r\n }\r\n } else {\r\n renderComposite(frame);\r\n }\r\n });\r\n return outputBackbuffer;\r\n });\r\n\r\n return { backbuffer: presentedBackbuffer, frame };\r\n}\r\n\r\n// ─── Pass Implementation Helpers ────────────────────────────────────\r\n// These wrap the existing SceneRenderer static methods, adapted to work\r\n// with the FrameState pattern. They contain the same logic as the\r\n// original methods but read/write through FrameState.\r\n\r\n/** @internal */\r\nfunction renderShadowMaps(ctx: DrawContext, lights: PunctualLight[]): void {\r\n ctx.renderPass = _shadowMapPass;\r\n ctx.device.pushDeviceStates();\r\n try {\r\n for (const light of lights) {\r\n light.shadow.render(ctx, _shadowMapPass);\r\n }\r\n } finally {\r\n ctx.device.popDeviceStates();\r\n }\r\n}\r\n\r\nfunction renderForwardSSSProfile(\r\n frame: FrameState,\r\n profileFramebuffer: FrameBuffer,\r\n profileTexture: Texture2D,\r\n paramTexture: Texture2D,\r\n normalTexture: Nullable<Texture2D>\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n if (!ctx.SSS || !ctx.depthTexture) {\r\n return;\r\n }\r\n const sssRenderQueue = createActualSSSRenderQueue(renderQueue);\r\n if (!sssRenderQueue) {\r\n return;\r\n }\r\n\r\n const device = ctx.device;\r\n const savedMaterialFlags = ctx.materialFlags;\r\n const savedCompositor = ctx.compositor;\r\n const savedTransmission = _scenePass.transmission;\r\n const savedRenderOpaque = _scenePass.renderOpaque;\r\n const savedRenderTransparent = _scenePass.renderTransparent;\r\n const savedClearColor = _scenePass.clearColor;\r\n const savedClearDepth = _scenePass.clearDepth;\r\n const savedClearStencil = _scenePass.clearStencil;\r\n const savedCommandBufferReuse = ctx.camera.commandBufferReuse;\r\n const savedProfileTexture = ctx.SSSProfileTexture;\r\n const savedParamTexture = ctx.SSSParamTexture;\r\n const savedNormalTexture = ctx.SSRNormalTexture;\r\n\r\n let profileFlags = MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n if (normalTexture) {\r\n profileFlags |= MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n }\r\n\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(profileFramebuffer);\r\n ctx.SSSProfileTexture = profileTexture;\r\n ctx.SSSParamTexture = paramTexture;\r\n ctx.SSRNormalTexture = normalTexture;\r\n ctx.compositor = null;\r\n ctx.camera.commandBufferReuse = false;\r\n ctx.materialFlags =\r\n (ctx.materialFlags &\r\n ~(\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION\r\n )) |\r\n profileFlags;\r\n _scenePass.transmission = false;\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderTransparent = false;\r\n _scenePass.clearColor = Vector4.zero();\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n _scenePass.render(ctx, null, null, sssRenderQueue);\r\n } finally {\r\n _scenePass.clearColor = savedClearColor;\r\n _scenePass.clearDepth = savedClearDepth;\r\n _scenePass.clearStencil = savedClearStencil;\r\n _scenePass.renderTransparent = savedRenderTransparent;\r\n _scenePass.renderOpaque = savedRenderOpaque;\r\n _scenePass.transmission = savedTransmission;\r\n ctx.camera.commandBufferReuse = savedCommandBufferReuse;\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.compositor = savedCompositor;\r\n ctx.SSSProfileTexture = savedProfileTexture;\r\n ctx.SSSParamTexture = savedParamTexture;\r\n ctx.SSRNormalTexture = savedNormalTexture;\r\n device.popDeviceStates();\r\n sssRenderQueue.dispose();\r\n }\r\n}\r\n\r\nfunction releaseIntermediateFramebuffer(frame: FrameState): void {\r\n const { ctx } = frame;\r\n if (frame.intermediateDeviceStatePushed) {\r\n ctx.device.popDeviceStates();\r\n frame.intermediateDeviceStatePushed = false;\r\n }\r\n ctx.intermediateFramebuffer = null;\r\n}\r\n\r\nfunction releaseDepthFramebuffer(frame: FrameState): void {\r\n frame.depthFramebuffer = null;\r\n}\r\n\r\nfunction disposeRenderQueue(frame: FrameState): void {\r\n if (!frame.renderQueueDisposed) {\r\n frame.renderQueue.dispose();\r\n frame.renderQueueDisposed = true;\r\n }\r\n}\r\n\r\nfunction releaseClusteredLight(frame: FrameState): void {\r\n if (!frame.clusteredLightReleased && frame.ctx.clusteredLight) {\r\n freeClusteredLight(frame.ctx.clusteredLight);\r\n frame.ctx.clusteredLight = undefined;\r\n frame.clusteredLightReleased = true;\r\n }\r\n}\r\n\r\nfunction restoreSunLight(frame: FrameState): void {\r\n if (!frame.sunLightRestored && frame.sunLightColor && frame.ctx.sunLight) {\r\n frame.ctx.sunLight.color = frame.sunLightColor;\r\n frame.sunLightRestored = true;\r\n }\r\n}\r\n\r\nfunction cleanupFrame(frame: FrameState): void {\r\n releaseIntermediateFramebuffer(frame);\r\n releaseDepthFramebuffer(frame);\r\n releaseClusteredLight(frame);\r\n disposeRenderQueue(frame);\r\n restoreSunLight(frame);\r\n}\r\n\r\n/** @internal */\r\nfunction renderSceneDepth(\r\n frame: FrameState,\r\n existingDepthFb: Nullable<FrameBuffer>,\r\n rgCtx: RGExecuteContext,\r\n depthTex?: Texture2D,\r\n motionVectorTex?: Nullable<Texture2D>,\r\n transmissionOverride?: boolean\r\n): FrameBuffer {\r\n const ctx = frame.ctx;\r\n const renderQueue = frame.renderQueue;\r\n const transmission = transmissionOverride ?? !!existingDepthFb;\r\n let depthFramebuffer = existingDepthFb;\r\n\r\n if (!depthFramebuffer) {\r\n // Use RenderGraph-allocated textures if provided\r\n if (depthTex) {\r\n const colorAttachments = motionVectorTex ? [depthTex, motionVectorTex] : depthTex;\r\n const depthAttachment = ctx.finalFramebuffer?.getDepthAttachment();\r\n const depthTexOrFormat = depthAttachment?.isTexture2D() ? depthAttachment : ctx.depthFormat;\r\n\r\n depthFramebuffer = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: depthTex.width,\r\n height: depthTex.height,\r\n colorAttachments,\r\n depthAttachment: depthTexOrFormat,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n // Allocate through RenderGraph so framebuffer lifetime is owned by the executor.\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 = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: ctx.depthFormat,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n const originDepth = ctx.finalFramebuffer?.getDepthAttachment();\r\n if (originDepth?.isTexture2D()) {\r\n depthFramebuffer = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: originDepth.width,\r\n height: originDepth.height,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: originDepth,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n depthFramebuffer = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: ctx.depthFormat,\r\n ignoreDepthStencil: false\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!transmission) {\r\n frame.depthFramebuffer = depthFramebuffer!;\r\n }\r\n\r\n ctx.device.pushDeviceStates();\r\n try {\r\n ctx.device.setFramebuffer(depthFramebuffer!);\r\n _depthPass.encodeDepth = depthFramebuffer!.getColorAttachments()[0].format === 'rgba8unorm';\r\n _depthPass.clearColor = transmission\r\n ? null\r\n : _depthPass.encodeDepth\r\n ? new Vector4(0, 0, 0, 1)\r\n : new Vector4(1, 1, 1, 1);\r\n _depthPass.clearDepth = transmission ? null : 1;\r\n _depthPass.clearStencil = null;\r\n _depthPass.transmission = transmission;\r\n\r\n if (ctx.SSRCalcThickness && !transmission) {\r\n if (!_backDepthColorState) {\r\n _backDepthColorState = ctx.device.createColorState().setColorMask(false, true, false, false);\r\n }\r\n if (!_frontDepthColorState) {\r\n _frontDepthColorState = ctx.device.createColorState().setColorMask(true, false, false, false);\r\n }\r\n ctx.forceColorState = _backDepthColorState;\r\n ctx.forceCullMode = 'front';\r\n _depthPass.renderBackface = true;\r\n _depthPass.transmission = false;\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n _depthPass.clearColor = null;\r\n _depthPass.renderBackface = false;\r\n ctx.forceColorState = _frontDepthColorState;\r\n ctx.forceCullMode = null;\r\n }\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n ctx.forceColorState = null;\r\n ctx.forceCullMode = null;\r\n _depthPass.renderBackface = false;\r\n ctx.device.popDeviceStates();\r\n }\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 ctx.depthPrepassAttachment = ctx.depthTexture;\r\n // HiZ is now built in the dedicated HiZ pass\r\n }\r\n return depthFramebuffer!;\r\n}\r\n\r\n// ─── Sky Motion Vector State ────────────────────────────────────────\r\n\r\nlet _skyMVProgram: Nullable<GPUProgram> = null;\r\nlet _skyMVBindGroup: Nullable<BindGroup> = null;\r\nlet _skyMVBox: Nullable<Primitive> = null;\r\n\r\n/** @internal */\r\nfunction renderSkyMotionVectors(\r\n ctx: DrawContext,\r\n rgCtx: RGExecuteContext,\r\n framebufferHandle?: RGHandle\r\n): void {\r\n if (!ctx.motionVectorTexture) {\r\n return;\r\n }\r\n\r\n const device = ctx.device;\r\n const fb = framebufferHandle\r\n ? rgCtx.getFramebuffer<FrameBuffer>(framebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\r\n colorAttachments: ctx.motionVectorTexture,\r\n depthAttachment: ctx.depthTexture\r\n });\r\n\r\n if (!_skyMVProgram) {\r\n _skyMVProgram = 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 _skyMVProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n\r\n if (!_skyMVBindGroup) {\r\n _skyMVBindGroup = device.createBindGroup(_skyMVProgram.bindGroupLayouts[0]);\r\n }\r\n\r\n if (!_skyMVBox) {\r\n _skyMVBox = new BoxShape({ size: 2, needNormal: false, needUV: false });\r\n }\r\n\r\n _skyMVBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n _skyMVBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n _skyMVBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n _skyMVBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n\r\n device.pushDeviceStates();\r\n device.setProgram(_skyMVProgram);\r\n device.setBindGroup(0, _skyMVBindGroup);\r\n device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, 'le'));\r\n device.setFramebuffer(fb);\r\n _skyMVBox.draw();\r\n device.popDeviceStates();\r\n}\r\n\r\nfunction blitToCurrentColorAttachment(ctx: DrawContext, source: Texture2D): void {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n const destination = framebuffer?.getColorAttachment<Texture2D>(0) ?? null;\r\n new CopyBlitter().blit(source, destination, fetchSampler('clamp_nearest_nomip'));\r\n}\r\n\r\n/** @internal */\r\nfunction renderMainLightPass(\r\n frame: FrameState,\r\n sceneColorTex: Texture2D,\r\n sceneColorCopyTex: Nullable<Texture2D>,\r\n rgCtx: RGExecuteContext,\r\n sceneColorFramebufferHandle?: RGHandle,\r\n sceneColorCopyFramebufferHandle?: RGHandle\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n const device = ctx.device;\r\n\r\n // Use RenderGraph-allocated scene color texture\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n\r\n ctx.materialFlags &= ~(\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION\r\n );\r\n\r\n if (ctx.SSR) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n }\r\n if (ctx.SSS) {\r\n if (ctx.SSSDiffuseTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n }\r\n if (ctx.SSSTransmissionTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n }\r\n }\r\n\r\n if (depthTex === ctx.finalFramebuffer?.getDepthAttachment()) {\r\n ctx.intermediateFramebuffer = ctx.finalFramebuffer;\r\n } else if (sceneColorFramebufferHandle && !hasSurfaceMRT(ctx)) {\r\n ctx.intermediateFramebuffer = rgCtx.getFramebuffer<FrameBuffer>(sceneColorFramebufferHandle);\r\n } else {\r\n ctx.intermediateFramebuffer = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: sceneColorTex.width,\r\n height: sceneColorTex.height,\r\n colorAttachments: getLightPassColorAttachments(ctx, sceneColorTex),\r\n depthAttachment: depthTex\r\n });\r\n }\r\n\r\n if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {\r\n device.pushDeviceStates();\r\n frame.intermediateDeviceStatePushed = true;\r\n device.setFramebuffer(ctx.intermediateFramebuffer);\r\n } else {\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n\r\n _scenePass.transmission = false;\r\n _scenePass.clearDepth = depthTex ? null : 1;\r\n _scenePass.clearStencil = depthTex ? null : 0;\r\n\r\n ctx.compositor?.begin(ctx);\r\n\r\n if (renderQueue.needSceneColor() && sceneColorCopyTex) {\r\n const compositor = ctx.compositor;\r\n ctx.compositor = null;\r\n const isolateSceneColorDepth = frame.options.needsTransmissionDepthForSSR;\r\n const savedDepthPrepassAttachment = ctx.depthPrepassAttachment;\r\n const savedClearDepth = _scenePass.clearDepth;\r\n const savedClearStencil = _scenePass.clearStencil;\r\n const savedMaterialFlags = ctx.materialFlags;\r\n\r\n // Use RenderGraph-allocated sceneColorCopy texture\r\n const sceneColorMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const sceneColorFramebuffer = sceneColorCopyFramebufferHandle\r\n ? rgCtx.getFramebuffer<FrameBuffer>(sceneColorCopyFramebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\r\n width: sceneColorCopyTex.width,\r\n height: sceneColorCopyTex.height,\r\n colorAttachments: sceneColorCopyTex,\r\n depthAttachment: isolateSceneColorDepth ? ctx.depthFormat : depthTex,\r\n ignoreDepthStencil: false\r\n });\r\n let sceneColorStatePushed = false;\r\n try {\r\n device.pushDeviceStates();\r\n sceneColorStatePushed = true;\r\n device.setFramebuffer(sceneColorFramebuffer);\r\n _scenePass.transmission = false;\r\n if (isolateSceneColorDepth) {\r\n ctx.depthPrepassAttachment = undefined;\r\n _scenePass.clearDepth = 1;\r\n _scenePass.clearStencil = 0;\r\n }\r\n ctx.materialFlags = sceneColorMaterialFlags;\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n if (isolateSceneColorDepth) {\r\n ctx.depthPrepassAttachment = savedDepthPrepassAttachment;\r\n _scenePass.clearDepth = savedClearDepth;\r\n _scenePass.clearStencil = savedClearStencil;\r\n }\r\n if (sceneColorStatePushed) {\r\n device.popDeviceStates();\r\n }\r\n ctx.compositor = compositor;\r\n }\r\n ctx.sceneColorTexture = sceneColorCopyTex;\r\n blitToCurrentColorAttachment(ctx, ctx.sceneColorTexture);\r\n _scenePass.transmission = true;\r\n _scenePass.clearColor = null;\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n }\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n}\r\n\r\n/** @internal */\r\nfunction renderTransmissionDepthPass(frame: FrameState, rgCtx: RGExecuteContext): void {\r\n renderSceneDepth(frame, frame.depthFramebuffer, rgCtx);\r\n}\r\n\r\n/** @internal */\r\nfunction renderComposite(frame: FrameState): void {\r\n const { ctx } = frame;\r\n\r\n ctx.compositor?.drawPostEffects(ctx, PostEffectLayer.end, ctx.linearDepthTexture!);\r\n ctx.compositor?.end(ctx);\r\n disposeRenderQueue(frame);\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\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 }\r\n\r\n releaseIntermediateFramebuffer(frame);\r\n releaseDepthFramebuffer(frame);\r\n releaseClusteredLight(frame);\r\n restoreSunLight(frame);\r\n}\r\n\r\n// ─── Convenience: Execute Full Pipeline ─────────────────────────────\r\n\r\n/**\r\n * Build, compile, and execute the forward+ pipeline as a render graph.\r\n *\r\n * This is the drop-in replacement for `SceneRenderer._renderScene`.\r\n *\r\n * @param ctx - The draw context for this frame.\r\n * @public\r\n */\r\nexport function executeForwardPlusGraph(ctx: DrawContext): void {\r\n const device = ctx.device;\r\n const graph = new RenderGraph();\r\n let renderQueue: RenderQueue | null = null;\r\n let frame: FrameState | null = null;\r\n let executor: RenderGraphExecutor<Texture2D, FrameBuffer> | null = null;\r\n let historyManager: HistoryResourceManager<Texture2D> | null = null;\r\n let historyFrameStarted = false;\r\n\r\n try {\r\n // Cull scene first (needed to derive options)\r\n renderQueue = _scenePass.cullScene(ctx, ctx.camera);\r\n\r\n const options = deriveForwardPlusOptions(ctx.scene, ctx.camera, device.type, renderQueue);\r\n ctx.SSS = options.sss;\r\n\r\n // Ensure the camera has a history resource manager for temporal effects (TAA, motion blur)\r\n historyManager = ctx.camera.getHistoryResourceManager();\r\n if (!historyManager) {\r\n historyManager = new HistoryResourceManager<Texture2D>(_devicePoolAllocator);\r\n ctx.camera.setHistoryResourceManager(historyManager);\r\n }\r\n historyManager.beginFrame();\r\n historyFrameStarted = true;\r\n\r\n const buildResult = buildForwardPlusGraphInternal(graph, ctx, renderQueue, options);\r\n frame = buildResult.frame;\r\n\r\n const compiled = graph.compile([buildResult.backbuffer]);\r\n\r\n // Use RenderGraphExecutor for automatic resource management\r\n executor = new RenderGraphExecutor(_devicePoolAllocator, ctx.renderWidth, ctx.renderHeight);\r\n\r\n // Register imported backbuffer (if using finalFramebuffer)\r\n if (ctx.finalFramebuffer) {\r\n const backbufferTex = ctx.finalFramebuffer.getColorAttachments()[0] as Texture2D;\r\n executor.setImportedTexture(buildResult.backbuffer, backbufferTex);\r\n }\r\n historyManager.bindImportedTextures(executor);\r\n\r\n executor.execute(compiled);\r\n historyManager.commitFrame();\r\n } finally {\r\n if (historyFrameStarted) {\r\n historyManager?.discardFrame();\r\n }\r\n if (frame) {\r\n cleanupFrame(frame);\r\n } else {\r\n renderQueue?.dispose();\r\n }\r\n executor?.reset();\r\n }\r\n}\r\n"],"names":["_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_clusters","_devicePoolAllocator","DevicePoolAllocator","_backDepthColorState","_frontDepthColorState","SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_STORE_NORMAL","SSS_STORE_TRANSMISSION","getClusteredLight","length","pop","ClusteredLight","freeClusteredLight","cl","push","getCoreMaterial","material","coreMaterial","hasSSSMaterialCore","subsurfaceProfile","renderQueueHasActiveSSS","renderQueue","itemList","lists","opaque","lit","unlit","list","materialList","filterActualSSSItemList","items","filter","item","drawable","getMaterial","filterActualSSSMaterialList","filtered","Set","forEach","mat","add","cloneActualSSSListInfo","source","_targetQueue","skinItemList","morphItemList","skinAndMorphItemList","instanceItemList","instanceList","cloneActualSSSBundle","targetQueue","map","info","hasAnyActualSSSItems","renderItems","some","createActualSSSRenderQueue","queue","RenderQueue","sssOpaque","dispose","emptyBundle","target","_itemList","transmission","transparent","transmission_trans","_shadowedLightList","shadowedLights","_unshadowedLightList","unshadowedLights","_sunLight","sunLight","_primaryDirectionalLight","primaryDirectionalLight","_primaryTransmissionLight","primaryTransmissionLight","_needSceneColor","_needSceneDepth","_needSceneColorWithDepth","_drawTransparent","getSurfaceTextureFormat","ctx","caps","device","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","getTextureFormatBytes","format","getTextureFormatInfo","size","shouldStoreSSSDiffuse","camera","sssStrength","sssBlurScale","shouldStoreSSSTransmission","sssTransmissionStrength","getSSSLightingTextureFormat","attachmentCount","includeSSRSurfaceMRT","colorFormat","roughnessFormat","SSRRoughnessTexture","normalFormat","SSRNormalTexture","colorBytes","fullPrecisionBytes","framebufferCaps","maxColorAttachmentBytesPerSample","getFullMipLevelCount","width","height","Math","max","floor","log2","hasSurfaceMRT","materialFlags","getLightPassColorAttachments","colorAttachment","attachments","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","deriveForwardPlusOptions","scene","deviceType","ssr","SSR","env","light","envLight","hasRadiance","sss","SSS","needSceneColor","needSceneColorWithDepth","depthPrepass","motionVectors","TAA","motionBlur","ssrTemporal","hiZ","HiZ","ssrCalcThickness","gpuPicking","getPickResultResolveFunc","needsTransmissionDepthForSSR","buildForwardPlusGraph","graph","options","buildForwardPlusGraphInternal","backbuffer","importTexture","frame","depthFramebuffer","sunLightColor","intermediateDeviceStatePushed","renderQueueDisposed","clusteredLightReleased","sunLightRestored","orderToken","addPass","builder","done","createToken","sideEffect","setExecute","sky","update","read","clusteredLight","calculateLightIndex","pickResolveFunc","renderObjectColors","renderShadowMaps","depthPassResult","type","SSRCalcThickness","mvFormat","depthHandle","createTexture","label","motionVectorHandle","undefined","finalDepthAttachment","finalFramebuffer","getDepthAttachment","externalDepthAttachment","isTexture2D","graphDepthAttachmentHandle","depthFormat","depthAttachmentOrFormat","depthFramebufferHandle","createFramebuffer","renderWidth","renderHeight","colorAttachments","depthAttachment","ignoreDepthStencil","skyMotionVectorFramebufferHandle","addSubpass","rgCtx","getFramebuffer","renderSceneDepth","renderSkyMotionVectors","renderDepthAttachment","preLightTransmissionDepthToken","renderTransmissionDepthPass","hiZHandle","mipLevels","hiZFramebufferHandle","depthTex","hiZTex","getTexture","HiZFrameBuffer","buildHiZ","HiZTexture","historyManager","getHistoryResourceManager","lightHistoryReadBindings","compositeHistoryReadBindings","historySize","reflectHistoryHandle","importPreviousIfCompatible","RGHistoryResources","SSR_REFLECT","sizeMode","motionVectorHistoryHandle","SSR_MOTION_VECTOR","name","handle","colorHistoryHandle","TAA_COLOR","TAA_MOTION_VECTOR","sssProfileResult","profileHandle","paramHandle","normalHandle","framebufferHandle","renderForwardSSSProfile","lightPassResult","binding","sceneColorHandle","sceneColorCopyHandle","writeSSSDiffuse","writeSSSTransmission","sssLightingAttachmentCount","sssLightingFormat","sssDiffuseHandle","sssTransmissionHandle","useFinalFramebufferAsIntermediate","sceneColorFramebufferHandle","sceneColorCopyFramebufferHandle","sceneColorTex","sceneColorCopyTex","renderLightPass","renderMainLightPass","beginReadScope","texture","endReadScope","transmissionDepthToken","presentedBackbuffer","outputBackbuffer","write","renderComposite","lights","renderPass","pushDeviceStates","shadow","render","popDeviceStates","profileFramebuffer","profileTexture","paramTexture","normalTexture","depthTexture","sssRenderQueue","savedMaterialFlags","savedCompositor","compositor","savedTransmission","savedRenderOpaque","renderOpaque","savedRenderTransparent","renderTransparent","savedClearColor","clearColor","savedClearDepth","clearDepth","savedClearStencil","clearStencil","savedCommandBufferReuse","commandBufferReuse","savedProfileTexture","savedParamTexture","savedNormalTexture","profileFlags","setFramebuffer","Vector4","zero","releaseIntermediateFramebuffer","intermediateFramebuffer","releaseDepthFramebuffer","disposeRenderQueue","releaseClusteredLight","restoreSunLight","color","cleanupFrame","existingDepthFb","motionVectorTex","transmissionOverride","originDepth","encodeDepth","getColorAttachments","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","motionVectorTexture","linearDepthTexture","depthPrepassAttachment","_skyMVProgram","_skyMVBindGroup","_skyMVBox","fb","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","w","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","createBindGroup","bindGroupLayouts","BoxShape","needNormal","needUV","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","draw","blitToCurrentColorAttachment","framebuffer","destination","getColorAttachment","CopyBlitter","blit","fetchSampler","setViewport","setScissor","begin","isolateSceneColorDepth","savedDepthPrepassAttachment","sceneColorMaterialFlags","sceneColorFramebuffer","sceneColorStatePushed","sceneColorTexture","drawPostEffects","PostEffectLayer","end","blitter","srgbOut","srcTex","executeForwardPlusGraph","RenderGraph","executor","historyFrameStarted","cullScene","HistoryResourceManager","setHistoryResourceManager","beginFrame","buildResult","compiled","compile","RenderGraphExecutor","backbufferTex","setImportedTexture","bindImportedTextures","execute","commitFrame","discardFrame","reset"],"mappings":"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"}
1
+ {"version":3,"file":"forward_plus_builder.js","sources":["../../../src/render/rendergraph/forward_plus_builder.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { 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 type { DrawContext } from '../drawable';\r\nimport {\r\n RenderQueue,\r\n type RenderItemList,\r\n type RenderItemListInfo,\r\n type RenderQueueItem\r\n} from '../render_queue';\r\nimport type { PunctualLight, Scene } from '../../scene';\r\nimport type { Camera } from '../../camera';\r\nimport { LightPass } from '../lightpass';\r\nimport { ShadowMapPass } from '../shadowmap_pass';\r\nimport { DepthPass } from '../depthpass';\r\nimport { ClusteredLight } from '../cluster_light';\r\nimport { buildHiZ } from '../hzb';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { MaterialVaryingFlags } from '../../values';\r\nimport { AbstractPostEffect, PostEffectLayer } from '../../posteffect/posteffect';\r\nimport { RenderGraph } from './rendergraph';\r\nimport { RenderGraphExecutor } from './executor';\r\nimport { DevicePoolAllocator } from './device_pool_allocator';\r\nimport { HistoryResourceManager } from './history_resource_manager';\r\nimport { RGHistoryResources } from './history_resources';\r\nimport type { RGExecuteContext, RGHandle } from './types';\r\nimport { renderObjectColors } from '../gpu_picking';\r\nimport type { Primitive } from '../primitive';\r\nimport { BoxShape } from '../../shapes';\r\n\r\n// ─── Shared Pass Instances ──────────────────────────────────────────\r\n\r\nconst _scenePass = new LightPass();\r\nconst _depthPass = new DepthPass();\r\nconst _shadowMapPass = new ShadowMapPass();\r\nconst _clusters: ClusteredLight[] = [];\r\nconst _devicePoolAllocator = new DevicePoolAllocator();\r\nlet _backDepthColorState: Nullable<ColorState> = null;\r\nlet _frontDepthColorState: Nullable<ColorState> = null;\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\n\r\nfunction getClusteredLight(): ClusteredLight {\r\n return _clusters.length > 0 ? _clusters.pop()! : new ClusteredLight();\r\n}\r\nfunction freeClusteredLight(cl: ClusteredLight): void {\r\n _clusters.push(cl);\r\n}\r\n\r\nfunction getCoreMaterial(material: unknown): unknown {\r\n return (material as { coreMaterial?: unknown } | null | undefined)?.coreMaterial ?? material ?? null;\r\n}\r\n\r\nfunction hasSSSMaterialCore(material: unknown): boolean {\r\n return !!(getCoreMaterial(material) as { subsurfaceProfile?: unknown } | null)?.subsurfaceProfile;\r\n}\r\n\r\nfunction hasSkinSSSMaterialCore(material: unknown): boolean {\r\n return !!(getCoreMaterial(material) as { skinSSS?: unknown } | null)?.skinSSS;\r\n}\r\n\r\nfunction renderQueueHasActiveSSS(renderQueue: RenderQueue): boolean {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return false;\r\n }\r\n const lists = [...itemList.opaque.lit, ...itemList.opaque.unlit];\r\n for (const list of lists) {\r\n for (const material of list.materialList) {\r\n if (hasSSSMaterialCore(material)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction renderQueueHasActiveSkinSSS(renderQueue: RenderQueue): boolean {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return false;\r\n }\r\n const lists = [...itemList.opaque.lit, ...itemList.opaque.unlit];\r\n for (const list of lists) {\r\n for (const material of list.materialList) {\r\n if (hasSkinSSSMaterialCore(material)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction filterActualSSSItemList(items: RenderQueueItem[]): RenderQueueItem[] {\r\n return items.filter((item) => hasSSSMaterialCore(item.drawable.getMaterial?.()));\r\n}\r\n\r\nfunction filterActualSSSMaterialList(materialList: Set<any>): Set<any> {\r\n const filtered = new Set<any>();\r\n materialList.forEach((mat) => {\r\n if (hasSSSMaterialCore(mat)) {\r\n filtered.add(mat);\r\n }\r\n });\r\n return filtered;\r\n}\r\n\r\nfunction cloneActualSSSListInfo(source: RenderItemListInfo, _targetQueue: RenderQueue): RenderItemListInfo {\r\n return {\r\n itemList: filterActualSSSItemList(source.itemList),\r\n skinItemList: filterActualSSSItemList(source.skinItemList),\r\n morphItemList: filterActualSSSItemList(source.morphItemList),\r\n skinAndMorphItemList: filterActualSSSItemList(source.skinAndMorphItemList),\r\n instanceItemList: filterActualSSSItemList(source.instanceItemList),\r\n materialList: filterActualSSSMaterialList(source.materialList),\r\n instanceList: {},\r\n renderQueue: source.renderQueue\r\n };\r\n}\r\n\r\nfunction cloneActualSSSBundle(\r\n source: RenderItemList['opaque'],\r\n targetQueue: RenderQueue\r\n): RenderItemList['opaque'] {\r\n return {\r\n lit: source.lit.map((info) => cloneActualSSSListInfo(info, targetQueue)),\r\n unlit: source.unlit.map((info) => cloneActualSSSListInfo(info, targetQueue))\r\n };\r\n}\r\n\r\nfunction hasAnyActualSSSItems(renderItems: RenderItemListInfo[]): boolean {\r\n return renderItems.some(\r\n (info) =>\r\n info.itemList.length > 0 ||\r\n info.skinItemList.length > 0 ||\r\n info.morphItemList.length > 0 ||\r\n info.skinAndMorphItemList.length > 0 ||\r\n info.instanceItemList.length > 0\r\n );\r\n}\r\n\r\nfunction createActualSSSRenderQueue(renderQueue: RenderQueue): RenderQueue | null {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return null;\r\n }\r\n const queue = new RenderQueue(_scenePass);\r\n const sssOpaque = cloneActualSSSBundle(itemList.opaque, queue);\r\n if (!hasAnyActualSSSItems([...sssOpaque.lit, ...sssOpaque.unlit])) {\r\n queue.dispose();\r\n return null;\r\n }\r\n const emptyBundle = { lit: [], unlit: [] };\r\n const target = queue as unknown as {\r\n _itemList: RenderItemList;\r\n _shadowedLightList: PunctualLight[];\r\n _unshadowedLightList: PunctualLight[];\r\n _sunLight: typeof renderQueue.sunLight;\r\n _primaryDirectionalLight: typeof renderQueue.primaryDirectionalLight;\r\n _primaryTransmissionLight: typeof renderQueue.primaryTransmissionLight;\r\n _needSceneColor: boolean;\r\n _needSceneDepth: boolean;\r\n _needSceneColorWithDepth: boolean;\r\n _drawTransparent: boolean;\r\n };\r\n target._itemList = {\r\n opaque: sssOpaque,\r\n transmission: emptyBundle,\r\n transparent: emptyBundle,\r\n transmission_trans: emptyBundle\r\n };\r\n target._shadowedLightList = renderQueue.shadowedLights;\r\n target._unshadowedLightList = renderQueue.unshadowedLights;\r\n target._sunLight = renderQueue.sunLight;\r\n target._primaryDirectionalLight = renderQueue.primaryDirectionalLight;\r\n target._primaryTransmissionLight = renderQueue.primaryTransmissionLight;\r\n target._needSceneColor = false;\r\n target._needSceneDepth = false;\r\n target._needSceneColorWithDepth = false;\r\n target._drawTransparent = false;\r\n return queue;\r\n}\r\n\r\nfunction getSurfaceTextureFormat(ctx: DrawContext): TextureFormat {\r\n const caps = ctx.device.getDeviceCaps?.();\r\n return caps?.textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n}\r\n\r\nfunction getTextureFormatBytes(ctx: DrawContext, format: TextureFormat): number {\r\n return ctx.device.getDeviceCaps().textureCaps.getTextureFormatInfo(format).size;\r\n}\r\n\r\nfunction shouldStoreSSSDiffuse(ctx: DrawContext): boolean {\r\n return ctx.camera.sssStrength > 0 && ctx.camera.sssBlurScale > 0;\r\n}\r\n\r\nfunction shouldStoreSSSTransmission(ctx: DrawContext): boolean {\r\n return ctx.camera.sssStrength > 0 && ctx.camera.sssTransmissionStrength > 0;\r\n}\r\n\r\nfunction getSSSLightingTextureFormat(\r\n ctx: DrawContext,\r\n attachmentCount: number,\r\n includeSSRSurfaceMRT: boolean\r\n): TextureFormat {\r\n const colorFormat = ctx.colorFormat!;\r\n if (!includeSSRSurfaceMRT || attachmentCount === 0) {\r\n return colorFormat;\r\n }\r\n const caps = ctx.device.getDeviceCaps();\r\n const roughnessFormat = ctx.SSRRoughnessTexture?.format ?? colorFormat;\r\n const normalFormat = ctx.SSRNormalTexture?.format ?? colorFormat;\r\n const colorBytes =\r\n getTextureFormatBytes(ctx, colorFormat) +\r\n getTextureFormatBytes(ctx, roughnessFormat) +\r\n getTextureFormatBytes(ctx, normalFormat);\r\n const fullPrecisionBytes = colorBytes + getTextureFormatBytes(ctx, colorFormat) * attachmentCount;\r\n if (fullPrecisionBytes <= caps.framebufferCaps.maxColorAttachmentBytesPerSample) {\r\n return colorFormat;\r\n }\r\n return 'rgba8unorm';\r\n}\r\n\r\nfunction getFullMipLevelCount(width: number, height: number): number {\r\n return Math.max(1, Math.floor(Math.log2(Math.max(1, width, height))) + 1);\r\n}\r\n\r\nfunction hasSurfaceMRT(ctx: DrawContext): boolean {\r\n return !!(ctx.materialFlags & SURFACE_MRT_FLAGS);\r\n}\r\n\r\nfunction getLightPassColorAttachments(\r\n ctx: DrawContext,\r\n colorAttachment: TextureFormat | Texture2D\r\n): TextureFormat | Texture2D | Array<TextureFormat | Texture2D> {\r\n const attachments: Array<TextureFormat | Texture2D> = [colorAttachment];\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {\r\n attachments.push(ctx.SSRRoughnessTexture!, ctx.SSRNormalTexture!);\r\n } else if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_NORMAL) {\r\n attachments.push(ctx.SSRNormalTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_PROFILE) {\r\n attachments.push(ctx.SSSProfileTexture!, ctx.SSSParamTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\r\n attachments.push(ctx.SkinSSSTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n}\r\n\r\n// ─── Pipeline Options ───────────────────────────────────────────────\r\n\r\n/**\r\n * Options controlling which features are enabled in the forward+ pipeline.\r\n *\r\n * Derived from camera settings and device capabilities each frame.\r\n *\r\n * @public\r\n */\r\nexport interface ForwardPlusOptions {\r\n /** Enable depth prepass (always true for now). */\r\n depthPrepass: boolean;\r\n /** Enable motion vectors (requires TAA or motionBlur). */\r\n motionVectors: boolean;\r\n /** Enable Hi-Z pyramid (for SSR ray tracing). */\r\n hiZ: boolean;\r\n /** Enable screen-space reflections. */\r\n ssr: boolean;\r\n /** Whether to compute SSR thickness. */\r\n ssrCalcThickness: boolean;\r\n /** Whether GPU picking is requested this frame. */\r\n gpuPicking: boolean;\r\n /** Whether transmission/refraction materials are present. */\r\n needSceneColor: boolean;\r\n /** Whether scene-color-dependent materials also require scene depth. */\r\n needSceneColorWithDepth: boolean;\r\n /** Whether SSR needs transmission depth before the main light pass. */\r\n needsTransmissionDepthForSSR: boolean;\r\n /** Enable screen-space subsurface scattering. */\r\n sss: boolean;\r\n /** Enable the stylized skin-specific SSS pass. */\r\n skinSSS: boolean;\r\n}\r\n\r\n/**\r\n * Derive pipeline options from the current scene/camera state.\r\n * @internal\r\n */\r\nexport function deriveForwardPlusOptions(\r\n scene: Scene,\r\n camera: Camera,\r\n deviceType: string,\r\n renderQueue: RenderQueue\r\n): ForwardPlusOptions {\r\n const ssr = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const sss = camera.SSS && renderQueueHasActiveSSS(renderQueue);\r\n const skinSSS = camera.skinSSS && renderQueueHasActiveSkinSSS(renderQueue);\r\n const needSceneColor = renderQueue.needSceneColor();\r\n const needSceneColorWithDepth = renderQueue.needSceneColorWithDepth();\r\n return {\r\n depthPrepass: true,\r\n motionVectors:\r\n deviceType !== 'webgl' && (camera.TAA || camera.motionBlur || (!!ssr && camera.ssrTemporal)),\r\n hiZ: camera.HiZ && deviceType !== 'webgl',\r\n ssr: !!ssr,\r\n ssrCalcThickness: !!ssr && camera.ssrCalcThickness,\r\n gpuPicking: !!camera.getPickResultResolveFunc(),\r\n needSceneColor,\r\n needSceneColorWithDepth,\r\n needsTransmissionDepthForSSR: !!ssr && needSceneColor && !needSceneColorWithDepth,\r\n sss: !!sss,\r\n skinSSS: !!skinSSS\r\n };\r\n}\r\n\r\n// ─── Shared Frame State ─────────────────────────────────────────────\r\n\r\n/**\r\n * Mutable state shared between pass execute callbacks within a single frame.\r\n *\r\n * This replaces the monolithic DrawContext mutation pattern with an explicit\r\n * object that graph passes can read from and write to.\r\n *\r\n * @internal\r\n */\r\nexport interface FrameState {\r\n ctx: DrawContext;\r\n renderQueue: RenderQueue;\r\n depthFramebuffer: Nullable<FrameBuffer>;\r\n sunLightColor: Nullable<any>;\r\n options: ForwardPlusOptions;\r\n intermediateDeviceStatePushed: boolean;\r\n renderQueueDisposed: boolean;\r\n clusteredLightReleased: boolean;\r\n sunLightRestored: boolean;\r\n}\r\n\r\ninterface ForwardPlusGraphBuildResult {\r\n backbuffer: RGHandle;\r\n frame: FrameState;\r\n}\r\n\r\ninterface HistoryReadBinding {\r\n name: string;\r\n handle: RGHandle;\r\n}\r\n\r\ninterface SSSProfilePassResult {\r\n profileHandle: RGHandle;\r\n paramHandle: RGHandle;\r\n normalHandle?: RGHandle;\r\n framebufferHandle: RGHandle;\r\n}\r\n\r\n// ─── Forward+ Graph Builder ─────────────────────────────────────────\r\n\r\n/**\r\n * Constructs a render graph representing the forward+ pipeline.\r\n *\r\n * Each step in the existing `SceneRenderer._renderScene` becomes a graph pass.\r\n * Execute callbacks delegate to the existing rendering code, sharing a mutable\r\n * `FrameState`.\r\n *\r\n * @param graph - The render graph to populate.\r\n * @param ctx - The draw context for this frame.\r\n * @param renderQueue - The culled render queue.\r\n * @param options - Pipeline feature toggles.\r\n * @returns The backbuffer handle (graph output).\r\n *\r\n * @public\r\n */\r\nexport function buildForwardPlusGraph(\r\n graph: RenderGraph,\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n options: ForwardPlusOptions\r\n): RGHandle {\r\n return buildForwardPlusGraphInternal(graph, ctx, renderQueue, options).backbuffer;\r\n}\r\n\r\nfunction buildForwardPlusGraphInternal(\r\n graph: RenderGraph,\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n options: ForwardPlusOptions\r\n): ForwardPlusGraphBuildResult {\r\n const backbuffer = graph.importTexture('backbuffer');\r\n ctx.SSS = !!options.sss;\r\n ctx.SkinSSSTexture = null;\r\n\r\n // Shared mutable frame state\r\n const frame: FrameState = {\r\n ctx,\r\n renderQueue,\r\n depthFramebuffer: null,\r\n sunLightColor: null,\r\n options,\r\n intermediateDeviceStatePushed: false,\r\n renderQueueDisposed: false,\r\n clusteredLightReleased: false,\r\n sunLightRestored: false\r\n };\r\n\r\n // ── 1. Sky Update ─────────────────────────────────────────────────\r\n let orderToken = graph.addPass('SkyUpdate', (builder) => {\r\n const done = builder.createToken('SkyUpdateDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n frame.sunLightColor = ctx.scene.env.sky.update(ctx);\r\n });\r\n return done;\r\n });\r\n\r\n // ── 2. Clustered Light Setup ──────────────────────────────────────\r\n orderToken = graph.addPass('ClusterLights', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('ClusterLightsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n ctx.clusteredLight = getClusteredLight();\r\n ctx.clusteredLight.calculateLightIndex(ctx.camera, renderQueue);\r\n });\r\n return done;\r\n });\r\n\r\n // ── 3. GPU Picking (optional, sideEffect) ─────────────────────────\r\n if (options.gpuPicking) {\r\n orderToken = graph.addPass('GPUPicking', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('GPUPickingDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n const pickResolveFunc = ctx.camera.getPickResultResolveFunc();\r\n if (pickResolveFunc) {\r\n renderObjectColors(ctx, pickResolveFunc, renderQueue);\r\n }\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // ── 4. Shadow Maps ────────────────────────────────────────────────\r\n // Shadow maps are managed internally by lights, mark as side effect\r\n if (renderQueue.shadowedLights.length > 0) {\r\n orderToken = graph.addPass('ShadowMaps', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('ShadowMapsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n renderShadowMaps(ctx, renderQueue.shadowedLights);\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // ── 5. Depth Prepass ──────────────────────────────────────────────\r\n // Declare transient depth and motion vector textures\r\n const depthPassResult = graph.addPass('DepthPrepass', (builder) => {\r\n builder.read(orderToken);\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\r\n const depthHandle = builder.createTexture({ format, label: 'linearDepth' });\r\n const motionVectorHandle = options.motionVectors\r\n ? builder.createTexture({ format: mvFormat, label: 'motionVector' })\r\n : undefined;\r\n const finalDepthAttachment = ctx.finalFramebuffer?.getDepthAttachment();\r\n const externalDepthAttachment = finalDepthAttachment?.isTexture2D()\r\n ? (finalDepthAttachment as Texture2D)\r\n : null;\r\n const graphDepthAttachmentHandle = externalDepthAttachment\r\n ? undefined\r\n : builder.createTexture({ format: ctx.depthFormat, label: 'sceneDepth' });\r\n const depthAttachmentOrFormat = externalDepthAttachment ?? graphDepthAttachmentHandle ?? ctx.depthFormat;\r\n const depthFramebufferHandle = builder.createFramebuffer({\r\n label: 'DepthPrepassFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: motionVectorHandle ? [depthHandle, motionVectorHandle] : depthHandle,\r\n depthAttachment: depthAttachmentOrFormat,\r\n ignoreDepthStencil: false\r\n });\r\n const skyMotionVectorFramebufferHandle = motionVectorHandle\r\n ? builder.createFramebuffer({\r\n label: 'SkyMotionVectorFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: motionVectorHandle,\r\n depthAttachment: depthAttachmentOrFormat\r\n })\r\n : undefined;\r\n\r\n builder.addSubpass('SceneDepth', (rgCtx) => {\r\n const depthFramebuffer = rgCtx.getFramebuffer<FrameBuffer>(depthFramebufferHandle);\r\n frame.depthFramebuffer = renderSceneDepth(frame, depthFramebuffer, rgCtx, undefined, undefined, false);\r\n });\r\n if (skyMotionVectorFramebufferHandle) {\r\n builder.addSubpass('SkyMotionVectors', (rgCtx) => {\r\n renderSkyMotionVectors(ctx, rgCtx, skyMotionVectorFramebufferHandle);\r\n });\r\n }\r\n\r\n return {\r\n depthHandle,\r\n motionVectorHandle,\r\n graphDepthAttachmentHandle,\r\n externalDepthAttachment,\r\n depthFramebufferHandle\r\n };\r\n });\r\n\r\n const depthHandle = depthPassResult.depthHandle;\r\n const motionVectorHandle = depthPassResult.motionVectorHandle;\r\n const renderDepthAttachment =\r\n depthPassResult.graphDepthAttachmentHandle ?? depthPassResult.externalDepthAttachment ?? null;\r\n const useFinalFramebufferAsIntermediate =\r\n !!depthPassResult.externalDepthAttachment &&\r\n depthPassResult.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment();\r\n\r\n let preLightTransmissionDepthToken: RGHandle | undefined;\r\n if (options.needsTransmissionDepthForSSR) {\r\n preLightTransmissionDepthToken = graph.addPass('TransmissionDepthForSSR', (builder) => {\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n const done = builder.createToken('TransmissionDepthForSSRDone');\r\n builder.sideEffect();\r\n builder.setExecute((rgCtx) => {\r\n renderTransmissionDepthPass(frame, rgCtx);\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // ── 6. Hi-Z (optional) ───────────────────────────────────────────\r\n let hiZHandle: RGHandle | undefined;\r\n if (options.hiZ) {\r\n graph.addPass('HiZ', (builder) => {\r\n builder.read(depthHandle!);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n hiZHandle = builder.createTexture({\r\n format: 'r32f',\r\n label: 'hiZ',\r\n mipLevels: getFullMipLevelCount(ctx.renderWidth, ctx.renderHeight)\r\n });\r\n const hiZFramebufferHandle = builder.createFramebuffer({\r\n label: 'HiZFramebuffer',\r\n colorAttachments: hiZHandle,\r\n depthAttachment: null\r\n });\r\n builder.setExecute((rgCtx) => {\r\n const ctx = frame.ctx;\r\n // Use the depth texture from the framebuffer (which contains the RenderGraph texture)\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n if (depthTex) {\r\n // Get the HiZ texture allocated by the executor\r\n const hiZTex = rgCtx.getTexture<Texture2D>(hiZHandle!);\r\n const HiZFrameBuffer = rgCtx.getFramebuffer<FrameBuffer>(hiZFramebufferHandle);\r\n buildHiZ(depthTex, HiZFrameBuffer);\r\n ctx.HiZTexture = hiZTex;\r\n }\r\n });\r\n });\r\n }\r\n\r\n // ── 7. Main Light Pass ────────────────────────────────────────────\r\n const historyManager = ctx.camera?.getHistoryResourceManager?.() ?? null;\r\n const lightHistoryReadBindings: HistoryReadBinding[] = [];\r\n const compositeHistoryReadBindings: HistoryReadBinding[] = [];\r\n const historySize = { width: ctx.renderWidth, height: ctx.renderHeight };\r\n if (historyManager && options.ssr && ctx.camera?.ssrTemporal && options.motionVectors) {\r\n const reflectHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSR_REFLECT,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n const motionVectorHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSR_MOTION_VECTOR,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n if (reflectHistoryHandle && motionVectorHistoryHandle) {\r\n lightHistoryReadBindings.push(\r\n { name: RGHistoryResources.SSR_REFLECT, handle: reflectHistoryHandle },\r\n { name: RGHistoryResources.SSR_MOTION_VECTOR, handle: motionVectorHistoryHandle }\r\n );\r\n }\r\n }\r\n if (historyManager && ctx.camera?.TAA && options.motionVectors) {\r\n const colorHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.TAA_COLOR,\r\n {\r\n format: ctx.colorFormat!,\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n const motionVectorHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.TAA_MOTION_VECTOR,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n if (colorHistoryHandle && motionVectorHistoryHandle) {\r\n compositeHistoryReadBindings.push(\r\n { name: RGHistoryResources.TAA_COLOR, handle: colorHistoryHandle },\r\n { name: RGHistoryResources.TAA_MOTION_VECTOR, handle: motionVectorHistoryHandle }\r\n );\r\n }\r\n }\r\n\r\n let sssProfileResult: SSSProfilePassResult | undefined;\r\n if (options.sss) {\r\n sssProfileResult = graph.addPass('SSSProfile', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n const profileHandle = builder.createTexture({ format: 'rgba16f', label: 'sssProfile' });\r\n const paramHandle = builder.createTexture({ format: 'rgba8unorm', label: 'sssParam' });\r\n const normalHandle = options.ssr\r\n ? undefined\r\n : builder.createTexture({ format: getSurfaceTextureFormat(ctx), label: 'sssNormal' });\r\n const colorAttachments = normalHandle\r\n ? [ctx.colorFormat!, normalHandle, profileHandle, paramHandle]\r\n : [ctx.colorFormat!, profileHandle, paramHandle];\r\n const framebufferHandle = builder.createFramebuffer({\r\n label: 'SSSProfileFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments,\r\n depthAttachment: renderDepthAttachment,\r\n ignoreDepthStencil: false\r\n });\r\n\r\n builder.setExecute((rgCtx) => {\r\n renderForwardSSSProfile(\r\n frame,\r\n rgCtx.getFramebuffer<FrameBuffer>(framebufferHandle),\r\n rgCtx.getTexture<Texture2D>(profileHandle),\r\n rgCtx.getTexture<Texture2D>(paramHandle),\r\n normalHandle ? rgCtx.getTexture<Texture2D>(normalHandle) : null\r\n );\r\n });\r\n\r\n return {\r\n profileHandle,\r\n paramHandle,\r\n normalHandle,\r\n framebufferHandle\r\n };\r\n });\r\n }\r\n\r\n const lightPassResult = graph.addPass('LightPass', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n for (const binding of lightHistoryReadBindings) {\r\n builder.read(binding.handle);\r\n }\r\n\r\n // Create scene color texture (intermediate render target)\r\n const sceneColorHandle = builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColor'\r\n });\r\n\r\n // Create optional sceneColorCopy for transmission/refraction materials\r\n let sceneColorCopyHandle: RGHandle | undefined;\r\n if (options.needSceneColor) {\r\n sceneColorCopyHandle = builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColorCopy'\r\n });\r\n }\r\n if (sssProfileResult) {\r\n builder.read(sssProfileResult.profileHandle);\r\n builder.read(sssProfileResult.paramHandle);\r\n if (sssProfileResult.normalHandle) {\r\n builder.read(sssProfileResult.normalHandle);\r\n }\r\n }\r\n const includeSSRSurfaceMRT = !!options.ssr;\r\n const writeSSSDiffuse = options.sss && shouldStoreSSSDiffuse(ctx);\r\n let writeSSSTransmission = options.sss && shouldStoreSSSTransmission(ctx);\r\n if (\r\n writeSSSDiffuse &&\r\n writeSSSTransmission &&\r\n includeSSRSurfaceMRT &&\r\n getSSSLightingTextureFormat(ctx, 2, includeSSRSurfaceMRT) !== ctx.colorFormat\r\n ) {\r\n writeSSSTransmission = false;\r\n }\r\n const writeSkinSSS = options.skinSSS;\r\n const sssLightingAttachmentCount =\r\n (writeSSSDiffuse ? 1 : 0) + (writeSSSTransmission ? 1 : 0) + (writeSkinSSS ? 1 : 0);\r\n const sssLightingFormat = getSSSLightingTextureFormat(\r\n ctx,\r\n sssLightingAttachmentCount,\r\n includeSSRSurfaceMRT\r\n );\r\n const sssDiffuseHandle = writeSSSDiffuse\r\n ? builder.createTexture({ format: sssLightingFormat, label: 'sssDiffuse' })\r\n : undefined;\r\n const sssTransmissionHandle = writeSSSTransmission\r\n ? builder.createTexture({ format: sssLightingFormat, label: 'sssTransmission' })\r\n : undefined;\r\n const skinSSSHandle = writeSkinSSS\r\n ? builder.createTexture({ format: sssLightingFormat, label: 'skinSSS' })\r\n : undefined;\r\n const sceneColorFramebufferHandle = useFinalFramebufferAsIntermediate\r\n ? undefined\r\n : builder.createFramebuffer({\r\n label: 'SceneColorFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: sceneColorHandle,\r\n depthAttachment: renderDepthAttachment\r\n });\r\n // SSR may pre-insert transmission depth before LightPass for Hi-Z. In that case the\r\n // refraction scene-color copy needs an isolated depth buffer so transmission surfaces\r\n // do not occlude the background color they are about to sample.\r\n const sceneColorCopyFramebufferHandle =\r\n sceneColorCopyHandle && !options.needsTransmissionDepthForSSR\r\n ? builder.createFramebuffer({\r\n label: 'SceneColorCopyFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: sceneColorCopyHandle,\r\n depthAttachment: renderDepthAttachment,\r\n ignoreDepthStencil: false\r\n })\r\n : undefined;\r\n\r\n builder.setExecute((rgCtx) => {\r\n const sceneColorTex = rgCtx.getTexture<Texture2D>(sceneColorHandle);\r\n const sceneColorCopyTex = sceneColorCopyHandle\r\n ? rgCtx.getTexture<Texture2D>(sceneColorCopyHandle)\r\n : null;\r\n if (sssProfileResult) {\r\n ctx.SSSProfileTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.profileHandle);\r\n ctx.SSSParamTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.paramHandle);\r\n if (sssProfileResult.normalHandle) {\r\n ctx.SSRNormalTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.normalHandle);\r\n }\r\n }\r\n ctx.SSSDiffuseTexture = sssDiffuseHandle ? rgCtx.getTexture<Texture2D>(sssDiffuseHandle) : null;\r\n ctx.SSSTransmissionTexture = sssTransmissionHandle\r\n ? rgCtx.getTexture<Texture2D>(sssTransmissionHandle)\r\n : null;\r\n ctx.SkinSSSTexture = skinSSSHandle ? rgCtx.getTexture<Texture2D>(skinSSSHandle) : null;\r\n const renderLightPass = () =>\r\n renderMainLightPass(\r\n frame,\r\n sceneColorTex,\r\n sceneColorCopyTex,\r\n rgCtx,\r\n sceneColorFramebufferHandle,\r\n sceneColorCopyFramebufferHandle\r\n );\r\n if (historyManager && lightHistoryReadBindings.length > 0) {\r\n historyManager.beginReadScope(\r\n lightHistoryReadBindings.map((binding) => ({\r\n name: binding.name,\r\n texture: rgCtx.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n renderLightPass();\r\n } finally {\r\n historyManager.endReadScope();\r\n }\r\n } else {\r\n renderLightPass();\r\n }\r\n });\r\n\r\n return { sceneColorHandle, sceneColorCopyHandle, sceneColorFramebufferHandle };\r\n });\r\n\r\n const sceneColorHandle = lightPassResult.sceneColorHandle;\r\n\r\n // 8. Transmission depth pass (optional)\r\n let transmissionDepthToken: RGHandle | undefined;\r\n if (options.needSceneColor && !options.needsTransmissionDepthForSSR) {\r\n transmissionDepthToken = graph.addPass('TransmissionDepth', (builder) => {\r\n builder.read(sceneColorHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n const done = builder.createToken('TransmissionDepthDone');\r\n builder.sideEffect();\r\n builder.setExecute((rgCtx) => {\r\n renderTransmissionDepthPass(frame, rgCtx);\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // 9. Post effects + final composite\r\n const presentedBackbuffer = graph.addPass('Composite', (builder) => {\r\n builder.read(sceneColorHandle);\r\n builder.read(depthHandle);\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n if (motionVectorHandle) {\r\n builder.read(motionVectorHandle);\r\n }\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n builder.read(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n if (transmissionDepthToken) {\r\n builder.read(transmissionDepthToken);\r\n }\r\n for (const binding of compositeHistoryReadBindings) {\r\n builder.read(binding.handle);\r\n }\r\n const outputBackbuffer = builder.write(backbuffer);\r\n const taaHistoryColorHandle = useFinalFramebufferAsIntermediate ? outputBackbuffer : sceneColorHandle;\r\n builder.setExecute((rgCtx) => {\r\n const renderAndCommitComposite = () => {\r\n renderComposite(frame);\r\n queueTAAHistoryCommit(frame, rgCtx, historyManager, taaHistoryColorHandle, motionVectorHandle);\r\n };\r\n if (historyManager && compositeHistoryReadBindings.length > 0) {\r\n historyManager.beginReadScope(\r\n compositeHistoryReadBindings.map((binding) => ({\r\n name: binding.name,\r\n texture: rgCtx.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n renderAndCommitComposite();\r\n } finally {\r\n historyManager.endReadScope();\r\n }\r\n } else {\r\n renderAndCommitComposite();\r\n }\r\n });\r\n return outputBackbuffer;\r\n });\r\n\r\n return { backbuffer: presentedBackbuffer, frame };\r\n}\r\n\r\n// ─── Pass Implementation Helpers ────────────────────────────────────\r\n// These wrap the existing SceneRenderer static methods, adapted to work\r\n// with the FrameState pattern. They contain the same logic as the\r\n// original methods but read/write through FrameState.\r\n\r\n/** @internal */\r\nfunction renderShadowMaps(ctx: DrawContext, lights: PunctualLight[]): void {\r\n ctx.renderPass = _shadowMapPass;\r\n ctx.device.pushDeviceStates();\r\n try {\r\n for (const light of lights) {\r\n light.shadow.render(ctx, _shadowMapPass);\r\n }\r\n } finally {\r\n ctx.device.popDeviceStates();\r\n }\r\n}\r\n\r\nfunction renderForwardSSSProfile(\r\n frame: FrameState,\r\n profileFramebuffer: FrameBuffer,\r\n profileTexture: Texture2D,\r\n paramTexture: Texture2D,\r\n normalTexture: Nullable<Texture2D>\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n if (!ctx.SSS || !ctx.depthTexture) {\r\n return;\r\n }\r\n const sssRenderQueue = createActualSSSRenderQueue(renderQueue);\r\n if (!sssRenderQueue) {\r\n return;\r\n }\r\n\r\n const device = ctx.device;\r\n const savedMaterialFlags = ctx.materialFlags;\r\n const savedCompositor = ctx.compositor;\r\n const savedTransmission = _scenePass.transmission;\r\n const savedRenderOpaque = _scenePass.renderOpaque;\r\n const savedRenderTransparent = _scenePass.renderTransparent;\r\n const savedClearColor = _scenePass.clearColor;\r\n const savedClearDepth = _scenePass.clearDepth;\r\n const savedClearStencil = _scenePass.clearStencil;\r\n const savedCommandBufferReuse = ctx.camera.commandBufferReuse;\r\n const savedProfileTexture = ctx.SSSProfileTexture;\r\n const savedParamTexture = ctx.SSSParamTexture;\r\n const savedNormalTexture = ctx.SSRNormalTexture;\r\n\r\n let profileFlags = MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n if (normalTexture) {\r\n profileFlags |= MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n }\r\n\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(profileFramebuffer);\r\n ctx.SSSProfileTexture = profileTexture;\r\n ctx.SSSParamTexture = paramTexture;\r\n ctx.SSRNormalTexture = normalTexture;\r\n ctx.compositor = null;\r\n ctx.camera.commandBufferReuse = false;\r\n ctx.materialFlags =\r\n (ctx.materialFlags &\r\n ~(\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE\r\n )) |\r\n profileFlags;\r\n _scenePass.transmission = false;\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderTransparent = false;\r\n _scenePass.clearColor = Vector4.zero();\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n _scenePass.render(ctx, null, null, sssRenderQueue);\r\n } finally {\r\n _scenePass.clearColor = savedClearColor;\r\n _scenePass.clearDepth = savedClearDepth;\r\n _scenePass.clearStencil = savedClearStencil;\r\n _scenePass.renderTransparent = savedRenderTransparent;\r\n _scenePass.renderOpaque = savedRenderOpaque;\r\n _scenePass.transmission = savedTransmission;\r\n ctx.camera.commandBufferReuse = savedCommandBufferReuse;\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.compositor = savedCompositor;\r\n ctx.SSSProfileTexture = savedProfileTexture;\r\n ctx.SSSParamTexture = savedParamTexture;\r\n ctx.SSRNormalTexture = savedNormalTexture;\r\n device.popDeviceStates();\r\n sssRenderQueue.dispose();\r\n }\r\n}\r\n\r\nfunction releaseIntermediateFramebuffer(frame: FrameState): void {\r\n const { ctx } = frame;\r\n if (frame.intermediateDeviceStatePushed) {\r\n ctx.device.popDeviceStates();\r\n frame.intermediateDeviceStatePushed = false;\r\n }\r\n ctx.intermediateFramebuffer = null;\r\n}\r\n\r\nfunction releaseDepthFramebuffer(frame: FrameState): void {\r\n frame.depthFramebuffer = null;\r\n}\r\n\r\nfunction disposeRenderQueue(frame: FrameState): void {\r\n if (!frame.renderQueueDisposed) {\r\n frame.renderQueue.dispose();\r\n frame.renderQueueDisposed = true;\r\n }\r\n}\r\n\r\nfunction releaseClusteredLight(frame: FrameState): void {\r\n if (!frame.clusteredLightReleased && frame.ctx.clusteredLight) {\r\n freeClusteredLight(frame.ctx.clusteredLight);\r\n frame.ctx.clusteredLight = undefined;\r\n frame.clusteredLightReleased = true;\r\n }\r\n}\r\n\r\nfunction restoreSunLight(frame: FrameState): void {\r\n if (!frame.sunLightRestored && frame.sunLightColor && frame.ctx.sunLight) {\r\n frame.ctx.sunLight.color = frame.sunLightColor;\r\n frame.sunLightRestored = true;\r\n }\r\n}\r\n\r\nfunction cleanupFrame(frame: FrameState): void {\r\n releaseIntermediateFramebuffer(frame);\r\n releaseDepthFramebuffer(frame);\r\n releaseClusteredLight(frame);\r\n disposeRenderQueue(frame);\r\n restoreSunLight(frame);\r\n}\r\n\r\n/** @internal */\r\nfunction renderSceneDepth(\r\n frame: FrameState,\r\n existingDepthFb: Nullable<FrameBuffer>,\r\n rgCtx: RGExecuteContext,\r\n depthTex?: Texture2D,\r\n motionVectorTex?: Nullable<Texture2D>,\r\n transmissionOverride?: boolean\r\n): FrameBuffer {\r\n const ctx = frame.ctx;\r\n const renderQueue = frame.renderQueue;\r\n const transmission = transmissionOverride ?? !!existingDepthFb;\r\n let depthFramebuffer = existingDepthFb;\r\n\r\n if (!depthFramebuffer) {\r\n // Use RenderGraph-allocated textures if provided\r\n if (depthTex) {\r\n const colorAttachments = motionVectorTex ? [depthTex, motionVectorTex] : depthTex;\r\n const depthAttachment = ctx.finalFramebuffer?.getDepthAttachment();\r\n const depthTexOrFormat = depthAttachment?.isTexture2D() ? depthAttachment : ctx.depthFormat;\r\n\r\n depthFramebuffer = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: depthTex.width,\r\n height: depthTex.height,\r\n colorAttachments,\r\n depthAttachment: depthTexOrFormat,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n // Allocate through RenderGraph so framebuffer lifetime is owned by the executor.\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 = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: ctx.depthFormat,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n const originDepth = ctx.finalFramebuffer?.getDepthAttachment();\r\n if (originDepth?.isTexture2D()) {\r\n depthFramebuffer = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: originDepth.width,\r\n height: originDepth.height,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: originDepth,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n depthFramebuffer = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: ctx.depthFormat,\r\n ignoreDepthStencil: false\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!transmission) {\r\n frame.depthFramebuffer = depthFramebuffer!;\r\n }\r\n\r\n ctx.device.pushDeviceStates();\r\n try {\r\n ctx.device.setFramebuffer(depthFramebuffer!);\r\n _depthPass.encodeDepth = depthFramebuffer!.getColorAttachments()[0].format === 'rgba8unorm';\r\n _depthPass.clearColor = transmission\r\n ? null\r\n : _depthPass.encodeDepth\r\n ? new Vector4(0, 0, 0, 1)\r\n : new Vector4(1, 1, 1, 1);\r\n _depthPass.clearDepth = transmission ? null : 1;\r\n _depthPass.clearStencil = null;\r\n _depthPass.transmission = transmission;\r\n\r\n if (ctx.SSRCalcThickness && !transmission) {\r\n if (!_backDepthColorState) {\r\n _backDepthColorState = ctx.device.createColorState().setColorMask(false, true, false, false);\r\n }\r\n if (!_frontDepthColorState) {\r\n _frontDepthColorState = ctx.device.createColorState().setColorMask(true, false, false, false);\r\n }\r\n ctx.forceColorState = _backDepthColorState;\r\n ctx.forceCullMode = 'front';\r\n _depthPass.renderBackface = true;\r\n _depthPass.transmission = false;\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n _depthPass.clearColor = null;\r\n _depthPass.renderBackface = false;\r\n ctx.forceColorState = _frontDepthColorState;\r\n ctx.forceCullMode = null;\r\n }\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n ctx.forceColorState = null;\r\n ctx.forceCullMode = null;\r\n _depthPass.renderBackface = false;\r\n ctx.device.popDeviceStates();\r\n }\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 ctx.depthPrepassAttachment = ctx.depthTexture;\r\n // HiZ is now built in the dedicated HiZ pass\r\n }\r\n return depthFramebuffer!;\r\n}\r\n\r\n// ─── Sky Motion Vector State ────────────────────────────────────────\r\n\r\nlet _skyMVProgram: Nullable<GPUProgram> = null;\r\nlet _skyMVBindGroup: Nullable<BindGroup> = null;\r\nlet _skyMVBox: Nullable<Primitive> = null;\r\n\r\n/** @internal */\r\nfunction renderSkyMotionVectors(\r\n ctx: DrawContext,\r\n rgCtx: RGExecuteContext,\r\n framebufferHandle?: RGHandle\r\n): void {\r\n if (!ctx.motionVectorTexture) {\r\n return;\r\n }\r\n\r\n const device = ctx.device;\r\n const fb = framebufferHandle\r\n ? rgCtx.getFramebuffer<FrameBuffer>(framebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\r\n colorAttachments: ctx.motionVectorTexture,\r\n depthAttachment: ctx.depthTexture\r\n });\r\n\r\n if (!_skyMVProgram) {\r\n _skyMVProgram = 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 _skyMVProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n\r\n if (!_skyMVBindGroup) {\r\n _skyMVBindGroup = device.createBindGroup(_skyMVProgram.bindGroupLayouts[0]);\r\n }\r\n\r\n if (!_skyMVBox) {\r\n _skyMVBox = new BoxShape({ size: 2, needNormal: false, needUV: false });\r\n }\r\n\r\n _skyMVBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n _skyMVBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n _skyMVBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n _skyMVBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n\r\n device.pushDeviceStates();\r\n device.setProgram(_skyMVProgram);\r\n device.setBindGroup(0, _skyMVBindGroup);\r\n device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, 'le'));\r\n device.setFramebuffer(fb);\r\n _skyMVBox.draw();\r\n device.popDeviceStates();\r\n}\r\n\r\nfunction blitToCurrentColorAttachment(ctx: DrawContext, source: Texture2D): void {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n const destination = framebuffer?.getColorAttachment<Texture2D>(0) ?? null;\r\n new CopyBlitter().blit(source, destination, fetchSampler('clamp_nearest_nomip'));\r\n}\r\n\r\n/** @internal */\r\nfunction renderMainLightPass(\r\n frame: FrameState,\r\n sceneColorTex: Texture2D,\r\n sceneColorCopyTex: Nullable<Texture2D>,\r\n rgCtx: RGExecuteContext,\r\n sceneColorFramebufferHandle?: RGHandle,\r\n sceneColorCopyFramebufferHandle?: RGHandle\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n const device = ctx.device;\r\n\r\n // Use RenderGraph-allocated scene color texture\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n\r\n ctx.materialFlags &= ~(\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE\r\n );\r\n\r\n if (ctx.SSR) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n }\r\n if (ctx.SSS) {\r\n if (ctx.SSSDiffuseTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n }\r\n if (ctx.SSSTransmissionTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n }\r\n }\r\n if (ctx.SkinSSSTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SKIN_SSS_STORE;\r\n }\r\n\r\n if (depthTex === ctx.finalFramebuffer?.getDepthAttachment()) {\r\n ctx.intermediateFramebuffer = ctx.finalFramebuffer;\r\n } else if (sceneColorFramebufferHandle && !hasSurfaceMRT(ctx)) {\r\n ctx.intermediateFramebuffer = rgCtx.getFramebuffer<FrameBuffer>(sceneColorFramebufferHandle);\r\n } else {\r\n ctx.intermediateFramebuffer = rgCtx.createFramebuffer<FrameBuffer>({\r\n width: sceneColorTex.width,\r\n height: sceneColorTex.height,\r\n colorAttachments: getLightPassColorAttachments(ctx, sceneColorTex),\r\n depthAttachment: depthTex\r\n });\r\n }\r\n\r\n if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {\r\n device.pushDeviceStates();\r\n frame.intermediateDeviceStatePushed = true;\r\n device.setFramebuffer(ctx.intermediateFramebuffer);\r\n } else {\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n\r\n _scenePass.transmission = false;\r\n _scenePass.clearDepth = depthTex ? null : 1;\r\n _scenePass.clearStencil = depthTex ? null : 0;\r\n\r\n ctx.compositor?.begin(ctx);\r\n\r\n if (renderQueue.needSceneColor() && sceneColorCopyTex) {\r\n const compositor = ctx.compositor;\r\n ctx.compositor = null;\r\n const isolateSceneColorDepth = frame.options.needsTransmissionDepthForSSR;\r\n const savedDepthPrepassAttachment = ctx.depthPrepassAttachment;\r\n const savedClearDepth = _scenePass.clearDepth;\r\n const savedClearStencil = _scenePass.clearStencil;\r\n const savedMaterialFlags = ctx.materialFlags;\r\n\r\n // Use RenderGraph-allocated sceneColorCopy texture\r\n const sceneColorMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const sceneColorFramebuffer = sceneColorCopyFramebufferHandle\r\n ? rgCtx.getFramebuffer<FrameBuffer>(sceneColorCopyFramebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\r\n width: sceneColorCopyTex.width,\r\n height: sceneColorCopyTex.height,\r\n colorAttachments: sceneColorCopyTex,\r\n depthAttachment: isolateSceneColorDepth ? ctx.depthFormat : depthTex,\r\n ignoreDepthStencil: false\r\n });\r\n let sceneColorStatePushed = false;\r\n try {\r\n device.pushDeviceStates();\r\n sceneColorStatePushed = true;\r\n device.setFramebuffer(sceneColorFramebuffer);\r\n _scenePass.transmission = false;\r\n if (isolateSceneColorDepth) {\r\n ctx.depthPrepassAttachment = undefined;\r\n _scenePass.clearDepth = 1;\r\n _scenePass.clearStencil = 0;\r\n }\r\n ctx.materialFlags = sceneColorMaterialFlags;\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n if (isolateSceneColorDepth) {\r\n ctx.depthPrepassAttachment = savedDepthPrepassAttachment;\r\n _scenePass.clearDepth = savedClearDepth;\r\n _scenePass.clearStencil = savedClearStencil;\r\n }\r\n if (sceneColorStatePushed) {\r\n device.popDeviceStates();\r\n }\r\n ctx.compositor = compositor;\r\n }\r\n ctx.sceneColorTexture = sceneColorCopyTex;\r\n blitToCurrentColorAttachment(ctx, ctx.sceneColorTexture);\r\n _scenePass.transmission = true;\r\n _scenePass.clearColor = null;\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n }\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n}\r\n\r\n/** @internal */\r\nfunction renderTransmissionDepthPass(frame: FrameState, rgCtx: RGExecuteContext): void {\r\n renderSceneDepth(frame, frame.depthFramebuffer, rgCtx);\r\n}\r\n\r\nfunction queueTAAHistoryCommit(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n historyManager: Nullable<HistoryResourceManager<Texture2D>>,\r\n colorHandle: RGHandle,\r\n motionVectorHandle?: RGHandle\r\n): void {\r\n const { ctx } = frame;\r\n if (\r\n !historyManager?.frameActive ||\r\n !ctx.camera.TAA ||\r\n !frame.options.motionVectors ||\r\n !motionVectorHandle\r\n ) {\r\n return;\r\n }\r\n const colorTexture = rgCtx.getTexture<Texture2D>(colorHandle);\r\n const colorSize = { width: colorTexture.width, height: colorTexture.height };\r\n historyManager.queueRetainedCommit(\r\n RGHistoryResources.TAA_COLOR,\r\n {\r\n format: colorTexture.format,\r\n sizeMode: 'absolute',\r\n width: colorTexture.width,\r\n height: colorTexture.height\r\n },\r\n colorSize,\r\n colorTexture\r\n );\r\n\r\n const motionVectorTexture = rgCtx.getTexture<Texture2D>(motionVectorHandle);\r\n const motionVectorSize = {\r\n width: motionVectorTexture.width,\r\n height: motionVectorTexture.height\r\n };\r\n historyManager.queueRetainedCommit(\r\n RGHistoryResources.TAA_MOTION_VECTOR,\r\n {\r\n format: motionVectorTexture.format,\r\n sizeMode: 'absolute',\r\n width: motionVectorTexture.width,\r\n height: motionVectorTexture.height\r\n },\r\n motionVectorSize,\r\n motionVectorTexture\r\n );\r\n}\r\n\r\n/** @internal */\r\nfunction renderComposite(frame: FrameState): void {\r\n const { ctx } = frame;\r\n\r\n ctx.compositor?.drawPostEffects(ctx, PostEffectLayer.end, ctx.linearDepthTexture!);\r\n ctx.compositor?.end(ctx);\r\n disposeRenderQueue(frame);\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SKIN_SSS_STORE;\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 }\r\n\r\n releaseIntermediateFramebuffer(frame);\r\n releaseDepthFramebuffer(frame);\r\n releaseClusteredLight(frame);\r\n restoreSunLight(frame);\r\n}\r\n\r\n// ─── Convenience: Execute Full Pipeline ─────────────────────────────\r\n\r\n/**\r\n * Build, compile, and execute the forward+ pipeline as a render graph.\r\n *\r\n * This is the drop-in replacement for `SceneRenderer._renderScene`.\r\n *\r\n * @param ctx - The draw context for this frame.\r\n * @public\r\n */\r\nexport function executeForwardPlusGraph(ctx: DrawContext): void {\r\n const device = ctx.device;\r\n const graph = new RenderGraph();\r\n let renderQueue: RenderQueue | null = null;\r\n let frame: FrameState | null = null;\r\n let executor: RenderGraphExecutor<Texture2D, FrameBuffer> | null = null;\r\n let historyManager: HistoryResourceManager<Texture2D> | null = null;\r\n let historyFrameStarted = false;\r\n\r\n try {\r\n // Cull scene first (needed to derive options)\r\n renderQueue = _scenePass.cullScene(ctx, ctx.camera);\r\n\r\n const options = deriveForwardPlusOptions(ctx.scene, ctx.camera, device.type, renderQueue);\r\n ctx.SSS = options.sss;\r\n\r\n // Ensure the camera has a history resource manager for temporal effects (TAA, motion blur)\r\n historyManager = ctx.camera.getHistoryResourceManager();\r\n if (!historyManager) {\r\n historyManager = new HistoryResourceManager<Texture2D>(_devicePoolAllocator);\r\n ctx.camera.setHistoryResourceManager(historyManager);\r\n }\r\n historyManager.beginFrame();\r\n historyFrameStarted = true;\r\n\r\n const buildResult = buildForwardPlusGraphInternal(graph, ctx, renderQueue, options);\r\n frame = buildResult.frame;\r\n\r\n const compiled = graph.compile([buildResult.backbuffer]);\r\n\r\n // Use RenderGraphExecutor for automatic resource management\r\n executor = new RenderGraphExecutor(_devicePoolAllocator, ctx.renderWidth, ctx.renderHeight);\r\n\r\n // Register imported backbuffer (if using finalFramebuffer)\r\n if (ctx.finalFramebuffer) {\r\n const backbufferTex = ctx.finalFramebuffer.getColorAttachments()[0] as Texture2D;\r\n executor.setImportedTexture(buildResult.backbuffer, backbufferTex);\r\n }\r\n historyManager.bindImportedTextures(executor);\r\n\r\n executor.execute(compiled);\r\n historyManager.commitFrame();\r\n } finally {\r\n if (historyFrameStarted) {\r\n historyManager?.discardFrame();\r\n }\r\n if (frame) {\r\n cleanupFrame(frame);\r\n } else {\r\n renderQueue?.dispose();\r\n }\r\n executor?.reset();\r\n }\r\n}\r\n"],"names":["_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_clusters","_devicePoolAllocator","DevicePoolAllocator","_backDepthColorState","_frontDepthColorState","SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","getClusteredLight","length","pop","ClusteredLight","freeClusteredLight","cl","push","getCoreMaterial","material","coreMaterial","hasSSSMaterialCore","subsurfaceProfile","hasSkinSSSMaterialCore","skinSSS","renderQueueHasActiveSSS","renderQueue","itemList","lists","opaque","lit","unlit","list","materialList","renderQueueHasActiveSkinSSS","filterActualSSSItemList","items","filter","item","drawable","getMaterial","filterActualSSSMaterialList","filtered","Set","forEach","mat","add","cloneActualSSSListInfo","source","_targetQueue","skinItemList","morphItemList","skinAndMorphItemList","instanceItemList","instanceList","cloneActualSSSBundle","targetQueue","map","info","hasAnyActualSSSItems","renderItems","some","createActualSSSRenderQueue","queue","RenderQueue","sssOpaque","dispose","emptyBundle","target","_itemList","transmission","transparent","transmission_trans","_shadowedLightList","shadowedLights","_unshadowedLightList","unshadowedLights","_sunLight","sunLight","_primaryDirectionalLight","primaryDirectionalLight","_primaryTransmissionLight","primaryTransmissionLight","_needSceneColor","_needSceneDepth","_needSceneColorWithDepth","_drawTransparent","getSurfaceTextureFormat","ctx","caps","device","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","getTextureFormatBytes","format","getTextureFormatInfo","size","shouldStoreSSSDiffuse","camera","sssStrength","sssBlurScale","shouldStoreSSSTransmission","sssTransmissionStrength","getSSSLightingTextureFormat","attachmentCount","includeSSRSurfaceMRT","colorFormat","roughnessFormat","SSRRoughnessTexture","normalFormat","SSRNormalTexture","colorBytes","fullPrecisionBytes","framebufferCaps","maxColorAttachmentBytesPerSample","getFullMipLevelCount","width","height","Math","max","floor","log2","hasSurfaceMRT","materialFlags","getLightPassColorAttachments","colorAttachment","attachments","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","deriveForwardPlusOptions","scene","deviceType","ssr","SSR","env","light","envLight","hasRadiance","sss","SSS","needSceneColor","needSceneColorWithDepth","depthPrepass","motionVectors","TAA","motionBlur","ssrTemporal","hiZ","HiZ","ssrCalcThickness","gpuPicking","getPickResultResolveFunc","needsTransmissionDepthForSSR","buildForwardPlusGraph","graph","options","buildForwardPlusGraphInternal","backbuffer","importTexture","frame","depthFramebuffer","sunLightColor","intermediateDeviceStatePushed","renderQueueDisposed","clusteredLightReleased","sunLightRestored","orderToken","addPass","builder","done","createToken","sideEffect","setExecute","sky","update","read","clusteredLight","calculateLightIndex","pickResolveFunc","renderObjectColors","renderShadowMaps","depthPassResult","type","SSRCalcThickness","mvFormat","depthHandle","createTexture","label","motionVectorHandle","undefined","finalDepthAttachment","finalFramebuffer","getDepthAttachment","externalDepthAttachment","isTexture2D","graphDepthAttachmentHandle","depthFormat","depthAttachmentOrFormat","depthFramebufferHandle","createFramebuffer","renderWidth","renderHeight","colorAttachments","depthAttachment","ignoreDepthStencil","skyMotionVectorFramebufferHandle","addSubpass","rgCtx","getFramebuffer","renderSceneDepth","renderSkyMotionVectors","renderDepthAttachment","useFinalFramebufferAsIntermediate","preLightTransmissionDepthToken","renderTransmissionDepthPass","hiZHandle","mipLevels","hiZFramebufferHandle","depthTex","hiZTex","getTexture","HiZFrameBuffer","buildHiZ","HiZTexture","historyManager","getHistoryResourceManager","lightHistoryReadBindings","compositeHistoryReadBindings","historySize","reflectHistoryHandle","importPreviousIfCompatible","RGHistoryResources","SSR_REFLECT","sizeMode","motionVectorHistoryHandle","SSR_MOTION_VECTOR","name","handle","colorHistoryHandle","TAA_COLOR","TAA_MOTION_VECTOR","sssProfileResult","profileHandle","paramHandle","normalHandle","framebufferHandle","renderForwardSSSProfile","lightPassResult","binding","sceneColorHandle","sceneColorCopyHandle","writeSSSDiffuse","writeSSSTransmission","writeSkinSSS","sssLightingAttachmentCount","sssLightingFormat","sssDiffuseHandle","sssTransmissionHandle","skinSSSHandle","sceneColorFramebufferHandle","sceneColorCopyFramebufferHandle","sceneColorTex","sceneColorCopyTex","renderLightPass","renderMainLightPass","beginReadScope","texture","endReadScope","transmissionDepthToken","presentedBackbuffer","outputBackbuffer","write","taaHistoryColorHandle","renderAndCommitComposite","renderComposite","queueTAAHistoryCommit","lights","renderPass","pushDeviceStates","shadow","render","popDeviceStates","profileFramebuffer","profileTexture","paramTexture","normalTexture","depthTexture","sssRenderQueue","savedMaterialFlags","savedCompositor","compositor","savedTransmission","savedRenderOpaque","renderOpaque","savedRenderTransparent","renderTransparent","savedClearColor","clearColor","savedClearDepth","clearDepth","savedClearStencil","clearStencil","savedCommandBufferReuse","commandBufferReuse","savedProfileTexture","savedParamTexture","savedNormalTexture","profileFlags","setFramebuffer","Vector4","zero","releaseIntermediateFramebuffer","intermediateFramebuffer","releaseDepthFramebuffer","disposeRenderQueue","releaseClusteredLight","restoreSunLight","color","cleanupFrame","existingDepthFb","motionVectorTex","transmissionOverride","originDepth","encodeDepth","getColorAttachments","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","motionVectorTexture","linearDepthTexture","depthPrepassAttachment","_skyMVProgram","_skyMVBindGroup","_skyMVBox","fb","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","w","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","createBindGroup","bindGroupLayouts","BoxShape","needNormal","needUV","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","draw","blitToCurrentColorAttachment","framebuffer","destination","getColorAttachment","CopyBlitter","blit","fetchSampler","setViewport","setScissor","begin","isolateSceneColorDepth","savedDepthPrepassAttachment","sceneColorMaterialFlags","sceneColorFramebuffer","sceneColorStatePushed","sceneColorTexture","colorHandle","frameActive","colorTexture","colorSize","queueRetainedCommit","motionVectorSize","drawPostEffects","PostEffectLayer","end","blitter","srgbOut","srcTex","executeForwardPlusGraph","RenderGraph","executor","historyFrameStarted","cullScene","HistoryResourceManager","setHistoryResourceManager","beginFrame","buildResult","compiled","compile","RenderGraphExecutor","backbufferTex","setImportedTexture","bindImportedTextures","execute","commitFrame","discardFrame","reset"],"mappings":"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"}
@@ -12,6 +12,7 @@ import '../material/blinn.js';
12
12
  import '../material/unlit.js';
13
13
  import '../material/particle.js';
14
14
  import '../material/subsurfaceprofile.js';
15
+ import '../material/skin.js';
15
16
  import '../material/meshmaterial.js';
16
17
  import '../material/grassmaterial.js';
17
18
  import '../material/terrain-cm.js';