@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,129 +1,128 @@
1
- import { atomic_u32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../shader/type/WebGPUArray.js";
3
- import { MATERIAL_METADATA_STRUCT } from "../material/MATERIAL_METADATA_STRUCT.js";
4
- import { chunk_write_object_property } from "../object_property/chunk_write_object_property.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 { ANIMATION_DATABASE_SPEC } from "./ANIMATION_DATABASE_SPEC.js";
9
- import { chunk_animation_track_evaluate } from "./animation_track_evaluate.js";
10
-
11
- const GROUP_TABLE = ANIMATION_DATABASE_SPEC.get('animation_bound_track_groups');
12
- const CLIP_TABLE = ANIMATION_DATABASE_SPEC.get('animation_clips');
13
- const TRACK_TABLE = ANIMATION_DATABASE_SPEC.get('animation_tracks');
14
-
15
- /**
16
- * Workgroup size for the apply pass. Exported so dispatchers can pair it
17
- * with `animation_bound_track_groups.dispatch_group_count(WORKGROUP_SIZE)` —
18
- * the page iterator's slot-to-workgroup mapping is computed against this
19
- * value, so the two must agree.
20
- */
21
- export const WORKGROUP_SIZE = 64;
22
-
23
- const PG_PREFIX = GROUP_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE);
24
-
25
- // `materials` and `pose_accumulator` are referenced by name from the
26
- // property-write chunks rather than passed as pointers — the chunks
27
- // rely on these bindings being declared in the importing shader.
28
- //
29
- // `pose_accumulator` is the per-Node3D contribution scratch (one slot per
30
- // transforms-table row, `POSE_ACCUMULATOR_STRIDE` u32s each). Apply
31
- // atomic-adds weighted values into it; the downstream resolve pass
32
- // drains it into `transforms_table.local_*`.
33
- const resources = new ShaderResourceSetDescriptor();
34
- resources.createGroup()
35
- .addStorageBuffer('animation_database', WebGPUArray.from(u32), false)
36
- .addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true)
37
- .addStorageBuffer('materials', WebGPUArray.from(MATERIAL_METADATA_STRUCT), true);
38
-
39
- // Strict 1:1 page-iterator dispatch: one thread per group-node slot.
40
- // A page is covered by GROUPS_PER_PAGE workgroups in parallel; setup
41
- // derives (page_index, page_group) from workgroup_id.x, the in-page
42
- // slot from page_group + local_id, and lanes past ELEMENTS_PER_PAGE
43
- // (only possible in the last page_group) are tail-masked.
44
- const body = CodeChunk.from(
45
- //language=WGSL
46
- `
47
- @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
48
- fn main(
49
- @builtin(workgroup_id) wg_id: vec3<u32>,
50
- @builtin(local_invocation_index) local_id: u32,
51
- ) {
52
- // page_address is uniform across the workgroup → unallocated-page
53
- // bail is uniform-control-flow safe.
54
- if !${PG_PREFIX}_setup(&animation_database, wg_id.x, local_id) {
55
- return;
56
- }
57
-
58
- let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
59
-
60
- if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
61
- return;
62
- }
63
- if !${PG_PREFIX}_is_occupied(slot_in_page) {
64
- return;
65
- }
66
-
67
- // Per-thread group node: load it, resolve the back-referenced clip,
68
- // and apply every inline binding under that clip's effective time.
69
- // The chain's next field is for the host (linking new nodes onto
70
- // existing chains); the apply pass touches only the current node.
71
- let group = ${PG_PREFIX}_read(&animation_database, slot_in_page);
72
- let clip = ${CLIP_TABLE.marshalling_method_read}(&animation_database, group.clip);
73
-
74
- // Playback time 0 sits at clip.time_start on the curves' clock.
75
- // Curves clamp the result to their own [time_min, time_max], so a
76
- // track whose authored range falls outside the clip window just
77
- // holds at its endpoint over the gap.
78
- let effective_time = clip.time + clip.time_start;
79
-
80
- // Pre-multiply every contribution by this clip's weight so the
81
- // accumulator can just add. Translation/scale: scalar*vec3
82
- // componentwise; rotation: scalar*vec4, which is the standard
83
- // weighted-quaternion blend term — the resolve pass normalizes
84
- // the accumulated quat sum back to unit length.
85
- let weight = clip.playback_weight;
86
-
87
- for(var i = 0u; i < group.count; i++){
88
- let binding = group.bindings[i];
89
- let track = ${TRACK_TABLE.marshalling_method_read}(&animation_database, binding.track);
90
-
91
- let value = animation_track_evaluate(effective_time, track, &animation_database) * weight;
92
-
93
- write_object_property(binding.instance, binding.property, track.mask, value);
94
- }
95
- }
96
- `, [
97
- GROUP_TABLE.chunk_iterate(WORKGROUP_SIZE),
98
- CLIP_TABLE.chunk_read,
99
- TRACK_TABLE.chunk_read,
100
- chunk_animation_track_evaluate,
101
- chunk_write_object_property,
102
- ]
103
- );
104
-
105
- /**
106
- * Compute shader that walks the `animation_bound_track_groups` table —
107
- * one thread per group-node slot via the page iterator — evaluating
108
- * every inline binding under its owning clip's `time + time_start` and
109
- * atomic-adding the (weight-multiplied) result into the pose
110
- * accumulator (Node3D properties) or directly into the material
111
- * metadata table (Material properties).
112
- *
113
- * Node3D writes land in `pose_accumulator` rather than directly in
114
- * `transforms_table.local_*` so multi-clip blending is just additive;
115
- * `shader_animation_pose_resolve` walks the accumulator next, drains
116
- * each dirty row into the transforms table, normalizes rotation, and
117
- * zeros the slot for the next frame.
118
- *
119
- * Dispatch via
120
- * `shader_animation_apply.dispatch({ group_count_x: animation_bound_track_groups.dispatch_group_count(WORKGROUP_SIZE), ... })` —
121
- * the iterator covers every allocated page in parallel and skips
122
- * unallocated/unoccupied slots in-shader.
123
- */
124
- export const shader_animation_apply = ComputeShader.from({
125
- label: "Animation/Apply",
126
- body,
127
- resources,
128
- group_size: [WORKGROUP_SIZE, 1, 1],
129
- });
1
+ import { atomic_u32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../shader/type/WebGPUArray.js";
3
+ import { MATERIAL_METADATA_STRUCT } from "../material/MATERIAL_METADATA_STRUCT.js";
4
+ import { chunk_write_object_property } from "../object_property/chunk_write_object_property.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 { ANIMATION_DATABASE_SPEC } from "./ANIMATION_DATABASE_SPEC.js";
9
+ import { chunk_animation_track_evaluate } from "./animation_track_evaluate.js";
10
+
11
+ const GROUP_TABLE = ANIMATION_DATABASE_SPEC.get('animation_bound_track_groups');
12
+ const CLIP_TABLE = ANIMATION_DATABASE_SPEC.get('animation_clips');
13
+ const TRACK_TABLE = ANIMATION_DATABASE_SPEC.get('animation_tracks');
14
+
15
+ /**
16
+ * Workgroup size for the apply pass. Exported so dispatchers can pair it
17
+ * with `animation_bound_track_groups.dispatch_group_count(WORKGROUP_SIZE)` —
18
+ * the page iterator's slot-to-workgroup mapping is computed against this
19
+ * value, so the two must agree.
20
+ */
21
+ export const WORKGROUP_SIZE = 64;
22
+
23
+ const PG_PREFIX = GROUP_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE);
24
+
25
+ // `materials` and `pose_accumulator` are referenced by name from the
26
+ // property-write chunks rather than passed as pointers — the chunks
27
+ // rely on these bindings being declared in the importing shader.
28
+ //
29
+ // `pose_accumulator` is the per-Node3D contribution scratch (one slot per
30
+ // transforms-table row, `POSE_ACCUMULATOR_STRIDE` u32s each). Apply
31
+ // atomic-adds weighted values into it; the downstream resolve pass
32
+ // drains it into `transforms_table.local_*`.
33
+ const resources = new ShaderResourceSetDescriptor();
34
+ resources.createGroup()
35
+ .addStorageBuffer('animation_database', WebGPUArray.from(u32), false)
36
+ .addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true)
37
+ .addStorageBuffer('materials', WebGPUArray.from(MATERIAL_METADATA_STRUCT), true);
38
+
39
+ // Strict 1:1 page-iterator dispatch: one thread per group-node slot.
40
+ // A page is covered by GROUPS_PER_PAGE workgroups in parallel; setup
41
+ // derives (page_index, page_group) from workgroup_id.x, the in-page
42
+ // slot from page_group + local_id, and lanes past ELEMENTS_PER_PAGE
43
+ // (only possible in the last page_group) are tail-masked.
44
+ const body = CodeChunk.from(
45
+ //language=WGSL
46
+ `
47
+ @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
48
+ fn main(
49
+ @builtin(workgroup_id) wg_id: vec3<u32>,
50
+ @builtin(local_invocation_index) local_id: u32,
51
+ ) {
52
+ // page_address is uniform across the workgroup → unallocated-page
53
+ // bail is uniform-control-flow safe.
54
+ if !${PG_PREFIX}_setup(&animation_database, wg_id.x, local_id) {
55
+ return;
56
+ }
57
+
58
+ let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
59
+
60
+ if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
61
+ return;
62
+ }
63
+ if !${PG_PREFIX}_is_occupied(slot_in_page) {
64
+ return;
65
+ }
66
+
67
+ // Per-thread group node: load it, resolve the back-referenced clip,
68
+ // and apply every inline binding under that clip's effective time.
69
+ // The chain's next field is for the host (linking new nodes onto
70
+ // existing chains); the apply pass touches only the current node.
71
+ let group = ${PG_PREFIX}_read(&animation_database, slot_in_page);
72
+ let clip = ${CLIP_TABLE.marshalling_method_read}(&animation_database, group.clip);
73
+
74
+ // Playback time 0 sits at clip.time_start on the curves' clock.
75
+ // Curves clamp the result to their own [time_min, time_max], so a
76
+ // track whose authored range falls outside the clip window just
77
+ // holds at its endpoint over the gap.
78
+ let effective_time = clip.time + clip.time_start;
79
+
80
+ // Pre-multiply every contribution by this clip's weight so the
81
+ // accumulator can just add. Translation/scale: scalar*vec3
82
+ // componentwise; rotation: scalar*vec4, which is the standard
83
+ // weighted-quaternion blend term — the resolve pass normalizes
84
+ // the accumulated quat sum back to unit length.
85
+ let weight = clip.playback_weight;
86
+
87
+ for(var i = 0u; i < group.count; i++){
88
+ let binding = group.bindings[i];
89
+ let track = ${TRACK_TABLE.marshalling_method_read}(&animation_database, binding.track);
90
+
91
+ let value = animation_track_evaluate(effective_time, track, &animation_database) * weight;
92
+
93
+ write_object_property(binding.instance, binding.property, track.mask, value);
94
+ }
95
+ }
96
+ `, [
97
+ GROUP_TABLE.chunk_iterate(WORKGROUP_SIZE),
98
+ CLIP_TABLE.chunk_read,
99
+ TRACK_TABLE.chunk_read,
100
+ chunk_animation_track_evaluate,
101
+ chunk_write_object_property,
102
+ ]
103
+ );
104
+
105
+ /**
106
+ * Compute shader that walks the `animation_bound_track_groups` table —
107
+ * one thread per group-node slot via the page iterator — evaluating
108
+ * every inline binding under its owning clip's `time + time_start` and
109
+ * atomic-adding the (weight-multiplied) result into the pose
110
+ * accumulator (Node3D properties) or directly into the material
111
+ * metadata table (Material properties).
112
+ *
113
+ * Node3D writes land in `pose_accumulator` rather than directly in
114
+ * `transforms_table.local_*` so multi-clip blending is just additive;
115
+ * `shader_animation_pose_resolve` walks the accumulator next, drains
116
+ * each dirty row into the transforms table, normalizes rotation, and
117
+ * zeros the slot for the next frame.
118
+ *
119
+ * Dispatch via
120
+ * `shader_animation_apply.dispatch({ group_count_x: animation_bound_track_groups.dispatch_group_count(WORKGROUP_SIZE), ... })` —
121
+ * the iterator covers every allocated page in parallel and skips
122
+ * unallocated/unoccupied slots in-shader.
123
+ */
124
+ export const shader_animation_apply = ComputeShader.from({
125
+ label: "Animation/Apply",
126
+ body,
127
+ resources,
128
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_animation_pose_resolve.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_pose_resolve.js"],"names":[],"mappings":"AAWA;;;GAGG;AACH,gCAAiC;AAyIjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,0DAKG;8BA3K2B,4BAA4B"}
1
+ {"version":3,"file":"shader_animation_pose_resolve.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_pose_resolve.js"],"names":[],"mappings":"AAWA;;;GAGG;AACH,gCAAiC;AAyIjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,0DAIG;8BA1K2B,4BAA4B"}
@@ -1,177 +1,176 @@
1
- import { atomic_u32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../shader/type/WebGPUArray.js";
3
- import { chunk_scene_database_access_rw } from "../scene/chunk_scene_database_access.js";
4
- import { SCENE_DATABASE_SPEC } from "../scene/SCENE_DATABASE_SPEC.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 { chunk_pose_accumulator } from "./chunk_pose_accumulator.js";
9
-
10
- const TRANSFORMS_TABLE = SCENE_DATABASE_SPEC.get('transforms');
11
-
12
- /**
13
- * Workgroup size for the resolve pass. Exported so dispatchers can pair
14
- * it with `transforms.dispatch_group_count(WORKGROUP_SIZE)`.
15
- */
16
- export const WORKGROUP_SIZE = 64;
17
-
18
- const PG_PREFIX = TRANSFORMS_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE, true);
19
-
20
- const resources = new ShaderResourceSetDescriptor();
21
- resources.createGroup()
22
- .addStorageBuffer('scene_database', WebGPUArray.from(u32), true)
23
- .addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true);
24
-
25
- const body = CodeChunk.from(
26
- //language=WGSL
27
- `
28
- @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
29
- fn main(
30
- @builtin(workgroup_id) wg_id: vec3<u32>,
31
- @builtin(local_invocation_index) local_id: u32,
32
- ) {
33
- if !${PG_PREFIX}_setup(&scene_database, wg_id.x, local_id) {
34
- return;
35
- }
36
-
37
- let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
38
-
39
- if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
40
- return;
41
- }
42
- if !${PG_PREFIX}_is_occupied(slot_in_page) {
43
- return;
44
- }
45
-
46
- // Absolute transforms-table row index. The accumulator is laid out
47
- // one slot per row at the same index, so this is also the
48
- // accumulator slot.
49
- let row = ${PG_PREFIX}_slot_to_index(slot_in_page);
50
-
51
- let slot_base = pose_accumulator_slot_base(row);
52
- let dirty_word = slot_base + POSE_OFFSET_DIRTY;
53
-
54
- // Single load of the dirty mask gates the whole resolve. If
55
- // nothing was contributed to this row this frame, leave local_*
56
- // alone (and the accumulator slot is already zero because the
57
- // previous resolve drained it).
58
- let dirty = atomicLoad(&pose_accumulator[dirty_word]);
59
- if dirty == 0u {
60
- return;
61
- }
62
-
63
- // ── Translation ───────────────────────────────────────────────
64
- if (dirty & POSE_DIRTY_T_MASK) != 0u {
65
- let t_base = slot_base + POSE_OFFSET_TRANSLATION;
66
- // Per-axis: only overwrite the channels that actually had a
67
- // contribution. Read the current local_translation through
68
- // the rw helper and patch the dirty channels in-place — the
69
- // sibling-axis race that the old direct writer already
70
- // tolerated still applies (two threads writing different
71
- // axes of the same node), but we now have at most one resolve
72
- // thread per row, so it never triggers here.
73
- var t = scene_read_node_rw(&scene_database, row).local_translation;
74
- if (dirty & POSE_DIRTY_TX) != 0u {
75
- t.x = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 0u]));
76
- atomicStore(&pose_accumulator[t_base + 0u], 0u);
77
- }
78
- if (dirty & POSE_DIRTY_TY) != 0u {
79
- t.y = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 1u]));
80
- atomicStore(&pose_accumulator[t_base + 1u], 0u);
81
- }
82
- if (dirty & POSE_DIRTY_TZ) != 0u {
83
- t.z = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 2u]));
84
- atomicStore(&pose_accumulator[t_base + 2u], 0u);
85
- }
86
- scene_write_node_local_translation(&scene_database, row, t);
87
- }
88
-
89
- // ── Rotation ──────────────────────────────────────────────────
90
- if (dirty & POSE_DIRTY_R) != 0u {
91
- let r_base = slot_base + POSE_OFFSET_ROTATION;
92
- let r = vec4<f32>(
93
- bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 0u])),
94
- bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 1u])),
95
- bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 2u])),
96
- bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 3u])),
97
- );
98
- atomicStore(&pose_accumulator[r_base + 0u], 0u);
99
- atomicStore(&pose_accumulator[r_base + 1u], 0u);
100
- atomicStore(&pose_accumulator[r_base + 2u], 0u);
101
- atomicStore(&pose_accumulator[r_base + 3u], 0u);
102
- // A sum of length zero carries no orientation to recover: every
103
- // clip that writes this rotation is playing at weight zero, and
104
- // the apply pass contributes to a bound clip whatever its
105
- // weight. \`normalize\` answers NaN there, and one NaN local
106
- // rotation reaches every skin matrix naming the joint, so the
107
- // meshes it drives stop rasterising altogether — a rig loses a
108
- // limb because a clip nobody is playing happens to be the only
109
- // one that rotates it. Leaving the row alone is the rest pose,
110
- // which is the answer the CPU twin gives (\`pose_evaluate_local\`)
111
- // and the value the row still holds.
112
- //
113
- // Otherwise: the weighted-quaternion sum (\`w_i * q_i\`) is the
114
- // standard nlerp blend numerator; normalise here, once, after
115
- // every contributor has been folded in. The apply pass
116
- // canonicalised signs at GLTF load so we don't hit the antipode
117
- // case for imported clips.
118
- if length(r) > 0.0 {
119
- scene_write_node_local_rotation(&scene_database, row, normalize(r));
120
- }
121
- }
122
-
123
- // ── Scale ─────────────────────────────────────────────────────
124
- if (dirty & POSE_DIRTY_S_MASK) != 0u {
125
- let s_base = slot_base + POSE_OFFSET_SCALE;
126
- var s = scene_read_node_rw(&scene_database, row).local_scale;
127
- if (dirty & POSE_DIRTY_SX) != 0u {
128
- s.x = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 0u]));
129
- atomicStore(&pose_accumulator[s_base + 0u], 0u);
130
- }
131
- if (dirty & POSE_DIRTY_SY) != 0u {
132
- s.y = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 1u]));
133
- atomicStore(&pose_accumulator[s_base + 1u], 0u);
134
- }
135
- if (dirty & POSE_DIRTY_SZ) != 0u {
136
- s.z = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 2u]));
137
- atomicStore(&pose_accumulator[s_base + 2u], 0u);
138
- }
139
- scene_write_node_local_scale(&scene_database, row, s);
140
- }
141
-
142
- // Clear the dirty mask itself last, so an interrupted resolve
143
- // (theoretical — these passes don't yield) would still leave the
144
- // dirty bits intact to be redone.
145
- atomicStore(&pose_accumulator[dirty_word], 0u);
146
- }
147
- `, [
148
- TRANSFORMS_TABLE.chunk_iterate(WORKGROUP_SIZE, true),
149
- chunk_scene_database_access_rw,
150
- chunk_pose_accumulator,
151
- ]);
152
-
153
- /**
154
- * Compute shader that drains the pose accumulator into
155
- * `transforms_table.local_{translation,rotation,scale}`.
156
- *
157
- * Walks the transforms table via the read+write page iterator — one
158
- * thread per slot. For each occupied row whose accumulator slot has
159
- * any dirty bits set, reads the contributed components (atomic
160
- * loads, bitcast back to f32), writes them through the per-field
161
- * scene helpers, normalises rotation, and zeros the slot for next
162
- * frame.
163
- *
164
- * The accumulator buffer must be sized to at least
165
- * `transforms.dispatch_page_count * elements_per_page` rows —
166
- * {@link GPUAnimationManager#ensure_pose_accumulator_capacity}
167
- * handles that.
168
- *
169
- * Dispatch via
170
- * `shader_animation_pose_resolve.dispatch({ group_count_x: transforms.dispatch_group_count(WORKGROUP_SIZE), ... })`.
171
- */
172
- export const shader_animation_pose_resolve = ComputeShader.from({
173
- label: "Animation/PoseResolve",
174
- body,
175
- resources,
176
- group_size: [WORKGROUP_SIZE, 1, 1],
177
- });
1
+ import { atomic_u32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../shader/type/WebGPUArray.js";
3
+ import { chunk_scene_database_access_rw } from "../scene/chunk_scene_database_access.js";
4
+ import { SCENE_DATABASE_SPEC } from "../scene/SCENE_DATABASE_SPEC.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 { chunk_pose_accumulator } from "./chunk_pose_accumulator.js";
9
+
10
+ const TRANSFORMS_TABLE = SCENE_DATABASE_SPEC.get('transforms');
11
+
12
+ /**
13
+ * Workgroup size for the resolve pass. Exported so dispatchers can pair
14
+ * it with `transforms.dispatch_group_count(WORKGROUP_SIZE)`.
15
+ */
16
+ export const WORKGROUP_SIZE = 64;
17
+
18
+ const PG_PREFIX = TRANSFORMS_TABLE.page_iterator_symbol_prefix(WORKGROUP_SIZE, true);
19
+
20
+ const resources = new ShaderResourceSetDescriptor();
21
+ resources.createGroup()
22
+ .addStorageBuffer('scene_database', WebGPUArray.from(u32), true)
23
+ .addStorageBuffer('pose_accumulator', WebGPUArray.from(atomic_u32), true);
24
+
25
+ const body = CodeChunk.from(
26
+ //language=WGSL
27
+ `
28
+ @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
29
+ fn main(
30
+ @builtin(workgroup_id) wg_id: vec3<u32>,
31
+ @builtin(local_invocation_index) local_id: u32,
32
+ ) {
33
+ if !${PG_PREFIX}_setup(&scene_database, wg_id.x, local_id) {
34
+ return;
35
+ }
36
+
37
+ let slot_in_page = ${PG_PREFIX}_slot_in_page(local_id);
38
+
39
+ if slot_in_page >= ${PG_PREFIX}_ELEMENTS_PER_PAGE {
40
+ return;
41
+ }
42
+ if !${PG_PREFIX}_is_occupied(slot_in_page) {
43
+ return;
44
+ }
45
+
46
+ // Absolute transforms-table row index. The accumulator is laid out
47
+ // one slot per row at the same index, so this is also the
48
+ // accumulator slot.
49
+ let row = ${PG_PREFIX}_slot_to_index(slot_in_page);
50
+
51
+ let slot_base = pose_accumulator_slot_base(row);
52
+ let dirty_word = slot_base + POSE_OFFSET_DIRTY;
53
+
54
+ // Single load of the dirty mask gates the whole resolve. If
55
+ // nothing was contributed to this row this frame, leave local_*
56
+ // alone (and the accumulator slot is already zero because the
57
+ // previous resolve drained it).
58
+ let dirty = atomicLoad(&pose_accumulator[dirty_word]);
59
+ if dirty == 0u {
60
+ return;
61
+ }
62
+
63
+ // ── Translation ───────────────────────────────────────────────
64
+ if (dirty & POSE_DIRTY_T_MASK) != 0u {
65
+ let t_base = slot_base + POSE_OFFSET_TRANSLATION;
66
+ // Per-axis: only overwrite the channels that actually had a
67
+ // contribution. Read the current local_translation through
68
+ // the rw helper and patch the dirty channels in-place — the
69
+ // sibling-axis race that the old direct writer already
70
+ // tolerated still applies (two threads writing different
71
+ // axes of the same node), but we now have at most one resolve
72
+ // thread per row, so it never triggers here.
73
+ var t = scene_read_node_rw(&scene_database, row).local_translation;
74
+ if (dirty & POSE_DIRTY_TX) != 0u {
75
+ t.x = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 0u]));
76
+ atomicStore(&pose_accumulator[t_base + 0u], 0u);
77
+ }
78
+ if (dirty & POSE_DIRTY_TY) != 0u {
79
+ t.y = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 1u]));
80
+ atomicStore(&pose_accumulator[t_base + 1u], 0u);
81
+ }
82
+ if (dirty & POSE_DIRTY_TZ) != 0u {
83
+ t.z = bitcast<f32>(atomicLoad(&pose_accumulator[t_base + 2u]));
84
+ atomicStore(&pose_accumulator[t_base + 2u], 0u);
85
+ }
86
+ scene_write_node_local_translation(&scene_database, row, t);
87
+ }
88
+
89
+ // ── Rotation ──────────────────────────────────────────────────
90
+ if (dirty & POSE_DIRTY_R) != 0u {
91
+ let r_base = slot_base + POSE_OFFSET_ROTATION;
92
+ let r = vec4<f32>(
93
+ bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 0u])),
94
+ bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 1u])),
95
+ bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 2u])),
96
+ bitcast<f32>(atomicLoad(&pose_accumulator[r_base + 3u])),
97
+ );
98
+ atomicStore(&pose_accumulator[r_base + 0u], 0u);
99
+ atomicStore(&pose_accumulator[r_base + 1u], 0u);
100
+ atomicStore(&pose_accumulator[r_base + 2u], 0u);
101
+ atomicStore(&pose_accumulator[r_base + 3u], 0u);
102
+ // A sum of length zero carries no orientation to recover: every
103
+ // clip that writes this rotation is playing at weight zero, and
104
+ // the apply pass contributes to a bound clip whatever its
105
+ // weight. \`normalize\` answers NaN there, and one NaN local
106
+ // rotation reaches every skin matrix naming the joint, so the
107
+ // meshes it drives stop rasterising altogether — a rig loses a
108
+ // limb because a clip nobody is playing happens to be the only
109
+ // one that rotates it. Leaving the row alone is the rest pose,
110
+ // which is the answer the CPU twin gives (\`pose_evaluate_local\`)
111
+ // and the value the row still holds.
112
+ //
113
+ // Otherwise: the weighted-quaternion sum (\`w_i * q_i\`) is the
114
+ // standard nlerp blend numerator; normalise here, once, after
115
+ // every contributor has been folded in. The apply pass
116
+ // canonicalised signs at GLTF load so we don't hit the antipode
117
+ // case for imported clips.
118
+ if length(r) > 0.0 {
119
+ scene_write_node_local_rotation(&scene_database, row, normalize(r));
120
+ }
121
+ }
122
+
123
+ // ── Scale ─────────────────────────────────────────────────────
124
+ if (dirty & POSE_DIRTY_S_MASK) != 0u {
125
+ let s_base = slot_base + POSE_OFFSET_SCALE;
126
+ var s = scene_read_node_rw(&scene_database, row).local_scale;
127
+ if (dirty & POSE_DIRTY_SX) != 0u {
128
+ s.x = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 0u]));
129
+ atomicStore(&pose_accumulator[s_base + 0u], 0u);
130
+ }
131
+ if (dirty & POSE_DIRTY_SY) != 0u {
132
+ s.y = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 1u]));
133
+ atomicStore(&pose_accumulator[s_base + 1u], 0u);
134
+ }
135
+ if (dirty & POSE_DIRTY_SZ) != 0u {
136
+ s.z = bitcast<f32>(atomicLoad(&pose_accumulator[s_base + 2u]));
137
+ atomicStore(&pose_accumulator[s_base + 2u], 0u);
138
+ }
139
+ scene_write_node_local_scale(&scene_database, row, s);
140
+ }
141
+
142
+ // Clear the dirty mask itself last, so an interrupted resolve
143
+ // (theoretical — these passes don't yield) would still leave the
144
+ // dirty bits intact to be redone.
145
+ atomicStore(&pose_accumulator[dirty_word], 0u);
146
+ }
147
+ `, [
148
+ TRANSFORMS_TABLE.chunk_iterate(WORKGROUP_SIZE, true),
149
+ chunk_scene_database_access_rw,
150
+ chunk_pose_accumulator,
151
+ ]);
152
+
153
+ /**
154
+ * Compute shader that drains the pose accumulator into
155
+ * `transforms_table.local_{translation,rotation,scale}`.
156
+ *
157
+ * Walks the transforms table via the read+write page iterator — one
158
+ * thread per slot. For each occupied row whose accumulator slot has
159
+ * any dirty bits set, reads the contributed components (atomic
160
+ * loads, bitcast back to f32), writes them through the per-field
161
+ * scene helpers, normalises rotation, and zeros the slot for next
162
+ * frame.
163
+ *
164
+ * The accumulator buffer must be sized to at least
165
+ * `transforms.dispatch_page_count * elements_per_page` rows —
166
+ * {@link GPUAnimationManager#ensure_pose_accumulator_capacity}
167
+ * handles that.
168
+ *
169
+ * Dispatch via
170
+ * `shader_animation_pose_resolve.dispatch({ group_count_x: transforms.dispatch_group_count(WORKGROUP_SIZE), ... })`.
171
+ */
172
+ export const shader_animation_pose_resolve = ComputeShader.from({
173
+ label: "Animation/PoseResolve",
174
+ body,
175
+ resources,
176
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_animation_tick.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_tick.js"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,gCAAiC;AAuFjC;;;;;;;;;;;;;;;;GAgBG;AACH,kDAKG;8BA1H2B,4BAA4B"}
1
+ {"version":3,"file":"shader_animation_tick.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/shader_animation_tick.js"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,gCAAiC;AAuFjC;;;;;;;;;;;;;;;;GAgBG;AACH,kDAIG;8BAzH2B,4BAA4B"}