@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
@@ -1 +1 @@
1
- {"version":3,"file":"GPUDecalRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/GPUDecalRenderer.js"],"names":[],"mappings":"AA8EA;;;;;;;;;;;;;GAaG;AACH;IA6BI;;;;;;;;;;;OAWG;IACH;QAP8B,KAAK;QACL,OAAO,EAA1B,YAAY;QACC,YAAY,EAAzB,MAAM;QACU,YAAY;QACZ,YAAY;QACZ,SAAS;aA+BnC;IA4SD,gBAoBC;;CACJ"}
1
+ {"version":3,"file":"GPUDecalRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/GPUDecalRenderer.js"],"names":[],"mappings":"AA+EA;;;;;;;;;;;;;GAaG;AACH;IA6BI;;;;;;;;;;;OAWG;IACH;QAP8B,KAAK;QACL,OAAO,EAA1B,YAAY;QACC,YAAY,EAAzB,MAAM;QACU,YAAY;QACZ,YAAY;QACZ,SAAS;aA+BnC;IA4SD,gBAoBC;;CACJ"}
@@ -6,6 +6,7 @@ import { TextureDescriptor } from "../../../shade/descriptor/texture/TextureDesc
6
6
  import { TextureViewDescriptor } from "../../../shade/descriptor/texture/TextureViewDescriptor.js";
7
7
  import { TextureResourceDescriptor } from "../../../shade/device/graph/TextureResourceDescriptor.js";
8
8
  import { G_BUFFER_ALBEDO_FORMAT } from "../../../shade/renderer/gbuffer/G_BUFFER_ALBEDO_FORMAT.js";
9
+ import { G_BUFFER_COLOR_TARGETS } from "../../../shade/renderer/gbuffer/G_BUFFER_COLOR_TARGETS.js";
9
10
  import { TextureFilterType } from "../../../shade/renderer/texture/TextureFilterType.js";
10
11
  import { SAMPLER_ANISOTROPIC_CLAMP } from "../../../shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js";
11
12
  import { graph_build_decal_clusters } from "./graph_build_decal_clusters.js";
@@ -30,7 +31,7 @@ const GROWTH_FACTOR = 1.5;
30
31
  *
31
32
  * @type {GPUTextureFormat[]}
32
33
  */
33
- const G_BUFFER_FORMATS = ["rg8unorm", "rgba16uint", G_BUFFER_ALBEDO_FORMAT, "r32uint"];
34
+ const G_BUFFER_FORMATS = G_BUFFER_COLOR_TARGETS.map(target => target.format);
34
35
 
35
36
  /**
36
37
  * @type {TextureViewDescriptor}
@@ -1 +1 @@
1
- {"version":3,"file":"shader_decal_composite.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/shader_decal_composite.js"],"names":[],"mappings":"AAkEA,oDAKG;AAyTH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qCAFU,eAAe,CActB;6BAlX0B,qDAAqD;gCARlD,sBAAsB"}
1
+ {"version":3,"file":"shader_decal_composite.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/shader_decal_composite.js"],"names":[],"mappings":"AAuEA,oDAKG;AA8TH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qCAFU,eAAe,CActB;6BAvX0B,qDAAqD;gCARlD,sBAAsB"}
@@ -1,7 +1,7 @@
1
1
  import { CAMERA_UNIFORM_STRUCT } from "../../../shade/renderer/camera/CAMERA_UNIFORM_STRUCT.js";
2
2
  import { VIEW_UNIFORM_STRUCT } from "../../../shade/renderer/view/VIEW_UNIFORM_STRUCT.js";
3
3
  import { chunk_view_mip_bias } from "../../../shade/renderer/view/chunk_view_mip_bias.js";
4
- import { G_BUFFER_ALBEDO_FORMAT } from "../../../shade/renderer/gbuffer/G_BUFFER_ALBEDO_FORMAT.js";
4
+ import { G_BUFFER_COLOR_TARGETS } from "../../../shade/renderer/gbuffer/G_BUFFER_COLOR_TARGETS.js";
5
5
  import {
6
6
  chunk_cluster_depth_to_z_slice
7
7
  } from "../../../shade/renderer/light/cluster/chunk_cluster_depth_to_z_slice.js";
@@ -20,9 +20,14 @@ import {
20
20
  import {
21
21
  chunk_decode_g_buffer_normal
22
22
  } from "../../../shade/renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
23
+ import {
24
+ chunk_decode_g_buffer_face_normal
25
+ } from "../../../shade/renderer/shader/chunk/geometry/normal/chunk_decode_g_buffer_face_normal.js";
23
26
  import {
24
27
  chunk_encode_g_buffer_normal
25
28
  } from "../../../shade/renderer/shader/chunk/geometry/normal/chunk_encode_g_buffer_normal.js";
29
+ import { chunk_decode_g_buffer_albedo } from "../../../shade/renderer/shader/chunk/material/chunk_decode_g_buffer_albedo.js";
30
+ import { chunk_encode_g_buffer_albedo } from "../../../shade/renderer/shader/chunk/material/chunk_encode_g_buffer_albedo.js";
26
31
  import { chunk_mat4_extract_position } from "../../../shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_extract_position.js";
27
32
  import { chunk_grid3d_to_index } from "../../../shade/renderer/shader/chunk/grid/chunk_grid3d_to_index.js";
28
33
  import { chunk_rgbe9995_decode } from "../../../shade/renderer/shader/chunk/color/rgbe9995/chunk_rgbe9995_decode.js";
@@ -83,7 +88,7 @@ resources.createGroup()
83
88
  /*
84
89
  The two integer targets are declared as such, exactly as `shader_deferred_main` declares the same
85
90
  two: a texture bound without a sample type is a `texture_2d<f32>`, and `textureLoad` on one returns
86
- floats that cannot be written back into an `rgba16uint` or an `r32uint`.
91
+ floats that cannot be written back into an `r32uint`.
87
92
  */
88
93
  resources.createGroup()
89
94
  .addTexture("gBufferPBR")
@@ -116,8 +121,8 @@ const body = CodeChunk.from(
116
121
  //language=WGSL
117
122
  `
118
123
  struct DecalCompositeOut {
119
- @location(0) pbr : vec2<f32>,
120
- @location(1) normal : vec4<u32>,
124
+ @location(0) pbr : vec4<f32>,
125
+ @location(1) normal : u32,
121
126
  @location(2) albedo : vec4<f32>,
122
127
  @location(3) emissive : u32,
123
128
  }
@@ -130,7 +135,7 @@ fn main(
130
135
  let i_coord = vec2<i32>(coord.xy);
131
136
 
132
137
  let old_pbr = textureLoad(gBufferPBR, i_coord, 0);
133
- let old_normal = textureLoad(gBufferNormal, i_coord, 0);
138
+ let old_normal = textureLoad(gBufferNormal, i_coord, 0).r;
134
139
  let old_albedo = textureLoad(gBufferAlbedo, i_coord, 0);
135
140
  let old_emissive = textureLoad(gBufferEmissive, i_coord, 0).r;
136
141
 
@@ -143,7 +148,7 @@ fn main(
143
148
  */
144
149
  var out : DecalCompositeOut;
145
150
 
146
- out.pbr = old_pbr.rg;
151
+ out.pbr = old_pbr;
147
152
  out.normal = old_normal;
148
153
  out.albedo = old_albedo;
149
154
  out.emissive = old_emissive;
@@ -192,8 +197,8 @@ fn main(
192
197
  return out;
193
198
  }
194
199
 
195
- let shading_normal = decode_g_buffer_normal(old_normal.xy);
196
- let face_normal = decode_g_buffer_normal(old_normal.zw);
200
+ let shading_normal = decode_g_buffer_normal(old_normal);
201
+ let face_normal = decode_g_buffer_face_normal(old_pbr);
197
202
 
198
203
  /*
199
204
  Screen-space world gradients, taken analytically off the surface rather than from 'dpdx'.
@@ -223,7 +228,7 @@ fn main(
223
228
  let atlas_normal_size = vec2<f32>(textureDimensions(atlas_normal, 0));
224
229
  let atlas_orm_size = vec2<f32>(textureDimensions(atlas_orm, 0));
225
230
 
226
- var albedo = old_albedo.rgb;
231
+ var albedo = decode_g_buffer_albedo(old_albedo.rgb);
227
232
  var roughness = decode_g_buffer_roughness(old_pbr);
228
233
  var metalness = decode_g_buffer_metalness(old_pbr);
229
234
  var normal = shading_normal;
@@ -343,15 +348,17 @@ fn main(
343
348
  }
344
349
  }
345
350
 
346
- out.albedo = vec4<f32>(albedo, old_albedo.a);
347
- out.pbr = vec2<f32>(metalness, roughness);
351
+ // the albedo's sRGB round trip lands every 8-bit code on itself, so a pixel no decal weighs keeps its bits
352
+ out.albedo = vec4<f32>(encode_g_buffer_albedo(albedo), old_albedo.a);
353
+ // the face normal in zw goes back as it came: k/255 written to an 8-bit target is k
354
+ out.pbr = vec4<f32>(metalness, roughness, old_pbr.zw);
348
355
 
349
356
  /*
350
357
  The two encoded channels are re-encoded only when a decal wrote them: decoding and encoding
351
358
  again is not exact, and a channel no decal weights must come back with the bits it had.
352
359
  */
353
360
  if (wrote_normal) {
354
- out.normal = vec4<u32>(encode_g_buffer_normal(normal), old_normal.zw);
361
+ out.normal = encode_g_buffer_normal(normal);
355
362
  }
356
363
 
357
364
  if (wrote_emissive) {
@@ -369,7 +376,10 @@ fn main(
369
376
  chunk_decal_surface_frame,
370
377
  chunk_project_position_from_depth,
371
378
  chunk_mat4_extract_position,
379
+ chunk_decode_g_buffer_albedo,
380
+ chunk_encode_g_buffer_albedo,
372
381
  chunk_decode_g_buffer_normal,
382
+ chunk_decode_g_buffer_face_normal,
373
383
  chunk_encode_g_buffer_normal,
374
384
  chunk_decode_g_buffer_roughness,
375
385
  chunk_decode_g_buffer_metalness,
@@ -409,9 +419,9 @@ export const shader_decal_composite = new DecalTileShader({
409
419
  body
410
420
  }),
411
421
  targets: [
412
- { label: "pbr", format: "rg8unorm" },
413
- { label: "normal", format: "rgba16uint" },
414
- { label: "albedo", format: G_BUFFER_ALBEDO_FORMAT },
415
- { label: "emissive", format: "r32uint" },
422
+ { label: "pbr", format: G_BUFFER_COLOR_TARGETS[0].format },
423
+ { label: "normal", format: G_BUFFER_COLOR_TARGETS[1].format },
424
+ { label: "albedo", format: G_BUFFER_COLOR_TARGETS[2].format },
425
+ { label: "emissive", format: G_BUFFER_COLOR_TARGETS[3].format },
416
426
  ]
417
427
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_decal_tile_copy.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/shader_decal_tile_copy.js"],"names":[],"mappings":"AAWA,oDAEG;AA6CH;;;;;;GAMG;AACH,qCAFU,eAAe,CActB;6BArE0B,qDAAqD;gCAClD,sBAAsB"}
1
+ {"version":3,"file":"shader_decal_tile_copy.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/decal/shader_decal_tile_copy.js"],"names":[],"mappings":"AAWA,oDAEG;AA6CH;;;;;;GAMG;AACH,qCAFU,eAAe,CAStB;6BAhE0B,qDAAqD;gCAClD,sBAAsB"}
@@ -1,4 +1,4 @@
1
- import { G_BUFFER_ALBEDO_FORMAT } from "../../../shade/renderer/gbuffer/G_BUFFER_ALBEDO_FORMAT.js";
1
+ import { G_BUFFER_COLOR_TARGETS } from "../../../shade/renderer/gbuffer/G_BUFFER_COLOR_TARGETS.js";
2
2
  import { CodeChunk } from "../../../shade/renderer/shader/compiler/CodeChunk.js";
3
3
  import {
4
4
  ShaderResourceSetDescriptor
@@ -31,8 +31,8 @@ const body = CodeChunk.from(
31
31
  //language=WGSL
32
32
  `
33
33
  struct DecalTileCopyOut {
34
- @location(0) pbr : vec2<f32>,
35
- @location(1) normal : vec4<u32>,
34
+ @location(0) pbr : vec4<f32>,
35
+ @location(1) normal : u32,
36
36
  @location(2) albedo : vec4<f32>,
37
37
  @location(3) emissive : u32,
38
38
  }
@@ -46,8 +46,8 @@ fn main(
46
46
  var out : DecalTileCopyOut;
47
47
 
48
48
  // the two unorm targets round-trip exactly: k/255 written back is k
49
- out.pbr = textureLoad(gBufferPBR, i_coord, 0).rg;
50
- out.normal = textureLoad(gBufferNormal, i_coord, 0);
49
+ out.pbr = textureLoad(gBufferPBR, i_coord, 0);
50
+ out.normal = textureLoad(gBufferNormal, i_coord, 0).r;
51
51
  out.albedo = textureLoad(gBufferAlbedo, i_coord, 0);
52
52
  out.emissive = textureLoad(gBufferEmissive, i_coord, 0).r;
53
53
 
@@ -69,10 +69,5 @@ export const shader_decal_tile_copy = new DecalTileShader({
69
69
  resources,
70
70
  body
71
71
  }),
72
- targets: [
73
- { format: "rg8unorm" },
74
- { format: "rgba16uint" },
75
- { format: G_BUFFER_ALBEDO_FORMAT },
76
- { format: "r32uint" },
77
- ]
72
+ targets: G_BUFFER_COLOR_TARGETS.map(({ format }) => ({ format }))
78
73
  });
@@ -1 +1 @@
1
- {"version":3,"file":"GPUHighlightRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/highlight/GPUHighlightRenderer.js"],"names":[],"mappings":"AAiBA;;;;;;GAMG;AACH;IAWI;;;;;;;;;OASG;IACH;QAN8B,KAAK;QACN,KAAK,EAAvB,WAAW;QACE,UAAU,EAAvB,MAAM;QACO,SAAS,EAAtB,MAAM;QACJ,MAAM,CA+BlB;IAmED,gBAOC;;CACJ"}
1
+ {"version":3,"file":"GPUHighlightRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/highlight/GPUHighlightRenderer.js"],"names":[],"mappings":"AAiBA;;;;;;GAMG;AACH;IAWI;;;;;;;;;OASG;IACH;QAN8B,KAAK;QACN,KAAK,EAAvB,WAAW;QACE,UAAU,EAAvB,MAAM;QACO,SAAS,EAAtB,MAAM;QACJ,MAAM,CAkClB;IAoED,gBAOC;;CACJ"}
@@ -66,7 +66,10 @@ export class GPUHighlightRenderer {
66
66
  this.#execute(data, resources, execution, table_size, thickness, resolution);
67
67
  });
68
68
 
69
- data.viz_mesh = pass.read(frame.get(ViewTextures).visibility_mesh);
69
+ const view_textures = frame.get(ViewTextures);
70
+
71
+ data.visibility = pass.read(view_textures.visibility);
72
+ data.visible_meshlets = pass.read(view_textures.visible_meshlets);
70
73
 
71
74
  // read and written, because the outline blends over what is already there
72
75
  data.color = pass.write(pass.read(scene.color));
@@ -97,7 +100,8 @@ export class GPUHighlightRenderer {
97
100
  encoder,
98
101
  bindings: {
99
102
  settings,
100
- viz_mesh: resources.get(data.viz_mesh).obtainView(),
103
+ visibility: resources.get(data.visibility).obtainView(),
104
+ visible_meshlets: resources.get(data.visible_meshlets),
101
105
  highlight_table: this.#table
102
106
  },
103
107
  colorAttachments: [{
@@ -1 +1 @@
1
- {"version":3,"file":"shader_highlight_outline.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/highlight/shader_highlight_outline.js"],"names":[],"mappings":"AAYA,sDAaG;AAoFH;;;;;;;;;;;;;;;GAeG;AACH,uCAFU,WAAW,CA0BlB;6BA5I0B,qDAAqD;4BAPtD,+CAA+C"}
1
+ {"version":3,"file":"shader_highlight_outline.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/highlight/shader_highlight_outline.js"],"names":[],"mappings":"AAgBA,sDAaG;AAiGH;;;;;;;;;;;;;;;GAeG;AACH,uCAFU,WAAW,CA0BlB;6BA7J0B,qDAAqD;4BAPtD,+CAA+C"}
@@ -1,150 +1,167 @@
1
- import { BlendState } from "../../../shade/descriptor/blend/BlendState.js";
2
- import { CodeChunk } from "../../../shade/renderer/shader/compiler/CodeChunk.js";
3
- import { ImageShader } from "../../../shade/renderer/shader/ImageShader.js";
4
- import {
5
- ShaderResourceSetDescriptor
6
- } from "../../../shade/renderer/shader/resource/ShaderResourceSetDescriptor.js";
7
- import { ShaderDescriptor } from "../../../shade/renderer/shader/ShaderDescriptor.js";
8
- import { f32, u32, vec2u } from "../../../shade/renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
9
- import { WebGPUArray } from "../../../shade/renderer/shader/type/WebGPUArray.js";
10
- import { WebGPUStruct } from "../../../shade/renderer/shader/type/WebGPUStruct.js";
11
- import { chunk_highlight_lookup } from "./chunk_highlight_lookup.js";
12
-
13
- export const HIGHLIGHT_OUTLINE_SETTINGS = WebGPUStruct.from({
14
- screen_resolution: vec2u,
15
-
16
- /**
17
- * How many rows the lookup table has, which is one past the highest mesh row that was
18
- * highlighted when it was packed.
19
- */
20
- table_size: u32,
21
-
22
- /**
23
- * Outline width in pixels.
24
- */
25
- thickness: f32,
26
- });
27
-
28
- const resources = new ShaderResourceSetDescriptor();
29
-
30
- // per-draw, 16 bytes, read-only: immediate data rather than a uniform buffer
31
- resources.setImmediate("settings", HIGHLIGHT_OUTLINE_SETTINGS);
32
-
33
- resources.createGroup()
34
- .addTexture("viz_mesh", "uint");
35
-
36
- resources.createGroup()
37
- .addStorageBuffer("highlight_table", WebGPUArray.u32);
38
-
39
- const body = CodeChunk.from(
40
- //language=WGSL
41
- `
42
- @fragment
43
- fn main(
44
- @builtin(position) coord : vec4<f32>,
45
- ) -> @location(0) vec4<f32> {
46
-
47
- let here = vec2<i32>(coord.xy);
48
-
49
- let resolution = vec2<i32>(settings.screen_resolution);
50
-
51
- let table_size = settings.table_size;
52
-
53
- let own = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, here, 0).r, table_size);
54
-
55
- /*
56
- The outline sits **outside** the silhouette. A pixel that is itself the highlighted mesh is left
57
- alone — a highlight marks a unit without painting over it, which is the whole reason the legacy
58
- path dilated its mask outwards before compositing.
59
- */
60
- if (own.a > 0.0) {
61
- discard;
62
- }
63
-
64
- let thickness = settings.thickness;
65
-
66
- let radius = i32(ceil(thickness));
67
-
68
- /*
69
- The strongest highlight within reach, by coverage. Nearest would need a second comparison and
70
- would look the same: two highlights close enough to overlap an outline this thin are the same
71
- size on screen, and the brighter one is the one the eye follows.
72
- */
73
- var found = vec4<f32>(0.0);
74
-
75
- for (var dy = -radius; dy <= radius; dy++) {
76
- for (var dx = -radius; dx <= radius; dx++) {
77
- let offset = vec2<f32>(f32(dx), f32(dy));
78
-
79
- // a disc rather than a square, so the outline is the same width in every direction
80
- if (dot(offset, offset) > thickness * thickness) {
81
- continue;
82
- }
83
-
84
- let at = here + vec2<i32>(dx, dy);
85
-
86
- if (any(at < vec2<i32>(0)) || any(at >= resolution)) {
87
- continue;
88
- }
89
-
90
- let neighbour = highlight_of_mesh(&highlight_table, textureLoad(viz_mesh, at, 0).r, table_size);
91
-
92
- if (neighbour.a > found.a) {
93
- found = neighbour;
94
- }
95
- }
96
- }
97
-
98
- if (found.a <= 0.0) {
99
- discard;
100
- }
101
-
102
- // premultiplied, which is how the table stores it and how the blend state consumes it
103
- return found;
104
- }
105
- `, [
106
- chunk_highlight_lookup
107
- ]
108
- );
109
-
110
- /**
111
- * Paints an outline around every highlighted mesh, straight off the visibility buffer.
112
- *
113
- * **There is no second geometry pass, no dilation and no blur.** The renderer this replaces drew
114
- * every highlighted object again into an id target of its own, ping-ponged two render targets to
115
- * dilate the mask, blurred it, and decoded ids back to colours to composite — five render targets, a
116
- * duplicated scene graph and its own skinned material variant. Shade already writes a per-pixel mesh
117
- * id while drawing the frame, so an outline is a neighbourhood test on an integer texture and
118
- * nothing more.
119
- *
120
- * **What that costs is the contract change in D27**: the visibility buffer knows only what was
121
- * rasterized, so a unit standing behind a building is outlined where it can be seen and nowhere
122
- * else. The old mask was drawn with the depth buffer cleared and showed through everything.
123
- *
124
- * @type {ImageShader}
125
- */
126
- export const shader_highlight_outline = ImageShader.from({
127
- descriptor: ShaderDescriptor.from({
128
- label: "Highlight outline",
129
- resources,
130
- body
131
- }),
132
- targets: [
133
- {
134
- label: "outlined",
135
- format: "rgba16float",
136
- blend: BlendState.from({
137
- color: {
138
- operation: "add",
139
- srcFactor: "one",
140
- dstFactor: "one-minus-src-alpha"
141
- },
142
- alpha: {
143
- operation: "add",
144
- srcFactor: "one",
145
- dstFactor: "one-minus-src-alpha"
146
- }
147
- })
148
- }
149
- ]
150
- });
1
+ import { BlendState } from "../../../shade/descriptor/blend/BlendState.js";
2
+ import { CodeChunk } from "../../../shade/renderer/shader/compiler/CodeChunk.js";
3
+ import { ImageShader } from "../../../shade/renderer/shader/ImageShader.js";
4
+ import {
5
+ ShaderResourceSetDescriptor
6
+ } from "../../../shade/renderer/shader/resource/ShaderResourceSetDescriptor.js";
7
+ import { ShaderDescriptor } from "../../../shade/renderer/shader/ShaderDescriptor.js";
8
+ import { f32, u32, vec2u } from "../../../shade/renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
9
+ import { WebGPUArray } from "../../../shade/renderer/shader/type/WebGPUArray.js";
10
+ import { WebGPUStruct } from "../../../shade/renderer/shader/type/WebGPUStruct.js";
11
+ import {
12
+ chunk_visibility_decode,
13
+ VISIBLE_MESHLETS_RESOURCE
14
+ } from "../../../shade/renderer/rasterize/visibility/chunk_visibility_decode.js";
15
+ import { chunk_highlight_lookup } from "./chunk_highlight_lookup.js";
16
+
17
+ export const HIGHLIGHT_OUTLINE_SETTINGS = WebGPUStruct.from({
18
+ screen_resolution: vec2u,
19
+
20
+ /**
21
+ * How many rows the lookup table has, which is one past the highest mesh row that was
22
+ * highlighted when it was packed.
23
+ */
24
+ table_size: u32,
25
+
26
+ /**
27
+ * Outline width in pixels.
28
+ */
29
+ thickness: f32,
30
+ });
31
+
32
+ const resources = new ShaderResourceSetDescriptor();
33
+
34
+ // per-draw, 16 bytes, read-only: immediate data rather than a uniform buffer
35
+ resources.setImmediate("settings", HIGHLIGHT_OUTLINE_SETTINGS);
36
+
37
+ resources.createGroup()
38
+ .addTexture("visibility", "uint")
39
+ .add(VISIBLE_MESHLETS_RESOURCE);
40
+
41
+ resources.createGroup()
42
+ .addStorageBuffer("highlight_table", WebGPUArray.u32);
43
+
44
+ const body = CodeChunk.from(
45
+ //language=WGSL
46
+ `
47
+ // the mesh row at a pixel, or a row no table holds where no surface is
48
+ fn outline_mesh_at(at: vec2<i32>) -> u32 {
49
+ let word = textureLoad(visibility, at, 0).r;
50
+
51
+ if (word == VISIBILITY_NONE) {
52
+ return VISIBILITY_NONE;
53
+ }
54
+
55
+ return visibility_decode(word).mesh;
56
+ }
57
+
58
+ @fragment
59
+ fn main(
60
+ @builtin(position) coord : vec4<f32>,
61
+ ) -> @location(0) vec4<f32> {
62
+
63
+ let here = vec2<i32>(coord.xy);
64
+
65
+ let resolution = vec2<i32>(settings.screen_resolution);
66
+
67
+ let table_size = settings.table_size;
68
+
69
+ let own = highlight_of_mesh(&highlight_table, outline_mesh_at(here), table_size);
70
+
71
+ /*
72
+ The outline sits **outside** the silhouette. A pixel that is itself the highlighted mesh is left
73
+ alone — a highlight marks a unit without painting over it, which is the whole reason the legacy
74
+ path dilated its mask outwards before compositing.
75
+ */
76
+ if (own.a > 0.0) {
77
+ discard;
78
+ }
79
+
80
+ let thickness = settings.thickness;
81
+
82
+ let radius = i32(ceil(thickness));
83
+
84
+ /*
85
+ The strongest highlight within reach, by coverage. Nearest would need a second comparison and
86
+ would look the same: two highlights close enough to overlap an outline this thin are the same
87
+ size on screen, and the brighter one is the one the eye follows.
88
+ */
89
+ var found = vec4<f32>(0.0);
90
+
91
+ for (var dy = -radius; dy <= radius; dy++) {
92
+ for (var dx = -radius; dx <= radius; dx++) {
93
+ let offset = vec2<f32>(f32(dx), f32(dy));
94
+
95
+ // a disc rather than a square, so the outline is the same width in every direction
96
+ if (dot(offset, offset) > thickness * thickness) {
97
+ continue;
98
+ }
99
+
100
+ let at = here + vec2<i32>(dx, dy);
101
+
102
+ if (any(at < vec2<i32>(0)) || any(at >= resolution)) {
103
+ continue;
104
+ }
105
+
106
+ let neighbour = highlight_of_mesh(&highlight_table, outline_mesh_at(at), table_size);
107
+
108
+ if (neighbour.a > found.a) {
109
+ found = neighbour;
110
+ }
111
+ }
112
+ }
113
+
114
+ if (found.a <= 0.0) {
115
+ discard;
116
+ }
117
+
118
+ // premultiplied, which is how the table stores it and how the blend state consumes it
119
+ return found;
120
+ }
121
+ `, [
122
+ chunk_highlight_lookup,
123
+ chunk_visibility_decode,
124
+ ]
125
+ );
126
+
127
+ /**
128
+ * Paints an outline around every highlighted mesh, straight off the visibility buffer.
129
+ *
130
+ * **There is no second geometry pass, no dilation and no blur.** The renderer this replaces drew
131
+ * every highlighted object again into an id target of its own, ping-ponged two render targets to
132
+ * dilate the mask, blurred it, and decoded ids back to colours to composite — five render targets, a
133
+ * duplicated scene graph and its own skinned material variant. Shade already writes a per-pixel mesh
134
+ * id while drawing the frame, so an outline is a neighbourhood test on an integer texture and
135
+ * nothing more.
136
+ *
137
+ * **What that costs is the contract change in D27**: the visibility buffer knows only what was
138
+ * rasterized, so a unit standing behind a building is outlined where it can be seen and nowhere
139
+ * else. The old mask was drawn with the depth buffer cleared and showed through everything.
140
+ *
141
+ * @type {ImageShader}
142
+ */
143
+ export const shader_highlight_outline = ImageShader.from({
144
+ descriptor: ShaderDescriptor.from({
145
+ label: "Highlight outline",
146
+ resources,
147
+ body
148
+ }),
149
+ targets: [
150
+ {
151
+ label: "outlined",
152
+ format: "rgba16float",
153
+ blend: BlendState.from({
154
+ color: {
155
+ operation: "add",
156
+ srcFactor: "one",
157
+ dstFactor: "one-minus-src-alpha"
158
+ },
159
+ alpha: {
160
+ operation: "add",
161
+ srcFactor: "one",
162
+ dstFactor: "one-minus-src-alpha"
163
+ }
164
+ })
165
+ }
166
+ ]
167
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"shader_picking_gather.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/shader_picking_gather.js"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,0CAFU,MAAM,CAE6B;AAE7C;;;;;;;;GAQG;AACH,qCAFU,MAAM,CAEiC;AAEjD;;GAEG;AACH,4CAFU,MAAM,CAEgC;AAkEhD;;;;;;;;;;;;;;;GAeG;AACH,kDAIG;8BAnH2B,8CAA8C"}
1
+ {"version":3,"file":"shader_picking_gather.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/shader_picking_gather.js"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,0CAFU,MAAM,CAE6B;AAE7C;;;;;;;;GAQG;AACH,qCAFU,MAAM,CAEiC;AAEjD;;GAEG;AACH,4CAFU,MAAM,CAEgC;AA2EhD;;;;;;;;;;;;;;;GAeG;AACH,kDAIG;8BA5H2B,8CAA8C"}