@woosh/meep-engine 3.11.3 → 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 (401) hide show
  1. package/README.md +14 -18
  2. package/editor/SelectionVisualizer.js +127 -127
  3. package/editor/entity_world_bounds.js +27 -27
  4. package/editor/particles/rebuildParticleEmitter.js +31 -31
  5. package/editor/process/SymbolicDisplayProcess.js +1 -1
  6. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  7. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  8. package/editor/prototypeEditorShell.js +156 -156
  9. package/editor/selection/editor_pick.js +130 -130
  10. package/editor/selection/screen_rect_frustum.js +119 -119
  11. package/editor/tools/v2/TransformControls.js +971 -971
  12. package/package.json +1 -1
  13. package/src/engine/Engine.d.ts +3 -3
  14. package/src/engine/Engine.d.ts.map +1 -1
  15. package/src/engine/Engine.js +726 -726
  16. package/src/engine/EngineHarness.d.ts +1 -1
  17. package/src/engine/EngineHarness.js +590 -590
  18. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  19. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  21. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  23. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  24. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  25. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  26. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  27. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  29. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  30. package/src/engine/graphics/ecs/water/Water.js +104 -104
  31. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  33. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  36. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  38. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  39. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  40. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  41. package/src/engine/graphics3/AnimationSystem.js +352 -0
  42. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  43. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  44. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  45. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  46. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  47. package/src/engine/graphics3/CameraSystem.js +170 -0
  48. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  49. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  50. package/src/engine/graphics3/CameraSystem3.js +6 -166
  51. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  53. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  54. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  56. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  57. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  58. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  59. package/src/engine/graphics3/DecalSystem.js +441 -0
  60. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  61. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  62. package/src/engine/graphics3/DecalSystem3.js +6 -437
  63. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  65. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  66. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  68. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  69. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  70. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  71. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  72. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  74. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  75. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  76. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  77. package/src/engine/graphics3/HighlightSystem.js +241 -0
  78. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  79. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  80. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  81. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  82. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  83. package/src/engine/graphics3/LightSystem.js +211 -0
  84. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  85. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  86. package/src/engine/graphics3/LightSystem3.js +6 -207
  87. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  88. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  89. package/src/engine/graphics3/MeshSystem.js +647 -0
  90. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  91. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  92. package/src/engine/graphics3/MeshSystem3.js +6 -642
  93. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  94. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  95. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  101. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  106. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  107. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  109. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  110. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  112. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  113. package/src/engine/graphics3/Pickable.d.ts +1 -1
  114. package/src/engine/graphics3/Pickable.js +65 -65
  115. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  116. package/src/engine/graphics3/PickingQuery.js +48 -48
  117. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  118. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  119. package/src/engine/graphics3/PickingSystem.js +273 -0
  120. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  121. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  122. package/src/engine/graphics3/PickingSystem3.js +6 -269
  123. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  128. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  129. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  130. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  131. package/src/engine/graphics3/TerrainSystem.js +566 -0
  132. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  133. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  134. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  135. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  138. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  140. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  141. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  142. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  143. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  144. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  146. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  147. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  148. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  149. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  155. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  156. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  157. package/src/engine/graphics3/WaterSystem.js +293 -0
  158. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  159. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  160. package/src/engine/graphics3/WaterSystem3.js +6 -289
  161. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  162. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  163. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  164. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  165. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  166. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  167. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  169. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  172. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  175. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  176. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  177. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  178. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  180. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  182. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  183. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  184. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  185. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  186. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  187. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  188. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  189. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  190. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  191. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  192. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  193. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  194. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  195. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  196. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  197. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  198. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  199. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  201. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  202. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  203. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  204. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  205. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  206. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  207. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  208. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  209. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  210. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  211. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  212. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  213. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  214. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  215. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  216. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  217. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  218. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
  219. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  220. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  221. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  222. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  223. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  224. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  225. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  226. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  227. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  228. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  229. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  230. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  231. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  232. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  233. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  234. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  235. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  236. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  237. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  238. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  239. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  240. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  241. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  242. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  243. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  244. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  245. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  246. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  247. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  248. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  249. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  250. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  251. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  252. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  253. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  254. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  255. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  256. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  257. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  258. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  259. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  260. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +4 -7
  261. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  262. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  263. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  264. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  265. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  266. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  267. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  268. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  269. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  270. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  271. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  272. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  273. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  274. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  275. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  276. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  277. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  278. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  279. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  280. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  281. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  282. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  283. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  284. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  285. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  286. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  287. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  288. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  289. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  290. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  291. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  292. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  293. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  294. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  295. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  296. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  297. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  298. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  299. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  300. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  301. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  302. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  303. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +2 -2
  304. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  305. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  306. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  307. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  308. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  309. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
  310. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  311. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  312. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  313. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  314. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  315. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  316. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  317. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  318. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  319. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  320. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  321. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  322. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  323. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  324. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  325. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  326. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  327. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  328. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  329. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  330. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  331. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  332. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  333. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  334. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  335. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  336. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  337. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  338. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  339. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  340. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  341. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  342. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  343. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  344. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  345. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  346. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  347. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  348. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  349. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  350. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  351. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  352. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  353. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  354. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  355. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  356. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  357. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  358. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  359. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  360. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  361. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  362. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  363. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  364. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  365. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  366. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  367. package/src/shade/renderer/shader/ComputeShader.js +350 -296
  368. package/src/shade/renderer/shader/ImageShader.js +217 -217
  369. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  370. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  371. package/src/shade/renderer/shader/ShaderDescriptor.js +20 -0
  372. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  373. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  374. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  375. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  376. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  377. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  378. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  379. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  380. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  381. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  382. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  383. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +12 -15
  384. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
  385. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  386. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
  387. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  388. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  389. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  390. package/src/shade/renderer/water/shader_water.js +246 -246
  391. package/src/shade/vitest.setup.mjs +1 -1
  392. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  393. package/src/view/minimap/Minimap.d.ts +2 -2
  394. package/src/view/minimap/Minimap.d.ts.map +1 -1
  395. package/src/view/minimap/Minimap.js +225 -225
  396. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  397. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  398. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  399. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  400. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  401. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
@@ -1,232 +1,231 @@
1
- import { atomic_u32, f32, u32, vec2u } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
- import { GEOMETRY_ATTRIBUTE_DATA_TYPE } from "../../geometry/GEOMETRY_ATTRIBUTE_DATA_TYPE.js";
5
- import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
6
- import {
7
- VIZ_BUFFER_INVALID_MESH_VALUE
8
- } from "../../rasterize/native/viz/VIZ_BUFFER_INVALID_MESH_VALUE.js";
9
- import { MATERIAL_METADATA_STRUCT } from "../../material/MATERIAL_METADATA_STRUCT.js";
10
- import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
11
- import { RENDER_GLOBAL_MIP_BIAS } from "../../postprocess/taa/RENDER_GLOBAL_MIP_BIAS.js";
12
- import { chunk_barycentric_full } from "../../shader/chunk/geometry/triangle/chunk_barycentric_full.js";
13
- import { chunk_barycentric_interpolate_uv } from "../../shader/chunk/geometry/triangle/chunk_barycentric_interpolate_uv.js";
14
- import { chunk_decode_meshlet_element } from "../../shader/chunk/geometry/meshlet/chunk_decode_meshlet_element.js";
15
- import {
16
- chunk_read_meshlet_triangle_vertices
17
- } from "../../shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_vertices.js";
18
- import { chunk_hash_lowbias32 } from "../../shader/chunk/random/chunk_hash_lowbias32.js";
19
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
20
- import { ComputeShader } from "../../shader/ComputeShader.js";
21
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
22
- import { VIEW_UNIFORM_STRUCT } from "../../view/VIEW_UNIFORM_STRUCT.js";
23
- import { chunk_vt_request_key } from "./chunk_vt_request_key.js";
24
- import { VT_STACK_ID_INVALID } from "./VT_CONSTANTS.js";
25
- import { VT_STACK_INFO_STRUCT } from "./VT_STACK_INFO_STRUCT.js";
26
-
27
- /**
28
- * Uniform parameters of the feedback pass.
29
- *
30
- * `stride` — the pass samples one pixel per stride×stride block;
31
- * `jitter` — which pixel of the block this frame (cycled by the manager so
32
- * coverage integrates to every pixel over stride² frames);
33
- * `mip_bias` — added to the requested LOD; carries the residency
34
- * (over-subscription) bias so pressure degrades to blur instead of thrash.
35
- */
36
- export const VT_FEEDBACK_PARAMS_STRUCT = WebGPUStruct.from({
37
- stride: u32,
38
- jitter: vec2u,
39
- mip_bias: f32,
40
- }, "VTFeedbackParams").pack();
41
-
42
- /**
43
- * Matches the fragment_gbuffer derivative bias so feedback requests the mips
44
- * the material pass actually samples.
45
- * @type {number}
46
- */
47
- const MIP_DERIVATIVE_BIAS = 1 / (1 - RENDER_GLOBAL_MIP_BIAS);
48
-
49
- export const VT_FEEDBACK_WORKGROUP_SIZE = 8;
50
-
51
- /**
52
- * Builds the feedback compute shader: one thread per sampled pixel, reading
53
- * the visibility buffer and reproducing the material pass's UV + analytic
54
- * gradient math (vertex pulling + perspective-correct barycentric
55
- * derivatives), then inserting the touched (stack, mip, page) key into a
56
- * global hash set of unique requests.
57
- *
58
- * This is the "no second geometry pass" property: the viz buffer already
59
- * identifies the triangle per pixel, so usage detection is a bounded-cost
60
- * screen-space compute pass regardless of scene complexity, shared by every
61
- * virtual texture in the frame.
62
- *
63
- * The hash set is insert-only and cleared each frame; the CPU reads the raw
64
- * table back and treats presence as "touched this frame" — both residency
65
- * touches (LRU) and misses (load requests) fall out of the same data.
66
- *
67
- * @param {Object} config
68
- * @param {CodeChunk} config.chunk_vt_lookup from {@link build_chunk_vt_lookup}
69
- * @param {number} config.hash_capacity power of two
70
- * @returns {ComputeShader}
71
- */
72
- export function build_shader_vt_feedback({ chunk_vt_lookup, hash_capacity }) {
73
-
74
- const resources = new ShaderResourceSetDescriptor();
75
-
76
- resources.createGroup()
77
- .addTexture("viz_buffer_triangle", "uint")
78
- .addTexture("viz_buffer_mesh", "uint")
79
- .addUniform("view", VIEW_UNIFORM_STRUCT)
80
- .addUniform("vt_params", VT_FEEDBACK_PARAMS_STRUCT)
81
- .addStorageBuffer("scene_database", WebGPUArray.from(u32))
82
- .addStorageBuffer("meshlet_metadata", WebGPUArray.from(MESHLET_METADATA_STRUCT))
83
- .addStorageBuffer("meshlet_data", GEOMETRY_ATTRIBUTE_DATA_TYPE)
84
- .addStorageBuffer("material_metadata", WebGPUArray.from(MATERIAL_METADATA_STRUCT))
85
- .addStorageBuffer("vt_stacks", WebGPUArray.from(VT_STACK_INFO_STRUCT))
86
- .addStorageBuffer("vt_requests", WebGPUArray.from(atomic_u32), true);
87
-
88
- const body = CodeChunk.from(
89
- //language=WGSL
90
- `
91
- const VT_HASH_CAPACITY_MASK: u32 = ${hash_capacity - 1}u;
92
- const VT_HASH_MAX_PROBES: u32 = 32u;
93
-
94
- const MIP_BIAS: f32 = ${MIP_DERIVATIVE_BIAS.toFixed(8)};
95
-
96
- // Insert-only open-addressing hash set. Values are stored as key+1 so a
97
- // zero-cleared buffer means "all empty" (same conventions as
98
- // common/hash_table, which is the CPU-build/GPU-read counterpart of this
99
- // GPU-insert/CPU-read set; see also the SHARC hash map for the bucketed
100
- // key->index variant).
101
- //
102
- // Forward-progress note: this loop never waits on another invocation's
103
- // progress. The atomicCompareExchangeWeak retry only re-tests a *local*
104
- // spurious failure, every iteration consumes the shared probe budget, and
105
- // the loop is hard-bounded at VT_HASH_MAX_PROBES regardless of what other
106
- // threads do. On exhaustion the fallback is to DROP the request — benign,
107
- // feedback re-emits it next frame. Contrast with the decoupled-lookback
108
- // spin in common/prefix_sum/v1/shader_prefix_scan_csdldf.js, where the
109
- // awaited value is required for correctness and the bounded spin
110
- // (MAX_SPIN_COUNT) must therefore pair with a local recompute fallback.
111
- fn vt_request_insert(key: u32) {
112
- let stored = key + 1u;
113
-
114
- var h = hash_lowbias32(key) & VT_HASH_CAPACITY_MASK;
115
-
116
- for (var i = 0u; i < VT_HASH_MAX_PROBES; i++) {
117
- let existing = atomicLoad(&vt_requests[h]);
118
-
119
- if (existing == stored) {
120
- return;
121
- }
122
-
123
- if (existing == 0u) {
124
- let r = atomicCompareExchangeWeak(&vt_requests[h], 0u, stored);
125
-
126
- if (r.exchanged || r.old_value == stored) {
127
- return;
128
- }
129
-
130
- if (r.old_value == 0u) {
131
- // spurious weak failure — retry the same slot
132
- continue;
133
- }
134
- }
135
-
136
- h = (h + 1u) & VT_HASH_CAPACITY_MASK;
137
- }
138
- }
139
-
140
- @compute @workgroup_size(${VT_FEEDBACK_WORKGROUP_SIZE}, ${VT_FEEDBACK_WORKGROUP_SIZE}, 1)
141
- fn main(
142
- @builtin(global_invocation_id) gid: vec3<u32>,
143
- ) {
144
- let pixel = gid.xy * vt_params.stride + vt_params.jitter;
145
-
146
- if (pixel.x >= view.width || pixel.y >= view.height) {
147
- return;
148
- }
149
-
150
- let mesh_index = textureLoad(viz_buffer_mesh, vec2<i32>(pixel), 0).r;
151
-
152
- if (mesh_index == ${VIZ_BUFFER_INVALID_MESH_VALUE}u) {
153
- return;
154
- }
155
-
156
- let mesh = scene_read_mesh(&scene_database, mesh_index);
157
-
158
- let stack_id = material_metadata[mesh.material].vt_stack;
159
-
160
- if (stack_id == ${VT_STACK_ID_INVALID}u) {
161
- return;
162
- }
163
-
164
- let info = vt_stacks[stack_id];
165
-
166
- // ── UV + gradients, mirroring fragment_gbuffer ──────────────────
167
- let encoded_meshlet_triangle = textureLoad(viz_buffer_triangle, vec2<i32>(pixel), 0).r;
168
-
169
- let decoded = decode_meshlet_element(encoded_meshlet_triangle);
170
- let meshlet_id = decoded[0];
171
- let meshlet_triangle_id = decoded[1];
172
-
173
- let node = scene_read_node(&scene_database, mesh.node);
174
-
175
- let triangle = read_meshlet_triangle_vertices(meshlet_id, meshlet_triangle_id);
176
-
177
- let mesh_transform = node.global;
178
-
179
- let p0 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.a.position, 1.0));
180
- let p1 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.b.position, 1.0));
181
- let p2 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.c.position, 1.0));
182
-
183
- let pixel_center = vec2<f32>(pixel) + 0.5;
184
-
185
- let barycentric = barycentric_full(p0, p1, p2, pixel_center);
186
-
187
- var uv0 = triangle.a.uv;
188
- var uv1 = triangle.b.uv;
189
- var uv2 = triangle.c.uv;
190
-
191
- if ((info.flags & VT_STACK_FLAG_UV_SET_1) != 0u) {
192
- uv0 = triangle.a.uv1;
193
- uv1 = triangle.b.uv1;
194
- uv2 = triangle.c.uv1;
195
- }
196
-
197
- var uv_info = barycentric_interpolate_uv(barycentric, uv0, uv1, uv2);
198
-
199
- let uv_derivative_bias = MIP_BIAS / view.upscale_ratio;
200
-
201
- uv_info.ddx *= uv_derivative_bias.x;
202
- uv_info.ddy *= uv_derivative_bias.y;
203
-
204
- // ── request ─────────────────────────────────────────────────────
205
- let uv_wrapped = vt_stack_wrap_uv(uv_info.uv, info.flags);
206
-
207
- let mip = vt_mip_select(info, uv_info.ddx, uv_info.ddy, vt_params.mip_bias);
208
-
209
- let page = vt_page_coord(info, uv_wrapped, mip);
210
-
211
- vt_request_insert(vt_request_key_pack(stack_id, mip, page));
212
- }
213
- `,
214
- [
215
- chunk_vt_lookup,
216
- chunk_vt_request_key,
217
- chunk_hash_lowbias32,
218
- chunk_scene_database_access,
219
- chunk_decode_meshlet_element,
220
- chunk_read_meshlet_triangle_vertices,
221
- chunk_barycentric_full,
222
- chunk_barycentric_interpolate_uv,
223
- ]
224
- );
225
-
226
- return ComputeShader.from({
227
- label: 'vt/feedback',
228
- body,
229
- resources,
230
- group_size: [VT_FEEDBACK_WORKGROUP_SIZE, VT_FEEDBACK_WORKGROUP_SIZE, 1],
231
- });
232
- }
1
+ import { atomic_u32, f32, u32, vec2u } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
+ import { GEOMETRY_ATTRIBUTE_DATA_TYPE } from "../../geometry/GEOMETRY_ATTRIBUTE_DATA_TYPE.js";
5
+ import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
6
+ import {
7
+ VIZ_BUFFER_INVALID_MESH_VALUE
8
+ } from "../../rasterize/native/viz/VIZ_BUFFER_INVALID_MESH_VALUE.js";
9
+ import { MATERIAL_METADATA_STRUCT } from "../../material/MATERIAL_METADATA_STRUCT.js";
10
+ import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
11
+ import { RENDER_GLOBAL_MIP_BIAS } from "../../postprocess/taa/RENDER_GLOBAL_MIP_BIAS.js";
12
+ import { chunk_barycentric_full } from "../../shader/chunk/geometry/triangle/chunk_barycentric_full.js";
13
+ import { chunk_barycentric_interpolate_uv } from "../../shader/chunk/geometry/triangle/chunk_barycentric_interpolate_uv.js";
14
+ import { chunk_decode_meshlet_element } from "../../shader/chunk/geometry/meshlet/chunk_decode_meshlet_element.js";
15
+ import {
16
+ chunk_read_meshlet_triangle_vertices
17
+ } from "../../shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_vertices.js";
18
+ import { chunk_hash_lowbias32 } from "../../shader/chunk/random/chunk_hash_lowbias32.js";
19
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
20
+ import { ComputeShader } from "../../shader/ComputeShader.js";
21
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
22
+ import { VIEW_UNIFORM_STRUCT } from "../../view/VIEW_UNIFORM_STRUCT.js";
23
+ import { chunk_vt_request_key } from "./chunk_vt_request_key.js";
24
+ import { VT_STACK_ID_INVALID } from "./VT_CONSTANTS.js";
25
+ import { VT_STACK_INFO_STRUCT } from "./VT_STACK_INFO_STRUCT.js";
26
+
27
+ /**
28
+ * Uniform parameters of the feedback pass.
29
+ *
30
+ * `stride` — the pass samples one pixel per stride×stride block;
31
+ * `jitter` — which pixel of the block this frame (cycled by the manager so
32
+ * coverage integrates to every pixel over stride² frames);
33
+ * `mip_bias` — added to the requested LOD; carries the residency
34
+ * (over-subscription) bias so pressure degrades to blur instead of thrash.
35
+ */
36
+ export const VT_FEEDBACK_PARAMS_STRUCT = WebGPUStruct.from({
37
+ stride: u32,
38
+ jitter: vec2u,
39
+ mip_bias: f32,
40
+ }, "VTFeedbackParams").pack();
41
+
42
+ /**
43
+ * Matches the fragment_gbuffer derivative bias so feedback requests the mips
44
+ * the material pass actually samples.
45
+ * @type {number}
46
+ */
47
+ const MIP_DERIVATIVE_BIAS = 1 / (1 - RENDER_GLOBAL_MIP_BIAS);
48
+
49
+ export const VT_FEEDBACK_WORKGROUP_SIZE = 8;
50
+
51
+ /**
52
+ * Builds the feedback compute shader: one thread per sampled pixel, reading
53
+ * the visibility buffer and reproducing the material pass's UV + analytic
54
+ * gradient math (vertex pulling + perspective-correct barycentric
55
+ * derivatives), then inserting the touched (stack, mip, page) key into a
56
+ * global hash set of unique requests.
57
+ *
58
+ * This is the "no second geometry pass" property: the viz buffer already
59
+ * identifies the triangle per pixel, so usage detection is a bounded-cost
60
+ * screen-space compute pass regardless of scene complexity, shared by every
61
+ * virtual texture in the frame.
62
+ *
63
+ * The hash set is insert-only and cleared each frame; the CPU reads the raw
64
+ * table back and treats presence as "touched this frame" — both residency
65
+ * touches (LRU) and misses (load requests) fall out of the same data.
66
+ *
67
+ * @param {Object} config
68
+ * @param {CodeChunk} config.chunk_vt_lookup from {@link build_chunk_vt_lookup}
69
+ * @param {number} config.hash_capacity power of two
70
+ * @returns {ComputeShader}
71
+ */
72
+ export function build_shader_vt_feedback({ chunk_vt_lookup, hash_capacity }) {
73
+
74
+ const resources = new ShaderResourceSetDescriptor();
75
+
76
+ resources.createGroup()
77
+ .addTexture("viz_buffer_triangle", "uint")
78
+ .addTexture("viz_buffer_mesh", "uint")
79
+ .addUniform("view", VIEW_UNIFORM_STRUCT)
80
+ .addUniform("vt_params", VT_FEEDBACK_PARAMS_STRUCT)
81
+ .addStorageBuffer("scene_database", WebGPUArray.from(u32))
82
+ .addStorageBuffer("meshlet_metadata", WebGPUArray.from(MESHLET_METADATA_STRUCT))
83
+ .addStorageBuffer("meshlet_data", GEOMETRY_ATTRIBUTE_DATA_TYPE)
84
+ .addStorageBuffer("material_metadata", WebGPUArray.from(MATERIAL_METADATA_STRUCT))
85
+ .addStorageBuffer("vt_stacks", WebGPUArray.from(VT_STACK_INFO_STRUCT))
86
+ .addStorageBuffer("vt_requests", WebGPUArray.from(atomic_u32), true);
87
+
88
+ const body = CodeChunk.from(
89
+ //language=WGSL
90
+ `
91
+ const VT_HASH_CAPACITY_MASK: u32 = ${hash_capacity - 1}u;
92
+ const VT_HASH_MAX_PROBES: u32 = 32u;
93
+
94
+ const MIP_BIAS: f32 = ${MIP_DERIVATIVE_BIAS.toFixed(8)};
95
+
96
+ // Insert-only open-addressing hash set. Values are stored as key+1 so a
97
+ // zero-cleared buffer means "all empty" (same conventions as
98
+ // common/hash_table, which is the CPU-build/GPU-read counterpart of this
99
+ // GPU-insert/CPU-read set; see also the SHARC hash map for the bucketed
100
+ // key->index variant).
101
+ //
102
+ // Forward-progress note: this loop never waits on another invocation's
103
+ // progress. The atomicCompareExchangeWeak retry only re-tests a *local*
104
+ // spurious failure, every iteration consumes the shared probe budget, and
105
+ // the loop is hard-bounded at VT_HASH_MAX_PROBES regardless of what other
106
+ // threads do. On exhaustion the fallback is to DROP the request — benign,
107
+ // feedback re-emits it next frame. Contrast with the decoupled-lookback
108
+ // spin in common/prefix_sum/v1/shader_prefix_scan_csdldf.js, where the
109
+ // awaited value is required for correctness and the bounded spin
110
+ // (MAX_SPIN_COUNT) must therefore pair with a local recompute fallback.
111
+ fn vt_request_insert(key: u32) {
112
+ let stored = key + 1u;
113
+
114
+ var h = hash_lowbias32(key) & VT_HASH_CAPACITY_MASK;
115
+
116
+ for (var i = 0u; i < VT_HASH_MAX_PROBES; i++) {
117
+ let existing = atomicLoad(&vt_requests[h]);
118
+
119
+ if (existing == stored) {
120
+ return;
121
+ }
122
+
123
+ if (existing == 0u) {
124
+ let r = atomicCompareExchangeWeak(&vt_requests[h], 0u, stored);
125
+
126
+ if (r.exchanged || r.old_value == stored) {
127
+ return;
128
+ }
129
+
130
+ if (r.old_value == 0u) {
131
+ // spurious weak failure — retry the same slot
132
+ continue;
133
+ }
134
+ }
135
+
136
+ h = (h + 1u) & VT_HASH_CAPACITY_MASK;
137
+ }
138
+ }
139
+
140
+ @compute @workgroup_size(${VT_FEEDBACK_WORKGROUP_SIZE}, ${VT_FEEDBACK_WORKGROUP_SIZE}, 1)
141
+ fn main(
142
+ @builtin(global_invocation_id) gid: vec3<u32>,
143
+ ) {
144
+ let pixel = gid.xy * vt_params.stride + vt_params.jitter;
145
+
146
+ if (pixel.x >= view.width || pixel.y >= view.height) {
147
+ return;
148
+ }
149
+
150
+ let mesh_index = textureLoad(viz_buffer_mesh, vec2<i32>(pixel), 0).r;
151
+
152
+ if (mesh_index == ${VIZ_BUFFER_INVALID_MESH_VALUE}u) {
153
+ return;
154
+ }
155
+
156
+ let mesh = scene_read_mesh(&scene_database, mesh_index);
157
+
158
+ let stack_id = material_metadata[mesh.material].vt_stack;
159
+
160
+ if (stack_id == ${VT_STACK_ID_INVALID}u) {
161
+ return;
162
+ }
163
+
164
+ let info = vt_stacks[stack_id];
165
+
166
+ // ── UV + gradients, mirroring fragment_gbuffer ──────────────────
167
+ let encoded_meshlet_triangle = textureLoad(viz_buffer_triangle, vec2<i32>(pixel), 0).r;
168
+
169
+ let decoded = decode_meshlet_element(encoded_meshlet_triangle);
170
+ let meshlet_id = decoded[0];
171
+ let meshlet_triangle_id = decoded[1];
172
+
173
+ let node = scene_read_node(&scene_database, mesh.node);
174
+
175
+ let triangle = read_meshlet_triangle_vertices(meshlet_id, meshlet_triangle_id);
176
+
177
+ let mesh_transform = node.global;
178
+
179
+ let p0 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.a.position, 1.0));
180
+ let p1 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.b.position, 1.0));
181
+ let p2 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.c.position, 1.0));
182
+
183
+ let pixel_center = vec2<f32>(pixel) + 0.5;
184
+
185
+ let barycentric = barycentric_full(p0, p1, p2, pixel_center);
186
+
187
+ var uv0 = triangle.a.uv;
188
+ var uv1 = triangle.b.uv;
189
+ var uv2 = triangle.c.uv;
190
+
191
+ if ((info.flags & VT_STACK_FLAG_UV_SET_1) != 0u) {
192
+ uv0 = triangle.a.uv1;
193
+ uv1 = triangle.b.uv1;
194
+ uv2 = triangle.c.uv1;
195
+ }
196
+
197
+ var uv_info = barycentric_interpolate_uv(barycentric, uv0, uv1, uv2);
198
+
199
+ let uv_derivative_bias = MIP_BIAS / view.upscale_ratio;
200
+
201
+ uv_info.ddx *= uv_derivative_bias.x;
202
+ uv_info.ddy *= uv_derivative_bias.y;
203
+
204
+ // ── request ─────────────────────────────────────────────────────
205
+ let uv_wrapped = vt_stack_wrap_uv(uv_info.uv, info.flags);
206
+
207
+ let mip = vt_mip_select(info, uv_info.ddx, uv_info.ddy, vt_params.mip_bias);
208
+
209
+ let page = vt_page_coord(info, uv_wrapped, mip);
210
+
211
+ vt_request_insert(vt_request_key_pack(stack_id, mip, page));
212
+ }
213
+ `,
214
+ [
215
+ chunk_vt_lookup,
216
+ chunk_vt_request_key,
217
+ chunk_hash_lowbias32,
218
+ chunk_scene_database_access,
219
+ chunk_decode_meshlet_element,
220
+ chunk_read_meshlet_triangle_vertices,
221
+ chunk_barycentric_full,
222
+ chunk_barycentric_interpolate_uv,
223
+ ]
224
+ );
225
+
226
+ return ComputeShader.from({
227
+ label: 'vt/feedback',
228
+ body,
229
+ resources,
230
+ });
231
+ }
@@ -24,7 +24,7 @@ import { VOLUMETRICS_RESOLUTION_Z } from "./VOLUMETRICS_RESOLUTION_Z.js";
24
24
  /**
25
25
  * resolution of a single froxel in XY, in pixels
26
26
  */
27
- const TILE_SIZE = 8;
27
+ const TILE_SIZE = 16;
28
28
 
29
29
  export class GPUViewVolumetrics {
30
30
 
@@ -1 +1 @@
1
- {"version":3,"file":"graph_build_volumetrics.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/graph_build_volumetrics.js"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,4DAFa;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAC,CAgEjE;AAqTD;;;;;;;;;;;;;;;;;;GAkBG;AACH;;;;;EAwKC"}
1
+ {"version":3,"file":"graph_build_volumetrics.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/graph_build_volumetrics.js"],"names":[],"mappings":"AAyBA;;;;;;;GAOG;AACH,4DAFa;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAC,CAgEjE;AAqTD;;;;;;;;;;;;;;;;;;GAkBG;AACH;;;;;EAwKC"}
@@ -9,10 +9,7 @@ import { SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR } from "../shadow/map/SHADOWMAP_CO
9
9
  import { STATIC_GRAPHICS_ENGINE_ASSETS } from "../STATIC_GRAPHICS_ENGINE_ASSETS.js";
10
10
  import { DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR } from "../texture/DEFAULT_RENDER_TARGET_VIEW_DESCRIPTOR.js";
11
11
  import { volumetrics_sun_shadow_texture_name } from "./chunk_volumetrics_sun_optical_depth.js";
12
- import {
13
- shader_volumetrics_build_lighting,
14
- VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION
15
- } from "./shader_volumetrics_build_lighting.js";
12
+ import { shader_volumetrics_build_lighting } from "./shader_volumetrics_build_lighting.js";
16
13
  import { shader_volumetrics_build_participating_media } from "./shader_volumetrics_build_participating_media.js";
17
14
  import { shader_volumetrics_build_scattering_lut } from "./shader_volumetrics_build_scattering_lut.js";
18
15
  import {
@@ -144,11 +141,11 @@ function graph_integrate_participating_media({
144
141
 
145
142
  const volumetrics_metadata = resources.get(data.volumetrics_metadata);
146
143
 
147
- shader_volumetrics_build_participating_media.dispatch({
144
+ shader_volumetrics_build_participating_media.dispatchThreads({
148
145
  encoder,
149
- group_count_x: Math.ceil(output0.width / 16),
150
- group_count_y: Math.ceil(output0.height / 16),
151
- group_count_z: output0.depth,
146
+ thread_count_x: output0.width,
147
+ thread_count_y: output0.height,
148
+ thread_count_z: output0.depth,
152
149
  bindings: {
153
150
  camera: camera.buffer.buffer,
154
151
  view: view.uniform_buffer.buffer,
@@ -371,11 +368,11 @@ function graph_integrate_light_scattering({
371
368
  bindings[volumetrics_sun_shadow_texture_name(cascade)] = sun_shadow_cascades[cascade].obtainView();
372
369
  }
373
370
 
374
- shader_volumetrics_build_lighting.dispatch({
371
+ shader_volumetrics_build_lighting.dispatchThreads({
375
372
  encoder,
376
- group_count_x: Math.ceil(output.width / VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION[0]),
377
- group_count_y: Math.ceil(output.height / VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION[1]),
378
- group_count_z: Math.ceil(output.depth / VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION[2]),
373
+ thread_count_x: output.width,
374
+ thread_count_y: output.height,
375
+ thread_count_z: output.depth,
379
376
  bindings
380
377
  })
381
378
  });
@@ -538,10 +535,10 @@ export function graph_build_volumetrics({
538
535
 
539
536
  const tSTBN_vec3 = graphics.textures.obtain(STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec3);
540
537
 
541
- shader_volumetrics_build_scattering_lut.dispatch({
538
+ shader_volumetrics_build_scattering_lut.dispatchThreads({
542
539
  encoder,
543
- group_count_x: Math.ceil(output.width / 16),
544
- group_count_y: Math.ceil(output.height / 16),
540
+ thread_count_x: output.width,
541
+ thread_count_y: output.height,
545
542
  bindings: {
546
543
  camera: camera.buffer.buffer,
547
544
  view: view.uniform_buffer.buffer,
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Workgroup shape of this pass, `[x, y, z]` in froxels, read by both the `@workgroup_size` below
3
- * and the dispatch in `graph_build_volumetrics` so the two cannot drift.
2
+ * Workgroup shape of this pass, `[x, y, z]` in froxels, stated to the `@workgroup_size` below.
3
+ * That attribute is where the dispatch gets the shape from in turn: `graph_build_volumetrics` asks
4
+ * for a thread count and `ComputeShader` divides by the size it read back out of the WGSL.
4
5
  *
5
6
  * Flat in z. Lights are binned into 3D clusters and the largest distance between neighbouring
6
7
  * clusters is along depth, so a group spanning z is the one spanning the most unrelated light
@@ -1 +1 @@
1
- {"version":3,"file":"shader_volumetrics_build_lighting.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js"],"names":[],"mappings":"AA6CA;;;;;;;;;;;;;;GAcG;AACH,wDAFU,MAAM,EAAE,CAEiD;AAkXnE,8DAIE;8BA9Z4B,4BAA4B"}
1
+ {"version":3,"file":"shader_volumetrics_build_lighting.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js"],"names":[],"mappings":"AA6CA;;;;;;;;;;;;;;;GAeG;AACH,wDAFU,MAAM,EAAE,CAEiD;AAkXnE,8DAIE;8BA/Z4B,4BAA4B"}
@@ -44,8 +44,9 @@ import { chunk_volumetrics_local_light_shadow } from "./chunk_volumetrics_local_
44
44
  import { VOLUMETRICS_METADATA_STRUCT } from "./VOLUMETRICS_METADATA_STRUCT.js";
45
45
 
46
46
  /**
47
- * Workgroup shape of this pass, `[x, y, z]` in froxels, read by both the `@workgroup_size` below
48
- * and the dispatch in `graph_build_volumetrics` so the two cannot drift.
47
+ * Workgroup shape of this pass, `[x, y, z]` in froxels, stated to the `@workgroup_size` below.
48
+ * That attribute is where the dispatch gets the shape from in turn: `graph_build_volumetrics` asks
49
+ * for a thread count and `ComputeShader` divides by the size it read back out of the WGSL.
49
50
  *
50
51
  * Flat in z. Lights are binned into 3D clusters and the largest distance between neighbouring
51
52
  * clusters is along depth, so a group spanning z is the one spanning the most unrelated light
@@ -1,5 +1,3 @@
1
- export const chunk_volumetrics_froxel_coord_to_uvw: CodeChunk;
2
1
  export const shader_volumetrics_taa: ComputeShader;
3
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
4
2
  import { ComputeShader } from "../../shader/ComputeShader.js";
5
3
  //# sourceMappingURL=shader_volumetrics_taa.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_volumetrics_taa.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js"],"names":[],"mappings":"AA0FA,8DAsCC;AA+LD,mDAIG;0BA1TuB,oCAAoC;8BAChC,+BAA+B"}
1
+ {"version":3,"file":"shader_volumetrics_taa.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js"],"names":[],"mappings":"AA0UA,mDAIG;8BApU2B,+BAA+B"}
@@ -88,10 +88,23 @@ fn texture_sample_blackman_harris_3d(
88
88
  [chunk_filter_blackman_harris229]
89
89
  );
90
90
 
91
- export const chunk_volumetrics_froxel_coord_to_uvw = CodeChunk.from(
91
+ /**
92
+ * Froxel coordinate -> a sample point for `frustum_sample_point`, NOT a froxel texture coordinate.
93
+ *
94
+ * That distinction is the whole reason this is not `volumetrics_position_world_to_froxel_uvw`
95
+ * turned around. There `w` is slice space -- `log2(fma(depth, x, y)) * z`, corrected by the
96
+ * cell-averaged content offset -- because it addresses the 3D texture. Here `w` is a LINEAR
97
+ * fraction of the near..far range, because its only consumer is `frustum_sample_point`, which
98
+ * mixes the near and far planes linearly. The two agree at the endpoints and nowhere between, so
99
+ * feeding this `w` to a froxel textureSample reads the wrong slab.
100
+ *
101
+ * @see volumetrics_position_world_to_froxel_uvw
102
+ * @type {CodeChunk}
103
+ */
104
+ const chunk_volumetrics_froxel_coord_to_frustum_uvw = CodeChunk.from(
92
105
  //language=WGSL
93
106
  `
94
- fn volumetrics_froxel_coord_to_uvw(
107
+ fn volumetrics_froxel_coord_to_frustum_uvw(
95
108
  coord: vec3<u32>,
96
109
  res: vec3<u32>,
97
110
  camera: ${CAMERA_UNIFORM_STRUCT.wgsl_ref},
@@ -139,7 +152,7 @@ fn world_pos_from_froxel(
139
152
  cluster_params: vec3f,
140
153
  frustum: array<vec4<f32>, 6>
141
154
  ) -> vec3f {
142
- let uvw = volumetrics_froxel_coord_to_uvw(coord, res, camera, cluster_params);
155
+ let uvw = volumetrics_froxel_coord_to_frustum_uvw(coord, res, camera, cluster_params);
143
156
 
144
157
  // Reconstruct the froxel-centre world position. frustum_sample_point intersects the
145
158
  // interpolated L/R, B/T, N/F planes; X maps left->left and Z maps near->far directly, so only
@@ -150,7 +163,7 @@ fn world_pos_from_froxel(
150
163
  return frustum_sample_point(frustum, vec3f(uvw.x, 1.0 - uvw.y, uvw.z));
151
164
  }
152
165
  `, [
153
- chunk_volumetrics_froxel_coord_to_uvw,
166
+ chunk_volumetrics_froxel_coord_to_frustum_uvw,
154
167
  chunk_frustum_sample_point,
155
168
  ]);
156
169
 
@@ -312,8 +325,6 @@ fn main(@builtin(global_invocation_id) voxel_id: vec3<u32>) {
312
325
  chunk_ndc_to_uv,
313
326
  chunk_volumetric_history_bounding_box,
314
327
  chunk_aabb4_normalized_dist,
315
- chunk_volumetrics_froxel_coord_to_uvw,
316
- chunk_frustum_sample_point,
317
328
  ]
318
329
  );
319
330