@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,113 +1,115 @@
1
- import { u32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
4
- import { ComputeShader } from "../../shader/ComputeShader.js";
5
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
- import { CLIPMAP_METADATA } from "./CLIPMAP_METADATA.js";
7
-
8
- const PUSH_CONSTANTS = WebGPUStruct.from({
9
- cascade_index: u32,
10
- position: vec3f
11
- });
12
-
13
- const resources = new ShaderResourceSetDescriptor();
14
- resources.createGroup()
15
- .addUniform("settings", PUSH_CONSTANTS)
16
- .addStorageBuffer("metadata", CLIPMAP_METADATA, true)
17
- .addStorageTexture("t_cascades", "r32uint", "3d", "write-only")
18
- ;
19
-
20
- /**
21
- * Converts world-aligned voxel coordinate to local wrapped voxel coordinate in the 3d texture representing the cascade
22
- * @type {CodeChunk}
23
- */
24
- const chunk_clip_cascade_world_to_voxel = CodeChunk.from(
25
- //language=WGSL
26
- `
27
- fn cascade_voxel_wrap(
28
- coord_ws: vec3<f32>,
29
- world_offset : vec3<i32>,
30
- voxel_size: f32,
31
- resolution: u32,
32
- ) -> vec3<u32>{
33
- let coord_voxel = world_offset + coord_ws / voxel_size;
34
-
35
- let offset = coord_voxel + f32(resolution) * 0.5;
36
- let offset_i = i32(offset);
37
-
38
- let wrapped_offset = ( ( offset % resolution ) + resolution ) % resolution;
39
-
40
- return vec3<u32>(wrapped_offset);
41
- }
42
- `, []
43
- );
44
-
45
- /**
46
- *
47
- * @type {CodeChunk}
48
- */
49
- const chunk_clip_cascade_voxel_to_world = CodeChunk.from(
50
- //language=WGSL
51
- `
52
- fn clip_cascade_voxel_to_world(
53
- voxel_coord: vec3<u32>,
54
- world_offset: vec3<i32>,
55
- voxel_size: f32,
56
- resolution: u32,
57
- ) -> vec3<f32>{
58
- let x = world_offset + voxel_coord - f32(resolution)*0.5;
59
-
60
- return x * voxel_size;
61
- }
62
- `
63
- );
64
-
65
-
66
- const body = CodeChunk.from(
67
- //language=WGSL
68
- `
69
- @compute @workgroup_size(8,8,4)
70
- fn main(
71
- @builtin(global_invocation_id) global_id : vec3<u32>,
72
- ){
73
- if(any(global_id >= vec3(metadata.cascade_resolution))){
74
- return;
75
- }
76
-
77
- let cascade_info = metadata.cascades[settings.cascade_index];
78
-
79
- // discretize position
80
- let discrete_position = vec3<i32>(settings.position / cascade_info.voxel_size);
81
-
82
- // difference
83
- let position_delta = discrete_position - cascade_info.offset;
84
-
85
- let cascade_voxel_coord = global_id + discrete_position - center;
86
-
87
- let cascade_texture_offset = vec3<u32>( 0, 0, settings.cascade_index * metadata.cascade_resolution );
88
-
89
- // TODO implement
90
- let voxel_cleared = false;
91
- if(voxel_cleared){
92
- textureStore(
93
- t_cascades,
94
- cascade_texture_offset + cascade_voxel_coord,
95
- vec4(0)
96
- );
97
- }
98
-
99
- // set new offset
100
- metadata.cascades[settings.cascade_index].offset = discrete_position;
101
- }
102
- `
103
- )
104
-
105
- /**
106
- * Update cascade offset, and clear out any voxels that scroll out
107
- * @type {ComputeShader}
108
- */
109
- export const shader_update_clipmap_cascade = ComputeShader.from({
110
- label: "Clipmap / update",
111
- resources,
112
- body
1
+ import { u32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
4
+ import { ComputeShader } from "../../shader/ComputeShader.js";
5
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
+ import { CLIPMAP_METADATA } from "./CLIPMAP_METADATA.js";
7
+
8
+ const PUSH_CONSTANTS = WebGPUStruct.from({
9
+ cascade_index: u32,
10
+ position: vec3f
11
+ });
12
+
13
+ const resources = new ShaderResourceSetDescriptor();
14
+
15
+ // per-dispatch, 32 bytes, read-only: immediate data rather than a uniform buffer
16
+ resources.setImmediate("settings", PUSH_CONSTANTS);
17
+ resources.createGroup()
18
+ .addStorageBuffer("metadata", CLIPMAP_METADATA, true)
19
+ .addStorageTexture("t_cascades", "r32uint", "3d", "write-only")
20
+ ;
21
+
22
+ /**
23
+ * Converts world-aligned voxel coordinate to local wrapped voxel coordinate in the 3d texture representing the cascade
24
+ * @type {CodeChunk}
25
+ */
26
+ const chunk_clip_cascade_world_to_voxel = CodeChunk.from(
27
+ //language=WGSL
28
+ `
29
+ fn cascade_voxel_wrap(
30
+ coord_ws: vec3<f32>,
31
+ world_offset : vec3<i32>,
32
+ voxel_size: f32,
33
+ resolution: u32,
34
+ ) -> vec3<u32>{
35
+ let coord_voxel = world_offset + coord_ws / voxel_size;
36
+
37
+ let offset = coord_voxel + f32(resolution) * 0.5;
38
+ let offset_i = i32(offset);
39
+
40
+ let wrapped_offset = ( ( offset % resolution ) + resolution ) % resolution;
41
+
42
+ return vec3<u32>(wrapped_offset);
43
+ }
44
+ `, []
45
+ );
46
+
47
+ /**
48
+ *
49
+ * @type {CodeChunk}
50
+ */
51
+ const chunk_clip_cascade_voxel_to_world = CodeChunk.from(
52
+ //language=WGSL
53
+ `
54
+ fn clip_cascade_voxel_to_world(
55
+ voxel_coord: vec3<u32>,
56
+ world_offset: vec3<i32>,
57
+ voxel_size: f32,
58
+ resolution: u32,
59
+ ) -> vec3<f32>{
60
+ let x = world_offset + voxel_coord - f32(resolution)*0.5;
61
+
62
+ return x * voxel_size;
63
+ }
64
+ `
65
+ );
66
+
67
+
68
+ const body = CodeChunk.from(
69
+ //language=WGSL
70
+ `
71
+ @compute @workgroup_size(8,8,4)
72
+ fn main(
73
+ @builtin(global_invocation_id) global_id : vec3<u32>,
74
+ ){
75
+ if(any(global_id >= vec3(metadata.cascade_resolution))){
76
+ return;
77
+ }
78
+
79
+ let cascade_info = metadata.cascades[settings.cascade_index];
80
+
81
+ // discretize position
82
+ let discrete_position = vec3<i32>(settings.position / cascade_info.voxel_size);
83
+
84
+ // difference
85
+ let position_delta = discrete_position - cascade_info.offset;
86
+
87
+ let cascade_voxel_coord = global_id + discrete_position - center;
88
+
89
+ let cascade_texture_offset = vec3<u32>( 0, 0, settings.cascade_index * metadata.cascade_resolution );
90
+
91
+ // TODO implement
92
+ let voxel_cleared = false;
93
+ if(voxel_cleared){
94
+ textureStore(
95
+ t_cascades,
96
+ cascade_texture_offset + cascade_voxel_coord,
97
+ vec4(0)
98
+ );
99
+ }
100
+
101
+ // set new offset
102
+ metadata.cascades[settings.cascade_index].offset = discrete_position;
103
+ }
104
+ `
105
+ )
106
+
107
+ /**
108
+ * Update cascade offset, and clear out any voxels that scroll out
109
+ * @type {ComputeShader}
110
+ */
111
+ export const shader_update_clipmap_cascade = ComputeShader.from({
112
+ label: "Clipmap / update",
113
+ resources,
114
+ body
113
115
  });
@@ -1 +1 @@
1
- {"version":3,"file":"graph_lpv_store_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js"],"names":[],"mappings":"AAmFA;;;;;;;;GAQG;AACH,kIA+BC"}
1
+ {"version":3,"file":"graph_lpv_store_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js"],"names":[],"mappings":"AAsFA;;;;;;;;GAQG;AACH,kIA+BC"}
@@ -19,8 +19,11 @@ const PUSH_CONSTANTS = WebGPUStruct.from({
19
19
  })
20
20
 
21
21
  const resources = new ShaderResourceSetDescriptor();
22
+
23
+ // per-dispatch, 16 bytes, read-only: immediate data rather than a uniform buffer — the struct was
24
+ // already named PUSH_CONSTANTS
25
+ resources.setImmediate("settings", PUSH_CONSTANTS);
22
26
  resources.createGroup()
23
- .addUniform("settings", PUSH_CONSTANTS)
24
27
  .addStorageBuffer("coefficients", WebGPUArray.f32, false)
25
28
  .addStorageBuffer("lpv_probes", WebGPUArray.from(LIGHT_PROBE_STRUCT), true)
26
29
  ;
@@ -1 +1 @@
1
- {"version":3,"file":"graph_lvp_atlas_to_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js"],"names":[],"mappings":"AAkHA;;;;;;;;;GASG;AACH,0IAFa,MAAM,CA8DlB"}
1
+ {"version":3,"file":"graph_lvp_atlas_to_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js"],"names":[],"mappings":"AAqHA;;;;;;;;;GASG;AACH,0IAFa,MAAM,CA8DlB"}
@@ -1,185 +1,188 @@
1
- import { BufferResourceDescriptor } from "../../../../../device/graph/BufferResourceDescriptor.js";
2
- import { u32 } from "../../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
- import { WebGPUArray } from "../../../../shader/type/WebGPUArray.js";
4
- import { WebGPUStruct } from "../../../../shader/type/WebGPUStruct.js";
5
- import {
6
- chunk_octahedral_solid_angle
7
- } from "../../../../shader/chunk/geometry/octahedron/chunk_octahedral_solid_angle.js";
8
- import {
9
- chunk_uv_octahedral_unit_decode
10
- } from "../../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
11
- import { chunk_grid2d_to_index } from "../../../../shader/chunk/grid/chunk_grid2d_to_index.js";
12
- import { PI_DECLARATION } from "../../../../shader/chunk/math/PI_DECLARATION.js";
13
- import { chunk_sh2_basis_at } from "../../../../shader/chunk/spherical_harmonics/chunk_sh2_basis_at.js";
14
- import { chunk_sh2_multiply_scalar } from "../../../../shader/chunk/spherical_harmonics/chunk_sh2_multiply_scalar.js";
15
- import { chunk_texel_coordinate_to_uv } from "../../../../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
16
- import { CodeChunk } from "../../../../shader/compiler/CodeChunk.js";
17
- import { ComputeShader } from "../../../../shader/ComputeShader.js";
18
- import { ShaderResourceSetDescriptor } from "../../../../shader/resource/ShaderResourceSetDescriptor.js";
19
- import { chunk_lpv_atlas_read_patch_texel } from "../sample/chunk_lpv_atlas_read_patch_texel.js";
20
- import { chunk_compute_coefficient_address } from "./chunk_compute_coefficient_address.js";
21
-
22
- const PUSH_CONSTANTS = WebGPUStruct.from({
23
- probe_index_offset: u32,
24
- probe_update_count: u32,
25
- probe_resolution: u32,
26
- probe_count: u32,
27
- probes_per_row: u32, // in g-buffer space
28
- })
29
-
30
- const resources = new ShaderResourceSetDescriptor();
31
- resources.createGroup()
32
- .addUniform("settings", PUSH_CONSTANTS)
33
-
34
- resources.createGroup()
35
- .addStorageBuffer("coefficients", WebGPUArray.f32, true)
36
- .addTexture("tAtlas_radiance", "uint");
37
-
38
- const body = CodeChunk.from(
39
- //language=WGSL
40
- `
41
- @compute @workgroup_size(16,16,1)
42
- fn main(
43
- @builtin(global_invocation_id) global_id : vec3<u32>,
44
- ){
45
-
46
- let g_buffer_texel = global_id.xy;
47
-
48
- let probe_resolution = settings.probe_resolution;
49
-
50
- let probe_texel = g_buffer_texel % probe_resolution;
51
-
52
- let g_buffer_probe_index = grid2d_to_index(g_buffer_texel / probe_resolution, settings.probes_per_row);
53
-
54
- if(g_buffer_probe_index >= settings.probe_update_count){
55
- // out of bounds
56
- return;
57
- }
58
-
59
- let global_probe_index = (g_buffer_probe_index + settings.probe_index_offset) % settings.probe_count;
60
-
61
- let radiance = lpv_atlas_read_patch_texel(global_probe_index, probe_texel + 1, tAtlas_radiance, probe_resolution + 2);
62
-
63
- let probe_texel_uv = texel_coordinate_to_uv(vec2<f32>(probe_texel), vec2(probe_resolution));
64
-
65
- let direction = uv_octahedral_unit_decode(probe_texel_uv);
66
-
67
- let sh3_basis = sh2_basis_at(direction);
68
-
69
- let local_texel_index = grid2d_to_index(probe_texel, probe_resolution);
70
-
71
- let coefficients_address = compute_coefficient_address(g_buffer_probe_index, probe_texel);
72
-
73
- // adjust by solid angle
74
- let solid_angle = octahedral_solid_angle(probe_texel_uv, 1.0 / f32(probe_resolution));
75
-
76
- let sh_coefficients = sh2_multiply_scalar(sh3_basis, solid_angle);
77
-
78
- // NOTE: we do not convolve with cosine kernel here, this is done during sampling.
79
- // what is stored is radiance projected to SH
80
-
81
- // store coefficients for this texel.
82
- // NOTE: no accumulation here, done in a separate pass.
83
- for(var i=0u; i< 4; i++){
84
- let coefficient = sh_coefficients[i];
85
-
86
- let convolved = radiance * coefficient;
87
-
88
- let offset = coefficients_address + i * 3;
89
-
90
- coefficients[ offset ] = convolved.r;
91
- coefficients[ offset + 1 ] = convolved.g;
92
- coefficients[ offset + 2 ] = convolved.b;
93
- }
94
-
95
- }
96
- `, [
97
- chunk_sh2_basis_at,
98
- chunk_grid2d_to_index,
99
- chunk_uv_octahedral_unit_decode,
100
- chunk_texel_coordinate_to_uv,
101
- chunk_lpv_atlas_read_patch_texel,
102
- chunk_compute_coefficient_address,
103
- chunk_octahedral_solid_angle,
104
- chunk_sh2_multiply_scalar,
105
- PI_DECLARATION,
106
- ]
107
- );
108
-
109
- const shader = ComputeShader.from({
110
- label: "Radiance Atlas / convert to SH",
111
- body,
112
- resources,
113
- });
114
-
115
- /**
116
- * Convolve part of the atlas to Spherical Harmonics
117
- * @param {FrameGraph} graph
118
- * @param {GPUProbeAtlas} atlas
119
- * @param {GPUSceneContext} scene
120
- * @param {number} probe_index_offset
121
- * @param {number} probe_update_count
122
- * @param {number[]} g_buffer_resolution In texels
123
- * @returns {number} buffer resource with SH3-encoded texels
124
- */
125
- export function graph_lvp_atlas_to_sh({
126
- graph,
127
- atlas,
128
- scene,
129
- probe_index_offset,
130
- probe_update_count,
131
- g_buffer_resolution,
132
- }) {
133
-
134
- // first convert rasterized probes to SH
135
- const probe_resolution = atlas.probe_resolution;
136
-
137
- /**
138
- *
139
- * @param data
140
- * @param {FramePassResources} resources
141
- * @param {GraphicsExecutionContext} context
142
- */
143
- function execute(data, resources, context) {
144
- /**
145
- *
146
- * @type {GPUBuffer}
147
- */
148
- const output = resources.get(data.output);
149
-
150
- const settings = context.encoder.allocateTransientValueBuffer(PUSH_CONSTANTS, {
151
- probe_index_offset,
152
- probe_update_count,
153
- probe_resolution: probe_resolution,
154
- probe_count: scene.light_probe_volume.source.probe_count,
155
- probes_per_row: Math.round(g_buffer_resolution[0] / probe_resolution)
156
- });
157
-
158
- shader.dispatchThreads({
159
- encoder: context.encoder,
160
- bindings: {
161
- settings,
162
- coefficients: output,
163
- tAtlas_radiance: atlas.texture_radiance.obtainView(),
164
- },
165
- thread_count_x: g_buffer_resolution[0],
166
- thread_count_y: g_buffer_resolution[1],
167
- });
168
- }
169
-
170
- const pass_data = {};
171
-
172
- const pass = graph.add("Atlas to SH", pass_data, execute);
173
-
174
- const probe_texel_count = probe_resolution * probe_resolution;
175
- const total_updated_texel_count = probe_texel_count * probe_update_count;
176
- const buffer_spec = BufferResourceDescriptor.from(
177
- 12 * total_updated_texel_count * Float32Array.BYTES_PER_ELEMENT,
178
- GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
179
- );
180
- const r_sh_buffer = pass.create("sh", buffer_spec);
181
-
182
- pass_data.output = r_sh_buffer;
183
-
184
- return r_sh_buffer;
1
+ import { BufferResourceDescriptor } from "../../../../../device/graph/BufferResourceDescriptor.js";
2
+ import { u32 } from "../../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
+ import { WebGPUArray } from "../../../../shader/type/WebGPUArray.js";
4
+ import { WebGPUStruct } from "../../../../shader/type/WebGPUStruct.js";
5
+ import {
6
+ chunk_octahedral_solid_angle
7
+ } from "../../../../shader/chunk/geometry/octahedron/chunk_octahedral_solid_angle.js";
8
+ import {
9
+ chunk_uv_octahedral_unit_decode
10
+ } from "../../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
11
+ import { chunk_grid2d_to_index } from "../../../../shader/chunk/grid/chunk_grid2d_to_index.js";
12
+ import { PI_DECLARATION } from "../../../../shader/chunk/math/PI_DECLARATION.js";
13
+ import { chunk_sh2_basis_at } from "../../../../shader/chunk/spherical_harmonics/chunk_sh2_basis_at.js";
14
+ import { chunk_sh2_multiply_scalar } from "../../../../shader/chunk/spherical_harmonics/chunk_sh2_multiply_scalar.js";
15
+ import { chunk_texel_coordinate_to_uv } from "../../../../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
16
+ import { CodeChunk } from "../../../../shader/compiler/CodeChunk.js";
17
+ import { ComputeShader } from "../../../../shader/ComputeShader.js";
18
+ import { ShaderResourceSetDescriptor } from "../../../../shader/resource/ShaderResourceSetDescriptor.js";
19
+ import { chunk_lpv_atlas_read_patch_texel } from "../sample/chunk_lpv_atlas_read_patch_texel.js";
20
+ import { chunk_compute_coefficient_address } from "./chunk_compute_coefficient_address.js";
21
+
22
+ const PUSH_CONSTANTS = WebGPUStruct.from({
23
+ probe_index_offset: u32,
24
+ probe_update_count: u32,
25
+ probe_resolution: u32,
26
+ probe_count: u32,
27
+ probes_per_row: u32, // in g-buffer space
28
+ })
29
+
30
+ const resources = new ShaderResourceSetDescriptor();
31
+
32
+ // per-dispatch, 20 bytes, read-only: immediate data rather than a uniform buffer — the struct was
33
+ // already named PUSH_CONSTANTS
34
+ resources.setImmediate("settings", PUSH_CONSTANTS);
35
+ resources.createGroup()
36
+
37
+ resources.createGroup()
38
+ .addStorageBuffer("coefficients", WebGPUArray.f32, true)
39
+ .addTexture("tAtlas_radiance", "uint");
40
+
41
+ const body = CodeChunk.from(
42
+ //language=WGSL
43
+ `
44
+ @compute @workgroup_size(16,16,1)
45
+ fn main(
46
+ @builtin(global_invocation_id) global_id : vec3<u32>,
47
+ ){
48
+
49
+ let g_buffer_texel = global_id.xy;
50
+
51
+ let probe_resolution = settings.probe_resolution;
52
+
53
+ let probe_texel = g_buffer_texel % probe_resolution;
54
+
55
+ let g_buffer_probe_index = grid2d_to_index(g_buffer_texel / probe_resolution, settings.probes_per_row);
56
+
57
+ if(g_buffer_probe_index >= settings.probe_update_count){
58
+ // out of bounds
59
+ return;
60
+ }
61
+
62
+ let global_probe_index = (g_buffer_probe_index + settings.probe_index_offset) % settings.probe_count;
63
+
64
+ let radiance = lpv_atlas_read_patch_texel(global_probe_index, probe_texel + 1, tAtlas_radiance, probe_resolution + 2);
65
+
66
+ let probe_texel_uv = texel_coordinate_to_uv(vec2<f32>(probe_texel), vec2(probe_resolution));
67
+
68
+ let direction = uv_octahedral_unit_decode(probe_texel_uv);
69
+
70
+ let sh3_basis = sh2_basis_at(direction);
71
+
72
+ let local_texel_index = grid2d_to_index(probe_texel, probe_resolution);
73
+
74
+ let coefficients_address = compute_coefficient_address(g_buffer_probe_index, probe_texel);
75
+
76
+ // adjust by solid angle
77
+ let solid_angle = octahedral_solid_angle(probe_texel_uv, 1.0 / f32(probe_resolution));
78
+
79
+ let sh_coefficients = sh2_multiply_scalar(sh3_basis, solid_angle);
80
+
81
+ // NOTE: we do not convolve with cosine kernel here, this is done during sampling.
82
+ // what is stored is radiance projected to SH
83
+
84
+ // store coefficients for this texel.
85
+ // NOTE: no accumulation here, done in a separate pass.
86
+ for(var i=0u; i< 4; i++){
87
+ let coefficient = sh_coefficients[i];
88
+
89
+ let convolved = radiance * coefficient;
90
+
91
+ let offset = coefficients_address + i * 3;
92
+
93
+ coefficients[ offset ] = convolved.r;
94
+ coefficients[ offset + 1 ] = convolved.g;
95
+ coefficients[ offset + 2 ] = convolved.b;
96
+ }
97
+
98
+ }
99
+ `, [
100
+ chunk_sh2_basis_at,
101
+ chunk_grid2d_to_index,
102
+ chunk_uv_octahedral_unit_decode,
103
+ chunk_texel_coordinate_to_uv,
104
+ chunk_lpv_atlas_read_patch_texel,
105
+ chunk_compute_coefficient_address,
106
+ chunk_octahedral_solid_angle,
107
+ chunk_sh2_multiply_scalar,
108
+ PI_DECLARATION,
109
+ ]
110
+ );
111
+
112
+ const shader = ComputeShader.from({
113
+ label: "Radiance Atlas / convert to SH",
114
+ body,
115
+ resources,
116
+ });
117
+
118
+ /**
119
+ * Convolve part of the atlas to Spherical Harmonics
120
+ * @param {FrameGraph} graph
121
+ * @param {GPUProbeAtlas} atlas
122
+ * @param {GPUSceneContext} scene
123
+ * @param {number} probe_index_offset
124
+ * @param {number} probe_update_count
125
+ * @param {number[]} g_buffer_resolution In texels
126
+ * @returns {number} buffer resource with SH3-encoded texels
127
+ */
128
+ export function graph_lvp_atlas_to_sh({
129
+ graph,
130
+ atlas,
131
+ scene,
132
+ probe_index_offset,
133
+ probe_update_count,
134
+ g_buffer_resolution,
135
+ }) {
136
+
137
+ // first convert rasterized probes to SH
138
+ const probe_resolution = atlas.probe_resolution;
139
+
140
+ /**
141
+ *
142
+ * @param data
143
+ * @param {FramePassResources} resources
144
+ * @param {GraphicsExecutionContext} context
145
+ */
146
+ function execute(data, resources, context) {
147
+ /**
148
+ *
149
+ * @type {GPUBuffer}
150
+ */
151
+ const output = resources.get(data.output);
152
+
153
+ const settings = {
154
+ probe_index_offset,
155
+ probe_update_count,
156
+ probe_resolution: probe_resolution,
157
+ probe_count: scene.light_probe_volume.source.probe_count,
158
+ probes_per_row: Math.round(g_buffer_resolution[0] / probe_resolution)
159
+ };
160
+
161
+ shader.dispatchThreads({
162
+ encoder: context.encoder,
163
+ bindings: {
164
+ settings,
165
+ coefficients: output,
166
+ tAtlas_radiance: atlas.texture_radiance.obtainView(),
167
+ },
168
+ thread_count_x: g_buffer_resolution[0],
169
+ thread_count_y: g_buffer_resolution[1],
170
+ });
171
+ }
172
+
173
+ const pass_data = {};
174
+
175
+ const pass = graph.add("Atlas to SH", pass_data, execute);
176
+
177
+ const probe_texel_count = probe_resolution * probe_resolution;
178
+ const total_updated_texel_count = probe_texel_count * probe_update_count;
179
+ const buffer_spec = BufferResourceDescriptor.from(
180
+ 12 * total_updated_texel_count * Float32Array.BYTES_PER_ELEMENT,
181
+ GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
182
+ );
183
+ const r_sh_buffer = pass.create("sh", buffer_spec);
184
+
185
+ pass_data.output = r_sh_buffer;
186
+
187
+ return r_sh_buffer;
185
188
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graph_reduce_atlas_to_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js"],"names":[],"mappings":"AA6GA;;;;;;;;;GASG;AACH,mKAsDC;AA5ID,sCAaM;0BArCoB,0CAA0C"}
1
+ {"version":3,"file":"graph_reduce_atlas_to_sh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js"],"names":[],"mappings":"AAgHA;;;;;;;;;GASG;AACH,mKAsDC;AA5ID,sCAaM;0BAxCoB,0CAA0C"}
@@ -25,8 +25,11 @@ const PUSH_CONSTANTS = WebGPUStruct.from({
25
25
  })
26
26
 
27
27
  const resources = new ShaderResourceSetDescriptor();
28
+
29
+ // per-dispatch, 24 bytes, read-only: immediate data rather than a uniform buffer. The reduce runs
30
+ // one dispatch per mip level, so the buffer was allocated per level to carry six integers.
31
+ resources.setImmediate("settings", PUSH_CONSTANTS);
28
32
  resources.createGroup()
29
- .addUniform("settings", PUSH_CONSTANTS)
30
33
 
31
34
  resources.createGroup({ label: "source" })
32
35
  .addStorageBuffer("coefficients", WebGPUArray.f32, true)