@woosh/meep-engine 3.61.3 → 3.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/package.json +1 -1
  2. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
  3. package/src/engine/graphics3/PickingSystem.js +415 -413
  4. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  5. package/src/engine/graphics3/decal/GPUDecalRenderer.js +2 -1
  6. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  7. package/src/engine/graphics3/decal/shader_decal_composite.js +26 -16
  8. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -1
  9. package/src/engine/graphics3/decal/shader_decal_tile_copy.js +6 -11
  10. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  11. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +6 -2
  12. package/src/engine/graphics3/highlight/shader_highlight_outline.d.ts.map +1 -1
  13. package/src/engine/graphics3/highlight/shader_highlight_outline.js +167 -150
  14. package/src/engine/graphics3/shader_picking_gather.d.ts.map +1 -1
  15. package/src/engine/graphics3/shader_picking_gather.js +133 -120
  16. package/src/shade/device/mock/SoftwareGPUTexture.d.ts.map +1 -1
  17. package/src/shade/device/mock/SoftwareGPUTexture.js +11 -0
  18. package/src/shade/device/pipeline/rp_validate_and_rewrite_for_color_attachments.js +1 -1
  19. package/src/shade/playground/contact_shadows/ContactShadowLab.js +6 -6
  20. package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts.map +1 -1
  21. package/src/shade/playground/contact_shadows/shader_contact_lab_composite.js +6 -4
  22. package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts.map +1 -1
  23. package/src/shade/playground/contact_shadows/shader_contact_lab_reference.js +6 -4
  24. package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts.map +1 -1
  25. package/src/shade/playground/contact_shadows/shader_contact_shadow_march.js +6 -4
  26. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +1 -1
  27. package/src/shade/playground/ssr_variance/capture.js +1 -1
  28. package/src/shade/renderer/Renderer.d.ts +2 -2
  29. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  30. package/src/shade/renderer/Renderer.js +40 -53
  31. package/src/shade/renderer/deferred/chunk_read_gBuffer_material.d.ts.map +1 -1
  32. package/src/shade/renderer/deferred/chunk_read_gBuffer_material.js +3 -1
  33. package/src/shade/renderer/deferred/chunk_ss_trace_contact_shadow_soft.d.ts.map +1 -1
  34. package/src/shade/renderer/deferred/chunk_ss_trace_contact_shadow_soft.js +5 -4
  35. package/src/shade/renderer/deferred/shader_deferred_main.d.ts.map +1 -1
  36. package/src/shade/renderer/deferred/shader_deferred_main.js +6 -4
  37. package/src/shade/renderer/extension/GBufferTextures.d.ts +5 -1
  38. package/src/shade/renderer/extension/GBufferTextures.d.ts.map +1 -1
  39. package/src/shade/renderer/extension/GBufferTextures.js +5 -1
  40. package/src/shade/renderer/extension/ViewTextures.d.ts +11 -7
  41. package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
  42. package/src/shade/renderer/extension/ViewTextures.js +17 -13
  43. package/src/shade/renderer/gbuffer/G_BUFFER_ALBEDO_FORMAT.d.ts +2 -0
  44. package/src/shade/renderer/gbuffer/G_BUFFER_ALBEDO_FORMAT.d.ts.map +1 -1
  45. package/src/shade/renderer/gbuffer/G_BUFFER_ALBEDO_FORMAT.js +2 -0
  46. package/src/shade/renderer/gbuffer/G_BUFFER_COLOR_TARGETS.d.ts.map +1 -1
  47. package/src/shade/renderer/gbuffer/G_BUFFER_COLOR_TARGETS.js +8 -5
  48. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts +7 -5
  49. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  50. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +29 -16
  51. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts +9 -3
  52. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts.map +1 -1
  53. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.js +40 -32
  54. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  55. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +14 -15
  56. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_debug_draw.d.ts.map +1 -1
  57. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_debug_draw.js +7 -3
  58. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_diffuse.js +1 -1
  59. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.d.ts.map +1 -1
  60. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.js +5 -3
  61. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_specular.d.ts.map +1 -1
  62. package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_specular.js +1 -3
  63. package/src/shade/renderer/global_illumination/ibl/shader_diffuse_IBL.js +1 -1
  64. package/src/shade/renderer/global_illumination/ibl/shader_specular_IBL.js +2 -2
  65. package/src/shade/renderer/global_illumination/lpv/shader_diffuse_LPV.js +1 -1
  66. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
  67. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +14 -1
  68. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  69. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +10 -1
  70. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js +2 -2
  71. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts.map +1 -1
  72. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.js +5 -3
  73. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +1 -1
  74. package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.d.ts.map +1 -1
  75. package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.js +5 -3
  76. package/src/shade/renderer/global_illumination/sharc/shader/debug/shader_colored_hash.js +1 -1
  77. package/src/shade/renderer/global_illumination/sharc/shader/debug/shader_sharc_debug_radiance.js +1 -1
  78. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +1 -1
  79. package/src/shade/renderer/material/GPUMaterialManager.d.ts +22 -9
  80. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  81. package/src/shade/renderer/material/GPUMaterialManager.js +159 -65
  82. package/src/shade/renderer/material/MATERIAL_MASK.d.ts +19 -0
  83. package/src/shade/renderer/material/MATERIAL_MASK.d.ts.map +1 -0
  84. package/src/shade/renderer/material/MATERIAL_MASK.js +19 -0
  85. package/src/shade/renderer/material/dispatch/GPUMaterialComputeDispatch.d.ts +8 -8
  86. package/src/shade/renderer/material/dispatch/GPUMaterialComputeDispatch.d.ts.map +1 -1
  87. package/src/shade/renderer/material/dispatch/GPUMaterialComputeDispatch.js +11 -92
  88. package/src/shade/renderer/material/dispatch/chunk_material_quad_keys.d.ts.map +1 -1
  89. package/src/shade/renderer/material/dispatch/chunk_material_quad_keys.js +10 -2
  90. package/src/shade/renderer/material/dispatch/gbuffer_compute.js +2 -2
  91. package/src/shade/renderer/material/dispatch/graph_material_dispatch_compute.d.ts +7 -7
  92. package/src/shade/renderer/material/dispatch/graph_material_dispatch_compute.d.ts.map +1 -1
  93. package/src/shade/renderer/material/dispatch/graph_material_dispatch_compute.js +20 -16
  94. package/src/shade/renderer/material/dispatch/shader_material_pixel_count.d.ts.map +1 -1
  95. package/src/shade/renderer/material/dispatch/shader_material_pixel_count.js +3 -1
  96. package/src/shade/renderer/material/dispatch/shader_material_pixel_scatter.d.ts.map +1 -1
  97. package/src/shade/renderer/material/dispatch/shader_material_pixel_scatter.js +3 -1
  98. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  99. package/src/shade/renderer/material/standard/fragment_gbuffer.js +26 -25
  100. package/src/shade/renderer/material/standard/material_gbuffer_vertex.d.ts +10 -8
  101. package/src/shade/renderer/material/standard/material_gbuffer_vertex.d.ts.map +1 -1
  102. package/src/shade/renderer/material/standard/material_gbuffer_vertex.js +16 -13
  103. package/src/shade/renderer/material/template/ShadeMaterialTemplate.d.ts +1 -1
  104. package/src/shade/renderer/material/template/ShadeMaterialTemplate.js +1 -1
  105. package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.d.ts +5 -2
  106. package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.d.ts.map +1 -1
  107. package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.js +7 -4
  108. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts +3 -3
  109. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts.map +1 -1
  110. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +12 -10
  111. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +2 -2
  112. package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.d.ts.map +1 -1
  113. package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.js +6 -4
  114. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +9 -7
  115. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  116. package/src/shade/renderer/postprocess/gtao/GTAO.js +11 -8
  117. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts +3 -3
  118. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  119. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +17 -12
  120. package/src/shade/renderer/postprocess/gtao/chunk_integrate_lighting_sample.js +1 -1
  121. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +1 -1
  122. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +4 -4
  123. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.js +2 -2
  124. package/src/shade/renderer/postprocess/ssr/chunk_ssr_spatial_variance.js +41 -41
  125. package/src/shade/renderer/postprocess/ssr/prefilter/chunk_load_neighbourhood_sample.js +1 -1
  126. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +3 -3
  127. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts.map +1 -1
  128. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +5 -2
  129. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +4 -4
  130. package/src/shade/renderer/postprocess/ssr/ssr_combine_shader.d.ts.map +1 -1
  131. package/src/shade/renderer/postprocess/ssr/ssr_combine_shader.js +4 -2
  132. package/src/shade/renderer/postprocess/ssr/ssr_graph_prefilter_color.d.ts +2 -1
  133. package/src/shade/renderer/postprocess/ssr/ssr_graph_prefilter_color.d.ts.map +1 -1
  134. package/src/shade/renderer/postprocess/ssr/ssr_graph_prefilter_color.js +10 -2
  135. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +1 -1
  136. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -4
  137. package/src/shade/renderer/postprocess/taa/shader_reprojection_map.d.ts.map +1 -1
  138. package/src/shade/renderer/postprocess/taa/shader_reprojection_map.js +6 -4
  139. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts +6 -8
  140. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
  141. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +29 -33
  142. package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts.map +1 -1
  143. package/src/shade/renderer/rasterize/TemplatePassDescriptor.js +1 -0
  144. package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts +6 -3
  145. package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts.map +1 -1
  146. package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.js +8 -3
  147. package/src/shade/renderer/rasterize/expand/GPUCollectionLimits.d.ts.map +1 -1
  148. package/src/shade/renderer/rasterize/expand/GPUCollectionLimits.js +3 -0
  149. package/src/shade/renderer/rasterize/expand/RasterizationCollectionType.d.ts +1 -0
  150. package/src/shade/renderer/rasterize/expand/RasterizationCollectionType.js +5 -0
  151. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts +8 -3
  152. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
  153. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +54 -5
  154. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +1 -0
  155. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  156. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
  157. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +1 -1
  158. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  159. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +2 -1
  160. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts +7 -2
  161. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
  162. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +73 -9
  163. package/src/shade/renderer/rasterize/native/viz/shader_vertex.js +4 -4
  164. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  165. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +23 -40
  166. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.d.ts.map +1 -1
  167. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +55 -76
  168. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts +4 -2
  169. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  170. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +6 -2
  171. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts +4 -2
  172. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  173. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +6 -2
  174. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +5 -2
  175. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  176. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +43 -2
  177. package/src/shade/renderer/rasterize/visibility/VISIBILITY_BUFFER.d.ts +39 -0
  178. package/src/shade/renderer/rasterize/visibility/VISIBILITY_BUFFER.d.ts.map +1 -0
  179. package/src/shade/renderer/rasterize/visibility/VISIBILITY_BUFFER.js +45 -0
  180. package/src/shade/renderer/rasterize/visibility/chunk_visibility_decode.d.ts +26 -0
  181. package/src/shade/renderer/rasterize/visibility/chunk_visibility_decode.d.ts.map +1 -0
  182. package/src/shade/renderer/rasterize/visibility/chunk_visibility_decode.js +48 -0
  183. package/src/shade/renderer/rasterize/visibility/shader_visible_meshlets_append.d.ts +40 -0
  184. package/src/shade/renderer/rasterize/visibility/shader_visible_meshlets_append.d.ts.map +1 -0
  185. package/src/shade/renderer/rasterize/visibility/shader_visible_meshlets_append.js +172 -0
  186. package/src/shade/renderer/restir/di/chunk_restir_reconstruct_surface.d.ts.map +1 -1
  187. package/src/shade/renderer/restir/di/chunk_restir_reconstruct_surface.js +6 -4
  188. package/src/shade/renderer/restir/di/chunk_restir_spatial_reuse.js +1 -1
  189. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +2 -2
  190. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_sRGBTransferEOTF.d.ts +9 -0
  191. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_sRGBTransferEOTF.d.ts.map +1 -0
  192. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_sRGBTransferEOTF.js +18 -0
  193. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_determinant.d.ts +20 -0
  194. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_determinant.d.ts.map +1 -0
  195. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_determinant.js +26 -0
  196. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.d.ts +60 -18
  197. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.d.ts.map +1 -1
  198. package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.js +163 -45
  199. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts.map +1 -1
  200. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.js +19 -18
  201. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_face_normal.d.ts +13 -0
  202. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_face_normal.d.ts.map +1 -0
  203. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_face_normal.js +22 -0
  204. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.d.ts +8 -1
  205. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.d.ts.map +1 -1
  206. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js +10 -8
  207. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_encode_g_buffer_face_normal.d.ts +22 -0
  208. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_encode_g_buffer_face_normal.d.ts.map +1 -0
  209. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_encode_g_buffer_face_normal.js +32 -0
  210. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_encode_g_buffer_normal.d.ts +11 -1
  211. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_encode_g_buffer_normal.d.ts.map +1 -1
  212. package/src/shade/renderer/shader/chunk/geometry/normal/chunk_encode_g_buffer_normal.js +14 -6
  213. package/src/shade/renderer/shader/chunk/material/chunk_decode_g_buffer_albedo.d.ts +14 -0
  214. package/src/shade/renderer/shader/chunk/material/chunk_decode_g_buffer_albedo.d.ts.map +1 -0
  215. package/src/shade/renderer/shader/chunk/material/chunk_decode_g_buffer_albedo.js +24 -0
  216. package/src/shade/renderer/shader/chunk/material/chunk_encode_g_buffer_albedo.d.ts +17 -0
  217. package/src/shade/renderer/shader/chunk/material/chunk_encode_g_buffer_albedo.d.ts.map +1 -0
  218. package/src/shade/renderer/shader/chunk/material/chunk_encode_g_buffer_albedo.js +27 -0
  219. package/src/shade/renderer/shader/chunk/screen_space/SCREEN_SPACE_RESOURCES.d.ts +7 -1
  220. package/src/shade/renderer/shader/chunk/screen_space/SCREEN_SPACE_RESOURCES.d.ts.map +1 -1
  221. package/src/shade/renderer/shader/chunk/screen_space/SCREEN_SPACE_RESOURCES.js +8 -1
  222. package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_load_world_space_normal.js +1 -1
  223. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.js +10 -10
  224. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +8 -0
  225. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  226. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +9 -0
  227. package/src/shade/renderer/shader/util/shader_decode_octahedral_normal.js +1 -1
  228. package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts +3 -3
  229. package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts.map +1 -1
  230. package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.js +3 -3
  231. package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts.map +1 -1
  232. package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.js +6 -4
  233. package/src/shade/renderer/shadow/ray/RTXShadows.d.ts +6 -4
  234. package/src/shade/renderer/shadow/ray/RTXShadows.d.ts.map +1 -1
  235. package/src/shade/renderer/shadow/ray/RTXShadows.js +16 -5
  236. package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.d.ts.map +1 -1
  237. package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.js +7 -7
  238. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +2 -2
  239. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.d.ts +4 -2
  240. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.d.ts.map +1 -1
  241. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +79 -74
  242. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  243. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +7 -7
  244. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_soft_shadows.d.ts.map +1 -1
  245. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_soft_shadows.js +7 -3
  246. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts +7 -5
  247. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  248. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +29 -16
  249. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts +5 -5
  250. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  251. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +8 -8
  252. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  253. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +13 -14
  254. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +2 -1
  255. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  256. package/src/shade/renderer/water/GPUWaterRenderer.js +6 -4
  257. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  258. package/src/shade/renderer/water/chunk_water_transport.js +11 -9
  259. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  260. package/src/shade/renderer/water/shader_water.js +13 -11
  261. package/src/shade/renderer/gbuffer/G_BUFFER_MIP_LEVELS.d.ts +0 -7
  262. package/src/shade/renderer/gbuffer/G_BUFFER_MIP_LEVELS.d.ts.map +0 -1
  263. package/src/shade/renderer/gbuffer/G_BUFFER_MIP_LEVELS.js +0 -6
  264. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts +0 -3
  265. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +0 -1
  266. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +0 -104
@@ -108,6 +108,7 @@ export class TemplatePassDescriptor extends RenderPassDescriptor {
108
108
  r.resources = origin.resources;
109
109
  r.colorAttachments = origin.colorAttachments;
110
110
  r.depthStencilAttachment = origin.depthStencilAttachment;
111
+ r.visible_meshlet_slots = origin.visible_meshlet_slots;
111
112
 
112
113
  origin.#variants.set(set, r);
113
114
  }
@@ -38,9 +38,11 @@ export function enquire_meshlets_rasterize_by_bucket_pipelines(enquiry: Pipeline
38
38
  * @param {Readonly<Record<number, GPUCullMode>>} options.cull_policy
39
39
  * @param {number[]} [options.viewport]
40
40
  * @param {GPUCollectionLimits} options.limits
41
- * @returns {[number, number[]]} depth and colour handles, as {@link graph_meshlets_rasterize}
41
+ * @param {number} [options.visible_meshlets] the frame's visible-meshlet table, which every draw appends to,
42
+ * as {@link graph_meshlets_rasterize}
43
+ * @returns {[number, number[], number]} depth, colour and table handles, as {@link graph_meshlets_rasterize}
42
44
  */
43
- export function graph_meshlets_rasterize_by_bucket({ graph, view, input_meshlets, buckets, depth, color_targets, pass_descriptor, clear_targets, cull_policy, viewport, limits, }: {
45
+ export function graph_meshlets_rasterize_by_bucket({ graph, view, input_meshlets, buckets, depth, color_targets, pass_descriptor, clear_targets, cull_policy, viewport, limits, visible_meshlets, }: {
44
46
  graph: FrameGraph;
45
47
  view: GPUViewContext;
46
48
  input_meshlets: number;
@@ -56,7 +58,8 @@ export function graph_meshlets_rasterize_by_bucket({ graph, view, input_meshlets
56
58
  cull_policy: Readonly<Record<number, GPUCullMode>>;
57
59
  viewport?: number[];
58
60
  limits: GPUCollectionLimits;
59
- }): [number, number[]];
61
+ visible_meshlets?: number;
62
+ }): [number, number[], number];
60
63
  export type PipelineEnquiry = import("../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry;
61
64
  export type RenderPassDescriptor = import("../../shader/pass/RenderPassDescriptor.js").RenderPassDescriptor;
62
65
  //# sourceMappingURL=graph_meshlets_rasterize_by_bucket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph_meshlets_rasterize_by_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.js"],"names":[],"mappings":"AAaA;;;GAGG;AAEH;;;;;;;;;GASG;AACH,wEAJW,eAAe,mBACf,oBAAoB,eACpB,SAAS,OAAO,MAAM,cAAc,CAAC,QAS/C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;IAd+B,KAAK;IACD,IAAI;IACZ,cAAc,EAA9B,MAAM;IAC0D,OAAO,EAAvE;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,EAAE;IAEtC,KAAK,EAArB,MAAM;IACY,aAAa,EAA/B,MAAM,EAAE;IACsB,eAAe,EAA7C,oBAAoB;IACH,aAAa,EAA9B,OAAO;IACwC,WAAW,EAA1D,SAAS,OAAO,MAAM,cAAc,CAAC;IAClB,QAAQ,GAA3B,MAAM,EAAE;IACqB,MAAM;IACjC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAmE9B;8BAnHY,OAAO,6CAA6C,EAAE,eAAe;mCACrE,OAAO,2CAA2C,EAAE,oBAAoB"}
1
+ {"version":3,"file":"graph_meshlets_rasterize_by_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.js"],"names":[],"mappings":"AAaA;;;GAGG;AAEH;;;;;;;;;GASG;AACH,wEAJW,eAAe,mBACf,oBAAoB,eACpB,SAAS,OAAO,MAAM,cAAc,CAAC,QAS/C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;IAhB+B,KAAK;IACD,IAAI;IACZ,cAAc,EAA9B,MAAM;IAC0D,OAAO,EAAvE;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,EAAE;IAEtC,KAAK,EAArB,MAAM;IACY,aAAa,EAA/B,MAAM,EAAE;IACsB,eAAe,EAA7C,oBAAoB;IACH,aAAa,EAA9B,OAAO;IACwC,WAAW,EAA1D,SAAS,OAAO,MAAM,cAAc,CAAC;IAClB,QAAQ,GAA3B,MAAM,EAAE;IACqB,MAAM;IAClB,gBAAgB,GAAjC,MAAM;IAEJ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAsEtC;8BAxHY,OAAO,6CAA6C,EAAE,eAAe;mCACrE,OAAO,2CAA2C,EAAE,oBAAoB"}
@@ -60,7 +60,9 @@ export function enquire_meshlets_rasterize_by_bucket_pipelines(enquiry, pass_des
60
60
  * @param {Readonly<Record<number, GPUCullMode>>} options.cull_policy
61
61
  * @param {number[]} [options.viewport]
62
62
  * @param {GPUCollectionLimits} options.limits
63
- * @returns {[number, number[]]} depth and colour handles, as {@link graph_meshlets_rasterize}
63
+ * @param {number} [options.visible_meshlets] the frame's visible-meshlet table, which every draw appends to,
64
+ * as {@link graph_meshlets_rasterize}
65
+ * @returns {[number, number[], number]} depth, colour and table handles, as {@link graph_meshlets_rasterize}
64
66
  */
65
67
  export function graph_meshlets_rasterize_by_bucket({
66
68
  graph,
@@ -74,6 +76,7 @@ export function graph_meshlets_rasterize_by_bucket({
74
76
  cull_policy,
75
77
  viewport,
76
78
  limits,
79
+ visible_meshlets = -1,
77
80
  }) {
78
81
  assert.isArray(buckets, 'buckets');
79
82
  assert.greaterThanOrEqual(buckets.length, 1, 'buckets.length');
@@ -91,6 +94,7 @@ export function graph_meshlets_rasterize_by_bucket({
91
94
  clear_targets,
92
95
  primitive_state: construct_primitive_state(draw_mode, side, cull_policy),
93
96
  viewport,
97
+ visible_meshlets,
94
98
  });
95
99
  }
96
100
 
@@ -111,7 +115,7 @@ export function graph_meshlets_rasterize_by_bucket({
111
115
  limits,
112
116
  });
113
117
 
114
- [depth, color_targets] = graph_meshlets_rasterize({
118
+ [depth, color_targets, visible_meshlets] = graph_meshlets_rasterize({
115
119
  graph,
116
120
  view,
117
121
  input_meshlets: meshlets,
@@ -121,10 +125,11 @@ export function graph_meshlets_rasterize_by_bucket({
121
125
  clear_targets: clear,
122
126
  primitive_state: construct_primitive_state(draw_mode, side, cull_policy),
123
127
  viewport,
128
+ visible_meshlets,
124
129
  });
125
130
 
126
131
  clear = false;
127
132
  }
128
133
 
129
- return [depth, color_targets];
134
+ return [depth, color_targets, visible_meshlets];
130
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GPUCollectionLimits.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/expand/GPUCollectionLimits.js"],"names":[],"mappings":"AAwBA;;GAEG;AACH;IAyBI;;;OAGG;IACH,+BAuBC;IAxCD;;;OAGG;IACH,uCAEC;IAoCD;;;;OAIG;IACH,gBAHW,2BAA2B,GAC1B,MAAM,CAMjB;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,YAHW,2BAA2B,SAC3B,MAAM,QAQhB;IAED;;;;OAIG;IACH,0BAHW,2BAA2B,GACzB,MAAM,CAyBlB;IA+BD,gBAEC;IAED;;;;;;;OAOG;IACH,gBAHW,sBAAsB,WACtB,kBAAkB,iBAkB5B;;CAEJ;qCArMY,OAAO,2CAA2C,EAAE,sBAAsB;iCAC1E,OAAO,oCAAoC,EAAE,kBAAkB;0CANlC,yCAAyC;4CACvC,kCAAkC"}
1
+ {"version":3,"file":"GPUCollectionLimits.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/expand/GPUCollectionLimits.js"],"names":[],"mappings":"AA0BA;;GAEG;AACH;IAyBI;;;OAGG;IACH,+BAwBC;IAzCD;;;OAGG;IACH,uCAEC;IAqCD;;;;OAIG;IACH,gBAHW,2BAA2B,GAC1B,MAAM,CAMjB;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,YAHW,2BAA2B,SAC3B,MAAM,QAQhB;IAED;;;;OAIG;IACH,0BAHW,2BAA2B,GACzB,MAAM,CAyBlB;IA+BD,gBAEC;IAED;;;;;;;OAOG;IACH,gBAHW,sBAAsB,WACtB,kBAAkB,iBAkB5B;;CAEJ;qCAxMY,OAAO,2CAA2C,EAAE,sBAAsB;iCAC1E,OAAO,oCAAoC,EAAE,kBAAkB;0CANlC,yCAAyC;4CACvC,kCAAkC"}
@@ -20,6 +20,8 @@ const ELEMENT_SIZES = {
20
20
  [RasterizationCollectionType.ObjectPropertyReference]: Uint32Array.BYTES_PER_ELEMENT * 2,
21
21
  // LightClusterEntries: one light id, u32
22
22
  [RasterizationCollectionType.LightClusterEntries]: Uint32Array.BYTES_PER_ELEMENT,
23
+ // MeshletDefinition, as Meshlets
24
+ [RasterizationCollectionType.VisibleMeshlets]: Uint32Array.BYTES_PER_ELEMENT * 2,
23
25
  }
24
26
 
25
27
  /**
@@ -67,6 +69,7 @@ export class GPUCollectionLimits {
67
69
  // prime stats to avoid pops
68
70
  this.#stats.setGlobalMax(RasterizationCollectionType.Meshes, 1e4);
69
71
  this.#stats.setGlobalMax(RasterizationCollectionType.Meshlets, 2e5);
72
+ this.#stats.setGlobalMax(RasterizationCollectionType.VisibleMeshlets, 2e5);
70
73
  this.#stats.setGlobalMax(RasterizationCollectionType.ObjectPropertyReference, 1024);
71
74
  // primed for each cluster grid by graph_assign_clsuters
72
75
  this.#stats.setGlobalMax(RasterizationCollectionType.LightClusterEntries, 0);
@@ -9,5 +9,6 @@ export namespace RasterizationCollectionType {
9
9
  let Meshlets: number;
10
10
  let ObjectPropertyReference: number;
11
11
  let LightClusterEntries: number;
12
+ let VisibleMeshlets: number;
12
13
  }
13
14
  //# sourceMappingURL=RasterizationCollectionType.d.ts.map
@@ -19,4 +19,9 @@ export const RasterizationCollectionType = {
19
19
  * culled light's box of cells — see {@link CLUSTER_LIGHT_BOUND}.
20
20
  */
21
21
  LightClusterEntries: 3,
22
+ /**
23
+ * The frame's visible-meshlet table: every meshlet the view's raster draws into the visibility
24
+ * buffer, at the slot its pixels name — see `graph_rasterize_scene`.
25
+ */
26
+ VisibleMeshlets: 4,
22
27
  };
@@ -20,9 +20,13 @@ export function enquire_meshlets_rasterize_pipelines(enquiry: PipelineEnquiry, p
20
20
  * @param {number[]} [options.viewport] drives {@link GPURenderPassEncoder.setViewport}. Format: [x, y, width, height]
21
21
  * @param {PrimitiveState} [options.primitive_state]
22
22
  * @param {boolean} [options.clear_targets]
23
- * @return {[depth:number, color:number[]]}
23
+ * @param {number} [options.visible_meshlets] the frame's visible-meshlet table, when `pass_descriptor` writes
24
+ * its slots ({@link RenderPassDescriptor#visible_meshlet_slots}) and only then: the draw appends its
25
+ * meshlets to the table and draws them from there, so each instance is the slot of its meshlet
26
+ * @return {[depth:number, color:number[], visible_meshlets:number]} the targets as the draw left them, and the
27
+ * table with its meshlets appended (-1 without one)
24
28
  */
25
- export function graph_meshlets_rasterize({ graph, view, input_meshlets, depth, pass_descriptor, color_targets, viewport, primitive_state, clear_targets, }: {
29
+ export function graph_meshlets_rasterize({ graph, view, input_meshlets, depth, pass_descriptor, color_targets, viewport, primitive_state, clear_targets, visible_meshlets, }: {
26
30
  graph: FrameGraph;
27
31
  view: GPUViewContext;
28
32
  input_meshlets: number;
@@ -32,7 +36,8 @@ export function graph_meshlets_rasterize({ graph, view, input_meshlets, depth, p
32
36
  viewport?: number[];
33
37
  primitive_state?: PrimitiveState;
34
38
  clear_targets?: boolean;
35
- }): [depth: number, color: number[]];
39
+ visible_meshlets?: number;
40
+ }): [depth: number, color: number[], visible_meshlets: number];
36
41
  export type PipelineEnquiry = import("../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry;
37
42
  export type RenderPassDescriptor = import("../../shader/pass/RenderPassDescriptor.js").RenderPassDescriptor;
38
43
  export type PrimitiveState = import("../../../descriptor/pipeline/render/PrimitiveState.js").PrimitiveState;
@@ -1 +1 @@
1
- {"version":3,"file":"graph_meshlets_rasterize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js"],"names":[],"mappings":"AAmBA;;;;;;;;GAQG;AACH,8DAJW,eAAe,mBACf,oBAAoB,mBACpB,cAAc,QAKxB;AAED;;;;;;;;;;;;;GAaG;AACH;IAX+B,KAAK;IACD,IAAI;IACZ,cAAc,EAA9B,MAAM;IACU,KAAK,EAArB,MAAM;IACwB,eAAe,EAA7C,oBAAoB;IACD,aAAa,GAAhC,MAAM,EAAE;IACW,QAAQ,GAA3B,MAAM,EAAE;IACiB,eAAe,GAAxC,cAAc;IACI,aAAa,GAA/B,OAAO;IACN,CAAC,KAAK,EAAC,MAAM,EAAE,KAAK,EAAC,MAAM,EAAE,CAAC,CA2IzC;8BA5KY,OAAO,6CAA6C,EAAE,eAAe;mCACrE,OAAO,2CAA2C,EAAE,oBAAoB;6BACxE,OAAO,uDAAuD,EAAE,cAAc"}
1
+ {"version":3,"file":"graph_meshlets_rasterize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js"],"names":[],"mappings":"AAwBA;;;;;;;;GAQG;AACH,8DAJW,eAAe,mBACf,oBAAoB,mBACpB,cAAc,QAUxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH;IAf+B,KAAK;IACD,IAAI;IACZ,cAAc,EAA9B,MAAM;IACU,KAAK,EAArB,MAAM;IACwB,eAAe,EAA7C,oBAAoB;IACD,aAAa,GAAhC,MAAM,EAAE;IACW,QAAQ,GAA3B,MAAM,EAAE;IACiB,eAAe,GAAxC,cAAc;IACI,aAAa,GAA/B,OAAO;IACU,gBAAgB,GAAjC,MAAM;IAGL,CAAC,KAAK,EAAC,MAAM,EAAE,KAAK,EAAC,MAAM,EAAE,EAAE,gBAAgB,EAAC,MAAM,CAAC,CA+KlE;8BAxNY,OAAO,6CAA6C,EAAE,eAAe;mCACrE,OAAO,2CAA2C,EAAE,oBAAoB;6BACxE,OAAO,uDAAuD,EAAE,cAAc"}
@@ -8,6 +8,11 @@ import {
8
8
  } from "../../gpu_primitive/indirect/build_indirect_draw_command.js";
9
9
  import { rp_rewrite_for_primitive_state } from "../../../device/pipeline/rp_rewrite_for_primitive_state.js";
10
10
  import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../../geometry/meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
11
+ import { STRUCT_DISPATCH_COMPUTE_COMMAND } from "../../gpu_primitive/indirect/STRUCT_DISPATCH_COMPUTE_COMMAND.js";
12
+ import {
13
+ shader_visible_meshlets_copy,
14
+ shader_visible_meshlets_reserve
15
+ } from "../visibility/shader_visible_meshlets_append.js";
11
16
 
12
17
  /**
13
18
  * @typedef {import("../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} PipelineEnquiry
@@ -27,7 +32,12 @@ const DRAW_COMMAND_PATTERN = `${GEOMETRY_MESHLET_TRIANGLE_LIMIT * 3}, input, 0,
27
32
  * @param {PrimitiveState} primitive_state
28
33
  */
29
34
  export function enquire_meshlets_rasterize_pipelines(enquiry, pass_descriptor, primitive_state) {
30
- enquiry.compute.push(indirect_draw_command_pipeline(enquiry.device, DRAW_COMMAND_PATTERN));
35
+ if (pass_descriptor.visible_meshlet_slots) {
36
+ enquiry.compute.push(shader_visible_meshlets_reserve.pipeline);
37
+ enquiry.compute.push(shader_visible_meshlets_copy.pipeline);
38
+ } else {
39
+ enquiry.compute.push(indirect_draw_command_pipeline(enquiry.device, DRAW_COMMAND_PATTERN));
40
+ }
31
41
  enquiry.render.push(rp_rewrite_for_primitive_state(pass_descriptor.pipeline, primitive_state));
32
42
  }
33
43
 
@@ -43,7 +53,11 @@ export function enquire_meshlets_rasterize_pipelines(enquiry, pass_descriptor, p
43
53
  * @param {number[]} [options.viewport] drives {@link GPURenderPassEncoder.setViewport}. Format: [x, y, width, height]
44
54
  * @param {PrimitiveState} [options.primitive_state]
45
55
  * @param {boolean} [options.clear_targets]
46
- * @return {[depth:number, color:number[]]}
56
+ * @param {number} [options.visible_meshlets] the frame's visible-meshlet table, when `pass_descriptor` writes
57
+ * its slots ({@link RenderPassDescriptor#visible_meshlet_slots}) and only then: the draw appends its
58
+ * meshlets to the table and draws them from there, so each instance is the slot of its meshlet
59
+ * @return {[depth:number, color:number[], visible_meshlets:number]} the targets as the draw left them, and the
60
+ * table with its meshlets appended (-1 without one)
47
61
  */
48
62
  export function graph_meshlets_rasterize({
49
63
  graph,
@@ -55,6 +69,7 @@ export function graph_meshlets_rasterize({
55
69
  viewport = [0, 0, -1, -1],
56
70
  primitive_state,
57
71
  clear_targets = true,
72
+ visible_meshlets = -1,
58
73
  }) {
59
74
  assert.equal(pass_descriptor.isRenderPassDescriptor, true, "pass_descriptor must be a RenderPassDescriptor");
60
75
  assert.isBoolean(clear_targets, 'clear_targets');
@@ -62,6 +77,7 @@ export function graph_meshlets_rasterize({
62
77
  assert.isNonNegativeInteger(depth, 'depth');
63
78
  assert.isArray(color_targets, 'color_targets');
64
79
  assert.equal(view.isGPUViewContext, true, "view must be a GPUViewContext");
80
+ assert.equal(visible_meshlets !== -1, pass_descriptor.visible_meshlet_slots, 'a pipeline that writes visible-meshlet slots draws from the table, and only it does');
65
81
 
66
82
  /**
67
83
  *
@@ -77,7 +93,31 @@ export function graph_meshlets_rasterize({
77
93
  const encoder = context.encoder;
78
94
  const device = encoder.device;
79
95
 
80
- build_indirect_draw_command(device, DRAW_COMMAND_PATTERN, encoder, input_meshlets, command);
96
+ /**
97
+ * What the draw takes its meshlets from
98
+ * @type {GPUBuffer}
99
+ */
100
+ let draw_meshlets = input_meshlets;
101
+
102
+ if (data.visible_meshlets === undefined) {
103
+ build_indirect_draw_command(device, DRAW_COMMAND_PATTERN, encoder, input_meshlets, command);
104
+ } else {
105
+ const table = resources.get(data.visible_meshlets);
106
+ const copy_command = resources.get(data.copy_command);
107
+
108
+ shader_visible_meshlets_reserve.dispatch({
109
+ encoder,
110
+ bindings: { input: input_meshlets, visible_meshlets: table, draw: command, copy: copy_command },
111
+ });
112
+
113
+ shader_visible_meshlets_copy.dispatchIndirect({
114
+ encoder,
115
+ command: copy_command,
116
+ bindings: { draw: command, input: input_meshlets, visible_meshlets: table },
117
+ });
118
+
119
+ draw_meshlets = table;
120
+ }
81
121
 
82
122
  const scene = view.scene;
83
123
  const geometry_context = scene.geometries;
@@ -142,7 +182,7 @@ export function graph_meshlets_rasterize({
142
182
  meshlet_metadata: scene.geometries.meshlets.buffer_metadata,
143
183
  geometries: geometry_context.buffer_metadata,
144
184
  materials: scene.materials.metadata_table.buffer,
145
- meshlets: input_meshlets,
185
+ meshlets: draw_meshlets,
146
186
  }
147
187
  });
148
188
 
@@ -174,12 +214,21 @@ export function graph_meshlets_rasterize({
174
214
  GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT
175
215
  ));
176
216
  data.input_meshlets = pass.read(input_meshlets);
217
+
218
+ if (visible_meshlets !== -1) {
219
+ data.visible_meshlets = pass.write(visible_meshlets);
220
+ data.copy_command = pass.create("visible meshlets copy command", BufferResourceDescriptor.from(
221
+ STRUCT_DISPATCH_COMPUTE_COMMAND.size,
222
+ GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT
223
+ ));
224
+ }
177
225
  data.out_texture_depth = pass.write(depth);
178
226
 
179
227
  data.out_color_targets = color_targets.map(pass.write, pass);
180
228
 
181
229
  return [
182
230
  data.out_texture_depth,
183
- data.out_color_targets
231
+ data.out_color_targets,
232
+ data.visible_meshlets ?? -1,
184
233
  ];
185
234
  }
@@ -48,6 +48,7 @@ export type AVBOITSideChannel = {
48
48
  color_texture: number;
49
49
  depth_texture: number;
50
50
  normal_texture: number;
51
+ pbr_texture: number;
51
52
  hzb_texture: number;
52
53
  environment_texture: number;
53
54
  light_cluster_parameters: number;
@@ -1 +1 @@
1
- {"version":3,"file":"AVBOITSideChannel.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoCc,CAAC,IAAI,EAAE;QAAC,KAAK,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QACjH,QAAc,EAAE,OAAO,iCAAiC,EAAE,cAAc,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QACzF,aAAmB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAC3E,WAAiB,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAC;QACvD,wBAA8B,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAC;QACjG,eAAqB,EAAE,MAAM,CAAC;QAC9B,eAAqB,EAAE,OAAO,6CAA6C,EAAE,eAAe,CAAC;QAC7F,MAAY,EAAE,OAAO,iEAAiE,EAAE,iBAAiB,CAAC;KACvG,KAAK;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAC;;;;;sBAMtB,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,MAAY,EAAE,MAAM,CAAC;QACrB,kBAAwB,EAAE,UAAU,MAAM,CAAC,CAAC;QAC5C,SAAe,EAAE,MAAM,CAAC;KACrB,KAAK,MAAM;;;;;;;;kBAED,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,MAAY,EAAE,MAAM,CAAC;QACrB,IAAU,EAAE,MAAM,CAAC;QACnB,aAAmB,EAAE,MAAM,CAAC;QAC5B,gBAAsB,EAAE,MAAM,EAAE,CAAC;QACjC,MAAY,EAAE;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,CAAC;KACjE,KAAK;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC;;;;;;;;;;;;;;iBAKhD,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,QAAc,EAAE,OAAO,iCAAiC,EAAE,cAAc,CAAC;QACzE,MAAY,EAAE,MAAM,CAAC;QACrB,aAAmB,EAAE,MAAM,CAAC;QAC5B,IAAU,EAAE,MAAM,CAAC;QACnB,QAAc,EAAE,MAAM,CAAC;QACvB,eAAqB,EAAE,MAAM,CAAC;QAC9B,oBAA0B,EAAE,MAAM,CAAC;QACnC,sBAA4B,EAAE;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAC,CAAC;QACxD,YAAkB,EAAE;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC,CAAC;KACrF,KAAK;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;;;;;;sBAW9D,CAAC,IAAI,EAAE,OAAO,iCAAiC,EAAE,cAAc,KAAK,OAAO"}
1
+ {"version":3,"file":"AVBOITSideChannel.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoCc,CAAC,IAAI,EAAE;QAAC,KAAK,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QACjH,QAAc,EAAE,OAAO,iCAAiC,EAAE,cAAc,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QACzF,aAAmB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAChG,WAAiB,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAC;QACvD,wBAA8B,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAC;QACjG,eAAqB,EAAE,MAAM,CAAC;QAC9B,eAAqB,EAAE,OAAO,6CAA6C,EAAE,eAAe,CAAC;QAC7F,MAAY,EAAE,OAAO,iEAAiE,EAAE,iBAAiB,CAAC;KACvG,KAAK;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAC;;;;;sBAMtB,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,MAAY,EAAE,MAAM,CAAC;QACrB,kBAAwB,EAAE,UAAU,MAAM,CAAC,CAAC;QAC5C,SAAe,EAAE,MAAM,CAAC;KACrB,KAAK,MAAM;;;;;;;;kBAED,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,MAAY,EAAE,MAAM,CAAC;QACrB,IAAU,EAAE,MAAM,CAAC;QACnB,aAAmB,EAAE,MAAM,CAAC;QAC5B,gBAAsB,EAAE,MAAM,EAAE,CAAC;QACjC,MAAY,EAAE;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,CAAC;KACjE,KAAK;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC;;;;;;;;;;;;;;iBAKhD,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,QAAc,EAAE,OAAO,iCAAiC,EAAE,cAAc,CAAC;QACzE,MAAY,EAAE,MAAM,CAAC;QACrB,aAAmB,EAAE,MAAM,CAAC;QAC5B,IAAU,EAAE,MAAM,CAAC;QACnB,QAAc,EAAE,MAAM,CAAC;QACvB,eAAqB,EAAE,MAAM,CAAC;QAC9B,oBAA0B,EAAE,MAAM,CAAC;QACnC,sBAA4B,EAAE;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAC,CAAC;QACxD,YAAkB,EAAE;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC,CAAC;KACrF,KAAK;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;;;;;;sBAW9D,CAAC,IAAI,EAAE,OAAO,iCAAiC,EAAE,cAAc,KAAK,OAAO"}
@@ -36,7 +36,7 @@
36
36
  * @typedef {object} AVBOITSideChannel
37
37
  * @property {(args: {graph: import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph,
38
38
  * view_ctx: import("../../../view/GPUViewContext.js").GPUViewContext, camera: number,
39
- * color_texture: number, depth_texture: number, normal_texture: number,
39
+ * color_texture: number, depth_texture: number, normal_texture: number, pbr_texture: number,
40
40
  * hzb_texture: number, environment_texture: number,
41
41
  * light_cluster_parameters: number, light_cluster_lookup: number, light_cluster_data: number,
42
42
  * shadowmap_atlas: number,
@@ -171,7 +171,7 @@ export function avboit_create_accumulators(pass: FramePassBuilder, resolution: A
171
171
  * sources of transparent fragments; the MBOIT orchestrator ignores them
172
172
  * @returns {number} resource ID of the composited color texture
173
173
  */
174
- export function graph_rasterize_meshes_transparent_avboit({ graph, buckets, view_ctx, viewport, depth_texture, color_texture, normal_texture, hzb_texture, environment_texture, limits, light_cluster_parameters, light_cluster_lookup, light_cluster_data, shadowmap_atlas, volumetrics_lut, volumetrics_metadata, volumetrics_irradiance, shader_switches, probes, avboit, side_channels, }: {
174
+ export function graph_rasterize_meshes_transparent_avboit({ graph, buckets, view_ctx, viewport, depth_texture, color_texture, normal_texture, pbr_texture, hzb_texture, environment_texture, limits, light_cluster_parameters, light_cluster_lookup, light_cluster_data, shadowmap_atlas, volumetrics_lut, volumetrics_metadata, volumetrics_irradiance, shader_switches, probes, avboit, side_channels, }: {
175
175
  graph: FrameGraph;
176
176
  buckets: number;
177
177
  view_ctx: GPUViewContext;
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_meshes_transparent_avboit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js"],"names":[],"mappings":"AA4DA;;;;;GAKG;AACH,oDAHW,UAAU,MAAM,CAAC,GACf,MAAM,EAAE,CAOpB;AAED;;;;;;;;;;;;GAYG;AACH;IAT+B,KAAK;IACA,KAAK;IACd,MAAM,EAAtB,MAAM;IACqB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACD,kBAAkB,EAAlC,MAAM;IACU,wBAAwB,EAAxC,MAAM;IACW,SAAS,GAA1B,MAAM;IACJ,MAAM,CA4DlB;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,SAAS,EAAzB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACmB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACQ,MAAM,GAA/B,cAAc;IACZ,MAAM,CAuDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6KAFa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAiJjE;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,QAAQ,EAAxB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACN,MAAM,CAoClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,sUAFa;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CA4M7D;AAED;;;;;;;;GAQG;AACH,+EAHW,UAAU,MAAM,CAAC,GACf;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAe/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH;IA3B+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,QAAQ,EAA1B,MAAM,EAAE;IACQ,aAAa,EAA7B,MAAM;IACU,aAAa,EAA7B,MAAM;IACuB,MAAM;IACnB,wBAAwB,EAAxC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACU,kBAAkB,EAAlC,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,oBAAoB,EAApC,MAAM;IAC6B,sBAAsB,EAAzD;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAGC,eAAe,GAAzC,eAAe;IAGsF,MAAM,EAA3G,OAAO,iEAAiE,EAAE,iBAAiB;IAGlE,MAAM,GAA/B,cAAc;IACiD,aAAa,GAA5E,OAAO,wBAAwB,EAAE,iBAAiB,EAAE;IAElD,MAAM,CAqTlB;+BAx9B8B,qBAAqB;gCAIpB,6CAA6C"}
1
+ {"version":3,"file":"graph_rasterize_meshes_transparent_avboit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js"],"names":[],"mappings":"AA4DA;;;;;GAKG;AACH,oDAHW,UAAU,MAAM,CAAC,GACf,MAAM,EAAE,CAOpB;AAED;;;;;;;;;;;;GAYG;AACH;IAT+B,KAAK;IACA,KAAK;IACd,MAAM,EAAtB,MAAM;IACqB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACD,kBAAkB,EAAlC,MAAM;IACU,wBAAwB,EAAxC,MAAM;IACW,SAAS,GAA1B,MAAM;IACJ,MAAM,CA4DlB;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,SAAS,EAAzB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACmB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACQ,MAAM,GAA/B,cAAc;IACZ,MAAM,CAuDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6KAFa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAiJjE;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,QAAQ,EAAxB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACN,MAAM,CAoClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,sUAFa;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CA4M7D;AAED;;;;;;;;GAQG;AACH,+EAHW,UAAU,MAAM,CAAC,GACf;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAe/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH;IA3B+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,QAAQ,EAA1B,MAAM,EAAE;IACQ,aAAa,EAA7B,MAAM;IACU,aAAa,EAA7B,MAAM;IACuB,MAAM;IACnB,wBAAwB,EAAxC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACU,kBAAkB,EAAlC,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,oBAAoB,EAApC,MAAM;IAC6B,sBAAsB,EAAzD;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAGC,eAAe,GAAzC,eAAe;IAGsF,MAAM,EAA3G,OAAO,iEAAiE,EAAE,iBAAiB;IAGlE,MAAM,GAA/B,cAAc;IACiD,aAAa,GAA5E,OAAO,wBAAwB,EAAE,iBAAiB,EAAE;IAElD,MAAM,CAsTlB;+BAz9B8B,qBAAqB;gCAIpB,6CAA6C"}
@@ -721,6 +721,7 @@ export function graph_rasterize_meshes_transparent_avboit({
721
721
  depth_texture,
722
722
  color_texture,
723
723
  normal_texture,
724
+ pbr_texture,
724
725
  hzb_texture,
725
726
  environment_texture,
726
727
  limits,
@@ -829,7 +830,7 @@ export function graph_rasterize_meshes_transparent_avboit({
829
830
  let background_color = color_texture;
830
831
  for (const channel of preparers) {
831
832
  const prepared = channel.avboit_prepare({ graph, view_ctx, camera: gr_camera, color_texture,
832
- depth_texture, normal_texture, hzb_texture: gr_hzb, environment_texture, light_cluster_parameters,
833
+ depth_texture, normal_texture, pbr_texture, hzb_texture: gr_hzb, environment_texture, light_cluster_parameters,
833
834
  light_cluster_lookup, light_cluster_data, shadowmap_atlas, shader_switches, probes });
834
835
  if (prepared?.background_color !== undefined) {
835
836
  assert.isNonNegativeInteger(prepared.background_color, 'prepared.background_color');
@@ -13,9 +13,12 @@
13
13
  * @param {GPUCollectionLimits} options.limits
14
14
  * @param {number[]} [options.viewport] [x,y, width, height] -1 width/height indicates that we need to disable viewport setup
15
15
  * @param {TemplatePassDescriptor} options.render_pass_descriptor the pass, with a pipeline per material template
16
- * @returns {{executed:boolean, depth:number, color_targets:number[]}} whether a pass was recorded, along with the depth and colour handles to carry forward. When no pass is recorded the input handles are returned unchanged.
16
+ * @param {number} [options.visible_meshlets] the frame's visible-meshlet table, when the pass writes its slots
17
+ * ({@link RenderPassDescriptor#visible_meshlet_slots}) and only then: the meshlets are appended to it and drawn
18
+ * from there
19
+ * @returns {{executed:boolean, depth:number, color_targets:number[], visible_meshlets:number}} whether a pass was recorded, along with the depth, colour and table handles to carry forward. When no pass is recorded the input handles are returned unchanged.
17
20
  */
18
- export function graph_rasterize_meshes_alpha_tested({ graph, buckets, view_ctx, clear_target, side, cull_policy, depth, hzb, raster_color_targets, limits, viewport, render_pass_descriptor }: {
21
+ export function graph_rasterize_meshes_alpha_tested({ graph, buckets, view_ctx, clear_target, side, cull_policy, depth, hzb, raster_color_targets, limits, viewport, render_pass_descriptor, visible_meshlets, }: {
19
22
  graph: FrameGraph;
20
23
  buckets: number;
21
24
  view_ctx: GPUViewContext;
@@ -28,10 +31,12 @@ export function graph_rasterize_meshes_alpha_tested({ graph, buckets, view_ctx,
28
31
  limits: GPUCollectionLimits;
29
32
  viewport?: number[];
30
33
  render_pass_descriptor: TemplatePassDescriptor;
34
+ visible_meshlets?: number;
31
35
  }): {
32
36
  executed: boolean;
33
37
  depth: number;
34
38
  color_targets: number[];
39
+ visible_meshlets: number;
35
40
  };
36
41
  import { ShadeDrawSide } from "../../material/ShadeDrawSide.js";
37
42
  //# sourceMappingURL=graph_rasterize_meshes_alpha_tested.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_meshes_alpha_tested.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;;GAgBG;AACH;IAd+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,YAAY,GAA9B,OAAO;IACiB,IAAI,GAA5B,aAAa;IACmC,WAAW,GAA3D,SAAS,OAAO,MAAM,cAAc,CAAC;IACrB,KAAK,EAArB,MAAM;IACU,GAAG,EAAnB,MAAM;IACY,oBAAoB,EAAtC,MAAM,EAAE;IACqB,MAAM;IAChB,QAAQ,GAA3B,MAAM,EAAE;IACwB,sBAAsB;IACpD;IAAC,QAAQ,EAAC,OAAO,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CAyPpE;8BA7R6B,iCAAiC"}
1
+ {"version":3,"file":"graph_rasterize_meshes_alpha_tested.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAjB+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,YAAY,GAA9B,OAAO;IACiB,IAAI,GAA5B,aAAa;IACmC,WAAW,GAA3D,SAAS,OAAO,MAAM,cAAc,CAAC;IACrB,KAAK,EAArB,MAAM;IACU,GAAG,EAAnB,MAAM;IACY,oBAAoB,EAAtC,MAAM,EAAE;IACqB,MAAM;IAChB,QAAQ,GAA3B,MAAM,EAAE;IACwB,sBAAsB;IACrC,gBAAgB,GAAjC,MAAM;IAGJ;IAAC,QAAQ,EAAC,OAAO,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAC;IAAC,gBAAgB,EAAC,MAAM,CAAA;CAAC,CA+S7F;8BA3V6B,iCAAiC"}
@@ -1,4 +1,6 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
+ import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
3
+ import { STRUCT_DISPATCH_COMPUTE_COMMAND } from "../../gpu_primitive/indirect/STRUCT_DISPATCH_COMPUTE_COMMAND.js";
2
4
  import { STRUCT_UNINDEXED_DRAW_COMMAND } from "../../gpu_primitive/indirect/STRUCT_UNINDEXED_DRAW_COMMAND.js";
3
5
  import { BindGroupDescriptor } from "../../binding/BindGroupDescriptor.js";
4
6
  import { ShadeDrawMode } from "../../material/ShadeDrawMode.js";
@@ -20,6 +22,11 @@ import {
20
22
  RASTERIZATION_SHADER_BIND_GROUP_SCENE,
21
23
  RASTERIZATION_SHADER_BIND_GROUP_VIEW
22
24
  } from "./alpha_tested_pass_resources.js";
25
+ import {
26
+ shader_visible_meshlets_copy_array,
27
+ shader_visible_meshlets_offset_commands,
28
+ shader_visible_meshlets_reserve
29
+ } from "../visibility/shader_visible_meshlets_append.js";
23
30
 
24
31
  const DRAW_COMMAND_BYTE_SIZE = STRUCT_UNINDEXED_DRAW_COMMAND.aligned_size;
25
32
 
@@ -38,7 +45,10 @@ const DRAW_COMMAND_BYTE_SIZE = STRUCT_UNINDEXED_DRAW_COMMAND.aligned_size;
38
45
  * @param {GPUCollectionLimits} options.limits
39
46
  * @param {number[]} [options.viewport] [x,y, width, height] -1 width/height indicates that we need to disable viewport setup
40
47
  * @param {TemplatePassDescriptor} options.render_pass_descriptor the pass, with a pipeline per material template
41
- * @returns {{executed:boolean, depth:number, color_targets:number[]}} whether a pass was recorded, along with the depth and colour handles to carry forward. When no pass is recorded the input handles are returned unchanged.
48
+ * @param {number} [options.visible_meshlets] the frame's visible-meshlet table, when the pass writes its slots
49
+ * ({@link RenderPassDescriptor#visible_meshlet_slots}) and only then: the meshlets are appended to it and drawn
50
+ * from there
51
+ * @returns {{executed:boolean, depth:number, color_targets:number[], visible_meshlets:number}} whether a pass was recorded, along with the depth, colour and table handles to carry forward. When no pass is recorded the input handles are returned unchanged.
42
52
  */
43
53
  export function graph_rasterize_meshes_alpha_tested({
44
54
  graph,
@@ -52,7 +62,8 @@ export function graph_rasterize_meshes_alpha_tested({
52
62
  raster_color_targets,
53
63
  limits,
54
64
  viewport = [0, 0, -1, -1],
55
- render_pass_descriptor
65
+ render_pass_descriptor,
66
+ visible_meshlets = -1,
56
67
  }) {
57
68
 
58
69
  assert.isNonNegativeInteger(buckets, 'buckets');
@@ -63,6 +74,7 @@ export function graph_rasterize_meshes_alpha_tested({
63
74
  assert.isBoolean(clear_target, 'clear_target');
64
75
 
65
76
  assert.equal(render_pass_descriptor.isTemplatePassDescriptor, true, 'render_pass_descriptor.isTemplatePassDescriptor !== true');
77
+ assert.equal(visible_meshlets !== -1, render_pass_descriptor.visible_meshlet_slots, 'a pipeline that writes visible-meshlet slots draws from the table, and only it does');
66
78
 
67
79
  const scene_ctx = view_ctx.scene;
68
80
 
@@ -91,6 +103,7 @@ export function graph_rasterize_meshes_alpha_tested({
91
103
  executed: false,
92
104
  depth,
93
105
  color_targets: raster_color_targets,
106
+ visible_meshlets,
94
107
  };
95
108
  }
96
109
 
@@ -112,11 +125,47 @@ export function graph_rasterize_meshes_alpha_tested({
112
125
 
113
126
 
114
127
  const command_buffer_draw = resources.get(data.command_buffer_draw);
115
- const meshlet_buffer = resources.get(data.meshlet_buffer);
128
+
129
+ /**
130
+ * What the draws take their meshlets from
131
+ * @type {GPUBuffer}
132
+ */
133
+ let meshlet_buffer = resources.get(data.meshlet_buffer);
116
134
 
117
135
  // first prepare dispatch command for filtering
118
136
  const encoder = context.encoder;
119
137
 
138
+ if (data.visible_meshlets !== undefined) {
139
+ // the sorted meshlets go into the table, and every material's command onto their copy there
140
+ const table = resources.get(data.visible_meshlets);
141
+ const append_draw = resources.get(data.append_draw);
142
+ const copy_command = resources.get(data.copy_command);
143
+
144
+ shader_visible_meshlets_reserve.dispatch({
145
+ encoder,
146
+ bindings: {
147
+ input: resources.get(data.meshlet_collection),
148
+ visible_meshlets: table,
149
+ draw: append_draw,
150
+ copy: copy_command
151
+ },
152
+ });
153
+
154
+ shader_visible_meshlets_copy_array.dispatchIndirect({
155
+ encoder,
156
+ command: copy_command,
157
+ bindings: { draw: append_draw, input: meshlet_buffer, visible_meshlets: table },
158
+ });
159
+
160
+ shader_visible_meshlets_offset_commands.dispatchThreads({
161
+ encoder,
162
+ thread_count_x: material_count,
163
+ bindings: { draw: append_draw, commands: command_buffer_draw },
164
+ });
165
+
166
+ meshlet_buffer = table;
167
+ }
168
+
120
169
  const depth_texture = resources.get(data.depth);
121
170
 
122
171
  /**
@@ -140,8 +189,8 @@ export function graph_rasterize_meshes_alpha_tested({
140
189
  const partial_clear_needed = !is_viewport_unrestricted && clear_target;
141
190
 
142
191
  if (partial_clear_needed) {
143
- for (let i = 0; i < color_targets.length; i++) {
144
- texture_fill_rectangle(encoder, color_targets[i], viewport, render_pass_descriptor.colorAttachments[i].clearValue);
192
+ for (let i = 0; i < color_targets.length; i++) {
193
+ texture_fill_rectangle(encoder, color_targets[i], viewport, render_pass_descriptor.colorAttachments[i].clearValue);
145
194
  }
146
195
  texture_fill_rectangle(encoder, depth_texture, viewport, [render_pass_descriptor.depthStencilAttachment.depthClearValue]);
147
196
  }
@@ -250,7 +299,7 @@ export function graph_rasterize_meshes_alpha_tested({
250
299
 
251
300
  const gr_camera = graph_import_buffer(graph, view_ctx.camera.buffer.buffer);
252
301
 
253
- const { meshlets, draw_commands } = graph_prepare_meshlet_draw_commands_by_material({
302
+ const { meshlets, draw_commands, meshlet_collection } = graph_prepare_meshlet_draw_commands_by_material({
254
303
  graph,
255
304
  materials: relevant_materials,
256
305
  bucket_id: alpha_tested_bucket_index,
@@ -269,11 +318,25 @@ export function graph_rasterize_meshes_alpha_tested({
269
318
  const pass_data = {};
270
319
  const pass = graph.add("rasterize alpha tested meshes", pass_data, execute);
271
320
 
272
- // reserve buffer for indirect draw commands
273
- pass_data.command_buffer_draw = pass.read(draw_commands);
274
-
275
321
  pass_data.meshlet_buffer = pass.read(meshlets);
276
322
 
323
+ if (visible_meshlets === -1) {
324
+ pass_data.command_buffer_draw = pass.read(draw_commands);
325
+ } else {
326
+ // the commands are moved onto the table's slots in place
327
+ pass_data.command_buffer_draw = pass.write(draw_commands);
328
+ pass_data.meshlet_collection = pass.read(meshlet_collection);
329
+ pass_data.visible_meshlets = pass.write(visible_meshlets);
330
+ pass_data.append_draw = pass.create("visible meshlets append", BufferResourceDescriptor.from(
331
+ STRUCT_UNINDEXED_DRAW_COMMAND.size,
332
+ GPUBufferUsage.STORAGE
333
+ ));
334
+ pass_data.copy_command = pass.create("visible meshlets copy command", BufferResourceDescriptor.from(
335
+ STRUCT_DISPATCH_COMPUTE_COMMAND.size,
336
+ GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT
337
+ ));
338
+ }
339
+
277
340
  // TODO move texture resource import outside
278
341
  let viz_depth = depth;
279
342
 
@@ -286,5 +349,6 @@ export function graph_rasterize_meshes_alpha_tested({
286
349
  executed: true,
287
350
  depth: pass_data.depth,
288
351
  color_targets: pass_data.out_color_targets,
352
+ visible_meshlets: pass_data.visible_meshlets ?? -1,
289
353
  };
290
354
  }
@@ -4,14 +4,14 @@ import { ShaderDescriptor } from "../../../shader/ShaderDescriptor.js";
4
4
  import { MESH_TRIANGLE_REFERENCE_STRUCT } from "../../../geometry/meshlet/MESH_TRIANGLE_REFERENCE_STRUCT.js";
5
5
  import { chunk_rasterize_triangle } from "../chunk_rasterize_triangle.js";
6
6
  import { rasterization_shader_resources } from "../rasterization_shader_resources.js";
7
+ import { VISIBILITY_TRIANGLE_BITS } from "../../visibility/VISIBILITY_BUFFER.js";
7
8
 
8
9
  const body = CodeChunk.from(
9
10
  //language=WGSL
10
11
  `
11
12
  struct VertexOutput{
12
13
  @builtin(position) position: vec4f,
13
- @location(0) @interpolate(flat) m_mesh:u32,
14
- @location(1) @interpolate(flat) m_triangle:u32,
14
+ @location(0) @interpolate(flat) m_visibility: u32,
15
15
  }
16
16
 
17
17
  @vertex
@@ -35,8 +35,8 @@ fn main(
35
35
 
36
36
  output.position = projected_vertex;
37
37
 
38
- output.m_mesh = triangle_def.mesh;
39
- output.m_triangle = triangle_def.index ;
38
+ // the draw takes its meshlets from the frame's visible-meshlet table, so the instance is the slot
39
+ output.m_visibility = (meshlet_index << ${VISIBILITY_TRIANGLE_BITS}u) | (triangle_def.index & ${2 ** VISIBILITY_TRIANGLE_BITS - 1}u);
40
40
 
41
41
  return output;
42
42
 
@@ -1 +1 @@
1
- {"version":3,"file":"viz_rasterization_alpha_tested_pass_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js"],"names":[],"mappings":"AA0LA;;;;GAIG;AACH,6DAFU,sBAAsB,CAqC7B;uCA5LoC,iCAAiC"}
1
+ {"version":3,"file":"viz_rasterization_alpha_tested_pass_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js"],"names":[],"mappings":"AAiLA;;;;GAIG;AACH,6DAFU,sBAAsB,CAiC7B;uCAlLoC,iCAAiC"}