@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,120 +1,135 @@
1
- import { atomic_u32, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
3
- import { GEOMETRY_METADATA_STRUCT } from "../../../geometry/GEOMETRY_METADATA_STRUCT.js";
4
- import { MESHLET_METADATA_STRUCT } from "../../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
5
- import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
6
- import { ComputeShader } from "../../../shader/ComputeShader.js";
7
- import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
8
- import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
9
-
10
- export const WORKGROUP_SIZE = 64;
11
-
12
- // Struct field offsets resolved at module-load time and baked into the
13
- // shader as constants. The structs use `.pack()` for minimum-size
14
- // layout, so the field positions depend on the packing heuristic —
15
- // reading `.get(field).offset` after the build phase is the only
16
- // reliable way to know where bounds_box / bounding_box actually sit.
17
- const MESHLET_BOUNDS_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('bounds_box').offset / 4;
18
- const MESHLET_STRIDE_WORDS = MESHLET_METADATA_STRUCT.size / 4;
19
-
20
- const GEOMETRY_BBOX_OFFSET_WORDS = GEOMETRY_METADATA_STRUCT.get('bounding_box').offset / 4;
21
- const GEOMETRY_STRIDE_WORDS = GEOMETRY_METADATA_STRUCT.size / 4;
22
-
23
- const resources = new ShaderResourceSetDescriptor();
24
- resources.createGroup()
25
- // Sub-dispatch first-pair offset, in pair units. The host
26
- // paginates if `total_pair_count > maxComputeWorkgroupsPerDimension
27
- // * WORKGROUP_SIZE`; under typical stress-test scale (~71k pairs)
28
- // a single sub-dispatch suffices and `dispatch_offset` is zero.
29
- .addUniform('dispatch_offset', u32)
30
- .addUniform('total_pair_count', u32)
31
- .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
32
- .addStorageBuffer('dispatch_lookup', WebGPUArray.from(u32), false)
33
- // Same buffers the rasterizer reads as typed structs, bound here
34
- // as flat `atomic<u32>` arrays so we can do per-cell atomic
35
- // stores at known field offsets (resolved above at module-load).
36
- .addStorageBuffer('meshlet_metadata_atomic', WebGPUArray.from(atomic_u32), true)
37
- .addStorageBuffer('geometry_metadata_atomic', WebGPUArray.from(atomic_u32), true);
38
-
39
- const body = CodeChunk.from(
40
- //language=WGSL
41
- `
42
- const PLUS_INF: u32 = 0x7F800000u; // bitcast f32(+inf)
43
- const MINUS_INF: u32 = 0xFF800000u; // bitcast f32(-inf)
44
-
45
- const MESHLET_BOUNDS_OFFSET: u32 = ${MESHLET_BOUNDS_OFFSET_WORDS}u;
46
- const MESHLET_STRIDE: u32 = ${MESHLET_STRIDE_WORDS}u;
47
- const GEOMETRY_BBOX_OFFSET: u32 = ${GEOMETRY_BBOX_OFFSET_WORDS}u;
48
- const GEOMETRY_STRIDE: u32 = ${GEOMETRY_STRIDE_WORDS}u;
49
-
50
- @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
51
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
52
- let pair_index = gid.x + dispatch_offset;
53
- if pair_index >= total_pair_count {
54
- return;
55
- }
56
-
57
- let lookup_base = pair_index * 2u;
58
- let binding_index = dispatch_lookup[lookup_base];
59
- let meshlet_local = dispatch_lookup[lookup_base + 1u];
60
-
61
- let binding = skinning_bindings[binding_index];
62
- let clone_meshlet_abs = binding.clone_meshlet_metadata_offset + meshlet_local;
63
-
64
- // Meshlet bounds reset: +inf for the 3 min slots, -inf for the
65
- // 3 max slots. Each meshlet has exactly one (binding, meshlet)
66
- // pair that touches it, so there's no cross-thread race on these
67
- // slots atomicStore is technically overkill, but the buffer is
68
- // bound atomic-typed for the reduce pass and atomicStore is the
69
- // way to write through that view.
70
- let m_base = clone_meshlet_abs * MESHLET_STRIDE + MESHLET_BOUNDS_OFFSET;
71
- atomicStore(&meshlet_metadata_atomic[m_base + 0u], PLUS_INF);
72
- atomicStore(&meshlet_metadata_atomic[m_base + 1u], PLUS_INF);
73
- atomicStore(&meshlet_metadata_atomic[m_base + 2u], PLUS_INF);
74
- atomicStore(&meshlet_metadata_atomic[m_base + 3u], MINUS_INF);
75
- atomicStore(&meshlet_metadata_atomic[m_base + 4u], MINUS_INF);
76
- atomicStore(&meshlet_metadata_atomic[m_base + 5u], MINUS_INF);
77
-
78
- // Geometry bounds reset gate: the first meshlet of each binding
79
- // (meshlet_local == 0) does the reset for the binding's clone
80
- // geometry. Every clone has at least one meshlet, so this fires
81
- // exactly once per active binding. Multiple bindings could in
82
- // principle target the same clone the skinning context allocates
83
- // one clone per SkinnedMesh, so in practice each binding owns its
84
- // own geometry but even if they didn't, the writes here are
85
- // idempotent (same sentinels).
86
- if meshlet_local == 0u {
87
- let g_base = binding.clone_geometry_index * GEOMETRY_STRIDE + GEOMETRY_BBOX_OFFSET;
88
- atomicStore(&geometry_metadata_atomic[g_base + 0u], PLUS_INF);
89
- atomicStore(&geometry_metadata_atomic[g_base + 1u], PLUS_INF);
90
- atomicStore(&geometry_metadata_atomic[g_base + 2u], PLUS_INF);
91
- atomicStore(&geometry_metadata_atomic[g_base + 3u], MINUS_INF);
92
- atomicStore(&geometry_metadata_atomic[g_base + 4u], MINUS_INF);
93
- atomicStore(&geometry_metadata_atomic[g_base + 5u], MINUS_INF);
94
- }
95
- }
96
- `);
97
-
98
- /**
99
- * Compute shader that resets per-meshlet `bounds_box` (clone meshlets
100
- * only) and per-clone-geometry `bounding_box` to ±inf sentinels
101
- * the prerequisite for the reduce / merge passes that follow.
102
- *
103
- * Linear-thread dispatch: one thread per (binding, meshlet) pair in
104
- * the skinning context's `dispatch_lookup`. With workgroup size 64,
105
- * `ceil(total_pair_count / 64)` workgroups cover everything; the
106
- * `dispatch_offset` uniform lets the host paginate when
107
- * `total_pair_count > maxComputeWorkgroupsPerDimension * 64`
108
- * (currently won't trigger — 65535 * 64 ≈ 4M pairs).
109
- *
110
- * The geometry bounds reset is gated to `meshlet_local == 0` so each
111
- * clone geometry is reset exactly once. The clone's bounding_sphere
112
- * is NOT reset here — the derive-sphere pass at the end of the
113
- * refresh chain overwrites it wholesale from the box, so no
114
- * transient state matters.
115
- */
116
- export const shader_meshlet_bounds_scatter = ComputeShader.from({
117
- label: "Skinning/MeshletBoundsScatter",
118
- resources,
119
- body,
120
- });
1
+ import { atomic_u32, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
3
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
4
+ import { GEOMETRY_METADATA_STRUCT } from "../../../geometry/GEOMETRY_METADATA_STRUCT.js";
5
+ import { MESHLET_METADATA_STRUCT } from "../../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
6
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
7
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
8
+ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
9
+ import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
10
+
11
+ export const WORKGROUP_SIZE = 64;
12
+
13
+ // Struct field offsets resolved at module-load time and baked into the
14
+ // shader as constants. The structs use `.pack()` for minimum-size
15
+ // layout, so the field positions depend on the packing heuristic —
16
+ // reading `.get(field).offset` after the build phase is the only
17
+ // reliable way to know where bounds_box / bounding_box actually sit.
18
+ const MESHLET_BOUNDS_OFFSET_WORDS = MESHLET_METADATA_STRUCT.get('bounds_box').offset / 4;
19
+ const MESHLET_STRIDE_WORDS = MESHLET_METADATA_STRUCT.size / 4;
20
+
21
+ const GEOMETRY_BBOX_OFFSET_WORDS = GEOMETRY_METADATA_STRUCT.get('bounding_box').offset / 4;
22
+ const GEOMETRY_STRIDE_WORDS = GEOMETRY_METADATA_STRUCT.size / 4;
23
+
24
+ /**
25
+ * Per-dispatch, eight bytes, read-only.
26
+ *
27
+ * `dispatch_offset` is the sub-dispatch's first-pair offset, in pair units. The host paginates if
28
+ * `total_pair_count > maxComputeWorkgroupsPerDimension * WORKGROUP_SIZE`; under typical stress-test
29
+ * scale (~71k pairs) a single sub-dispatch suffices and `dispatch_offset` is zero.
30
+ *
31
+ * The two were separate u32 uniforms, so two transient buffers per sub-dispatch. WGSL allows one
32
+ * immediate per entry point, so carrying them as immediate data means carrying them together.
33
+ *
34
+ * @type {WebGPUStruct}
35
+ */
36
+ const SCATTER_SETTINGS = WebGPUStruct.from({
37
+ dispatch_offset: u32,
38
+ total_pair_count: u32,
39
+ }, 'MeshletBoundsScatterSettings');
40
+
41
+ const resources = new ShaderResourceSetDescriptor();
42
+
43
+ resources.setImmediate('settings', SCATTER_SETTINGS);
44
+
45
+ resources.createGroup()
46
+ .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
47
+ .addStorageBuffer('dispatch_lookup', WebGPUArray.from(u32), false)
48
+ // Same buffers the rasterizer reads as typed structs, bound here
49
+ // as flat `atomic<u32>` arrays so we can do per-cell atomic
50
+ // stores at known field offsets (resolved above at module-load).
51
+ .addStorageBuffer('meshlet_metadata_atomic', WebGPUArray.from(atomic_u32), true)
52
+ .addStorageBuffer('geometry_metadata_atomic', WebGPUArray.from(atomic_u32), true);
53
+
54
+ const body = CodeChunk.from(
55
+ //language=WGSL
56
+ `
57
+ const PLUS_INF: u32 = 0x7F800000u; // bitcast f32(+inf)
58
+ const MINUS_INF: u32 = 0xFF800000u; // bitcast f32(-inf)
59
+
60
+ const MESHLET_BOUNDS_OFFSET: u32 = ${MESHLET_BOUNDS_OFFSET_WORDS}u;
61
+ const MESHLET_STRIDE: u32 = ${MESHLET_STRIDE_WORDS}u;
62
+ const GEOMETRY_BBOX_OFFSET: u32 = ${GEOMETRY_BBOX_OFFSET_WORDS}u;
63
+ const GEOMETRY_STRIDE: u32 = ${GEOMETRY_STRIDE_WORDS}u;
64
+
65
+ @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
66
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
67
+ let pair_index = gid.x + settings.dispatch_offset;
68
+ if pair_index >= settings.total_pair_count {
69
+ return;
70
+ }
71
+
72
+ let lookup_base = pair_index * 2u;
73
+ let binding_index = dispatch_lookup[lookup_base];
74
+ let meshlet_local = dispatch_lookup[lookup_base + 1u];
75
+
76
+ let binding = skinning_bindings[binding_index];
77
+ let clone_meshlet_abs = binding.clone_meshlet_metadata_offset + meshlet_local;
78
+
79
+ // Meshlet bounds reset: +inf for the 3 min slots, -inf for the
80
+ // 3 max slots. Each meshlet has exactly one (binding, meshlet)
81
+ // pair that touches it, so there's no cross-thread race on these
82
+ // slots atomicStore is technically overkill, but the buffer is
83
+ // bound atomic-typed for the reduce pass and atomicStore is the
84
+ // way to write through that view.
85
+ let m_base = clone_meshlet_abs * MESHLET_STRIDE + MESHLET_BOUNDS_OFFSET;
86
+ atomicStore(&meshlet_metadata_atomic[m_base + 0u], PLUS_INF);
87
+ atomicStore(&meshlet_metadata_atomic[m_base + 1u], PLUS_INF);
88
+ atomicStore(&meshlet_metadata_atomic[m_base + 2u], PLUS_INF);
89
+ atomicStore(&meshlet_metadata_atomic[m_base + 3u], MINUS_INF);
90
+ atomicStore(&meshlet_metadata_atomic[m_base + 4u], MINUS_INF);
91
+ atomicStore(&meshlet_metadata_atomic[m_base + 5u], MINUS_INF);
92
+
93
+ // Geometry bounds reset gate: the first meshlet of each binding
94
+ // (meshlet_local == 0) does the reset for the binding's clone
95
+ // geometry. Every clone has at least one meshlet, so this fires
96
+ // exactly once per active binding. Multiple bindings could in
97
+ // principle target the same clone — the skinning context allocates
98
+ // one clone per SkinnedMesh, so in practice each binding owns its
99
+ // own geometry but even if they didn't, the writes here are
100
+ // idempotent (same sentinels).
101
+ if meshlet_local == 0u {
102
+ let g_base = binding.clone_geometry_index * GEOMETRY_STRIDE + GEOMETRY_BBOX_OFFSET;
103
+ atomicStore(&geometry_metadata_atomic[g_base + 0u], PLUS_INF);
104
+ atomicStore(&geometry_metadata_atomic[g_base + 1u], PLUS_INF);
105
+ atomicStore(&geometry_metadata_atomic[g_base + 2u], PLUS_INF);
106
+ atomicStore(&geometry_metadata_atomic[g_base + 3u], MINUS_INF);
107
+ atomicStore(&geometry_metadata_atomic[g_base + 4u], MINUS_INF);
108
+ atomicStore(&geometry_metadata_atomic[g_base + 5u], MINUS_INF);
109
+ }
110
+ }
111
+ `);
112
+
113
+ /**
114
+ * Compute shader that resets per-meshlet `bounds_box` (clone meshlets
115
+ * only) and per-clone-geometry `bounding_box` to ±inf sentinels —
116
+ * the prerequisite for the reduce / merge passes that follow.
117
+ *
118
+ * Linear-thread dispatch: one thread per (binding, meshlet) pair in
119
+ * the skinning context's `dispatch_lookup`. With workgroup size 64,
120
+ * `ceil(total_pair_count / 64)` workgroups cover everything; the
121
+ * `settings.dispatch_offset` immediate lets the host paginate when
122
+ * `total_pair_count > maxComputeWorkgroupsPerDimension * 64`
123
+ * (currently won't trigger — 65535 * 64 ≈ 4M pairs).
124
+ *
125
+ * The geometry bounds reset is gated to `meshlet_local == 0` so each
126
+ * clone geometry is reset exactly once. The clone's bounding_sphere
127
+ * is NOT reset here — the derive-sphere pass at the end of the
128
+ * refresh chain overwrites it wholesale from the box, so no
129
+ * transient state matters.
130
+ */
131
+ export const shader_meshlet_bounds_scatter = ComputeShader.from({
132
+ label: "Skinning/MeshletBoundsScatter",
133
+ resources,
134
+ body,
135
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_skinned_mesh_bounds_refresh.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js"],"names":[],"mappings":"AAWA,gCAAiC;AAuCjC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,+DAIG;8BAnE2B,kCAAkC"}
1
+ {"version":3,"file":"shader_skinned_mesh_bounds_refresh.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js"],"names":[],"mappings":"AAWA,gCAAiC;AAyCjC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,+DAIG;8BArE2B,kCAAkC"}
@@ -1,75 +1,77 @@
1
- import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
3
- import { GEOMETRY_METADATA_STRUCT } from "../../../geometry/GEOMETRY_METADATA_STRUCT.js";
4
- import {
5
- chunk_update_object_property_mesh_instance_bounds
6
- } from "../../../object_property/chunk_update_object_property_mesh_instance_bounds.js";
7
- import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
8
- import { ComputeShader } from "../../../shader/ComputeShader.js";
9
- import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
10
- import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
11
-
12
- export const WORKGROUP_SIZE = 64;
13
-
14
- const resources = new ShaderResourceSetDescriptor();
15
- resources.createGroup()
16
- // Number of active skinning bindings (= one per skinned mesh
17
- // instance). Threads past `binding_count` early-out.
18
- .addUniform('binding_count', u32)
19
- .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
20
- // `chunk_update_object_property_mesh_instance_bounds` expects
21
- // these binding names — see its docstring's importing-shader
22
- // contract. scene_database is rw because the mesh bounds writes
23
- // route through `scene_write_mesh_*` per-field helpers, which
24
- // need the read_write access mode.
25
- .addStorageBuffer('scene_database', WebGPUArray.from(u32), true)
26
- .addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT), false);
27
-
28
- const body = CodeChunk.from(
29
- //language=WGSL
30
- `
31
- @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
32
- fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
33
- let binding_index = gid.x;
34
- if binding_index >= binding_count {
35
- return;
36
- }
37
-
38
- let binding = skinning_bindings[binding_index];
39
-
40
- // Per-instance world-space bounds: reads geometry.bounding_box
41
- // (just refreshed by the per-meshlet reduce pass) and
42
- // geometry.bounding_sphere (just refreshed by the sphere-derive
43
- // pass), projects through the mesh's node.global, writes back
44
- // to mesh.bounding_box / bounding_sphere. Reuses the existing
45
- // chunk so the math (max-column-length sphere radius scaling for
46
- // non-uniform-scale-safe culling) stays in one place.
47
- update_object_property_mesh_instance_bounds(binding.mesh_instance_index);
48
- }
49
- `, [chunk_update_object_property_mesh_instance_bounds]);
50
-
51
- /**
52
- * Compute shader that refreshes the world-space `bounding_box` and
53
- * `bounding_sphere` of every SkinnedMesh instance in the scene's
54
- * meshes table from its (now up-to-date) clone geometry bounds.
55
- *
56
- * One thread per active skinning binding. Each thread:
57
- * - Looks up its binding's `mesh_instance_index` in the meshes table.
58
- * - Reads `geometry.bounding_box` + `geometry.bounding_sphere` from
59
- * the geometry metadata table (post-reduce + post-sphere-derive).
60
- * - Reads `node.global` for the mesh's world transform.
61
- * - Projects the local AABB / sphere into world space.
62
- * - Writes back to `mesh.bounding_box` / `mesh.bounding_sphere`.
63
- *
64
- * Must run AFTER `shader_geometry_sphere_derive` (which writes the
65
- * geometry sphere this pass reads) and AFTER the transform-hierarchy
66
- * propagate pass (which writes `node.global`). Without the mesh
67
- * bounds refreshed, the rasterizer's sphere-cull and frustum-cull
68
- * passes reject animated meshes that move outside their original
69
- * source-encoded bounds.
70
- */
71
- export const shader_skinned_mesh_bounds_refresh = ComputeShader.from({
72
- label: "Skinning/SkinnedMeshBoundsRefresh",
73
- resources,
74
- body,
75
- });
1
+ import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
3
+ import { GEOMETRY_METADATA_STRUCT } from "../../../geometry/GEOMETRY_METADATA_STRUCT.js";
4
+ import {
5
+ chunk_update_object_property_mesh_instance_bounds
6
+ } from "../../../object_property/chunk_update_object_property_mesh_instance_bounds.js";
7
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
8
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
9
+ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
10
+ import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
11
+
12
+ export const WORKGROUP_SIZE = 64;
13
+
14
+ const resources = new ShaderResourceSetDescriptor();
15
+
16
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer
17
+ resources.setImmediate("binding_count", u32);
18
+ resources.createGroup()
19
+ // Number of active skinning bindings (= one per skinned mesh
20
+ // instance). Threads past `binding_count` early-out.
21
+ .addStorageBuffer('skinning_bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
22
+ // `chunk_update_object_property_mesh_instance_bounds` expects
23
+ // these binding names see its docstring's importing-shader
24
+ // contract. scene_database is rw because the mesh bounds writes
25
+ // route through `scene_write_mesh_*` per-field helpers, which
26
+ // need the read_write access mode.
27
+ .addStorageBuffer('scene_database', WebGPUArray.from(u32), true)
28
+ .addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT), false);
29
+
30
+ const body = CodeChunk.from(
31
+ //language=WGSL
32
+ `
33
+ @compute @workgroup_size(${WORKGROUP_SIZE},1,1)
34
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
35
+ let binding_index = gid.x;
36
+ if binding_index >= binding_count {
37
+ return;
38
+ }
39
+
40
+ let binding = skinning_bindings[binding_index];
41
+
42
+ // Per-instance world-space bounds: reads geometry.bounding_box
43
+ // (just refreshed by the per-meshlet reduce pass) and
44
+ // geometry.bounding_sphere (just refreshed by the sphere-derive
45
+ // pass), projects through the mesh's node.global, writes back
46
+ // to mesh.bounding_box / bounding_sphere. Reuses the existing
47
+ // chunk so the math (max-column-length sphere radius scaling for
48
+ // non-uniform-scale-safe culling) stays in one place.
49
+ update_object_property_mesh_instance_bounds(binding.mesh_instance_index);
50
+ }
51
+ `, [chunk_update_object_property_mesh_instance_bounds]);
52
+
53
+ /**
54
+ * Compute shader that refreshes the world-space `bounding_box` and
55
+ * `bounding_sphere` of every SkinnedMesh instance in the scene's
56
+ * meshes table from its (now up-to-date) clone geometry bounds.
57
+ *
58
+ * One thread per active skinning binding. Each thread:
59
+ * - Looks up its binding's `mesh_instance_index` in the meshes table.
60
+ * - Reads `geometry.bounding_box` + `geometry.bounding_sphere` from
61
+ * the geometry metadata table (post-reduce + post-sphere-derive).
62
+ * - Reads `node.global` for the mesh's world transform.
63
+ * - Projects the local AABB / sphere into world space.
64
+ * - Writes back to `mesh.bounding_box` / `mesh.bounding_sphere`.
65
+ *
66
+ * Must run AFTER `shader_geometry_sphere_derive` (which writes the
67
+ * geometry sphere this pass reads) and AFTER the transform-hierarchy
68
+ * propagate pass (which writes `node.global`). Without the mesh
69
+ * bounds refreshed, the rasterizer's sphere-cull and frustum-cull
70
+ * passes reject animated meshes that move outside their original
71
+ * source-encoded bounds.
72
+ */
73
+ export const shader_skinned_mesh_bounds_refresh = ComputeShader.from({
74
+ label: "Skinning/SkinnedMeshBoundsRefresh",
75
+ resources,
76
+ body,
77
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_meshlet_apply_skinning.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js"],"names":[],"mappings":"AAqCA;;;;GAIG;AACH,yCAA0C;AA6S1C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,0DAIG;8BAlV2B,+BAA+B"}
1
+ {"version":3,"file":"shader_meshlet_apply_skinning.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js"],"names":[],"mappings":"AAqCA;;;;GAIG;AACH,yCAA0C;AAiT1C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,0DAIG;8BAtV2B,+BAA+B"}