@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
@@ -1,142 +1,145 @@
1
- import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
- import { BVH_NULL_NODE_DEFINITION } from "../../shader/chunk/bvh/BVH_NULL_NODE_DEFINITION.js";
4
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
- import { ComputeShader } from "../../shader/ComputeShader.js";
6
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
- import {
8
- BVH_NODE_BOUNDS_WORD,
9
- BVH_NODE_CHILD_1_WORD,
10
- BVH_NODE_CHILD_2_WORD,
11
- BVH_NODE_STRIDE_WORDS
12
- } from "./BVH_BUFFER_LAYOUT.js";
13
- import { BVH_BUILD_SETTINGS_STRUCT, BVH_NO_ROOT_WORD } from "./BVH_BUILD_SETTINGS_STRUCT.js";
14
- import { chunk_bvh_determine_range } from "./chunk_bvh_determine_range.js";
15
- import { chunk_bvh_find_split } from "./chunk_bvh_find_split.js";
16
-
17
- export const BVH_EMIT_WORKGROUP_SIZE = 64;
18
-
19
- const resources = new ShaderResourceSetDescriptor();
20
- resources.createGroup()
21
- .addUniform("settings", BVH_BUILD_SETTINGS_STRUCT)
22
- // sorted Morton codes, and the leaf index each one came from
23
- .addStorageBuffer("keys", WebGPUArray.from(u32), false)
24
- .addStorageBuffer("values", WebGPUArray.from(u32), false)
25
- .addStorageBuffer("leaf_bounds", WebGPUArray.from(f32), false)
26
- .addStorageBuffer("leaf_payload", WebGPUArray.from(u32), false)
27
- // `{root: u32, nodes: array<BVH2_NODE_STRUCT>}`, written flat
28
- .addStorageBuffer("nodes", WebGPUArray.from(u32), true)
29
- // parent of every node, indexed the same way the node buffer is
30
- .addStorageBuffer("parents", WebGPUArray.from(u32), true)
31
- // which node each leaf ordinal lives at — see the shader's note on why this is written out
32
- .addStorageBuffer("leaf_nodes", WebGPUArray.from(u32), true);
33
-
34
- const body = CodeChunk.from(
35
- //language=WGSL
36
- `
37
- const NODE_STRIDE = ${BVH_NODE_STRIDE_WORDS}u;
38
- const NODE_BOUNDS = ${BVH_NODE_BOUNDS_WORD}u;
39
- const NODE_CHILD_1 = ${BVH_NODE_CHILD_1_WORD}u;
40
- const NODE_CHILD_2 = ${BVH_NODE_CHILD_2_WORD}u;
41
- const NO_ROOT_WORD = ${BVH_NO_ROOT_WORD}u;
42
-
43
- fn bvh_node_word(node: u32) -> u32 {
44
- return settings.node_word_offset + node * NODE_STRIDE;
45
- }
46
-
47
- @compute @workgroup_size(${BVH_EMIT_WORKGROUP_SIZE}, 1, 1)
48
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
49
- let i = gid.x;
50
- let n = settings.element_count;
51
-
52
- if (i >= n) {
53
- return;
54
- }
55
-
56
- // Leaf j lives at node (n-1)+j, internal node k at node k. Root is internal node 0 by Karras's
57
- // construction — it is the node whose range is the whole array.
58
- let leaf_source = values[i];
59
- let leaf_node = (n - 1u) + i;
60
-
61
- let bounds_source = leaf_source * 6u;
62
- let leaf_word = bvh_node_word(leaf_node);
63
-
64
- for (var k = 0u; k < 6u; k += 1u) {
65
- nodes[leaf_word + NODE_BOUNDS + k] = bitcast<u32>(leaf_bounds[bounds_source + k]);
66
- }
67
-
68
- nodes[leaf_word + NODE_CHILD_1] = BVH_NULL_NODE;
69
- nodes[leaf_word + NODE_CHILD_2] = leaf_payload[leaf_source];
70
-
71
- // Where the leaves are is an output of construction, not a convention two kernels have to
72
- // share. For this layout it is (n-1)+i and the refit could work it out — but a tree that was
73
- // copied rather than built has its leaves wherever its builder put them, and the refit reads
74
- // this the same way for both.
75
- leaf_nodes[i] = leaf_node;
76
-
77
- // n leaves, n-1 internal nodes — the tail thread has only a leaf to write.
78
- if (i < n - 1u) {
79
- let range = bvh_determine_range(&keys, n, i);
80
-
81
- let first = range.x;
82
- let last = range.y;
83
-
84
- let split = bvh_find_split(&keys, n, first, last);
85
-
86
- // A subrange of one element is a leaf; otherwise it is owned by the internal node whose
87
- // left boundary sits at that code index.
88
- let child_1 = select(split, (n - 1u) + split, split == first);
89
- let child_2 = select(split + 1u, (n - 1u) + split + 1u, split + 1u == last);
90
-
91
- let node_word = bvh_node_word(i);
92
-
93
- nodes[node_word + NODE_CHILD_1] = child_1;
94
- nodes[node_word + NODE_CHILD_2] = child_2;
95
-
96
- // The refit climbs these; internal-node bounds are its business, not this pass's.
97
- parents[child_1] = i;
98
- parents[child_2] = i;
99
- }
100
-
101
- if (i == 0u) {
102
- // Constant by construction, but a tree whose format has a root word has consumers that read
103
- // it. A BLAS has none — its root is node 0 by convention — and says so with NO_ROOT_WORD.
104
- if (settings.root_word_offset != NO_ROOT_WORD) {
105
- nodes[settings.root_word_offset] = 0u;
106
- }
107
-
108
- // Where the refit's climb stops.
109
- parents[0] = BVH_NULL_NODE;
110
- }
111
- }
112
- `, [
113
- BVH_NULL_NODE_DEFINITION,
114
- chunk_bvh_determine_range,
115
- chunk_bvh_find_split,
116
- ]);
117
-
118
- /**
119
- * Karras hierarchy emission — pass 3 of {@link graph_bvh_build_lbvh}, and a transliteration of
120
- * {@link ebvh_build_hierarchy_radix} with the DXR Fallback's index layout: internal node `k` at node
121
- * `k` (root = 0), leaf `j` at node `(n-1)+j`, `2n-1` nodes in total.
122
- *
123
- * Node indices are local to the tree; where node 0 actually lands is `settings.node_word_offset`,
124
- * so the same kernel writes a TLAS that owns its buffer and a BLAS that is a tenant in a shared
125
- * arena. Root-at-node-0 is what both conventions want, which is why one kernel can serve them.
126
- *
127
- * One dispatch of `n` threads with a tail `if`, which is the canonical LBVH formulation: thread `i`
128
- * always writes leaf `(n-1)+i`, and threads below `n-1` additionally derive internal node `i`'s
129
- * range and split and wire its two children.
130
- *
131
- * Barrier-free, atomic-free, subgroup-free, and a pure function of the sorted keys — deliberately,
132
- * because that is what lets the WGSL emulator execute this kernel point-wise in vitest against the
133
- * in-repo CPU oracle, duplicate-code runs and all. Internal-node bounds are left to
134
- * {@link shader_bvh_refit}.
135
- *
136
- * @type {ComputeShader}
137
- */
138
- export const shader_bvh_emit_hierarchy = ComputeShader.from({
139
- label: "BVHBuild/EmitHierarchy",
140
- resources,
141
- body,
142
- });
1
+ import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { BVH_NULL_NODE_DEFINITION } from "../../shader/chunk/bvh/BVH_NULL_NODE_DEFINITION.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { ComputeShader } from "../../shader/ComputeShader.js";
6
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import {
8
+ BVH_NODE_BOUNDS_WORD,
9
+ BVH_NODE_CHILD_1_WORD,
10
+ BVH_NODE_CHILD_2_WORD,
11
+ BVH_NODE_STRIDE_WORDS
12
+ } from "./BVH_BUFFER_LAYOUT.js";
13
+ import { BVH_BUILD_SETTINGS_STRUCT, BVH_NO_ROOT_WORD } from "./BVH_BUILD_SETTINGS_STRUCT.js";
14
+ import { chunk_bvh_determine_range } from "./chunk_bvh_determine_range.js";
15
+ import { chunk_bvh_find_split } from "./chunk_bvh_find_split.js";
16
+
17
+ export const BVH_EMIT_WORKGROUP_SIZE = 64;
18
+
19
+ const resources = new ShaderResourceSetDescriptor();
20
+
21
+ // see shader_bvh_morton — the same build settings, carried as immediate data
22
+ resources.setImmediate("settings", BVH_BUILD_SETTINGS_STRUCT);
23
+
24
+ resources.createGroup()
25
+ // sorted Morton codes, and the leaf index each one came from
26
+ .addStorageBuffer("keys", WebGPUArray.from(u32), false)
27
+ .addStorageBuffer("values", WebGPUArray.from(u32), false)
28
+ .addStorageBuffer("leaf_bounds", WebGPUArray.from(f32), false)
29
+ .addStorageBuffer("leaf_payload", WebGPUArray.from(u32), false)
30
+ // `{root: u32, nodes: array<BVH2_NODE_STRUCT>}`, written flat
31
+ .addStorageBuffer("nodes", WebGPUArray.from(u32), true)
32
+ // parent of every node, indexed the same way the node buffer is
33
+ .addStorageBuffer("parents", WebGPUArray.from(u32), true)
34
+ // which node each leaf ordinal lives at — see the shader's note on why this is written out
35
+ .addStorageBuffer("leaf_nodes", WebGPUArray.from(u32), true);
36
+
37
+ const body = CodeChunk.from(
38
+ //language=WGSL
39
+ `
40
+ const NODE_STRIDE = ${BVH_NODE_STRIDE_WORDS}u;
41
+ const NODE_BOUNDS = ${BVH_NODE_BOUNDS_WORD}u;
42
+ const NODE_CHILD_1 = ${BVH_NODE_CHILD_1_WORD}u;
43
+ const NODE_CHILD_2 = ${BVH_NODE_CHILD_2_WORD}u;
44
+ const NO_ROOT_WORD = ${BVH_NO_ROOT_WORD}u;
45
+
46
+ fn bvh_node_word(node: u32) -> u32 {
47
+ return settings.node_word_offset + node * NODE_STRIDE;
48
+ }
49
+
50
+ @compute @workgroup_size(${BVH_EMIT_WORKGROUP_SIZE}, 1, 1)
51
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
52
+ let i = gid.x;
53
+ let n = settings.element_count;
54
+
55
+ if (i >= n) {
56
+ return;
57
+ }
58
+
59
+ // Leaf j lives at node (n-1)+j, internal node k at node k. Root is internal node 0 by Karras's
60
+ // construction — it is the node whose range is the whole array.
61
+ let leaf_source = values[i];
62
+ let leaf_node = (n - 1u) + i;
63
+
64
+ let bounds_source = leaf_source * 6u;
65
+ let leaf_word = bvh_node_word(leaf_node);
66
+
67
+ for (var k = 0u; k < 6u; k += 1u) {
68
+ nodes[leaf_word + NODE_BOUNDS + k] = bitcast<u32>(leaf_bounds[bounds_source + k]);
69
+ }
70
+
71
+ nodes[leaf_word + NODE_CHILD_1] = BVH_NULL_NODE;
72
+ nodes[leaf_word + NODE_CHILD_2] = leaf_payload[leaf_source];
73
+
74
+ // Where the leaves are is an output of construction, not a convention two kernels have to
75
+ // share. For this layout it is (n-1)+i and the refit could work it out — but a tree that was
76
+ // copied rather than built has its leaves wherever its builder put them, and the refit reads
77
+ // this the same way for both.
78
+ leaf_nodes[i] = leaf_node;
79
+
80
+ // n leaves, n-1 internal nodes — the tail thread has only a leaf to write.
81
+ if (i < n - 1u) {
82
+ let range = bvh_determine_range(&keys, n, i);
83
+
84
+ let first = range.x;
85
+ let last = range.y;
86
+
87
+ let split = bvh_find_split(&keys, n, first, last);
88
+
89
+ // A subrange of one element is a leaf; otherwise it is owned by the internal node whose
90
+ // left boundary sits at that code index.
91
+ let child_1 = select(split, (n - 1u) + split, split == first);
92
+ let child_2 = select(split + 1u, (n - 1u) + split + 1u, split + 1u == last);
93
+
94
+ let node_word = bvh_node_word(i);
95
+
96
+ nodes[node_word + NODE_CHILD_1] = child_1;
97
+ nodes[node_word + NODE_CHILD_2] = child_2;
98
+
99
+ // The refit climbs these; internal-node bounds are its business, not this pass's.
100
+ parents[child_1] = i;
101
+ parents[child_2] = i;
102
+ }
103
+
104
+ if (i == 0u) {
105
+ // Constant by construction, but a tree whose format has a root word has consumers that read
106
+ // it. A BLAS has none — its root is node 0 by convention — and says so with NO_ROOT_WORD.
107
+ if (settings.root_word_offset != NO_ROOT_WORD) {
108
+ nodes[settings.root_word_offset] = 0u;
109
+ }
110
+
111
+ // Where the refit's climb stops.
112
+ parents[0] = BVH_NULL_NODE;
113
+ }
114
+ }
115
+ `, [
116
+ BVH_NULL_NODE_DEFINITION,
117
+ chunk_bvh_determine_range,
118
+ chunk_bvh_find_split,
119
+ ]);
120
+
121
+ /**
122
+ * Karras hierarchy emission — pass 3 of {@link graph_bvh_build_lbvh}, and a transliteration of
123
+ * {@link ebvh_build_hierarchy_radix} with the DXR Fallback's index layout: internal node `k` at node
124
+ * `k` (root = 0), leaf `j` at node `(n-1)+j`, `2n-1` nodes in total.
125
+ *
126
+ * Node indices are local to the tree; where node 0 actually lands is `settings.node_word_offset`,
127
+ * so the same kernel writes a TLAS that owns its buffer and a BLAS that is a tenant in a shared
128
+ * arena. Root-at-node-0 is what both conventions want, which is why one kernel can serve them.
129
+ *
130
+ * One dispatch of `n` threads with a tail `if`, which is the canonical LBVH formulation: thread `i`
131
+ * always writes leaf `(n-1)+i`, and threads below `n-1` additionally derive internal node `i`'s
132
+ * range and split and wire its two children.
133
+ *
134
+ * Barrier-free, atomic-free, subgroup-free, and a pure function of the sorted keys — deliberately,
135
+ * because that is what lets the WGSL emulator execute this kernel point-wise in vitest against the
136
+ * in-repo CPU oracle, duplicate-code runs and all. Internal-node bounds are left to
137
+ * {@link shader_bvh_refit}.
138
+ *
139
+ * @type {ComputeShader}
140
+ */
141
+ export const shader_bvh_emit_hierarchy = ComputeShader.from({
142
+ label: "BVHBuild/EmitHierarchy",
143
+ resources,
144
+ body,
145
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_bvh_morton.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js"],"names":[],"mappings":"AAQA,2CAA4C;AAwD5C;;;;;;;;;;;;GAYG;AACH,gCAFU,aAAa,CAMpB;8BA7E2B,+BAA+B"}
1
+ {"version":3,"file":"shader_bvh_morton.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js"],"names":[],"mappings":"AAQA,2CAA4C;AA6D5C;;;;;;;;;;;;GAYG;AACH,gCAFU,aAAa,CAMpB;8BAlF2B,+BAA+B"}
@@ -1,82 +1,87 @@
1
- import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
- import { chunk_v3_morton_encode } from "../../shader/chunk/bvh/morton/chunk_v3_morton_encode.js";
4
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
- import { ComputeShader } from "../../shader/ComputeShader.js";
6
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
- import { BVH_BUILD_SETTINGS_STRUCT } from "./BVH_BUILD_SETTINGS_STRUCT.js";
8
-
9
- export const BVH_MORTON_WORKGROUP_SIZE = 64;
10
-
11
- const resources = new ShaderResourceSetDescriptor();
12
- resources.createGroup()
13
- .addUniform("settings", BVH_BUILD_SETTINGS_STRUCT)
14
- // six floats per leaf: [min.xyz, max.xyz]
15
- .addStorageBuffer("leaf_bounds", WebGPUArray.from(f32), false)
16
- // the same six floats over the whole set, produced by the extraction pass
17
- .addStorageBuffer("scene_bounds", WebGPUArray.from(f32), false)
18
- .addStorageBuffer("keys", WebGPUArray.from(u32), true)
19
- .addStorageBuffer("values", WebGPUArray.from(u32), true);
20
-
21
- const body = CodeChunk.from(
22
- //language=WGSL
23
- `
24
- @compute @workgroup_size(${BVH_MORTON_WORKGROUP_SIZE}, 1, 1)
25
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
26
- let i = gid.x;
27
-
28
- if (i >= settings.element_count) {
29
- return;
30
- }
31
-
32
- let base = i * 6u;
33
-
34
- let low = vec3<f32>(leaf_bounds[base], leaf_bounds[base + 1u], leaf_bounds[base + 2u]);
35
- let high = vec3<f32>(leaf_bounds[base + 3u], leaf_bounds[base + 4u], leaf_bounds[base + 5u]);
36
-
37
- let centroid = (low + high) * 0.5;
38
-
39
- let scene_low = vec3<f32>(scene_bounds[0], scene_bounds[1], scene_bounds[2]);
40
- let scene_high = vec3<f32>(scene_bounds[3], scene_bounds[4], scene_bounds[5]);
41
-
42
- let span = scene_high - scene_low;
43
-
44
- // An axis of zero extent contributes nothing to the code, exactly as it does in
45
- // v3_morton_encode_bounded every centroid quantises to 0 along it rather than to a division
46
- // by zero.
47
- let scale = select(vec3<f32>(0.0), vec3<f32>(1.0) / span, span != vec3<f32>(0.0));
48
-
49
- // The centroid of a leaf box is inside the union of every leaf box by construction, so the
50
- // clamp never binds on well-formed input; it is here so that a rounding error at the extreme,
51
- // or a NaN-free degenerate box, cannot produce an out-of-range quantised coordinate.
52
- let normalized = clamp((centroid - scene_low) * scale, vec3<f32>(0.0), vec3<f32>(1.0));
53
-
54
- let quantised = vec3<u32>(round(normalized * 1023.0));
55
-
56
- keys[i] = v3_morton_encode(quantised.x, quantised.y, quantised.z);
57
-
58
- // the sort carries this along as the payload, so after it the leaves are in Morton order
59
- values[i] = i;
60
- }
61
- `, [
62
- chunk_v3_morton_encode,
63
- ]);
64
-
65
- /**
66
- * Morton code per leaf — pass 1 of {@link graph_bvh_build_lbvh}.
67
- *
68
- * The leaf's centroid is quantised to ten bits per axis inside the scene bounds and interleaved
69
- * into a 30-bit code, matching `v3_morton_encode_bounded` + `v3_morton_encode_normalized` on the
70
- * CPU term for term (`round(1023 * t)`, zero-extent axes scaled by zero). `values[i] = i` seeds the
71
- * permutation the sort then carries.
72
- *
73
- * Pure per-invocation: no barriers, no atomics, no subgroups which is what lets the emulator tier
74
- * run it point-wise against the CPU encoder.
75
- *
76
- * @type {ComputeShader}
77
- */
78
- export const shader_bvh_morton = ComputeShader.from({
79
- label: "BVHBuild/Morton",
80
- resources,
81
- body,
82
- });
1
+ import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { chunk_v3_morton_encode } from "../../shader/chunk/bvh/morton/chunk_v3_morton_encode.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { ComputeShader } from "../../shader/ComputeShader.js";
6
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import { BVH_BUILD_SETTINGS_STRUCT } from "./BVH_BUILD_SETTINGS_STRUCT.js";
8
+
9
+ export const BVH_MORTON_WORKGROUP_SIZE = 64;
10
+
11
+ const resources = new ShaderResourceSetDescriptor();
12
+
13
+ // per-dispatch, 20 bytes, read-only: immediate data rather than a uniform buffer. An LBVH build
14
+ // dispatches this shader, emit_hierarchy and refit in sequence, each of which was allocating and
15
+ // filling its own copy of the same settings.
16
+ resources.setImmediate("settings", BVH_BUILD_SETTINGS_STRUCT);
17
+
18
+ resources.createGroup()
19
+ // six floats per leaf: [min.xyz, max.xyz]
20
+ .addStorageBuffer("leaf_bounds", WebGPUArray.from(f32), false)
21
+ // the same six floats over the whole set, produced by the extraction pass
22
+ .addStorageBuffer("scene_bounds", WebGPUArray.from(f32), false)
23
+ .addStorageBuffer("keys", WebGPUArray.from(u32), true)
24
+ .addStorageBuffer("values", WebGPUArray.from(u32), true);
25
+
26
+ const body = CodeChunk.from(
27
+ //language=WGSL
28
+ `
29
+ @compute @workgroup_size(${BVH_MORTON_WORKGROUP_SIZE}, 1, 1)
30
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
31
+ let i = gid.x;
32
+
33
+ if (i >= settings.element_count) {
34
+ return;
35
+ }
36
+
37
+ let base = i * 6u;
38
+
39
+ let low = vec3<f32>(leaf_bounds[base], leaf_bounds[base + 1u], leaf_bounds[base + 2u]);
40
+ let high = vec3<f32>(leaf_bounds[base + 3u], leaf_bounds[base + 4u], leaf_bounds[base + 5u]);
41
+
42
+ let centroid = (low + high) * 0.5;
43
+
44
+ let scene_low = vec3<f32>(scene_bounds[0], scene_bounds[1], scene_bounds[2]);
45
+ let scene_high = vec3<f32>(scene_bounds[3], scene_bounds[4], scene_bounds[5]);
46
+
47
+ let span = scene_high - scene_low;
48
+
49
+ // An axis of zero extent contributes nothing to the code, exactly as it does in
50
+ // v3_morton_encode_bounded every centroid quantises to 0 along it rather than to a division
51
+ // by zero.
52
+ let scale = select(vec3<f32>(0.0), vec3<f32>(1.0) / span, span != vec3<f32>(0.0));
53
+
54
+ // The centroid of a leaf box is inside the union of every leaf box by construction, so the
55
+ // clamp never binds on well-formed input; it is here so that a rounding error at the extreme,
56
+ // or a NaN-free degenerate box, cannot produce an out-of-range quantised coordinate.
57
+ let normalized = clamp((centroid - scene_low) * scale, vec3<f32>(0.0), vec3<f32>(1.0));
58
+
59
+ let quantised = vec3<u32>(round(normalized * 1023.0));
60
+
61
+ keys[i] = v3_morton_encode(quantised.x, quantised.y, quantised.z);
62
+
63
+ // the sort carries this along as the payload, so after it the leaves are in Morton order
64
+ values[i] = i;
65
+ }
66
+ `, [
67
+ chunk_v3_morton_encode,
68
+ ]);
69
+
70
+ /**
71
+ * Morton code per leaf — pass 1 of {@link graph_bvh_build_lbvh}.
72
+ *
73
+ * The leaf's centroid is quantised to ten bits per axis inside the scene bounds and interleaved
74
+ * into a 30-bit code, matching `v3_morton_encode_bounded` + `v3_morton_encode_normalized` on the
75
+ * CPU term for term (`round(1023 * t)`, zero-extent axes scaled by zero). `values[i] = i` seeds the
76
+ * permutation the sort then carries.
77
+ *
78
+ * Pure per-invocation: no barriers, no atomics, no subgroups — which is what lets the emulator tier
79
+ * run it point-wise against the CPU encoder.
80
+ *
81
+ * @type {ComputeShader}
82
+ */
83
+ export const shader_bvh_morton = ComputeShader.from({
84
+ label: "BVHBuild/Morton",
85
+ resources,
86
+ body,
87
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_bvh_refit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js"],"names":[],"mappings":"AAcA,0CAA2C;AAqG3C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,+BAFU,aAAa,CAMpB;8BAvI2B,+BAA+B"}
1
+ {"version":3,"file":"shader_bvh_refit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js"],"names":[],"mappings":"AAcA,0CAA2C;AAwG3C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,+BAFU,aAAa,CAMpB;8BA1I2B,+BAA+B"}