@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
@@ -7,10 +7,12 @@ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourc
7
7
 
8
8
  const resources = new ShaderResourceSetDescriptor();
9
9
 
10
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
11
+ resources.setImmediate("size", u32);
12
+
10
13
  resources.createGroup()
11
14
  .addStorageBuffer("source", WebGPUArray.u32)
12
15
  .addStorageBuffer("destination", WebGPUArray.u32, true)
13
- .addUniform("size", u32)
14
16
 
15
17
  const body = CodeChunk.from(
16
18
  //language=WGSL
@@ -1 +1 @@
1
- {"version":3,"file":"shader_tonemap_HDR.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/deferred/shader_tonemap_HDR.js"],"names":[],"mappings":"AA2DA,6CAYG;4BA/DyB,0BAA0B"}
1
+ {"version":3,"file":"shader_tonemap_HDR.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/deferred/shader_tonemap_HDR.js"],"names":[],"mappings":"AA8DA,6CAYG;4BAlEyB,0BAA0B"}
@@ -16,9 +16,12 @@ const SETTINGS_STRUCT = WebGPUStruct.from({
16
16
  });
17
17
 
18
18
  const resources = new ShaderResourceSetDescriptor();
19
+
20
+ // per-pass, eight bytes, read-only: immediate data rather than a uniform buffer. exposure stays
21
+ // bound - it is computed on the GPU, so there is no CPU value to write.
22
+ resources.setImmediate("settings", SETTINGS_STRUCT);
19
23
  resources.createGroup()
20
24
  .addTexture("input_color", "float")
21
- .addUniform("settings", SETTINGS_STRUCT)
22
25
  .addUniform("exposure", F32_CONTAINER_STRUCT)
23
26
 
24
27
  const body = CodeChunk.from(
@@ -42,12 +42,12 @@ export class GPUDynamicMeshResidency {
42
42
  */
43
43
  create_bindings(encoder: ShadeGPUCommandContext, mesh: DynamicMesh, camera: GPUBuffer): any[];
44
44
  /**
45
- * @param {GPURenderPassEncoder} render_pass
45
+ * @param {ShadeGPURenderPassEncoder} render_pass
46
46
  * @param {GraphicsContext} graphics
47
47
  * @param {RenderPipelineDescriptor} pipeline
48
48
  * @param {Array} bindings from {@link create_bindings}
49
49
  */
50
- draw(render_pass: GPURenderPassEncoder, graphics: GraphicsContext, pipeline: RenderPipelineDescriptor, bindings: any[]): void;
50
+ draw(render_pass: ShadeGPURenderPassEncoder, graphics: GraphicsContext, pipeline: RenderPipelineDescriptor, bindings: any[]): void;
51
51
  destroy(): void;
52
52
  #private;
53
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GPUDynamicMeshResidency.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/dynamic/GPUDynamicMeshResidency.js"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH;IAuBI;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,SAFU,MAAM,CAEH;IAEb;;;;;OAKG;IACH,kCAJW,YAAY,sBACZ,MAAM,WACN,WAAW,QAoCrB;IAED;;;;;;;;;;;;;;;OAeG;IACH,8FAYC;IAED;;;;;OAKG;IACH,8HAIC;IAED,gBAcC;;CACJ"}
1
+ {"version":3,"file":"GPUDynamicMeshResidency.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/dynamic/GPUDynamicMeshResidency.js"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH;IAuBI;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,SAFU,MAAM,CAEH;IAEb;;;;;OAKG;IACH,kCAJW,YAAY,sBACZ,MAAM,WACN,WAAW,QAoCrB;IAED;;;;;;;;;;;;;;;OAeG;IACH,8FAYC;IAED;;;;;OAKG;IACH,mIAIC;IAED,gBAcC;;CACJ"}
@@ -1,167 +1,167 @@
1
- import { round_up } from "../../../core/math/round_up.js";
2
- import { DYNAMIC_MESH_DRAW_STRUCT, DYNAMIC_MESH_RESOURCES } from "./shader_dynamic_mesh.js";
3
-
4
- /**
5
- * Growth factor for the vertex and index buffers.
6
- *
7
- * Dynamic geometry changes size constantly — a trail lengthens as it is emitted and shortens as it
8
- * expires — so buffers are grown with headroom and never shrunk. Sizing exactly would mean
9
- * reallocating on almost every frame for content whose whole purpose is to change.
10
- *
11
- * @type {number}
12
- */
13
- const GROWTH_FACTOR = 1.5;
14
-
15
- /**
16
- * Storage buffers are bound by size, and a binding's size has to be a multiple of 4 — so a grown
17
- * capacity is rounded up rather than taken as the growth factor leaves it. Without this, a buffer
18
- * whose contents happen to land on the wrong number of bytes is rejected at bind time: 36 bytes of
19
- * indices grown by 1.5 gives 54, which is not a legal binding size.
20
- *
21
- * @type {number}
22
- */
23
- const BUFFER_SIZE_ALIGNMENT = 4;
24
-
25
- /**
26
- * What one {@link Geometry} owns on the GPU while it is being drawn by the dynamic path.
27
- *
28
- * Keyed on the geometry rather than on the mesh or on batch membership, so an effect that is hidden
29
- * for a frame, or removed and re-added, does not pay for its buffers again.
30
- */
31
- export class GPUDynamicMeshResidency {
32
- /**
33
- * Interleaved vertices, laid out per {@link DYNAMIC_MESH_VERTEX_STRIDE}.
34
- *
35
- * @type {GPUBuffer|null}
36
- */
37
- #vertices = null;
38
-
39
- /**
40
- * @type {number} capacity in bytes
41
- */
42
- #vertices_capacity = 0;
43
-
44
- /**
45
- * @type {GPUBuffer|null}
46
- */
47
- #indices = null;
48
-
49
- /**
50
- * @type {number} capacity in bytes
51
- */
52
- #indices_capacity = 0;
53
-
54
- /**
55
- * How many indices to draw — the count from the last upload, not the buffer's capacity.
56
- *
57
- * @type {number}
58
- */
59
- index_count = 0;
60
-
61
- /**
62
- * The {@link Geometry.version} this was uploaded from.
63
- *
64
- * @type {number}
65
- */
66
- version = -1;
67
-
68
- /**
69
- * @param {GPUDevice} device
70
- * @param {Float32Array} staging interleaved vertices, valid up to `vertex_float_count`
71
- * @param {number} vertex_float_count
72
- * @param {Uint32Array} indices
73
- */
74
- write(device, staging, vertex_float_count, indices) {
75
- const vertex_bytes = vertex_float_count * 4;
76
- const index_bytes = indices.length * 4;
77
-
78
- if (this.#vertices_capacity < vertex_bytes) {
79
- if (this.#vertices !== null) {
80
- this.#vertices.destroy();
81
- }
82
-
83
- this.#vertices_capacity = round_up(Math.ceil(vertex_bytes * GROWTH_FACTOR), BUFFER_SIZE_ALIGNMENT);
84
- this.#vertices = device.createBuffer({
85
- size: this.#vertices_capacity,
86
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
87
- label: "DynamicMesh/vertices",
88
- });
89
- }
90
-
91
- if (this.#indices_capacity < index_bytes) {
92
- if (this.#indices !== null) {
93
- this.#indices.destroy();
94
- }
95
-
96
- this.#indices_capacity = round_up(Math.ceil(index_bytes * GROWTH_FACTOR), BUFFER_SIZE_ALIGNMENT);
97
- this.#indices = device.createBuffer({
98
- size: this.#indices_capacity,
99
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
100
- label: "DynamicMesh/indices",
101
- });
102
- }
103
-
104
- device.queue.writeBuffer(this.#vertices, 0, staging.buffer, staging.byteOffset, vertex_bytes);
105
- device.queue.writeBuffer(this.#indices, 0, indices.buffer, indices.byteOffset, index_bytes);
106
-
107
- this.index_count = indices.length;
108
- }
109
-
110
- /**
111
- * Build this mesh's bind groups for the frame.
112
- *
113
- * **Must be called before the render pass is opened.** The per-draw constants are staged through
114
- * a transient buffer, and staging records a copy onto the command encoder — which WebGPU locks
115
- * for as long as a pass is open on it. Doing this lazily at draw time is the obvious shape and
116
- * an invalid one.
117
- *
118
- * The constants are transient because one mesh is one draw and its transform and colour are
119
- * expected to differ every frame, so there is nothing worth keeping between them.
120
- *
121
- * @param {ShadeGPUCommandContext} encoder
122
- * @param {DynamicMesh} mesh
123
- * @param {GPUBuffer} camera
124
- * @returns {Array} bind groups, for {@link draw}
125
- */
126
- create_bindings(encoder, mesh, camera) {
127
- const draw_buffer = encoder.allocateTransientValueBuffer(DYNAMIC_MESH_DRAW_STRUCT, {
128
- model: mesh.transform_global,
129
- color: mesh.color,
130
- });
131
-
132
- return DYNAMIC_MESH_RESOURCES.generateBindings({
133
- camera,
134
- draw: draw_buffer,
135
- vertices: this.#vertices,
136
- indices: this.#indices,
137
- }, encoder);
138
- }
139
-
140
- /**
141
- * @param {GPURenderPassEncoder} render_pass
142
- * @param {GraphicsContext} graphics
143
- * @param {RenderPipelineDescriptor} pipeline
144
- * @param {Array} bindings from {@link create_bindings}
145
- */
146
- draw(render_pass, graphics, pipeline, bindings) {
147
- graphics.setPipelineBindings(render_pass, pipeline, bindings);
148
-
149
- render_pass.draw(this.index_count);
150
- }
151
-
152
- destroy() {
153
- if (this.#vertices !== null) {
154
- this.#vertices.destroy();
155
- this.#vertices = null;
156
- }
157
-
158
- if (this.#indices !== null) {
159
- this.#indices.destroy();
160
- this.#indices = null;
161
- }
162
-
163
- this.#vertices_capacity = 0;
164
- this.#indices_capacity = 0;
165
- this.index_count = 0;
166
- }
167
- }
1
+ import { round_up } from "../../../core/math/round_up.js";
2
+ import { DYNAMIC_MESH_DRAW_STRUCT, DYNAMIC_MESH_RESOURCES } from "./shader_dynamic_mesh.js";
3
+
4
+ /**
5
+ * Growth factor for the vertex and index buffers.
6
+ *
7
+ * Dynamic geometry changes size constantly — a trail lengthens as it is emitted and shortens as it
8
+ * expires — so buffers are grown with headroom and never shrunk. Sizing exactly would mean
9
+ * reallocating on almost every frame for content whose whole purpose is to change.
10
+ *
11
+ * @type {number}
12
+ */
13
+ const GROWTH_FACTOR = 1.5;
14
+
15
+ /**
16
+ * Storage buffers are bound by size, and a binding's size has to be a multiple of 4 — so a grown
17
+ * capacity is rounded up rather than taken as the growth factor leaves it. Without this, a buffer
18
+ * whose contents happen to land on the wrong number of bytes is rejected at bind time: 36 bytes of
19
+ * indices grown by 1.5 gives 54, which is not a legal binding size.
20
+ *
21
+ * @type {number}
22
+ */
23
+ const BUFFER_SIZE_ALIGNMENT = 4;
24
+
25
+ /**
26
+ * What one {@link Geometry} owns on the GPU while it is being drawn by the dynamic path.
27
+ *
28
+ * Keyed on the geometry rather than on the mesh or on batch membership, so an effect that is hidden
29
+ * for a frame, or removed and re-added, does not pay for its buffers again.
30
+ */
31
+ export class GPUDynamicMeshResidency {
32
+ /**
33
+ * Interleaved vertices, laid out per {@link DYNAMIC_MESH_VERTEX_STRIDE}.
34
+ *
35
+ * @type {GPUBuffer|null}
36
+ */
37
+ #vertices = null;
38
+
39
+ /**
40
+ * @type {number} capacity in bytes
41
+ */
42
+ #vertices_capacity = 0;
43
+
44
+ /**
45
+ * @type {GPUBuffer|null}
46
+ */
47
+ #indices = null;
48
+
49
+ /**
50
+ * @type {number} capacity in bytes
51
+ */
52
+ #indices_capacity = 0;
53
+
54
+ /**
55
+ * How many indices to draw — the count from the last upload, not the buffer's capacity.
56
+ *
57
+ * @type {number}
58
+ */
59
+ index_count = 0;
60
+
61
+ /**
62
+ * The {@link Geometry.version} this was uploaded from.
63
+ *
64
+ * @type {number}
65
+ */
66
+ version = -1;
67
+
68
+ /**
69
+ * @param {GPUDevice} device
70
+ * @param {Float32Array} staging interleaved vertices, valid up to `vertex_float_count`
71
+ * @param {number} vertex_float_count
72
+ * @param {Uint32Array} indices
73
+ */
74
+ write(device, staging, vertex_float_count, indices) {
75
+ const vertex_bytes = vertex_float_count * 4;
76
+ const index_bytes = indices.length * 4;
77
+
78
+ if (this.#vertices_capacity < vertex_bytes) {
79
+ if (this.#vertices !== null) {
80
+ this.#vertices.destroy();
81
+ }
82
+
83
+ this.#vertices_capacity = round_up(Math.ceil(vertex_bytes * GROWTH_FACTOR), BUFFER_SIZE_ALIGNMENT);
84
+ this.#vertices = device.createBuffer({
85
+ size: this.#vertices_capacity,
86
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
87
+ label: "DynamicMesh/vertices",
88
+ });
89
+ }
90
+
91
+ if (this.#indices_capacity < index_bytes) {
92
+ if (this.#indices !== null) {
93
+ this.#indices.destroy();
94
+ }
95
+
96
+ this.#indices_capacity = round_up(Math.ceil(index_bytes * GROWTH_FACTOR), BUFFER_SIZE_ALIGNMENT);
97
+ this.#indices = device.createBuffer({
98
+ size: this.#indices_capacity,
99
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
100
+ label: "DynamicMesh/indices",
101
+ });
102
+ }
103
+
104
+ device.queue.writeBuffer(this.#vertices, 0, staging.buffer, staging.byteOffset, vertex_bytes);
105
+ device.queue.writeBuffer(this.#indices, 0, indices.buffer, indices.byteOffset, index_bytes);
106
+
107
+ this.index_count = indices.length;
108
+ }
109
+
110
+ /**
111
+ * Build this mesh's bind groups for the frame.
112
+ *
113
+ * **Must be called before the render pass is opened.** The per-draw constants are staged through
114
+ * a transient buffer, and staging records a copy onto the command encoder — which WebGPU locks
115
+ * for as long as a pass is open on it. Doing this lazily at draw time is the obvious shape and
116
+ * an invalid one.
117
+ *
118
+ * The constants are transient because one mesh is one draw and its transform and colour are
119
+ * expected to differ every frame, so there is nothing worth keeping between them.
120
+ *
121
+ * @param {ShadeGPUCommandContext} encoder
122
+ * @param {DynamicMesh} mesh
123
+ * @param {GPUBuffer} camera
124
+ * @returns {Array} bind groups, for {@link draw}
125
+ */
126
+ create_bindings(encoder, mesh, camera) {
127
+ const draw_buffer = encoder.allocateTransientValueBuffer(DYNAMIC_MESH_DRAW_STRUCT, {
128
+ model: mesh.transform_global,
129
+ color: mesh.color,
130
+ });
131
+
132
+ return DYNAMIC_MESH_RESOURCES.generateBindings({
133
+ camera,
134
+ draw: draw_buffer,
135
+ vertices: this.#vertices,
136
+ indices: this.#indices,
137
+ }, encoder);
138
+ }
139
+
140
+ /**
141
+ * @param {ShadeGPURenderPassEncoder} render_pass
142
+ * @param {GraphicsContext} graphics
143
+ * @param {RenderPipelineDescriptor} pipeline
144
+ * @param {Array} bindings from {@link create_bindings}
145
+ */
146
+ draw(render_pass, graphics, pipeline, bindings) {
147
+ graphics.setPipelineBindings(render_pass, pipeline, bindings);
148
+
149
+ render_pass.draw(this.index_count);
150
+ }
151
+
152
+ destroy() {
153
+ if (this.#vertices !== null) {
154
+ this.#vertices.destroy();
155
+ this.#vertices = null;
156
+ }
157
+
158
+ if (this.#indices !== null) {
159
+ this.#indices.destroy();
160
+ this.#indices = null;
161
+ }
162
+
163
+ this.#vertices_capacity = 0;
164
+ this.#indices_capacity = 0;
165
+ this.index_count = 0;
166
+ }
167
+ }
@@ -2,7 +2,7 @@ import { assert } from "../../../core/assert.js";
2
2
  import { TextureDescriptor } from "../../descriptor/texture/TextureDescriptor.js";
3
3
  import { TextureViewDescriptor } from "../../descriptor/texture/TextureViewDescriptor.js";
4
4
  import { SAMPLER_LINEAR_UPSCALE } from "../texture/SAMPLER_LINEAR_UPSCALE.js";
5
- import { FOG_OF_WAR_STRUCT, shader_fog_of_war } from "./shader_fog_of_war.js";
5
+ import { shader_fog_of_war } from "./shader_fog_of_war.js";
6
6
 
7
7
  /**
8
8
  * Composites fog of war over the frame.
@@ -95,12 +95,12 @@ export class GPUFogOfWarRenderer {
95
95
 
96
96
  const mask = this.#obtain_mask(graphics, field);
97
97
 
98
- const fog = encoder.allocateTransientValueBuffer(FOG_OF_WAR_STRUCT, {
98
+ const fog = {
99
99
  uv_transform: field.uv_transform,
100
100
  color: field.color,
101
101
  resolution: [field.sampler.width, field.sampler.height],
102
102
  edge_extend: field.edge_extend
103
- });
103
+ };
104
104
 
105
105
  shader_fog_of_war.draw({
106
106
  encoder,
@@ -1 +1 @@
1
- {"version":3,"file":"shader_fog_of_war.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/fow/shader_fog_of_war.js"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,6CAqBsB;AA0KtB;;;;;;;;;;;GAWG;AACH,gCAFU,WAAW,CA0BlB;AAEH;;;;GAIG;AACH,mCAFU,2BAA2B,CAES;6BAhPjB,gCAAgC;4BAJjC,0BAA0B;4CACV,mDAAmD"}
1
+ {"version":3,"file":"shader_fog_of_war.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/fow/shader_fog_of_war.js"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,6CAqBsB;AA4KtB;;;;;;;;;;;GAWG;AACH,gCAFU,WAAW,CA0BlB;AAEH;;;;GAIG;AACH,mCAFU,2BAA2B,CAES;6BAlPjB,gCAAgC;4BAJjC,0BAA0B;4CACV,mDAAmD"}
@@ -43,9 +43,11 @@ export const FOG_OF_WAR_STRUCT = WebGPUStruct.from({
43
43
 
44
44
  const resources = new ShaderResourceSetDescriptor();
45
45
 
46
+ // per-draw, 48 bytes, read-only: immediate data rather than a uniform buffer
47
+ resources.setImmediate("fog", FOG_OF_WAR_STRUCT);
48
+
46
49
  resources.createGroup()
47
50
  .addUniform("camera", CAMERA_UNIFORM_STRUCT)
48
- .addUniform("fog", FOG_OF_WAR_STRUCT)
49
51
  // as an unfilterable float and read with `.r`, which is how every depth-reading pass in the
50
52
  // engine binds the depth buffer
51
53
  .addTexture("tDepth")
@@ -1,102 +1,102 @@
1
- import { assert } from "../../../../core/assert.js";
2
- import { BVH_BUILD_SETTINGS_STRUCT, BVH_NO_ROOT_WORD } from "../../gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js";
3
- import { shader_bvh_refit } from "../../gpu_primitive/bvh/shader_bvh_refit.js";
4
- import { BLAS_LEAF_BOUNDS_SETTINGS_STRUCT, shader_blas_refit_leaf_bounds } from "./shader_blas_refit_leaf_bounds.js";
5
-
6
- /**
7
- * Bring a BLAS's bounds back in line with vertices that have moved, leaving its shape alone.
8
- *
9
- * Two dispatches. The first rewrites every leaf's box from the triangle it names, as the vertex
10
- * buffer holds it now; the second carries those boxes up the tree. Nothing is sorted, nothing is
11
- * emitted, and no node's children change — which is the entire reason this is worth having next to
12
- * a full build. A skinned mesh does it every frame.
13
- *
14
- * The caller supplies the *owner* rather than a tree, and this asks the manager where that owner's
15
- * tree lives. Nothing here knows what a clone is, or that skinning is why the vertices moved.
16
- *
17
- * Silently does nothing when the owner has no resident tree — a geometry can reach a frame before
18
- * its BLAS has been uploaded, and "there is nothing to refit yet" is an ordinary state rather than
19
- * a failure.
20
- *
21
- * @param {ShadeGPUCommandContext} cmd
22
- * @param {GPUGeometryBVHManager} blas tree residency — arenas for nodes, parents and leaf lists
23
- * @param {GPUGeometryManager} geometries geometry metadata table the leaf pass reads vertices through
24
- * @param {object} owner identity the tree was registered under, per {@link GPUGeometryBVHManager#obtain}
25
- * @param {number} geometry_index row in the geometry table whose vertices the bounds come from —
26
- * for a skinned mesh, the clone that skinning deformed, not the source holding the rest pose
27
- * @returns {boolean} whether anything was recorded
28
- */
29
- export function record_blas_refit(cmd, { blas, geometries, owner, geometry_index }) {
30
- assert.defined(cmd, 'cmd');
31
- assert.defined(blas, 'blas');
32
- assert.defined(geometries, 'geometries');
33
- assert.defined(owner, 'owner');
34
- assert.isNonNegativeInteger(geometry_index, 'geometry_index');
35
-
36
- const target = blas.get_refit_target(owner);
37
-
38
- if (target === undefined) {
39
- return false;
40
- }
41
-
42
- const { node_word_offset, node_count, leaf_count, parents_offset, leaf_nodes_offset } = target;
43
-
44
- if (leaf_count === 0) {
45
- return false;
46
- }
47
-
48
- const meshlets = geometries.meshlets;
49
-
50
- // ── 1. Leaf bounds: one thread per leaf, straight from the vertex buffer ──
51
- shader_blas_refit_leaf_bounds.dispatchThreads({
52
- encoder: cmd,
53
- thread_count_x: leaf_count,
54
- bindings: {
55
- settings: cmd.allocateTransientValueBuffer(BLAS_LEAF_BOUNDS_SETTINGS_STRUCT, {
56
- leaf_count,
57
- node_word_offset,
58
- leaf_nodes_offset,
59
- geometry_index,
60
- }),
61
- leaf_nodes: blas.buffer_leaf_nodes,
62
- geometries: geometries.buffer_metadata,
63
- meshlet_metadata: meshlets.buffer_metadata,
64
- meshlet_data: meshlets.buffer_data,
65
- nodes: blas.buffer_data,
66
- },
67
- });
68
-
69
- // ── 2. Climb: arrival counters carry the new boxes to the root ──
70
- //
71
- // One counter per node of this tree, and every one of them has to start at zero: a leftover
72
- // count lets a first arrival believe it is a second and fit a node from a sibling nothing has
73
- // written yet. The transient allocator pools its buffers, so whatever comes back is carrying
74
- // the last frame's counts and gets cleared. Sized by node rather than by leaf because the
75
- // counters are indexed by node id, and a tree read off an arena has holes in that numbering.
76
- const counters_size = Math.max(1, node_count) * Uint32Array.BYTES_PER_ELEMENT;
77
-
78
- const counters = cmd.allocateTransientBuffer(GPUBufferUsage.STORAGE, counters_size);
79
-
80
- cmd.clearBuffer(counters, 0, counters_size);
81
-
82
- shader_bvh_refit.dispatchThreads({
83
- encoder: cmd,
84
- thread_count_x: leaf_count,
85
- bindings: {
86
- settings: cmd.allocateTransientValueBuffer(BVH_BUILD_SETTINGS_STRUCT, {
87
- element_count: leaf_count,
88
- node_word_offset,
89
- // a BLAS has no header — its root is node 0 by convention
90
- root_word_offset: BVH_NO_ROOT_WORD,
91
- parents_offset,
92
- leaf_nodes_offset,
93
- }),
94
- parents: blas.buffer_parents,
95
- leaf_nodes: blas.buffer_leaf_nodes,
96
- counters,
97
- nodes: blas.buffer_data,
98
- },
99
- });
100
-
101
- return true;
102
- }
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { BVH_NO_ROOT_WORD } from "../../gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js";
3
+ import { shader_bvh_refit } from "../../gpu_primitive/bvh/shader_bvh_refit.js";
4
+ import { shader_blas_refit_leaf_bounds } from "./shader_blas_refit_leaf_bounds.js";
5
+
6
+ /**
7
+ * Bring a BLAS's bounds back in line with vertices that have moved, leaving its shape alone.
8
+ *
9
+ * Two dispatches. The first rewrites every leaf's box from the triangle it names, as the vertex
10
+ * buffer holds it now; the second carries those boxes up the tree. Nothing is sorted, nothing is
11
+ * emitted, and no node's children change — which is the entire reason this is worth having next to
12
+ * a full build. A skinned mesh does it every frame.
13
+ *
14
+ * The caller supplies the *owner* rather than a tree, and this asks the manager where that owner's
15
+ * tree lives. Nothing here knows what a clone is, or that skinning is why the vertices moved.
16
+ *
17
+ * Silently does nothing when the owner has no resident tree — a geometry can reach a frame before
18
+ * its BLAS has been uploaded, and "there is nothing to refit yet" is an ordinary state rather than
19
+ * a failure.
20
+ *
21
+ * @param {ShadeGPUCommandContext} cmd
22
+ * @param {GPUGeometryBVHManager} blas tree residency — arenas for nodes, parents and leaf lists
23
+ * @param {GPUGeometryManager} geometries geometry metadata table the leaf pass reads vertices through
24
+ * @param {object} owner identity the tree was registered under, per {@link GPUGeometryBVHManager#obtain}
25
+ * @param {number} geometry_index row in the geometry table whose vertices the bounds come from —
26
+ * for a skinned mesh, the clone that skinning deformed, not the source holding the rest pose
27
+ * @returns {boolean} whether anything was recorded
28
+ */
29
+ export function record_blas_refit(cmd, { blas, geometries, owner, geometry_index }) {
30
+ assert.defined(cmd, 'cmd');
31
+ assert.defined(blas, 'blas');
32
+ assert.defined(geometries, 'geometries');
33
+ assert.defined(owner, 'owner');
34
+ assert.isNonNegativeInteger(geometry_index, 'geometry_index');
35
+
36
+ const target = blas.get_refit_target(owner);
37
+
38
+ if (target === undefined) {
39
+ return false;
40
+ }
41
+
42
+ const { node_word_offset, node_count, leaf_count, parents_offset, leaf_nodes_offset } = target;
43
+
44
+ if (leaf_count === 0) {
45
+ return false;
46
+ }
47
+
48
+ const meshlets = geometries.meshlets;
49
+
50
+ // ── 1. Leaf bounds: one thread per leaf, straight from the vertex buffer ──
51
+ shader_blas_refit_leaf_bounds.dispatchThreads({
52
+ encoder: cmd,
53
+ thread_count_x: leaf_count,
54
+ bindings: {
55
+ settings: {
56
+ leaf_count,
57
+ node_word_offset,
58
+ leaf_nodes_offset,
59
+ geometry_index,
60
+ },
61
+ leaf_nodes: blas.buffer_leaf_nodes,
62
+ geometries: geometries.buffer_metadata,
63
+ meshlet_metadata: meshlets.buffer_metadata,
64
+ meshlet_data: meshlets.buffer_data,
65
+ nodes: blas.buffer_data,
66
+ },
67
+ });
68
+
69
+ // ── 2. Climb: arrival counters carry the new boxes to the root ──
70
+ //
71
+ // One counter per node of this tree, and every one of them has to start at zero: a leftover
72
+ // count lets a first arrival believe it is a second and fit a node from a sibling nothing has
73
+ // written yet. The transient allocator pools its buffers, so whatever comes back is carrying
74
+ // the last frame's counts and gets cleared. Sized by node rather than by leaf because the
75
+ // counters are indexed by node id, and a tree read off an arena has holes in that numbering.
76
+ const counters_size = Math.max(1, node_count) * Uint32Array.BYTES_PER_ELEMENT;
77
+
78
+ const counters = cmd.allocateTransientBuffer(GPUBufferUsage.STORAGE, counters_size);
79
+
80
+ cmd.clearBuffer(counters, 0, counters_size);
81
+
82
+ shader_bvh_refit.dispatchThreads({
83
+ encoder: cmd,
84
+ thread_count_x: leaf_count,
85
+ bindings: {
86
+ settings: {
87
+ element_count: leaf_count,
88
+ node_word_offset,
89
+ // a BLAS has no header — its root is node 0 by convention
90
+ root_word_offset: BVH_NO_ROOT_WORD,
91
+ parents_offset,
92
+ leaf_nodes_offset,
93
+ },
94
+ parents: blas.buffer_parents,
95
+ leaf_nodes: blas.buffer_leaf_nodes,
96
+ counters,
97
+ nodes: blas.buffer_data,
98
+ },
99
+ });
100
+
101
+ return true;
102
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"shader_blas_refit_leaf_bounds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js"],"names":[],"mappings":"AAkBA,iDAAkD;AAElD;;;;GAIG;AACH,+CAFU,YAAY,CAqBO;AAqD7B;;;;;;;;;;;;;;;;;;GAkBG;AACH,4CAFU,aAAa,CAMpB;6BAtH0B,mCAAmC;8BAElC,+BAA+B"}
1
+ {"version":3,"file":"shader_blas_refit_leaf_bounds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js"],"names":[],"mappings":"AAkBA,iDAAkD;AAElD;;;;GAIG;AACH,+CAFU,YAAY,CAqBO;AAyD7B;;;;;;;;;;;;;;;;;;GAkBG;AACH,4CAFU,aAAa,CAMpB;6BA1H0B,mCAAmC;8BAElC,+BAA+B"}