@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,213 +1,212 @@
1
- import { atomic_u32, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
3
- import { GEOMETRY_METADATA_STRUCT } from "../../../geometry/GEOMETRY_METADATA_STRUCT.js";
4
- import { MESHLET_METADATA_STRUCT } from "../../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
5
- import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
6
- import { ComputeShader } from "../../../shader/ComputeShader.js";
7
- import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
8
- import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
9
- import { chunk_aabb_atomic_f32 } from "./chunk_aabb_atomic_f32.js";
10
-
11
- /**
12
- * Workgroup size — also the per-meshlet vertex stride. One thread per
13
- * vertex slot per pass; threads loop by `WORKGROUP_SIZE` for meshlets
14
- * with `vertex_count > WORKGROUP_SIZE`.
15
- *
16
- * Matches the skinning compute shader's WG size so the reduction's
17
- * memory-access pattern is roughly analogous (sequential vertex reads).
18
- */
19
- export const WORKGROUP_SIZE = 64;
20
-
21
- // Field offsets resolved at module-load. `.pack()` on the structs
22
- // reorders fields by alignment, so reading offsets directly off the
23
- // struct is the only way to be sure these match what the rasterizer
24
- // expects to read back later.
25
- const MESHLET_BOUNDS_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('bounds_box').offset / 4;
26
- const MESHLET_ADDRESS_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('address').offset / 4;
27
- const MESHLET_VERTEX_COUNT_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('vertex_count').offset / 4;
28
- const MESHLET_PRIMITIVE_COUNT_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('primitive_count').offset / 4;
29
- const MESHLET_STRIDE_WORDS = MESHLET_METADATA_STRUCT.size / 4;
30
-
31
- const GEOMETRY_BBOX_OFFSET_WORDS = GEOMETRY_METADATA_STRUCT.get('bounding_box').offset / 4;
32
- const GEOMETRY_STRIDE_WORDS = GEOMETRY_METADATA_STRUCT.size / 4;
33
-
34
- const resources = new ShaderResourceSetDescriptor();
35
- resources.createGroup()
36
- // First-workgroup offset in this sub-dispatch (workgroup units).
37
- // One workgroup per pair, so this matches the skinning shader's
38
- // `dispatch_offset` semantic.
39
- .addUniform('dispatch_offset', u32)
40
- .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
41
- .addStorageBuffer('dispatch_lookup', WebGPUArray.from(u32), false)
42
- // Clone vertex data: positions live at `address + index_section_size`
43
- // (see `chunk_meshlet_compute_attribute_section_offset`). Read-only
44
- // here — the skinning compute already wrote the deformed positions
45
- // before this pass runs.
46
- .addStorageBuffer('meshlet_data', WebGPUArray.from(u32), false)
47
- // Same buffer the rasterizer reads as typed structs, bound here as
48
- // a flat `atomic<u32>` array. We atomicLoad meshlet header fields
49
- // (address / vertex_count / primitive_count) and atomic-merge the
50
- // computed bounds into `bounds_box`.
51
- .addStorageBuffer('meshlet_metadata_atomic', WebGPUArray.from(atomic_u32), true)
52
- .addStorageBuffer('geometry_metadata_atomic', WebGPUArray.from(atomic_u32), true);
53
-
54
- const body = CodeChunk.from(
55
- //language=WGSL
56
- `
57
- const MESHLET_BOUNDS_OFFSET: u32 = ${MESHLET_BOUNDS_OFFSET_WORDS}u;
58
- const MESHLET_ADDRESS_OFFSET: u32 = ${MESHLET_ADDRESS_OFFSET_WORDS}u;
59
- const MESHLET_VERTEX_COUNT_OFFSET: u32 = ${MESHLET_VERTEX_COUNT_OFFSET_WORDS}u;
60
- const MESHLET_PRIMITIVE_COUNT_OFFSET: u32 = ${MESHLET_PRIMITIVE_COUNT_OFFSET_WORDS}u;
61
- const MESHLET_STRIDE: u32 = ${MESHLET_STRIDE_WORDS}u;
62
- const GEOMETRY_BBOX_OFFSET: u32 = ${GEOMETRY_BBOX_OFFSET_WORDS}u;
63
- const GEOMETRY_STRIDE: u32 = ${GEOMETRY_STRIDE_WORDS}u;
64
-
65
- // Workgroup-shared reduction storage. Each thread parks its
66
- // per-vertex-strip min/max here for tree reduction. Sized to the
67
- // workgroup width.
68
- var<workgroup> wg_min: array<vec3<f32>, ${WORKGROUP_SIZE}>;
69
- var<workgroup> wg_max: array<vec3<f32>, ${WORKGROUP_SIZE}>;
70
-
71
- @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
72
- fn main(
73
- @builtin(workgroup_id) wg_id: vec3<u32>,
74
- @builtin(local_invocation_index) local_id: u32,
75
- ) {
76
- let pair_index = wg_id.x + dispatch_offset;
77
-
78
- let lookup_base = pair_index * 2u;
79
- let binding_index = dispatch_lookup[lookup_base];
80
- let meshlet_local = dispatch_lookup[lookup_base + 1u];
81
-
82
- let binding = skinning_bindings[binding_index];
83
- let clone_meshlet_abs = binding.clone_meshlet_metadata_offset + meshlet_local;
84
- let m_base_words = clone_meshlet_abs * MESHLET_STRIDE;
85
-
86
- // Meshlet header reads — atomicLoad because the buffer is bound
87
- // atomic-typed. These values are stable across the pass (the
88
- // scatter pass only resets bounds_box, not the header), so reads
89
- // are uniform-control-flow safe.
90
- let address = atomicLoad(&meshlet_metadata_atomic[m_base_words + MESHLET_ADDRESS_OFFSET]);
91
- let primitive_count = atomicLoad(&meshlet_metadata_atomic[m_base_words + MESHLET_PRIMITIVE_COUNT_OFFSET]);
92
- let vertex_count = atomicLoad(&meshlet_metadata_atomic[m_base_words + MESHLET_VERTEX_COUNT_OFFSET]);
93
-
94
- // Attribute section base = address + index_section_size, where
95
- // index_section_size = ceil(primitive_count * 3 / 4) u32 words.
96
- // Position is the first attribute at offset 0 within the section,
97
- // stored as 3 contiguous f32s per vertex. Matches the skinning
98
- // shader's clone-write addressing.
99
- let index_section_size = (primitive_count * 3u + 3u) >> 2u;
100
- let attribute_section = address + index_section_size;
101
-
102
- // Per-thread min/max accumulators. WGSL disallows the const
103
- // expression \`bitcast<f32>(0x7F800000u)\` because the resulting
104
- // \`f32\` is not representable as a literal (it's ±inf). We use
105
- // the largest finite f32 instead — for our purposes (vertex
106
- // positions, well-bounded in metres), it's effectively infinite:
107
- // any real vertex coordinate is many orders of magnitude
108
- // smaller, so the merge math is identical.
109
- //
110
- // Note that the storage sentinels in \`meshlet.bounds_box\` and
111
- // \`geometry.bounding_box\` ARE true ±inf — the scatter pass
112
- // writes the u32 bit pattern directly via \`atomicStore\`, no
113
- // const-fold involved, and \`aabb_atomic_min_f32\` bitcasts
114
- // back to f32 at runtime where ±inf is a valid value.
115
- var thread_min = vec3<f32>( 3.4028234e38);
116
- var thread_max = vec3<f32>(-3.4028234e38);
117
-
118
- // Stride loop over the meshlet's vertex slots. Most meshlets fit
119
- // in a single WG_SIZE pass; larger ones cycle.
120
- var v: u32 = local_id;
121
- loop {
122
- if v >= vertex_count { break; }
123
- let pos_addr = attribute_section + v * 3u;
124
- let p = vec3<f32>(
125
- bitcast<f32>(meshlet_data[pos_addr]),
126
- bitcast<f32>(meshlet_data[pos_addr + 1u]),
127
- bitcast<f32>(meshlet_data[pos_addr + 2u]),
128
- );
129
- thread_min = min(thread_min, p);
130
- thread_max = max(thread_max, p);
131
- v = v + ${WORKGROUP_SIZE}u;
132
- }
133
-
134
- // Power-of-2 tree reduction in workgroup memory. WG_SIZE = 64 is
135
- // a power of two, so the standard halving stride works with no
136
- // tail handling. Subgroup ops would be a bit faster but require
137
- // the "subgroups" extension; this works on every device.
138
- wg_min[local_id] = thread_min;
139
- wg_max[local_id] = thread_max;
140
- workgroupBarrier();
141
-
142
- var stride: u32 = ${WORKGROUP_SIZE >>> 1}u;
143
- loop {
144
- if stride == 0u { break; }
145
- if local_id < stride {
146
- wg_min[local_id] = min(wg_min[local_id], wg_min[local_id + stride]);
147
- wg_max[local_id] = max(wg_max[local_id], wg_max[local_id + stride]);
148
- }
149
- workgroupBarrier();
150
- stride = stride >> 1u;
151
- }
152
-
153
- // Thread 0 owns the writes. Atomic-merge into both the meshlet's
154
- // own bounds_box (single contributor per meshlet — could be
155
- // atomicStore, but using min/max keeps the scatter's sentinel as
156
- // the identity element and means a re-run is idempotent) AND into
157
- // the binding's clone geometry's bounding_box (cross-workgroup
158
- // contention — CAS-spin handles it).
159
- if local_id == 0u {
160
- let final_min = wg_min[0];
161
- let final_max = wg_max[0];
162
-
163
- let m_bounds_base = m_base_words + MESHLET_BOUNDS_OFFSET;
164
- aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 0u], final_min.x);
165
- aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 1u], final_min.y);
166
- aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 2u], final_min.z);
167
- aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 3u], final_max.x);
168
- aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 4u], final_max.y);
169
- aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 5u], final_max.z);
170
-
171
- let g_base = binding.clone_geometry_index * GEOMETRY_STRIDE + GEOMETRY_BBOX_OFFSET;
172
- aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 0u], final_min.x);
173
- aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 1u], final_min.y);
174
- aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 2u], final_min.z);
175
- aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 3u], final_max.x);
176
- aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 4u], final_max.y);
177
- aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 5u], final_max.z);
178
- }
179
- }
180
- `, [chunk_aabb_atomic_f32]);
181
-
182
- /**
183
- * Compute shader that reduces a clone meshlet's deformed vertex
184
- * positions to a tight AABB, atomic-writes the result to the meshlet's
185
- * `bounds_box`, and atomic-merges the same bounds into the owning
186
- * clone geometry's `bounding_box`.
187
- *
188
- * Workgroup-per-pair dispatch: one workgroup per (binding, meshlet)
189
- * row in `dispatch_lookup`. Each thread handles a stride of vertices,
190
- * the workgroup reduces via shared memory + tree halving, and thread 0
191
- * commits the result.
192
- *
193
- * The geometry-level merge is what lets the rasterizer's per-geometry
194
- * sphere/AABB culling use post-deformation bounds without a second
195
- * full pass — the sphere derive shader downstream just reads the
196
- * accumulated `bounding_box` and computes its surrounding sphere.
197
- *
198
- * Must run AFTER `shader_meshlet_apply_skinning` (which writes the
199
- * deformed positions this pass reads) and AFTER
200
- * `shader_meshlet_bounds_scatter` (which seeds the meshlet and
201
- * geometry bounds with ±inf sentinels).
202
- *
203
- * Pagination: with one workgroup per pair, the host splits into
204
- * multiple sub-dispatches when `total_pair_count >
205
- * maxComputeWorkgroupsPerDimension`. The `dispatch_offset` uniform
206
- * advances per sub-dispatch.
207
- */
208
- export const shader_meshlet_bounds_reduce = ComputeShader.from({
209
- label: "Skinning/MeshletBoundsReduce",
210
- resources,
211
- body,
212
- group_size: [WORKGROUP_SIZE, 1, 1],
213
- });
1
+ import { atomic_u32, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
3
+ import { GEOMETRY_METADATA_STRUCT } from "../../../geometry/GEOMETRY_METADATA_STRUCT.js";
4
+ import { MESHLET_METADATA_STRUCT } from "../../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
5
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
6
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
7
+ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
8
+ import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
9
+ import { chunk_aabb_atomic_f32 } from "./chunk_aabb_atomic_f32.js";
10
+
11
+ /**
12
+ * Workgroup size — also the per-meshlet vertex stride. One thread per
13
+ * vertex slot per pass; threads loop by `WORKGROUP_SIZE` for meshlets
14
+ * with `vertex_count > WORKGROUP_SIZE`.
15
+ *
16
+ * Matches the skinning compute shader's WG size so the reduction's
17
+ * memory-access pattern is roughly analogous (sequential vertex reads).
18
+ */
19
+ export const WORKGROUP_SIZE = 64;
20
+
21
+ // Field offsets resolved at module-load. `.pack()` on the structs
22
+ // reorders fields by alignment, so reading offsets directly off the
23
+ // struct is the only way to be sure these match what the rasterizer
24
+ // expects to read back later.
25
+ const MESHLET_BOUNDS_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('bounds_box').offset / 4;
26
+ const MESHLET_ADDRESS_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('address').offset / 4;
27
+ const MESHLET_VERTEX_COUNT_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('vertex_count').offset / 4;
28
+ const MESHLET_PRIMITIVE_COUNT_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('primitive_count').offset / 4;
29
+ const MESHLET_STRIDE_WORDS = MESHLET_METADATA_STRUCT.size / 4;
30
+
31
+ const GEOMETRY_BBOX_OFFSET_WORDS = GEOMETRY_METADATA_STRUCT.get('bounding_box').offset / 4;
32
+ const GEOMETRY_STRIDE_WORDS = GEOMETRY_METADATA_STRUCT.size / 4;
33
+
34
+ const resources = new ShaderResourceSetDescriptor();
35
+ resources.createGroup()
36
+ // First-workgroup offset in this sub-dispatch (workgroup units).
37
+ // One workgroup per pair, so this matches the skinning shader's
38
+ // `dispatch_offset` semantic.
39
+ .addUniform('dispatch_offset', u32)
40
+ .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
41
+ .addStorageBuffer('dispatch_lookup', WebGPUArray.from(u32), false)
42
+ // Clone vertex data: positions live at `address + index_section_size`
43
+ // (see `chunk_meshlet_compute_attribute_section_offset`). Read-only
44
+ // here — the skinning compute already wrote the deformed positions
45
+ // before this pass runs.
46
+ .addStorageBuffer('meshlet_data', WebGPUArray.from(u32), false)
47
+ // Same buffer the rasterizer reads as typed structs, bound here as
48
+ // a flat `atomic<u32>` array. We atomicLoad meshlet header fields
49
+ // (address / vertex_count / primitive_count) and atomic-merge the
50
+ // computed bounds into `bounds_box`.
51
+ .addStorageBuffer('meshlet_metadata_atomic', WebGPUArray.from(atomic_u32), true)
52
+ .addStorageBuffer('geometry_metadata_atomic', WebGPUArray.from(atomic_u32), true);
53
+
54
+ const body = CodeChunk.from(
55
+ //language=WGSL
56
+ `
57
+ const MESHLET_BOUNDS_OFFSET: u32 = ${MESHLET_BOUNDS_OFFSET_WORDS}u;
58
+ const MESHLET_ADDRESS_OFFSET: u32 = ${MESHLET_ADDRESS_OFFSET_WORDS}u;
59
+ const MESHLET_VERTEX_COUNT_OFFSET: u32 = ${MESHLET_VERTEX_COUNT_OFFSET_WORDS}u;
60
+ const MESHLET_PRIMITIVE_COUNT_OFFSET: u32 = ${MESHLET_PRIMITIVE_COUNT_OFFSET_WORDS}u;
61
+ const MESHLET_STRIDE: u32 = ${MESHLET_STRIDE_WORDS}u;
62
+ const GEOMETRY_BBOX_OFFSET: u32 = ${GEOMETRY_BBOX_OFFSET_WORDS}u;
63
+ const GEOMETRY_STRIDE: u32 = ${GEOMETRY_STRIDE_WORDS}u;
64
+
65
+ // Workgroup-shared reduction storage. Each thread parks its
66
+ // per-vertex-strip min/max here for tree reduction. Sized to the
67
+ // workgroup width.
68
+ var<workgroup> wg_min: array<vec3<f32>, ${WORKGROUP_SIZE}>;
69
+ var<workgroup> wg_max: array<vec3<f32>, ${WORKGROUP_SIZE}>;
70
+
71
+ @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
72
+ fn main(
73
+ @builtin(workgroup_id) wg_id: vec3<u32>,
74
+ @builtin(local_invocation_index) local_id: u32,
75
+ ) {
76
+ let pair_index = wg_id.x + dispatch_offset;
77
+
78
+ let lookup_base = pair_index * 2u;
79
+ let binding_index = dispatch_lookup[lookup_base];
80
+ let meshlet_local = dispatch_lookup[lookup_base + 1u];
81
+
82
+ let binding = skinning_bindings[binding_index];
83
+ let clone_meshlet_abs = binding.clone_meshlet_metadata_offset + meshlet_local;
84
+ let m_base_words = clone_meshlet_abs * MESHLET_STRIDE;
85
+
86
+ // Meshlet header reads — atomicLoad because the buffer is bound
87
+ // atomic-typed. These values are stable across the pass (the
88
+ // scatter pass only resets bounds_box, not the header), so reads
89
+ // are uniform-control-flow safe.
90
+ let address = atomicLoad(&meshlet_metadata_atomic[m_base_words + MESHLET_ADDRESS_OFFSET]);
91
+ let primitive_count = atomicLoad(&meshlet_metadata_atomic[m_base_words + MESHLET_PRIMITIVE_COUNT_OFFSET]);
92
+ let vertex_count = atomicLoad(&meshlet_metadata_atomic[m_base_words + MESHLET_VERTEX_COUNT_OFFSET]);
93
+
94
+ // Attribute section base = address + index_section_size, where
95
+ // index_section_size = ceil(primitive_count * 3 / 4) u32 words.
96
+ // Position is the first attribute at offset 0 within the section,
97
+ // stored as 3 contiguous f32s per vertex. Matches the skinning
98
+ // shader's clone-write addressing.
99
+ let index_section_size = (primitive_count * 3u + 3u) >> 2u;
100
+ let attribute_section = address + index_section_size;
101
+
102
+ // Per-thread min/max accumulators. WGSL disallows the const
103
+ // expression \`bitcast<f32>(0x7F800000u)\` because the resulting
104
+ // \`f32\` is not representable as a literal (it's ±inf). We use
105
+ // the largest finite f32 instead — for our purposes (vertex
106
+ // positions, well-bounded in metres), it's effectively infinite:
107
+ // any real vertex coordinate is many orders of magnitude
108
+ // smaller, so the merge math is identical.
109
+ //
110
+ // Note that the storage sentinels in \`meshlet.bounds_box\` and
111
+ // \`geometry.bounding_box\` ARE true ±inf — the scatter pass
112
+ // writes the u32 bit pattern directly via \`atomicStore\`, no
113
+ // const-fold involved, and \`aabb_atomic_min_f32\` bitcasts
114
+ // back to f32 at runtime where ±inf is a valid value.
115
+ var thread_min = vec3<f32>( 3.4028234e38);
116
+ var thread_max = vec3<f32>(-3.4028234e38);
117
+
118
+ // Stride loop over the meshlet's vertex slots. Most meshlets fit
119
+ // in a single WG_SIZE pass; larger ones cycle.
120
+ var v: u32 = local_id;
121
+ loop {
122
+ if v >= vertex_count { break; }
123
+ let pos_addr = attribute_section + v * 3u;
124
+ let p = vec3<f32>(
125
+ bitcast<f32>(meshlet_data[pos_addr]),
126
+ bitcast<f32>(meshlet_data[pos_addr + 1u]),
127
+ bitcast<f32>(meshlet_data[pos_addr + 2u]),
128
+ );
129
+ thread_min = min(thread_min, p);
130
+ thread_max = max(thread_max, p);
131
+ v = v + ${WORKGROUP_SIZE}u;
132
+ }
133
+
134
+ // Power-of-2 tree reduction in workgroup memory. WG_SIZE = 64 is
135
+ // a power of two, so the standard halving stride works with no
136
+ // tail handling. Subgroup ops would be a bit faster but require
137
+ // the "subgroups" extension; this works on every device.
138
+ wg_min[local_id] = thread_min;
139
+ wg_max[local_id] = thread_max;
140
+ workgroupBarrier();
141
+
142
+ var stride: u32 = ${WORKGROUP_SIZE >>> 1}u;
143
+ loop {
144
+ if stride == 0u { break; }
145
+ if local_id < stride {
146
+ wg_min[local_id] = min(wg_min[local_id], wg_min[local_id + stride]);
147
+ wg_max[local_id] = max(wg_max[local_id], wg_max[local_id + stride]);
148
+ }
149
+ workgroupBarrier();
150
+ stride = stride >> 1u;
151
+ }
152
+
153
+ // Thread 0 owns the writes. Atomic-merge into both the meshlet's
154
+ // own bounds_box (single contributor per meshlet — could be
155
+ // atomicStore, but using min/max keeps the scatter's sentinel as
156
+ // the identity element and means a re-run is idempotent) AND into
157
+ // the binding's clone geometry's bounding_box (cross-workgroup
158
+ // contention — CAS-spin handles it).
159
+ if local_id == 0u {
160
+ let final_min = wg_min[0];
161
+ let final_max = wg_max[0];
162
+
163
+ let m_bounds_base = m_base_words + MESHLET_BOUNDS_OFFSET;
164
+ aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 0u], final_min.x);
165
+ aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 1u], final_min.y);
166
+ aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 2u], final_min.z);
167
+ aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 3u], final_max.x);
168
+ aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 4u], final_max.y);
169
+ aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 5u], final_max.z);
170
+
171
+ let g_base = binding.clone_geometry_index * GEOMETRY_STRIDE + GEOMETRY_BBOX_OFFSET;
172
+ aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 0u], final_min.x);
173
+ aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 1u], final_min.y);
174
+ aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 2u], final_min.z);
175
+ aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 3u], final_max.x);
176
+ aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 4u], final_max.y);
177
+ aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 5u], final_max.z);
178
+ }
179
+ }
180
+ `, [chunk_aabb_atomic_f32]);
181
+
182
+ /**
183
+ * Compute shader that reduces a clone meshlet's deformed vertex
184
+ * positions to a tight AABB, atomic-writes the result to the meshlet's
185
+ * `bounds_box`, and atomic-merges the same bounds into the owning
186
+ * clone geometry's `bounding_box`.
187
+ *
188
+ * Workgroup-per-pair dispatch: one workgroup per (binding, meshlet)
189
+ * row in `dispatch_lookup`. Each thread handles a stride of vertices,
190
+ * the workgroup reduces via shared memory + tree halving, and thread 0
191
+ * commits the result.
192
+ *
193
+ * The geometry-level merge is what lets the rasterizer's per-geometry
194
+ * sphere/AABB culling use post-deformation bounds without a second
195
+ * full pass — the sphere derive shader downstream just reads the
196
+ * accumulated `bounding_box` and computes its surrounding sphere.
197
+ *
198
+ * Must run AFTER `shader_meshlet_apply_skinning` (which writes the
199
+ * deformed positions this pass reads) and AFTER
200
+ * `shader_meshlet_bounds_scatter` (which seeds the meshlet and
201
+ * geometry bounds with ±inf sentinels).
202
+ *
203
+ * Pagination: with one workgroup per pair, the host splits into
204
+ * multiple sub-dispatches when `total_pair_count >
205
+ * maxComputeWorkgroupsPerDimension`. The `dispatch_offset` uniform
206
+ * advances per sub-dispatch.
207
+ */
208
+ export const shader_meshlet_bounds_reduce = ComputeShader.from({
209
+ label: "Skinning/MeshletBoundsReduce",
210
+ resources,
211
+ body,
212
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_meshlet_bounds_scatter.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js"],"names":[],"mappings":"AASA,gCAAiC;AAwFjC;;;;;;;;;;;;;;;;;GAiBG;AACH,0DAKG;8BAnH2B,kCAAkC"}
1
+ {"version":3,"file":"shader_meshlet_bounds_scatter.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js"],"names":[],"mappings":"AASA,gCAAiC;AAwFjC;;;;;;;;;;;;;;;;;GAiBG;AACH,0DAIG;8BAlH2B,kCAAkC"}