@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
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The mip 0 reduction's footprint across x, in source texels, by {@link HZB_FOOTPRINT_X}:
3
+ *
4
+ * ```wgsl
5
+ * const HZB_FOOTPRINT_X: i32
6
+ * ```
7
+ *
8
+ * @type {CodeChunkChoice}
9
+ */
10
+ export const chunk_hzb_footprint_x: CodeChunkChoice;
11
+ import { CodeChunkChoice } from "../shader/compiler/CodeChunkChoice.js";
12
+ //# sourceMappingURL=chunk_hzb_footprint_x.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_hzb_footprint_x.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/chunk_hzb_footprint_x.js"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,oCAFU,eAAe,CAEkD;gCAb3C,uCAAuC"}
@@ -0,0 +1,27 @@
1
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
2
+ import { CodeChunkChoice } from "../shader/compiler/CodeChunkChoice.js";
3
+ import { HZB_FOOTPRINT_X } from "./HZB_FOOTPRINT_X.js";
4
+ import { HZBFootprint } from "./HZBFootprint.js";
5
+
6
+ /**
7
+ * The mip 0 reduction's footprint across x, in source texels, by {@link HZB_FOOTPRINT_X}:
8
+ *
9
+ * ```wgsl
10
+ * const HZB_FOOTPRINT_X: i32
11
+ * ```
12
+ *
13
+ * @type {CodeChunkChoice}
14
+ */
15
+ export const chunk_hzb_footprint_x = CodeChunkChoice.from(HZB_FOOTPRINT_X);
16
+
17
+ chunk_hzb_footprint_x.add(HZBFootprint.Two, CodeChunk.from(
18
+ //language=WGSL
19
+ `
20
+ const HZB_FOOTPRINT_X: i32 = 2;
21
+ `));
22
+
23
+ chunk_hzb_footprint_x.add(HZBFootprint.Three, CodeChunk.from(
24
+ //language=WGSL
25
+ `
26
+ const HZB_FOOTPRINT_X: i32 = 3;
27
+ `));
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The mip 0 reduction's footprint across y, in source texels, by {@link HZB_FOOTPRINT_Y}:
3
+ *
4
+ * ```wgsl
5
+ * const HZB_FOOTPRINT_Y: i32
6
+ * ```
7
+ *
8
+ * @type {CodeChunkChoice}
9
+ */
10
+ export const chunk_hzb_footprint_y: CodeChunkChoice;
11
+ import { CodeChunkChoice } from "../shader/compiler/CodeChunkChoice.js";
12
+ //# sourceMappingURL=chunk_hzb_footprint_y.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_hzb_footprint_y.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/chunk_hzb_footprint_y.js"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,oCAFU,eAAe,CAEkD;gCAb3C,uCAAuC"}
@@ -0,0 +1,27 @@
1
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
2
+ import { CodeChunkChoice } from "../shader/compiler/CodeChunkChoice.js";
3
+ import { HZB_FOOTPRINT_Y } from "./HZB_FOOTPRINT_Y.js";
4
+ import { HZBFootprint } from "./HZBFootprint.js";
5
+
6
+ /**
7
+ * The mip 0 reduction's footprint across y, in source texels, by {@link HZB_FOOTPRINT_Y}:
8
+ *
9
+ * ```wgsl
10
+ * const HZB_FOOTPRINT_Y: i32
11
+ * ```
12
+ *
13
+ * @type {CodeChunkChoice}
14
+ */
15
+ export const chunk_hzb_footprint_y = CodeChunkChoice.from(HZB_FOOTPRINT_Y);
16
+
17
+ chunk_hzb_footprint_y.add(HZBFootprint.Two, CodeChunk.from(
18
+ //language=WGSL
19
+ `
20
+ const HZB_FOOTPRINT_Y: i32 = 2;
21
+ `));
22
+
23
+ chunk_hzb_footprint_y.add(HZBFootprint.Three, CodeChunk.from(
24
+ //language=WGSL
25
+ `
26
+ const HZB_FOOTPRINT_Y: i32 = 3;
27
+ `));
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The widest footprint, in source texels along one axis, of any HZB texel when `output_size` texels cover
3
+ * `source_size`: HZB texel `i` covers `[i·s/o, (i+1)·s/o)` and reduces every source texel that span
4
+ * touches, clipped to the source.
5
+ *
6
+ * An upper bound on the footprints {@link shader_hzb_reduce_mip0} reads, whose bounds are this span
7
+ * nudged inward by a float epsilon.
8
+ *
9
+ * @param {number} source_size source texels on the axis
10
+ * @param {number} output_size HZB mip 0 texels on the axis
11
+ * @returns {number}
12
+ */
13
+ export function hzb_footprint_texels(source_size: number, output_size: number): number;
14
+ //# sourceMappingURL=hzb_footprint_texels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hzb_footprint_texels.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/hzb_footprint_texels.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,kDAJW,MAAM,eACN,MAAM,GACJ,MAAM,CAqBlB"}
@@ -0,0 +1,34 @@
1
+ import { assert } from "../../../core/assert.js";
2
+
3
+ /**
4
+ * The widest footprint, in source texels along one axis, of any HZB texel when `output_size` texels cover
5
+ * `source_size`: HZB texel `i` covers `[i·s/o, (i+1)·s/o)` and reduces every source texel that span
6
+ * touches, clipped to the source.
7
+ *
8
+ * An upper bound on the footprints {@link shader_hzb_reduce_mip0} reads, whose bounds are this span
9
+ * nudged inward by a float epsilon.
10
+ *
11
+ * @param {number} source_size source texels on the axis
12
+ * @param {number} output_size HZB mip 0 texels on the axis
13
+ * @returns {number}
14
+ */
15
+ export function hzb_footprint_texels(source_size, output_size) {
16
+ assert.isNonNegativeInteger(source_size, 'source_size');
17
+ assert.isNonNegativeInteger(output_size, 'output_size');
18
+ assert.greaterThan(output_size, 0, 'output_size');
19
+
20
+ let widest = 0;
21
+
22
+ for (let i = 0; i < output_size; i++) {
23
+ const first = Math.floor(i * source_size / output_size);
24
+ const end = Math.min(Math.ceil((i + 1) * source_size / output_size), source_size);
25
+
26
+ const width = end - first;
27
+
28
+ if (width > widest) {
29
+ widest = width;
30
+ }
31
+ }
32
+
33
+ return widest;
34
+ }
@@ -1,8 +1,3 @@
1
- /**
2
- * Initial reduction pass, works with non-power-of-two resolutions as input
3
- * @type {ComputeShader}
4
- */
5
- export const shader_hzb_reduce_mip0: ComputeShader;
6
1
  /**
7
2
  * Mip1+ reduction pass, works with non-power-of-two resolutions as input
8
3
  * @type {ComputeShader}
@@ -1 +1 @@
1
- {"version":3,"file":"shader_hzb_reduce_any.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/shader_hzb_reduce_any.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,qCAFU,aAAa,CAepB;AAGH;;;GAGG;AACH,oCAFU,aAAa,CAcpB;8BAvD2B,4BAA4B"}
1
+ {"version":3,"file":"shader_hzb_reduce_any.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/shader_hzb_reduce_any.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,oCAFU,aAAa,CAcpB;8BAnC2B,4BAA4B"}
@@ -1,57 +1,37 @@
1
- import { vec2f, vec2u } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { ComputeShader } from "../shader/ComputeShader.js";
3
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
4
- import { generate_downsampler_code } from "./generate_downsampler_code.js";
5
-
6
- import { HZB_TEXTURE_FORMAT } from "./HZB_TEXTURE_FORMAT.js";
7
-
8
- const resources = new ShaderResourceSetDescriptor();
9
-
10
- // per-pass, eight bytes, read-only: immediate data rather than a uniform buffer. The reduction
11
- // walks the mip chain a pass at a time and every pass wants a different resolution, which used to
12
- // mean a persistent table of them bound at a per-mip dynamic offset.
13
- resources.setImmediate("output_resolution", vec2u);
14
-
15
- resources.createGroup()
16
- .addTexture("tInput", "unfilterable-float")
17
- .addStorageTexture("tOutput", HZB_TEXTURE_FORMAT, "2d", "write-only")
18
- ;
19
-
20
-
21
- /**
22
- * Initial reduction pass, works with non-power-of-two resolutions as input
23
- * @type {ComputeShader}
24
- */
25
- export const shader_hzb_reduce_mip0 = ComputeShader.from({
26
- label: 'HZB / reduce mip0',
27
- // NOTE: we reduce from depth, so texel read happens from the .R (X) channel for both min and max.
28
- body: generate_downsampler_code({
29
- type: vec2f,
30
- initial_value: 'vec2( 1.0, 0.0 )',
31
- //language=WGSL
32
- reduction_code: `
33
- output.x = min(texel.x, output.x);
34
- output.y = max(texel.x, output.y);
35
- `,
36
- }),
37
- resources,
38
- });
39
-
40
-
41
- /**
42
- * Mip1+ reduction pass, works with non-power-of-two resolutions as input
43
- * @type {ComputeShader}
44
- */
45
- export const shader_hzb_reduce_any = ComputeShader.from({
46
- label: 'HZB / reduce any resolution',
47
- body: generate_downsampler_code({
48
- type: vec2f,
49
- initial_value: 'vec2( 1.0, 0.0 )',
50
- //language=WGSL
51
- reduction_code: `
52
- output.x = min(texel.x, output.x);
53
- output.y = max(texel.y, output.y);
54
- `,
55
- }),
56
- resources,
57
- });
1
+ import { vec2f, vec2u } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { ComputeShader } from "../shader/ComputeShader.js";
3
+ import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
4
+ import { generate_downsampler_code } from "./generate_downsampler_code.js";
5
+
6
+ import { HZB_TEXTURE_FORMAT } from "./HZB_TEXTURE_FORMAT.js";
7
+
8
+ const resources = new ShaderResourceSetDescriptor();
9
+
10
+ // per-pass, eight bytes, read-only: immediate data rather than a uniform buffer. The reduction
11
+ // walks the mip chain a pass at a time and every pass wants a different resolution, which used to
12
+ // mean a persistent table of them bound at a per-mip dynamic offset.
13
+ resources.setImmediate("output_resolution", vec2u);
14
+
15
+ resources.createGroup()
16
+ .addTexture("tInput", "unfilterable-float")
17
+ .addStorageTexture("tOutput", HZB_TEXTURE_FORMAT, "2d", "write-only")
18
+ ;
19
+
20
+
21
+ /**
22
+ * Mip1+ reduction pass, works with non-power-of-two resolutions as input
23
+ * @type {ComputeShader}
24
+ */
25
+ export const shader_hzb_reduce_any = ComputeShader.from({
26
+ label: 'HZB / reduce any resolution',
27
+ body: generate_downsampler_code({
28
+ type: vec2f,
29
+ initial_value: 'vec2( 1.0, 0.0 )',
30
+ //language=WGSL
31
+ reduction_code: `
32
+ output.x = min(texel.x, output.x);
33
+ output.y = max(texel.y, output.y);
34
+ `,
35
+ }),
36
+ resources,
37
+ });
@@ -0,0 +1,11 @@
1
+ /**
2
+ * First reduction: depth of a region of the source (`settings.clip_region`) into the HZB's mip 0, min in
3
+ * R and max in G. The region is the whole viewport for a camera, and a slot of the atlas for a shadow
4
+ * map. Each HZB texel reduces every source texel its area overlaps, a footprint of
5
+ * {@link HZB_FOOTPRINT_X} by {@link HZB_FOOTPRINT_Y} texels at most.
6
+ *
7
+ * @type {ComputeShader}
8
+ */
9
+ export const shader_hzb_reduce_mip0: ComputeShader;
10
+ import { ComputeShader } from "../shader/ComputeShader.js";
11
+ //# sourceMappingURL=shader_hzb_reduce_mip0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_hzb_reduce_mip0.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/hiz/shader_hzb_reduce_mip0.js"],"names":[],"mappings":"AA2GA;;;;;;;GAOG;AACH,qCAFU,aAAa,CAMpB;8BApH2B,4BAA4B"}
@@ -1,111 +1,120 @@
1
- import { vec2u, vec4u } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
3
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
4
- import { ComputeShader } from "../shader/ComputeShader.js";
5
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
6
- import { HZB_TEXTURE_FORMAT } from "./HZB_TEXTURE_FORMAT.js";
7
-
8
- /**
9
- * Per-pass, 24 bytes, read-only.
10
- *
11
- * `clip_region` and `output_resolution` were two uniforms, so two buffers per pass. WGSL allows one
12
- * immediate per entry point, so carrying them as immediate data means carrying them together.
13
- *
14
- * @type {WebGPUStruct}
15
- */
16
- const HZB_CLIP_SETTINGS = WebGPUStruct.from({
17
- // x, y, width, height
18
- clip_region: vec4u,
19
- output_resolution: vec2u,
20
- }, 'HzbClipSettings');
21
-
22
- const resources = new ShaderResourceSetDescriptor();
23
-
24
- resources.setImmediate("settings", HZB_CLIP_SETTINGS);
25
-
26
- resources.createGroup()
27
- .addTexture("tInput", "unfilterable-float")
28
- .addStorageTexture("tOutput", HZB_TEXTURE_FORMAT, "2d", "write-only")
29
- ;
30
-
31
- const body = CodeChunk.from(
32
- //language=WGSL
33
- `
34
- @compute @workgroup_size(16, 16)
35
- fn main(
36
- @builtin(global_invocation_id) global_id: vec3<u32>,
37
- ) {
38
- if (any(global_id.xy >= settings.output_resolution)) {
39
- return;
40
- }
41
-
42
- // 1. Calculate the UV bounds of the current *output* pixel.
43
- // We use the output resolution to determine how wide one pixel is in UV space.
44
- let output_resolution_f = vec2<f32>(settings.output_resolution);
45
- let uv = (vec2<f32>(global_id.xy) + 0.5) / output_resolution_f;
46
- let output_pixel_size2 = 0.5 / output_resolution_f;
47
- let uv_min = uv - output_pixel_size2;
48
- let uv_max = uv + output_pixel_size2;
49
-
50
- // minor epsilon to avoid float rounding errors
51
- const EPSILON = 1e-6;
52
-
53
- // Nudge the bounds slightly inward to absorb floating-point drift
54
- let safe_uv_min = uv_min + EPSILON;
55
- let safe_uv_max = uv_max - EPSILON;
56
-
57
- // 2. Convert UV bounds to Source Texel coordinates (float).
58
- // We map the 0..1 UVs to the size of the source clip region.
59
- let source_size = vec2<f32>(settings.clip_region.zw);
60
- let texel_min_f = safe_uv_min * source_size;
61
- let texel_max_f = safe_uv_max * source_size;
62
-
63
- // 3. Convert to Integer Loop Bounds.
64
- // Floor the min to find the first pixel.
65
- // Ceil the max to find the exclusive upper bound.
66
- // Example (5px -> 2px):
67
- // Output Px 0 covers UV 0.0-0.5 -> Source 0.0 to 2.5
68
- // Floor(0.0) = 0. Ceil(2.5) = 3. Loop 0, 1, 2. (Pixel 2 is partially covered)
69
- // Output Px 1 covers UV 0.5-1.0 -> Source 2.5 to 5.0
70
- // Floor(2.5) = 2. Ceil(5.0) = 5. Loop 2, 3, 4. (Pixel 2 is partially covered again)
71
- let bound_min = vec2<i32>(floor(texel_min_f));
72
- let bound_max = vec2<i32>(ceil(texel_max_f));
73
-
74
- // 4. Clamp bounds to the clip region size to be safe.
75
- let limit = vec2<i32>(settings.clip_region.zw);
76
-
77
- let start = max(bound_min, vec2<i32>(0)) + vec2<i32>(settings.clip_region.xy);
78
- let end = min(bound_max, limit) + vec2<i32>(settings.clip_region.xy);
79
-
80
- var output = vec2<f32>(1.0, 0.0); // Initialize min/max
81
-
82
- // 5. Loop. Note strict usage of < end (exclusive) and i32 types.
83
- for (var y = start.y; y < end.y; y++) {
84
- for (var x = start.x; x < end.x; x++) {
85
-
86
- // Add the clip region offset (atlas support)
87
- let load_coord = vec2<i32>(x, y);
88
-
89
- let v = textureLoad(tInput, load_coord, 0).r;
90
-
91
- output.x = min(output.x, v);
92
- output.y = max(output.y, v);
93
- }
94
- }
95
-
96
- textureStore(tOutput, vec2<i32>(global_id.xy), vec4<f32>(output, 0.0, 0.0));
97
- }
98
- `, [
99
- ]
100
- )
101
-
102
- /**
103
- * Same as standard first mip reduction, but with a clipping region.
104
- * Primarily used for shadow maps where shadows are atlased into a single texture
105
- * @type {ComputeShader}
106
- */
107
- export const shader_hzb_reduce_mip0_clip = ComputeShader.from({
108
- label: 'HZB / reduce mip0 with clip',
109
- resources,
110
- body,
111
- });
1
+ import { vec2u, vec4u } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
3
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
4
+ import { ComputeShader } from "../shader/ComputeShader.js";
5
+ import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
6
+ import { chunk_hzb_footprint_x } from "./chunk_hzb_footprint_x.js";
7
+ import { chunk_hzb_footprint_y } from "./chunk_hzb_footprint_y.js";
8
+ import { HZB_TEXTURE_FORMAT } from "./HZB_TEXTURE_FORMAT.js";
9
+
10
+ /**
11
+ * Per-pass, 24 bytes, read-only.
12
+ *
13
+ * `clip_region` and `output_resolution` were two uniforms, so two buffers per pass. WGSL allows one
14
+ * immediate per entry point, so carrying them as immediate data means carrying them together.
15
+ *
16
+ * @type {WebGPUStruct}
17
+ */
18
+ const HZB_CLIP_SETTINGS = WebGPUStruct.from({
19
+ // x, y, width, height
20
+ clip_region: vec4u,
21
+ output_resolution: vec2u,
22
+ }, 'HzbClipSettings');
23
+
24
+ const resources = new ShaderResourceSetDescriptor();
25
+
26
+ resources.setImmediate("settings", HZB_CLIP_SETTINGS);
27
+
28
+ resources.createGroup()
29
+ .addTexture("tInput", "unfilterable-float")
30
+ .addStorageTexture("tOutput", HZB_TEXTURE_FORMAT, "2d", "write-only")
31
+ ;
32
+
33
+ const body = CodeChunk.from(
34
+ //language=WGSL
35
+ `
36
+ @compute @workgroup_size(16, 16)
37
+ fn main(
38
+ @builtin(global_invocation_id) global_id: vec3<u32>,
39
+ ) {
40
+ if (any(global_id.xy >= settings.output_resolution)) {
41
+ return;
42
+ }
43
+
44
+ // 1. Calculate the UV bounds of the current *output* pixel.
45
+ // We use the output resolution to determine how wide one pixel is in UV space.
46
+ let output_resolution_f = vec2<f32>(settings.output_resolution);
47
+ let uv = (vec2<f32>(global_id.xy) + 0.5) / output_resolution_f;
48
+ let output_pixel_size2 = 0.5 / output_resolution_f;
49
+ let uv_min = uv - output_pixel_size2;
50
+ let uv_max = uv + output_pixel_size2;
51
+
52
+ // minor epsilon to avoid float rounding errors
53
+ const EPSILON = 1e-6;
54
+
55
+ // Nudge the bounds slightly inward to absorb floating-point drift
56
+ let safe_uv_min = uv_min + EPSILON;
57
+ let safe_uv_max = uv_max - EPSILON;
58
+
59
+ // 2. Convert UV bounds to Source Texel coordinates (float).
60
+ // We map the 0..1 UVs to the size of the source clip region.
61
+ let source_size = vec2<f32>(settings.clip_region.zw);
62
+ let texel_min_f = safe_uv_min * source_size;
63
+ let texel_max_f = safe_uv_max * source_size;
64
+
65
+ // 3. Convert to Integer Bounds.
66
+ // Floor the min to find the first pixel.
67
+ // Ceil the max to find the exclusive upper bound.
68
+ // Example (5px -> 2px):
69
+ // Output Px 0 covers UV 0.0-0.5 -> Source 0.0 to 2.5
70
+ // Floor(0.0) = 0. Ceil(2.5) = 3. Pixels 0, 1, 2. (Pixel 2 is partially covered)
71
+ // Output Px 1 covers UV 0.5-1.0 -> Source 2.5 to 5.0
72
+ // Floor(2.5) = 2. Ceil(5.0) = 5. Pixels 2, 3, 4. (Pixel 2 is partially covered again)
73
+ let bound_min = vec2<i32>(floor(texel_min_f));
74
+ let bound_max = vec2<i32>(ceil(texel_max_f));
75
+
76
+ // 4. Clamp bounds to the clip region size to be safe.
77
+ let limit = vec2<i32>(settings.clip_region.zw);
78
+
79
+ let start = max(bound_min, vec2<i32>(0)) + vec2<i32>(settings.clip_region.xy);
80
+ let end = min(bound_max, limit) + vec2<i32>(settings.clip_region.xy);
81
+
82
+ // 5. Read the footprint, HZB_FOOTPRINT_X by HZB_FOOTPRINT_Y texels: the widest footprint of this
83
+ // dispatch on each axis. A narrower one repeats its last texel, which min/max ignores.
84
+ let last = end - vec2<i32>(1);
85
+
86
+ var output = vec2<f32>(1.0, 0.0); // Initialize min/max
87
+
88
+ for (var j = 0; j < HZB_FOOTPRINT_Y; j++) {
89
+ for (var i = 0; i < HZB_FOOTPRINT_X; i++) {
90
+
91
+ let load_coord = min(start + vec2<i32>(i, j), last);
92
+
93
+ let v = textureLoad(tInput, load_coord, 0).r;
94
+
95
+ output.x = min(output.x, v);
96
+ output.y = max(output.y, v);
97
+ }
98
+ }
99
+
100
+ textureStore(tOutput, vec2<i32>(global_id.xy), vec4<f32>(output, 0.0, 0.0));
101
+ }
102
+ `, [
103
+ chunk_hzb_footprint_x,
104
+ chunk_hzb_footprint_y,
105
+ ]
106
+ )
107
+
108
+ /**
109
+ * First reduction: depth of a region of the source (`settings.clip_region`) into the HZB's mip 0, min in
110
+ * R and max in G. The region is the whole viewport for a camera, and a slot of the atlas for a shadow
111
+ * map. Each HZB texel reduces every source texel its area overlaps, a footprint of
112
+ * {@link HZB_FOOTPRINT_X} by {@link HZB_FOOTPRINT_Y} texels at most.
113
+ *
114
+ * @type {ComputeShader}
115
+ */
116
+ export const shader_hzb_reduce_mip0 = ComputeShader.from({
117
+ label: 'HZB / reduce mip0',
118
+ resources,
119
+ body,
120
+ });
@@ -13,7 +13,7 @@ export class TinyGltf {
13
13
  * @readonly
14
14
  * @type {TextureFormat}
15
15
  */
16
- static readonly "__#300@#UNCOMPRESSED_TARGET": TextureFormat;
16
+ static readonly "__#302@#UNCOMPRESSED_TARGET": TextureFormat;
17
17
  /**
18
18
  * @param {AssetManager} assetManager
19
19
  * @param {AssetRequestScope} [scope]
@@ -9,6 +9,13 @@ export class GPUMaterialManager {
9
9
  * @param {GPUSamplerManager} [samplers] required by templates that bind shared samplers — terrain's
10
10
  */
11
11
  constructor(device: GPUDevice, textures: TextureManager, render_pipelines: RenderPipelineManager, bindings: BindGroupManager, virtual_textures?: VirtualTextureManager, samplers?: GPUSamplerManager);
12
+ /**
13
+ * Sent with a material when {@link update} restages its row because its {@link ShadeMaterial#version}
14
+ * moved: what the scene's material table and the material's uniform hold changes with this frame.
15
+ * Not sent for a material's first row, which {@link obtain} writes.
16
+ * @type {Signal<ShadeMaterial>}
17
+ */
18
+ onMaterialRestaged: any;
12
19
  /**
13
20
  *
14
21
  * @type {Map<ShadeMaterial, GPUMaterialContext>}
@@ -31,13 +38,16 @@ export class GPUMaterialManager {
31
38
  * @param {GPUViewContext} options.view
32
39
  * @param {number} options.texture_viz_mesh
33
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.
34
43
  * @returns {{g_pbr: number, g_normal: number, g_albedo: number, g_emissive: number}} updated g-buffer
35
44
  */
36
- 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, }: {
37
46
  graph: FrameGraph;
38
47
  view: GPUViewContext;
39
48
  texture_viz_mesh: number;
40
49
  texture_viz_triangle: number;
50
+ texture_normal: number;
41
51
  }): {
42
52
  g_pbr: number;
43
53
  g_normal: number;
@@ -1 +1 @@
1
- {"version":3,"file":"GPUMaterialManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/material/GPUMaterialManager.js"],"names":[],"mappings":"AA2NA;IAoFI;;;;;;;;OAQG;IACH,yCANW,cAAc,oBACd,qBAAqB,YACrB,gBAAgB,qBAChB,qBAAqB,aACrB,iBAAiB,EAiD3B;IArID;;;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,QAiChC;;CAEJ;8BA33BY,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"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from "../../../core/assert.js";
2
+ import Signal from "../../../core/events/signal/Signal.js";
2
3
  import { BindGroupLayoutDescriptor } from "../../descriptor/binding/BindGroupLayoutDescriptor.js";
3
4
  import { BufferBindingLayout } from "../../descriptor/binding/BufferBindingLayout.js";
4
5
  import { GPUShaderStage } from "../../descriptor/GPUShaderStage.js";
@@ -219,6 +220,14 @@ const material_buffer_pipeline_descriptor = RenderPipelineDescriptor.from({
219
220
 
220
221
  export class GPUMaterialManager {
221
222
 
223
+ /**
224
+ * Sent with a material when {@link update} restages its row because its {@link ShadeMaterial#version}
225
+ * moved: what the scene's material table and the material's uniform hold changes with this frame.
226
+ * Not sent for a material's first row, which {@link obtain} writes.
227
+ * @type {Signal<ShadeMaterial>}
228
+ */
229
+ onMaterialRestaged = new Signal();
230
+
222
231
  /**
223
232
  * @type {GPUDevice}
224
233
  */
@@ -458,6 +467,8 @@ export class GPUMaterialManager {
458
467
  * @param {GPUViewContext} options.view
459
468
  * @param {number} options.texture_viz_mesh
460
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.
461
472
  * @returns {{g_pbr: number, g_normal: number, g_albedo: number, g_emissive: number}} updated g-buffer
462
473
  */
463
474
  graph_viz_render({
@@ -465,9 +476,11 @@ export class GPUMaterialManager {
465
476
  view,
466
477
  texture_viz_mesh,
467
478
  texture_viz_triangle,
479
+ texture_normal,
468
480
  }) {
469
481
 
470
482
  assert.defined(graph, 'graph');
483
+ assert.isNonNegativeInteger(texture_normal, 'texture_normal');
471
484
  assert.defined(view, 'view');
472
485
 
473
486
  /**
@@ -611,14 +624,7 @@ export class GPUMaterialManager {
611
624
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
612
625
  })
613
626
  );
614
- pass_data.g_normal = pass.create(
615
- "g-buffer / Normal",
616
- TextureResourceDescriptor.from({
617
- format: 'rgba16uint',
618
- resolution: view.resolution,
619
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
620
- })
621
- );
627
+ pass_data.g_normal = pass.write(texture_normal);
622
628
  pass_data.g_albedo = pass.create(
623
629
  "g-buffer / Albedo",
624
630
  TextureResourceDescriptor.from({
@@ -906,6 +912,8 @@ export class GPUMaterialManager {
906
912
  const row = this.#stage_metadata(material_ctx);
907
913
 
908
914
  material_ctx.write_uniform(queue, row);
915
+
916
+ this.onMaterialRestaged.send1(material_ctx.source);
909
917
  }
910
918
  }
911
919