@woosh/meep-engine 3.12.0 → 3.13.1

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 (301) hide show
  1. package/package.json +1 -1
  2. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  3. package/src/core/geom/3d/shape/ConvexHullShape3D.js +41 -25
  4. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  5. package/src/core/geom/3d/shape/PosedShape3D.js +7 -2
  6. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  7. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  8. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  9. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  10. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  11. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  12. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  13. package/src/shade/RENDERER_CONTRACT.md +2 -1
  14. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  15. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  16. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  17. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +755 -0
  18. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  19. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  20. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  21. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  22. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  23. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  24. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  25. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  26. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  27. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  28. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  29. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  30. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  31. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  32. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  33. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  34. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  35. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  36. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  37. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
  38. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  39. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
  40. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  41. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
  42. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
  43. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
  44. package/src/shade/renderer/Renderer.d.ts +0 -6
  45. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  46. package/src/shade/renderer/Renderer.js +0 -29
  47. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  48. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  49. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  50. package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
  51. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  53. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  54. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
  55. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  56. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
  57. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  58. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  59. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
  60. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  61. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
  62. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  63. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
  64. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  65. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
  66. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  67. package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
  68. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  69. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  70. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  71. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
  72. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  73. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
  74. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  75. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  76. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  77. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  78. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  79. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  80. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  81. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  82. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  83. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
  85. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  86. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
  87. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  88. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
  89. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  90. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  91. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  92. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  93. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  94. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  96. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  98. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  100. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  101. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  102. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
  104. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  106. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  108. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  110. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  111. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  112. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
  113. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  114. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  115. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  116. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
  117. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  118. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
  119. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  120. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
  121. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  122. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  123. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  124. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  125. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  126. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  127. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
  128. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  129. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
  130. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  131. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  132. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  133. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  134. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  135. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  136. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  137. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  138. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  139. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  140. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  141. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  142. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
  143. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  144. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  145. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  146. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  147. package/src/shade/renderer/particles/graph_particles.js +5 -3
  148. package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
  149. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
  151. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
  153. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  154. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
  155. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  156. package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
  157. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  158. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  159. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  160. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  161. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  162. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  163. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  164. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  165. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  166. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  167. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
  168. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  169. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  170. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  171. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  172. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  173. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  174. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  175. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  176. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  177. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  178. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  179. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
  180. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  181. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  182. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  183. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  184. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  185. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  186. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  187. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
  188. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  189. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
  190. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  191. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  192. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  193. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  194. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  195. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  196. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  197. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  198. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  199. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  200. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  201. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  202. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  203. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  204. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
  205. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  206. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  207. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  209. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  210. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  211. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  212. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  213. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  214. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  215. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  216. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  217. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  218. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  219. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  220. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  221. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  222. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  223. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
  224. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  225. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
  226. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  227. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
  228. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  229. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  230. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  231. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  232. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  233. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  234. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  235. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  236. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  237. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  238. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
  239. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  240. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
  241. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  242. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
  243. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  244. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
  245. package/src/shade/renderer/scene/Mesh.d.ts.map +1 -1
  246. package/src/shade/renderer/scene/Mesh.js +4 -6
  247. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  248. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
  249. package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
  250. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  251. package/src/shade/renderer/shader/ComputeShader.js +14 -17
  252. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  253. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  254. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  255. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  256. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  257. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +16 -7
  258. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1342 -1326
  260. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +13 -0
  261. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  262. package/src/shade/renderer/shadow/map/Shadowmap.js +14 -0
  263. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts +79 -0
  264. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts.map +1 -0
  265. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.js +196 -0
  266. package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts +91 -0
  267. package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts.map +1 -0
  268. package/src/shade/renderer/shadow/map/ShadowmapRegistry.js +156 -0
  269. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  270. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  271. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  272. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  273. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  274. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  275. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  276. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  277. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
  278. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  279. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  280. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  281. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
  282. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  283. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  284. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  285. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  286. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  287. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  288. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  289. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  290. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  291. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
  292. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  293. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  294. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  295. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  296. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  297. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  298. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  299. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  300. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  301. 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"}