@woosh/meep-engine 3.60.4 → 3.60.6

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 (419) hide show
  1. package/CHANGELOG.md +2621 -0
  2. package/CONTRIBUTING.md +7 -0
  3. package/MIGRATION_2_TO_3.md +136 -0
  4. package/SECURITY.md +4 -0
  5. package/editor/EditorCameraNavigation.d.ts +2 -1
  6. package/editor/EditorCameraNavigation.d.ts.map +1 -1
  7. package/editor/EditorCameraNavigation.js +51 -57
  8. package/package.json +6 -2
  9. package/src/engine/EngineHarness.d.ts +3 -9
  10. package/src/engine/EngineHarness.d.ts.map +1 -1
  11. package/src/engine/EngineHarness.js +6 -8
  12. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts +9 -6
  13. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts.map +1 -1
  14. package/src/engine/graphics/camera/makeOrbitalCameraController.js +44 -71
  15. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts +64 -0
  16. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts.map +1 -0
  17. package/src/engine/graphics/camera/orbital/MomentumAxis.js +187 -0
  18. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts +86 -0
  19. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts.map +1 -0
  20. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.js +319 -0
  21. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +34 -10
  22. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  23. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +116 -30
  24. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +1 -7
  25. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  26. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -37
  27. package/src/engine/graphics/ecs/water/Water.d.ts +8 -0
  28. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  29. package/src/engine/graphics/ecs/water/Water.js +8 -0
  30. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  31. package/src/engine/graphics3/WaterSystem.js +731 -734
  32. package/src/engine/graphics3/decal/DecalTileShader.d.ts +61 -0
  33. package/src/engine/graphics3/decal/DecalTileShader.d.ts.map +1 -0
  34. package/src/engine/graphics3/decal/DecalTileShader.js +138 -0
  35. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts +10 -4
  36. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  37. package/src/engine/graphics3/decal/GPUDecalRenderer.js +149 -44
  38. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts +25 -0
  39. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts.map +1 -0
  40. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.js +55 -0
  41. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts +22 -0
  42. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts.map +1 -0
  43. package/src/engine/graphics3/decal/graph_gather_decal_tiles.js +70 -0
  44. package/src/engine/graphics3/decal/shader_decal_composite.d.ts +7 -5
  45. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  46. package/src/engine/graphics3/decal/shader_decal_composite.js +48 -44
  47. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts +12 -0
  48. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -0
  49. package/src/engine/graphics3/decal/shader_decal_tile_copy.js +78 -0
  50. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts +11 -0
  51. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts.map +1 -0
  52. package/src/engine/graphics3/decal/shader_gather_decal_tiles.js +80 -0
  53. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts +13 -0
  54. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts.map +1 -0
  55. package/src/engine/input/devices/mouse/MouseEventButtons.js +23 -0
  56. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts +4 -0
  57. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts.map +1 -1
  58. package/src/engine/input/ecs/controllers/KeyboardCameraController.js +9 -45
  59. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  60. package/src/shade/playground/water_refraction/README.md +5 -6
  61. package/src/shade/playground/water_refraction/index.html +1 -1
  62. package/src/shade/renderer/Renderer.d.ts +11 -0
  63. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  64. package/src/shade/renderer/Renderer.js +50 -6
  65. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
  66. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  67. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
  68. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  69. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  70. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  71. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  72. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  73. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +28 -45
  74. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  75. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +111 -119
  76. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +22 -3
  77. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  78. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +84 -3
  79. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts +19 -0
  80. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts.map +1 -0
  81. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.js +25 -0
  82. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
  83. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
  84. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
  85. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +15 -0
  86. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -1
  87. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +38 -0
  88. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
  89. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
  90. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
  91. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
  92. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
  93. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +28 -59
  94. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -1
  95. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +84 -789
  96. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +1 -8
  98. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +7 -6
  99. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  100. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +12 -11
  101. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -2
  102. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -2
  103. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +1 -4
  104. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1 -10
  106. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
  107. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
  108. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
  109. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  110. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
  111. package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
  112. package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
  113. package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
  114. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
  115. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
  116. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
  117. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
  118. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
  119. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
  120. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
  121. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  122. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
  123. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
  124. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
  125. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
  126. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
  127. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
  128. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
  129. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
  130. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
  131. package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
  132. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
  133. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  134. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
  135. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
  136. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
  137. package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
  138. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  139. package/src/shade/renderer/material/GPUMaterialManager.d.ts +11 -1
  140. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  141. package/src/shade/renderer/material/GPUMaterialManager.js +16 -8
  142. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
  143. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  144. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
  145. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +7 -3
  146. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  147. package/src/shade/renderer/postprocess/gtao/GTAO.js +26 -13
  148. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts +14 -0
  149. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  150. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +196 -68
  151. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  152. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +42 -28
  153. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  154. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +429 -414
  155. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts +16 -0
  156. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts.map +1 -0
  157. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.js +156 -0
  158. package/src/shade/renderer/scene/GPUSceneContext.d.ts +2 -2
  159. package/src/shade/renderer/scene/GPUSceneContext.js +5 -5
  160. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  161. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
  162. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
  163. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  164. package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
  165. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
  166. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
  167. package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
  168. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  169. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  170. package/src/shade/renderer/water/shader_water.js +22 -13
  171. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
  172. package/src/shade/renderer/water/shader_water_avboit.js +7 -7
  173. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
  174. package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
  175. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
  176. package/editor/REWORK_PLAN_2026_08.md +0 -692
  177. package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
  178. package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
  179. package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
  180. package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
  181. package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
  182. package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
  183. package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
  184. package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
  185. package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
  186. package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
  187. package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
  188. package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
  189. package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
  190. package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
  191. package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
  192. package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
  193. package/src/REVIEW_2026_08_06/adv-core.md +0 -511
  194. package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
  195. package/src/REVIEW_2026_08_06/adv-view.md +0 -446
  196. package/src/REVIEW_2026_08_06/api-core.md +0 -296
  197. package/src/REVIEW_2026_08_06/api-engine.md +0 -195
  198. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
  199. package/src/REVIEW_2026_08_06/core-binary.md +0 -348
  200. package/src/REVIEW_2026_08_06/core-collection.md +0 -376
  201. package/src/REVIEW_2026_08_06/core-math.md +0 -221
  202. package/src/REVIEW_2026_08_06/core-process.md +0 -266
  203. package/src/REVIEW_2026_08_06/core-science.md +0 -223
  204. package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
  205. package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
  206. package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
  207. package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
  208. package/src/REVIEW_2026_08_06/engine-input.md +0 -197
  209. package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
  210. package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
  211. package/src/REVIEW_2026_08_06/generation.md +0 -176
  212. package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
  213. package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
  214. package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
  215. package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
  216. package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
  217. package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
  218. package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
  219. package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
  220. package/src/REVIEW_2026_08_06/view.md +0 -667
  221. package/src/REVIEW_2026_08_06.md +0 -610
  222. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
  223. package/src/core/bvh2/bvh3/NOTES.md +0 -2
  224. package/src/core/bvh8/NOTES.md +0 -63
  225. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
  226. package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
  227. package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
  228. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
  229. package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
  230. package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
  231. package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
  232. package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
  233. package/src/core/geom/3d/gjk/NOTES.md +0 -8
  234. package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
  235. package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
  236. package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
  237. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
  238. package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
  239. package/src/engine/REVIEW_2026_07_03.md +0 -211
  240. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
  241. package/src/engine/control/first-person/DESIGN.md +0 -658
  242. package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
  243. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
  244. package/src/engine/control/first-person/TODO.md +0 -160
  245. package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
  246. package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
  247. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
  248. package/src/engine/ecs/ik/PLAN.md +0 -179
  249. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
  250. package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
  251. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
  252. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
  253. package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
  254. package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
  255. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
  256. package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
  257. package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
  258. package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
  259. package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
  260. package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
  261. package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
  262. package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
  263. package/src/engine/network/CONGESTION_CONTROL.md +0 -87
  264. package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
  265. package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
  266. package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
  267. package/src/engine/physics/cloth/PLAN.md +0 -3056
  268. package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
  269. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
  270. package/src/engine/physics/fluid/solver/NOTES.md +0 -46
  271. package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
  272. package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
  273. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
  274. package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
  275. package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
  276. package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
  277. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
  278. package/src/format/image/avif/DECISIONS.md +0 -545
  279. package/src/format/image/jpeg/NOTES.md +0 -3
  280. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
  281. package/src/generation/COORDINATES.md +0 -54
  282. package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
  283. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
  284. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
  285. package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
  286. package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
  287. package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
  288. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
  289. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
  290. package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
  291. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
  292. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
  293. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
  294. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
  295. package/src/shade/RENDERER_CONTRACT.md +0 -697
  296. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
  297. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
  298. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
  299. package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
  300. package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
  301. package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
  302. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
  303. package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
  304. package/src/shade/renderer/NOTES.md +0 -78
  305. package/src/shade/renderer/PLAN.md +0 -8
  306. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
  307. package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
  308. package/src/shade/renderer/atmosphere/NOTES.md +0 -6
  309. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
  310. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
  311. package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
  312. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
  313. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
  314. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
  315. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
  316. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
  317. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
  318. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
  319. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
  320. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
  321. package/src/shade/renderer/camera/orbital/README.md +0 -81
  322. package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
  323. package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
  324. package/src/shade/renderer/camera/orbital/index.js +0 -9
  325. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
  326. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
  327. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
  328. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
  329. package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
  330. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
  331. package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
  332. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
  333. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
  334. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -481
  335. package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
  336. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
  337. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
  338. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
  339. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
  340. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
  341. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
  342. package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -529
  343. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +0 -47
  344. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +0 -1
  345. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +0 -80
  346. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +0 -16
  347. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +0 -1
  348. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +0 -67
  349. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +0 -17
  350. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +0 -1
  351. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +0 -145
  352. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +0 -12
  353. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +0 -1
  354. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +0 -105
  355. package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
  356. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4306
  357. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
  358. package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
  359. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
  360. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
  361. package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
  362. package/src/shade/renderer/hiz/NOTES.md +0 -3
  363. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
  364. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
  365. package/src/shade/renderer/light/cluster/NOTES.md +0 -11
  366. package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
  367. package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
  368. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
  369. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
  370. package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
  371. package/src/shade/renderer/particles/DESIGN.md +0 -1011
  372. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -280
  373. package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
  374. package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
  375. package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
  376. package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
  377. package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
  378. package/src/shade/renderer/postprocess/nss/NOTES.md +0 -332
  379. package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
  380. package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
  381. package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
  382. package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
  383. package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
  384. package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
  385. package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
  386. package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
  387. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
  388. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
  389. package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
  390. package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
  391. package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -391
  392. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -153
  393. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
  394. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
  395. package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
  396. package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
  397. package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
  398. package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
  399. package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
  400. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
  401. package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
  402. package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -927
  403. package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
  404. package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
  405. package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
  406. package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
  407. package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
  408. package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
  409. package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
  410. package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
  411. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
  412. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
  413. package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -3
  414. package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
  415. package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
  416. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
  417. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
  418. package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
  419. package/src/shade/wgsl/NOTES.md +0 -4
@@ -1,350 +1,405 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { max2 } from "../../../core/math/max2.js";
3
- import { round_up } from "../../../core/math/round_up.js";
4
- import { TextureDescriptor } from "../../descriptor/texture/TextureDescriptor.js";
5
- import { TextureViewDescriptor } from "../../descriptor/texture/TextureViewDescriptor.js";
6
- import { texture_mip_level_count } from "../../util/texture_mip_extent.js";
7
- import { hzb_pick_alignment } from "./hzb_pick_alignment.js";
8
- import { hzb_plan_reduction_steps } from "./hzb_plan_reduction_steps.js";
9
- import { HZB_TEXTURE_FORMAT } from "./HZB_TEXTURE_FORMAT.js";
10
- import { shader_hzb_reduce_any, shader_hzb_reduce_mip0 } from "./shader_hzb_reduce_any.js";
11
- import { shader_hzb_reduce_mip0_clip } from "./shader_hzb_reduce_mip0_clip.js";
12
- import { shader_hzb_spd_2, shader_hzb_spd_3, shader_hzb_spd_4 } from "./shader_hzb_spd.js";
13
-
14
- /**
15
- * @typedef {import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} PipelineEnquiry
16
- * @typedef {import("../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} ShadeGPUCommandContext
17
- * @typedef {import("../GraphicsContext.js").GraphicsContext} GraphicsContext
18
- * @typedef {import("../texture/GPUTextureContext.js").GPUTextureContext} GPUTextureContext
19
- * @typedef {import("./hzb_plan_reduction_steps.js").HZBReductionStep} HZBReductionStep
20
- */
21
-
22
- export class HierarchicalZBuffer {
23
-
24
- /**
25
- * @type {GPUTextureContext}
26
- */
27
- #texture;
28
-
29
- /**
30
- * @type {string|GPUTextureFormat}
31
- */
32
- #format = HZB_TEXTURE_FORMAT
33
-
34
- /**
35
- * Precomputed reduction schedule from mip 0 to the 1x1 tail for the current HZB dimensions.
36
- * @type {HZBReductionStep[]}
37
- */
38
- #steps = [];
39
-
40
- /**
41
- * Offer the pipelines {@link build} dispatches — see {@link PipelineEnquiry}.
42
- *
43
- * @param {PipelineEnquiry} enquiry
44
- */
45
- static enquirePipelines(enquiry) {
46
- enquiry.compute.push(
47
- shader_hzb_reduce_mip0.pipeline,
48
- shader_hzb_reduce_mip0_clip.pipeline,
49
- shader_hzb_reduce_any.pipeline,
50
- shader_hzb_spd_2.pipeline,
51
- shader_hzb_spd_3.pipeline,
52
- shader_hzb_spd_4.pipeline,
53
- );
54
- }
55
-
56
- /**
57
- *
58
- * @returns {GPUTextureContext}
59
- */
60
- get texture() {
61
- return this.#texture;
62
- }
63
-
64
-
65
- /**
66
- * @type {GraphicsContext}
67
- */
68
- #graphics;
69
-
70
- /**
71
- *
72
- * @type {number[]}
73
- */
74
- #viewport_size = [1, 1];
75
-
76
- /**
77
- *
78
- * @param {GraphicsContext} graphics
79
- */
80
- constructor(graphics) {
81
- this.#graphics = graphics;
82
-
83
- this.#texture = graphics.textures.contextFromDescriptor(TextureDescriptor.from({
84
- label: "Hierarchical Z Buffer",
85
- format: this.#format,
86
- usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING,
87
- mipLevelCount: 1,
88
- size: [1, 1]
89
- }));
90
-
91
-
92
- }
93
-
94
- /**
95
- * @param {number} mip
96
- * @returns {GPUTextureView}
97
- */
98
- #obtain_mip_view(mip) {
99
- return this.#texture.obtainView(TextureViewDescriptor.from({
100
- baseMipLevel: mip,
101
- mipLevelCount: 1,
102
- dimension: "2d",
103
- baseArrayLayer: 0,
104
- arrayLayerCount: 1
105
- }));
106
- }
107
-
108
- /**
109
- *
110
- * @param {ShadeGPUCommandContext} encoder
111
- * @param {GPUTextureContext} source
112
- * @param {number[]} [source_offset] [x0,y0]
113
- */
114
- build(
115
- encoder,
116
- source,
117
- source_offset
118
- ) {
119
-
120
- assert.defined(encoder, 'encoder');
121
- assert.notNull(encoder, 'encoder');
122
- assert.equal(encoder.isGPUCommandContext, true, 'encoder is not a GPUCommandContext')
123
-
124
- assert.defined(source, 'source');
125
- assert.notNull(source, 'source');
126
- assert.equal(source.isGPUTextureContext, true, 'source is not a GPUTextureContext')
127
-
128
- // the first pass is special, we need to read from source texture and write to first mip level of hzb
129
-
130
- const texture = this.#texture;
131
-
132
- assert.equal(texture.isDestroyed, false, 'texture is destroyed');
133
-
134
- let source_view = source.obtainView(TextureViewDescriptor.from({
135
- baseMipLevel: 0,
136
- mipLevelCount: 1,
137
- dimension: "2d",
138
- baseArrayLayer: 0,
139
- arrayLayerCount: 1
140
- }));
141
-
142
- const destination_view = this.#obtain_mip_view(0);
143
-
144
- const viewport_size = this.#viewport_size;
145
-
146
- const is_clipped_variant = source_offset !== undefined
147
- && (
148
- (
149
- source_offset[0] !== 0
150
- || source_offset[1] !== 0
151
- )
152
- || (
153
- viewport_size[0] !== source.width
154
- || viewport_size[1] !== source.height
155
- )
156
- );
157
-
158
- if (is_clipped_variant) {
159
- // special case for clip region
160
- const mip0_resolution = this.#mip_resolution(0);
161
-
162
- shader_hzb_reduce_mip0_clip.dispatchThreads({
163
- encoder,
164
- bindings: {
165
- tInput: source_view,
166
- tOutput: destination_view,
167
- settings: {
168
- clip_region: [
169
- source_offset[0], source_offset[1],
170
- viewport_size[0], viewport_size[1],
171
- ],
172
- output_resolution: mip0_resolution,
173
- },
174
- },
175
- thread_count_x: mip0_resolution[0],
176
- thread_count_y: mip0_resolution[1],
177
- });
178
- } else {
179
-
180
- this.#do_reduction_pass(encoder, shader_hzb_reduce_mip0, source_view, destination_view, 0);
181
- }
182
-
183
- source_view = destination_view;
184
-
185
- const steps = this.#steps;
186
- const step_count = steps.length;
187
-
188
- for (let s = 0; s < step_count; s++) {
189
- const { base_mip, mip_count } = steps[s];
190
-
191
- if (mip_count === 1) {
192
- const target_mip = base_mip + 1;
193
- const out_view = this.#obtain_mip_view(target_mip);
194
-
195
- this.#do_reduction_pass(encoder, shader_hzb_reduce_any, source_view, out_view, target_mip);
196
-
197
- source_view = out_view;
198
- } else {
199
- const out1 = this.#obtain_mip_view(base_mip + 1);
200
- const out2 = this.#obtain_mip_view(base_mip + 2);
201
- const out1_res = this.#mip_resolution(base_mip + 1);
202
- const group_count_x = (out1_res[0] + 15) >>> 4;
203
- const group_count_y = (out1_res[1] + 15) >>> 4;
204
-
205
- if (mip_count === 2) {
206
- shader_hzb_spd_2.dispatch({
207
- encoder,
208
- bindings: { tInput: source_view, tOut1: out1, tOut2: out2 },
209
- group_count_x,
210
- group_count_y,
211
- });
212
- source_view = out2;
213
- } else if (mip_count === 3) {
214
- const out3 = this.#obtain_mip_view(base_mip + 3);
215
- shader_hzb_spd_3.dispatch({
216
- encoder,
217
- bindings: { tInput: source_view, tOut1: out1, tOut2: out2, tOut3: out3 },
218
- group_count_x,
219
- group_count_y,
220
- });
221
- source_view = out3;
222
- } else {
223
- const out3 = this.#obtain_mip_view(base_mip + 3);
224
- const out4 = this.#obtain_mip_view(base_mip + 4);
225
- shader_hzb_spd_4.dispatch({
226
- encoder,
227
- bindings: { tInput: source_view, tOut1: out1, tOut2: out2, tOut3: out3, tOut4: out4 },
228
- group_count_x,
229
- group_count_y,
230
- });
231
- source_view = out4;
232
- }
233
- }
234
- }
235
- }
236
-
237
- /**
238
- *
239
- * @param {ShadeGPUCommandContext} encoder
240
- * @param {ComputeShader} shader
241
- * @param {GPUTextureView} source_view
242
- * @param {GPUTextureView} destination_view
243
- * @param {number} index
244
- */
245
- #do_reduction_pass(
246
- encoder,
247
- shader,
248
- source_view,
249
- destination_view,
250
- index
251
- ) {
252
- const output_resolution = this.#mip_resolution(index);
253
-
254
- shader.dispatchThreads({
255
- encoder,
256
- bindings: {
257
- tInput: source_view,
258
- tOutput: destination_view,
259
- output_resolution,
260
- },
261
- thread_count_x: output_resolution[0],
262
- thread_count_y: output_resolution[1],
263
- });
264
-
265
- }
266
-
267
- /**
268
- * Scratch for {@link #mip_resolution}. The value is serialised into the pass's immediate bytes
269
- * before the next call, so one array can serve every mip.
270
- *
271
- * @type {number[]}
272
- */
273
- #mip_resolution_scratch = [1, 1];
274
-
275
- /**
276
- * Size of mip `index` of the HZB, which is what the reduction pass writing into it needs to know.
277
- *
278
- * Each mip halves the one above it, floored at one texel — the same walk that used to be
279
- * precomputed into a uniform buffer of every mip's resolution and bound at a per-mip dynamic
280
- * offset. As immediate data there is nothing to precompute into.
281
- *
282
- * @param {number} index
283
- * @returns {number[]}
284
- */
285
- #mip_resolution(index) {
286
- const size = this.#texture.size;
287
-
288
- const out = this.#mip_resolution_scratch;
289
-
290
- out[0] = max2(1, size[0] >>> index);
291
- out[1] = max2(1, size[1] >>> index);
292
-
293
- return out;
294
- }
295
-
296
- /**
297
- *
298
- * @param {number} x
299
- * @param {number} y
300
- */
301
- setViewportSize(x, y) {
302
- assert.isNonNegativeInteger(x, 'x');
303
- assert.isNonNegativeInteger(y, 'y');
304
-
305
- this.#viewport_size[0] = x;
306
- this.#viewport_size[1] = y;
307
-
308
- const base_w = Math.max(x >>> 1, 1);
309
- const base_h = Math.max(y >>> 1, 1);
310
-
311
- const [align_w, align_h] = hzb_pick_alignment(x, y, 1.05);
312
-
313
- const hzb_w = round_up(base_w, align_w);
314
- const hzb_h = round_up(base_h, align_h);
315
-
316
- this.#resize(hzb_w, hzb_h);
317
- }
318
-
319
- /**
320
- *
321
- * @param {number} x
322
- * @param {number} y
323
- */
324
- #resize(
325
- x,
326
- y
327
- ) {
328
-
329
- const texture = this.#texture;
330
- const size = texture.size;
331
-
332
- if (size[0] === x && size[1] === y) {
333
- // no size change
334
- return;
335
- }
336
-
337
- // a screen-space depth pyramid, 2D always
338
- const mip_count = texture_mip_level_count(x, y, 1, "2d");
339
-
340
- texture.descriptor.mipLevelCount = mip_count;
341
-
342
- texture.resize(x, y);
343
-
344
- this.#steps = hzb_plan_reduction_steps(x, y);
345
- }
346
-
347
- destroy() {
348
- this.#texture.destroy();
349
- }
350
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { max2 } from "../../../core/math/max2.js";
3
+ import { round_up } from "../../../core/math/round_up.js";
4
+ import { TextureDescriptor } from "../../descriptor/texture/TextureDescriptor.js";
5
+ import { TextureViewDescriptor } from "../../descriptor/texture/TextureViewDescriptor.js";
6
+ import { texture_mip_level_count } from "../../util/texture_mip_extent.js";
7
+ import { ShaderSwitchSet } from "../shader/compiler/ShaderSwitchSet.js";
8
+ import { HZB_FOOTPRINT_X } from "./HZB_FOOTPRINT_X.js";
9
+ import { HZB_FOOTPRINT_Y } from "./HZB_FOOTPRINT_Y.js";
10
+ import { HZBFootprint } from "./HZBFootprint.js";
11
+ import { hzb_footprint_texels } from "./hzb_footprint_texels.js";
12
+ import { hzb_pick_alignment } from "./hzb_pick_alignment.js";
13
+ import { hzb_plan_reduction_steps } from "./hzb_plan_reduction_steps.js";
14
+ import { HZB_TEXTURE_FORMAT } from "./HZB_TEXTURE_FORMAT.js";
15
+ import { shader_hzb_reduce_any } from "./shader_hzb_reduce_any.js";
16
+ import { shader_hzb_reduce_mip0 } from "./shader_hzb_reduce_mip0.js";
17
+ import { shader_hzb_spd_2, shader_hzb_spd_3, shader_hzb_spd_4 } from "./shader_hzb_spd.js";
18
+
19
+ /**
20
+ * @typedef {import("../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} PipelineEnquiry
21
+ * @typedef {import("../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} ShadeGPUCommandContext
22
+ * @typedef {import("../GraphicsContext.js").GraphicsContext} GraphicsContext
23
+ * @typedef {import("../texture/GPUTextureContext.js").GPUTextureContext} GPUTextureContext
24
+ * @typedef {import("./hzb_plan_reduction_steps.js").HZBReductionStep} HZBReductionStep
25
+ */
26
+
27
+ /**
28
+ * Every footprint mip 0 can be reduced with, 2x2, 3x2, 2x3 and 3x3.
29
+ * @type {ShaderSwitchSet[]}
30
+ */
31
+ const MIP0_FOOTPRINTS = [
32
+ ShaderSwitchSet.EMPTY,
33
+ ShaderSwitchSet.EMPTY.with(HZB_FOOTPRINT_X, HZBFootprint.Three),
34
+ ShaderSwitchSet.EMPTY.with(HZB_FOOTPRINT_Y, HZBFootprint.Three),
35
+ ShaderSwitchSet.EMPTY.with(HZB_FOOTPRINT_X, HZBFootprint.Three).with(HZB_FOOTPRINT_Y, HZBFootprint.Three),
36
+ ];
37
+
38
+ /**
39
+ * The footprint mip 0 is reduced with along one axis: the widest of any of its texels.
40
+ *
41
+ * @param {number} source_size viewport texels on the axis
42
+ * @param {number} output_size mip 0 texels on the axis
43
+ * @returns {HZBFootprint}
44
+ */
45
+ function mip0_footprint(source_size, output_size) {
46
+ const texels = hzb_footprint_texels(source_size, output_size);
47
+
48
+ // mip 0 is never smaller than half the viewport, which keeps every footprint within 3
49
+ assert.lessThanOrEqual(texels, 3, `footprint of ${output_size} HZB texels over ${source_size}`);
50
+
51
+ return texels <= 2 ? HZBFootprint.Two : HZBFootprint.Three;
52
+ }
53
+
54
+ export class HierarchicalZBuffer {
55
+
56
+ /**
57
+ * @type {GPUTextureContext}
58
+ */
59
+ #texture;
60
+
61
+ /**
62
+ * @type {string|GPUTextureFormat}
63
+ */
64
+ #format = HZB_TEXTURE_FORMAT
65
+
66
+ /**
67
+ * Precomputed reduction schedule from mip 0 to the 1x1 tail for the current HZB dimensions.
68
+ * @type {HZBReductionStep[]}
69
+ */
70
+ #steps = [];
71
+
72
+ /**
73
+ * The footprint mip 0 is reduced with, for the current viewport and mip 0 size.
74
+ * @type {ShaderSwitchSet}
75
+ */
76
+ #mip0_footprint = ShaderSwitchSet.EMPTY;
77
+
78
+ /**
79
+ * Scratch for mip 0's immediates, serialised into the pass's immediate bytes before the next build,
80
+ * as {@link #mip_resolution_scratch} is.
81
+ *
82
+ * @type {{clip_region: number[], output_resolution: number[]}}
83
+ */
84
+ #mip0_settings = { clip_region: [0, 0, 1, 1], output_resolution: [1, 1] };
85
+
86
+ /**
87
+ * Offer the pipelines {@link build} dispatches — see {@link PipelineEnquiry}.
88
+ *
89
+ * @param {PipelineEnquiry} enquiry
90
+ */
91
+ static enquirePipelines(enquiry) {
92
+ for (let i = 0; i < MIP0_FOOTPRINTS.length; i++) {
93
+ enquiry.compute.push(shader_hzb_reduce_mip0.variant(MIP0_FOOTPRINTS[i]).pipeline);
94
+ }
95
+
96
+ enquiry.compute.push(
97
+ shader_hzb_reduce_any.pipeline,
98
+ shader_hzb_spd_2.pipeline,
99
+ shader_hzb_spd_3.pipeline,
100
+ shader_hzb_spd_4.pipeline,
101
+ );
102
+ }
103
+
104
+ /**
105
+ *
106
+ * @returns {GPUTextureContext}
107
+ */
108
+ get texture() {
109
+ return this.#texture;
110
+ }
111
+
112
+
113
+ /**
114
+ * @type {GraphicsContext}
115
+ */
116
+ #graphics;
117
+
118
+ /**
119
+ *
120
+ * @type {number[]}
121
+ */
122
+ #viewport_size = [1, 1];
123
+
124
+ /**
125
+ *
126
+ * @param {GraphicsContext} graphics
127
+ */
128
+ constructor(graphics) {
129
+ this.#graphics = graphics;
130
+
131
+ this.#texture = graphics.textures.contextFromDescriptor(TextureDescriptor.from({
132
+ label: "Hierarchical Z Buffer",
133
+ format: this.#format,
134
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.STORAGE_BINDING,
135
+ mipLevelCount: 1,
136
+ size: [1, 1]
137
+ }));
138
+
139
+
140
+ }
141
+
142
+ /**
143
+ * @param {number} mip
144
+ * @returns {GPUTextureView}
145
+ */
146
+ #obtain_mip_view(mip) {
147
+ return this.#texture.obtainView(TextureViewDescriptor.from({
148
+ baseMipLevel: mip,
149
+ mipLevelCount: 1,
150
+ dimension: "2d",
151
+ baseArrayLayer: 0,
152
+ arrayLayerCount: 1
153
+ }));
154
+ }
155
+
156
+ /**
157
+ *
158
+ * @param {ShadeGPUCommandContext} encoder
159
+ * @param {GPUTextureContext} source
160
+ * @param {number[]} [source_offset] [x0,y0]
161
+ */
162
+ build(
163
+ encoder,
164
+ source,
165
+ source_offset
166
+ ) {
167
+
168
+ assert.defined(encoder, 'encoder');
169
+ assert.notNull(encoder, 'encoder');
170
+ assert.equal(encoder.isGPUCommandContext, true, 'encoder is not a GPUCommandContext')
171
+
172
+ assert.defined(source, 'source');
173
+ assert.notNull(source, 'source');
174
+ assert.equal(source.isGPUTextureContext, true, 'source is not a GPUTextureContext')
175
+
176
+ // the first pass is special, we need to read from source texture and write to first mip level of hzb
177
+
178
+ const texture = this.#texture;
179
+
180
+ assert.equal(texture.isDestroyed, false, 'texture is destroyed');
181
+
182
+ let source_view = source.obtainView(TextureViewDescriptor.from({
183
+ baseMipLevel: 0,
184
+ mipLevelCount: 1,
185
+ dimension: "2d",
186
+ baseArrayLayer: 0,
187
+ arrayLayerCount: 1
188
+ }));
189
+
190
+ const destination_view = this.#obtain_mip_view(0);
191
+
192
+ const viewport_size = this.#viewport_size;
193
+
194
+ // the viewport's region of the source: all of it for a camera, a slot of the atlas for a shadow map
195
+ const region_x = source_offset !== undefined ? source_offset[0] : 0;
196
+ const region_y = source_offset !== undefined ? source_offset[1] : 0;
197
+
198
+ assert.lessThanOrEqual(region_x + viewport_size[0], source.width, 'viewport region past the source\'s width');
199
+ assert.lessThanOrEqual(region_y + viewport_size[1], source.height, 'viewport region past the source\'s height');
200
+
201
+ const mip0_resolution = this.#mip_resolution(0);
202
+
203
+ const settings = this.#mip0_settings;
204
+ const clip_region = settings.clip_region;
205
+
206
+ clip_region[0] = region_x;
207
+ clip_region[1] = region_y;
208
+ clip_region[2] = viewport_size[0];
209
+ clip_region[3] = viewport_size[1];
210
+
211
+ settings.output_resolution = mip0_resolution;
212
+
213
+ shader_hzb_reduce_mip0.variant(this.#mip0_footprint).dispatchThreads({
214
+ encoder,
215
+ bindings: {
216
+ tInput: source_view,
217
+ tOutput: destination_view,
218
+ settings,
219
+ },
220
+ thread_count_x: mip0_resolution[0],
221
+ thread_count_y: mip0_resolution[1],
222
+ });
223
+
224
+ source_view = destination_view;
225
+
226
+ const steps = this.#steps;
227
+ const step_count = steps.length;
228
+
229
+ for (let s = 0; s < step_count; s++) {
230
+ const { base_mip, mip_count } = steps[s];
231
+
232
+ if (mip_count === 1) {
233
+ const target_mip = base_mip + 1;
234
+ const out_view = this.#obtain_mip_view(target_mip);
235
+
236
+ this.#do_reduction_pass(encoder, shader_hzb_reduce_any, source_view, out_view, target_mip);
237
+
238
+ source_view = out_view;
239
+ } else {
240
+ const out1 = this.#obtain_mip_view(base_mip + 1);
241
+ const out2 = this.#obtain_mip_view(base_mip + 2);
242
+ const out1_res = this.#mip_resolution(base_mip + 1);
243
+ const group_count_x = (out1_res[0] + 15) >>> 4;
244
+ const group_count_y = (out1_res[1] + 15) >>> 4;
245
+
246
+ if (mip_count === 2) {
247
+ shader_hzb_spd_2.dispatch({
248
+ encoder,
249
+ bindings: { tInput: source_view, tOut1: out1, tOut2: out2 },
250
+ group_count_x,
251
+ group_count_y,
252
+ });
253
+ source_view = out2;
254
+ } else if (mip_count === 3) {
255
+ const out3 = this.#obtain_mip_view(base_mip + 3);
256
+ shader_hzb_spd_3.dispatch({
257
+ encoder,
258
+ bindings: { tInput: source_view, tOut1: out1, tOut2: out2, tOut3: out3 },
259
+ group_count_x,
260
+ group_count_y,
261
+ });
262
+ source_view = out3;
263
+ } else {
264
+ const out3 = this.#obtain_mip_view(base_mip + 3);
265
+ const out4 = this.#obtain_mip_view(base_mip + 4);
266
+ shader_hzb_spd_4.dispatch({
267
+ encoder,
268
+ bindings: { tInput: source_view, tOut1: out1, tOut2: out2, tOut3: out3, tOut4: out4 },
269
+ group_count_x,
270
+ group_count_y,
271
+ });
272
+ source_view = out4;
273
+ }
274
+ }
275
+ }
276
+ }
277
+
278
+ /**
279
+ *
280
+ * @param {ShadeGPUCommandContext} encoder
281
+ * @param {ComputeShader} shader
282
+ * @param {GPUTextureView} source_view
283
+ * @param {GPUTextureView} destination_view
284
+ * @param {number} index
285
+ */
286
+ #do_reduction_pass(
287
+ encoder,
288
+ shader,
289
+ source_view,
290
+ destination_view,
291
+ index
292
+ ) {
293
+ const output_resolution = this.#mip_resolution(index);
294
+
295
+ shader.dispatchThreads({
296
+ encoder,
297
+ bindings: {
298
+ tInput: source_view,
299
+ tOutput: destination_view,
300
+ output_resolution,
301
+ },
302
+ thread_count_x: output_resolution[0],
303
+ thread_count_y: output_resolution[1],
304
+ });
305
+
306
+ }
307
+
308
+ /**
309
+ * Scratch for {@link #mip_resolution}. The value is serialised into the pass's immediate bytes
310
+ * before the next call, so one array can serve every mip.
311
+ *
312
+ * @type {number[]}
313
+ */
314
+ #mip_resolution_scratch = [1, 1];
315
+
316
+ /**
317
+ * Size of mip `index` of the HZB, which is what the reduction pass writing into it needs to know.
318
+ *
319
+ * Each mip halves the one above it, floored at one texel — the same walk that used to be
320
+ * precomputed into a uniform buffer of every mip's resolution and bound at a per-mip dynamic
321
+ * offset. As immediate data there is nothing to precompute into.
322
+ *
323
+ * @param {number} index
324
+ * @returns {number[]}
325
+ */
326
+ #mip_resolution(index) {
327
+ const size = this.#texture.size;
328
+
329
+ const out = this.#mip_resolution_scratch;
330
+
331
+ out[0] = max2(1, size[0] >>> index);
332
+ out[1] = max2(1, size[1] >>> index);
333
+
334
+ return out;
335
+ }
336
+
337
+ /**
338
+ *
339
+ * @param {number} x
340
+ * @param {number} y
341
+ */
342
+ setViewportSize(x, y) {
343
+ assert.isNonNegativeInteger(x, 'x');
344
+ assert.isNonNegativeInteger(y, 'y');
345
+ // an empty viewport has no depth to reduce, and mip 0 clamps its reads to a region it would not have
346
+ assert.greaterThan(x, 0, 'x');
347
+ assert.greaterThan(y, 0, 'y');
348
+
349
+ const viewport_size = this.#viewport_size;
350
+
351
+ if (viewport_size[0] === x && viewport_size[1] === y) {
352
+ // no size change; a shadow map's view is resized every frame
353
+ return;
354
+ }
355
+
356
+ viewport_size[0] = x;
357
+ viewport_size[1] = y;
358
+
359
+ const base_w = Math.max(x >>> 1, 1);
360
+ const base_h = Math.max(y >>> 1, 1);
361
+
362
+ const [align_w, align_h] = hzb_pick_alignment(x, y, 1.05);
363
+
364
+ const hzb_w = round_up(base_w, align_w);
365
+ const hzb_h = round_up(base_h, align_h);
366
+
367
+ this.#resize(hzb_w, hzb_h);
368
+
369
+ this.#mip0_footprint = ShaderSwitchSet.EMPTY
370
+ .with(HZB_FOOTPRINT_X, mip0_footprint(x, hzb_w))
371
+ .with(HZB_FOOTPRINT_Y, mip0_footprint(y, hzb_h));
372
+ }
373
+
374
+ /**
375
+ *
376
+ * @param {number} x
377
+ * @param {number} y
378
+ */
379
+ #resize(
380
+ x,
381
+ y
382
+ ) {
383
+
384
+ const texture = this.#texture;
385
+ const size = texture.size;
386
+
387
+ if (size[0] === x && size[1] === y) {
388
+ // no size change
389
+ return;
390
+ }
391
+
392
+ // a screen-space depth pyramid, 2D always
393
+ const mip_count = texture_mip_level_count(x, y, 1, "2d");
394
+
395
+ texture.descriptor.mipLevelCount = mip_count;
396
+
397
+ texture.resize(x, y);
398
+
399
+ this.#steps = hzb_plan_reduction_steps(x, y);
400
+ }
401
+
402
+ destroy() {
403
+ this.#texture.destroy();
404
+ }
405
+ }