@woosh/meep-engine 3.11.2 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (551) hide show
  1. package/README.md +14 -18
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/SelectionVisualizer.js +127 -127
  4. package/editor/entity_world_bounds.js +27 -27
  5. package/editor/particles/rebuildParticleEmitter.js +31 -31
  6. package/editor/process/SymbolicDisplayProcess.js +1 -1
  7. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  8. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  9. package/editor/prototypeEditorShell.js +156 -156
  10. package/editor/selection/editor_pick.js +130 -130
  11. package/editor/selection/screen_rect_frustum.js +119 -119
  12. package/editor/tools/v2/TransformControls.js +971 -971
  13. package/package.json +1 -1
  14. package/src/engine/Engine.d.ts +3 -3
  15. package/src/engine/Engine.d.ts.map +1 -1
  16. package/src/engine/Engine.js +726 -726
  17. package/src/engine/EngineHarness.d.ts +1 -1
  18. package/src/engine/EngineHarness.js +590 -590
  19. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  21. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  23. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  24. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  25. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  26. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  27. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  29. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  30. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  31. package/src/engine/graphics/ecs/water/Water.js +104 -104
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  33. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  36. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  38. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  39. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  40. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  41. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  42. package/src/engine/graphics3/AnimationSystem.js +352 -0
  43. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  44. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  45. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  46. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  47. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  48. package/src/engine/graphics3/CameraSystem.js +170 -0
  49. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  50. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  51. package/src/engine/graphics3/CameraSystem3.js +6 -166
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  53. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  54. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  56. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  57. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  58. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  59. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  60. package/src/engine/graphics3/DecalSystem.js +441 -0
  61. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  62. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  63. package/src/engine/graphics3/DecalSystem3.js +6 -437
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  65. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  66. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  68. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  69. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  70. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  71. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  72. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  74. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  75. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  76. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  77. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  78. package/src/engine/graphics3/HighlightSystem.js +241 -0
  79. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  80. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  81. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  82. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  83. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  84. package/src/engine/graphics3/LightSystem.js +211 -0
  85. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  86. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  87. package/src/engine/graphics3/LightSystem3.js +6 -207
  88. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  89. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  90. package/src/engine/graphics3/MeshSystem.js +647 -0
  91. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  92. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  93. package/src/engine/graphics3/MeshSystem3.js +6 -642
  94. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  95. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  101. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  106. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  107. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  109. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  110. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  112. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  113. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  114. package/src/engine/graphics3/Pickable.d.ts +1 -1
  115. package/src/engine/graphics3/Pickable.js +65 -65
  116. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  117. package/src/engine/graphics3/PickingQuery.js +48 -48
  118. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  119. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  120. package/src/engine/graphics3/PickingSystem.js +273 -0
  121. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  122. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  123. package/src/engine/graphics3/PickingSystem3.js +6 -269
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  128. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  129. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  130. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  131. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  132. package/src/engine/graphics3/TerrainSystem.js +566 -0
  133. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  134. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  135. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  138. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  140. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  141. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  142. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  143. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  144. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  146. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  147. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  148. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  149. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  155. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  156. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  157. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  158. package/src/engine/graphics3/WaterSystem.js +293 -0
  159. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  160. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  161. package/src/engine/graphics3/WaterSystem3.js +6 -289
  162. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  163. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  164. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  165. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  166. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  167. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  169. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  172. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  175. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  176. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  177. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  178. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  180. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  182. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  183. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  184. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  185. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  186. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  187. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  188. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
  189. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
  190. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
  191. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
  192. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  193. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
  194. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
  195. package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
  196. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  197. package/src/shade/device/ShadeGPUCommandContext.js +994 -940
  198. package/src/shade/device/immediate_data_supported.d.ts +33 -0
  199. package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
  200. package/src/shade/device/immediate_data_supported.js +53 -0
  201. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
  202. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  203. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
  204. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
  205. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  206. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
  207. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  208. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
  209. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
  210. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
  211. package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
  212. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
  213. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  214. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
  215. package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
  216. package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
  217. package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
  218. package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
  219. package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
  220. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  221. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  222. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  223. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  224. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  225. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  226. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  227. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  228. package/src/shade/renderer/GraphicsContext.d.ts +9 -2
  229. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  230. package/src/shade/renderer/GraphicsContext.js +13 -1
  231. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  232. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  233. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  234. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  235. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  236. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  237. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  238. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  239. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  240. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  241. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  242. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  243. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  244. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  245. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  246. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  247. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  248. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  249. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  250. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  251. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  252. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  253. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  254. package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
  255. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
  256. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
  257. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
  258. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
  259. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
  260. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
  261. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
  262. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  263. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
  264. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
  265. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
  266. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
  267. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
  268. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  269. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
  270. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
  271. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  272. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
  273. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
  274. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  275. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
  276. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
  277. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
  278. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
  279. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
  280. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
  281. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
  282. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
  283. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
  284. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
  285. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
  286. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  287. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -84
  288. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  289. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
  290. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  291. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
  292. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  293. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  294. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  295. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  296. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  297. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  298. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  299. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  300. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  301. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  302. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  303. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  304. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  305. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  306. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  307. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  308. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  309. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  310. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  311. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  312. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  313. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  314. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  315. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  316. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  317. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  318. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  319. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  320. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  321. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  322. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  323. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  324. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  325. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  326. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  327. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  328. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  329. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  330. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  331. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  332. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  333. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +10 -9
  334. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  335. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  336. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  337. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  338. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  339. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  340. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  341. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  342. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  343. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  344. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  345. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  346. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  347. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  348. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  349. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  350. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  351. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  352. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  353. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  354. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  355. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  356. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  357. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  358. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  359. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  360. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  361. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  362. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  363. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  364. package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
  365. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  366. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  367. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  368. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  369. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  370. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  371. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  372. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  373. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  374. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  375. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  376. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  377. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  378. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
  380. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  382. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  384. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  385. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  386. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +57 -57
  387. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  388. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  389. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  390. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  391. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  392. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  393. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  394. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  395. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  396. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  397. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  398. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  399. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  400. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  401. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  402. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  403. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  404. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  405. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  406. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  407. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  408. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  409. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  410. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  411. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  412. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
  413. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  414. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  415. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  416. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  417. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  418. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  419. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  420. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
  421. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  422. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  423. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  424. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  425. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  426. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  427. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  428. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  429. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
  430. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  431. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  432. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  433. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  434. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  435. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  436. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  437. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  438. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  439. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  440. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  441. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  442. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  443. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  444. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  445. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  446. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  447. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  448. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  449. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  450. package/src/shade/renderer/shader/ComputeShader.js +350 -292
  451. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  452. package/src/shade/renderer/shader/ImageShader.js +217 -214
  453. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  454. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  455. package/src/shade/renderer/shader/ShaderDescriptor.js +46 -0
  456. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
  457. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
  458. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
  459. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
  460. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
  461. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
  462. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
  463. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
  464. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
  465. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
  466. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
  467. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
  468. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
  469. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
  470. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
  471. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
  472. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
  473. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
  474. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
  475. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
  476. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
  477. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
  478. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
  479. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
  480. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  481. package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
  482. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
  483. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
  484. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
  485. package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
  486. package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
  487. package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
  488. package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
  489. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
  490. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
  491. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
  492. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  493. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
  494. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
  495. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
  496. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
  497. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
  498. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  499. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
  500. package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
  501. package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
  502. package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
  503. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  504. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  505. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  506. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  507. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  508. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  509. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  510. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  511. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  512. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
  513. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
  514. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  515. package/src/shade/renderer/volumetrics/NOTES.md +238 -0
  516. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
  517. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
  518. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
  519. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
  520. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  521. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +591 -577
  522. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +17 -0
  523. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  524. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +20 -2
  525. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  526. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
  527. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
  528. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
  529. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
  530. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
  531. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  532. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  533. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  534. package/src/shade/renderer/water/shader_water.js +246 -246
  535. package/src/shade/vitest.setup.mjs +1 -1
  536. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  537. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
  538. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  539. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
  540. package/src/view/minimap/Minimap.d.ts +2 -2
  541. package/src/view/minimap/Minimap.d.ts.map +1 -1
  542. package/src/view/minimap/Minimap.js +225 -225
  543. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  544. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  545. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  546. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  547. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  548. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
  549. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
  550. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
  551. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
@@ -1,578 +1,592 @@
1
-
2
-
3
- import { assert } from "../../../core/assert.js";
4
- import { SamplerDescriptor } from "../../descriptor/texture/SamplerDescriptor.js";
5
- import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
6
- import { SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR } from "../shadow/map/SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR.js";
7
- import { STATIC_GRAPHICS_ENGINE_ASSETS } from "../STATIC_GRAPHICS_ENGINE_ASSETS.js";
8
- import { DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR } from "../texture/DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR.js";
9
- import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
10
- import { graph_import_buffer } from "../shader/graph/graph_import_buffer.js";
11
- import { shader_multiscatter_lut } from "../atmosphere/shader_multiscatter_lut.js";
12
- import { shader_transmittance_lut } from "../atmosphere/shader_transmittance_lut.js";
13
- import { shader_volumetrics_build_lighting } from "./shader_volumetrics_build_lighting.js";
14
- import { shader_volumetrics_build_participating_media } from "./shader_volumetrics_build_participating_media.js";
15
- import { shader_volumetrics_build_scattering_lut } from "./shader_volumetrics_build_scattering_lut.js";
16
- import { shader_volumetrics_build_sun_shadow_volume } from "./shader_volumetrics_build_sun_shadow_volume.js";
17
- import {
18
- VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT,
19
- VOLUMETRICS_SUN_SHADOW_WORKGROUP_RESOLUTION
20
- } from "./VOLUMETRICS_SUN_SHADOW_RESOLUTION.js";
21
- import { volumetrics_sun_shadow_texture_name } from "./chunk_volumetrics_sun_optical_depth.js";
22
- import { shader_volumetrics_taa } from "./taa/shader_volumetrics_taa.js";
23
-
24
- /**
25
- *
26
- * @param {FrameGraph} graph
27
- */
28
- function graph_integrate_sky({ graph }) {
29
- const t_data = {};
30
-
31
- const t_pass = graph.add("transmittance", t_data, (data, resources, context) => {
32
-
33
- const output = resources.get(data.output);
34
-
35
- const encoder = context.encoder;
36
-
37
- const settings_type = shader_transmittance_lut.descriptor.resources.getResourceByName("settings").buffer_type;
38
-
39
- const settings = encoder.allocateTransientValueBuffer(settings_type, {
40
- steps: 40
41
- });
42
-
43
- shader_transmittance_lut.draw({
44
- encoder: encoder,
45
- bindings: {
46
- settings
47
- },
48
- colorAttachments: [{
49
- view: output.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
50
- loadOp: "clear",
51
- storeOp: "store",
52
- }]
53
- })
54
- });
55
-
56
- t_data.output = t_pass.create("transmittance lut", TextureResourceDescriptor.from({
57
- resolution: [256, 64],
58
- format: "rgba16float",
59
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
60
- }));
61
-
62
- const m_data = {};
63
-
64
- const m_pass = graph.add("multiscatter lut", m_data, (data, resources, context) => {
65
- const output = resources.get(data.output);
66
-
67
- const settings_type = shader_multiscatter_lut.descriptor.resources.getResourceByName("settings").buffer_type;
68
-
69
- const encoder = context.encoder;
70
-
71
- const settings = encoder.allocateTransientValueBuffer(settings_type, {
72
- steps: 20,
73
- sqrt_samples: 8,
74
- });
75
-
76
- const tSkyLutTransmittance = resources.get(data.tSkyLutTransmittance);
77
-
78
- shader_multiscatter_lut.draw({
79
- encoder: encoder,
80
- bindings: {
81
- settings,
82
- tSkyLutTransmittance
83
- },
84
- colorAttachments: [{
85
- view: output.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
86
- loadOp: "clear",
87
- storeOp: "store",
88
- }]
89
- })
90
- });
91
-
92
- m_data.output = m_pass.create("multiscatter lut", TextureResourceDescriptor.from({
93
- resolution: [32, 32],
94
- format: "rgba16float",
95
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
96
- }))
97
-
98
- m_data.tSkyLutTransmittance = m_pass.read(t_data.output);
99
-
100
-
101
- return { transmittance_lut: t_data.output, multiscatted_lut: m_data.output };
102
- }
103
-
104
-
105
- /**
106
- *
107
- * @param {FrameGraph} graph
108
- * @param {GPUCameraContext} camera
109
- * @param {GPUSceneContext} scene
110
- * @param {GPUViewContext} view
111
- * @param {number} volumetrics_metadata
112
- * @param {number[]} resolution output resolution
113
- */
114
- function graph_integrate_participating_media({
115
- graph,
116
- camera,
117
- scene,
118
- view,
119
- volumetrics_metadata,
120
- resolution,
121
- }) {
122
-
123
- const data = {};
124
-
125
-
126
- const pass = graph.add(
127
- "aerial lut",
128
- data,
129
- /**
130
- *
131
- * @param {} data
132
- * @param {FramePassResources} resources
133
- * @param {GraphicsExecutionContext} context
134
- */
135
- (data, resources, context) => {
136
-
137
- /**
138
- * @type {GPUTextureContext}
139
- */
140
- const output0 = resources.get(data.output0);
141
- /**
142
- * @type {GPUTextureContext}
143
- */
144
- const output1 = resources.get(data.output1);
145
-
146
- const encoder = context.encoder;
147
-
148
- const volumetrics_metadata = resources.get(data.volumetrics_metadata);
149
-
150
- shader_volumetrics_build_participating_media.dispatch({
151
- encoder,
152
- group_count_x: Math.ceil(output0.width / 16),
153
- group_count_y: Math.ceil(output0.height / 16),
154
- group_count_z: output0.depth,
155
- bindings: {
156
- camera: camera.buffer.buffer,
157
- view: view.uniform_buffer.buffer,
158
- volumetrics_metadata,
159
- scene_volumetrics_metadata: scene.volumetrics.metadata_buffer.buffer,
160
- scene_volumes: scene.volumetrics.table.buffer,
161
- tOutput0: output0.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
162
- tOutput1: output1.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
163
- }
164
- });
165
-
166
-
167
- });
168
-
169
- data.volumetrics_metadata = pass.read(volumetrics_metadata);
170
-
171
- data.output0 = pass.create("Participating Media 0", TextureResourceDescriptor.from({
172
- resolution,
173
- dimension: "3d",
174
- format: "rgba16float",
175
- usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
176
- }));
177
- data.output1 = pass.create("Participating Media 1", TextureResourceDescriptor.from({
178
- resolution,
179
- dimension: "3d",
180
- format: "rgba16float",
181
- usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
182
- }));
183
-
184
- return {
185
- participating_media0: data.output0,
186
- participating_media1: data.output1,
187
- volumetrics_metadata: data.volumetrics_metadata,
188
- };
189
- }
190
-
191
- /**
192
- * Q-04. The sun's optical depth, integrated once per frame into cascaded light-aligned volumes so
193
- * the lighting pass can read it in a single fetch instead of marching toward the sun from every
194
- * froxel.
195
- *
196
- * Sits between the participating-media build and the lighting pass because it reads the former and
197
- * is read by the latter; the frame graph derives that ordering from the handles alone. The cascades
198
- * are ordered among themselves for the same reason: each one is seeded from the value the cascade
199
- * outside it already computed at its entry face, so the outermost is built first and the handle it
200
- * returns is what makes the next pass wait for it.
201
- *
202
- * A texture per cascade rather than one texture with the cascades stacked along w. Stacking would
203
- * put a pass's own output and its input in the same texture, which WebGPU rejects a subresource
204
- * cannot be bound as writable storage and as a sampled texture at once and there is no
205
- * subresource finer than the whole 3D texture to split it on.
206
- *
207
- * Always present, even with the mode off — the volumes are then dispatched at 1x1x1 (see
208
- * `GPUViewVolumetrics`), which keeps the graph's topology identical on both sides of the A/B. A
209
- * pass appearing and disappearing would change resource aliasing and pass scheduling along with the
210
- * thing being measured, and this subsystem has already produced one confident wrong answer from a
211
- * measurement where the two sides did not pay the same fixed costs.
212
- *
213
- * @param {FrameGraph} graph
214
- * @param {GPUCameraContext} camera
215
- * @param {number} participating_media1
216
- * @param {number} volumetrics_metadata
217
- * @param {number[]} resolution voxel counts of one cascade
218
- * @returns {number[]} handles of the cascades, innermost first
219
- */
220
- function graph_build_sun_shadow_volume({
221
- graph,
222
- camera,
223
- participating_media1,
224
- volumetrics_metadata,
225
- resolution,
226
- }) {
227
-
228
- const camera_buffer = graph_import_buffer(graph, camera.buffer.buffer, "volumetrics sun shadow camera");
229
-
230
- const group_count = [
231
- // one invocation per COLUMN along the sun axis, so only x and y are dispatched
232
- Math.ceil(resolution[0] / VOLUMETRICS_SUN_SHADOW_WORKGROUP_RESOLUTION[0]),
233
- Math.ceil(resolution[1] / VOLUMETRICS_SUN_SHADOW_WORKGROUP_RESOLUTION[1]),
234
- 1,
235
- ];
236
-
237
- const cascades = [];
238
-
239
- for (let cascade = VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT - 1; cascade >= 0; cascade--) {
240
-
241
- const bindings = {
242
- camera: camera_buffer,
243
- volumetrics_metadata,
244
- tParticipatingMedia1: participating_media1,
245
- tSunShadowVolume: TextureResourceDescriptor.from({
246
- resolution,
247
- dimension: "3d",
248
- format: "rgba16float",
249
- usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING
250
- }),
251
- };
252
-
253
- if (cascade < VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT - 1) {
254
- bindings.tSunShadowOuter = cascades[cascade + 1];
255
- }
256
-
257
- const outputs = graph_compute_pass({
258
- graph,
259
- shader: shader_volumetrics_build_sun_shadow_volume[cascade],
260
- group_count,
261
- bindings,
262
- });
263
-
264
- cascades[cascade] = outputs.tSunShadowVolume;
265
- }
266
-
267
- return cascades;
268
- }
269
-
270
- /**
271
- *
272
- * @param {FrameGraph} graph
273
- * @param participating_media0
274
- * @param participating_media1
275
- * @param volumetrics_metadata
276
- * @param light_cluster_data
277
- * @param light_cluster_lookup
278
- * @param light_cluster_parameters
279
- * @param shadowmap_atlas
280
- * @param sun_transmittance_lut
281
- * @param sun_multiple_scattering_lut
282
- * @param {number[]} sun_shadow_cascades handles of the Q-04 optical-depth cascades, innermost first
283
- * @param lights
284
- * @param view
285
- * @param camera
286
- * @param resolution
287
- */
288
- function graph_integrate_light_scattering({
289
- graph,
290
- participating_media0,
291
- participating_media1,
292
- volumetrics_metadata,
293
- light_cluster_data,
294
- light_cluster_lookup,
295
- light_cluster_parameters,
296
- shadowmap_atlas,
297
- sun_transmittance_lut,
298
- sun_multiple_scattering_lut,
299
- sun_shadow_cascades,
300
- lights,
301
- view,
302
- camera,
303
- resolution,
304
- }) {
305
-
306
- const data = {};
307
-
308
- const pass = graph.add("scattering lut", data, (data, resources, context) => {
309
- const output = resources.get(data.output);
310
-
311
- const volumetrics_metadata = resources.get(data.volumetrics_metadata);
312
-
313
- const participating_media0 = resources.get(data.participating_media0);
314
- const participating_media1 = resources.get(data.participating_media1);
315
-
316
- const light_cluster_data = resources.get(data.light_cluster_data);
317
- const light_cluster_lookup = resources.get(data.light_cluster_lookup);
318
- const light_cluster_parameters = resources.get(data.light_cluster_parameters);
319
- const shadowmap_atlas = resources.get(data.shadowmap_atlas);
320
-
321
- const sun_transmittance_lut = resources.get(data.sun_transmittance_lut);
322
- const sun_multiple_scattering_lut = resources.get(data.sun_multiple_scattering_lut);
323
- const sun_shadow_cascades = data.sun_shadow_cascades.map(handle => resources.get(handle));
324
-
325
- const sampler_shadowmap = context.graphics.samplers.obtain(SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR);
326
- const sLinear = context.graphics.samplers.obtain(SamplerDescriptor.from({
327
- magFilter: "linear",
328
- }));
329
-
330
- // Spatiotemporal blue noise for the per-froxel sample offset. The pass takes one sample and
331
- // leans on the volumetric TAA to integrate, which only works if each froxel's sequence over
332
- // frames is well distributed — the property a per-froxel hash does not have.
333
- const tSTBN_vec3 = context.graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec3);
334
-
335
- const encoder = context.encoder;
336
-
337
- shader_volumetrics_build_lighting.dispatch({
338
- encoder,
339
- group_count_x: Math.ceil(output.width / 16),
340
- group_count_y: Math.ceil(output.height / 16),
341
- group_count_z: output.depth,
342
- bindings: {
343
- camera: camera.buffer.buffer,
344
- view: view.uniform_buffer.buffer,
345
- volumetrics_metadata,
346
- sLinear,
347
- tSunTransmittance: sun_transmittance_lut.obtainView(),
348
- tMultiScattering: sun_multiple_scattering_lut.obtainView(),
349
- tSTBN_vec3: tSTBN_vec3.obtainView(),
350
- tParticipatingMedia0: participating_media0.obtainView(),
351
- tParticipatingMedia1: participating_media1.obtainView(),
352
- ...Object.fromEntries(sun_shadow_cascades.map(
353
- (texture, cascade) => [volumetrics_sun_shadow_texture_name(cascade), texture.obtainView()]
354
- )),
355
- tLighting: output.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
356
- //
357
- light_data: lights.buffer_data,
358
-
359
- cluster_data: light_cluster_data,
360
- cluster_lookup: light_cluster_lookup,
361
- cluster_parameters: light_cluster_parameters,
362
-
363
- shadowmapAtlas: shadowmap_atlas.obtainView(),
364
- sCompareLinear: sampler_shadowmap,
365
- }
366
- })
367
- });
368
-
369
- data.participating_media0 = pass.read(participating_media0);
370
- data.participating_media1 = pass.read(participating_media1);
371
- data.volumetrics_metadata = pass.read(volumetrics_metadata);
372
-
373
- data.shadowmap_atlas = pass.read(shadowmap_atlas);
374
- data.light_cluster_data = pass.read(light_cluster_data);
375
- data.light_cluster_lookup = pass.read(light_cluster_lookup);
376
- data.light_cluster_parameters = pass.read(light_cluster_parameters);
377
-
378
- data.sun_transmittance_lut = pass.read(sun_transmittance_lut);
379
- data.sun_multiple_scattering_lut = pass.read(sun_multiple_scattering_lut);
380
- data.sun_shadow_cascades = sun_shadow_cascades.map(handle => pass.read(handle));
381
-
382
- data.output = pass.create("Light Scattering LUT", TextureResourceDescriptor.from({
383
- resolution,
384
- dimension: "3d",
385
- format: "rgba16float",
386
- usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
387
- }));
388
-
389
-
390
- return data.output;
391
-
392
- }
393
-
394
- /**
395
- *
396
- * @param {FrameGraph} graph
397
- * @param {GPUCameraContext} camera
398
- * @param {GPULightCollection} lights
399
- * @param {GPUViewContext} view
400
- * @param {number} light_cluster_data
401
- * @param {number} light_cluster_lookup
402
- * @param {number} light_cluster_parameters
403
- * @param {number} shadowmap_atlas
404
- * @param {number[]} volumetric_resolution
405
- * @param {number[]} sun_shadow_resolution voxel counts of one Q-04 sun optical-depth cascade;
406
- * `[1, 1, 1]` when the froxels are marching instead, which keeps the passes in the graph without
407
- * doing any work
408
- * @param {number} volumetrics_metadata
409
- * @param {number} [taa_history] imported previous-frame accumulated scattering volume
410
- * @param {number} [taa_output] imported destination for this frame's accumulated scattering volume
411
- * @param {GPUCameraContext} [camera_previous] previous-frame camera, for temporal reprojection
412
- */
413
- export function graph_build_volumetrics({
414
- graph,
415
- camera,
416
- lights,
417
- view,
418
- light_cluster_data,
419
- light_cluster_lookup,
420
- light_cluster_parameters,
421
- shadowmap_atlas,
422
- volumetric_resolution,
423
- sun_shadow_resolution,
424
- volumetrics_metadata,
425
- taa_history,
426
- taa_output,
427
- camera_previous,
428
- }) {
429
-
430
- assert.defined(view, 'view');
431
- assert.defined(volumetric_resolution, 'volumetric_resolution');
432
- assert.defined(sun_shadow_resolution, 'sun_shadow_resolution');
433
-
434
- const { transmittance_lut, multiscatted_lut } = graph_integrate_sky({ graph: graph });
435
-
436
- const {
437
- participating_media0,
438
- participating_media1,
439
- } = graph_integrate_participating_media({
440
- graph,
441
- scene: view.scene,
442
- view,
443
- resolution: volumetric_resolution,
444
- volumetrics_metadata,
445
- camera,
446
- });
447
-
448
- const sun_shadow_cascades = graph_build_sun_shadow_volume({
449
- graph,
450
- camera,
451
- participating_media1,
452
- volumetrics_metadata,
453
- resolution: sun_shadow_resolution,
454
- });
455
-
456
- const light_scattering_lut = graph_integrate_light_scattering({
457
- graph,
458
- resolution: volumetric_resolution,
459
- camera,
460
- view,
461
- sun_transmittance_lut: transmittance_lut,
462
- sun_multiple_scattering_lut: multiscatted_lut,
463
- sun_shadow_cascades,
464
- participating_media0,
465
- participating_media1,
466
- volumetrics_metadata,
467
- light_cluster_data,
468
- light_cluster_lookup,
469
- light_cluster_parameters,
470
- shadowmap_atlas,
471
- lights,
472
- })
473
-
474
- // Temporal reprojection of the per-froxel lit scattering volume, applied BEFORE aerial
475
- // integration — reprojecting the already-integrated aerial LUT would double-integrate along the
476
- // view ray. Optional: skipped when no history ping-pong is supplied (TAA disabled), in which
477
- // case the aerial pass consumes the raw (noisier) scattering LUT directly.
478
- let volume_lighting_resolved = light_scattering_lut;
479
-
480
- if (taa_history !== undefined && taa_output !== undefined) {
481
- const taa_outputs = graph_compute_pass({
482
- graph,
483
- shader: shader_volumetrics_taa,
484
- group_count: [
485
- Math.ceil(volumetric_resolution[0] / 8),
486
- Math.ceil(volumetric_resolution[1] / 8),
487
- Math.ceil(volumetric_resolution[2] / 4),
488
- ],
489
- bindings: {
490
- t_current: light_scattering_lut,
491
- t_history: taa_history,
492
- t_output: taa_output,
493
- volumetrics_metadata,
494
- camera_current: graph_import_buffer(graph, camera.buffer.buffer, "volumetrics taa camera"),
495
- camera_previous: graph_import_buffer(graph, camera_previous.buffer.buffer, "volumetrics taa camera previous"),
496
- },
497
- });
498
-
499
- volume_lighting_resolved = taa_outputs.t_output;
500
- }
501
-
502
- const a_data = {};
503
-
504
- const a_pass = graph.add("aerial lut", a_data, (data, resources, context) => {
505
- const output = resources.get(data.output);
506
-
507
- const participating_media0 = resources.get(data.participating_media0);
508
- const participating_media1 = resources.get(data.participating_media1);
509
- const volumetrics_metadata = resources.get(data.volumetrics_metadata);
510
-
511
- const light_scattering_lut = resources.get(data.light_scattering_lut);
512
- const sun_transmittance_lut = resources.get(data.sun_transmittance_lut);
513
-
514
- const encoder = context.encoder;
515
-
516
-
517
- const graphics = context.graphics;
518
- const device = graphics.device;
519
-
520
- const sLinear = graphics.samplers.obtain(SamplerDescriptor.from({
521
- magFilter: "linear",
522
- }));
523
-
524
- const tSTBN_vec3 = graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec3);
525
-
526
- shader_volumetrics_build_scattering_lut.dispatch({
527
- encoder,
528
- group_count_x: Math.ceil(output.width / 16),
529
- group_count_y: Math.ceil(output.height / 16),
530
- bindings: {
531
- camera: camera.buffer.buffer,
532
- view: view.uniform_buffer.buffer,
533
- volumetrics_metadata,
534
- tSTBN_vec3: tSTBN_vec3.obtainView(),
535
- sLinear,
536
-
537
- tVolumeLighting: light_scattering_lut.obtainView(),
538
- tParticipatingMedia0: participating_media0.obtainView(),
539
- tParticipatingMedia1: participating_media1.obtainView(),
540
-
541
- // RDR2-style far-field march inputs (used beyond froxel_far)
542
- scene_volumetrics_metadata: view.scene.volumetrics.metadata_buffer.buffer,
543
- scene_volumes: view.scene.volumetrics.table.buffer,
544
- light_data: lights.buffer_data,
545
- tSunTransmittance: sun_transmittance_lut.obtainView(),
546
-
547
- tOutput: output.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
548
- }
549
- });
550
-
551
-
552
- });
553
-
554
- a_data.participating_media0 = a_pass.read(participating_media0);
555
- a_data.participating_media1 = a_pass.read(participating_media1);
556
- a_data.volumetrics_metadata = a_pass.read(volumetrics_metadata);
557
- a_data.sun_transmittance_lut = a_pass.read(transmittance_lut);
558
-
559
- a_data.output = a_pass.create("Integrated Volumetrics", TextureResourceDescriptor.from({
560
- resolution: volumetric_resolution,
561
- dimension: "3d",
562
- format: "rgba16float",
563
- usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING
564
- }))
565
-
566
-
567
- a_data.light_scattering_lut = a_pass.read(volume_lighting_resolved);
568
-
569
-
570
- // TODO add temporal reprojection
571
-
572
- return {
573
- lut_transmittance: transmittance_lut,
574
- lut_multiple_scattering: multiscatted_lut,
575
- lut_aerial: a_data.output,
576
- volumetrics_metadata,
577
- };
1
+ import { assert } from "../../../core/assert.js";
2
+ import { SamplerDescriptor } from "../../descriptor/texture/SamplerDescriptor.js";
3
+ import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
4
+ import { shader_multiscatter_lut } from "../atmosphere/shader_multiscatter_lut.js";
5
+ import { shader_transmittance_lut } from "../atmosphere/shader_transmittance_lut.js";
6
+ import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
7
+ import { graph_import_buffer } from "../shader/graph/graph_import_buffer.js";
8
+ import { SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR } from "../shadow/map/SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR.js";
9
+ import { STATIC_GRAPHICS_ENGINE_ASSETS } from "../STATIC_GRAPHICS_ENGINE_ASSETS.js";
10
+ import { DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR } from "../texture/DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR.js";
11
+ import { volumetrics_sun_shadow_texture_name } from "./chunk_volumetrics_sun_optical_depth.js";
12
+ import { shader_volumetrics_build_lighting } from "./shader_volumetrics_build_lighting.js";
13
+ import { shader_volumetrics_build_participating_media } from "./shader_volumetrics_build_participating_media.js";
14
+ import { shader_volumetrics_build_scattering_lut } from "./shader_volumetrics_build_scattering_lut.js";
15
+ import {
16
+ shader_volumetrics_build_sun_shadow_volume_outermost,
17
+ shader_volumetrics_build_sun_shadow_volume_seeded
18
+ } from "./shader_volumetrics_build_sun_shadow_volume.js";
19
+ import { shader_volumetrics_taa } from "./taa/shader_volumetrics_taa.js";
20
+ import {
21
+ VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT,
22
+ VOLUMETRICS_SUN_SHADOW_WORKGROUP_RESOLUTION,
23
+ volumetrics_sun_shadow_sub_steps
24
+ } from "./VOLUMETRICS_SUN_SHADOW_RESOLUTION.js";
25
+
26
+ /**
27
+ * Transmittance LUT, then the multiple-scattering LUT that reads it. Exported for
28
+ * `graph_integrate_sky.spec.js`, which pins the dispatch shape and the transient's usage
29
+ * flags -- neither of which the WGSL validity gate can see.
30
+ *
31
+ * @param {FrameGraph} graph
32
+ * @returns {{transmittance_lut: number, multiscatted_lut: number}} resource handles
33
+ */
34
+ export function graph_integrate_sky({ graph }) {
35
+
36
+ graph.push_scope("integrate sky");
37
+
38
+ const t_data = {};
39
+
40
+ const t_pass = graph.add("transmittance", t_data, (data, resources, context) => {
41
+
42
+ const output = resources.get(data.output);
43
+
44
+ const encoder = context.encoder;
45
+
46
+ const settings_type = shader_transmittance_lut.descriptor.resources.getResourceByName("settings").buffer_type;
47
+
48
+ const settings = encoder.allocateTransientValueBuffer(settings_type, {
49
+ steps: 40,
50
+ // taken off the target being drawn into, so the generator cannot be told a size
51
+ // the texture does not have
52
+ resolution: [output.width, output.height],
53
+ });
54
+
55
+ shader_transmittance_lut.draw({
56
+ encoder: encoder,
57
+ bindings: {
58
+ settings
59
+ },
60
+ colorAttachments: [{
61
+ view: output.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
62
+ loadOp: "clear",
63
+ storeOp: "store",
64
+ }]
65
+ })
66
+ });
67
+
68
+ t_data.output = t_pass.create("transmittance lut", TextureResourceDescriptor.from({
69
+ resolution: [256, 64],
70
+ format: "rgba16float",
71
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
72
+ }));
73
+
74
+ // The transient does not exist yet at graph-build time, so the dispatch cannot be
75
+ // counted off it the way GPUSky does; one local value feeds both instead.
76
+ const multiscatter_resolution = [32, 32];
77
+
78
+ const multiscatter_outputs = graph_compute_pass({
79
+ graph,
80
+ shader: shader_multiscatter_lut,
81
+ // one workgroup per LUT texel, each thread integrating one direction
82
+ group_count: [multiscatter_resolution[0], multiscatter_resolution[1], 1],
83
+ bindings: {
84
+ tSkyLutTransmittance: t_data.output,
85
+ tSkyLutMultiscatterOut: TextureResourceDescriptor.from({
86
+ resolution: multiscatter_resolution,
87
+ format: "rgba16float",
88
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING
89
+ })
90
+ }
91
+ });
92
+
93
+ graph.pop_scope();
94
+
95
+ return { transmittance_lut: t_data.output, multiscatted_lut: multiscatter_outputs.tSkyLutMultiscatterOut };
96
+ }
97
+
98
+
99
+ /**
100
+ *
101
+ * @param {FrameGraph} graph
102
+ * @param {GPUCameraContext} camera
103
+ * @param {GPUSceneContext} scene
104
+ * @param {GPUViewContext} view
105
+ * @param {number} volumetrics_metadata
106
+ * @param {number[]} resolution output resolution
107
+ */
108
+ function graph_integrate_participating_media({
109
+ graph,
110
+ camera,
111
+ scene,
112
+ view,
113
+ volumetrics_metadata,
114
+ resolution,
115
+ }) {
116
+
117
+ const data = {};
118
+
119
+
120
+ const pass = graph.add(
121
+ "aerial lut",
122
+ data,
123
+ /**
124
+ *
125
+ * @param {} data
126
+ * @param {FramePassResources} resources
127
+ * @param {GraphicsExecutionContext} context
128
+ */
129
+ (data, resources, context) => {
130
+
131
+ /**
132
+ * @type {GPUTextureContext}
133
+ */
134
+ const output0 = resources.get(data.output0);
135
+ /**
136
+ * @type {GPUTextureContext}
137
+ */
138
+ const output1 = resources.get(data.output1);
139
+
140
+ const encoder = context.encoder;
141
+
142
+ const volumetrics_metadata = resources.get(data.volumetrics_metadata);
143
+
144
+ shader_volumetrics_build_participating_media.dispatchThreads({
145
+ encoder,
146
+ thread_count_x: output0.width,
147
+ thread_count_y: output0.height,
148
+ thread_count_z: output0.depth,
149
+ bindings: {
150
+ camera: camera.buffer.buffer,
151
+ view: view.uniform_buffer.buffer,
152
+ volumetrics_metadata,
153
+ scene_volumetrics_metadata: scene.volumetrics.metadata_buffer.buffer,
154
+ scene_volumes: scene.volumetrics.table.buffer,
155
+ tOutput0: output0.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
156
+ tOutput1: output1.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
157
+ }
158
+ });
159
+
160
+
161
+ });
162
+
163
+ data.volumetrics_metadata = pass.read(volumetrics_metadata);
164
+
165
+ data.output0 = pass.create("Participating Media 0", TextureResourceDescriptor.from({
166
+ resolution,
167
+ dimension: "3d",
168
+ format: "rgba16float",
169
+ usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
170
+ }));
171
+ data.output1 = pass.create("Participating Media 1", TextureResourceDescriptor.from({
172
+ resolution,
173
+ dimension: "3d",
174
+ format: "rgba16float",
175
+ usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
176
+ }));
177
+
178
+ return {
179
+ participating_media0: data.output0,
180
+ participating_media1: data.output1,
181
+ volumetrics_metadata: data.volumetrics_metadata,
182
+ };
183
+ }
184
+
185
+ /**
186
+ * Q-04. The sun's optical depth, integrated once per frame into cascaded light-aligned volumes so
187
+ * the lighting pass can read it in a single fetch instead of marching toward the sun from every
188
+ * froxel.
189
+ *
190
+ * Sits between the participating-media build and the lighting pass because it reads the former and
191
+ * is read by the latter; the frame graph derives that ordering from the handles alone. The cascades
192
+ * are ordered among themselves for the same reason: each one is seeded from the value the cascade
193
+ * outside it already computed at its entry face, so the outermost is built first and the handle it
194
+ * returns is what makes the next pass wait for it.
195
+ *
196
+ * A texture per cascade rather than one texture with the cascades stacked along w. Stacking would
197
+ * put a pass's own output and its input in the same texture, which WebGPU rejects a subresource
198
+ * cannot be bound as writable storage and as a sampled texture at once and there is no
199
+ * subresource finer than the whole 3D texture to split it on.
200
+ *
201
+ * Always present, even with the mode off — the volumes are then dispatched at 1x1x1 (see
202
+ * `GPUViewVolumetrics`), which keeps the graph's topology identical on both sides of the A/B. A
203
+ * pass appearing and disappearing would change resource aliasing and pass scheduling along with the
204
+ * thing being measured, and this subsystem has already produced one confident wrong answer from a
205
+ * measurement where the two sides did not pay the same fixed costs.
206
+ *
207
+ * @param {FrameGraph} graph
208
+ * @param {GPUCameraContext} camera
209
+ * @param {number} participating_media1
210
+ * @param {number} volumetrics_metadata
211
+ * @param {number[]} resolution voxel counts of one cascade
212
+ * @returns {number[]} handles of the cascades, innermost first
213
+ */
214
+ function graph_build_sun_shadow_volume({
215
+ graph,
216
+ camera,
217
+ participating_media1,
218
+ volumetrics_metadata,
219
+ resolution,
220
+ }) {
221
+
222
+ const camera_buffer = graph_import_buffer(graph, camera.buffer.buffer, "volumetrics sun shadow camera");
223
+
224
+ const group_count = [
225
+ // one invocation per COLUMN along the sun axis, so only x and y are dispatched
226
+ Math.ceil(resolution[0] / VOLUMETRICS_SUN_SHADOW_WORKGROUP_RESOLUTION[0]),
227
+ Math.ceil(resolution[1] / VOLUMETRICS_SUN_SHADOW_WORKGROUP_RESOLUTION[1]),
228
+ 1,
229
+ ];
230
+
231
+ const cascades = [];
232
+
233
+ for (let cascade = VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT - 1; cascade >= 0; cascade--) {
234
+
235
+ // Every cascade but the outermost starts its scan from the one outside it — which the
236
+ // descending loop has already added, and which is the one difference the two build shaders
237
+ // exist for.
238
+ const seeded = cascade < VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT - 1;
239
+
240
+ const bindings = {
241
+ // which cascade this dispatch is building; the shader is shared across all of them
242
+ settings: {
243
+ cascade,
244
+ sub_steps: volumetrics_sun_shadow_sub_steps(cascade),
245
+ },
246
+ camera: camera_buffer,
247
+ volumetrics_metadata,
248
+ tParticipatingMedia1: participating_media1,
249
+ tSunShadowVolume: TextureResourceDescriptor.from({
250
+ resolution,
251
+ dimension: "3d",
252
+ format: "rgba16float",
253
+ usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING
254
+ }),
255
+ };
256
+
257
+ if (seeded) {
258
+ bindings.tSunShadowOuter = cascades[cascade + 1];
259
+ }
260
+
261
+ const outputs = graph_compute_pass({
262
+ graph,
263
+ shader: seeded
264
+ ? shader_volumetrics_build_sun_shadow_volume_seeded
265
+ : shader_volumetrics_build_sun_shadow_volume_outermost,
266
+ group_count,
267
+ bindings,
268
+ });
269
+
270
+ cascades[cascade] = outputs.tSunShadowVolume;
271
+ }
272
+
273
+ return cascades;
274
+ }
275
+
276
+ /**
277
+ *
278
+ * @param {FrameGraph} graph
279
+ * @param participating_media0
280
+ * @param participating_media1
281
+ * @param volumetrics_metadata
282
+ * @param light_cluster_data
283
+ * @param light_cluster_lookup
284
+ * @param light_cluster_parameters
285
+ * @param shadowmap_atlas
286
+ * @param sun_transmittance_lut
287
+ * @param sun_multiple_scattering_lut
288
+ * @param {number[]} sun_shadow_cascades handles of the Q-04 optical-depth cascades, innermost first
289
+ * @param lights
290
+ * @param view
291
+ * @param camera
292
+ * @param resolution
293
+ */
294
+ function graph_integrate_light_scattering({
295
+ graph,
296
+ participating_media0,
297
+ participating_media1,
298
+ volumetrics_metadata,
299
+ light_cluster_data,
300
+ light_cluster_lookup,
301
+ light_cluster_parameters,
302
+ shadowmap_atlas,
303
+ sun_transmittance_lut,
304
+ sun_multiple_scattering_lut,
305
+ sun_shadow_cascades,
306
+ lights,
307
+ view,
308
+ camera,
309
+ resolution,
310
+ }) {
311
+
312
+ const data = {};
313
+
314
+ const pass = graph.add("scattering lut", data, (data, resources, context) => {
315
+ const output = resources.get(data.output);
316
+
317
+ const volumetrics_metadata = resources.get(data.volumetrics_metadata);
318
+
319
+ const participating_media0 = resources.get(data.participating_media0);
320
+ const participating_media1 = resources.get(data.participating_media1);
321
+
322
+ const light_cluster_data = resources.get(data.light_cluster_data);
323
+ const light_cluster_lookup = resources.get(data.light_cluster_lookup);
324
+ const light_cluster_parameters = resources.get(data.light_cluster_parameters);
325
+ const shadowmap_atlas = resources.get(data.shadowmap_atlas);
326
+
327
+ const sun_transmittance_lut = resources.get(data.sun_transmittance_lut);
328
+ const sun_multiple_scattering_lut = resources.get(data.sun_multiple_scattering_lut);
329
+ const sun_shadow_cascades = data.sun_shadow_cascades.map(handle => resources.get(handle));
330
+
331
+ const sampler_shadowmap = context.graphics.samplers.obtain(SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR);
332
+ const sLinear = context.graphics.samplers.obtain(SamplerDescriptor.from({
333
+ magFilter: "linear",
334
+ }));
335
+
336
+ // Spatiotemporal blue noise for the per-froxel sample offset. The pass takes one sample and
337
+ // leans on the volumetric TAA to integrate, which only works if each froxel's sequence over
338
+ // frames is well distributed — the property a per-froxel hash does not have.
339
+ const tSTBN_vec3 = context.graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec3);
340
+
341
+ const encoder = context.encoder;
342
+
343
+ const bindings = {
344
+ camera: camera.buffer.buffer,
345
+ view: view.uniform_buffer.buffer,
346
+ volumetrics_metadata,
347
+ sLinear,
348
+ tSunTransmittance: sun_transmittance_lut.obtainView(),
349
+ tMultiScattering: sun_multiple_scattering_lut.obtainView(),
350
+ tSTBN_vec3: tSTBN_vec3.obtainView(),
351
+ tParticipatingMedia0: participating_media0.obtainView(),
352
+ tParticipatingMedia1: participating_media1.obtainView(),
353
+ tLighting: output.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
354
+ //
355
+ light_data: lights.buffer_data,
356
+
357
+ cluster_data: light_cluster_data,
358
+ cluster_lookup: light_cluster_lookup,
359
+ cluster_parameters: light_cluster_parameters,
360
+
361
+ shadowmapAtlas: shadowmap_atlas.obtainView(),
362
+ sCompareLinear: sampler_shadowmap,
363
+ };
364
+
365
+ // One texture per cascade, under the names the read side declares. Bound here rather than
366
+ // above because the count is a constant of the structure, not of this pass.
367
+ for (let cascade = 0; cascade < sun_shadow_cascades.length; cascade++) {
368
+ bindings[volumetrics_sun_shadow_texture_name(cascade)] = sun_shadow_cascades[cascade].obtainView();
369
+ }
370
+
371
+ shader_volumetrics_build_lighting.dispatchThreads({
372
+ encoder,
373
+ thread_count_x: output.width,
374
+ thread_count_y: output.height,
375
+ thread_count_z: output.depth,
376
+ bindings
377
+ })
378
+ });
379
+
380
+ data.participating_media0 = pass.read(participating_media0);
381
+ data.participating_media1 = pass.read(participating_media1);
382
+ data.volumetrics_metadata = pass.read(volumetrics_metadata);
383
+
384
+ data.shadowmap_atlas = pass.read(shadowmap_atlas);
385
+ data.light_cluster_data = pass.read(light_cluster_data);
386
+ data.light_cluster_lookup = pass.read(light_cluster_lookup);
387
+ data.light_cluster_parameters = pass.read(light_cluster_parameters);
388
+
389
+ data.sun_transmittance_lut = pass.read(sun_transmittance_lut);
390
+ data.sun_multiple_scattering_lut = pass.read(sun_multiple_scattering_lut);
391
+ data.sun_shadow_cascades = sun_shadow_cascades.map(handle => pass.read(handle));
392
+
393
+ data.output = pass.create("Light Scattering LUT", TextureResourceDescriptor.from({
394
+ resolution,
395
+ dimension: "3d",
396
+ format: "rgba16float",
397
+ usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT
398
+ }));
399
+
400
+
401
+ return data.output;
402
+
403
+ }
404
+
405
+ /**
406
+ *
407
+ * @param {FrameGraph} graph
408
+ * @param {GPUCameraContext} camera
409
+ * @param {GPULightCollection} lights
410
+ * @param {GPUViewContext} view
411
+ * @param {number} light_cluster_data
412
+ * @param {number} light_cluster_lookup
413
+ * @param {number} light_cluster_parameters
414
+ * @param {number} shadowmap_atlas
415
+ * @param {number[]} volumetric_resolution
416
+ * @param {number[]} sun_shadow_resolution voxel counts of one Q-04 sun optical-depth cascade;
417
+ * `[1, 1, 1]` when the froxels are marching instead, which keeps the passes in the graph without
418
+ * doing any work
419
+ * @param {number} volumetrics_metadata
420
+ * @param {number} [taa_history] imported previous-frame accumulated scattering volume
421
+ * @param {number} [taa_output] imported destination for this frame's accumulated scattering volume
422
+ * @param {GPUCameraContext} [camera_previous] previous-frame camera, for temporal reprojection
423
+ */
424
+ export function graph_build_volumetrics({
425
+ graph,
426
+ camera,
427
+ lights,
428
+ view,
429
+ light_cluster_data,
430
+ light_cluster_lookup,
431
+ light_cluster_parameters,
432
+ shadowmap_atlas,
433
+ volumetric_resolution,
434
+ sun_shadow_resolution,
435
+ volumetrics_metadata,
436
+ taa_history,
437
+ taa_output,
438
+ camera_previous,
439
+ }) {
440
+
441
+ assert.defined(view, 'view');
442
+ assert.defined(volumetric_resolution, 'volumetric_resolution');
443
+ assert.defined(sun_shadow_resolution, 'sun_shadow_resolution');
444
+
445
+ graph.push_scope("build volumetrics");
446
+
447
+ const { transmittance_lut, multiscatted_lut } = graph_integrate_sky({ graph: graph });
448
+
449
+ const {
450
+ participating_media0,
451
+ participating_media1,
452
+ } = graph_integrate_participating_media({
453
+ graph,
454
+ scene: view.scene,
455
+ view,
456
+ resolution: volumetric_resolution,
457
+ volumetrics_metadata,
458
+ camera,
459
+ });
460
+
461
+ const sun_shadow_cascades = graph_build_sun_shadow_volume({
462
+ graph,
463
+ camera,
464
+ participating_media1,
465
+ volumetrics_metadata,
466
+ resolution: sun_shadow_resolution,
467
+ });
468
+
469
+ const light_scattering_lut = graph_integrate_light_scattering({
470
+ graph,
471
+ resolution: volumetric_resolution,
472
+ camera,
473
+ view,
474
+ sun_transmittance_lut: transmittance_lut,
475
+ sun_multiple_scattering_lut: multiscatted_lut,
476
+ sun_shadow_cascades,
477
+ participating_media0,
478
+ participating_media1,
479
+ volumetrics_metadata,
480
+ light_cluster_data,
481
+ light_cluster_lookup,
482
+ light_cluster_parameters,
483
+ shadowmap_atlas,
484
+ lights,
485
+ })
486
+
487
+ // Temporal reprojection of the per-froxel lit scattering volume, applied BEFORE aerial
488
+ // integration — reprojecting the already-integrated aerial LUT would double-integrate along the
489
+ // view ray. Optional: skipped when no history ping-pong is supplied (TAA disabled), in which
490
+ // case the aerial pass consumes the raw (noisier) scattering LUT directly.
491
+ let volume_lighting_resolved = light_scattering_lut;
492
+
493
+ if (taa_history !== undefined && taa_output !== undefined) {
494
+ const taa_outputs = graph_compute_pass({
495
+ graph,
496
+ shader: shader_volumetrics_taa,
497
+ group_count: [
498
+ Math.ceil(volumetric_resolution[0] / 8),
499
+ Math.ceil(volumetric_resolution[1] / 8),
500
+ Math.ceil(volumetric_resolution[2] / 4),
501
+ ],
502
+ bindings: {
503
+ t_current: light_scattering_lut,
504
+ t_history: taa_history,
505
+ t_output: taa_output,
506
+ volumetrics_metadata,
507
+ camera_current: graph_import_buffer(graph, camera.buffer.buffer, "volumetrics taa camera"),
508
+ camera_previous: graph_import_buffer(graph, camera_previous.buffer.buffer, "volumetrics taa camera previous"),
509
+ },
510
+ });
511
+
512
+ volume_lighting_resolved = taa_outputs.t_output;
513
+ }
514
+
515
+ const a_data = {};
516
+
517
+ const a_pass = graph.add("aerial lut", a_data, (data, resources, context) => {
518
+ const output = resources.get(data.output);
519
+
520
+ const participating_media0 = resources.get(data.participating_media0);
521
+ const participating_media1 = resources.get(data.participating_media1);
522
+ const volumetrics_metadata = resources.get(data.volumetrics_metadata);
523
+
524
+ const light_scattering_lut = resources.get(data.light_scattering_lut);
525
+ const sun_transmittance_lut = resources.get(data.sun_transmittance_lut);
526
+
527
+ const encoder = context.encoder;
528
+
529
+
530
+ const graphics = context.graphics;
531
+
532
+ const sLinear = graphics.samplers.obtain(SamplerDescriptor.from({
533
+ magFilter: "linear",
534
+ }));
535
+
536
+ const tSTBN_vec3 = graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec3);
537
+
538
+ shader_volumetrics_build_scattering_lut.dispatchThreads({
539
+ encoder,
540
+ thread_count_x: output.width,
541
+ thread_count_y: output.height,
542
+ bindings: {
543
+ camera: camera.buffer.buffer,
544
+ view: view.uniform_buffer.buffer,
545
+ volumetrics_metadata,
546
+ tSTBN_vec3: tSTBN_vec3.obtainView(),
547
+ sLinear,
548
+
549
+ tVolumeLighting: light_scattering_lut.obtainView(),
550
+ tParticipatingMedia0: participating_media0.obtainView(),
551
+ tParticipatingMedia1: participating_media1.obtainView(),
552
+
553
+ // RDR2-style far-field march inputs (used beyond froxel_far)
554
+ scene_volumetrics_metadata: view.scene.volumetrics.metadata_buffer.buffer,
555
+ scene_volumes: view.scene.volumetrics.table.buffer,
556
+ light_data: lights.buffer_data,
557
+ tSunTransmittance: sun_transmittance_lut.obtainView(),
558
+
559
+ tOutput: output.obtainView(DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR),
560
+ }
561
+ });
562
+
563
+
564
+ });
565
+
566
+ a_data.participating_media0 = a_pass.read(participating_media0);
567
+ a_data.participating_media1 = a_pass.read(participating_media1);
568
+ a_data.volumetrics_metadata = a_pass.read(volumetrics_metadata);
569
+ a_data.sun_transmittance_lut = a_pass.read(transmittance_lut);
570
+
571
+ a_data.output = a_pass.create("Integrated Volumetrics", TextureResourceDescriptor.from({
572
+ resolution: volumetric_resolution,
573
+ dimension: "3d",
574
+ format: "rgba16float",
575
+ usage: GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING
576
+ }))
577
+
578
+
579
+ a_data.light_scattering_lut = a_pass.read(volume_lighting_resolved);
580
+
581
+
582
+ // TODO add temporal reprojection
583
+
584
+ graph.pop_scope();
585
+
586
+ return {
587
+ lut_transmittance: transmittance_lut,
588
+ lut_multiple_scattering: multiscatted_lut,
589
+ lut_aerial: a_data.output,
590
+ volumetrics_metadata,
591
+ };
578
592
  }