@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
@@ -0,0 +1,448 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
3
+ /**
4
+ * WGSL blankspace, as the set of code points with the Unicode `Pattern_White_Space` property.
5
+ *
6
+ * Spelled out rather than using `\s`, which is wrong in both directions here: it omits next line
7
+ * (U+0085) and the two bidi marks that WGSL counts as blankspace, and it adds no-break space, the
8
+ * ogham space mark, the en/em quad family and the byte order mark, which WGSL does not.
9
+ *
10
+ * @see https://www.w3.org/TR/WGSL/#blankspace-and-line-breaks
11
+ * @type {string}
12
+ */
13
+ const BLANKSPACE = '[\\u0020\\u0009\\u000A\\u000B\\u000C\\u000D\\u0085\\u200E\\u200F\\u2028\\u2029]';
14
+
15
+ /**
16
+ * A WGSL `int_literal`, being a `decimal_int_literal` or a `hex_int_literal`.
17
+ *
18
+ * The hexadecimal form is tried first, otherwise `0x40` would match the bare `0` of the decimal
19
+ * form and leave `x40` behind. The decimal form rejects a leading zero on a non-zero number, which
20
+ * WGSL forbids so that `012` cannot be misread as octal by someone arriving from another language.
21
+ *
22
+ * @see https://www.w3.org/TR/WGSL/#syntax-int_literal
23
+ * @type {string}
24
+ */
25
+ const INT_LITERAL = '(?:0[xX][0-9a-fA-F]+[iu]?|[1-9][0-9]*[iu]?|0[iu]?)';
26
+
27
+ /**
28
+ * A WGSL `ident_pattern_token`.
29
+ *
30
+ * Deliberately looser than the grammar, which also excludes the keywords and the lone underscore.
31
+ * Nothing is lost by admitting them: a name is only ever looked up among the module's constants,
32
+ * and `const if = 1;` is no more a declaration than `if` is an identifier.
33
+ *
34
+ * No identifier may begin with a digit, which is what lets a matched argument be sorted into
35
+ * literal or name by its first code point alone.
36
+ *
37
+ * @see https://www.w3.org/TR/WGSL/#identifiers
38
+ * @type {string}
39
+ */
40
+ const IDENTIFIER = '(?:[_\\p{XID_Start}][\\p{XID_Continue}]*)';
41
+
42
+ /**
43
+ * One argument of `@workgroup_size`: an integer literal, or a name that may resolve to one.
44
+ *
45
+ * @type {string}
46
+ */
47
+ const ARGUMENT = `(?:${INT_LITERAL}|${IDENTIFIER})`;
48
+
49
+ /**
50
+ * `@workgroup_size` up to and including its opening parenthesis.
51
+ *
52
+ * `'@'` and `'workgroup_size'` are separate tokens in the grammar, and the tokenizer discards
53
+ * blankspace ahead of every token, so `@ workgroup_size (` is as valid as `@workgroup_size(`. The
54
+ * lookahead stops `@workgroup_size_hint(...)` from matching, because the longest-match rule reads
55
+ * that as a single identifier token that merely starts with the name we are looking for.
56
+ *
57
+ * @see https://www.w3.org/TR/WGSL/#syntax-workgroup_size_attr
58
+ * @type {RegExp}
59
+ */
60
+ const ATTRIBUTE_HEAD = new RegExp(
61
+ `@${BLANKSPACE}*workgroup_size(?!\\p{XID_Continue})${BLANKSPACE}*\\(`,
62
+ 'gu'
63
+ );
64
+
65
+ /**
66
+ * The argument list of `@workgroup_size`, matched sticky from just past the opening parenthesis.
67
+ *
68
+ * One, two or three arguments, with a single optional trailing comma before the closing
69
+ * parenthesis. Requiring `)` immediately after the arguments is what makes a compound expression
70
+ * such as `BLOCK_DIM / 2u` fail to match outright rather than match some prefix of itself.
71
+ *
72
+ * @type {RegExp}
73
+ */
74
+ const ATTRIBUTE_ARGUMENTS = new RegExp(
75
+ `${BLANKSPACE}*(${ARGUMENT})`
76
+ + `(?:${BLANKSPACE}*,${BLANKSPACE}*(${ARGUMENT}))?`
77
+ + `(?:${BLANKSPACE}*,${BLANKSPACE}*(${ARGUMENT}))?`
78
+ + `${BLANKSPACE}*(?:,${BLANKSPACE}*)?\\)`,
79
+ 'uy'
80
+ );
81
+
82
+ /**
83
+ * A `const` declaration whose value is written as a plain integer literal.
84
+ *
85
+ * This is one level of aliasing and no more: the value must be the literal itself, so
86
+ * `const BLOCK_DIM = 256u;` and `const BLOCK_DIM: u32 = 256u;` are read, while
87
+ * `const HALF_BLOCK = BLOCK_DIM / 2u;` does not match at all and that name stays unresolved. One
88
+ * level is the whole of what a shader needs in order to state its block size once, and stopping
89
+ * there keeps this a scanner rather than the beginnings of a const-expression evaluator.
90
+ *
91
+ * The lookaround around `const` keeps it a whole token, so neither `myconst` nor `const_assert` is
92
+ * mistaken for the keyword.
93
+ *
94
+ * @see https://www.w3.org/TR/WGSL/#const-decls
95
+ * @type {RegExp}
96
+ */
97
+ const CONST_DECLARATION = new RegExp(
98
+ `(?<!\\p{XID_Continue})const(?!\\p{XID_Continue})`
99
+ + `${BLANKSPACE}*(${IDENTIFIER})${BLANKSPACE}*`
100
+ + `(?::${BLANKSPACE}*${IDENTIFIER}${BLANKSPACE}*)?`
101
+ + `=${BLANKSPACE}*(${INT_LITERAL})${BLANKSPACE}*;`,
102
+ 'gu'
103
+ );
104
+
105
+ const SOLIDUS = 0x2F;
106
+ const ASTERISK = 0x2A;
107
+
108
+ /**
109
+ * Code points that end a line-ending comment, being the WGSL line breaks.
110
+ *
111
+ * Carriage return terminates the comment whether or not a line feed follows it; leaving that line
112
+ * feed behind is harmless, as it is blankspace either way.
113
+ *
114
+ * @see https://www.w3.org/TR/WGSL/#blankspace-and-line-breaks
115
+ * @param {number} code_point
116
+ * @returns {boolean}
117
+ */
118
+ function is_line_break(code_point) {
119
+ return code_point === 0x000A
120
+ || code_point === 0x000B
121
+ || code_point === 0x000C
122
+ || code_point === 0x000D
123
+ || code_point === 0x0085
124
+ || code_point === 0x2028
125
+ || code_point === 0x2029;
126
+ }
127
+
128
+ /**
129
+ * Replace every comment with a single space, which is the first step the spec takes when parsing a
130
+ * module, before it has any notion of tokens or attributes.
131
+ *
132
+ * This has to happen before the search, and it cannot be folded into the search as another
133
+ * alternative in a regular expression: WGSL block comments nest, and the spec points out that this
134
+ * puts them outside the regular languages. A commented-out `@workgroup_size(1)` sitting above a
135
+ * real entry point is otherwise indistinguishable from the real thing.
136
+ *
137
+ * An unterminated block comment is not a legal comment at all, so such a module is already invalid.
138
+ * It is treated as running to the end of the source, which is the reading that declines to find an
139
+ * attribute inside the wreckage rather than inventing one.
140
+ *
141
+ * @see https://www.w3.org/TR/WGSL/#parsing
142
+ * @param {string} code WGSL source
143
+ * @returns {string}
144
+ */
145
+ function strip_comments(code) {
146
+ if (!code.includes('/')) {
147
+ // no comment can exist without a solidus, and most shaders reach here
148
+ return code;
149
+ }
150
+
151
+ const length = code.length;
152
+
153
+ let result = '';
154
+ let copy_from = 0;
155
+ let i = 0;
156
+
157
+ while (i < length) {
158
+
159
+ if (code.charCodeAt(i) !== SOLIDUS) {
160
+ i++;
161
+ continue;
162
+ }
163
+
164
+ const next = code.charCodeAt(i + 1);
165
+
166
+ if (next === SOLIDUS) {
167
+
168
+ result += code.slice(copy_from, i) + ' ';
169
+
170
+ i += 2;
171
+
172
+ while (i < length && !is_line_break(code.charCodeAt(i))) {
173
+ i++;
174
+ }
175
+
176
+ copy_from = i;
177
+
178
+ } else if (next === ASTERISK) {
179
+
180
+ result += code.slice(copy_from, i) + ' ';
181
+
182
+ i += 2;
183
+
184
+ let depth = 1;
185
+
186
+ while (i < length && depth > 0) {
187
+
188
+ const head = code.charCodeAt(i);
189
+ const tail = code.charCodeAt(i + 1);
190
+
191
+ if (head === SOLIDUS && tail === ASTERISK) {
192
+ depth++;
193
+ i += 2;
194
+ } else if (head === ASTERISK && tail === SOLIDUS) {
195
+ depth--;
196
+ i += 2;
197
+ } else {
198
+ i++;
199
+ }
200
+
201
+ }
202
+
203
+ copy_from = i;
204
+
205
+ } else {
206
+ i++;
207
+ }
208
+
209
+ }
210
+
211
+ return result + code.slice(copy_from);
212
+ }
213
+
214
+ /**
215
+ * The start of an attribute, for quoting back in a diagnostic.
216
+ *
217
+ * Quoted rather than located by offset: the search runs over the comment-stripped source, whose
218
+ * offsets drift from the caller's source by however much comment text was removed ahead of them, so
219
+ * any index reported here would point somewhere subtly wrong in the file the caller is reading.
220
+ *
221
+ * @param {string} source comment-stripped WGSL
222
+ * @param {number} index
223
+ * @returns {string}
224
+ */
225
+ function quote_attribute(source, index) {
226
+ const LIMIT = 64;
227
+
228
+ const excerpt = source.slice(index, index + LIMIT);
229
+
230
+ return source.length > index + LIMIT
231
+ ? `'${excerpt}...'`
232
+ : `'${excerpt}'`;
233
+ }
234
+
235
+ /**
236
+ * Read one integer literal as a number.
237
+ *
238
+ * The `i`/`u` suffix is dropped; it records the literal's type, which has no bearing on its value.
239
+ *
240
+ * @param {string} literal
241
+ * @returns {number}
242
+ */
243
+ function literal_to_number(literal) {
244
+ const suffix = literal.charCodeAt(literal.length - 1);
245
+
246
+ const digits = (suffix === 0x69 /* i */ || suffix === 0x75 /* u */)
247
+ ? literal.slice(0, -1)
248
+ : literal;
249
+
250
+ return Number(digits);
251
+ }
252
+
253
+ /**
254
+ * Whether a matched argument is an integer literal rather than a name.
255
+ *
256
+ * The argument came out of {@link ARGUMENT}, so it is one or the other, and no identifier may begin
257
+ * with a digit — the first code point settles it.
258
+ *
259
+ * @param {string} argument
260
+ * @returns {boolean}
261
+ */
262
+ function is_int_literal(argument) {
263
+ const first = argument.charCodeAt(0);
264
+
265
+ return first >= 0x30 /* 0 */ && first <= 0x39 /* 9 */;
266
+ }
267
+
268
+ /**
269
+ * Every name the module binds directly to an integer literal with `const`.
270
+ *
271
+ * A name declared twice with disagreeing values maps to `null` rather than to either of them. WGSL
272
+ * lets a function-scope `const` shadow a module-scope one, and telling those apart is a question of
273
+ * scope, which this scanner does not track — so a name that means two things is taken to mean
274
+ * neither.
275
+ *
276
+ * @param {string} source comment-stripped WGSL
277
+ * @returns {Map<string, number|null>} name to value, or to `null` where declarations disagree
278
+ */
279
+ function collect_integer_constants(source) {
280
+ const result = new Map();
281
+
282
+ CONST_DECLARATION.lastIndex = 0;
283
+
284
+ let declaration;
285
+
286
+ while ((declaration = CONST_DECLARATION.exec(source)) !== null) {
287
+
288
+ const name = declaration[1];
289
+ const value = literal_to_number(declaration[2]);
290
+
291
+ const existing = result.get(name);
292
+
293
+ result.set(name, (existing === undefined || existing === value) ? value : null);
294
+
295
+ }
296
+
297
+ return result;
298
+ }
299
+
300
+ /**
301
+ * Recover a compute entry point's workgroup size from its WGSL source.
302
+ *
303
+ * Follows the `workgroup_size_attr` grammar, so every spelling below is read alike, and the omitted
304
+ * dimensions default to `1`:
305
+ *
306
+ * ```wgsl
307
+ * @workgroup_size(64) // -> [64, 1, 1]
308
+ * @workgroup_size(8, 8) // -> [8, 8, 1]
309
+ * @workgroup_size( 8 , 8 , 4 , ) // -> [8, 8, 4], blankspace anywhere, trailing comma
310
+ * @workgroup_size(0x40u) // -> [64, 1, 1], hexadecimal, and the i/u type suffixes
311
+ * ```
312
+ *
313
+ * An argument may also name a `const` that the same module binds directly to an integer literal,
314
+ * which is how a shader states its block size once and then uses it in both the attribute and the
315
+ * body:
316
+ *
317
+ * ```wgsl
318
+ * const BLOCK_DIM = 256u;
319
+ * @workgroup_size(BLOCK_DIM) // -> [256, 1, 1]
320
+ * ```
321
+ *
322
+ * Comments count as blankspace and are removed first, so they may sit between any two tokens of the
323
+ * attribute, and an attribute that is itself commented out is correctly not found.
324
+ *
325
+ * **One level of aliasing, and no arithmetic.** WGSL permits any const-expression or
326
+ * override-expression, so `@workgroup_size(BLOCK_DIM / 2u)` is legal, and so is
327
+ * `@workgroup_size(WG_X)` for an `override WG_X` whose value only arrives with the pipeline.
328
+ * Neither is resolvable from the source text alone. Such a shader throws rather than being guessed
329
+ * at, because every caller for this number divides a thread count by it, and a wrong divisor
330
+ * silently dispatches the wrong fraction of the workload. A loud failure is recoverable; a
331
+ * plausible one is not.
332
+ *
333
+ * Entry points that disagree are an error for the same reason. A module may hold several, and
334
+ * choosing between two conflicting sizes would be choosing at random.
335
+ *
336
+ * @param {string} code WGSL source
337
+ * @returns {[number, number, number]} `[x, y, z]`
338
+ * @throws {Error} if no `@workgroup_size` attribute is present, if its arguments are neither
339
+ * integer literals nor names resolving to one, if a dimension is not a positive integer, or if
340
+ * entry points disagree on the size
341
+ *
342
+ * @author Alex Goldring
343
+ * @copyright Company Named Limited (c) 2026
344
+ */
345
+ export function compute_infer_workgroup_size_from_source(code) {
346
+ assert.isString(code, 'code');
347
+
348
+ const source = strip_comments(code);
349
+
350
+ ATTRIBUTE_HEAD.lastIndex = 0;
351
+
352
+ /**
353
+ * Built on first demand, as most shaders spell the size out and never ask for it.
354
+ * @type {Map<string, number|null>|null}
355
+ */
356
+ let constants = null;
357
+
358
+ let result = null;
359
+
360
+ let head;
361
+
362
+ while ((head = ATTRIBUTE_HEAD.exec(source)) !== null) {
363
+
364
+ ATTRIBUTE_ARGUMENTS.lastIndex = head.index + head[0].length;
365
+
366
+ const args = ATTRIBUTE_ARGUMENTS.exec(source);
367
+
368
+ if (args === null) {
369
+ throw new Error(
370
+ `@workgroup_size does not have one to three arguments, each an integer literal or a`
371
+ + ` name, and nothing else can be read from source: ${quote_attribute(source, head.index)}`
372
+ );
373
+ }
374
+
375
+ const size = [1, 1, 1];
376
+
377
+ for (let i = 0; i < 3; i++) {
378
+
379
+ const argument = args[i + 1];
380
+
381
+ if (argument === undefined) {
382
+ // "The second parameter, if provided, specifies the y dimension, otherwise is
383
+ // assumed to be 1."
384
+ continue;
385
+ }
386
+
387
+ if (is_int_literal(argument)) {
388
+ size[i] = literal_to_number(argument);
389
+ continue;
390
+ }
391
+
392
+ if (constants === null) {
393
+ constants = collect_integer_constants(source);
394
+ }
395
+
396
+ const value = constants.get(argument);
397
+
398
+ if (value === undefined) {
399
+ throw new Error(
400
+ `@workgroup_size argument '${argument}' is not an integer literal, and the module`
401
+ + ` has no 'const ${argument} = <integer literal>;' to resolve it by — an override,`
402
+ + ` or a const bound to an expression, cannot be read from source:`
403
+ + ` ${quote_attribute(source, head.index)}`
404
+ );
405
+ }
406
+
407
+ if (value === null) {
408
+ throw new Error(
409
+ `@workgroup_size argument '${argument}' has conflicting 'const' declarations, so`
410
+ + ` which of them the attribute sees cannot be told from source:`
411
+ + ` ${quote_attribute(source, head.index)}`
412
+ );
413
+ }
414
+
415
+ size[i] = value;
416
+
417
+ }
418
+
419
+ for (let i = 0; i < 3; i++) {
420
+ const dimension = size[i];
421
+
422
+ if (!Number.isSafeInteger(dimension) || dimension < 1) {
423
+ // "A shader-creation error results if any specified parameter is a const-expression
424
+ // that evaluates to a non-positive value."
425
+ throw new Error(
426
+ `@workgroup_size has dimension ${'xyz'[i]}=${dimension},`
427
+ + ` expected a positive integer: ${quote_attribute(source, head.index)}`
428
+ );
429
+ }
430
+ }
431
+
432
+ if (result === null) {
433
+ result = size;
434
+ } else if (result[0] !== size[0] || result[1] !== size[1] || result[2] !== size[2]) {
435
+ throw new Error(
436
+ `source declares more than one workgroup size, [${result}] and [${size}]`
437
+ + ` in ${quote_attribute(source, head.index)}, so no single size can be inferred`
438
+ );
439
+ }
440
+
441
+ }
442
+
443
+ if (result === null) {
444
+ throw new Error('source does not declare a @workgroup_size attribute');
445
+ }
446
+
447
+ return result;
448
+ }
@@ -27,14 +27,14 @@ export function graph_csm_setup_cascades({
27
27
 
28
28
  const encoder = context.encoder;
29
29
 
30
- shader_depth_reduce.dispatch({
30
+ shader_depth_reduce.dispatchThreads({
31
31
  encoder,
32
32
  bindings: {
33
33
  tDepth: depth,
34
34
  output,
35
35
  },
36
- group_count_x: Math.ceil(depth.width / 8),
37
- group_count_y: Math.ceil(depth.height / 8),
36
+ thread_count_x: depth.width,
37
+ thread_count_y: depth.height,
38
38
  });
39
39
 
40
40
  }
@@ -41,10 +41,10 @@ export function graph_gen_rays({
41
41
 
42
42
  const scene_ctx = view.scene;
43
43
 
44
- shader_generate_rays.dispatch({
44
+ shader_generate_rays.dispatchThreads({
45
45
  encoder: context.encoder,
46
- group_count_x: Math.ceil(resolution[0] / 8),
47
- group_count_y: Math.ceil(resolution[1] / 4),
46
+ thread_count_x: resolution[0],
47
+ thread_count_y: resolution[1],
48
48
  bindings: {
49
49
  settings,
50
50
  camera: view.camera.buffer.buffer,
@@ -50,9 +50,9 @@ export function graph_trace_rays({
50
50
  // sees a different sample pattern from each glass occluder hit.
51
51
  const seed = (view.frame_index | 0) >>> 0;
52
52
 
53
- shader_trace_rays.dispatch({
53
+ shader_trace_rays.dispatchThreads({
54
54
  encoder: context.encoder,
55
- group_count_x: Math.ceil((resolution[0] * resolution[1]) / 32),
55
+ thread_count_x: resolution[0] * resolution[1],
56
56
  bindings: {
57
57
  resolution_width: context.encoder.allocateTransientValueBuffer(u32, resolution[0]),
58
58
  random_seed: context.encoder.allocateTransientValueBuffer(u32, seed),
@@ -147,7 +147,7 @@ export class CascadedSceneSDF {
147
147
  */
148
148
  const blas = geometries.blas;
149
149
 
150
- shader.dispatch({
150
+ shader.dispatchThreads({
151
151
  encoder: command_ctx,
152
152
  bindings: {
153
153
  output_texture: this.#texture.obtainView(),
@@ -161,9 +161,9 @@ export class CascadedSceneSDF {
161
161
  meshlet_metadata: geometries.meshlets.buffer_metadata,
162
162
  meshlet_data: geometries.meshlets.buffer_data,
163
163
  },
164
- group_count_x: Math.ceil(size[0] / 4),
165
- group_count_y: Math.ceil(size[1] / 4),
166
- group_count_z: Math.ceil(size[2] / 4),
164
+ thread_count_x: size[0],
165
+ thread_count_y: size[1],
166
+ thread_count_z: size[2],
167
167
  });
168
168
 
169
169
  }
@@ -1 +1 @@
1
- {"version":3,"file":"build_shader_vt_feedback.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/virtual/build_shader_vt_feedback.js"],"names":[],"mappings":"AAkDA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAJ6B,eAAe,EAAjC,SAAS;IACM,aAAa,EAA5B,MAAM;IACJ,aAAa,CAkKzB;AA7MD;;;;;;;;GAQG;AACH,qDAI8B;AAS9B,2CAA4C;0BA9BlB,oCAAoC;8BAChC,+BAA+B;6BAjBhC,mCAAmC"}
1
+ {"version":3,"file":"build_shader_vt_feedback.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/virtual/build_shader_vt_feedback.js"],"names":[],"mappings":"AAkDA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAJ6B,eAAe,EAAjC,SAAS;IACM,aAAa,EAA5B,MAAM;IACJ,aAAa,CAiKzB;AA5MD;;;;;;;;GAQG;AACH,qDAI8B;AAS9B,2CAA4C;0BA9BlB,oCAAoC;8BAChC,+BAA+B;6BAjBhC,mCAAmC"}