@woosh/meep-engine 3.59.0 → 3.60.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/package.json +1 -1
  2. package/src/shade/playground/probe_clipmap/index.html +12 -0
  3. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  4. package/src/shade/playground/probe_clipmap/main.js +5 -0
  5. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  6. package/src/shade/renderer/Renderer.js +4 -6
  7. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +63 -1
  8. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  9. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +228 -16
  10. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +27 -4
  11. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  12. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +526 -23
  13. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts +11 -0
  14. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts.map +1 -0
  15. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.js +21 -0
  16. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts +65 -0
  17. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts.map +1 -0
  18. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +376 -0
  19. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +7 -3
  20. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -1
  21. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +70 -6
  22. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts +20 -0
  23. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts.map +1 -0
  24. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.js +80 -0
  25. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts +18 -0
  26. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts.map +1 -0
  27. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.js +113 -0
  28. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +47 -0
  29. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +1 -0
  30. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +80 -0
  31. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +91 -0
  32. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -0
  33. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +902 -0
  34. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +16 -0
  35. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +1 -0
  36. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +67 -0
  37. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +17 -0
  38. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +1 -0
  39. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +145 -0
  40. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +12 -0
  41. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +1 -0
  42. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +105 -0
  43. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.d.ts.map +1 -1
  44. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +2 -1
  45. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +3 -9
  46. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  47. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +13 -31
  48. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +764 -48
  49. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +410 -0
  50. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +3 -2
  51. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  52. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +4 -3
  53. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +41 -17
  54. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  55. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +57 -33
  56. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +11 -3
  57. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
  58. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +13 -4
  59. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +9 -18
  60. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
  61. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +8 -10
  62. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +12 -0
  63. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -1
  64. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +28 -0
  65. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +1 -29
  66. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
  67. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +1 -74
  68. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +161 -0
  69. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -0
  70. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +219 -0
  71. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +1 -8
  72. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
  73. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +1 -9
  74. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +40 -12
  75. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -1
  76. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +373 -31
  77. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -1
  78. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
  79. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -1
  80. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +15 -8
  81. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -1
  82. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +28 -14
  83. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +23 -0
  84. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts.map +1 -0
  85. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +66 -0
  86. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts +29 -0
  87. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts.map +1 -0
  88. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.js +210 -0
  89. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts +29 -0
  90. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts.map +1 -0
  91. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.js +86 -0
  92. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +41 -0
  93. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -0
  94. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +439 -0
  95. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts +23 -0
  96. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts.map +1 -0
  97. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.js +135 -0
  98. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +3 -1
  99. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -1
  100. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +12 -3
  101. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +21 -18
  102. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +254 -73
  104. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +149 -8
  105. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  106. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +181 -13
  107. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +179 -7
  108. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +412 -31
  110. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +4 -4
  111. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
  112. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +4 -3
  113. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +36 -10
  114. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  115. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +218 -29
  116. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +5 -1
  117. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
  118. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +24 -14
  119. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +15 -6
  120. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
  121. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +21 -22
  122. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts +36 -0
  123. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts.map +1 -0
  124. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.js +257 -0
  125. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +18 -7
  126. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
  127. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +157 -51
  128. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts +23 -0
  129. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts.map +1 -0
  130. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.js +110 -0
  131. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +24 -2
  132. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
  133. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +90 -10
  134. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts +45 -0
  135. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts.map +1 -0
  136. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.js +205 -0
  137. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +1 -1
  138. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +16 -3
  139. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
  140. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +55 -10
  141. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -4
  142. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
  143. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +60 -6
  144. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +10 -9
  145. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  146. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +32 -39
  147. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +21 -14
  148. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  149. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +100 -30
  150. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +6 -2
  151. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -1
  152. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +26 -10
  153. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +3 -2
  154. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -1
  155. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +12 -12
  156. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts +10 -0
  157. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts.map +1 -0
  158. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.js +21 -0
  159. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts +5 -2
  160. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts.map +1 -1
  161. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.js +31 -23
  162. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts +10 -0
  163. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts.map +1 -0
  164. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.js +22 -0
  165. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts +9 -0
  166. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts.map +1 -0
  167. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.js +18 -0
  168. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts +8 -3
  169. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts.map +1 -1
  170. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.js +41 -32
  171. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts +31 -0
  172. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts.map +1 -0
  173. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.js +71 -0
  174. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts +47 -0
  175. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts.map +1 -0
  176. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.js +210 -0
  177. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +5 -4
  178. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts.map +1 -1
  179. package/src/shade/renderer/gpu_primitive/sort/defs.js +5 -4
  180. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +56 -15
  181. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  182. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +410 -61
  183. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts +4 -1
  184. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  185. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +16 -42
  186. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts +15 -0
  187. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts.map +1 -0
  188. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.js +60 -0
  189. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts +25 -0
  190. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts.map +1 -0
  191. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.js +89 -0
  192. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts +3 -8
  193. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  194. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +28 -160
  195. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts +12 -0
  196. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts.map +1 -0
  197. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.js +74 -0
  198. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts +3 -1
  199. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts.map +1 -1
  200. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.js +387 -188
  201. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +1 -1
  202. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +1 -1
  203. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  204. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +90 -72
  205. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +5 -0
  206. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -1
  207. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +9 -0
  208. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts +13 -0
  209. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts.map +1 -0
  210. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.js +14 -0
  211. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts +10 -0
  212. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts.map +1 -0
  213. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.js +15 -0
  214. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +4 -3
  215. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -1
  216. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +6 -5
  217. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts +17 -2
  218. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts.map +1 -1
  219. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +25 -57
  220. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts +13 -0
  221. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts.map +1 -0
  222. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.js +70 -0
  223. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts +10 -0
  224. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts.map +1 -0
  225. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.js +59 -0
  226. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts +12 -0
  227. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts.map +1 -0
  228. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.js +49 -0
  229. package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.d.ts.map +1 -1
  230. package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.js +1 -0
  231. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
  232. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -0
  233. package/src/shade/renderer/path_tracer/shader/chunk_sample_material.d.ts.map +1 -1
  234. package/src/shade/renderer/path_tracer/shader/chunk_sample_material.js +2 -1
  235. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts +7 -0
  236. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  237. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +15 -6
  238. package/src/shade/renderer/scene/GPUSceneContext.d.ts +7 -1
  239. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  240. package/src/shade/renderer/scene/GPUSceneContext.js +26 -1
  241. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts +7 -7
  242. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  243. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +262 -294
  244. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts +9 -0
  245. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts.map +1 -0
  246. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.js +21 -0
  247. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +43 -0
  248. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -0
  249. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +87 -0
  250. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts +7 -1
  251. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts.map +1 -1
  252. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.js +1 -1
  253. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts +21 -0
  254. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts.map +1 -0
  255. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.js +42 -0
  256. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  257. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +19 -0
  258. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
  259. package/src/shade/wgsl/emulator/CPUBitmapData.js +27 -0
  260. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  261. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +65 -19
  262. package/src/view/elements/progress/segmented/GhostTrail.d.ts +116 -0
  263. package/src/view/elements/progress/segmented/GhostTrail.d.ts.map +1 -0
  264. package/src/view/elements/progress/segmented/GhostTrail.js +280 -0
  265. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts +3 -1
  266. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts.map +1 -1
  267. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js +3 -1
  268. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts +11 -0
  269. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts.map +1 -0
  270. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.js +15 -0
  271. package/src/view/elements/progress/segmented/SegmentDefinition.d.ts +3 -0
  272. package/src/view/elements/progress/segmented/SegmentDefinition.d.ts.map +1 -1
  273. package/src/view/elements/progress/segmented/SegmentDefinition.js +3 -0
  274. package/src/view/elements/progress/segmented/SegmentTier.d.ts +38 -0
  275. package/src/view/elements/progress/segmented/SegmentTier.d.ts.map +1 -0
  276. package/src/view/elements/progress/segmented/SegmentTier.js +50 -0
  277. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +163 -10
  278. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
  279. package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +442 -101
  280. package/src/view/elements/progress/segmented/playground/index.html +78 -0
  281. package/src/view/elements/progress/segmented/playground/main.d.ts +2 -0
  282. package/src/view/elements/progress/segmented/playground/main.d.ts.map +1 -0
  283. package/src/view/elements/progress/segmented/playground/main.js +173 -0
  284. package/src/view/elements/progress/segmented/segment_cell_layout.d.ts +48 -0
  285. package/src/view/elements/progress/segmented/segment_cell_layout.d.ts.map +1 -0
  286. package/src/view/elements/progress/segmented/segment_cell_layout.js +75 -0
  287. package/src/view/elements/progress/segmented/segment_notch_place.d.ts +18 -0
  288. package/src/view/elements/progress/segmented/segment_notch_place.d.ts.map +1 -0
  289. package/src/view/elements/progress/segmented/segment_notch_place.js +28 -0
  290. package/src/view/elements/progress/segmented/segment_tick_positions.d.ts +32 -0
  291. package/src/view/elements/progress/segmented/segment_tick_positions.d.ts.map +1 -0
  292. package/src/view/elements/progress/segmented/segment_tick_positions.js +103 -0
  293. package/src/view/elements/progress/segmented/segmented-resource-bar.css +142 -0
  294. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +0 -35
  295. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +0 -1
  296. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +0 -238
  297. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +0 -99
  298. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +0 -1
  299. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +0 -139
  300. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +0 -65
  301. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +0 -1
  302. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +0 -393
  303. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +0 -17
  304. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +0 -1
  305. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +0 -36
  306. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +0 -29
  307. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +0 -1
  308. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +0 -108
  309. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +0 -31
  310. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +0 -1
  311. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +0 -113
  312. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +0 -36
  313. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +0 -1
  314. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +0 -85
  315. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +0 -23
  316. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +0 -1
  317. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +0 -273
  318. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +0 -13
  319. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +0 -1
  320. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +0 -151
  321. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +0 -13
  322. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +0 -1
  323. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +0 -133
  324. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +0 -22
  325. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +0 -1
  326. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +0 -135
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "description": "Advanced 3D game engine",
7
7
  "type": "module",
8
8
  "author": "Alexander Goldring",
9
- "version": "3.59.0",
9
+ "version": "3.60.1",
10
10
  "exports": {
11
11
  "./build/*": "./build/*",
12
12
  "./src/*": "./src/*",
@@ -143,6 +143,18 @@
143
143
  frame-time knob; this page starts higher so Sponza is whole in seconds, not minutes.
144
144
  </p>
145
145
 
146
+ <label>
147
+ <span>Card capture</span>
148
+ <select id="card_capture_mode">
149
+ <option value="Raster" selected>Raster — the material's own pass</option>
150
+ <option value="Trace">Trace — a ray a texel</option>
151
+ </select>
152
+ </label>
153
+ <p class="note">
154
+ How the cards take their albedo. A change captures every card set again; the Mesh cards view
155
+ shows what they hold.
156
+ </p>
157
+
146
158
  <hr>
147
159
 
148
160
  <div id="status"></div>
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/probe_clipmap/main.js"],"names":[],"mappings":"AAyFA;;;;;GAKG;AACH,yBAFa,QAAQ,IAAI,CAAC,CA0QzB"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/probe_clipmap/main.js"],"names":[],"mappings":"AA0FA;;;;;GAKG;AACH,yBAFa,QAAQ,IAAI,CAAC,CA8QzB"}
@@ -11,6 +11,7 @@ import { camera_frame_sphere } from "../../renderer/camera/camera_frame_sphere.j
11
11
  import { OrbitalCameraController } from "../../renderer/camera/orbital/OrbitalCameraController.js";
12
12
  import { PerspectiveCamera } from "../../renderer/camera/PerspectiveCamera.js";
13
13
  import { create_frame_loop } from "../../renderer/create_frame_loop.js";
14
+ import { MeshCardCaptureMode } from "../../renderer/geometry/sdf/cards/MeshCardCaptureMode.js";
14
15
  import { ProbeClipmapDebugView } from "../../renderer/global_illumination/probe_clipmap/debug/ProbeClipmapDebugView.js";
15
16
  import { make_sunlight } from "../../renderer/light/make_sunlight.js";
16
17
  import { PointLight } from "../../renderer/light/model/PointLight.js";
@@ -237,6 +238,10 @@ export async function start() {
237
238
  renderer.probe_clipmap.debug_view = ProbeClipmapDebugView[event.target.value];
238
239
  });
239
240
 
241
+ element('card_capture_mode').addEventListener('change', event => {
242
+ renderer.probe_clipmap.card_capture_mode = MeshCardCaptureMode[event.target.value];
243
+ });
244
+
240
245
  const taa_toggle = element('taa');
241
246
  const path_tracing_toggle = element('path_tracing');
242
247
 
@@ -1 +1 @@
1
- {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
@@ -2928,9 +2928,10 @@ export class Renderer {
2928
2928
  // below is skipped on the same fact.
2929
2929
  const has_volumetrics = view_ctx.scene.volumetrics.source.volumes.length > 0;
2930
2930
 
2931
- // The probe clipmap GI runs after the G-buffer and the shadow maps and before the volumetrics
2932
- // that sample it (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §5). Made for this view and these
2933
- // settings on the first frame in the mode, and given back on the first frame out of it.
2931
+ // The probe clipmap GI runs after the G-buffer and before the volumetrics that sample it
2932
+ // (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §5); its hits trace their own shadow rays, so it reads no
2933
+ // shadow map. Made for this view and these settings on the first frame in the mode, and given back
2934
+ // on the first frame out of it.
2934
2935
  if (this.indirect_lighting_mode === ShadeIndirectLightingMode.ProbeClipmap) {
2935
2936
  this.#probe_clipmap_gi.graph_update({
2936
2937
  graph,
@@ -2939,10 +2940,7 @@ export class Renderer {
2939
2940
  depth: gr_texture_depth_current,
2940
2941
  normal: gr_texture_normal,
2941
2942
  stbn: STATIC_GRAPHICS_ENGINE_ASSETS.stbn_vec2,
2942
- // a cache of the lighting, not the simulation: its response runs on the wall clock
2943
- time: performance.now() / 1000,
2944
2943
  movers: gr_scene_movers,
2945
- shadowmap_atlas: gr_shadowmap_atlas,
2946
2944
  });
2947
2945
  } else {
2948
2946
  this.#probe_clipmap_gi.release();
@@ -36,6 +36,12 @@ export const MESH_SDF_BAKE_BUDGET_MAX: number;
36
36
  * {@link cards}, whose card sets — one per (geometry, material) pair — are captured after the bake,
37
37
  * `capture_budget` pages a frame.
38
38
  *
39
+ * **Sources** ({@link add_source}) make the caches of geometries with no tree of their own to bake from,
40
+ * a virtual geometry's: such a geometry waits queued, as one whose tree is not resident yet does. A
41
+ * source hears of each geometry queued ({@link onRequested}), records its own work each frame ahead of
42
+ * the bake, and bakes a proxy of it here as any geometry, whose resident cache it then gives the
43
+ * geometry ({@link adopt}).
44
+ *
39
45
  * **Readers** bind {@link headers}, {@link indirection}, {@link texture} and {@link MESH_SDF_SAMPLER}
40
46
  * (see {@link write_bindings}) and sample through `mesh_sdf_sample`, which only a resident header
41
47
  * should be given to.
@@ -53,6 +59,11 @@ export class GPUGeometrySDFManager {
53
59
  * @type {Signal<number>}
54
60
  */
55
61
  onBaked: any;
62
+ /**
63
+ * Sent with a geometry's record each time its cache is queued for a bake: what a source listens to.
64
+ * @type {Signal<GPUGeometryMetadata>}
65
+ */
66
+ onRequested: any;
56
67
  /**
57
68
  * The card sets: one capture of a geometry's layout per (geometry, material) pair, which their
58
69
  * user acquires and releases. Layouts reach it as they are placed.
@@ -115,6 +126,42 @@ export class GPUGeometrySDFManager {
115
126
  * @returns {MeshSDFState}
116
127
  */
117
128
  state_of(record: GPUGeometryMetadata): MeshSDFState;
129
+ /**
130
+ * Whether a geometry's cache waits for its bake: queued, and not admitted. A cache whose last holder went is
131
+ * baked all the same until a {@link trim} drops it, as one admitted is.
132
+ *
133
+ * @param {GPUGeometryMetadata} record
134
+ * @returns {boolean}
135
+ */
136
+ is_requested(record: GPUGeometryMetadata): boolean;
137
+ /**
138
+ * Whether a holder of a geometry's cache draws both sides of it: the side a bake of it takes.
139
+ *
140
+ * @param {GPUGeometryMetadata} record
141
+ * @returns {boolean}
142
+ */
143
+ holds_two_sided(record: GPUGeometryMetadata): boolean;
144
+ /**
145
+ * @param {MeshSDFSource} source run first in each {@link graph_bake} from here on
146
+ */
147
+ add_source(source: MeshSDFSource): void;
148
+ /**
149
+ * @param {MeshSDFSource} source
150
+ */
151
+ remove_source(source: MeshSDFSource): void;
152
+ /**
153
+ * Give `target` the resident cache baked for `proxy`: a source's hand-in, for a geometry with no tree of its own,
154
+ * of a proxy in the same local space baked as any geometry is. Nothing is copied. The target's header takes the
155
+ * proxy's layout, entries and side, and the proxy's reads None, as dropped; {@link onBaked} is sent with the
156
+ * target. The cache has no cards, the target having no tree to capture them with. Held for another side than the
157
+ * proxy was baked for, it is queued again at the next bake, as any cache is.
158
+ *
159
+ * @param {GPUGeometryMetadata} target waiting for its bake ({@link is_requested})
160
+ * @param {GPUGeometryMetadata} proxy whose cache is resident
161
+ * @returns {boolean} whether it was adopted: false, changing nothing, when `target` no longer waits or `proxy`'s
162
+ * cache is not resident
163
+ */
164
+ adopt(target: GPUGeometryMetadata, proxy: GPUGeometryMetadata): boolean;
118
165
  /**
119
166
  * Geometries whose layout was coarsened by the cap, of those baked: coarser than asked.
120
167
  * @returns {number}
@@ -200,12 +247,15 @@ export class GPUGeometrySDFManager {
200
247
  * captures nothing
201
248
  * @param {GPUResidentMaterialContext|null} [options.materials] what the capture shades with, as it
202
249
  * stands this frame; needed with a `capture_budget`
250
+ * @param {GPUMaterialManager|null} [options.material_contexts] what a raster capture draws with
251
+ * ({@link GPUMeshCardSets#capture_mode}); needed with a `capture_budget` in that mode
203
252
  */
204
- graph_bake({ graph, budget, capture_budget, materials }: {
253
+ graph_bake({ graph, budget, capture_budget, materials, material_contexts }: {
205
254
  graph: FrameGraph;
206
255
  budget: number;
207
256
  capture_budget?: number;
208
257
  materials?: GPUResidentMaterialContext | null;
258
+ material_contexts?: GPUMaterialManager | null;
209
259
  }): void;
210
260
  destroy(): void;
211
261
  #private;
@@ -214,6 +264,18 @@ export type FrameGraph = import("../../../../engine/graphics/render/frame_graph/
214
264
  export type GPUGeometryManager = import("../GPUGeometryManager.js").GPUGeometryManager;
215
265
  export type GPUGeometryMetadata = import("../GPUGeometryMetadata.js").GPUGeometryMetadata;
216
266
  export type GPUResidentMaterialContext = import("../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext;
267
+ export type GPUMaterialManager = import("../../material/GPUMaterialManager.js").GPUMaterialManager;
268
+ /**
269
+ * What makes caches for geometries the bake cannot bake from a tree of their own
270
+ * ({@link GPUGeometrySDFManageradd_source }): it learns what is asked for from `onRequested`, records its own work in
271
+ * each frame's graph ahead of the bake, and hands each cache in through `adopt`.
272
+ */
273
+ export type MeshSDFSource = {
274
+ /**
275
+ * records the source's work for the frame, ahead of the bake
276
+ */
277
+ graph_update: (arg0: FrameGraph) => void;
278
+ };
217
279
  import { GPUMeshCardSets } from "./cards/GPUMeshCardSets.js";
218
280
  import { MeshSDFState } from "./MESH_SDF.js";
219
281
  //# sourceMappingURL=GPUGeometrySDFManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GPUGeometrySDFManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js"],"names":[],"mappings":"AAqIA;;;;GAIG;AACH,uCAFU,MAAM,CAEuH;AAgDvI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH;IAwPI;;;OAGG;IACH,2CAFW,kBAAkB,EAS5B;IAvPD;;;OAGG;IACH,aAAuB;IAqPvB;;;;OAIG;IACH,6BAEC;IAED;;;;;;OAMG;IACH,sBAHW,MAAM,cACN,MAAM,QAmChB;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,yBAEC;IAED;;;;;OAKG;IACH,gBAHW,mBAAmB,aACnB,OAAO,QAsBjB;IAED;;;;;OAKG;IACH,gBAHW,mBAAmB,aACnB,OAAO,QAqBjB;IAED;;OAEG;IACH,aAYC;IAED;;;;;OAKG;IACH,eAFW,mBAAmB,QAe7B;IAED;;;;;;OAMG;IACH,aAHW,mBAAmB,UACnB,mBAAmB,QA0B7B;IAQD;;;;;OAKG;IACH,iBAHW,mBAAmB,GACjB,YAAY,CAaxB;IAED;;;OAGG;IACH,8BAEC;IAED;;OAEG;IACH,6BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAUC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,+BAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,4BAEC;IAED;;;OAGG;IACH,yBAIC;IAED;;;OAGG;IACH,6BAIC;IAED;;;OAGG;IACH,8EAIC;IAED;;;;;;OAMG;IACH,mCAOC;IAED;;OAEG;IACH,+BAcC;IAED;;;;;;;;;;;;;;OAcG;IACH;QAP+B,KAAK,EAAzB,UAAU;QACM,MAAM,EAAtB,MAAM;QACW,cAAc,GAA/B,MAAM;QAEoC,SAAS,GAAnD,0BAA0B,GAAC,IAAI;aA+DzC;IAk+BD,gBAsBC;;CACJ;yBA91DY,OAAO,8DAA8D,EAAE,UAAU;iCACjF,OAAO,0BAA0B,EAAE,kBAAkB;kCACrD,OAAO,2BAA2B,EAAE,mBAAmB;yCACvD,OAAO,uDAAuD,EAAE,0BAA0B;gCAjBzC,4BAA4B;6BAQtC,eAAe"}
1
+ {"version":3,"file":"GPUGeometrySDFManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js"],"names":[],"mappings":"AA+IA;;;;GAIG;AACH,uCAFU,MAAM,CAEuH;AAgDvI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH;IAsQI;;;OAGG;IACH,2CAFW,kBAAkB,EAS5B;IArQD;;;OAGG;IACH,aAAuB;IAEvB;;;OAGG;IACH,iBAA2B;IA6P3B;;;;OAIG;IACH,6BAEC;IAED;;;;;;OAMG;IACH,sBAHW,MAAM,cACN,MAAM,QAkChB;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,yBAEC;IAED;;;;;OAKG;IACH,gBAHW,mBAAmB,aACnB,OAAO,QAqBjB;IAED;;;;;OAKG;IACH,gBAHW,mBAAmB,aACnB,OAAO,QAqBjB;IAED;;OAEG;IACH,aAYC;IAED;;;;;OAKG;IACH,eAFW,mBAAmB,QAe7B;IAED;;;;;;OAMG;IACH,aAHW,mBAAmB,UACnB,mBAAmB,QA0B7B;IAQD;;;;;OAKG;IACH,iBAHW,mBAAmB,GACjB,YAAY,CAaxB;IAED;;;;;;OAMG;IACH,qBAHW,mBAAmB,GACjB,OAAO,CAInB;IAED;;;;;OAKG;IACH,wBAHW,mBAAmB,GACjB,OAAO,CAInB;IAED;;OAEG;IACH,mBAFW,aAAa,QAOvB;IAED;;OAEG;IACH,sBAFW,aAAa,QAQvB;IAED;;;;;;;;;;;OAWG;IACH,cALW,mBAAmB,SACnB,mBAAmB,GACjB,OAAO,CA4CnB;IAED;;;OAGG;IACH,8BAEC;IAED;;OAEG;IACH,6BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAUC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,+BAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,4BAEC;IAED;;;OAGG;IACH,yBAIC;IAED;;;OAGG;IACH,6BAIC;IAED;;;OAGG;IACH,8EAIC;IAED;;;;;;OAMG;IACH,mCAOC;IAED;;OAEG;IACH,+BAcC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH;QAT+B,KAAK,EAAzB,UAAU;QACM,MAAM,EAAtB,MAAM;QACW,cAAc,GAA/B,MAAM;QAEoC,SAAS,GAAnD,0BAA0B,GAAC,IAAI;QAEG,iBAAiB,GAAnD,kBAAkB,GAAC,IAAI;aA8EjC;IAwiCD,gBAsBC;;CACJ;yBAljEY,OAAO,8DAA8D,EAAE,UAAU;iCACjF,OAAO,0BAA0B,EAAE,kBAAkB;kCACrD,OAAO,2BAA2B,EAAE,mBAAmB;yCACvD,OAAO,uDAAuD,EAAE,0BAA0B;iCAC1F,OAAO,sCAAsC,EAAE,kBAAkB;;;;;;;;;;yBASvD,UAAU,KAAG,IAAI;;gCA3BsB,4BAA4B;6BAQf,eAAe"}
@@ -43,7 +43,7 @@ import { shader_mesh_cards_log } from "./cards/shader_mesh_cards_log.js";
43
43
  import { shader_mesh_cards_merge } from "./cards/shader_mesh_cards_merge.js";
44
44
  import { shader_mesh_cards_pages } from "./cards/shader_mesh_cards_pages.js";
45
45
  import { shader_mesh_cards_split } from "./cards/shader_mesh_cards_split.js";
46
- import { MESH_SDF_BRICK_TEXELS, MeshSDFState } from "./MESH_SDF.js";
46
+ import { MESH_SDF_BRICK_TEXELS, MESH_SDF_BRICK_VOXELS, MeshSDFState } from "./MESH_SDF.js";
47
47
  import { MESH_SDF_SAMPLER } from "./MESH_SDF_RESOURCES.js";
48
48
  import { MESH_SDF_STRUCT } from "./MESH_SDF_STRUCT.js";
49
49
  import { MeshSDFLayout } from "./MeshSDFLayout.js";
@@ -53,6 +53,16 @@ import { MeshSDFLayout } from "./MeshSDFLayout.js";
53
53
  * @typedef {import("../GPUGeometryManager.js").GPUGeometryManager} GPUGeometryManager
54
54
  * @typedef {import("../GPUGeometryMetadata.js").GPUGeometryMetadata} GPUGeometryMetadata
55
55
  * @typedef {import("../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext} GPUResidentMaterialContext
56
+ * @typedef {import("../../material/GPUMaterialManager.js").GPUMaterialManager} GPUMaterialManager
57
+ */
58
+
59
+ /**
60
+ * What makes caches for geometries the bake cannot bake from a tree of their own
61
+ * ({@link GPUGeometrySDFManager#add_source}): it learns what is asked for from `onRequested`, records its own work in
62
+ * each frame's graph ahead of the bake, and hands each cache in through `adopt`.
63
+ *
64
+ * @typedef {Object} MeshSDFSource
65
+ * @property {function(FrameGraph): void} graph_update records the source's work for the frame, ahead of the bake
56
66
  */
57
67
 
58
68
  /*
@@ -216,6 +226,12 @@ function grow_typed(array, length) {
216
226
  * {@link cards}, whose card sets — one per (geometry, material) pair — are captured after the bake,
217
227
  * `capture_budget` pages a frame.
218
228
  *
229
+ * **Sources** ({@link add_source}) make the caches of geometries with no tree of their own to bake from,
230
+ * a virtual geometry's: such a geometry waits queued, as one whose tree is not resident yet does. A
231
+ * source hears of each geometry queued ({@link onRequested}), records its own work each frame ahead of
232
+ * the bake, and bakes a proxy of it here as any geometry, whose resident cache it then gives the
233
+ * geometry ({@link adopt}).
234
+ *
219
235
  * **Readers** bind {@link headers}, {@link indirection}, {@link texture} and {@link MESH_SDF_SAMPLER}
220
236
  * (see {@link write_bindings}) and sample through `mesh_sdf_sample`, which only a resident header
221
237
  * should be given to.
@@ -240,6 +256,18 @@ export class GPUGeometrySDFManager {
240
256
  */
241
257
  onBaked = new Signal();
242
258
 
259
+ /**
260
+ * Sent with a geometry's record each time its cache is queued for a bake: what a source listens to.
261
+ * @type {Signal<GPUGeometryMetadata>}
262
+ */
263
+ onRequested = new Signal();
264
+
265
+ /**
266
+ * Run first in each {@link graph_bake}.
267
+ * @type {MeshSDFSource[]}
268
+ */
269
+ #sources = [];
270
+
243
271
  #voxel_size = 0.125;
244
272
  #max_bricks = 18;
245
273
 
@@ -265,6 +293,8 @@ export class GPUGeometrySDFManager {
265
293
  #card_pages = new Uint32Array(64);
266
294
  /** Words the placed layout keeps. */
267
295
  #card_words = new Uint32Array(64);
296
+ /** Texels a side of the layout's largest card: the grid's longest axis in voxels, plus one. */
297
+ #card_side = new Uint32Array(64);
268
298
 
269
299
  /**
270
300
  * The range each geometry's cards are being placed in.
@@ -522,8 +552,7 @@ export class GPUGeometrySDFManager {
522
552
  }
523
553
 
524
554
  if (this.#references[id] > 0 && state[id] === HOST_NONE) {
525
- state[id] = HOST_QUEUED;
526
- this.#queue.push(id);
555
+ this.#request(id);
527
556
  }
528
557
  }
529
558
 
@@ -569,8 +598,7 @@ export class GPUGeometrySDFManager {
569
598
  }
570
599
 
571
600
  if (++this.#references[id] === 1 && this.#state[id] === HOST_NONE) {
572
- this.#state[id] = HOST_QUEUED;
573
- this.#queue.push(id);
601
+ this.#request(id);
574
602
  }
575
603
 
576
604
  this.#holders_changed.push(id);
@@ -699,6 +727,103 @@ export class GPUGeometrySDFManager {
699
727
  }
700
728
  }
701
729
 
730
+ /**
731
+ * Whether a geometry's cache waits for its bake: queued, and not admitted. A cache whose last holder went is
732
+ * baked all the same until a {@link trim} drops it, as one admitted is.
733
+ *
734
+ * @param {GPUGeometryMetadata} record
735
+ * @returns {boolean}
736
+ */
737
+ is_requested(record) {
738
+ return this.#state[record.index] === HOST_QUEUED;
739
+ }
740
+
741
+ /**
742
+ * Whether a holder of a geometry's cache draws both sides of it: the side a bake of it takes.
743
+ *
744
+ * @param {GPUGeometryMetadata} record
745
+ * @returns {boolean}
746
+ */
747
+ holds_two_sided(record) {
748
+ return (this.#two_sided_references[record.index] ?? 0) > 0;
749
+ }
750
+
751
+ /**
752
+ * @param {MeshSDFSource} source run first in each {@link graph_bake} from here on
753
+ */
754
+ add_source(source) {
755
+ assert.defined(source, 'source');
756
+ assert.equal(this.#sources.includes(source), false, 'source added already');
757
+
758
+ this.#sources.push(source);
759
+ }
760
+
761
+ /**
762
+ * @param {MeshSDFSource} source
763
+ */
764
+ remove_source(source) {
765
+ const index = this.#sources.indexOf(source);
766
+
767
+ if (index !== -1) {
768
+ this.#sources.splice(index, 1);
769
+ }
770
+ }
771
+
772
+ /**
773
+ * Give `target` the resident cache baked for `proxy`: a source's hand-in, for a geometry with no tree of its own,
774
+ * of a proxy in the same local space baked as any geometry is. Nothing is copied. The target's header takes the
775
+ * proxy's layout, entries and side, and the proxy's reads None, as dropped; {@link onBaked} is sent with the
776
+ * target. The cache has no cards, the target having no tree to capture them with. Held for another side than the
777
+ * proxy was baked for, it is queued again at the next bake, as any cache is.
778
+ *
779
+ * @param {GPUGeometryMetadata} target waiting for its bake ({@link is_requested})
780
+ * @param {GPUGeometryMetadata} proxy whose cache is resident
781
+ * @returns {boolean} whether it was adopted: false, changing nothing, when `target` no longer waits or `proxy`'s
782
+ * cache is not resident
783
+ */
784
+ adopt(target, proxy) {
785
+ assert.defined(target, 'target');
786
+ assert.defined(proxy, 'proxy');
787
+ assert.notEqual(target.index, proxy.index, 'a geometry cannot adopt its own cache');
788
+
789
+ const id = target.index;
790
+ const from = proxy.index;
791
+
792
+ if (!this.is_requested(target) || this.#state[from] !== HOST_RESIDENT) {
793
+ return false;
794
+ }
795
+
796
+ this.#drop_cards(from);
797
+
798
+ const range = this.#ranges[from];
799
+
800
+ this.#ranges[id] = range;
801
+ this.#ranges[from] = null;
802
+ this.#brick_count[id] = this.#brick_count[from];
803
+ this.#two_sided[id] = this.#two_sided[from];
804
+ this.#generation[id]++;
805
+
806
+ this.#state[from] = HOST_NONE;
807
+ this.#state[id] = HOST_RESIDENT;
808
+
809
+ // the layout the proxy was admitted with: a configure since would have dropped its cache
810
+ const layout = this.#layout;
811
+
812
+ layout.compute(proxy.geometry.bounding_box, this.#voxel_size, this.#max_bricks);
813
+
814
+ this.#write_header(id, layout, range.offset + 1, MeshSDFState.Resident);
815
+
816
+ this.#word_scratch[0] = MeshSDFState.None;
817
+ this.#device.queue.writeBuffer(this.#headers, from * HEADER_BYTES + HEADER_STATE, this.#word_scratch, 0, 1);
818
+
819
+ // the side its holders draw is checked at the next bake
820
+ this.#holders_changed.push(id);
821
+
822
+ this.onBaked.send1(id);
823
+
824
+ return true;
825
+ }
826
+
702
827
  /**
703
828
  * Geometries whose layout was coarsened by the cap, of those baked: coarser than asked.
704
829
  * @returns {number}
@@ -857,8 +982,10 @@ export class GPUGeometrySDFManager {
857
982
  * captures nothing
858
983
  * @param {GPUResidentMaterialContext|null} [options.materials] what the capture shades with, as it
859
984
  * stands this frame; needed with a `capture_budget`
985
+ * @param {GPUMaterialManager|null} [options.material_contexts] what a raster capture draws with
986
+ * ({@link GPUMeshCardSets#capture_mode}); needed with a `capture_budget` in that mode
860
987
  */
861
- graph_bake({ graph, budget, capture_budget = 0, materials = null }) {
988
+ graph_bake({ graph, budget, capture_budget = 0, materials = null, material_contexts = null }) {
862
989
  assert.defined(graph, 'graph');
863
990
  assert.isPositiveInteger(budget, 'budget');
864
991
  assert.lessThanOrEqual(budget, MESH_SDF_BAKE_BUDGET_MAX, 'budget');
@@ -867,6 +994,13 @@ export class GPUGeometrySDFManager {
867
994
 
868
995
  this.#frame++;
869
996
 
997
+ // the sources first: a cache adopted here is not admitted to a bake of its own below
998
+ const sources = this.#sources;
999
+
1000
+ for (let i = 0; i < sources.length; i++) {
1001
+ sources[i].graph_update(graph);
1002
+ }
1003
+
870
1004
  this.#follow_sides();
871
1005
 
872
1006
  // the last bake's commands were submitted before this call: what they read may be handed out
@@ -880,12 +1014,12 @@ export class GPUGeometrySDFManager {
880
1014
 
881
1015
  const queued_bound = this.#read_queued + (this.#admitted_total - this.#read_admitted);
882
1016
 
883
- const has_work = this.#queue.length > 0
1017
+ const has_work = this.#admittable()
884
1018
  || queued_bound > 0
885
1019
  || this.#freed.length > 0
886
1020
  || this.#pushes.length > 0
887
1021
  || this.#fill_pending
888
- || this.#place_queue.length > 0
1022
+ || this.#placeable()
889
1023
  || this.#compact_queue.length > 0;
890
1024
 
891
1025
  let arena = -1;
@@ -916,7 +1050,15 @@ export class GPUGeometrySDFManager {
916
1050
  blas.meshlet_metadata = geometries.meshlets.buffer_metadata;
917
1051
  blas.meshlet_data = geometries.meshlets.buffer_data;
918
1052
 
919
- this.#cards.graph_capture({ graph, budget: capture_budget, arena, headers: this.#headers, materials, blas });
1053
+ this.#cards.graph_capture({
1054
+ graph,
1055
+ budget: capture_budget,
1056
+ arena,
1057
+ headers: this.#headers,
1058
+ materials,
1059
+ material_contexts,
1060
+ blas,
1061
+ });
920
1062
  }
921
1063
  }
922
1064
 
@@ -1008,9 +1150,7 @@ export class GPUGeometrySDFManager {
1008
1150
  }
1009
1151
 
1010
1152
  this.#drop(id);
1011
-
1012
- this.#state[id] = HOST_QUEUED;
1013
- this.#queue.push(id);
1153
+ this.#request(id);
1014
1154
  }
1015
1155
 
1016
1156
  changed.length = 0;
@@ -1084,12 +1224,69 @@ export class GPUGeometrySDFManager {
1084
1224
  this.#card_state[id] = CARDS_PLACED;
1085
1225
  this.#write_header_cards(id, target.offset);
1086
1226
 
1087
- this.#cards.set_layout(id, this.#card_pages[id]);
1227
+ this.#cards.set_layout(id, this.#card_pages[id], this.#card_side[id]);
1088
1228
  }
1089
1229
 
1090
1230
  queue.length = 0;
1091
1231
  }
1092
1232
 
1233
+ /**
1234
+ * Whether a queued geometry's tree is traceable, so that a bake could admit it. A geometry that
1235
+ * waits for its tree, or for a source's cache, records no bake while it waits. Drops from the queue
1236
+ * what was dropped, or adopted, since it was queued.
1237
+ *
1238
+ * @returns {boolean}
1239
+ */
1240
+ #admittable() {
1241
+ const queue = this.#queue;
1242
+ const blas = this.#geometries.blas;
1243
+
1244
+ let kept = 0;
1245
+ let admittable = false;
1246
+
1247
+ for (let i = 0; i < queue.length; i++) {
1248
+ const id = queue[i];
1249
+
1250
+ if (this.#state[id] !== HOST_QUEUED) {
1251
+ continue;
1252
+ }
1253
+
1254
+ queue[kept++] = id;
1255
+
1256
+ if (!admittable && blas.get_address(this.#records[id]) !== undefined) {
1257
+ admittable = true;
1258
+ }
1259
+ }
1260
+
1261
+ queue.length = kept;
1262
+
1263
+ return admittable;
1264
+ }
1265
+
1266
+ /**
1267
+ * Whether a resident geometry's cards wait for placement. Drops from the queue what was dropped, or
1268
+ * adopted away, since it was queued.
1269
+ *
1270
+ * @returns {boolean}
1271
+ */
1272
+ #placeable() {
1273
+ const queue = this.#place_queue;
1274
+
1275
+ let kept = 0;
1276
+
1277
+ for (let i = 0; i < queue.length; i++) {
1278
+ const id = queue[i];
1279
+
1280
+ if (this.#state[id] === HOST_RESIDENT && this.#card_state[id] === CARDS_QUEUED) {
1281
+ queue[kept++] = id;
1282
+ }
1283
+ }
1284
+
1285
+ queue.length = kept;
1286
+
1287
+ return kept > 0;
1288
+ }
1289
+
1093
1290
  /**
1094
1291
  * Admit queued geometries in request order: those whose tree is resident, while every brick they
1095
1292
  * could queue fits on the ring beside what may be on it already.
@@ -1153,7 +1350,7 @@ export class GPUGeometrySDFManager {
1153
1350
  this.#coarsened_count++;
1154
1351
  }
1155
1352
 
1156
- this.#write_header_baking(id, layout, range.offset + 1);
1353
+ this.#write_header(id, layout, range.offset + 1, MeshSDFState.Baking);
1157
1354
 
1158
1355
  // level 0's grid, which the cards are placed over
1159
1356
  const grid = layout.bricks;
@@ -1162,6 +1359,7 @@ export class GPUGeometrySDFManager {
1162
1359
  this.#placement_words[id] = placement.words;
1163
1360
  this.#placement_scratch[id] = placement.histograms;
1164
1361
  this.#placement_columns[id] = 2 * (grid[0] * grid[1] + grid[1] * grid[2] + grid[0] * grid[2]);
1362
+ this.#card_side[id] = Math.max(grid[0], grid[1], grid[2]) * MESH_SDF_BRICK_VOXELS + 1;
1165
1363
 
1166
1364
  this.#word_scratch[0] = count;
1167
1365
  this.#device.queue.writeBuffer(this.#indirection, range.offset * 4, this.#word_scratch, 0, 1);
@@ -1605,12 +1803,25 @@ export class GPUGeometrySDFManager {
1605
1803
  }
1606
1804
  }
1607
1805
 
1806
+ /**
1807
+ * Queue a held geometry's bake, and say so.
1808
+ *
1809
+ * @param {number} id
1810
+ */
1811
+ #request(id) {
1812
+ this.#state[id] = HOST_QUEUED;
1813
+ this.#queue.push(id);
1814
+
1815
+ this.onRequested.send1(this.#records[id]);
1816
+ }
1817
+
1608
1818
  /**
1609
1819
  * @param {number} id
1610
1820
  * @param {MeshSDFLayout} layout
1611
1821
  * @param {number} indirection
1822
+ * @param {MeshSDFState} state
1612
1823
  */
1613
- #write_header_baking(id, layout, indirection) {
1824
+ #write_header(id, layout, indirection, state) {
1614
1825
  const view = this.#header_scratch;
1615
1826
 
1616
1827
  for (let axis = 0; axis < 3; axis++) {
@@ -1622,7 +1833,7 @@ export class GPUGeometrySDFManager {
1622
1833
  view.setUint32(HEADER_LEVEL_COUNT, layout.level_count, true);
1623
1834
  view.setUint32(HEADER_INDIRECTION, indirection, true);
1624
1835
  view.setUint32(HEADER_CARDS, GPU_DATABASE_NULL, true);
1625
- view.setUint32(HEADER_STATE, MeshSDFState.Baking, true);
1836
+ view.setUint32(HEADER_STATE, state, true);
1626
1837
  view.setUint32(HEADER_SOURCE, GPU_DATABASE_NULL, true);
1627
1838
  view.setUint32(HEADER_GENERATION, this.#generation[id], true);
1628
1839
  view.setUint32(HEADER_TWO_SIDED, this.#two_sided[id], true);
@@ -1665,6 +1876,7 @@ export class GPUGeometrySDFManager {
1665
1876
  this.#placement_columns = grow_typed(this.#placement_columns, length);
1666
1877
  this.#card_pages = grow_typed(this.#card_pages, length);
1667
1878
  this.#card_words = grow_typed(this.#card_words, length);
1879
+ this.#card_side = grow_typed(this.#card_side, length);
1668
1880
  }
1669
1881
 
1670
1882
  #ensure_device() {
@@ -33,6 +33,10 @@ export const MESH_CARD_CAPTURE_BUDGET_MAX: number;
33
33
  * the order they were asked for, then recaptures in the order queued. A card set's pages may span
34
34
  * frames. {@link recapture} queues a resident card set again, which reads its last capture until the
35
35
  * new one is done; a card set whose capture is under way starts it again.
36
+ *
37
+ * **Modes** ({@link capture_mode}). A traced card set is a run of pages, a thread a texel. A
38
+ * rastered one is taken whole: its cards are drawn into a region of a scratch, a cell a card, and its
39
+ * pages scattered from there into the atlas; the frame's last one may take the budget past its end.
36
40
  */
37
41
  export class GPUMeshCardSets {
38
42
  /**
@@ -79,6 +83,17 @@ export class GPUMeshCardSets {
79
83
  * @returns {number}
80
84
  */
81
85
  get pages_queued(): number;
86
+ /**
87
+ * A change captures every card set again in the new mode: resident ones read their last capture
88
+ * until it is done, and captures under way start again.
89
+ *
90
+ * @param {MeshCardCaptureMode} mode
91
+ */
92
+ set capture_mode(mode: number);
93
+ /**
94
+ * @returns {MeshCardCaptureMode}
95
+ */
96
+ get capture_mode(): number;
82
97
  /**
83
98
  * Whether readers may use the card set: captured at least once, and its layout still there.
84
99
  *
@@ -127,8 +142,10 @@ export class GPUMeshCardSets {
127
142
  *
128
143
  * @param {number} geometry
129
144
  * @param {number} pages
145
+ * @param {number} side texels a side of the layout's largest card: its grid's longest axis in
146
+ * voxels, plus one, the lattice having a point at either end
130
147
  */
131
- set_layout(geometry: number, pages: number): void;
148
+ set_layout(geometry: number, pages: number, side: number): void;
132
149
  /**
133
150
  * A geometry's layout is gone: its card sets wait for the next.
134
151
  *
@@ -145,15 +162,19 @@ export class GPUMeshCardSets {
145
162
  * @param {number} options.budget pages captured at most, `card_capture_budget`
146
163
  * @param {number} options.arena graph handle of the arena, as the frame's bake left it
147
164
  * @param {GPUBuffer} options.headers
148
- * @param {GPUResidentMaterialContext} options.materials
149
- * @param {Object} options.blas the geometry bindings `ray_query_blas_nearest` reads
165
+ * @param {GPUResidentMaterialContext} options.materials what the trace shades with
166
+ * @param {GPUMaterialManager} options.material_contexts what the raster draws with: each
167
+ * material's template and bind group
168
+ * @param {Object} options.blas the geometry bindings `ray_query_blas_nearest` reads, whose
169
+ * geometry and meshlet buffers the raster pulls vertices from
150
170
  */
151
- graph_capture({ graph, budget, arena, headers, materials, blas }: {
171
+ graph_capture({ graph, budget, arena, headers, materials, material_contexts, blas }: {
152
172
  graph: FrameGraph;
153
173
  budget: number;
154
174
  arena: number;
155
175
  headers: GPUBuffer;
156
176
  materials: GPUResidentMaterialContext;
177
+ material_contexts: GPUMaterialManager;
157
178
  blas: any;
158
179
  }): void;
159
180
  /**
@@ -166,6 +187,8 @@ export class GPUMeshCardSets {
166
187
  export type FrameGraph = import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
167
188
  export type ShadeMaterial = import("../../../material/ShadeMaterial.js").ShadeMaterial;
168
189
  export type GPUResidentMaterialContext = import("../../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext;
190
+ export type GPUMaterialManager = import("../../../material/GPUMaterialManager.js").GPUMaterialManager;
191
+ export type GPUMaterialContext = import("../../../material/GPUMaterialContext.js").GPUMaterialContext;
169
192
  export type Allocation = import("../../../../../core/binary/allocator/OffsetAllocator.js").Allocation;
170
193
  import { GPUTileAtlas2D } from "../../../texture/atlas/GPUTileAtlas2D.js";
171
194
  //# sourceMappingURL=GPUMeshCardSets.d.ts.map