@zephyr3d/scene 0.9.5 → 0.9.7

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 (621) hide show
  1. package/dist/animation/joint_dynamics/controller.js +92 -32
  2. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  3. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  4. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  5. package/dist/animation/joint_dynamics/joint_dynamics_system.js +57 -19
  6. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  7. package/dist/animation/joint_dynamics/solver.js +71 -27
  8. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  9. package/dist/animation/joint_dynamics_modifier.js +21 -20
  10. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  11. package/dist/animation/skeleton.js +7 -10
  12. package/dist/animation/skeleton.js.map +1 -1
  13. package/dist/app/engine.js +134 -140
  14. package/dist/app/engine.js.map +1 -1
  15. package/dist/app/scriptregistry.js +47 -16
  16. package/dist/app/scriptregistry.js.map +1 -1
  17. package/dist/asset/assetmanager.js +3 -1
  18. package/dist/asset/assetmanager.js.map +1 -1
  19. package/dist/asset/model.js +346 -7
  20. package/dist/asset/model.js.map +1 -1
  21. package/dist/avatar/wardrobe.js +20 -16
  22. package/dist/avatar/wardrobe.js.map +1 -1
  23. package/dist/camera/camera.js +416 -210
  24. package/dist/camera/camera.js.map +1 -1
  25. package/dist/index.d.ts +1350 -621
  26. package/dist/index.js +6 -11
  27. package/dist/index.js.map +1 -1
  28. package/dist/material/blinn.js +1 -1
  29. package/dist/material/blinn.js.map +1 -1
  30. package/dist/material/lambert.js +1 -1
  31. package/dist/material/lambert.js.map +1 -1
  32. package/dist/material/material.js +23 -1
  33. package/dist/material/material.js.map +1 -1
  34. package/dist/material/meshmaterial.js +178 -23
  35. package/dist/material/meshmaterial.js.map +1 -1
  36. package/dist/material/mixins/albedocolor.js +4 -4
  37. package/dist/material/mixins/albedocolor.js.map +1 -1
  38. package/dist/material/mixins/lightmodel/blinnphong.js +2 -1
  39. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/lambert.js +2 -1
  41. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  42. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +63 -16
  43. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  44. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +105 -32
  45. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  46. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +16 -6
  47. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  48. package/dist/material/mixins/lit.js +1 -1
  49. package/dist/material/mixins/lit.js.map +1 -1
  50. package/dist/material/mixins/pbr/common.js +276 -65
  51. package/dist/material/mixins/pbr/common.js.map +1 -1
  52. package/dist/material/mixins/texture.js +3 -3
  53. package/dist/material/mixins/texture.js.map +1 -1
  54. package/dist/material/mixins/vertexcolor.js +2 -2
  55. package/dist/material/mixins/vertexcolor.js.map +1 -1
  56. package/dist/material/msdf_text.js +3 -3
  57. package/dist/material/msdf_text.js.map +1 -1
  58. package/dist/material/mtoon.js +574 -0
  59. package/dist/material/mtoon.js.map +1 -0
  60. package/dist/material/pbrblueprint.js +499 -336
  61. package/dist/material/pbrblueprint.js.map +1 -1
  62. package/dist/material/pbrmr.js +118 -100
  63. package/dist/material/pbrmr.js.map +1 -1
  64. package/dist/material/pbrsg.js +1 -1
  65. package/dist/material/pbrsg.js.map +1 -1
  66. package/dist/material/shader/helper.js +324 -294
  67. package/dist/material/shader/helper.js.map +1 -1
  68. package/dist/material/subsurfaceprofile.js +812 -0
  69. package/dist/material/subsurfaceprofile.js.map +1 -0
  70. package/dist/material/unlit.js +1 -1
  71. package/dist/material/unlit.js.map +1 -1
  72. package/dist/posteffect/compositor.js +46 -11
  73. package/dist/posteffect/compositor.js.map +1 -1
  74. package/dist/posteffect/ssr.js +422 -96
  75. package/dist/posteffect/ssr.js.map +1 -1
  76. package/dist/posteffect/sss.js +1053 -0
  77. package/dist/posteffect/sss.js.map +1 -0
  78. package/dist/posteffect/taa.js +61 -60
  79. package/dist/posteffect/taa.js.map +1 -1
  80. package/dist/render/abuffer_oit.js +63 -12
  81. package/dist/render/abuffer_oit.js.map +1 -1
  82. package/dist/render/cluster_light.js +6 -5
  83. package/dist/render/cluster_light.js.map +1 -1
  84. package/dist/render/drawable.js +1 -5
  85. package/dist/render/drawable.js.map +1 -1
  86. package/dist/render/drawable_mixin.js +2 -1
  87. package/dist/render/drawable_mixin.js.map +1 -1
  88. package/dist/render/fbm_wavegenerator.js +2 -1
  89. package/dist/render/fbm_wavegenerator.js.map +1 -1
  90. package/dist/render/gerstner_wavegenerator.js +2 -1
  91. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  92. package/dist/render/globalbindgroup_allocator.js +2 -1
  93. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  94. package/dist/render/lightpass.js +110 -23
  95. package/dist/render/lightpass.js.map +1 -1
  96. package/dist/render/render_queue.js +51 -8
  97. package/dist/render/render_queue.js.map +1 -1
  98. package/dist/render/renderer.js +80 -66
  99. package/dist/render/renderer.js.map +1 -1
  100. package/dist/render/rendergraph/device_pool_allocator.js +8 -0
  101. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  102. package/dist/render/rendergraph/forward_plus_builder.js +481 -95
  103. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  104. package/dist/render/rendergraph/history_resource_manager.js +55 -0
  105. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  106. package/dist/render/rendergraph/history_resources.js +3 -1
  107. package/dist/render/rendergraph/history_resources.js.map +1 -1
  108. package/dist/render/rendergraph/types.js.map +1 -1
  109. package/dist/render/renderpass.js +10 -4
  110. package/dist/render/renderpass.js.map +1 -1
  111. package/dist/render/sky.js +31 -1
  112. package/dist/render/sky.js.map +1 -1
  113. package/dist/render/weightedblended_oit.js +23 -5
  114. package/dist/render/weightedblended_oit.js.map +1 -1
  115. package/dist/scene/basesprite.js +4 -2
  116. package/dist/scene/basesprite.js.map +1 -1
  117. package/dist/scene/batchgroup.js +3 -1
  118. package/dist/scene/batchgroup.js.map +1 -1
  119. package/dist/scene/environment.js +11 -1
  120. package/dist/scene/environment.js.map +1 -1
  121. package/dist/scene/light.js +21 -3
  122. package/dist/scene/light.js.map +1 -1
  123. package/dist/scene/mesh.js +29 -14
  124. package/dist/scene/mesh.js.map +1 -1
  125. package/dist/scene/meshdrawable.js +6 -0
  126. package/dist/scene/meshdrawable.js.map +1 -1
  127. package/dist/scene/msdftext.js +5 -2
  128. package/dist/scene/msdftext.js.map +1 -1
  129. package/dist/scene/msdftextsprite.js +5 -3
  130. package/dist/scene/msdftextsprite.js.map +1 -1
  131. package/dist/scene/particlesys.js +3 -1
  132. package/dist/scene/particlesys.js.map +1 -1
  133. package/dist/scene/scene.js +6 -5
  134. package/dist/scene/scene.js.map +1 -1
  135. package/dist/scene/terrain-cm/grass.js +4 -2
  136. package/dist/scene/terrain-cm/grass.js.map +1 -1
  137. package/dist/scene/terrain-cm/grassmaterial.js +2 -1
  138. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  139. package/dist/scene/terrain-cm/terrain-cm.js +4 -2
  140. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  141. package/dist/scene/water.js +4 -2
  142. package/dist/scene/water.js.map +1 -1
  143. package/dist/shaders/shadow.js +26 -393
  144. package/dist/shaders/shadow.js.map +1 -1
  145. package/dist/shadow/esm.js +112 -12
  146. package/dist/shadow/esm.js.map +1 -1
  147. package/dist/shadow/pcf_opt.js +2 -2
  148. package/dist/shadow/pcf_opt.js.map +1 -1
  149. package/dist/shadow/pcf_pd.js +19 -10
  150. package/dist/shadow/pcf_pd.js.map +1 -1
  151. package/dist/shadow/shader.js +58 -7
  152. package/dist/shadow/shader.js.map +1 -1
  153. package/dist/shadow/shadow_impl.js +6 -0
  154. package/dist/shadow/shadow_impl.js.map +1 -1
  155. package/dist/shadow/shadow_region.js +229 -0
  156. package/dist/shadow/shadow_region.js.map +1 -0
  157. package/dist/shadow/shadowmapper.js +67 -59
  158. package/dist/shadow/shadowmapper.js.map +1 -1
  159. package/dist/shadow/vsm.js +45 -19
  160. package/dist/shadow/vsm.js.map +1 -1
  161. package/dist/text/font/cff_font.js +890 -0
  162. package/dist/text/font/cff_font.js.map +1 -0
  163. package/dist/text/font/font_asset.js +17 -3
  164. package/dist/text/font/font_asset.js.map +1 -1
  165. package/dist/utility/blueprint/common/constants.js +8 -8
  166. package/dist/utility/blueprint/common/constants.js.map +1 -1
  167. package/dist/utility/blueprint/material/pbr.js +31 -4
  168. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  169. package/dist/utility/blueprint/material/texture.js +1 -17
  170. package/dist/utility/blueprint/material/texture.js.map +1 -1
  171. package/dist/utility/serialization/manager.js +327 -359
  172. package/dist/utility/serialization/manager.js.map +1 -1
  173. package/dist/utility/serialization/scene/animation.js +5 -2
  174. package/dist/utility/serialization/scene/animation.js.map +1 -1
  175. package/dist/utility/serialization/scene/batch.js +4 -1
  176. package/dist/utility/serialization/scene/batch.js.map +1 -1
  177. package/dist/utility/serialization/scene/camera.js +249 -54
  178. package/dist/utility/serialization/scene/camera.js.map +1 -1
  179. package/dist/utility/serialization/scene/common.js +37 -1
  180. package/dist/utility/serialization/scene/common.js.map +1 -1
  181. package/dist/utility/serialization/scene/light.js +42 -3
  182. package/dist/utility/serialization/scene/light.js.map +1 -1
  183. package/dist/utility/serialization/scene/material.js +1112 -646
  184. package/dist/utility/serialization/scene/material.js.map +1 -1
  185. package/dist/utility/serialization/scene/mesh.js +7 -4
  186. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  187. package/dist/utility/serialization/scene/node.js +31 -12
  188. package/dist/utility/serialization/scene/node.js.map +1 -1
  189. package/dist/utility/serialization/scene/particle.js +4 -1
  190. package/dist/utility/serialization/scene/particle.js.map +1 -1
  191. package/dist/utility/serialization/scene/primitive.js +3 -1
  192. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  193. package/dist/utility/serialization/scene/scene.js +18 -0
  194. package/dist/utility/serialization/scene/scene.js.map +1 -1
  195. package/dist/utility/serialization/scene/sprite.js +6 -3
  196. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  197. package/dist/utility/serialization/scene/terrain.js +5 -2
  198. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  199. package/dist/utility/serialization/scene/text.js +3 -1
  200. package/dist/utility/serialization/scene/text.js.map +1 -1
  201. package/dist/utility/serialization/scene/water.js +4 -1
  202. package/dist/utility/serialization/scene/water.js.map +1 -1
  203. package/dist/utility/textures/ltcdata.js +6 -0
  204. package/dist/utility/textures/ltcdata.js.map +1 -0
  205. package/dist/utility/textures/ltclut.js +61 -0
  206. package/dist/utility/textures/ltclut.js.map +1 -0
  207. package/dist/values.js +9 -1
  208. package/dist/values.js.map +1 -1
  209. package/package.json +3 -3
  210. package/dist/animation/ik/ik_chain_builder.js +0 -68
  211. package/dist/animation/ik/ik_chain_builder.js.map +0 -1
  212. package/dist/animation/ik/ik_pole_constraint.js +0 -123
  213. package/dist/animation/ik/ik_pole_constraint.js.map +0 -1
  214. package/dist/animation/ik/ik_track.js +0 -96
  215. package/dist/animation/ik/ik_track.js.map +0 -1
  216. package/dist/animation/ik_postprocessor.js +0 -71
  217. package/dist/animation/ik_postprocessor.js.map +0 -1
  218. package/dist/animation/joint_dynamics/math.js +0 -16
  219. package/dist/animation/joint_dynamics/math.js.map +0 -1
  220. package/dist/animation/manual_transform_processor.js +0 -156
  221. package/dist/animation/manual_transform_processor.js.map +0 -1
  222. package/dist/animation/skeleton_postprocessor.js +0 -50
  223. package/dist/animation/skeleton_postprocessor.js.map +0 -1
  224. package/dist/animation/spring2/collision.js +0 -469
  225. package/dist/animation/spring2/collision.js.map +0 -1
  226. package/dist/animation/spring2/constraints.js +0 -329
  227. package/dist/animation/spring2/constraints.js.map +0 -1
  228. package/dist/animation/spring2/controller.js +0 -434
  229. package/dist/animation/spring2/controller.js.map +0 -1
  230. package/dist/animation/spring2/math.js +0 -16
  231. package/dist/animation/spring2/math.js.map +0 -1
  232. package/dist/animation/spring2/solver.js +0 -624
  233. package/dist/animation/spring2/solver.js.map +0 -1
  234. package/dist/animation/spring2/spring_system.js +0 -118
  235. package/dist/animation/spring2/spring_system.js.map +0 -1
  236. package/dist/animation/spring2/types.js +0 -19
  237. package/dist/animation/spring2/types.js.map +0 -1
  238. package/dist/animation/spring_postprocessor.js +0 -54
  239. package/dist/animation/spring_postprocessor.js.map +0 -1
  240. package/dist/asset/loaders/gltf/gltf_loader.js +0 -1276
  241. package/dist/asset/loaders/gltf/gltf_loader.js.map +0 -1
  242. package/dist/asset/loaders/gltf/helpers.js +0 -331
  243. package/dist/asset/loaders/gltf/helpers.js.map +0 -1
  244. package/dist/material/sprite3d.js +0 -301
  245. package/dist/material/sprite3d.js.map +0 -1
  246. package/dist/material/sprite3d_std.js +0 -116
  247. package/dist/material/sprite3d_std.js.map +0 -1
  248. package/dist/material/sprite3dblueprint.js +0 -235
  249. package/dist/material/sprite3dblueprint.js.map +0 -1
  250. package/dist/material/sprite_sdf.js +0 -106
  251. package/dist/material/sprite_sdf.js.map +0 -1
  252. package/dist/material/terrainmaterial.js +0 -368
  253. package/dist/material/terrainmaterial.js.map +0 -1
  254. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
  255. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
  256. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
  257. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
  258. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
  259. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
  260. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
  261. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
  262. package/dist/render/deferredlightpass.js +0 -510
  263. package/dist/render/deferredlightpass.js.map +0 -1
  264. package/dist/render/deferredshadowlightpass.js +0 -428
  265. package/dist/render/deferredshadowlightpass.js.map +0 -1
  266. package/dist/render/gbufferpass.js +0 -50
  267. package/dist/render/gbufferpass.js.map +0 -1
  268. package/dist/scene/sdftextsprite.js +0 -322
  269. package/dist/scene/sdftextsprite.js.map +0 -1
  270. package/dist/scene/sprite3d.js +0 -18
  271. package/dist/scene/sprite3d.js.map +0 -1
  272. package/dist/scene/terrain/grass.js +0 -280
  273. package/dist/scene/terrain/grass.js.map +0 -1
  274. package/dist/scene/terrain/heightfield.js +0 -475
  275. package/dist/scene/terrain/heightfield.js.map +0 -1
  276. package/dist/scene/terrain/patch.js +0 -532
  277. package/dist/scene/terrain/patch.js.map +0 -1
  278. package/dist/scene/terrain/quadtree.js +0 -461
  279. package/dist/scene/terrain/quadtree.js.map +0 -1
  280. package/dist/scene/terrain/terrain.js +0 -231
  281. package/dist/scene/terrain/terrain.js.map +0 -1
  282. package/dist/src/animation/animation.js +0 -127
  283. package/dist/src/animation/animation.js.map +0 -1
  284. package/dist/src/animation/animationset.js +0 -255
  285. package/dist/src/animation/animationset.js.map +0 -1
  286. package/dist/src/animation/animationtrack.js +0 -34
  287. package/dist/src/animation/animationtrack.js.map +0 -1
  288. package/dist/src/animation/eulerrotationtrack.js +0 -52
  289. package/dist/src/animation/eulerrotationtrack.js.map +0 -1
  290. package/dist/src/animation/morphtarget.js +0 -93
  291. package/dist/src/animation/morphtarget.js.map +0 -1
  292. package/dist/src/animation/morphtrack.js +0 -70
  293. package/dist/src/animation/morphtrack.js.map +0 -1
  294. package/dist/src/animation/proptrack.js +0 -161
  295. package/dist/src/animation/proptrack.js.map +0 -1
  296. package/dist/src/animation/rotationtrack.js +0 -51
  297. package/dist/src/animation/rotationtrack.js.map +0 -1
  298. package/dist/src/animation/scaletrack.js +0 -50
  299. package/dist/src/animation/scaletrack.js.map +0 -1
  300. package/dist/src/animation/skeleton.js +0 -204
  301. package/dist/src/animation/skeleton.js.map +0 -1
  302. package/dist/src/animation/translationtrack.js +0 -50
  303. package/dist/src/animation/translationtrack.js.map +0 -1
  304. package/dist/src/app/app.js +0 -129
  305. package/dist/src/app/app.js.map +0 -1
  306. package/dist/src/app/inputmgr.js +0 -267
  307. package/dist/src/app/inputmgr.js.map +0 -1
  308. package/dist/src/asset/assetmanager.js +0 -404
  309. package/dist/src/asset/assetmanager.js.map +0 -1
  310. package/dist/src/asset/builtin.js +0 -337
  311. package/dist/src/asset/builtin.js.map +0 -1
  312. package/dist/src/asset/loaders/dds/dds.js +0 -470
  313. package/dist/src/asset/loaders/dds/dds.js.map +0 -1
  314. package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
  315. package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
  316. package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
  317. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
  318. package/dist/src/asset/loaders/gltf/helpers.js +0 -327
  319. package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
  320. package/dist/src/asset/loaders/hdr/hdr.js +0 -180
  321. package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
  322. package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
  323. package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
  324. package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
  325. package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
  326. package/dist/src/asset/loaders/loader.js +0 -45
  327. package/dist/src/asset/loaders/loader.js.map +0 -1
  328. package/dist/src/asset/model.js +0 -414
  329. package/dist/src/asset/model.js.map +0 -1
  330. package/dist/src/blitter/bilateralblur.js +0 -221
  331. package/dist/src/blitter/bilateralblur.js.map +0 -1
  332. package/dist/src/blitter/blitter.js +0 -390
  333. package/dist/src/blitter/blitter.js.map +0 -1
  334. package/dist/src/blitter/box.js +0 -118
  335. package/dist/src/blitter/box.js.map +0 -1
  336. package/dist/src/blitter/copy.js +0 -22
  337. package/dist/src/blitter/copy.js.map +0 -1
  338. package/dist/src/blitter/gaussianblur.js +0 -228
  339. package/dist/src/blitter/gaussianblur.js.map +0 -1
  340. package/dist/src/camera/base.js +0 -92
  341. package/dist/src/camera/base.js.map +0 -1
  342. package/dist/src/camera/camera.js +0 -1005
  343. package/dist/src/camera/camera.js.map +0 -1
  344. package/dist/src/camera/fps.js +0 -238
  345. package/dist/src/camera/fps.js.map +0 -1
  346. package/dist/src/camera/orbit.js +0 -245
  347. package/dist/src/camera/orbit.js.map +0 -1
  348. package/dist/src/camera/orthocamera.js +0 -167
  349. package/dist/src/camera/orthocamera.js.map +0 -1
  350. package/dist/src/camera/perspectivecamera.js +0 -141
  351. package/dist/src/camera/perspectivecamera.js.map +0 -1
  352. package/dist/src/index.js +0 -120
  353. package/dist/src/index.js.map +0 -1
  354. package/dist/src/material/blinn.js +0 -81
  355. package/dist/src/material/blinn.js.map +0 -1
  356. package/dist/src/material/grassmaterial.js +0 -113
  357. package/dist/src/material/grassmaterial.js.map +0 -1
  358. package/dist/src/material/lambert.js +0 -92
  359. package/dist/src/material/lambert.js.map +0 -1
  360. package/dist/src/material/material.js +0 -301
  361. package/dist/src/material/material.js.map +0 -1
  362. package/dist/src/material/meshmaterial.js +0 -704
  363. package/dist/src/material/meshmaterial.js.map +0 -1
  364. package/dist/src/material/mixins/albedocolor.js +0 -76
  365. package/dist/src/material/mixins/albedocolor.js.map +0 -1
  366. package/dist/src/material/mixins/foliage.js +0 -47
  367. package/dist/src/material/mixins/foliage.js.map +0 -1
  368. package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
  369. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
  370. package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
  371. package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
  372. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
  373. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
  374. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
  375. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
  376. package/dist/src/material/mixins/lit.js +0 -476
  377. package/dist/src/material/mixins/lit.js.map +0 -1
  378. package/dist/src/material/mixins/pbr/common.js +0 -918
  379. package/dist/src/material/mixins/pbr/common.js.map +0 -1
  380. package/dist/src/material/mixins/texture.js +0 -172
  381. package/dist/src/material/mixins/texture.js.map +0 -1
  382. package/dist/src/material/mixins/vertexcolor.js +0 -56
  383. package/dist/src/material/mixins/vertexcolor.js.map +0 -1
  384. package/dist/src/material/particle.js +0 -178
  385. package/dist/src/material/particle.js.map +0 -1
  386. package/dist/src/material/pbrmr.js +0 -97
  387. package/dist/src/material/pbrmr.js.map +0 -1
  388. package/dist/src/material/pbrsg.js +0 -97
  389. package/dist/src/material/pbrsg.js.map +0 -1
  390. package/dist/src/material/shader/helper.js +0 -1209
  391. package/dist/src/material/shader/helper.js.map +0 -1
  392. package/dist/src/material/terrain-cm.js +0 -606
  393. package/dist/src/material/terrain-cm.js.map +0 -1
  394. package/dist/src/material/terrainmaterial.js +0 -375
  395. package/dist/src/material/terrainmaterial.js.map +0 -1
  396. package/dist/src/material/unlit.js +0 -41
  397. package/dist/src/material/unlit.js.map +0 -1
  398. package/dist/src/material/water.js +0 -417
  399. package/dist/src/material/water.js.map +0 -1
  400. package/dist/src/posteffect/bloom.js +0 -361
  401. package/dist/src/posteffect/bloom.js.map +0 -1
  402. package/dist/src/posteffect/compositor.js +0 -226
  403. package/dist/src/posteffect/compositor.js.map +0 -1
  404. package/dist/src/posteffect/fxaa.js +0 -273
  405. package/dist/src/posteffect/fxaa.js.map +0 -1
  406. package/dist/src/posteffect/grayscale.js +0 -69
  407. package/dist/src/posteffect/grayscale.js.map +0 -1
  408. package/dist/src/posteffect/motionblur.js +0 -96
  409. package/dist/src/posteffect/motionblur.js.map +0 -1
  410. package/dist/src/posteffect/posteffect.js +0 -126
  411. package/dist/src/posteffect/posteffect.js.map +0 -1
  412. package/dist/src/posteffect/sao.js +0 -324
  413. package/dist/src/posteffect/sao.js.map +0 -1
  414. package/dist/src/posteffect/ssr.js +0 -489
  415. package/dist/src/posteffect/ssr.js.map +0 -1
  416. package/dist/src/posteffect/taa.js +0 -172
  417. package/dist/src/posteffect/taa.js.map +0 -1
  418. package/dist/src/posteffect/tonemap.js +0 -94
  419. package/dist/src/posteffect/tonemap.js.map +0 -1
  420. package/dist/src/render/abuffer_oit.js +0 -361
  421. package/dist/src/render/abuffer_oit.js.map +0 -1
  422. package/dist/src/render/clipmap.js +0 -851
  423. package/dist/src/render/clipmap.js.map +0 -1
  424. package/dist/src/render/cluster_light.js +0 -333
  425. package/dist/src/render/cluster_light.js.map +0 -1
  426. package/dist/src/render/cull_visitor.js +0 -187
  427. package/dist/src/render/cull_visitor.js.map +0 -1
  428. package/dist/src/render/depthpass.js +0 -68
  429. package/dist/src/render/depthpass.js.map +0 -1
  430. package/dist/src/render/drawable_mixin.js +0 -227
  431. package/dist/src/render/drawable_mixin.js.map +0 -1
  432. package/dist/src/render/envlight.js +0 -463
  433. package/dist/src/render/envlight.js.map +0 -1
  434. package/dist/src/render/fbm_wavegenerator.js +0 -251
  435. package/dist/src/render/fbm_wavegenerator.js.map +0 -1
  436. package/dist/src/render/fft_wavegenerator.js +0 -1006
  437. package/dist/src/render/fft_wavegenerator.js.map +0 -1
  438. package/dist/src/render/fullscreenquad.js +0 -38
  439. package/dist/src/render/fullscreenquad.js.map +0 -1
  440. package/dist/src/render/gerstner_wavegenerator.js +0 -314
  441. package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
  442. package/dist/src/render/globalbindgroup_allocator.js +0 -60
  443. package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
  444. package/dist/src/render/hzb.js +0 -273
  445. package/dist/src/render/hzb.js.map +0 -1
  446. package/dist/src/render/lightpass.js +0 -172
  447. package/dist/src/render/lightpass.js.map +0 -1
  448. package/dist/src/render/objectcolorpass.js +0 -51
  449. package/dist/src/render/objectcolorpass.js.map +0 -1
  450. package/dist/src/render/primitive.js +0 -364
  451. package/dist/src/render/primitive.js.map +0 -1
  452. package/dist/src/render/render_queue.js +0 -467
  453. package/dist/src/render/render_queue.js.map +0 -1
  454. package/dist/src/render/renderbundle_wrapper.js +0 -152
  455. package/dist/src/render/renderbundle_wrapper.js.map +0 -1
  456. package/dist/src/render/renderer.js +0 -455
  457. package/dist/src/render/renderer.js.map +0 -1
  458. package/dist/src/render/renderpass.js +0 -200
  459. package/dist/src/render/renderpass.js.map +0 -1
  460. package/dist/src/render/shadowmap_pass.js +0 -56
  461. package/dist/src/render/shadowmap_pass.js.map +0 -1
  462. package/dist/src/render/sky.js +0 -1103
  463. package/dist/src/render/sky.js.map +0 -1
  464. package/dist/src/render/weightedblended_oit.js +0 -168
  465. package/dist/src/render/weightedblended_oit.js.map +0 -1
  466. package/dist/src/scene/batchgroup.js +0 -162
  467. package/dist/src/scene/batchgroup.js.map +0 -1
  468. package/dist/src/scene/environment.js +0 -209
  469. package/dist/src/scene/environment.js.map +0 -1
  470. package/dist/src/scene/graph_node.js +0 -72
  471. package/dist/src/scene/graph_node.js.map +0 -1
  472. package/dist/src/scene/light.js +0 -416
  473. package/dist/src/scene/light.js.map +0 -1
  474. package/dist/src/scene/mesh.js +0 -341
  475. package/dist/src/scene/mesh.js.map +0 -1
  476. package/dist/src/scene/octree.js +0 -649
  477. package/dist/src/scene/octree.js.map +0 -1
  478. package/dist/src/scene/particlesys.js +0 -738
  479. package/dist/src/scene/particlesys.js.map +0 -1
  480. package/dist/src/scene/raycast_visitor.js +0 -103
  481. package/dist/src/scene/raycast_visitor.js.map +0 -1
  482. package/dist/src/scene/scene.js +0 -284
  483. package/dist/src/scene/scene.js.map +0 -1
  484. package/dist/src/scene/scene_node.js +0 -732
  485. package/dist/src/scene/scene_node.js.map +0 -1
  486. package/dist/src/scene/terrain/grass.js +0 -278
  487. package/dist/src/scene/terrain/grass.js.map +0 -1
  488. package/dist/src/scene/terrain/heightfield.js +0 -475
  489. package/dist/src/scene/terrain/heightfield.js.map +0 -1
  490. package/dist/src/scene/terrain/patch.js +0 -530
  491. package/dist/src/scene/terrain/patch.js.map +0 -1
  492. package/dist/src/scene/terrain/quadtree.js +0 -461
  493. package/dist/src/scene/terrain/quadtree.js.map +0 -1
  494. package/dist/src/scene/terrain/terrain.js +0 -246
  495. package/dist/src/scene/terrain/terrain.js.map +0 -1
  496. package/dist/src/scene/terrain-cm/grass.js +0 -594
  497. package/dist/src/scene/terrain-cm/grass.js.map +0 -1
  498. package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
  499. package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
  500. package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
  501. package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
  502. package/dist/src/scene/water.js +0 -374
  503. package/dist/src/scene/water.js.map +0 -1
  504. package/dist/src/shaders/atmosphere.js +0 -957
  505. package/dist/src/shaders/atmosphere.js.map +0 -1
  506. package/dist/src/shaders/fog.js +0 -112
  507. package/dist/src/shaders/fog.js.map +0 -1
  508. package/dist/src/shaders/misc.js +0 -266
  509. package/dist/src/shaders/misc.js.map +0 -1
  510. package/dist/src/shaders/noise.js +0 -222
  511. package/dist/src/shaders/noise.js.map +0 -1
  512. package/dist/src/shaders/pbr.js +0 -51
  513. package/dist/src/shaders/pbr.js.map +0 -1
  514. package/dist/src/shaders/shadow.js +0 -636
  515. package/dist/src/shaders/shadow.js.map +0 -1
  516. package/dist/src/shaders/ssr.js +0 -490
  517. package/dist/src/shaders/ssr.js.map +0 -1
  518. package/dist/src/shaders/temporal.js +0 -215
  519. package/dist/src/shaders/temporal.js.map +0 -1
  520. package/dist/src/shaders/water.js +0 -756
  521. package/dist/src/shaders/water.js.map +0 -1
  522. package/dist/src/shadow/esm.js +0 -237
  523. package/dist/src/shadow/esm.js.map +0 -1
  524. package/dist/src/shadow/pcf_opt.js +0 -181
  525. package/dist/src/shadow/pcf_opt.js.map +0 -1
  526. package/dist/src/shadow/pcf_pd.js +0 -189
  527. package/dist/src/shadow/pcf_pd.js.map +0 -1
  528. package/dist/src/shadow/shader.js +0 -37
  529. package/dist/src/shadow/shader.js.map +0 -1
  530. package/dist/src/shadow/shadow_impl.js +0 -15
  531. package/dist/src/shadow/shadow_impl.js.map +0 -1
  532. package/dist/src/shadow/shadowmapper.js +0 -790
  533. package/dist/src/shadow/shadowmapper.js.map +0 -1
  534. package/dist/src/shadow/ssm.js +0 -159
  535. package/dist/src/shadow/ssm.js.map +0 -1
  536. package/dist/src/shadow/vsm.js +0 -297
  537. package/dist/src/shadow/vsm.js.map +0 -1
  538. package/dist/src/shapes/box.js +0 -386
  539. package/dist/src/shapes/box.js.map +0 -1
  540. package/dist/src/shapes/cylinder.js +0 -125
  541. package/dist/src/shapes/cylinder.js.map +0 -1
  542. package/dist/src/shapes/plane.js +0 -88
  543. package/dist/src/shapes/plane.js.map +0 -1
  544. package/dist/src/shapes/shape.js +0 -87
  545. package/dist/src/shapes/shape.js.map +0 -1
  546. package/dist/src/shapes/sphere.js +0 -114
  547. package/dist/src/shapes/sphere.js.map +0 -1
  548. package/dist/src/shapes/tetrahedron.js +0 -188
  549. package/dist/src/shapes/tetrahedron.js.map +0 -1
  550. package/dist/src/shapes/torus.js +0 -111
  551. package/dist/src/shapes/torus.js.map +0 -1
  552. package/dist/src/utility/aabbtree.js +0 -400
  553. package/dist/src/utility/aabbtree.js.map +0 -1
  554. package/dist/src/utility/bounding_volume.js +0 -29
  555. package/dist/src/utility/bounding_volume.js.map +0 -1
  556. package/dist/src/utility/debug.js +0 -28
  557. package/dist/src/utility/debug.js.map +0 -1
  558. package/dist/src/utility/draco/decoder.js +0 -116
  559. package/dist/src/utility/draco/decoder.js.map +0 -1
  560. package/dist/src/utility/misc.js +0 -105
  561. package/dist/src/utility/misc.js.map +0 -1
  562. package/dist/src/utility/panorama.js +0 -163
  563. package/dist/src/utility/panorama.js.map +0 -1
  564. package/dist/src/utility/pmrem.js +0 -354
  565. package/dist/src/utility/pmrem.js.map +0 -1
  566. package/dist/src/utility/rendermipmap.js +0 -115
  567. package/dist/src/utility/rendermipmap.js.map +0 -1
  568. package/dist/src/utility/serialization/json.js +0 -402
  569. package/dist/src/utility/serialization/json.js.map +0 -1
  570. package/dist/src/utility/serialization/manager.js +0 -623
  571. package/dist/src/utility/serialization/manager.js.map +0 -1
  572. package/dist/src/utility/serialization/scene/animation.js +0 -248
  573. package/dist/src/utility/serialization/scene/animation.js.map +0 -1
  574. package/dist/src/utility/serialization/scene/batch.js +0 -59
  575. package/dist/src/utility/serialization/scene/batch.js.map +0 -1
  576. package/dist/src/utility/serialization/scene/camera.js +0 -790
  577. package/dist/src/utility/serialization/scene/camera.js.map +0 -1
  578. package/dist/src/utility/serialization/scene/common.js +0 -222
  579. package/dist/src/utility/serialization/scene/common.js.map +0 -1
  580. package/dist/src/utility/serialization/scene/light.js +0 -575
  581. package/dist/src/utility/serialization/scene/light.js.map +0 -1
  582. package/dist/src/utility/serialization/scene/material.js +0 -1111
  583. package/dist/src/utility/serialization/scene/material.js.map +0 -1
  584. package/dist/src/utility/serialization/scene/mesh.js +0 -148
  585. package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
  586. package/dist/src/utility/serialization/scene/misc.js +0 -39
  587. package/dist/src/utility/serialization/scene/misc.js.map +0 -1
  588. package/dist/src/utility/serialization/scene/node.js +0 -451
  589. package/dist/src/utility/serialization/scene/node.js.map +0 -1
  590. package/dist/src/utility/serialization/scene/particle.js +0 -425
  591. package/dist/src/utility/serialization/scene/particle.js.map +0 -1
  592. package/dist/src/utility/serialization/scene/primitive.js +0 -692
  593. package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
  594. package/dist/src/utility/serialization/scene/scene.js +0 -704
  595. package/dist/src/utility/serialization/scene/scene.js.map +0 -1
  596. package/dist/src/utility/serialization/scene/terrain.js +0 -488
  597. package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
  598. package/dist/src/utility/serialization/scene/water.js +0 -465
  599. package/dist/src/utility/serialization/scene/water.js.map +0 -1
  600. package/dist/src/utility/shprojector.js +0 -297
  601. package/dist/src/utility/shprojector.js.map +0 -1
  602. package/dist/src/utility/textures/ggxlut.js +0 -213
  603. package/dist/src/utility/textures/ggxlut.js.map +0 -1
  604. package/dist/src/utility/textures/gradientnoise.js +0 -62
  605. package/dist/src/utility/textures/gradientnoise.js.map +0 -1
  606. package/dist/src/utility/textures/randomnoise.js +0 -41
  607. package/dist/src/utility/textures/randomnoise.js.map +0 -1
  608. package/dist/src/values.js +0 -162
  609. package/dist/src/values.js.map +0 -1
  610. package/dist/utility/blueprint/material/common.js +0 -7
  611. package/dist/utility/blueprint/material/common.js.map +0 -1
  612. package/dist/utility/serialization/blueprint/constants.js +0 -255
  613. package/dist/utility/serialization/blueprint/constants.js.map +0 -1
  614. package/dist/utility/serialization/blueprint/material/constants.js +0 -203
  615. package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
  616. package/dist/utility/serialization/blueprint/material/texture.js +0 -165
  617. package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
  618. package/dist/utility/serialization/scene/cloth_script.js +0 -834
  619. package/dist/utility/serialization/scene/cloth_script.js.map +0 -1
  620. package/dist/utility/serialization/scene/spring_script.js +0 -596
  621. package/dist/utility/serialization/scene/spring_script.js.map +0 -1
@@ -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 type { RenderQueue } 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\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\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}\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 return {\r\n depthPrepass: true,\r\n motionVectors: deviceType !== 'webgl' && (camera.TAA || camera.motionBlur),\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: renderQueue.needSceneColor()\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\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\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 // ── 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 hiZHandle = builder.createTexture({ format: 'r32f', label: 'hiZ', mipLevels: 10 });\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 lightPassResult = graph.addPass('LightPass', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\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 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 const sceneColorCopyFramebufferHandle = sceneColorCopyHandle\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 renderMainLightPass(\r\n frame,\r\n sceneColorTex,\r\n sceneColorCopyTex,\r\n rgCtx,\r\n sceneColorFramebufferHandle,\r\n sceneColorCopyFramebufferHandle\r\n );\r\n });\r\n\r\n return { sceneColorHandle, sceneColorCopyHandle, sceneColorFramebufferHandle };\r\n });\r\n\r\n const sceneColorHandle = lightPassResult.sceneColorHandle;\r\n const historyManager = ctx.camera?.getHistoryResourceManager?.() ?? null;\r\n const historyReadBindings: HistoryReadBinding[] = [];\r\n if (historyManager && ctx.camera?.TAA && options.motionVectors) {\r\n const historySize = { width: ctx.renderWidth, height: ctx.renderHeight };\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 historyReadBindings.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 // 8. Transmission depth pass (optional)\r\n let transmissionDepthToken: RGHandle | undefined;\r\n if (options.needSceneColor) {\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 historyReadBindings) {\r\n builder.read(binding.handle);\r\n }\r\n const outputBackbuffer = builder.write(backbuffer);\r\n builder.setExecute((rgCtx) => {\r\n if (historyManager && historyReadBindings.length > 0) {\r\n historyManager.beginReadScope(\r\n historyReadBindings.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 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 // 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\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 if (depthTex === ctx.finalFramebuffer?.getDepthAttachment()) {\r\n ctx.intermediateFramebuffer = ctx.finalFramebuffer;\r\n } else if (sceneColorFramebufferHandle) {\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: 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 if (ctx.SSR && !renderQueue.needSceneColor()) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n }\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\r\n // Use RenderGraph-allocated sceneColorCopy texture\r\n const sceneColorFramebuffer =\r\n sceneColorCopyFramebufferHandle && !(ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS)\r\n ? rgCtx.getFramebuffer<FrameBuffer>(sceneColorCopyFramebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\r\n width: sceneColorCopyTex.width,\r\n height: sceneColorCopyTex.height,\r\n colorAttachments:\r\n ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS\r\n ? [\r\n sceneColorCopyTex,\r\n device.getFramebuffer()!.getColorAttachments()[1]!,\r\n device.getFramebuffer()!.getColorAttachments()[2]!\r\n ]\r\n : sceneColorCopyTex,\r\n depthAttachment: 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 _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n if (sceneColorStatePushed) {\r\n device.popDeviceStates();\r\n }\r\n ctx.compositor = compositor;\r\n }\r\n ctx.sceneColorTexture = sceneColorCopyTex;\r\n new CopyBlitter().blit(\r\n ctx.sceneColorTexture,\r\n device.getFramebuffer() ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\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\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\r\n // Cull scene first (needed to derive options)\r\n const renderQueue = _scenePass.cullScene(ctx, ctx.camera);\r\n\r\n const options = deriveForwardPlusOptions(ctx.scene, ctx.camera, device.type, renderQueue);\r\n\r\n // Ensure the camera has a history resource manager for temporal effects (TAA, motion blur)\r\n let 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\r\n const { backbuffer, frame } = buildForwardPlusGraphInternal(graph, ctx, renderQueue, options);\r\n\r\n const compiled = graph.compile([backbuffer]);\r\n\r\n // Use RenderGraphExecutor for automatic resource management\r\n const 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(backbuffer, backbufferTex);\r\n }\r\n historyManager.bindImportedTextures(executor);\r\n\r\n try {\r\n executor.execute(compiled);\r\n historyManager.commitFrame();\r\n } finally {\r\n historyManager.discardFrame();\r\n cleanupFrame(frame);\r\n executor.reset();\r\n }\r\n}\r\n"],"names":["_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_clusters","_devicePoolAllocator","DevicePoolAllocator","_backDepthColorState","_frontDepthColorState","getClusteredLight","length","pop","ClusteredLight","freeClusteredLight","cl","push","deriveForwardPlusOptions","scene","camera","deviceType","renderQueue","ssr","SSR","env","light","envLight","hasRadiance","depthPrepass","motionVectors","TAA","motionBlur","hiZ","HiZ","ssrCalcThickness","gpuPicking","getPickResultResolveFunc","needSceneColor","buildForwardPlusGraph","graph","ctx","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","shadowedLights","renderShadowMaps","depthPassResult","format","device","type","SSRCalcThickness","mvFormat","depthHandle","createTexture","label","motionVectorHandle","undefined","finalDepthAttachment","finalFramebuffer","getDepthAttachment","externalDepthAttachment","isTexture2D","graphDepthAttachmentHandle","depthFormat","depthAttachmentOrFormat","depthFramebufferHandle","createFramebuffer","width","renderWidth","height","renderHeight","colorAttachments","depthAttachment","ignoreDepthStencil","skyMotionVectorFramebufferHandle","addSubpass","rgCtx","getFramebuffer","renderSceneDepth","renderSkyMotionVectors","renderDepthAttachment","hiZHandle","mipLevels","hiZFramebufferHandle","depthTex","hiZTex","getTexture","HiZFrameBuffer","buildHiZ","HiZTexture","lightPassResult","sceneColorHandle","colorFormat","sceneColorCopyHandle","useFinalFramebufferAsIntermediate","sceneColorFramebufferHandle","sceneColorCopyFramebufferHandle","sceneColorTex","sceneColorCopyTex","renderMainLightPass","historyManager","getHistoryResourceManager","historyReadBindings","historySize","colorHistoryHandle","importPreviousIfCompatible","RGHistoryResources","TAA_COLOR","sizeMode","motionVectorHistoryHandle","TAA_MOTION_VECTOR","name","handle","transmissionDepthToken","renderTransmissionDepthPass","presentedBackbuffer","binding","outputBackbuffer","write","beginReadScope","map","texture","renderComposite","endReadScope","lights","renderPass","pushDeviceStates","shadow","render","popDeviceStates","releaseIntermediateFramebuffer","intermediateFramebuffer","releaseDepthFramebuffer","disposeRenderQueue","dispose","releaseClusteredLight","restoreSunLight","sunLight","color","cleanupFrame","existingDepthFb","motionVectorTex","transmissionOverride","transmission","originDepth","setFramebuffer","encodeDepth","getColorAttachments","clearColor","Vector4","clearDepth","clearStencil","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","motionVectorTexture","linearDepthTexture","depthTexture","_skyMVProgram","_skyMVBindGroup","_skyMVBox","framebufferHandle","fb","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","add","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","w","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","createBindGroup","bindGroupLayouts","BoxShape","size","needNormal","needUV","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","draw","setViewport","setScissor","materialFlags","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","compositor","begin","sceneColorFramebuffer","sceneColorStatePushed","sceneColorTexture","CopyBlitter","blit","fetchSampler","drawPostEffects","PostEffectLayer","end","blitter","srgbOut","srcTex","executeForwardPlusGraph","RenderGraph","cullScene","HistoryResourceManager","setHistoryResourceManager","beginFrame","compiled","compile","executor","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\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","buildForwardPlusGraphInternal","graph","options","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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"}
@@ -25,6 +25,7 @@
25
25
  _pendingImports = new Map();
26
26
  _pendingCommits = new Map();
27
27
  _readScopeStack = [];
28
+ _frameActive = false;
28
29
  /**
29
30
  * Create a new history resource manager.
30
31
  *
@@ -50,6 +51,21 @@
50
51
  throw new Error(`History resource '${name}' is not available in the current render graph read scope. ` + `Import it and declare a pass read before accessing it.`);
51
52
  }
52
53
  /**
54
+ * Try to get a previous-frame texture from the current render graph read scope.
55
+ *
56
+ * Returns null when the resource was not imported for the current pass.
57
+ *
58
+ * @param name - Name of the history resource.
59
+ * @returns The scoped previous-frame texture, or null.
60
+ */ tryGetPrevious(name) {
61
+ return this._getScopedRead(name);
62
+ }
63
+ /**
64
+ * Whether this manager is currently collecting imports/commits for a graph frame.
65
+ */ get frameActive() {
66
+ return this._frameActive;
67
+ }
68
+ /**
53
69
  * Check whether a valid history resource exists and matches the descriptor.
54
70
  *
55
71
  * @param name - Name of the history resource.
@@ -66,6 +82,7 @@
66
82
  this.discardFrame();
67
83
  this._pendingImports.clear();
68
84
  this._readScopeStack.length = 0;
85
+ this._frameActive = true;
69
86
  }
70
87
  /**
71
88
  * Import the latest committed texture for a history resource into the graph.
@@ -153,6 +170,42 @@
153
170
  });
154
171
  }
155
172
  /**
173
+ * Queue a graph-produced texture as a current-frame history write.
174
+ *
175
+ * The allocator must retain the texture before the graph executor releases its
176
+ * transient reference. Use this from inside the pass that declares access to
177
+ * the handle being committed.
178
+ *
179
+ * @param name - History resource name.
180
+ * @param desc - Texture descriptor.
181
+ * @param size - Resolved texture size.
182
+ * @param ctx - Current render graph execute context.
183
+ * @param handle - Graph texture handle to commit.
184
+ * @returns The retained texture.
185
+ */ queueCommitFromGraph(name, desc, size, ctx, handle) {
186
+ const texture = ctx.getTexture(handle);
187
+ this.queueRetainedCommit(name, desc, size, texture);
188
+ return texture;
189
+ }
190
+ /**
191
+ * Queue a texture after retaining it through the allocator.
192
+ *
193
+ * Use this for textures produced by the graph allocator. The manager owns the
194
+ * retained reference and releases it when the history slot is overwritten,
195
+ * discarded, or disposed.
196
+ *
197
+ * @param name - History resource name.
198
+ * @param desc - Texture descriptor.
199
+ * @param size - Resolved texture size.
200
+ * @param texture - Texture to retain and commit.
201
+ */ queueRetainedCommit(name, desc, size, texture) {
202
+ if (!this._allocator.retain) {
203
+ throw new Error(`HistoryResourceManager: cannot retain history resource '${name}'. ` + `The allocator does not support retained graph texture handoff.`);
204
+ }
205
+ this._allocator.retain(texture);
206
+ this.queueCommit(name, desc, size, texture, true);
207
+ }
208
+ /**
156
209
  * Commit all current-frame history writes.
157
210
  */ commitFrame() {
158
211
  for (const [name, pending] of this._pendingCommits){
@@ -199,6 +252,7 @@
199
252
  this._pendingCommits.clear();
200
253
  this._pendingImports.clear();
201
254
  this._readScopeStack.length = 0;
255
+ this._frameActive = false;
202
256
  }
203
257
  /**
204
258
  * Discard all uncommitted frame history writes.
@@ -211,6 +265,7 @@
211
265
  this._pendingCommits.clear();
212
266
  this._pendingImports.clear();
213
267
  this._readScopeStack.length = 0;
268
+ this._frameActive = false;
214
269
  }
215
270
  /**
216
271
  * Release all history resources and clear the manager.