@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,121 +1,120 @@
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
-
10
- export const WORKGROUP_SIZE = 64;
11
-
12
- // Struct field offsets resolved at module-load time and baked into the
13
- // shader as constants. The structs use `.pack()` for minimum-size
14
- // layout, so the field positions depend on the packing heuristic —
15
- // reading `.get(field).offset` after the build phase is the only
16
- // reliable way to know where bounds_box / bounding_box actually sit.
17
- const MESHLET_BOUNDS_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('bounds_box').offset / 4;
18
- const MESHLET_STRIDE_WORDS = MESHLET_METADATA_STRUCT.size / 4;
19
-
20
- const GEOMETRY_BBOX_OFFSET_WORDS = GEOMETRY_METADATA_STRUCT.get('bounding_box').offset / 4;
21
- const GEOMETRY_STRIDE_WORDS = GEOMETRY_METADATA_STRUCT.size / 4;
22
-
23
- const resources = new ShaderResourceSetDescriptor();
24
- resources.createGroup()
25
- // Sub-dispatch first-pair offset, in pair units. The host
26
- // paginates if `total_pair_count > maxComputeWorkgroupsPerDimension
27
- // * WORKGROUP_SIZE`; under typical stress-test scale (~71k pairs)
28
- // a single sub-dispatch suffices and `dispatch_offset` is zero.
29
- .addUniform('dispatch_offset', u32)
30
- .addUniform('total_pair_count', u32)
31
- .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
32
- .addStorageBuffer('dispatch_lookup', WebGPUArray.from(u32), false)
33
- // Same buffers the rasterizer reads as typed structs, bound here
34
- // as flat `atomic<u32>` arrays so we can do per-cell atomic
35
- // stores at known field offsets (resolved above at module-load).
36
- .addStorageBuffer('meshlet_metadata_atomic', WebGPUArray.from(atomic_u32), true)
37
- .addStorageBuffer('geometry_metadata_atomic', WebGPUArray.from(atomic_u32), true);
38
-
39
- const body = CodeChunk.from(
40
- //language=WGSL
41
- `
42
- const PLUS_INF: u32 = 0x7F800000u; // bitcast f32(+inf)
43
- const MINUS_INF: u32 = 0xFF800000u; // bitcast f32(-inf)
44
-
45
- const MESHLET_BOUNDS_OFFSET: u32 = ${MESHLET_BOUNDS_OFFSET_WORDS}u;
46
- const MESHLET_STRIDE: u32 = ${MESHLET_STRIDE_WORDS}u;
47
- const GEOMETRY_BBOX_OFFSET: u32 = ${GEOMETRY_BBOX_OFFSET_WORDS}u;
48
- const GEOMETRY_STRIDE: u32 = ${GEOMETRY_STRIDE_WORDS}u;
49
-
50
- @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
51
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
52
- let pair_index = gid.x + dispatch_offset;
53
- if pair_index >= total_pair_count {
54
- return;
55
- }
56
-
57
- let lookup_base = pair_index * 2u;
58
- let binding_index = dispatch_lookup[lookup_base];
59
- let meshlet_local = dispatch_lookup[lookup_base + 1u];
60
-
61
- let binding = skinning_bindings[binding_index];
62
- let clone_meshlet_abs = binding.clone_meshlet_metadata_offset + meshlet_local;
63
-
64
- // Meshlet bounds reset: +inf for the 3 min slots, -inf for the
65
- // 3 max slots. Each meshlet has exactly one (binding, meshlet)
66
- // pair that touches it, so there's no cross-thread race on these
67
- // slots — atomicStore is technically overkill, but the buffer is
68
- // bound atomic-typed for the reduce pass and atomicStore is the
69
- // way to write through that view.
70
- let m_base = clone_meshlet_abs * MESHLET_STRIDE + MESHLET_BOUNDS_OFFSET;
71
- atomicStore(&meshlet_metadata_atomic[m_base + 0u], PLUS_INF);
72
- atomicStore(&meshlet_metadata_atomic[m_base + 1u], PLUS_INF);
73
- atomicStore(&meshlet_metadata_atomic[m_base + 2u], PLUS_INF);
74
- atomicStore(&meshlet_metadata_atomic[m_base + 3u], MINUS_INF);
75
- atomicStore(&meshlet_metadata_atomic[m_base + 4u], MINUS_INF);
76
- atomicStore(&meshlet_metadata_atomic[m_base + 5u], MINUS_INF);
77
-
78
- // Geometry bounds reset gate: the first meshlet of each binding
79
- // (meshlet_local == 0) does the reset for the binding's clone
80
- // geometry. Every clone has at least one meshlet, so this fires
81
- // exactly once per active binding. Multiple bindings could in
82
- // principle target the same clone — the skinning context allocates
83
- // one clone per SkinnedMesh, so in practice each binding owns its
84
- // own geometry — but even if they didn't, the writes here are
85
- // idempotent (same sentinels).
86
- if meshlet_local == 0u {
87
- let g_base = binding.clone_geometry_index * GEOMETRY_STRIDE + GEOMETRY_BBOX_OFFSET;
88
- atomicStore(&geometry_metadata_atomic[g_base + 0u], PLUS_INF);
89
- atomicStore(&geometry_metadata_atomic[g_base + 1u], PLUS_INF);
90
- atomicStore(&geometry_metadata_atomic[g_base + 2u], PLUS_INF);
91
- atomicStore(&geometry_metadata_atomic[g_base + 3u], MINUS_INF);
92
- atomicStore(&geometry_metadata_atomic[g_base + 4u], MINUS_INF);
93
- atomicStore(&geometry_metadata_atomic[g_base + 5u], MINUS_INF);
94
- }
95
- }
96
- `);
97
-
98
- /**
99
- * Compute shader that resets per-meshlet `bounds_box` (clone meshlets
100
- * only) and per-clone-geometry `bounding_box` to ±inf sentinels —
101
- * the prerequisite for the reduce / merge passes that follow.
102
- *
103
- * Linear-thread dispatch: one thread per (binding, meshlet) pair in
104
- * the skinning context's `dispatch_lookup`. With workgroup size 64,
105
- * `ceil(total_pair_count / 64)` workgroups cover everything; the
106
- * `dispatch_offset` uniform lets the host paginate when
107
- * `total_pair_count > maxComputeWorkgroupsPerDimension * 64`
108
- * (currently won't trigger — 65535 * 64 ≈ 4M pairs).
109
- *
110
- * The geometry bounds reset is gated to `meshlet_local == 0` so each
111
- * clone geometry is reset exactly once. The clone's bounding_sphere
112
- * is NOT reset here — the derive-sphere pass at the end of the
113
- * refresh chain overwrites it wholesale from the box, so no
114
- * transient state matters.
115
- */
116
- export const shader_meshlet_bounds_scatter = ComputeShader.from({
117
- label: "Skinning/MeshletBoundsScatter",
118
- resources,
119
- body,
120
- group_size: [WORKGROUP_SIZE, 1, 1],
121
- });
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
+
10
+ export const WORKGROUP_SIZE = 64;
11
+
12
+ // Struct field offsets resolved at module-load time and baked into the
13
+ // shader as constants. The structs use `.pack()` for minimum-size
14
+ // layout, so the field positions depend on the packing heuristic —
15
+ // reading `.get(field).offset` after the build phase is the only
16
+ // reliable way to know where bounds_box / bounding_box actually sit.
17
+ const MESHLET_BOUNDS_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('bounds_box').offset / 4;
18
+ const MESHLET_STRIDE_WORDS = MESHLET_METADATA_STRUCT.size / 4;
19
+
20
+ const GEOMETRY_BBOX_OFFSET_WORDS = GEOMETRY_METADATA_STRUCT.get('bounding_box').offset / 4;
21
+ const GEOMETRY_STRIDE_WORDS = GEOMETRY_METADATA_STRUCT.size / 4;
22
+
23
+ const resources = new ShaderResourceSetDescriptor();
24
+ resources.createGroup()
25
+ // Sub-dispatch first-pair offset, in pair units. The host
26
+ // paginates if `total_pair_count > maxComputeWorkgroupsPerDimension
27
+ // * WORKGROUP_SIZE`; under typical stress-test scale (~71k pairs)
28
+ // a single sub-dispatch suffices and `dispatch_offset` is zero.
29
+ .addUniform('dispatch_offset', u32)
30
+ .addUniform('total_pair_count', u32)
31
+ .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
32
+ .addStorageBuffer('dispatch_lookup', WebGPUArray.from(u32), false)
33
+ // Same buffers the rasterizer reads as typed structs, bound here
34
+ // as flat `atomic<u32>` arrays so we can do per-cell atomic
35
+ // stores at known field offsets (resolved above at module-load).
36
+ .addStorageBuffer('meshlet_metadata_atomic', WebGPUArray.from(atomic_u32), true)
37
+ .addStorageBuffer('geometry_metadata_atomic', WebGPUArray.from(atomic_u32), true);
38
+
39
+ const body = CodeChunk.from(
40
+ //language=WGSL
41
+ `
42
+ const PLUS_INF: u32 = 0x7F800000u; // bitcast f32(+inf)
43
+ const MINUS_INF: u32 = 0xFF800000u; // bitcast f32(-inf)
44
+
45
+ const MESHLET_BOUNDS_OFFSET: u32 = ${MESHLET_BOUNDS_OFFSET_WORDS}u;
46
+ const MESHLET_STRIDE: u32 = ${MESHLET_STRIDE_WORDS}u;
47
+ const GEOMETRY_BBOX_OFFSET: u32 = ${GEOMETRY_BBOX_OFFSET_WORDS}u;
48
+ const GEOMETRY_STRIDE: u32 = ${GEOMETRY_STRIDE_WORDS}u;
49
+
50
+ @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
51
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
52
+ let pair_index = gid.x + dispatch_offset;
53
+ if pair_index >= total_pair_count {
54
+ return;
55
+ }
56
+
57
+ let lookup_base = pair_index * 2u;
58
+ let binding_index = dispatch_lookup[lookup_base];
59
+ let meshlet_local = dispatch_lookup[lookup_base + 1u];
60
+
61
+ let binding = skinning_bindings[binding_index];
62
+ let clone_meshlet_abs = binding.clone_meshlet_metadata_offset + meshlet_local;
63
+
64
+ // Meshlet bounds reset: +inf for the 3 min slots, -inf for the
65
+ // 3 max slots. Each meshlet has exactly one (binding, meshlet)
66
+ // pair that touches it, so there's no cross-thread race on these
67
+ // slots — atomicStore is technically overkill, but the buffer is
68
+ // bound atomic-typed for the reduce pass and atomicStore is the
69
+ // way to write through that view.
70
+ let m_base = clone_meshlet_abs * MESHLET_STRIDE + MESHLET_BOUNDS_OFFSET;
71
+ atomicStore(&meshlet_metadata_atomic[m_base + 0u], PLUS_INF);
72
+ atomicStore(&meshlet_metadata_atomic[m_base + 1u], PLUS_INF);
73
+ atomicStore(&meshlet_metadata_atomic[m_base + 2u], PLUS_INF);
74
+ atomicStore(&meshlet_metadata_atomic[m_base + 3u], MINUS_INF);
75
+ atomicStore(&meshlet_metadata_atomic[m_base + 4u], MINUS_INF);
76
+ atomicStore(&meshlet_metadata_atomic[m_base + 5u], MINUS_INF);
77
+
78
+ // Geometry bounds reset gate: the first meshlet of each binding
79
+ // (meshlet_local == 0) does the reset for the binding's clone
80
+ // geometry. Every clone has at least one meshlet, so this fires
81
+ // exactly once per active binding. Multiple bindings could in
82
+ // principle target the same clone — the skinning context allocates
83
+ // one clone per SkinnedMesh, so in practice each binding owns its
84
+ // own geometry — but even if they didn't, the writes here are
85
+ // idempotent (same sentinels).
86
+ if meshlet_local == 0u {
87
+ let g_base = binding.clone_geometry_index * GEOMETRY_STRIDE + GEOMETRY_BBOX_OFFSET;
88
+ atomicStore(&geometry_metadata_atomic[g_base + 0u], PLUS_INF);
89
+ atomicStore(&geometry_metadata_atomic[g_base + 1u], PLUS_INF);
90
+ atomicStore(&geometry_metadata_atomic[g_base + 2u], PLUS_INF);
91
+ atomicStore(&geometry_metadata_atomic[g_base + 3u], MINUS_INF);
92
+ atomicStore(&geometry_metadata_atomic[g_base + 4u], MINUS_INF);
93
+ atomicStore(&geometry_metadata_atomic[g_base + 5u], MINUS_INF);
94
+ }
95
+ }
96
+ `);
97
+
98
+ /**
99
+ * Compute shader that resets per-meshlet `bounds_box` (clone meshlets
100
+ * only) and per-clone-geometry `bounding_box` to ±inf sentinels —
101
+ * the prerequisite for the reduce / merge passes that follow.
102
+ *
103
+ * Linear-thread dispatch: one thread per (binding, meshlet) pair in
104
+ * the skinning context's `dispatch_lookup`. With workgroup size 64,
105
+ * `ceil(total_pair_count / 64)` workgroups cover everything; the
106
+ * `dispatch_offset` uniform lets the host paginate when
107
+ * `total_pair_count > maxComputeWorkgroupsPerDimension * 64`
108
+ * (currently won't trigger — 65535 * 64 ≈ 4M pairs).
109
+ *
110
+ * The geometry bounds reset is gated to `meshlet_local == 0` so each
111
+ * clone geometry is reset exactly once. The clone's bounding_sphere
112
+ * is NOT reset here — the derive-sphere pass at the end of the
113
+ * refresh chain overwrites it wholesale from the box, so no
114
+ * transient state matters.
115
+ */
116
+ export const shader_meshlet_bounds_scatter = ComputeShader.from({
117
+ label: "Skinning/MeshletBoundsScatter",
118
+ resources,
119
+ body,
120
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_skinned_mesh_bounds_refresh.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js"],"names":[],"mappings":"AAWA,gCAAiC;AAuCjC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,+DAKG;8BApE2B,kCAAkC"}
1
+ {"version":3,"file":"shader_skinned_mesh_bounds_refresh.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js"],"names":[],"mappings":"AAWA,gCAAiC;AAuCjC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,+DAIG;8BAnE2B,kCAAkC"}
@@ -1,76 +1,75 @@
1
- import { 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 {
5
- chunk_update_object_property_mesh_instance_bounds
6
- } from "../../../object_property/chunk_update_object_property_mesh_instance_bounds.js";
7
- import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
8
- import { ComputeShader } from "../../../shader/ComputeShader.js";
9
- import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
10
- import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
11
-
12
- export const WORKGROUP_SIZE = 64;
13
-
14
- const resources = new ShaderResourceSetDescriptor();
15
- resources.createGroup()
16
- // Number of active skinning bindings (= one per skinned mesh
17
- // instance). Threads past `binding_count` early-out.
18
- .addUniform('binding_count', u32)
19
- .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
20
- // `chunk_update_object_property_mesh_instance_bounds` expects
21
- // these binding names — see its docstring's importing-shader
22
- // contract. scene_database is rw because the mesh bounds writes
23
- // route through `scene_write_mesh_*` per-field helpers, which
24
- // need the read_write access mode.
25
- .addStorageBuffer('scene_database', WebGPUArray.from(u32), true)
26
- .addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT), false);
27
-
28
- const body = CodeChunk.from(
29
- //language=WGSL
30
- `
31
- @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
32
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
33
- let binding_index = gid.x;
34
- if binding_index >= binding_count {
35
- return;
36
- }
37
-
38
- let binding = skinning_bindings[binding_index];
39
-
40
- // Per-instance world-space bounds: reads geometry.bounding_box
41
- // (just refreshed by the per-meshlet reduce pass) and
42
- // geometry.bounding_sphere (just refreshed by the sphere-derive
43
- // pass), projects through the mesh's node.global, writes back
44
- // to mesh.bounding_box / bounding_sphere. Reuses the existing
45
- // chunk so the math (max-column-length sphere radius scaling for
46
- // non-uniform-scale-safe culling) stays in one place.
47
- update_object_property_mesh_instance_bounds(binding.mesh_instance_index);
48
- }
49
- `, [chunk_update_object_property_mesh_instance_bounds]);
50
-
51
- /**
52
- * Compute shader that refreshes the world-space `bounding_box` and
53
- * `bounding_sphere` of every SkinnedMesh instance in the scene's
54
- * meshes table from its (now up-to-date) clone geometry bounds.
55
- *
56
- * One thread per active skinning binding. Each thread:
57
- * - Looks up its binding's `mesh_instance_index` in the meshes table.
58
- * - Reads `geometry.bounding_box` + `geometry.bounding_sphere` from
59
- * the geometry metadata table (post-reduce + post-sphere-derive).
60
- * - Reads `node.global` for the mesh's world transform.
61
- * - Projects the local AABB / sphere into world space.
62
- * - Writes back to `mesh.bounding_box` / `mesh.bounding_sphere`.
63
- *
64
- * Must run AFTER `shader_geometry_sphere_derive` (which writes the
65
- * geometry sphere this pass reads) and AFTER the transform-hierarchy
66
- * propagate pass (which writes `node.global`). Without the mesh
67
- * bounds refreshed, the rasterizer's sphere-cull and frustum-cull
68
- * passes reject animated meshes that move outside their original
69
- * source-encoded bounds.
70
- */
71
- export const shader_skinned_mesh_bounds_refresh = ComputeShader.from({
72
- label: "Skinning/SkinnedMeshBoundsRefresh",
73
- resources,
74
- body,
75
- group_size: [WORKGROUP_SIZE, 1, 1],
76
- });
1
+ import { 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 {
5
+ chunk_update_object_property_mesh_instance_bounds
6
+ } from "../../../object_property/chunk_update_object_property_mesh_instance_bounds.js";
7
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
8
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
9
+ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
10
+ import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
11
+
12
+ export const WORKGROUP_SIZE = 64;
13
+
14
+ const resources = new ShaderResourceSetDescriptor();
15
+ resources.createGroup()
16
+ // Number of active skinning bindings (= one per skinned mesh
17
+ // instance). Threads past `binding_count` early-out.
18
+ .addUniform('binding_count', u32)
19
+ .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
20
+ // `chunk_update_object_property_mesh_instance_bounds` expects
21
+ // these binding names — see its docstring's importing-shader
22
+ // contract. scene_database is rw because the mesh bounds writes
23
+ // route through `scene_write_mesh_*` per-field helpers, which
24
+ // need the read_write access mode.
25
+ .addStorageBuffer('scene_database', WebGPUArray.from(u32), true)
26
+ .addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT), false);
27
+
28
+ const body = CodeChunk.from(
29
+ //language=WGSL
30
+ `
31
+ @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
32
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
33
+ let binding_index = gid.x;
34
+ if binding_index >= binding_count {
35
+ return;
36
+ }
37
+
38
+ let binding = skinning_bindings[binding_index];
39
+
40
+ // Per-instance world-space bounds: reads geometry.bounding_box
41
+ // (just refreshed by the per-meshlet reduce pass) and
42
+ // geometry.bounding_sphere (just refreshed by the sphere-derive
43
+ // pass), projects through the mesh's node.global, writes back
44
+ // to mesh.bounding_box / bounding_sphere. Reuses the existing
45
+ // chunk so the math (max-column-length sphere radius scaling for
46
+ // non-uniform-scale-safe culling) stays in one place.
47
+ update_object_property_mesh_instance_bounds(binding.mesh_instance_index);
48
+ }
49
+ `, [chunk_update_object_property_mesh_instance_bounds]);
50
+
51
+ /**
52
+ * Compute shader that refreshes the world-space `bounding_box` and
53
+ * `bounding_sphere` of every SkinnedMesh instance in the scene's
54
+ * meshes table from its (now up-to-date) clone geometry bounds.
55
+ *
56
+ * One thread per active skinning binding. Each thread:
57
+ * - Looks up its binding's `mesh_instance_index` in the meshes table.
58
+ * - Reads `geometry.bounding_box` + `geometry.bounding_sphere` from
59
+ * the geometry metadata table (post-reduce + post-sphere-derive).
60
+ * - Reads `node.global` for the mesh's world transform.
61
+ * - Projects the local AABB / sphere into world space.
62
+ * - Writes back to `mesh.bounding_box` / `mesh.bounding_sphere`.
63
+ *
64
+ * Must run AFTER `shader_geometry_sphere_derive` (which writes the
65
+ * geometry sphere this pass reads) and AFTER the transform-hierarchy
66
+ * propagate pass (which writes `node.global`). Without the mesh
67
+ * bounds refreshed, the rasterizer's sphere-cull and frustum-cull
68
+ * passes reject animated meshes that move outside their original
69
+ * source-encoded bounds.
70
+ */
71
+ export const shader_skinned_mesh_bounds_refresh = ComputeShader.from({
72
+ label: "Skinning/SkinnedMeshBoundsRefresh",
73
+ resources,
74
+ body,
75
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_meshlet_apply_skinning.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js"],"names":[],"mappings":"AAqCA;;;;GAIG;AACH,yCAA0C;AA6S1C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,0DAKG;8BAnV2B,+BAA+B"}
1
+ {"version":3,"file":"shader_meshlet_apply_skinning.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js"],"names":[],"mappings":"AAqCA;;;;GAIG;AACH,yCAA0C;AA6S1C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,0DAIG;8BAlV2B,+BAA+B"}