@woosh/meep-engine 3.12.0 → 3.13.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 (285) hide show
  1. package/package.json +1 -1
  2. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  3. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  4. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  5. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  6. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  7. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  8. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  9. package/src/shade/RENDERER_CONTRACT.md +2 -1
  10. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  11. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  12. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  13. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +750 -0
  14. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  15. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  16. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  17. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  18. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  19. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  20. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  21. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  22. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  23. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  24. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  25. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  26. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  27. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  28. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  29. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  30. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  31. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  32. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  33. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
  34. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  35. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
  36. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  37. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
  38. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
  39. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
  40. package/src/shade/renderer/Renderer.d.ts +0 -6
  41. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  42. package/src/shade/renderer/Renderer.js +0 -29
  43. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  44. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  45. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  46. package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
  47. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  48. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  49. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  50. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
  51. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
  53. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  54. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  55. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
  56. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  57. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
  58. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  59. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
  60. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  61. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
  62. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  63. package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
  64. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  65. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  66. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  67. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
  68. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  69. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
  70. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  71. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  72. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  73. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  74. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  75. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  76. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  77. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  78. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  79. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  80. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
  81. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  82. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
  83. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
  85. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  86. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  87. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  88. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  89. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  90. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  91. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  92. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  93. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  94. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  96. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  98. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
  100. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  101. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  102. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  104. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  106. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  108. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
  109. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  110. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  111. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  112. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
  113. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  114. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
  115. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  116. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
  117. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  118. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  119. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  120. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  121. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  122. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  123. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
  124. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  125. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
  126. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  127. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  128. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  129. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  130. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  131. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  132. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  133. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  134. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  135. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  136. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  137. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  138. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
  139. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  140. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  141. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  142. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  143. package/src/shade/renderer/particles/graph_particles.js +5 -3
  144. package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
  145. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  146. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
  147. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  148. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
  149. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
  151. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
  153. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  154. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  155. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  156. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  157. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  158. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  159. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  160. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  161. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  162. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  163. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
  164. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  165. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  166. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  167. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  168. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  169. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  170. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  171. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  172. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  173. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  174. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  175. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
  176. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  177. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  178. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  179. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  180. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  181. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  182. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  183. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
  184. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  185. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
  186. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  187. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  188. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  189. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  190. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  191. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  192. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  193. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  194. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  195. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  196. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  197. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  198. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  199. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  200. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
  201. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  202. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  203. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  204. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  205. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  206. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  207. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  209. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  210. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  211. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  212. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  213. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  214. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  215. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  216. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  217. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  218. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  219. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
  220. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  221. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
  222. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  223. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
  224. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  225. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  226. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  227. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  228. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  229. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  230. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  231. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  232. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  233. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  234. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
  235. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  236. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
  237. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  238. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
  239. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  240. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
  241. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  242. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
  243. package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
  244. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  245. package/src/shade/renderer/shader/ComputeShader.js +14 -17
  246. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  247. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  248. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  249. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  250. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  251. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  252. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +14 -18
  253. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  254. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  255. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  256. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  257. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  258. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  260. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  261. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
  262. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  263. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  264. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  265. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
  266. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  267. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  268. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  269. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  270. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  271. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  272. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  273. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  274. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  275. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
  276. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  277. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  278. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  279. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  280. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  281. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  282. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  283. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  284. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  285. package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "description": "Pure JavaScript game engine. Fully featured and production ready.",
7
7
  "type": "module",
8
8
  "author": "Alexander Goldring",
9
- "version": "3.12.0",
9
+ "version": "3.13.0",
10
10
  "exports": {
11
11
  "./build/*": "./build/*",
12
12
  "./src/*": "./src/*",
@@ -10,7 +10,7 @@ import { TextureFilterType } from "../../../shade/renderer/texture/TextureFilter
10
10
  import { SAMPLER_LINEAR_UPSCALE } from "../../../shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js";
11
11
  import { graph_build_decal_clusters } from "./graph_build_decal_clusters.js";
12
12
  import { DECAL_RECORD_WORD_COUNT } from "./DECAL_GPU_RECORD.js";
13
- import { DECAL_COMPOSITE_SETTINGS, shader_decal_composite } from "./shader_decal_composite.js";
13
+ import { shader_decal_composite } from "./shader_decal_composite.js";
14
14
  import { build_light_cluster_parameters } from "../../../shade/renderer/light/cluster/build_light_cluster_parameters.js";
15
15
  import { DECAL_CLUSTER_RESOLUTION_Z } from "./DECAL_CLUSTER.js";
16
16
 
@@ -190,12 +190,12 @@ export class GPUDecalRenderer {
190
190
  const encoder = context.encoder;
191
191
  const graphics = context.graphics;
192
192
 
193
- const settings = encoder.allocateTransientValueBuffer(DECAL_COMPOSITE_SETTINGS, {
193
+ const settings = {
194
194
  cluster_params,
195
195
  screen_resolution: resolution,
196
196
  distance_min: camera.camera.near,
197
197
  distance_max: camera.camera.far,
198
- });
198
+ };
199
199
 
200
200
  const sampler = graphics.samplers.obtain(SAMPLER_LINEAR_UPSCALE);
201
201
 
@@ -1 +1 @@
1
- {"version":3,"file":"shader_decal_composite.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/shader_decal_composite.js"],"names":[],"mappings":"AA8DA,oDAKG;AAmSH;;;;;;;;;;;;GAYG;AACH,qCAFU,WAAW,CAclB;6BApV0B,qDAAqD;4BAPtD,+CAA+C"}
1
+ {"version":3,"file":"shader_decal_composite.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/shader_decal_composite.js"],"names":[],"mappings":"AA8DA,oDAKG;AAqSH;;;;;;;;;;;;GAYG;AACH,qCAFU,WAAW,CAclB;6BAtV0B,qDAAqD;4BAPtD,+CAA+C"}
@@ -69,9 +69,11 @@ export const DECAL_COMPOSITE_SETTINGS = WebGPUStruct.from({
69
69
 
70
70
  const resources = new ShaderResourceSetDescriptor();
71
71
 
72
+ // per-draw, 32 bytes, read-only: immediate data rather than a uniform buffer. camera stays bound.
73
+ resources.setImmediate("settings", DECAL_COMPOSITE_SETTINGS);
74
+
72
75
  resources.createGroup()
73
- .addUniform("camera", CAMERA_UNIFORM_STRUCT)
74
- .addUniform("settings", DECAL_COMPOSITE_SETTINGS);
76
+ .addUniform("camera", CAMERA_UNIFORM_STRUCT);
75
77
 
76
78
  /*
77
79
  The two integer targets are declared as such, exactly as `shader_deferred_main` declares the same
@@ -1 +1 @@
1
- {"version":3,"file":"GPUHighlightRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/highlight/GPUHighlightRenderer.js"],"names":[],"mappings":"AAkBA;;;;;;GAMG;AACH;IAWI;;;;;;;;;OASG;IACH;QAN8B,KAAK;QACN,KAAK,EAAvB,WAAW;QACE,UAAU,EAAvB,MAAM;QACO,SAAS,EAAtB,MAAM;QACJ,MAAM,CA+BlB;IAmED,gBAOC;;CACJ"}
1
+ {"version":3,"file":"GPUHighlightRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/highlight/GPUHighlightRenderer.js"],"names":[],"mappings":"AAiBA;;;;;;GAMG;AACH;IAWI;;;;;;;;;OASG;IACH;QAN8B,KAAK;QACN,KAAK,EAAvB,WAAW;QACE,UAAU,EAAvB,MAAM;QACO,SAAS,EAAtB,MAAM;QACJ,MAAM,CA+BlB;IAmED,gBAOC;;CACJ"}
@@ -3,7 +3,6 @@ import { round_up } from "../../../core/math/round_up.js";
3
3
  import { SceneColor } from "../../../shade/renderer/extension/SceneColor.js";
4
4
  import { ViewTextures } from "../../../shade/renderer/extension/ViewTextures.js";
5
5
  import {
6
- HIGHLIGHT_OUTLINE_SETTINGS,
7
6
  shader_highlight_outline
8
7
  } from "./shader_highlight_outline.js";
9
8
 
@@ -88,11 +87,11 @@ export class GPUHighlightRenderer {
88
87
 
89
88
  const color = resources.get(data.color);
90
89
 
91
- const settings = encoder.allocateTransientValueBuffer(HIGHLIGHT_OUTLINE_SETTINGS, {
90
+ const settings = {
92
91
  screen_resolution: resolution,
93
92
  table_size,
94
93
  thickness
95
- });
94
+ };
96
95
 
97
96
  shader_highlight_outline.draw({
98
97
  encoder,
@@ -1,150 +1,150 @@
1
- import { BlendState } from "../../../shade/descriptor/blend/BlendState.js";
2
- import { CodeChunk } from "../../../shade/renderer/shader/compiler/CodeChunk.js";
3
- import { ImageShader } from "../../../shade/renderer/shader/ImageShader.js";
4
- import {
5
- ShaderResourceSetDescriptor
6
- } from "../../../shade/renderer/shader/resource/ShaderResourceSetDescriptor.js";
7
- import { ShaderDescriptor } from "../../../shade/renderer/shader/ShaderDescriptor.js";
8
- import { f32, u32, vec2u } from "../../../shade/renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
9
- import { WebGPUArray } from "../../../shade/renderer/shader/type/WebGPUArray.js";
10
- import { WebGPUStruct } from "../../../shade/renderer/shader/type/WebGPUStruct.js";
11
- import { chunk_highlight_lookup } from "./chunk_highlight_lookup.js";
12
-
13
- export const HIGHLIGHT_OUTLINE_SETTINGS = WebGPUStruct.from({
14
- screen_resolution: vec2u,
15
-
16
- /**
17
- * How many rows the lookup table has, which is one past the highest mesh row that was
18
- * highlighted when it was packed.
19
- */
20
- table_size: u32,
21
-
22
- /**
23
- * Outline width in pixels.
24
- */
25
- thickness: f32,
26
- });
27
-
28
- const resources = new ShaderResourceSetDescriptor();
29
-
30
- resources.createGroup()
31
- .addUniform("settings", HIGHLIGHT_OUTLINE_SETTINGS);
32
-
33
- resources.createGroup()
34
- .addTexture("viz_mesh", "uint");
35
-
36
- resources.createGroup()
37
- .addStorageBuffer("highlight_table", WebGPUArray.u32);
38
-
39
- const body = CodeChunk.from(
40
- //language=WGSL
41
- `
42
- @fragment
43
- fn main(
44
- @builtin(position) coord : vec4<f32>,
45
- ) -> @location(0) vec4<f32> {
46
-
47
- let here = vec2<i32>(coord.xy);
48
-
49
- let resolution = vec2<i32>(settings.screen_resolution);
50
-
51
- let table_size = settings.table_size;
52
-
53
- let own = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, here, 0).r, table_size);
54
-
55
- /*
56
- The outline sits **outside** the silhouette. A pixel that is itself the highlighted mesh is left
57
- alone — a highlight marks a unit without painting over it, which is the whole reason the legacy
58
- path dilated its mask outwards before compositing.
59
- */
60
- if (own.a > 0.0) {
61
- discard;
62
- }
63
-
64
- let thickness = settings.thickness;
65
-
66
- let radius = i32(ceil(thickness));
67
-
68
- /*
69
- The strongest highlight within reach, by coverage. Nearest would need a second comparison and
70
- would look the same: two highlights close enough to overlap an outline this thin are the same
71
- size on screen, and the brighter one is the one the eye follows.
72
- */
73
- var found = vec4<f32>(0.0);
74
-
75
- for (var dy = -radius; dy <= radius; dy++) {
76
- for (var dx = -radius; dx <= radius; dx++) {
77
- let offset = vec2<f32>(f32(dx), f32(dy));
78
-
79
- // a disc rather than a square, so the outline is the same width in every direction
80
- if (dot(offset, offset) > thickness * thickness) {
81
- continue;
82
- }
83
-
84
- let at = here + vec2<i32>(dx, dy);
85
-
86
- if (any(at < vec2<i32>(0)) || any(at >= resolution)) {
87
- continue;
88
- }
89
-
90
- let neighbour = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, at, 0).r, table_size);
91
-
92
- if (neighbour.a > found.a) {
93
- found = neighbour;
94
- }
95
- }
96
- }
97
-
98
- if (found.a <= 0.0) {
99
- discard;
100
- }
101
-
102
- // premultiplied, which is how the table stores it and how the blend state consumes it
103
- return found;
104
- }
105
- `, [
106
- chunk_highlight_lookup
107
- ]
108
- );
109
-
110
- /**
111
- * Paints an outline around every highlighted mesh, straight off the visibility buffer.
112
- *
113
- * **There is no second geometry pass, no dilation and no blur.** The renderer this replaces drew
114
- * every highlighted object again into an id target of its own, ping-ponged two render targets to
115
- * dilate the mask, blurred it, and decoded ids back to colours to composite — five render targets, a
116
- * duplicated scene graph and its own skinned material variant. Shade already writes a per-pixel mesh
117
- * id while drawing the frame, so an outline is a neighbourhood test on an integer texture and
118
- * nothing more.
119
- *
120
- * **What that costs is the contract change in D27**: the visibility buffer knows only what was
121
- * rasterized, so a unit standing behind a building is outlined where it can be seen and nowhere
122
- * else. The old mask was drawn with the depth buffer cleared and showed through everything.
123
- *
124
- * @type {ImageShader}
125
- */
126
- export const shader_highlight_outline = ImageShader.from({
127
- descriptor: ShaderDescriptor.from({
128
- label: "Highlight outline",
129
- resources,
130
- body
131
- }),
132
- targets: [
133
- {
134
- label: "outlined",
135
- format: "rgba16float",
136
- blend: BlendState.from({
137
- color: {
138
- operation: "add",
139
- srcFactor: "one",
140
- dstFactor: "one-minus-src-alpha"
141
- },
142
- alpha: {
143
- operation: "add",
144
- srcFactor: "one",
145
- dstFactor: "one-minus-src-alpha"
146
- }
147
- })
148
- }
149
- ]
150
- });
1
+ import { BlendState } from "../../../shade/descriptor/blend/BlendState.js";
2
+ import { CodeChunk } from "../../../shade/renderer/shader/compiler/CodeChunk.js";
3
+ import { ImageShader } from "../../../shade/renderer/shader/ImageShader.js";
4
+ import {
5
+ ShaderResourceSetDescriptor
6
+ } from "../../../shade/renderer/shader/resource/ShaderResourceSetDescriptor.js";
7
+ import { ShaderDescriptor } from "../../../shade/renderer/shader/ShaderDescriptor.js";
8
+ import { f32, u32, vec2u } from "../../../shade/renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
9
+ import { WebGPUArray } from "../../../shade/renderer/shader/type/WebGPUArray.js";
10
+ import { WebGPUStruct } from "../../../shade/renderer/shader/type/WebGPUStruct.js";
11
+ import { chunk_highlight_lookup } from "./chunk_highlight_lookup.js";
12
+
13
+ export const HIGHLIGHT_OUTLINE_SETTINGS = WebGPUStruct.from({
14
+ screen_resolution: vec2u,
15
+
16
+ /**
17
+ * How many rows the lookup table has, which is one past the highest mesh row that was
18
+ * highlighted when it was packed.
19
+ */
20
+ table_size: u32,
21
+
22
+ /**
23
+ * Outline width in pixels.
24
+ */
25
+ thickness: f32,
26
+ });
27
+
28
+ const resources = new ShaderResourceSetDescriptor();
29
+
30
+ // per-draw, 16 bytes, read-only: immediate data rather than a uniform buffer
31
+ resources.setImmediate("settings", HIGHLIGHT_OUTLINE_SETTINGS);
32
+
33
+ resources.createGroup()
34
+ .addTexture("viz_mesh", "uint");
35
+
36
+ resources.createGroup()
37
+ .addStorageBuffer("highlight_table", WebGPUArray.u32);
38
+
39
+ const body = CodeChunk.from(
40
+ //language=WGSL
41
+ `
42
+ @fragment
43
+ fn main(
44
+ @builtin(position) coord : vec4<f32>,
45
+ ) -> @location(0) vec4<f32> {
46
+
47
+ let here = vec2<i32>(coord.xy);
48
+
49
+ let resolution = vec2<i32>(settings.screen_resolution);
50
+
51
+ let table_size = settings.table_size;
52
+
53
+ let own = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, here, 0).r, table_size);
54
+
55
+ /*
56
+ The outline sits **outside** the silhouette. A pixel that is itself the highlighted mesh is left
57
+ alone — a highlight marks a unit without painting over it, which is the whole reason the legacy
58
+ path dilated its mask outwards before compositing.
59
+ */
60
+ if (own.a > 0.0) {
61
+ discard;
62
+ }
63
+
64
+ let thickness = settings.thickness;
65
+
66
+ let radius = i32(ceil(thickness));
67
+
68
+ /*
69
+ The strongest highlight within reach, by coverage. Nearest would need a second comparison and
70
+ would look the same: two highlights close enough to overlap an outline this thin are the same
71
+ size on screen, and the brighter one is the one the eye follows.
72
+ */
73
+ var found = vec4<f32>(0.0);
74
+
75
+ for (var dy = -radius; dy <= radius; dy++) {
76
+ for (var dx = -radius; dx <= radius; dx++) {
77
+ let offset = vec2<f32>(f32(dx), f32(dy));
78
+
79
+ // a disc rather than a square, so the outline is the same width in every direction
80
+ if (dot(offset, offset) > thickness * thickness) {
81
+ continue;
82
+ }
83
+
84
+ let at = here + vec2<i32>(dx, dy);
85
+
86
+ if (any(at < vec2<i32>(0)) || any(at >= resolution)) {
87
+ continue;
88
+ }
89
+
90
+ let neighbour = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, at, 0).r, table_size);
91
+
92
+ if (neighbour.a > found.a) {
93
+ found = neighbour;
94
+ }
95
+ }
96
+ }
97
+
98
+ if (found.a <= 0.0) {
99
+ discard;
100
+ }
101
+
102
+ // premultiplied, which is how the table stores it and how the blend state consumes it
103
+ return found;
104
+ }
105
+ `, [
106
+ chunk_highlight_lookup
107
+ ]
108
+ );
109
+
110
+ /**
111
+ * Paints an outline around every highlighted mesh, straight off the visibility buffer.
112
+ *
113
+ * **There is no second geometry pass, no dilation and no blur.** The renderer this replaces drew
114
+ * every highlighted object again into an id target of its own, ping-ponged two render targets to
115
+ * dilate the mask, blurred it, and decoded ids back to colours to composite — five render targets, a
116
+ * duplicated scene graph and its own skinned material variant. Shade already writes a per-pixel mesh
117
+ * id while drawing the frame, so an outline is a neighbourhood test on an integer texture and
118
+ * nothing more.
119
+ *
120
+ * **What that costs is the contract change in D27**: the visibility buffer knows only what was
121
+ * rasterized, so a unit standing behind a building is outlined where it can be seen and nowhere
122
+ * else. The old mask was drawn with the depth buffer cleared and showed through everything.
123
+ *
124
+ * @type {ImageShader}
125
+ */
126
+ export const shader_highlight_outline = ImageShader.from({
127
+ descriptor: ShaderDescriptor.from({
128
+ label: "Highlight outline",
129
+ resources,
130
+ body
131
+ }),
132
+ targets: [
133
+ {
134
+ label: "outlined",
135
+ format: "rgba16float",
136
+ blend: BlendState.from({
137
+ color: {
138
+ operation: "add",
139
+ srcFactor: "one",
140
+ dstFactor: "one-minus-src-alpha"
141
+ },
142
+ alpha: {
143
+ operation: "add",
144
+ srcFactor: "one",
145
+ dstFactor: "one-minus-src-alpha"
146
+ }
147
+ })
148
+ }
149
+ ]
150
+ });
@@ -64,11 +64,11 @@ export class FluidObstacleSystem extends System<any> {
64
64
  /**
65
65
  * @param {FluidComponent} fluid
66
66
  */
67
- static "__#356@#refresh_masks"(fluid: FluidComponent): void;
67
+ static "__#360@#refresh_masks"(fluid: FluidComponent): void;
68
68
  /**
69
69
  * @param {FluidComponent} fluid
70
70
  */
71
- static "__#356@#clear_field"(fluid: FluidComponent): void;
71
+ static "__#360@#clear_field"(fluid: FluidComponent): void;
72
72
  /**
73
73
  * Mark every cell of `fluid` whose centre lies within `inflation` of the
74
74
  * posed shape as solid. Iteration is clipped to the shape's world AABB
@@ -80,7 +80,7 @@ export class FluidObstacleSystem extends System<any> {
80
80
  * @param {number} inflation world-units SDF threshold
81
81
  * @param {Float64Array} point length-3 scratch
82
82
  */
83
- static "__#356@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
83
+ static "__#360@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
84
84
  /**
85
85
  * Write the obstacle's translation velocity onto every face of every cell
86
86
  * it voxelized — the moving-wall boundary condition. Runs AFTER the mask
@@ -100,7 +100,7 @@ export class FluidObstacleSystem extends System<any> {
100
100
  * @param {number} wvy
101
101
  * @param {number} wvz
102
102
  */
103
- static "__#356@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
103
+ static "__#360@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
104
104
  constructor();
105
105
  dependencies: (typeof FluidObstacle)[];
106
106
  components_used: (ResourceAccessSpecification<typeof Transform> | ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof FluidComponent> | ResourceAccessSpecification<typeof FluidObstacle>)[];
@@ -541,7 +541,8 @@ frame or is removed and re-added keeps its buffers.
541
541
  | `internal_resolution_scale` | render internally below output resolution; `DynamicResolutionScaling` drives it from frame time |
542
542
  | `pixel_ratio`, `output_resolution`, `aspect_ratio`, `resize(x, y)` | |
543
543
  | `motion_blur`, `dof`, `dof_unreal`, `nss`, `restir_di`, `path_tracer` | sub-objects with their own settings |
544
- | `frame_count`, `add_debug_frame(n)` | |
544
+ | `frame_count` | |
545
+ | `profile_session` | assign a `GPUProfileSession` to record GPU timings; null when nothing is profiling |
545
546
 
546
547
  ---
547
548
 
@@ -19,6 +19,23 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
19
19
  */
20
20
  static fromJSON(json: GPUComputePipelineDescriptor): ComputePipelineDescriptor;
21
21
  compute: ProgrammableStage;
22
+ /**
23
+ * `[x, y, z]` of this pipeline's `@workgroup_size`.
24
+ *
25
+ * Read once, when the code is set, and kept — the source cannot change under a descriptor
26
+ * without going back through one of the factories, each of which reads it again. So every
27
+ * consumer downstream, a profile capture included, gets the number for free.
28
+ *
29
+ * Frozen, because it is handed out by reference to per-pass profile records and a descriptor
30
+ * that outlives a whole capture must not be mutable through one of them.
31
+ *
32
+ * Takes no part in {@link equals} or {@link hash}: it is derived from `compute.module`, which
33
+ * both already cover, and a cache key computed two ways is a cache that can disagree with
34
+ * itself.
35
+ *
36
+ * @returns {readonly number[]}
37
+ */
38
+ get workgroup_size(): readonly number[];
22
39
  /**
23
40
  *
24
41
  * @param {GPUComputePipelineDescriptor} json
@@ -35,6 +52,7 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
35
52
  * @type {boolean}
36
53
  */
37
54
  readonly isComputePipelineDescriptor: boolean;
55
+ #private;
38
56
  }
39
57
  import { PipelineDescriptorBase } from "../PipelineDescriptorBase.js";
40
58
  import { ProgrammableStage } from "../ProgrammableStage.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ComputePipelineDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js"],"names":[],"mappings":"AAQA;IAGI;;;;;OAKG;IACH,mBAJW,MAAM,QACN,MAAM,UACN,wBAAwB,6BAalC;IAED;;;;;OAKG;IACH,wEALW,MAAM,6BAyBhB;IAED;;;OAGG;IACH,+EAMC;IA3DD,2BAAkC;IA6DlC;;;OAGG;IACH,mDAMC;IAED;;;;OAIG;IACH,cAHW,yBAAyB,GACxB,OAAO,CAMlB;IAUL;;;OAGG;IACH,sCAFU,OAAO,CAE8C;CAN9D;uCAhGsC,8BAA8B;kCAEnC,yBAAyB;yCADlB,gCAAgC"}
1
+ {"version":3,"file":"ComputePipelineDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js"],"names":[],"mappings":"AAqBA;IAuDI;;;;;OAKG;IACH,mBAJW,MAAM,QACN,MAAM,UACN,wBAAwB,6BAelC;IAED;;;;;OAKG;IACH,wEALW,MAAM,6BA2BhB;IAED;;;OAGG;IACH,+EAMC;IAnHD,2BAAkC;IAOlC;;;;;;;;;;;;;;;OAeG;IACH,wCAEC;IA4FD;;;OAGG;IACH,mDAUC;IAED;;;;OAIG;IACH,cAHW,yBAAyB,GACxB,OAAO,CAMlB;IAUL;;;OAGG;IACH,sCAFU,OAAO,CAE8C;;CAN9D;uCAtKsC,8BAA8B;kCAEnC,yBAAyB;yCADlB,gCAAgC"}
@@ -1,14 +1,79 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
2
  import { combine_hash } from "../../../../core/collection/array/combine_hash.js";
3
+ import {
4
+ compute_infer_workgroup_size_from_source
5
+ } from "../../../renderer/shader/util/compute_infer_workgroup_size_from_source.js";
3
6
  import { GPUShaderStage } from "../../GPUShaderStage.js";
4
7
  import { PipelineDescriptorBase } from "../PipelineDescriptorBase.js";
5
8
  import { PipelineLayoutDescriptor } from "../PipelineLayoutDescriptor.js";
6
9
  import { ProgrammableStage } from "../ProgrammableStage.js";
7
10
  import { ShaderModuleDescriptor } from "../ShaderModuleDescriptor.js";
8
11
 
12
+ /**
13
+ * What {@link ComputePipelineDescriptor#workgroup_size} reads before any code has been set.
14
+ *
15
+ * Not a fallback for unreadable source — that throws. This is the value of a descriptor that has
16
+ * been constructed and not yet given a shader, which is a state only `new` produces.
17
+ *
18
+ * @type {readonly number[]}
19
+ */
20
+ const WORKGROUP_SIZE_UNSET = Object.freeze([0, 0, 0]);
21
+
9
22
  export class ComputePipelineDescriptor extends PipelineDescriptorBase {
10
23
  compute = new ProgrammableStage();
11
24
 
25
+ /**
26
+ * @type {readonly number[]}
27
+ */
28
+ #workgroup_size = WORKGROUP_SIZE_UNSET;
29
+
30
+ /**
31
+ * `[x, y, z]` of this pipeline's `@workgroup_size`.
32
+ *
33
+ * Read once, when the code is set, and kept — the source cannot change under a descriptor
34
+ * without going back through one of the factories, each of which reads it again. So every
35
+ * consumer downstream, a profile capture included, gets the number for free.
36
+ *
37
+ * Frozen, because it is handed out by reference to per-pass profile records and a descriptor
38
+ * that outlives a whole capture must not be mutable through one of them.
39
+ *
40
+ * Takes no part in {@link equals} or {@link hash}: it is derived from `compute.module`, which
41
+ * both already cover, and a cache key computed two ways is a cache that can disagree with
42
+ * itself.
43
+ *
44
+ * @returns {readonly number[]}
45
+ */
46
+ get workgroup_size() {
47
+ return this.#workgroup_size;
48
+ }
49
+
50
+ /**
51
+ * Read the workgroup size out of the code just assigned to {@link compute}, and **throw** if it
52
+ * cannot be read.
53
+ *
54
+ * Loud, and at construction. Every consumer of this number divides a thread count by it, so a
55
+ * guess that is wrong silently dispatches the wrong fraction of the workload — and a descriptor
56
+ * that cannot state its own workgroup size is one nobody downstream can use correctly. Better
57
+ * that it cannot be built than that it be built and dealt with.
58
+ *
59
+ * @returns {void}
60
+ */
61
+ #read_workgroup_size() {
62
+ const code = this.compute.module.code;
63
+
64
+ try {
65
+ this.#workgroup_size = Object.freeze(compute_infer_workgroup_size_from_source(code));
66
+ } catch (e) {
67
+ const error = new Error(
68
+ `Compute pipeline '${this.label}' has no readable workgroup size: ${e.message}`
69
+ );
70
+
71
+ error.cause = e;
72
+
73
+ throw error;
74
+ }
75
+ }
76
+
12
77
  /**
13
78
  *
14
79
  * @param {string} label
@@ -24,6 +89,8 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
24
89
  r.label = label;
25
90
  r.compute.module = ShaderModuleDescriptor.fromCode(code);
26
91
 
92
+ r.#read_workgroup_size();
93
+
27
94
  return r;
28
95
 
29
96
  }
@@ -53,6 +120,8 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
53
120
  r.compute.constants = constants;
54
121
  }
55
122
 
123
+ r.#read_workgroup_size();
124
+
56
125
  return r;
57
126
  }
58
127
 
@@ -78,6 +147,10 @@ export class ComputePipelineDescriptor extends PipelineDescriptorBase {
78
147
  assert.isObject(json.compute, 'json.compute');
79
148
 
80
149
  this.compute.fromJSON(json.compute);
150
+
151
+ // `fromJSON` replaces the module in place, so the size read for whatever was here before is
152
+ // now the wrong shader's. Read it again rather than leaving a stale divisor behind.
153
+ this.#read_workgroup_size();
81
154
  }
82
155
 
83
156
  /**