@woosh/meep-engine 3.11.2 → 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 (551) hide show
  1. package/README.md +14 -18
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/SelectionVisualizer.js +127 -127
  4. package/editor/entity_world_bounds.js +27 -27
  5. package/editor/particles/rebuildParticleEmitter.js +31 -31
  6. package/editor/process/SymbolicDisplayProcess.js +1 -1
  7. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  8. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  9. package/editor/prototypeEditorShell.js +156 -156
  10. package/editor/selection/editor_pick.js +130 -130
  11. package/editor/selection/screen_rect_frustum.js +119 -119
  12. package/editor/tools/v2/TransformControls.js +971 -971
  13. package/package.json +1 -1
  14. package/src/engine/Engine.d.ts +3 -3
  15. package/src/engine/Engine.d.ts.map +1 -1
  16. package/src/engine/Engine.js +726 -726
  17. package/src/engine/EngineHarness.d.ts +1 -1
  18. package/src/engine/EngineHarness.js +590 -590
  19. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  21. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  23. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  24. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  25. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  26. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  27. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  29. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  30. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  31. package/src/engine/graphics/ecs/water/Water.js +104 -104
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  33. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  36. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  38. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  39. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  40. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  41. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  42. package/src/engine/graphics3/AnimationSystem.js +352 -0
  43. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  44. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  45. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  46. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  47. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  48. package/src/engine/graphics3/CameraSystem.js +170 -0
  49. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  50. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  51. package/src/engine/graphics3/CameraSystem3.js +6 -166
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  53. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  54. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  56. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  57. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  58. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  59. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  60. package/src/engine/graphics3/DecalSystem.js +441 -0
  61. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  62. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  63. package/src/engine/graphics3/DecalSystem3.js +6 -437
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  65. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  66. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  68. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  69. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  70. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  71. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  72. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  74. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  75. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  76. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  77. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  78. package/src/engine/graphics3/HighlightSystem.js +241 -0
  79. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  80. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  81. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  82. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  83. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  84. package/src/engine/graphics3/LightSystem.js +211 -0
  85. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  86. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  87. package/src/engine/graphics3/LightSystem3.js +6 -207
  88. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  89. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  90. package/src/engine/graphics3/MeshSystem.js +647 -0
  91. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  92. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  93. package/src/engine/graphics3/MeshSystem3.js +6 -642
  94. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  95. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  101. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  106. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  107. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  109. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  110. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  112. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  113. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  114. package/src/engine/graphics3/Pickable.d.ts +1 -1
  115. package/src/engine/graphics3/Pickable.js +65 -65
  116. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  117. package/src/engine/graphics3/PickingQuery.js +48 -48
  118. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  119. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  120. package/src/engine/graphics3/PickingSystem.js +273 -0
  121. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  122. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  123. package/src/engine/graphics3/PickingSystem3.js +6 -269
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  128. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  129. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  130. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  131. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  132. package/src/engine/graphics3/TerrainSystem.js +566 -0
  133. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  134. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  135. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  138. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  140. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  141. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  142. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  143. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  144. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  146. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  147. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  148. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  149. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  155. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  156. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  157. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  158. package/src/engine/graphics3/WaterSystem.js +293 -0
  159. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  160. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  161. package/src/engine/graphics3/WaterSystem3.js +6 -289
  162. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  163. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  164. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  165. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  166. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  167. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  169. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  172. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  175. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  176. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  177. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  178. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  180. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  182. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  183. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  184. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  185. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  186. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  187. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  188. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
  189. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
  190. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
  191. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
  192. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  193. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
  194. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
  195. package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
  196. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  197. package/src/shade/device/ShadeGPUCommandContext.js +994 -940
  198. package/src/shade/device/immediate_data_supported.d.ts +33 -0
  199. package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
  200. package/src/shade/device/immediate_data_supported.js +53 -0
  201. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
  202. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  203. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
  204. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
  205. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  206. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
  207. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  208. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
  209. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
  210. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
  211. package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
  212. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
  213. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  214. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
  215. package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
  216. package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
  217. package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
  218. package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
  219. package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
  220. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  221. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  222. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  223. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  224. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  225. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  226. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  227. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  228. package/src/shade/renderer/GraphicsContext.d.ts +9 -2
  229. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  230. package/src/shade/renderer/GraphicsContext.js +13 -1
  231. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  232. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  233. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  234. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  235. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  236. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  237. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  238. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  239. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  240. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  241. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  242. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  243. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  244. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  245. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  246. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  247. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  248. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  249. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  250. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  251. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  252. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  253. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  254. package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
  255. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
  256. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
  257. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
  258. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
  259. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
  260. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
  261. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
  262. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  263. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
  264. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
  265. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
  266. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
  267. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
  268. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  269. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
  270. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
  271. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  272. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
  273. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
  274. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  275. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
  276. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
  277. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
  278. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
  279. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
  280. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
  281. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
  282. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
  283. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
  284. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
  285. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
  286. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  287. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -84
  288. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  289. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
  290. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  291. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
  292. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  293. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  294. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  295. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  296. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  297. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  298. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  299. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  300. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  301. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  302. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  303. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  304. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  305. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  306. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  307. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  308. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  309. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  310. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  311. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  312. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  313. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  314. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  315. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  316. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  317. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  318. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  319. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  320. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  321. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  322. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  323. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  324. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  325. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  326. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  327. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  328. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  329. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  330. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  331. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  332. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  333. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +10 -9
  334. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  335. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  336. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  337. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  338. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  339. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  340. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  341. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  342. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  343. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  344. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  345. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  346. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  347. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  348. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  349. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  350. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  351. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  352. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  353. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  354. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  355. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  356. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  357. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  358. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  359. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  360. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  361. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  362. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  363. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  364. package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
  365. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  366. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  367. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  368. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  369. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  370. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  371. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  372. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  373. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  374. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  375. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  376. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  377. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  378. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
  380. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  382. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  384. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  385. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  386. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +57 -57
  387. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  388. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  389. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  390. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  391. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  392. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  393. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  394. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  395. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  396. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  397. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  398. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  399. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  400. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  401. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  402. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  403. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  404. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  405. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  406. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  407. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  408. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  409. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  410. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  411. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  412. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
  413. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  414. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  415. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  416. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  417. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  418. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  419. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  420. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
  421. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  422. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  423. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  424. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  425. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  426. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  427. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  428. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  429. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
  430. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  431. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  432. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  433. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  434. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  435. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  436. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  437. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  438. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  439. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  440. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  441. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  442. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  443. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  444. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  445. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  446. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  447. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  448. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  449. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  450. package/src/shade/renderer/shader/ComputeShader.js +350 -292
  451. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  452. package/src/shade/renderer/shader/ImageShader.js +217 -214
  453. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  454. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  455. package/src/shade/renderer/shader/ShaderDescriptor.js +46 -0
  456. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
  457. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
  458. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
  459. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
  460. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
  461. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
  462. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
  463. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
  464. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
  465. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
  466. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
  467. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
  468. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
  469. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
  470. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
  471. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
  472. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
  473. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
  474. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
  475. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
  476. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
  477. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
  478. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
  479. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
  480. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  481. package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
  482. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
  483. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
  484. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
  485. package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
  486. package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
  487. package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
  488. package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
  489. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
  490. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
  491. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
  492. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  493. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
  494. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
  495. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
  496. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
  497. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
  498. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  499. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
  500. package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
  501. package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
  502. package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
  503. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  504. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  505. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  506. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  507. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  508. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  509. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  510. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  511. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  512. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
  513. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
  514. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  515. package/src/shade/renderer/volumetrics/NOTES.md +238 -0
  516. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
  517. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
  518. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
  519. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
  520. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  521. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +591 -577
  522. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +17 -0
  523. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  524. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +20 -2
  525. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  526. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
  527. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
  528. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
  529. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
  530. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
  531. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  532. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  533. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  534. package/src/shade/renderer/water/shader_water.js +246 -246
  535. package/src/shade/vitest.setup.mjs +1 -1
  536. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  537. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
  538. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  539. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
  540. package/src/view/minimap/Minimap.d.ts +2 -2
  541. package/src/view/minimap/Minimap.d.ts.map +1 -1
  542. package/src/view/minimap/Minimap.js +225 -225
  543. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  544. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  545. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  546. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  547. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  548. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
  549. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
  550. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
  551. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
@@ -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"}