@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,143 +1,142 @@
1
- import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
- import { BVH_NULL_NODE_DEFINITION } from "../../shader/chunk/bvh/BVH_NULL_NODE_DEFINITION.js";
4
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
- import { ComputeShader } from "../../shader/ComputeShader.js";
6
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
- import {
8
- BVH_NODE_BOUNDS_WORD,
9
- BVH_NODE_CHILD_1_WORD,
10
- BVH_NODE_CHILD_2_WORD,
11
- BVH_NODE_STRIDE_WORDS
12
- } from "./BVH_BUFFER_LAYOUT.js";
13
- import { BVH_BUILD_SETTINGS_STRUCT, BVH_NO_ROOT_WORD } from "./BVH_BUILD_SETTINGS_STRUCT.js";
14
- import { chunk_bvh_determine_range } from "./chunk_bvh_determine_range.js";
15
- import { chunk_bvh_find_split } from "./chunk_bvh_find_split.js";
16
-
17
- export const BVH_EMIT_WORKGROUP_SIZE = 64;
18
-
19
- const resources = new ShaderResourceSetDescriptor();
20
- resources.createGroup()
21
- .addUniform("settings", BVH_BUILD_SETTINGS_STRUCT)
22
- // sorted Morton codes, and the leaf index each one came from
23
- .addStorageBuffer("keys", WebGPUArray.from(u32), false)
24
- .addStorageBuffer("values", WebGPUArray.from(u32), false)
25
- .addStorageBuffer("leaf_bounds", WebGPUArray.from(f32), false)
26
- .addStorageBuffer("leaf_payload", WebGPUArray.from(u32), false)
27
- // `{root: u32, nodes: array<BVH2_NODE_STRUCT>}`, written flat
28
- .addStorageBuffer("nodes", WebGPUArray.from(u32), true)
29
- // parent of every node, indexed the same way the node buffer is
30
- .addStorageBuffer("parents", WebGPUArray.from(u32), true)
31
- // which node each leaf ordinal lives at — see the shader's note on why this is written out
32
- .addStorageBuffer("leaf_nodes", WebGPUArray.from(u32), true);
33
-
34
- const body = CodeChunk.from(
35
- //language=WGSL
36
- `
37
- const NODE_STRIDE = ${BVH_NODE_STRIDE_WORDS}u;
38
- const NODE_BOUNDS = ${BVH_NODE_BOUNDS_WORD}u;
39
- const NODE_CHILD_1 = ${BVH_NODE_CHILD_1_WORD}u;
40
- const NODE_CHILD_2 = ${BVH_NODE_CHILD_2_WORD}u;
41
- const NO_ROOT_WORD = ${BVH_NO_ROOT_WORD}u;
42
-
43
- fn bvh_node_word(node: u32) -> u32 {
44
- return settings.node_word_offset + node * NODE_STRIDE;
45
- }
46
-
47
- @compute @workgroup_size(${BVH_EMIT_WORKGROUP_SIZE}, 1, 1)
48
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
49
- let i = gid.x;
50
- let n = settings.element_count;
51
-
52
- if (i >= n) {
53
- return;
54
- }
55
-
56
- // Leaf j lives at node (n-1)+j, internal node k at node k. Root is internal node 0 by Karras's
57
- // construction — it is the node whose range is the whole array.
58
- let leaf_source = values[i];
59
- let leaf_node = (n - 1u) + i;
60
-
61
- let bounds_source = leaf_source * 6u;
62
- let leaf_word = bvh_node_word(leaf_node);
63
-
64
- for (var k = 0u; k < 6u; k += 1u) {
65
- nodes[leaf_word + NODE_BOUNDS + k] = bitcast<u32>(leaf_bounds[bounds_source + k]);
66
- }
67
-
68
- nodes[leaf_word + NODE_CHILD_1] = BVH_NULL_NODE;
69
- nodes[leaf_word + NODE_CHILD_2] = leaf_payload[leaf_source];
70
-
71
- // Where the leaves are is an output of construction, not a convention two kernels have to
72
- // share. For this layout it is (n-1)+i and the refit could work it out — but a tree that was
73
- // copied rather than built has its leaves wherever its builder put them, and the refit reads
74
- // this the same way for both.
75
- leaf_nodes[i] = leaf_node;
76
-
77
- // n leaves, n-1 internal nodes — the tail thread has only a leaf to write.
78
- if (i < n - 1u) {
79
- let range = bvh_determine_range(&keys, n, i);
80
-
81
- let first = range.x;
82
- let last = range.y;
83
-
84
- let split = bvh_find_split(&keys, n, first, last);
85
-
86
- // A subrange of one element is a leaf; otherwise it is owned by the internal node whose
87
- // left boundary sits at that code index.
88
- let child_1 = select(split, (n - 1u) + split, split == first);
89
- let child_2 = select(split + 1u, (n - 1u) + split + 1u, split + 1u == last);
90
-
91
- let node_word = bvh_node_word(i);
92
-
93
- nodes[node_word + NODE_CHILD_1] = child_1;
94
- nodes[node_word + NODE_CHILD_2] = child_2;
95
-
96
- // The refit climbs these; internal-node bounds are its business, not this pass's.
97
- parents[child_1] = i;
98
- parents[child_2] = i;
99
- }
100
-
101
- if (i == 0u) {
102
- // Constant by construction, but a tree whose format has a root word has consumers that read
103
- // it. A BLAS has none — its root is node 0 by convention — and says so with NO_ROOT_WORD.
104
- if (settings.root_word_offset != NO_ROOT_WORD) {
105
- nodes[settings.root_word_offset] = 0u;
106
- }
107
-
108
- // Where the refit's climb stops.
109
- parents[0] = BVH_NULL_NODE;
110
- }
111
- }
112
- `, [
113
- BVH_NULL_NODE_DEFINITION,
114
- chunk_bvh_determine_range,
115
- chunk_bvh_find_split,
116
- ]);
117
-
118
- /**
119
- * Karras hierarchy emission — pass 3 of {@link graph_bvh_build_lbvh}, and a transliteration of
120
- * {@link ebvh_build_hierarchy_radix} with the DXR Fallback's index layout: internal node `k` at node
121
- * `k` (root = 0), leaf `j` at node `(n-1)+j`, `2n-1` nodes in total.
122
- *
123
- * Node indices are local to the tree; where node 0 actually lands is `settings.node_word_offset`,
124
- * so the same kernel writes a TLAS that owns its buffer and a BLAS that is a tenant in a shared
125
- * arena. Root-at-node-0 is what both conventions want, which is why one kernel can serve them.
126
- *
127
- * One dispatch of `n` threads with a tail `if`, which is the canonical LBVH formulation: thread `i`
128
- * always writes leaf `(n-1)+i`, and threads below `n-1` additionally derive internal node `i`'s
129
- * range and split and wire its two children.
130
- *
131
- * Barrier-free, atomic-free, subgroup-free, and a pure function of the sorted keys — deliberately,
132
- * because that is what lets the WGSL emulator execute this kernel point-wise in vitest against the
133
- * in-repo CPU oracle, duplicate-code runs and all. Internal-node bounds are left to
134
- * {@link shader_bvh_refit}.
135
- *
136
- * @type {ComputeShader}
137
- */
138
- export const shader_bvh_emit_hierarchy = ComputeShader.from({
139
- label: "BVHBuild/EmitHierarchy",
140
- resources,
141
- body,
142
- group_size: [BVH_EMIT_WORKGROUP_SIZE, 1, 1],
143
- });
1
+ import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { BVH_NULL_NODE_DEFINITION } from "../../shader/chunk/bvh/BVH_NULL_NODE_DEFINITION.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { ComputeShader } from "../../shader/ComputeShader.js";
6
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import {
8
+ BVH_NODE_BOUNDS_WORD,
9
+ BVH_NODE_CHILD_1_WORD,
10
+ BVH_NODE_CHILD_2_WORD,
11
+ BVH_NODE_STRIDE_WORDS
12
+ } from "./BVH_BUFFER_LAYOUT.js";
13
+ import { BVH_BUILD_SETTINGS_STRUCT, BVH_NO_ROOT_WORD } from "./BVH_BUILD_SETTINGS_STRUCT.js";
14
+ import { chunk_bvh_determine_range } from "./chunk_bvh_determine_range.js";
15
+ import { chunk_bvh_find_split } from "./chunk_bvh_find_split.js";
16
+
17
+ export const BVH_EMIT_WORKGROUP_SIZE = 64;
18
+
19
+ const resources = new ShaderResourceSetDescriptor();
20
+ resources.createGroup()
21
+ .addUniform("settings", BVH_BUILD_SETTINGS_STRUCT)
22
+ // sorted Morton codes, and the leaf index each one came from
23
+ .addStorageBuffer("keys", WebGPUArray.from(u32), false)
24
+ .addStorageBuffer("values", WebGPUArray.from(u32), false)
25
+ .addStorageBuffer("leaf_bounds", WebGPUArray.from(f32), false)
26
+ .addStorageBuffer("leaf_payload", WebGPUArray.from(u32), false)
27
+ // `{root: u32, nodes: array<BVH2_NODE_STRUCT>}`, written flat
28
+ .addStorageBuffer("nodes", WebGPUArray.from(u32), true)
29
+ // parent of every node, indexed the same way the node buffer is
30
+ .addStorageBuffer("parents", WebGPUArray.from(u32), true)
31
+ // which node each leaf ordinal lives at — see the shader's note on why this is written out
32
+ .addStorageBuffer("leaf_nodes", WebGPUArray.from(u32), true);
33
+
34
+ const body = CodeChunk.from(
35
+ //language=WGSL
36
+ `
37
+ const NODE_STRIDE = ${BVH_NODE_STRIDE_WORDS}u;
38
+ const NODE_BOUNDS = ${BVH_NODE_BOUNDS_WORD}u;
39
+ const NODE_CHILD_1 = ${BVH_NODE_CHILD_1_WORD}u;
40
+ const NODE_CHILD_2 = ${BVH_NODE_CHILD_2_WORD}u;
41
+ const NO_ROOT_WORD = ${BVH_NO_ROOT_WORD}u;
42
+
43
+ fn bvh_node_word(node: u32) -> u32 {
44
+ return settings.node_word_offset + node * NODE_STRIDE;
45
+ }
46
+
47
+ @compute @workgroup_size(${BVH_EMIT_WORKGROUP_SIZE}, 1, 1)
48
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
49
+ let i = gid.x;
50
+ let n = settings.element_count;
51
+
52
+ if (i >= n) {
53
+ return;
54
+ }
55
+
56
+ // Leaf j lives at node (n-1)+j, internal node k at node k. Root is internal node 0 by Karras's
57
+ // construction — it is the node whose range is the whole array.
58
+ let leaf_source = values[i];
59
+ let leaf_node = (n - 1u) + i;
60
+
61
+ let bounds_source = leaf_source * 6u;
62
+ let leaf_word = bvh_node_word(leaf_node);
63
+
64
+ for (var k = 0u; k < 6u; k += 1u) {
65
+ nodes[leaf_word + NODE_BOUNDS + k] = bitcast<u32>(leaf_bounds[bounds_source + k]);
66
+ }
67
+
68
+ nodes[leaf_word + NODE_CHILD_1] = BVH_NULL_NODE;
69
+ nodes[leaf_word + NODE_CHILD_2] = leaf_payload[leaf_source];
70
+
71
+ // Where the leaves are is an output of construction, not a convention two kernels have to
72
+ // share. For this layout it is (n-1)+i and the refit could work it out — but a tree that was
73
+ // copied rather than built has its leaves wherever its builder put them, and the refit reads
74
+ // this the same way for both.
75
+ leaf_nodes[i] = leaf_node;
76
+
77
+ // n leaves, n-1 internal nodes — the tail thread has only a leaf to write.
78
+ if (i < n - 1u) {
79
+ let range = bvh_determine_range(&keys, n, i);
80
+
81
+ let first = range.x;
82
+ let last = range.y;
83
+
84
+ let split = bvh_find_split(&keys, n, first, last);
85
+
86
+ // A subrange of one element is a leaf; otherwise it is owned by the internal node whose
87
+ // left boundary sits at that code index.
88
+ let child_1 = select(split, (n - 1u) + split, split == first);
89
+ let child_2 = select(split + 1u, (n - 1u) + split + 1u, split + 1u == last);
90
+
91
+ let node_word = bvh_node_word(i);
92
+
93
+ nodes[node_word + NODE_CHILD_1] = child_1;
94
+ nodes[node_word + NODE_CHILD_2] = child_2;
95
+
96
+ // The refit climbs these; internal-node bounds are its business, not this pass's.
97
+ parents[child_1] = i;
98
+ parents[child_2] = i;
99
+ }
100
+
101
+ if (i == 0u) {
102
+ // Constant by construction, but a tree whose format has a root word has consumers that read
103
+ // it. A BLAS has none — its root is node 0 by convention — and says so with NO_ROOT_WORD.
104
+ if (settings.root_word_offset != NO_ROOT_WORD) {
105
+ nodes[settings.root_word_offset] = 0u;
106
+ }
107
+
108
+ // Where the refit's climb stops.
109
+ parents[0] = BVH_NULL_NODE;
110
+ }
111
+ }
112
+ `, [
113
+ BVH_NULL_NODE_DEFINITION,
114
+ chunk_bvh_determine_range,
115
+ chunk_bvh_find_split,
116
+ ]);
117
+
118
+ /**
119
+ * Karras hierarchy emission — pass 3 of {@link graph_bvh_build_lbvh}, and a transliteration of
120
+ * {@link ebvh_build_hierarchy_radix} with the DXR Fallback's index layout: internal node `k` at node
121
+ * `k` (root = 0), leaf `j` at node `(n-1)+j`, `2n-1` nodes in total.
122
+ *
123
+ * Node indices are local to the tree; where node 0 actually lands is `settings.node_word_offset`,
124
+ * so the same kernel writes a TLAS that owns its buffer and a BLAS that is a tenant in a shared
125
+ * arena. Root-at-node-0 is what both conventions want, which is why one kernel can serve them.
126
+ *
127
+ * One dispatch of `n` threads with a tail `if`, which is the canonical LBVH formulation: thread `i`
128
+ * always writes leaf `(n-1)+i`, and threads below `n-1` additionally derive internal node `i`'s
129
+ * range and split and wire its two children.
130
+ *
131
+ * Barrier-free, atomic-free, subgroup-free, and a pure function of the sorted keys — deliberately,
132
+ * because that is what lets the WGSL emulator execute this kernel point-wise in vitest against the
133
+ * in-repo CPU oracle, duplicate-code runs and all. Internal-node bounds are left to
134
+ * {@link shader_bvh_refit}.
135
+ *
136
+ * @type {ComputeShader}
137
+ */
138
+ export const shader_bvh_emit_hierarchy = ComputeShader.from({
139
+ label: "BVHBuild/EmitHierarchy",
140
+ resources,
141
+ body,
142
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_bvh_morton.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js"],"names":[],"mappings":"AAQA,2CAA4C;AAwD5C;;;;;;;;;;;;GAYG;AACH,gCAFU,aAAa,CAOpB;8BA9E2B,+BAA+B"}
1
+ {"version":3,"file":"shader_bvh_morton.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js"],"names":[],"mappings":"AAQA,2CAA4C;AAwD5C;;;;;;;;;;;;GAYG;AACH,gCAFU,aAAa,CAMpB;8BA7E2B,+BAA+B"}
@@ -79,5 +79,4 @@ export const shader_bvh_morton = ComputeShader.from({
79
79
  label: "BVHBuild/Morton",
80
80
  resources,
81
81
  body,
82
- group_size: [BVH_MORTON_WORKGROUP_SIZE, 1, 1],
83
82
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_bvh_refit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js"],"names":[],"mappings":"AAcA,0CAA2C;AAqG3C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,+BAFU,aAAa,CAOpB;8BAxI2B,+BAA+B"}
1
+ {"version":3,"file":"shader_bvh_refit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js"],"names":[],"mappings":"AAcA,0CAA2C;AAqG3C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,+BAFU,aAAa,CAMpB;8BAvI2B,+BAA+B"}
@@ -1,141 +1,140 @@
1
- import { atomic_u32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
- import { BVH_NULL_NODE_DEFINITION } from "../../shader/chunk/bvh/BVH_NULL_NODE_DEFINITION.js";
4
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
- import { ComputeShader } from "../../shader/ComputeShader.js";
6
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
- import {
8
- BVH_NODE_BOUNDS_WORD,
9
- BVH_NODE_CHILD_1_WORD,
10
- BVH_NODE_CHILD_2_WORD,
11
- BVH_NODE_STRIDE_WORDS
12
- } from "./BVH_BUFFER_LAYOUT.js";
13
- import { BVH_BUILD_SETTINGS_STRUCT } from "./BVH_BUILD_SETTINGS_STRUCT.js";
14
-
15
- export const BVH_REFIT_WORKGROUP_SIZE = 64;
16
-
17
- const resources = new ShaderResourceSetDescriptor();
18
- resources.createGroup()
19
- .addUniform("settings", BVH_BUILD_SETTINGS_STRUCT)
20
- .addStorageBuffer("parents", WebGPUArray.from(u32), false)
21
- // node index of each leaf ordinal; the only thing this pass knows about the tree's layout
22
- .addStorageBuffer("leaf_nodes", WebGPUArray.from(u32), false)
23
- // one arrival counter per internal node; must be zero at the start of every build
24
- .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true)
25
- // The same buffer the emission pass wrote as typed nodes, bound flat and atomic here. Every
26
- // word this pass touches is communicated between workgroups, so every access to it is an
27
- // atomic one — the strictest formulation WGSL offers, and the discipline the plan's R1 rests on.
28
- .addStorageBuffer("nodes", WebGPUArray.from(atomic_u32), true);
29
-
30
- const body = CodeChunk.from(
31
- //language=WGSL
32
- `
33
- const NODE_STRIDE = ${BVH_NODE_STRIDE_WORDS}u;
34
- const NODE_BOUNDS = ${BVH_NODE_BOUNDS_WORD}u;
35
- const NODE_CHILD_1 = ${BVH_NODE_CHILD_1_WORD}u;
36
- const NODE_CHILD_2 = ${BVH_NODE_CHILD_2_WORD}u;
37
-
38
- fn bvh_node_word(node: u32) -> u32 {
39
- return settings.node_word_offset + node * NODE_STRIDE;
40
- }
41
-
42
- fn bvh_parent(node: u32) -> u32 {
43
- return parents[settings.parents_offset + node];
44
- }
45
-
46
- fn bvh_read_bounds_low(node_word: u32) -> vec3<f32> {
47
- return vec3<f32>(
48
- bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS])),
49
- bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 1u])),
50
- bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 2u])),
51
- );
52
- }
53
-
54
- fn bvh_read_bounds_high(node_word: u32) -> vec3<f32> {
55
- return vec3<f32>(
56
- bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 3u])),
57
- bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 4u])),
58
- bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 5u])),
59
- );
60
- }
61
-
62
- @compute @workgroup_size(${BVH_REFIT_WORKGROUP_SIZE}, 1, 1)
63
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
64
- let i = gid.x;
65
- let n = settings.element_count;
66
-
67
- if (i >= n) {
68
- return;
69
- }
70
-
71
- // Start above leaf i and climb. Which node that leaf is comes from the tree rather than from a
72
- // layout this kernel assumes, so a tree that was built and a tree that was copied refit alike.
73
- var node = bvh_parent(leaf_nodes[settings.leaf_nodes_offset + i]);
74
-
75
- loop {
76
- if (node == BVH_NULL_NODE) {
77
- // climbed past the root
78
- break;
79
- }
80
-
81
- // An internal node has exactly two children, so exactly two climbs pass through it. The
82
- // first arrival exits — its sibling's subtree is still being fitted, and it has nothing to
83
- // wait ON: no spin, no assumption about anyone else's forward progress. The second arrival
84
- // finds both children written and owns the node from here up.
85
- let arrivals = atomicAdd(&counters[node], 1u);
86
-
87
- if (arrivals == 0u) {
88
- break;
89
- }
90
-
91
- let node_word = bvh_node_word(node);
92
-
93
- let child_1 = atomicLoad(&nodes[node_word + NODE_CHILD_1]);
94
- let child_2 = atomicLoad(&nodes[node_word + NODE_CHILD_2]);
95
-
96
- let word_1 = bvh_node_word(child_1);
97
- let word_2 = bvh_node_word(child_2);
98
-
99
- let low = min(bvh_read_bounds_low(word_1), bvh_read_bounds_low(word_2));
100
- let high = max(bvh_read_bounds_high(word_1), bvh_read_bounds_high(word_2));
101
-
102
- atomicStore(&nodes[node_word + NODE_BOUNDS], bitcast<u32>(low.x));
103
- atomicStore(&nodes[node_word + NODE_BOUNDS + 1u], bitcast<u32>(low.y));
104
- atomicStore(&nodes[node_word + NODE_BOUNDS + 2u], bitcast<u32>(low.z));
105
- atomicStore(&nodes[node_word + NODE_BOUNDS + 3u], bitcast<u32>(high.x));
106
- atomicStore(&nodes[node_word + NODE_BOUNDS + 4u], bitcast<u32>(high.y));
107
- atomicStore(&nodes[node_word + NODE_BOUNDS + 5u], bitcast<u32>(high.z));
108
-
109
- node = bvh_parent(node);
110
- }
111
- }
112
- `, [
113
- BVH_NULL_NODE_DEFINITION,
114
- ]);
115
-
116
- /**
117
- * Bottom-up AABB refit — pass 4 of {@link graph_bvh_build_lbvh}, and the last thing a build does.
118
- *
119
- * One thread per leaf climbs the `parents` chain from the node `leaf_nodes` says that leaf occupies,
120
- * taking an arrival counter at each internal node on the way. Nothing waits: the thread that arrives first at a node simply
121
- * dies, and the one that arrives second is guaranteed both children are complete, because the only
122
- * way to arrive is to have finished a child. That is the whole synchronisation, and it assumes
123
- * atomic-word visibility rather than any scheduling fairness — which is why it sits on the accepted
124
- * side of the engine's line on cross-workgroup communication.
125
- *
126
- * The counters must be zero when the pass starts; the graph declares them with a clear range so a
127
- * pool-reused buffer is cleared and a fresh one arrives zeroed already.
128
- *
129
- * The same pass serves refit-only updates (topology frozen, leaf bounds rewritten) — which is what
130
- * per-frame skinned BLAS needs — so it exists as a standalone dispatch rather than fused into
131
- * emission. Node indices are local to the tree and `settings.node_word_offset` says where node 0
132
- * lands, so a BLAS living inside the shared geometry arena refits through this same kernel.
133
- *
134
- * @type {ComputeShader}
135
- */
136
- export const shader_bvh_refit = ComputeShader.from({
137
- label: "BVHBuild/Refit",
138
- resources,
139
- body,
140
- group_size: [BVH_REFIT_WORKGROUP_SIZE, 1, 1],
141
- });
1
+ import { atomic_u32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { BVH_NULL_NODE_DEFINITION } from "../../shader/chunk/bvh/BVH_NULL_NODE_DEFINITION.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { ComputeShader } from "../../shader/ComputeShader.js";
6
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import {
8
+ BVH_NODE_BOUNDS_WORD,
9
+ BVH_NODE_CHILD_1_WORD,
10
+ BVH_NODE_CHILD_2_WORD,
11
+ BVH_NODE_STRIDE_WORDS
12
+ } from "./BVH_BUFFER_LAYOUT.js";
13
+ import { BVH_BUILD_SETTINGS_STRUCT } from "./BVH_BUILD_SETTINGS_STRUCT.js";
14
+
15
+ export const BVH_REFIT_WORKGROUP_SIZE = 64;
16
+
17
+ const resources = new ShaderResourceSetDescriptor();
18
+ resources.createGroup()
19
+ .addUniform("settings", BVH_BUILD_SETTINGS_STRUCT)
20
+ .addStorageBuffer("parents", WebGPUArray.from(u32), false)
21
+ // node index of each leaf ordinal; the only thing this pass knows about the tree's layout
22
+ .addStorageBuffer("leaf_nodes", WebGPUArray.from(u32), false)
23
+ // one arrival counter per internal node; must be zero at the start of every build
24
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true)
25
+ // The same buffer the emission pass wrote as typed nodes, bound flat and atomic here. Every
26
+ // word this pass touches is communicated between workgroups, so every access to it is an
27
+ // atomic one — the strictest formulation WGSL offers, and the discipline the plan's R1 rests on.
28
+ .addStorageBuffer("nodes", WebGPUArray.from(atomic_u32), true);
29
+
30
+ const body = CodeChunk.from(
31
+ //language=WGSL
32
+ `
33
+ const NODE_STRIDE = ${BVH_NODE_STRIDE_WORDS}u;
34
+ const NODE_BOUNDS = ${BVH_NODE_BOUNDS_WORD}u;
35
+ const NODE_CHILD_1 = ${BVH_NODE_CHILD_1_WORD}u;
36
+ const NODE_CHILD_2 = ${BVH_NODE_CHILD_2_WORD}u;
37
+
38
+ fn bvh_node_word(node: u32) -> u32 {
39
+ return settings.node_word_offset + node * NODE_STRIDE;
40
+ }
41
+
42
+ fn bvh_parent(node: u32) -> u32 {
43
+ return parents[settings.parents_offset + node];
44
+ }
45
+
46
+ fn bvh_read_bounds_low(node_word: u32) -> vec3<f32> {
47
+ return vec3<f32>(
48
+ bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS])),
49
+ bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 1u])),
50
+ bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 2u])),
51
+ );
52
+ }
53
+
54
+ fn bvh_read_bounds_high(node_word: u32) -> vec3<f32> {
55
+ return vec3<f32>(
56
+ bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 3u])),
57
+ bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 4u])),
58
+ bitcast<f32>(atomicLoad(&nodes[node_word + NODE_BOUNDS + 5u])),
59
+ );
60
+ }
61
+
62
+ @compute @workgroup_size(${BVH_REFIT_WORKGROUP_SIZE}, 1, 1)
63
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
64
+ let i = gid.x;
65
+ let n = settings.element_count;
66
+
67
+ if (i >= n) {
68
+ return;
69
+ }
70
+
71
+ // Start above leaf i and climb. Which node that leaf is comes from the tree rather than from a
72
+ // layout this kernel assumes, so a tree that was built and a tree that was copied refit alike.
73
+ var node = bvh_parent(leaf_nodes[settings.leaf_nodes_offset + i]);
74
+
75
+ loop {
76
+ if (node == BVH_NULL_NODE) {
77
+ // climbed past the root
78
+ break;
79
+ }
80
+
81
+ // An internal node has exactly two children, so exactly two climbs pass through it. The
82
+ // first arrival exits — its sibling's subtree is still being fitted, and it has nothing to
83
+ // wait ON: no spin, no assumption about anyone else's forward progress. The second arrival
84
+ // finds both children written and owns the node from here up.
85
+ let arrivals = atomicAdd(&counters[node], 1u);
86
+
87
+ if (arrivals == 0u) {
88
+ break;
89
+ }
90
+
91
+ let node_word = bvh_node_word(node);
92
+
93
+ let child_1 = atomicLoad(&nodes[node_word + NODE_CHILD_1]);
94
+ let child_2 = atomicLoad(&nodes[node_word + NODE_CHILD_2]);
95
+
96
+ let word_1 = bvh_node_word(child_1);
97
+ let word_2 = bvh_node_word(child_2);
98
+
99
+ let low = min(bvh_read_bounds_low(word_1), bvh_read_bounds_low(word_2));
100
+ let high = max(bvh_read_bounds_high(word_1), bvh_read_bounds_high(word_2));
101
+
102
+ atomicStore(&nodes[node_word + NODE_BOUNDS], bitcast<u32>(low.x));
103
+ atomicStore(&nodes[node_word + NODE_BOUNDS + 1u], bitcast<u32>(low.y));
104
+ atomicStore(&nodes[node_word + NODE_BOUNDS + 2u], bitcast<u32>(low.z));
105
+ atomicStore(&nodes[node_word + NODE_BOUNDS + 3u], bitcast<u32>(high.x));
106
+ atomicStore(&nodes[node_word + NODE_BOUNDS + 4u], bitcast<u32>(high.y));
107
+ atomicStore(&nodes[node_word + NODE_BOUNDS + 5u], bitcast<u32>(high.z));
108
+
109
+ node = bvh_parent(node);
110
+ }
111
+ }
112
+ `, [
113
+ BVH_NULL_NODE_DEFINITION,
114
+ ]);
115
+
116
+ /**
117
+ * Bottom-up AABB refit — pass 4 of {@link graph_bvh_build_lbvh}, and the last thing a build does.
118
+ *
119
+ * One thread per leaf climbs the `parents` chain from the node `leaf_nodes` says that leaf occupies,
120
+ * taking an arrival counter at each internal node on the way. Nothing waits: the thread that arrives first at a node simply
121
+ * dies, and the one that arrives second is guaranteed both children are complete, because the only
122
+ * way to arrive is to have finished a child. That is the whole synchronisation, and it assumes
123
+ * atomic-word visibility rather than any scheduling fairness — which is why it sits on the accepted
124
+ * side of the engine's line on cross-workgroup communication.
125
+ *
126
+ * The counters must be zero when the pass starts; the graph declares them with a clear range so a
127
+ * pool-reused buffer is cleared and a fresh one arrives zeroed already.
128
+ *
129
+ * The same pass serves refit-only updates (topology frozen, leaf bounds rewritten) — which is what
130
+ * per-frame skinned BLAS needs — so it exists as a standalone dispatch rather than fused into
131
+ * emission. Node indices are local to the tree and `settings.node_word_offset` says where node 0
132
+ * lands, so a BLAS living inside the shared geometry arena refits through this same kernel.
133
+ *
134
+ * @type {ComputeShader}
135
+ */
136
+ export const shader_bvh_refit = ComputeShader.from({
137
+ label: "BVHBuild/Refit",
138
+ resources,
139
+ body,
140
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_radix_sort_histogram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js"],"names":[],"mappings":"AAkEA;;;;;;;;;;;;GAYG;AACH,0CAFU,aAAa,CAOpB;8BAjF2B,+BAA+B"}
1
+ {"version":3,"file":"shader_radix_sort_histogram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js"],"names":[],"mappings":"AAkEA;;;;;;;;;;;;GAYG;AACH,0CAFU,aAAa,CAMpB;8BAhF2B,+BAA+B"}
@@ -81,5 +81,4 @@ export const shader_radix_sort_histogram = ComputeShader.from({
81
81
  label: "RadixSort/Histogram",
82
82
  resources,
83
83
  body,
84
- group_size: [SORT_WORKGROUP_SIZE, 1, 1],
85
84
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_radix_sort_scatter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js"],"names":[],"mappings":"AA8KA;;;;;;;;;;;GAWG;AACH,wCAFU,aAAa,CAOpB;8BA3L2B,+BAA+B"}
1
+ {"version":3,"file":"shader_radix_sort_scatter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js"],"names":[],"mappings":"AA8KA;;;;;;;;;;;GAWG;AACH,wCAFU,aAAa,CAMpB;8BA1L2B,+BAA+B"}
@@ -188,5 +188,4 @@ export const shader_radix_sort_scatter = ComputeShader.from({
188
188
  label: "RadixSort/Scatter",
189
189
  resources,
190
190
  body,
191
- group_size: [SORT_WORKGROUP_SIZE, 1, 1],
192
191
  });
@@ -1 +1 @@
1
- {"version":3,"file":"graph_cull_lights.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/light/cluster/cull/graph_cull_lights.js"],"names":[],"mappings":"AA4KA;;;;;;GAMG;AACH,uFAkBC"}
1
+ {"version":3,"file":"graph_cull_lights.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/light/cluster/cull/graph_cull_lights.js"],"names":[],"mappings":"AAqKA;;;;;;GAMG;AACH,uFAkBC"}