@woosh/meep-engine 3.60.5 → 3.60.7

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 (376) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +1 -1
  4. package/src/core/binary/BitSet.d.ts.map +1 -1
  5. package/src/core/binary/BitSet.js +2 -1
  6. package/src/{format/image/avif/av1/util → core/binary/operations}/ceil_log2.d.ts +2 -2
  7. package/src/core/binary/operations/ceil_log2.d.ts.map +1 -0
  8. package/src/{format/image/avif/av1/util → core/binary/operations}/ceil_log2.js +18 -18
  9. package/src/core/binary/zstd/ZstdReverseBitReader.d.ts.map +1 -1
  10. package/src/core/binary/zstd/ZstdReverseBitReader.js +225 -223
  11. package/src/core/binary/zstd/zstd_fse.d.ts.map +1 -1
  12. package/src/core/binary/zstd/zstd_fse.js +267 -265
  13. package/src/core/binary/zstd/zstd_huffman.d.ts.map +1 -1
  14. package/src/core/binary/zstd/zstd_huffman.js +246 -244
  15. package/src/core/bvh2/binary/2/BinaryUint32BVH.d.ts.map +1 -1
  16. package/src/core/bvh2/binary/2/BinaryUint32BVH.js +8 -2
  17. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.d.ts.map +1 -1
  18. package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +8 -7
  19. package/src/core/collection/PairUint32Map.d.ts.map +1 -1
  20. package/src/core/collection/PairUint32Map.js +2 -2
  21. package/src/core/collection/Uint32Map.d.ts.map +1 -1
  22. package/src/core/collection/Uint32Map.js +2 -4
  23. package/src/core/collection/heap/FibonacciHeap.d.ts.map +1 -1
  24. package/src/core/collection/heap/FibonacciHeap.js +2 -1
  25. package/src/core/geom/2d/r-tree/StaticR2Tree.d.ts.map +1 -1
  26. package/src/core/geom/2d/r-tree/StaticR2Tree.js +8 -2
  27. package/src/core/geom/3d/shape/util/mesh_compute_triangle_edge_flags.d.ts.map +1 -1
  28. package/src/core/geom/3d/shape/util/mesh_compute_triangle_edge_flags.js +2 -3
  29. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
  30. package/src/engine/graphics/texture/atlas/TextureAtlas.js +13 -14
  31. package/src/engine/graphics/texture/atlas/sprite_atlas_border.d.ts.map +1 -1
  32. package/src/engine/graphics/texture/atlas/sprite_atlas_border.js +70 -69
  33. package/src/engine/graphics/texture/reflection/convolve_equirectangular_reflection.d.ts.map +1 -1
  34. package/src/engine/graphics/texture/reflection/convolve_equirectangular_reflection.js +2 -1
  35. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  36. package/src/engine/graphics3/GPUParticleEmitterSystem.js +2 -1
  37. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  38. package/src/engine/graphics3/decal/GPUDecalRenderer.js +2 -1
  39. package/src/engine/graphics3/decal/chunk_decal_record.d.ts +14 -0
  40. package/src/engine/graphics3/decal/chunk_decal_record.d.ts.map +1 -0
  41. package/src/engine/graphics3/decal/chunk_decal_record.js +44 -0
  42. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  43. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +2 -15
  44. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  45. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +3 -16
  46. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  47. package/src/engine/graphics3/decal/shader_decal_composite.js +3 -23
  48. package/src/engine/graphics3/terrain/TERRAIN_MATERIAL_TEMPLATE.d.ts.map +1 -1
  49. package/src/engine/graphics3/terrain/TERRAIN_MATERIAL_TEMPLATE.js +2 -1
  50. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  51. package/src/engine/physics/queries/shape_cast.js +2 -2
  52. package/src/format/image/avif/av1/decode/decode_palette.js +442 -442
  53. package/src/format/image/avif/av1/entropy/SymbolWriter.d.ts.map +1 -1
  54. package/src/format/image/avif/av1/entropy/SymbolWriter.js +2 -1
  55. package/src/generation/foliage/material/foliage_tile.d.ts.map +1 -1
  56. package/src/generation/foliage/material/foliage_tile.js +2 -1
  57. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  58. package/src/shade/device/mock/SoftwareGPUDevice.js +6 -13
  59. package/src/shade/playground/caldera/main.js +3 -2
  60. package/src/shade/playground/probe_clipmap/README.md +2 -1
  61. package/src/shade/playground/probe_clipmap/index.html +7 -2
  62. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  63. package/src/shade/playground/probe_clipmap/main.js +17 -7
  64. package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.d.ts.map +1 -1
  65. package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.js +7 -13
  66. package/src/shade/playground/vgeo_scene/main.js +2 -1
  67. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -1
  68. package/src/shade/playground/vsm/VSMDebugOverlay.js +3 -1
  69. package/src/shade/renderer/Renderer.d.ts +11 -0
  70. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  71. package/src/shade/renderer/Renderer.js +43 -1
  72. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  73. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  74. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  75. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  76. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_coarsest.d.ts.map +1 -1
  77. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_coarsest.js +5 -4
  78. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.d.ts.map +1 -1
  79. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_residual_restrict.js +168 -166
  80. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.d.ts.map +1 -1
  81. package/src/shade/renderer/fluid/pressure/shader_fluid_mg_smooth.js +221 -219
  82. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  83. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  84. package/src/shade/renderer/fow/shader_fog_of_war.js +8 -19
  85. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +26 -43
  86. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  87. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +115 -123
  88. package/src/shade/renderer/geometry/sdf/MeshSDFLayout.d.ts.map +1 -1
  89. package/src/shade/renderer/geometry/sdf/MeshSDFLayout.js +2 -1
  90. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +20 -2
  91. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  92. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +66 -2
  93. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts +19 -0
  94. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts.map +1 -0
  95. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.js +25 -0
  96. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  97. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +2 -1
  98. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -1
  99. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +2 -1
  100. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +15 -0
  101. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -1
  102. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +38 -0
  103. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +28 -59
  104. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -1
  105. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +84 -789
  106. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode_from_storage.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode_from_storage.js +10 -31
  108. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode_to_storage.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode_to_storage.js +9 -15
  110. package/src/shade/renderer/global_illumination/clipmap/shader_debug_clipmap.d.ts +2 -1
  111. package/src/shade/renderer/global_illumination/clipmap/shader_debug_clipmap.d.ts.map +1 -1
  112. package/src/shade/renderer/global_illumination/clipmap/shader_debug_clipmap.js +6 -5
  113. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  114. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +2 -1
  115. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +15 -3
  116. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  117. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +168 -18
  118. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +2 -1
  119. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  120. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +2 -1
  121. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +98 -57
  122. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  123. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +168 -77
  124. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +4 -2
  125. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
  126. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +27 -12
  127. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -1
  128. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +12 -7
  129. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
  130. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +8 -2
  131. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -2
  132. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -2
  133. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts.map +1 -1
  134. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +5 -2
  135. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.js +1 -1
  136. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -1
  137. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +5 -3
  138. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.js +1 -1
  139. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -1
  140. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +1 -1
  141. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.d.ts.map +1 -1
  142. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_movers_command.js +4 -2
  143. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.d.ts.map +1 -1
  144. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_scroll.js +1 -1
  145. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.d.ts.map +1 -1
  146. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_store.js +1 -1
  147. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.d.ts.map +1 -1
  148. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_take.js +3 -1
  149. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_cards.js +2 -2
  150. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +114 -41
  151. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  152. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +424 -207
  153. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +34 -25
  154. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  155. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +41 -31
  156. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.d.ts +7 -5
  157. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.d.ts.map +1 -1
  158. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.js +7 -5
  159. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapHitWants.d.ts +47 -0
  160. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapHitWants.d.ts.map +1 -0
  161. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapHitWants.js +84 -0
  162. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.d.ts +48 -0
  163. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.d.ts.map +1 -0
  164. package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.js +101 -0
  165. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +58 -4
  166. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  167. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +127 -30
  168. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts +18 -7
  169. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts.map +1 -1
  170. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.js +39 -13
  171. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts +29 -8
  172. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts.map +1 -1
  173. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +112 -56
  174. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resample.d.ts +19 -0
  175. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resample.d.ts.map +1 -0
  176. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resample.js +35 -0
  177. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
  178. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +9 -3
  179. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +3 -3
  180. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +5 -5
  181. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +8 -12
  182. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  183. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +23 -56
  184. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +0 -3
  185. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
  186. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +11 -15
  187. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_bounce.d.ts +26 -0
  188. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_bounce.d.ts.map +1 -0
  189. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_bounce.js +173 -0
  190. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_candidate.d.ts +32 -0
  191. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_candidate.d.ts.map +1 -0
  192. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_candidate.js +166 -0
  193. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +3 -4
  194. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
  195. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +3 -4
  196. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts.map +1 -1
  197. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.js +3 -1
  198. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +6 -12
  199. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
  200. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +15 -65
  201. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts.map +1 -1
  202. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.js +7 -2
  203. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +4 -4
  204. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
  205. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +24 -17
  206. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.d.ts +7 -5
  207. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.d.ts.map +1 -1
  208. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_publish.js +18 -10
  209. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts +2 -2
  210. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts.map +1 -1
  211. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.js +9 -5
  212. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts +3 -0
  213. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts.map +1 -1
  214. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +9 -6
  215. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.d.ts +1 -1
  216. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.d.ts.map +1 -1
  217. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.js +16 -16
  218. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample_rays.d.ts +36 -0
  219. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample_rays.d.ts.map +1 -0
  220. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample_rays.js +233 -0
  221. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
  222. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +7 -5
  223. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  224. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +5 -3
  225. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  226. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +10 -4
  227. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +2 -1
  228. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -1
  229. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +12 -6
  230. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +1 -2
  231. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -1
  232. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +5 -6
  233. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +14 -18
  234. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -1
  235. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +25 -35
  236. package/src/shade/renderer/gpu_primitive/WEBGPU_GUARANTEED_MAX_UNIFORM_BUFFER_BINDING_SIZE.d.ts +13 -0
  237. package/src/shade/renderer/gpu_primitive/WEBGPU_GUARANTEED_MAX_UNIFORM_BUFFER_BINDING_SIZE.d.ts.map +1 -0
  238. package/src/shade/renderer/gpu_primitive/WEBGPU_GUARANTEED_MAX_UNIFORM_BUFFER_BINDING_SIZE.js +12 -0
  239. package/src/shade/renderer/gpu_primitive/hash_table/cpu_build_hash_table.d.ts +27 -2
  240. package/src/shade/renderer/gpu_primitive/hash_table/cpu_build_hash_table.d.ts.map +1 -1
  241. package/src/shade/renderer/gpu_primitive/hash_table/cpu_build_hash_table.js +62 -6
  242. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
  243. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +10 -19
  244. package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.d.ts.map +1 -1
  245. package/src/shade/renderer/gpu_primitive/indirect/chunk_folded_dispatch.js +6 -3
  246. package/src/shade/renderer/hiz/hzb_pick_alignment.d.ts.map +1 -1
  247. package/src/shade/renderer/hiz/hzb_pick_alignment.js +149 -148
  248. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.d.ts.map +1 -1
  249. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.js +4 -2
  250. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_log_floor.d.ts.map +1 -1
  251. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_log_floor.js +6 -5
  252. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_project.d.ts.map +1 -1
  253. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_project.js +3 -1
  254. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_reference_reflectance.d.ts.map +1 -1
  255. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_reference_reflectance.js +3 -1
  256. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_solve.d.ts.map +1 -1
  257. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_solve.js +3 -1
  258. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts +0 -5
  259. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.d.ts.map +1 -1
  260. package/src/shade/renderer/light/world_cluster/WORLD_LIGHT_CLUSTER.js +0 -7
  261. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +15 -2
  262. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -1
  263. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +51 -16
  264. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -1
  265. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +3 -2
  266. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  267. package/src/shade/renderer/material/GPUMaterialManager.d.ts +4 -1
  268. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  269. package/src/shade/renderer/material/GPUMaterialManager.js +5 -8
  270. package/src/shade/renderer/postprocess/dof/raymarch/chunk_dof_lds_coc_cache.d.ts +17 -0
  271. package/src/shade/renderer/postprocess/dof/raymarch/chunk_dof_lds_coc_cache.d.ts.map +1 -0
  272. package/src/shade/renderer/postprocess/dof/raymarch/chunk_dof_lds_coc_cache.js +81 -0
  273. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  274. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +5 -48
  275. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  276. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +4 -44
  277. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +7 -3
  278. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  279. package/src/shade/renderer/postprocess/gtao/GTAO.js +26 -13
  280. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts +14 -0
  281. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  282. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +196 -68
  283. package/src/shade/renderer/postprocess/gtao/chunk_integrate_lighting_sample.d.ts.map +1 -1
  284. package/src/shade/renderer/postprocess/gtao/chunk_integrate_lighting_sample.js +4 -1
  285. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  286. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +42 -28
  287. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  288. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +430 -414
  289. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts +16 -0
  290. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts.map +1 -0
  291. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.js +156 -0
  292. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  293. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.d.ts.map +1 -1
  294. package/src/shade/renderer/postprocess/nss/chunk_nss_luma_derivative.js +5 -7
  295. package/src/shade/renderer/postprocess/nss/chunk_nss_tonemap.d.ts +17 -0
  296. package/src/shade/renderer/postprocess/nss/chunk_nss_tonemap.d.ts.map +1 -0
  297. package/src/shade/renderer/postprocess/nss/chunk_nss_tonemap.js +56 -0
  298. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  299. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +2 -22
  300. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  301. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +2 -13
  302. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  303. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +10 -13
  304. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts.map +1 -1
  305. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.js +39 -38
  306. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
  307. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +7 -12
  308. package/src/shade/renderer/scene/GPUSceneContext.d.ts +2 -2
  309. package/src/shade/renderer/scene/GPUSceneContext.js +5 -5
  310. package/src/shade/renderer/shader/chunk/clipmap/CLIPMAP_LEVEL_STRUCT.d.ts +8 -6
  311. package/src/shade/renderer/shader/chunk/clipmap/CLIPMAP_LEVEL_STRUCT.d.ts.map +1 -1
  312. package/src/shade/renderer/shader/chunk/clipmap/CLIPMAP_LEVEL_STRUCT.js +10 -7
  313. package/src/shade/renderer/shader/chunk/clipmap/chunk_clipmap_key.d.ts +16 -0
  314. package/src/shade/renderer/shader/chunk/clipmap/chunk_clipmap_key.d.ts.map +1 -0
  315. package/src/shade/renderer/shader/chunk/clipmap/chunk_clipmap_key.js +35 -0
  316. package/src/shade/renderer/shader/chunk/clipmap/chunk_clipmap_select_finest.d.ts +5 -2
  317. package/src/shade/renderer/shader/chunk/clipmap/chunk_clipmap_select_finest.d.ts.map +1 -1
  318. package/src/shade/renderer/shader/chunk/clipmap/chunk_clipmap_select_finest.js +27 -18
  319. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh2_color_get_irradiance_at.d.ts.map +1 -1
  320. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh2_color_get_irradiance_at.js +5 -15
  321. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh3_convolve_with_cosine_kernel.d.ts.map +1 -1
  322. package/src/shade/renderer/shader/chunk/spherical_harmonics/chunk_sh3_convolve_with_cosine_kernel.js +5 -19
  323. package/src/shade/renderer/shader/chunk/spherical_harmonics/dering/chunk_sh3_windowing.d.ts.map +1 -1
  324. package/src/shade/renderer/shader/chunk/spherical_harmonics/dering/chunk_sh3_windowing.js +3 -22
  325. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts.map +1 -1
  326. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.js +2 -1
  327. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.d.ts.map +1 -1
  328. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_shadow_group_list.js +154 -152
  329. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -1
  330. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +2 -1
  331. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts +3 -1
  332. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.d.ts.map +1 -1
  333. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP.js +4 -3
  334. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts +7 -1
  335. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.d.ts.map +1 -1
  336. package/src/shade/renderer/volumetrics/irradiance_clipmap/IRRADIANCE_CLIPMAP_STRUCT.js +54 -47
  337. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.d.ts.map +1 -1
  338. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_sample.js +371 -370
  339. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  340. package/src/shade/renderer/water/GPUWaterRenderer.js +2 -1
  341. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  342. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -1
  343. package/src/shade/renderer/water/surface/lod/shader_water_lod.js +12 -14
  344. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  345. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +2 -9
  346. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
  347. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +2 -1
  348. package/src/shade/renderer/wind/WIND_FIELD.d.ts +3 -1
  349. package/src/shade/renderer/wind/WIND_FIELD.d.ts.map +1 -1
  350. package/src/shade/renderer/wind/WIND_FIELD.js +4 -3
  351. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts +8 -2
  352. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts.map +1 -1
  353. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.js +11 -4
  354. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +2 -2
  355. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
  356. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +13 -4
  357. package/src/shade/util/texture_mip_extent.d.ts.map +1 -1
  358. package/src/shade/util/texture_mip_extent.js +88 -87
  359. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  360. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +9 -7
  361. package/src/format/image/avif/av1/util/ceil_log2.d.ts.map +0 -1
  362. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +0 -47
  363. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +0 -1
  364. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +0 -80
  365. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +0 -16
  366. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +0 -1
  367. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +0 -67
  368. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +0 -17
  369. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +0 -1
  370. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +0 -145
  371. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +0 -12
  372. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +0 -1
  373. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +0 -105
  374. package/src/shade/renderer/shader/chunk/color/chunk_hash_squirrel3.d.ts +0 -1
  375. package/src/shade/renderer/shader/chunk/color/chunk_hash_squirrel3.d.ts.map +0 -1
  376. package/src/shade/renderer/shader/chunk/color/chunk_hash_squirrel3.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"graph_build_world_light_clusters.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js"],"names":[],"mappings":"AAoDA;;;;GAIG;AACH,sEAFW,eAAe,QAMzB;AAED;;;;;;;;;;;;;;;GAeG;AACH;IAXsG,KAAK,EAAhG,OAAO,8DAA8D,EAAE,UAAU;IAClB,MAAM,EAArE,OAAO,0BAA0B,EAAE,kBAAkB;IACrC,MAAM,EAAtB,MAAM;IAEU,aAAa,EAA7B,MAAM;IACU,MAAM,EAAtB,MAAM;IAEqB,YAAY,EAAvC,UAAU,MAAM,CAAC;IACU,YAAY,EAAvC,UAAU,MAAM,CAAC;IACf;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CA6H1C;8BAlLY,OAAO,6CAA6C,EAAE,eAAe"}
1
+ {"version":3,"file":"graph_build_world_light_clusters.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js"],"names":[],"mappings":"AAsCA;;;;GAIG;AACH,gEAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;GAKG;AACH,8DAHW,MAAM,GACJ,MAAM,CAKlB;AA4BD;;;;GAIG;AACH,sEAFW,eAAe,QAMzB;AAED;;;;;;;;;;;;;;;GAeG;AACH;IAXsG,KAAK,EAAhG,OAAO,8DAA8D,EAAE,UAAU;IAClB,MAAM,EAArE,OAAO,0BAA0B,EAAE,kBAAkB;IACrC,MAAM,EAAtB,MAAM;IAEU,aAAa,EAA7B,MAAM;IACU,MAAM,EAAtB,MAAM;IAEqB,YAAY,EAAvC,UAAU,MAAM,CAAC;IACU,YAAY,EAAvC,UAAU,MAAM,CAAC;IACf;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAgI1C;8BAtNY,OAAO,6CAA6C,EAAE,eAAe"}
@@ -17,7 +17,6 @@ import {
17
17
  WORLD_LIGHT_CLUSTER_CULL_SETTINGS,
18
18
  WORLD_LIGHT_CLUSTER_GRID_SIZE,
19
19
  WORLD_LIGHT_CLUSTER_LIGHT_CAPACITY,
20
- WORLD_LIGHT_CLUSTER_MAX_CASCADES,
21
20
  WORLD_LIGHT_CLUSTER_MAX_LIGHTS_PER_CELL,
22
21
  } from "./WORLD_LIGHT_CLUSTER.js";
23
22
 
@@ -37,18 +36,51 @@ const PROXIES_DESCRIPTOR = BufferResourceDescriptor.from(
37
36
  GPUBufferUsage.STORAGE,
38
37
  );
39
38
 
40
- const LOOKUP_DESCRIPTOR = BufferResourceDescriptor.from(
41
- WORLD_LIGHT_CLUSTER_MAX_CASCADES * WORLD_LIGHT_CLUSTER_CELLS_PER_CASCADE * LIGHT_CLUSTER_METADATA.aligned_size,
42
- GPUBufferUsage.STORAGE,
43
- );
39
+ /**
40
+ * Bytes of the cluster lookup over a clipmap of so many cascades.
41
+ * @param {number} cascade_count
42
+ * @returns {number}
43
+ */
44
+ export function world_light_clusters_lookup_size(cascade_count) {
45
+ return cascade_count * WORLD_LIGHT_CLUSTER_CELLS_PER_CASCADE * LIGHT_CLUSTER_METADATA.aligned_size;
46
+ }
44
47
 
45
- const DATA_DESCRIPTOR = BufferResourceDescriptor.from(
46
- COLLECTION_U32_STRUCT_WRITE.size
47
- + WORLD_LIGHT_CLUSTER_MAX_CASCADES * WORLD_LIGHT_CLUSTER_CELLS_PER_CASCADE * WORLD_LIGHT_CLUSTER_MAX_LIGHTS_PER_CELL * u32.size,
48
- GPUBufferUsage.STORAGE,
49
- 0,
50
- 16,
51
- );
48
+ /**
49
+ * Bytes of the cluster data over a clipmap of so many cascades: the larger of the two, which a host
50
+ * checks against the device's `maxStorageBufferBindingSize` for the cascades it builds.
51
+ * @param {number} cascade_count
52
+ * @returns {number}
53
+ */
54
+ export function world_light_clusters_data_size(cascade_count) {
55
+ return COLLECTION_U32_STRUCT_WRITE.size
56
+ + cascade_count * WORLD_LIGHT_CLUSTER_CELLS_PER_CASCADE * WORLD_LIGHT_CLUSTER_MAX_LIGHTS_PER_CELL * u32.size;
57
+ }
58
+
59
+ /**
60
+ * The lookup's and the data's descriptors by cascade count, made once a count: a clipmap's count is
61
+ * its structure, so a frame meets the one it met before.
62
+ * @type {Map<number, {lookup: BufferResourceDescriptor, data: BufferResourceDescriptor}>}
63
+ */
64
+ const descriptors_by_cascade_count = new Map();
65
+
66
+ /**
67
+ * @param {number} cascade_count
68
+ * @returns {{lookup: BufferResourceDescriptor, data: BufferResourceDescriptor}}
69
+ */
70
+ function descriptors_for(cascade_count) {
71
+ let descriptors = descriptors_by_cascade_count.get(cascade_count);
72
+
73
+ if (descriptors === undefined) {
74
+ descriptors = {
75
+ lookup: BufferResourceDescriptor.from(world_light_clusters_lookup_size(cascade_count), GPUBufferUsage.STORAGE),
76
+ data: BufferResourceDescriptor.from(world_light_clusters_data_size(cascade_count), GPUBufferUsage.STORAGE, 0, 16),
77
+ };
78
+
79
+ descriptors_by_cascade_count.set(cascade_count, descriptors);
80
+ }
81
+
82
+ return descriptors;
83
+ }
52
84
 
53
85
  /**
54
86
  * Offer the pipelines {@link graph_build_world_light_clusters} dispatches — see {@link PipelineEnquiry}.
@@ -68,8 +100,8 @@ export function enquire_build_world_light_clusters_pipelines(enquiry) {
68
100
  * @param {object} options
69
101
  * @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
70
102
  * @param {import("../GPULightCollection.js").GPULightCollection} options.lights
71
- * @param {number} options.levels graph handle of a uniform that starts with the clipmap's cascade windows,
72
- * a `CLIPMAP_LEVEL_ARRAY`
103
+ * @param {number} options.levels graph handle of a buffer that starts with the clipmap's cascade windows,
104
+ * `cascade_count` `CLIPMAP_LEVEL_STRUCT`s, finest first, read as storage
73
105
  * @param {number} options.cascade_count active cascade count
74
106
  * @param {number} options.border cells of its own past each face of a cascade's window that its cluster
75
107
  * cells cover too
@@ -193,8 +225,11 @@ export function graph_build_world_light_clusters({
193
225
  assign_data.levels = assign_pass.read(levels);
194
226
  assign_data.culled_lights = assign_pass.read(cull_data.culled_lights);
195
227
  assign_data.proxies = assign_pass.read(cull_data.proxies);
196
- assign_data.lookup = assign_pass.create("World cluster / lookup", LOOKUP_DESCRIPTOR);
197
- assign_data.data = assign_pass.create("World cluster / data", DATA_DESCRIPTOR);
228
+ // a clipmap of no cascade still binds a lookup and data, of one cascade
229
+ const descriptors = descriptors_for(Math.max(cascade_count, 1));
230
+
231
+ assign_data.lookup = assign_pass.create("World cluster / lookup", descriptors.lookup);
232
+ assign_data.data = assign_pass.create("World cluster / data", descriptors.data);
198
233
 
199
234
  return {
200
235
  lookup: assign_data.lookup,
@@ -1 +1 @@
1
- {"version":3,"file":"shader_world_cluster_assign_lights.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js"],"names":[],"mappings":"AAqBA,oEAA4E;AAI5E;;GAEG;AACH,4CAFU,YAAY,CAOW;AAmIjC;;;;;;;GAOG;AACH,iDAFU,aAAa,CAMpB;6BAvK0B,mCAAmC;8BAJlC,+BAA+B"}
1
+ {"version":3,"file":"shader_world_cluster_assign_lights.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js"],"names":[],"mappings":"AAqBA,oEAA4E;AAI5E;;GAEG;AACH,4CAFU,YAAY,CAOW;AAoIjC;;;;;;;GAOG;AACH,iDAFU,aAAa,CAMpB;6BAxK0B,mCAAmC;8BAJlC,+BAA+B"}
@@ -1,6 +1,6 @@
1
1
  import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
2
2
  import { COLLECTION_U32_STRUCT_WRITE } from "../../gpu_primitive/COLLECTION_U32_STRUCT_WRITE.js";
3
- import { CLIPMAP_LEVEL_ARRAY, CLIPMAP_LEVEL_STRUCT } from "../../shader/chunk/clipmap/CLIPMAP_LEVEL_STRUCT.js";
3
+ import { CLIPMAP_LEVEL_STRUCT } from "../../shader/chunk/clipmap/CLIPMAP_LEVEL_STRUCT.js";
4
4
  import { chunk_grid3d_to_index } from "../../shader/chunk/grid/chunk_grid3d_to_index.js";
5
5
  import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
6
6
  import { ComputeShader } from "../../shader/ComputeShader.js";
@@ -38,7 +38,8 @@ const resources = new ShaderResourceSetDescriptor();
38
38
  resources.setImmediate("settings", WORLD_CLUSTER_ASSIGN_SETTINGS);
39
39
 
40
40
  resources.createGroup()
41
- .addUniform("levels", CLIPMAP_LEVEL_ARRAY)
41
+ // read from the front of whatever buffer holds the clipmap's windows, however many it has
42
+ .addStorageBuffer("levels", WebGPUArray.from(CLIPMAP_LEVEL_STRUCT), false)
42
43
  .addStorageBuffer("culled_lights", COLLECTION_U32_STRUCT_READ, false)
43
44
  .addStorageBuffer("proxies", WebGPUArray.from(CLUSTER_LIGHT_PROXY), false)
44
45
  .addStorageBuffer("world_cluster_lookup", LIGHT_CLUSTER_LOOKUP_STRUCT, true)
@@ -13,7 +13,7 @@ export class TinyGltf {
13
13
  * @readonly
14
14
  * @type {TextureFormat}
15
15
  */
16
- static readonly "__#302@#UNCOMPRESSED_TARGET": TextureFormat;
16
+ static readonly "__#304@#UNCOMPRESSED_TARGET": TextureFormat;
17
17
  /**
18
18
  * @param {AssetManager} assetManager
19
19
  * @param {AssetRequestScope} [scope]
@@ -38,13 +38,16 @@ export class GPUMaterialManager {
38
38
  * @param {GPUViewContext} options.view
39
39
  * @param {number} options.texture_viz_mesh
40
40
  * @param {number} options.texture_viz_triangle
41
+ * @param {number} options.texture_normal the normal target to write, `rgba16uint` at the view's
42
+ * resolution. The caller owns it so that it outlives the frame: reprojection reads last frame's.
41
43
  * @returns {{g_pbr: number, g_normal: number, g_albedo: number, g_emissive: number}} updated g-buffer
42
44
  */
43
- graph_viz_render({ graph, view, texture_viz_mesh, texture_viz_triangle, }: {
45
+ graph_viz_render({ graph, view, texture_viz_mesh, texture_viz_triangle, texture_normal, }: {
44
46
  graph: FrameGraph;
45
47
  view: GPUViewContext;
46
48
  texture_viz_mesh: number;
47
49
  texture_viz_triangle: number;
50
+ texture_normal: number;
48
51
  }): {
49
52
  g_pbr: number;
50
53
  g_normal: number;
@@ -1 +1 @@
1
- {"version":3,"file":"GPUMaterialManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/material/GPUMaterialManager.js"],"names":[],"mappings":"AA4NA;IA4FI;;;;;;;;OAQG;IACH,yCANW,cAAc,oBACd,qBAAqB,YACrB,gBAAgB,qBAChB,qBAAqB,aACrB,iBAAiB,EAiD3B;IAlJD;;;;;OAKG;IACH,wBAAkC;IAOlC;;;OAGG;IACH,UAFU,IAAI,aAAa,EAAE,kBAAkB,CAAC,CAE3B;IAyBrB;;;OAGG;IACH,yCAEC;IAID;;;OAGG;IACH,sBAEC;IAsLD;;;;;;;;OAQG;IACH;QAN+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACE,gBAAgB,EAAhC,MAAM;QACU,oBAAoB,EAApC,MAAM;QACJ;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAiMnF;IAED;;;;OAIG;IACH,iBAHW,aAAa,GACX,kBAAkB,CAqB9B;IAED;;;;;;;;;;;;OAYG;IACH,kBAHW,aAAa,GACX,OAAO,CAyBnB;IAED;;;;OAIG;IACH,gBAaC;IAED;;;;;;;OAOG;IACH,0BAFW,eAAe,QAazB;IAED;;;;;;;;;;;OAWG;IACH,kBAHW,qBAAqB,GACnB,QAAQ,IAAI,CAAC,CAMzB;IAsBD;;;;;;OAMG;IACH,0BAHW,aAAa,EAAE,GACb,aAAa,EAAE,CAI3B;IAED;;;;;;OAMG;IACH,wBAHW,aAAa,EAAE,GACb,aAAa,EAAE,CAI3B;IAuED;;;OAGG;IACH,YAFW,sBAAsB,QAmChC;;CAEJ;8BAr4BY,OAAO,0CAA0C,EAAE,eAAe;6BAClE,OAAO,2BAA2B,EAAE,cAAc;yBAIlD,OAAO,2DAA2D,EAAE,UAAU;qCAC9E,OAAO,wCAAwC,EAAE,sBAAsB;oCACvE,OAAO,gDAAgD,EAAE,qBAAqB;+BAC9E,OAAO,gCAAgC,EAAE,gBAAgB;gCACzD,OAAO,yBAAyB,EAAE,iBAAiB;6BACnD,OAAO,8BAA8B,EAAE,cAAc;oCACrD,OAAO,6CAA6C,EAAE,qBAAqB;4BAC3E,OAAO,oBAAoB,EAAE,aAAa;oCAC1C,OAAO,qCAAqC,EAAE,qBAAqB;mCAtBzE,yBAAyB;mCAjBG,8CAA8C"}
1
+ {"version":3,"file":"GPUMaterialManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/material/GPUMaterialManager.js"],"names":[],"mappings":"AA4NA;IA4FI;;;;;;;;OAQG;IACH,yCANW,cAAc,oBACd,qBAAqB,YACrB,gBAAgB,qBAChB,qBAAqB,aACrB,iBAAiB,EAiD3B;IAlJD;;;;;OAKG;IACH,wBAAkC;IAOlC;;;OAGG;IACH,UAFU,IAAI,aAAa,EAAE,kBAAkB,CAAC,CAE3B;IAyBrB;;;OAGG;IACH,yCAEC;IAID;;;OAGG;IACH,sBAEC;IAsLD;;;;;;;;;;OAUG;IACH;QAR+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACE,gBAAgB,EAAhC,MAAM;QACU,oBAAoB,EAApC,MAAM;QACU,cAAc,EAA9B,MAAM;QAEJ;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CA4LnF;IAED;;;;OAIG;IACH,iBAHW,aAAa,GACX,kBAAkB,CAqB9B;IAED;;;;;;;;;;;;OAYG;IACH,kBAHW,aAAa,GACX,OAAO,CAyBnB;IAED;;;;OAIG;IACH,gBAaC;IAED;;;;;;;OAOG;IACH,0BAFW,eAAe,QAazB;IAED;;;;;;;;;;;OAWG;IACH,kBAHW,qBAAqB,GACnB,QAAQ,IAAI,CAAC,CAMzB;IAsBD;;;;;;OAMG;IACH,0BAHW,aAAa,EAAE,GACb,aAAa,EAAE,CAI3B;IAED;;;;;;OAMG;IACH,wBAHW,aAAa,EAAE,GACb,aAAa,EAAE,CAI3B;IAuED;;;OAGG;IACH,YAFW,sBAAsB,QAmChC;;CAEJ;8BAl4BY,OAAO,0CAA0C,EAAE,eAAe;6BAClE,OAAO,2BAA2B,EAAE,cAAc;yBAIlD,OAAO,2DAA2D,EAAE,UAAU;qCAC9E,OAAO,wCAAwC,EAAE,sBAAsB;oCACvE,OAAO,gDAAgD,EAAE,qBAAqB;+BAC9E,OAAO,gCAAgC,EAAE,gBAAgB;gCACzD,OAAO,yBAAyB,EAAE,iBAAiB;6BACnD,OAAO,8BAA8B,EAAE,cAAc;oCACrD,OAAO,6CAA6C,EAAE,qBAAqB;4BAC3E,OAAO,oBAAoB,EAAE,aAAa;oCAC1C,OAAO,qCAAqC,EAAE,qBAAqB;mCAtBzE,yBAAyB;mCAjBG,8CAA8C"}
@@ -467,6 +467,8 @@ export class GPUMaterialManager {
467
467
  * @param {GPUViewContext} options.view
468
468
  * @param {number} options.texture_viz_mesh
469
469
  * @param {number} options.texture_viz_triangle
470
+ * @param {number} options.texture_normal the normal target to write, `rgba16uint` at the view's
471
+ * resolution. The caller owns it so that it outlives the frame: reprojection reads last frame's.
470
472
  * @returns {{g_pbr: number, g_normal: number, g_albedo: number, g_emissive: number}} updated g-buffer
471
473
  */
472
474
  graph_viz_render({
@@ -474,9 +476,11 @@ export class GPUMaterialManager {
474
476
  view,
475
477
  texture_viz_mesh,
476
478
  texture_viz_triangle,
479
+ texture_normal,
477
480
  }) {
478
481
 
479
482
  assert.defined(graph, 'graph');
483
+ assert.isNonNegativeInteger(texture_normal, 'texture_normal');
480
484
  assert.defined(view, 'view');
481
485
 
482
486
  /**
@@ -620,14 +624,7 @@ export class GPUMaterialManager {
620
624
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
621
625
  })
622
626
  );
623
- pass_data.g_normal = pass.create(
624
- "g-buffer / Normal",
625
- TextureResourceDescriptor.from({
626
- format: 'rgba16uint',
627
- resolution: view.resolution,
628
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
629
- })
630
- );
627
+ pass_data.g_normal = pass.write(texture_normal);
631
628
  pass_data.g_albedo = pass.create(
632
629
  "g-buffer / Albedo",
633
630
  TextureResourceDescriptor.from({
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shared 88x88 f16-packed Circle-of-Confusion (CoC) workgroup LDS cache (8x8 tile + 40-pixel apron)
3
+ * for Depth-of-Field raymarch and slice compute passes.
4
+ *
5
+ * Expects `tColorCoc: texture_2d<f32>` in scope.
6
+ *
7
+ * ```wgsl
8
+ * fn dof_load_coc(p: vec2<i32>, dims: vec2<i32>) -> f32
9
+ * fn dof_populate_lds_coc(tile_blurred: bool, region_origin: vec2<i32>, lid: u32, dims: vec2<i32>)
10
+ * fn dof_read_coc(xt: vec2<i32>, region_origin: vec2<i32>) -> f32
11
+ * ```
12
+ *
13
+ * @type {CodeChunk}
14
+ */
15
+ export const chunk_dof_lds_coc_cache: CodeChunk;
16
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
17
+ //# sourceMappingURL=chunk_dof_lds_coc_cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_dof_lds_coc_cache.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/dof/raymarch/chunk_dof_lds_coc_cache.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;GAaG;AACH,sCAFU,SAAS,CAyDjB;0BAhFwB,uCAAuC"}
@@ -0,0 +1,81 @@
1
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
2
+ import { DOF_LDS_APRON, DOF_LDS_WORKGROUP } from "../DOF_CONFIG.js";
3
+
4
+ // ── Workgroup-LDS cache geometry (derived; see DOF_LDS_* in DOF_CONFIG) ──
5
+ const WG = DOF_LDS_WORKGROUP; // 8 — workgroup side
6
+ const APRON = DOF_LDS_APRON; // 40 — cached skirt, full-res px
7
+ const REGION = WG + 2 * APRON; // 88 — cached square side (even)
8
+ const ROW_U32 = REGION / 2; // 44 — u32 per cached row (2 f16/u32)
9
+ const LDS_U32 = REGION * ROW_U32; // 3872 — total u32 (× 4 B = 15 488 B)
10
+ const WG_THREADS = WG * WG; // 64 — threads per workgroup
11
+
12
+ /**
13
+ * Shared 88x88 f16-packed Circle-of-Confusion (CoC) workgroup LDS cache (8x8 tile + 40-pixel apron)
14
+ * for Depth-of-Field raymarch and slice compute passes.
15
+ *
16
+ * Expects `tColorCoc: texture_2d<f32>` in scope.
17
+ *
18
+ * ```wgsl
19
+ * fn dof_load_coc(p: vec2<i32>, dims: vec2<i32>) -> f32
20
+ * fn dof_populate_lds_coc(tile_blurred: bool, region_origin: vec2<i32>, lid: u32, dims: vec2<i32>)
21
+ * fn dof_read_coc(xt: vec2<i32>, region_origin: vec2<i32>) -> f32
22
+ * ```
23
+ *
24
+ * @type {CodeChunk}
25
+ */
26
+ export const chunk_dof_lds_coc_cache = CodeChunk.from(
27
+ //language=WGSL
28
+ `
29
+ const WG: i32 = ${WG};
30
+ const APRON: i32 = ${APRON};
31
+ const REGION: i32 = ${REGION};
32
+ const ROW_U32: i32 = ${ROW_U32};
33
+ const LDS_U32: u32 = ${LDS_U32}u;
34
+ const WG_THREADS: u32 = ${WG_THREADS}u;
35
+
36
+ // Workgroup CoC cache: the REGION×REGION (tile + apron) signed-CoC field, two
37
+ // f16 packed per u32. The CoC texture is rgba16float, so packing its already-
38
+ // f16 .a channel round-trips losslessly — the cached march stays bit-identical
39
+ // to the texture march (and to the fragment reference).
40
+ var<workgroup> lds_coc: array<u32, LDS_U32>;
41
+
42
+ // Clamped CoC fetch used by the cooperative load.
43
+ fn dof_load_coc(p: vec2<i32>, dims: vec2<i32>) -> f32 {
44
+ return textureLoad(tColorCoc, clamp(p, vec2<i32>(0), dims - vec2<i32>(1)), 0).a;
45
+ }
46
+
47
+ // Cooperative load: pack the tile+apron CoC field into shared memory. Each
48
+ // u32 slot holds two horizontally-adjacent texels of the REGION grid; every
49
+ // slot is written by exactly one thread, so there is no read-modify-write
50
+ // race. Skipped entirely for an in-focus tile (the load is the bulk of the
51
+ // cost the cache is meant to remove).
52
+ fn dof_populate_lds_coc(tile_blurred: bool, region_origin: vec2<i32>, lid: u32, dims: vec2<i32>) {
53
+ if (tile_blurred) {
54
+ for (var s: u32 = lid; s < LDS_U32; s = s + WG_THREADS) {
55
+ let si = i32(s);
56
+ let ry = si / ROW_U32;
57
+ let jx = si % ROW_U32;
58
+ let gy = region_origin.y + ry;
59
+ let gx = region_origin.x + 2 * jx;
60
+ let c0 = dof_load_coc(vec2<i32>(gx, gy), dims);
61
+ let c1 = dof_load_coc(vec2<i32>(gx + 1, gy), dims);
62
+ lds_coc[s] = pack2x16float(vec2<f32>(c0, c1));
63
+ }
64
+ }
65
+ // Unconditional barrier (uniform control flow): every thread reaches it, so
66
+ // the cache is fully published before any thread reads it.
67
+ workgroupBarrier();
68
+ }
69
+
70
+ // CoC at a clamped pixel coordinate: the workgroup cache when inside the apron,
71
+ // a texture load for the rare far tap (|offset| in (APRON, MAXR]).
72
+ fn dof_read_coc(xt: vec2<i32>, region_origin: vec2<i32>) -> f32 {
73
+ let rc = xt - region_origin;
74
+ if (rc.x >= 0 && rc.x < REGION && rc.y >= 0 && rc.y < REGION) {
75
+ let pair = unpack2x16float(lds_coc[rc.y * ROW_U32 + (rc.x >> 1)]);
76
+ return select(pair.x, pair.y, (rc.x & 1) != 0);
77
+ }
78
+ return textureLoad(tColorCoc, xt, 0).a;
79
+ }
80
+ `
81
+ );
@@ -1 +1 @@
1
- {"version":3,"file":"shader_dof_raymarch_compute.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js"],"names":[],"mappings":"AA0OA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,0CAFU,aAAa,CAMpB;8BAxQ2B,kCAAkC"}
1
+ {"version":3,"file":"shader_dof_raymarch_compute.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js"],"names":[],"mappings":"AA+LA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,0CAFU,aAAa,CAMpB;8BA7N2B,kCAAkC"}
@@ -6,7 +6,8 @@ import { ComputeShader } from "../../../shader/ComputeShader.js";
6
6
  import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
7
7
  import { chunk_dof_aperture_shape } from "../chunk_dof_aperture_shape.js";
8
8
  import { chunk_dof_sample_offset } from "../chunk_dof_sample_offset.js";
9
- import { DOF_FOCUS_CUTOFF, DOF_LDS_APRON, DOF_LDS_WORKGROUP, DOF_MAX_COC_RADIUS, DOF_TILE_SIZE } from "../DOF_CONFIG.js";
9
+ import { DOF_FOCUS_CUTOFF, DOF_LDS_WORKGROUP, DOF_MAX_COC_RADIUS, DOF_TILE_SIZE } from "../DOF_CONFIG.js";
10
+ import { chunk_dof_lds_coc_cache } from "./chunk_dof_lds_coc_cache.js";
10
11
  import { DOF_SETTINGS_STRUCT } from "./DOF_SETTINGS_STRUCT.js";
11
12
 
12
13
  const resources = new ShaderResourceSetDescriptor();
@@ -26,13 +27,7 @@ resources.createGroup()
26
27
  .addStorageTexture("tOut", "rgba16float", "2d", "write-only")
27
28
  ;
28
29
 
29
- // ── Workgroup-LDS cache geometry (derived; see DOF_LDS_* in DOF_CONFIG) ──
30
30
  const WG = DOF_LDS_WORKGROUP; // 8 — workgroup side
31
- const APRON = DOF_LDS_APRON; // 40 — cached skirt, full-res px
32
- const REGION = WG + 2 * APRON; // 88 — cached square side (even)
33
- const ROW_U32 = REGION / 2; // 44 — u32 per cached row (2 f16/u32)
34
- const LDS_U32 = REGION * ROW_U32; // 3872 — total u32 (× 4 B = 15 488 B)
35
- const WG_THREADS = WG * WG; // 64 — threads per workgroup
36
31
 
37
32
  const body = CodeChunk.from(
38
33
  //language=WGSL
@@ -42,24 +37,6 @@ const CUTOFF: f32 = ${DOF_FOCUS_CUTOFF};
42
37
  const TILE_SIZE: i32 = ${DOF_TILE_SIZE};
43
38
  const MAX_STEPS: u32 = 64u; // bitmask width (vec2<u32>); >= max STEPS (ultra = 48)
44
39
 
45
- const WG: i32 = ${WG};
46
- const APRON: i32 = ${APRON};
47
- const REGION: i32 = ${REGION};
48
- const ROW_U32: i32 = ${ROW_U32};
49
- const LDS_U32: u32 = ${LDS_U32}u;
50
- const WG_THREADS: u32 = ${WG_THREADS}u;
51
-
52
- // Workgroup CoC cache: the REGION×REGION (tile + apron) signed-CoC field, two
53
- // f16 packed per u32. The CoC texture is rgba16float, so packing its already-
54
- // f16 .a channel round-trips losslessly — the cached march stays bit-identical
55
- // to the texture march (and to the fragment reference).
56
- var<workgroup> lds_coc: array<u32, LDS_U32>;
57
-
58
- // Clamped CoC fetch used by the cooperative load.
59
- fn dof_load_coc(p: vec2<i32>, dims: vec2<i32>) -> f32 {
60
- return textureLoad(tColorCoc, clamp(p, vec2<i32>(0), dims - vec2<i32>(1)), 0).a;
61
- }
62
-
63
40
  @compute @workgroup_size(${WG}, ${WG}, 1)
64
41
  fn main(
65
42
  @builtin(global_invocation_id) gid: vec3<u32>,
@@ -84,21 +61,7 @@ fn main(
84
61
  // race. Skipped entirely for an in-focus tile (the load is the bulk of the
85
62
  // cost the cache is meant to remove).
86
63
  let region_origin = tile_origin - vec2<i32>(APRON);
87
- if (tile_blurred) {
88
- for (var s: u32 = lid; s < LDS_U32; s = s + WG_THREADS) {
89
- let si = i32(s);
90
- let ry = si / ROW_U32;
91
- let jx = si % ROW_U32;
92
- let gy = region_origin.y + ry;
93
- let gx = region_origin.x + 2 * jx;
94
- let c0 = dof_load_coc(vec2<i32>(gx, gy), dims);
95
- let c1 = dof_load_coc(vec2<i32>(gx + 1, gy), dims);
96
- lds_coc[s] = pack2x16float(vec2<f32>(c0, c1));
97
- }
98
- }
99
- // Unconditional barrier (uniform control flow): every thread reaches it, so
100
- // the cache is fully published before any thread reads it.
101
- workgroupBarrier();
64
+ dof_populate_lds_coc(tile_blurred, region_origin, lid, dims);
102
65
 
103
66
  let pixel = vec2<i32>(gid.xy);
104
67
  if (pixel.x >= dims.x || pixel.y >= dims.y) {
@@ -163,14 +126,7 @@ fn main(
163
126
  let x = coord + dir * r;
164
127
  let xt = vec2<i32>(clamp(x, vec2<f32>(0.0), dims_f - 1.0));
165
128
 
166
- let rc = xt - region_origin; // cache coord
167
- var s_coc: f32;
168
- if (rc.x >= 0 && rc.x < REGION && rc.y >= 0 && rc.y < REGION) {
169
- let pair = unpack2x16float(lds_coc[rc.y * ROW_U32 + (rc.x >> 1)]);
170
- s_coc = select(pair.x, pair.y, (rc.x & 1) != 0);
171
- } else {
172
- s_coc = textureLoad(tColorCoc, xt, 0).a;
173
- }
129
+ let s_coc = dof_read_coc(xt, region_origin);
174
130
  let reach = abs(s_coc);
175
131
 
176
132
  let cover = saturate(rho * reach - r + 1.0);
@@ -224,6 +180,7 @@ fn main(
224
180
  }
225
181
  `,
226
182
  [
183
+ chunk_dof_lds_coc_cache,
227
184
  chunk_dof_sample_offset,
228
185
  chunk_dof_aperture_shape,
229
186
  chunk_stbn_sample_vec2,
@@ -1 +1 @@
1
- {"version":3,"file":"shader_dof_slice_compute.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js"],"names":[],"mappings":"AAuPA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uCAFU,aAAa,CAMpB;8BA5Q2B,kCAAkC"}
1
+ {"version":3,"file":"shader_dof_slice_compute.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js"],"names":[],"mappings":"AA+MA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uCAFU,aAAa,CAMpB;8BApO2B,kCAAkC"}
@@ -7,13 +7,13 @@ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderReso
7
7
  import { chunk_dof_aperture_shape } from "../chunk_dof_aperture_shape.js";
8
8
  import {
9
9
  DOF_FOCUS_CUTOFF,
10
- DOF_LDS_APRON,
11
10
  DOF_LDS_WORKGROUP,
12
11
  DOF_MAX_COC_RADIUS,
13
12
  DOF_SLICE_DIRECTIONS,
14
13
  DOF_SLICE_SLOPES,
15
14
  DOF_TILE_SIZE,
16
15
  } from "../DOF_CONFIG.js";
16
+ import { chunk_dof_lds_coc_cache } from "./chunk_dof_lds_coc_cache.js";
17
17
  import { DOF_SETTINGS_STRUCT } from "./DOF_SETTINGS_STRUCT.js";
18
18
 
19
19
  const resources = new ShaderResourceSetDescriptor();
@@ -33,13 +33,7 @@ resources.createGroup()
33
33
  .addStorageTexture("tOut", "rgba16float", "2d", "write-only")
34
34
  ;
35
35
 
36
- // ── Workgroup-LDS cache geometry (shared with the 2D compute march) ──
37
36
  const WG = DOF_LDS_WORKGROUP; // 8 — workgroup side
38
- const APRON = DOF_LDS_APRON; // 40 — cached skirt, full-res px
39
- const REGION = WG + 2 * APRON; // 88 — cached square side (even)
40
- const ROW_U32 = REGION / 2; // 44 — u32 per cached row (2 f16/u32)
41
- const LDS_U32 = REGION * ROW_U32; // 3872 — total u32 (× 4 B = 15 488 B)
42
- const WG_THREADS = WG * WG; // 64 — threads per workgroup
43
37
 
44
38
  const D = DOF_SLICE_DIRECTIONS; // aperture directions over [0, π)
45
39
  const M = DOF_SLICE_SLOPES; // aperture radii ("slopes") per direction
@@ -52,37 +46,14 @@ const CUTOFF: f32 = ${DOF_FOCUS_CUTOFF};
52
46
  const TILE_SIZE: i32 = ${DOF_TILE_SIZE};
53
47
  const MAX_STEPS: u32 = 64u; // per-(slope) bitmask width (vec2<u32>); >= max N
54
48
 
55
- const WG: i32 = ${WG};
56
- const APRON: i32 = ${APRON};
57
- const REGION: i32 = ${REGION};
58
- const ROW_U32: i32 = ${ROW_U32};
59
- const LDS_U32: u32 = ${LDS_U32}u;
60
- const WG_THREADS: u32 = ${WG_THREADS}u;
61
-
62
49
  const D: u32 = ${D}u; // directions over [0, π)
63
50
  const M: u32 = ${M}u; // slopes per direction
64
51
 
65
- // Workgroup CoC cache: the REGION×REGION (tile + apron) signed-CoC field, two
66
- // f16 packed per u32 (the rgba16float source round-trips losslessly). Same as
67
- // the 2D compute march; the slice march reads it once per step and tests every
68
- // slope against that one read.
69
- var<workgroup> lds_coc: array<u32, LDS_U32>;
70
-
71
- // Clamped CoC fetch used by the cooperative load.
72
- fn dof_load_coc(p: vec2<i32>, dims: vec2<i32>) -> f32 {
73
- return textureLoad(tColorCoc, clamp(p, vec2<i32>(0), dims - vec2<i32>(1)), 0).a;
74
- }
75
-
76
52
  // CoC at a march position: the workgroup cache when inside the apron, a texture
77
53
  // load for the rare far tap (|offset| in (APRON, MAXR]).
78
54
  fn slice_read_coc(pos: vec2<f32>, region_origin: vec2<i32>, dims: vec2<i32>, dims_f: vec2<f32>) -> f32 {
79
55
  let xt = vec2<i32>(clamp(pos, vec2<f32>(0.0), dims_f - 1.0));
80
- let rc = xt - region_origin;
81
- if (rc.x >= 0 && rc.x < REGION && rc.y >= 0 && rc.y < REGION) {
82
- let pair = unpack2x16float(lds_coc[rc.y * ROW_U32 + (rc.x >> 1)]);
83
- return select(pair.x, pair.y, (rc.x & 1) != 0);
84
- }
85
- return textureLoad(tColorCoc, xt, 0).a;
56
+ return dof_read_coc(xt, region_origin);
86
57
  }
87
58
 
88
59
  @compute @workgroup_size(${WG}, ${WG}, 1)
@@ -101,19 +72,7 @@ fn main(
101
72
 
102
73
  // Cooperative load (skipped for an in-focus tile); unconditional barrier.
103
74
  let region_origin = tile_origin - vec2<i32>(APRON);
104
- if (tile_blurred) {
105
- for (var s: u32 = lid; s < LDS_U32; s = s + WG_THREADS) {
106
- let si = i32(s);
107
- let ry = si / ROW_U32;
108
- let jx = si % ROW_U32;
109
- let gy = region_origin.y + ry;
110
- let gx = region_origin.x + 2 * jx;
111
- let c0 = dof_load_coc(vec2<i32>(gx, gy), dims);
112
- let c1 = dof_load_coc(vec2<i32>(gx + 1, gy), dims);
113
- lds_coc[s] = pack2x16float(vec2<f32>(c0, c1));
114
- }
115
- }
116
- workgroupBarrier();
75
+ dof_populate_lds_coc(tile_blurred, region_origin, lid, dims);
117
76
 
118
77
  let pixel = vec2<i32>(gid.xy);
119
78
  if (pixel.x >= dims.x || pixel.y >= dims.y) {
@@ -238,6 +197,7 @@ fn main(
238
197
  }
239
198
  `,
240
199
  [
200
+ chunk_dof_lds_coc_cache,
241
201
  chunk_dof_aperture_shape,
242
202
  chunk_stbn_sample_vec2,
243
203
  chunk_rgb_to_luminance,
@@ -27,21 +27,25 @@ export class GTAO {
27
27
  * @param {number} options.input_depth this frame's depth
28
28
  * @param {number} options.input_hzb hierarchical depth built from it
29
29
  * @param {number} options.input_normal G-buffer normals
30
+ * @param {number} options.input_normal_previous last frame's G-buffer normals, at the size last frame was
31
+ * drawn at: which surface each history texel was written on
30
32
  * @param {number} options.input_velocity per-pixel velocity, in this frame's pixels
31
33
  * @param {number} options.input_occlusion depth-clip pass output: history confidence in r
32
34
  * @param {number} options.frame_index the renderer's frame counter: drives the noise, the history
33
35
  * ping-pong, and whether the history follows on from the last frame drawn
34
36
  * @param {number} options.output G-buffer albedo; AO is blended into its alpha
35
37
  * @param {number[]} options.resolution this frame's render size
36
- * @returns {{visibility:number, occlusion:number, bent_normals:number}} the accumulated visibility
37
- * moments, `output` after the composite, and the raw bent normals
38
+ * @returns {{visibility:number, occlusion:number, bent_normals:number}} the accumulated visibility and
39
+ * bend (`rgba16float`), `output` after the composite, and the accumulated bent normals, octahedral in
40
+ * `rg16uint` as `input_normal` is
38
41
  */
39
- graph_pass({ graph, camera, input_depth, input_hzb, input_normal, input_velocity, input_occlusion, frame_index, output, resolution }: {
42
+ graph_pass({ graph, camera, input_depth, input_hzb, input_normal, input_normal_previous, input_velocity, input_occlusion, frame_index, output, resolution }: {
40
43
  graph: FrameGraph;
41
44
  camera: number;
42
45
  input_depth: number;
43
46
  input_hzb: number;
44
47
  input_normal: number;
48
+ input_normal_previous: number;
45
49
  input_velocity: number;
46
50
  input_occlusion: number;
47
51
  frame_index: number;
@@ -1 +1 @@
1
- {"version":3,"file":"GTAO.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/GTAO.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH;IAqBI;;;OAGG;IACH,uCAUC;IA5BD;;;;OAIG;IACH,eAFU,OAAO,CAEI;IAyBrB;;;;OAIG;IACH,0BAFW,eAAe,QAOzB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH;QAd+B,KAAK;QACT,MAAM,EAAtB,MAAM;QACU,WAAW,EAA3B,MAAM;QACU,SAAS,EAAzB,MAAM;QACU,YAAY,EAA5B,MAAM;QACU,cAAc,EAA9B,MAAM;QACU,eAAe,EAA/B,MAAM;QACU,WAAW,EAA3B,MAAM;QAEU,MAAM,EAAtB,MAAM;QACY,UAAU,EAA5B,MAAM,EAAE;QACN;QAAC,UAAU,EAAC,MAAM,CAAC;QAAC,SAAS,EAAC,MAAM,CAAC;QAAC,YAAY,EAAC,MAAM,CAAA;KAAC,CA4GtE;;CACJ;8BA/KY,OAAO,6CAA6C,EAAE,eAAe"}
1
+ {"version":3,"file":"GTAO.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/postprocess/gtao/GTAO.js"],"names":[],"mappings":"AASA;;GAEG;AAEH;IAqBI;;;OAGG;IACH,uCAWC;IA7BD;;;;OAIG;IACH,eAFU,OAAO,CAEI;IA0BrB;;;;OAIG;IACH,0BAFW,eAAe,QAOzB;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH;QAjB+B,KAAK;QACT,MAAM,EAAtB,MAAM;QACU,WAAW,EAA3B,MAAM;QACU,SAAS,EAAzB,MAAM;QACU,YAAY,EAA5B,MAAM;QACU,qBAAqB,EAArC,MAAM;QAEU,cAAc,EAA9B,MAAM;QACU,eAAe,EAA/B,MAAM;QACU,WAAW,EAA3B,MAAM;QAEU,MAAM,EAAtB,MAAM;QACY,UAAU,EAA5B,MAAM,EAAE;QACN;QAAC,UAAU,EAAC,MAAM,CAAC;QAAC,SAAS,EAAC,MAAM,CAAC;QAAC,YAAY,EAAC,MAAM,CAAA;KAAC,CAqHtE;;CACJ;8BA3LY,OAAO,6CAA6C,EAAE,eAAe"}