@woosh/meep-engine 3.60.4 → 3.60.5

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 (379) hide show
  1. package/CHANGELOG.md +2602 -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.map +1 -1
  63. package/src/shade/renderer/Renderer.js +7 -5
  64. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
  65. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  66. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
  67. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  68. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  69. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  70. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  71. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  72. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +2 -2
  73. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +2 -2
  74. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +2 -1
  75. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  76. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +18 -1
  77. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
  78. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
  79. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
  80. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
  81. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
  82. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
  83. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
  85. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  86. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +1 -8
  87. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +5 -5
  88. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  89. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +10 -10
  90. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +1 -4
  91. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  92. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1 -10
  93. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
  94. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
  96. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
  98. package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
  99. package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
  100. package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
  101. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
  102. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
  103. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
  104. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
  105. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
  106. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
  107. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
  108. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  109. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
  110. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
  111. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
  112. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
  113. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
  114. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
  115. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
  116. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
  117. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
  118. package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
  119. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
  120. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  121. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
  122. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
  123. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
  124. package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
  125. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  126. package/src/shade/renderer/material/GPUMaterialManager.d.ts +7 -0
  127. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  128. package/src/shade/renderer/material/GPUMaterialManager.js +11 -0
  129. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
  130. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  131. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
  132. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  133. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
  134. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
  135. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  136. package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
  137. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
  138. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
  139. package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
  140. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  141. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  142. package/src/shade/renderer/water/shader_water.js +22 -13
  143. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
  144. package/src/shade/renderer/water/shader_water_avboit.js +7 -7
  145. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
  146. package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
  147. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
  148. package/editor/REWORK_PLAN_2026_08.md +0 -692
  149. package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
  150. package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
  151. package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
  152. package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
  153. package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
  154. package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
  155. package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
  156. package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
  157. package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
  158. package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
  159. package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
  160. package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
  161. package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
  162. package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
  163. package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
  164. package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
  165. package/src/REVIEW_2026_08_06/adv-core.md +0 -511
  166. package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
  167. package/src/REVIEW_2026_08_06/adv-view.md +0 -446
  168. package/src/REVIEW_2026_08_06/api-core.md +0 -296
  169. package/src/REVIEW_2026_08_06/api-engine.md +0 -195
  170. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
  171. package/src/REVIEW_2026_08_06/core-binary.md +0 -348
  172. package/src/REVIEW_2026_08_06/core-collection.md +0 -376
  173. package/src/REVIEW_2026_08_06/core-math.md +0 -221
  174. package/src/REVIEW_2026_08_06/core-process.md +0 -266
  175. package/src/REVIEW_2026_08_06/core-science.md +0 -223
  176. package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
  177. package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
  178. package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
  179. package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
  180. package/src/REVIEW_2026_08_06/engine-input.md +0 -197
  181. package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
  182. package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
  183. package/src/REVIEW_2026_08_06/generation.md +0 -176
  184. package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
  185. package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
  186. package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
  187. package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
  188. package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
  189. package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
  190. package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
  191. package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
  192. package/src/REVIEW_2026_08_06/view.md +0 -667
  193. package/src/REVIEW_2026_08_06.md +0 -610
  194. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
  195. package/src/core/bvh2/bvh3/NOTES.md +0 -2
  196. package/src/core/bvh8/NOTES.md +0 -63
  197. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
  198. package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
  199. package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
  200. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
  201. package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
  202. package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
  203. package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
  204. package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
  205. package/src/core/geom/3d/gjk/NOTES.md +0 -8
  206. package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
  207. package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
  208. package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
  209. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
  210. package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
  211. package/src/engine/REVIEW_2026_07_03.md +0 -211
  212. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
  213. package/src/engine/control/first-person/DESIGN.md +0 -658
  214. package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
  215. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
  216. package/src/engine/control/first-person/TODO.md +0 -160
  217. package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
  218. package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
  219. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
  220. package/src/engine/ecs/ik/PLAN.md +0 -179
  221. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
  222. package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
  223. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
  224. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
  225. package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
  226. package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
  227. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
  228. package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
  229. package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
  230. package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
  231. package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
  232. package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
  233. package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
  234. package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
  235. package/src/engine/network/CONGESTION_CONTROL.md +0 -87
  236. package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
  237. package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
  238. package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
  239. package/src/engine/physics/cloth/PLAN.md +0 -3056
  240. package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
  241. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
  242. package/src/engine/physics/fluid/solver/NOTES.md +0 -46
  243. package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
  244. package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
  245. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
  246. package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
  247. package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
  248. package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
  249. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
  250. package/src/format/image/avif/DECISIONS.md +0 -545
  251. package/src/format/image/jpeg/NOTES.md +0 -3
  252. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
  253. package/src/generation/COORDINATES.md +0 -54
  254. package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
  255. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
  256. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
  257. package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
  258. package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
  259. package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
  260. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
  261. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
  262. package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
  263. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
  264. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
  265. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
  266. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
  267. package/src/shade/RENDERER_CONTRACT.md +0 -697
  268. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
  269. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
  270. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
  271. package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
  272. package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
  273. package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
  274. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
  275. package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
  276. package/src/shade/renderer/NOTES.md +0 -78
  277. package/src/shade/renderer/PLAN.md +0 -8
  278. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
  279. package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
  280. package/src/shade/renderer/atmosphere/NOTES.md +0 -6
  281. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
  282. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
  283. package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
  284. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
  285. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
  286. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
  287. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
  288. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
  289. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
  290. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
  291. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
  292. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
  293. package/src/shade/renderer/camera/orbital/README.md +0 -81
  294. package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
  295. package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
  296. package/src/shade/renderer/camera/orbital/index.js +0 -9
  297. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
  298. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
  299. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
  300. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
  301. package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
  302. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
  303. package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
  304. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
  305. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
  306. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -481
  307. package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
  308. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
  309. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
  310. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
  311. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
  312. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
  313. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
  314. package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -529
  315. package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
  316. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4306
  317. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
  318. package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
  319. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
  320. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
  321. package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
  322. package/src/shade/renderer/hiz/NOTES.md +0 -3
  323. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
  324. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
  325. package/src/shade/renderer/light/cluster/NOTES.md +0 -11
  326. package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
  327. package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
  328. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
  329. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
  330. package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
  331. package/src/shade/renderer/particles/DESIGN.md +0 -1011
  332. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -280
  333. package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
  334. package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
  335. package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
  336. package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
  337. package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
  338. package/src/shade/renderer/postprocess/nss/NOTES.md +0 -332
  339. package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
  340. package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
  341. package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
  342. package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
  343. package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
  344. package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
  345. package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
  346. package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
  347. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
  348. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
  349. package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
  350. package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
  351. package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -391
  352. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -153
  353. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
  354. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
  355. package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
  356. package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
  357. package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
  358. package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
  359. package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
  360. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
  361. package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
  362. package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -927
  363. package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
  364. package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
  365. package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
  366. package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
  367. package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
  368. package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
  369. package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
  370. package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
  371. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
  372. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
  373. package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -3
  374. package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
  375. package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
  376. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
  377. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
  378. package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
  379. package/src/shade/wgsl/NOTES.md +0 -4
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Turn a virtual geometry into an ordinary meshlet geometry of at most `triangle_limit` triangles: a
3
+ * proxy, for whatever wants a plain mesh of an asset that is only clusters.
4
+ *
5
+ * **No simplification happens here.** The DAG already holds the asset at every level of detail; the
6
+ * proxy is a cut through it, and the cut's clusters are meshlets already (`VGEO_FORMAT.md` §8). The
7
+ * cut starts at the roots and refines, one group at a time, the group whose parents carry the largest
8
+ * `self_error`, and stops at the first refinement that would take it over the limit — so the error is
9
+ * as uniform as the DAG allows.
10
+ *
11
+ * A group is refined only once every one of its parents is in the cut (`group_parent_count`, §6), and
12
+ * then all of them are replaced together, so the cut is watertight at every step, as a view's cut is.
13
+ *
14
+ * Pages are installed as the descent reaches them, down to one band below the cut: a small proxy of a
15
+ * large asset reads the coarse prefix of the file and nothing else.
16
+ *
17
+ * The DAG's roots are as coarse as it goes: a limit below the roots' triangle count gets the roots.
18
+ *
19
+ * @param {VGeoContainerReader} reader an open container, which is one material's geometry; the pages the
20
+ * descent reaches are installed into it and left there
21
+ * @param {number} triangle_limit
22
+ * @returns {Promise<MeshletGeometry>}
23
+ *
24
+ * @author Alex Goldring
25
+ * @copyright Company Named Limited (c) 2026
26
+ */
27
+ export function vgeo_to_proxy_mesh(reader: VGeoContainerReader, triangle_limit: number): Promise<MeshletGeometry>;
28
+ export type VGeoContainerReader = import("../format/read/VGeoContainerReader.js").VGeoContainerReader;
29
+ export type VGeoPage = import("../format/read/VGeoPage.js").VGeoPage;
30
+ import { MeshletGeometry } from "../../MeshletGeometry.js";
31
+ //# sourceMappingURL=vgeo_to_proxy_mesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_to_proxy_mesh.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,2CARW,mBAAmB,kBAEnB,MAAM,GACJ,QAAQ,eAAe,CAAC,CAcpC;kCA7CY,OAAO,uCAAuC,EAAE,mBAAmB;uBACnE,OAAO,4BAA4B,EAAE,QAAQ;gCAP1B,0BAA0B"}
@@ -0,0 +1,343 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
3
+ import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
4
+ import { IndexedFloatMaxHeap } from "../../../../../core/collection/heap/IndexedFloatMaxHeap.js";
5
+ import { aabb3_array_combine } from "../../../../../core/geom/3d/aabb/aabb3_array_combine.js";
6
+ import { blas_from_meshlets } from "../../blas_from_meshlets.js";
7
+ import { MESHLET_METADATA_STRUCT } from "../../meshlet/encoding/MESHLET_METADATA_STRUCT.js";
8
+ import { MeshletGeometry } from "../../MeshletGeometry.js";
9
+ import { VGEO_NO_CHILD } from "../format/cluster/VGEO_NO_CHILD.js";
10
+ import { VGEO_SAME_PAGE } from "../format/cluster/VGEO_SAME_PAGE.js";
11
+ import { vgeo_meshlet_metadata_write } from "../runtime/vgeo_meshlet_metadata_write.js";
12
+
13
+ /**
14
+ * @typedef {import("../format/read/VGeoContainerReader.js").VGeoContainerReader} VGeoContainerReader
15
+ * @typedef {import("../format/read/VGeoPage.js").VGeoPage} VGeoPage
16
+ */
17
+
18
+ /**
19
+ * A page not yet given its groups' ids.
20
+ * @type {number}
21
+ */
22
+ const NO_BASE = -1;
23
+
24
+ /**
25
+ * Turn a virtual geometry into an ordinary meshlet geometry of at most `triangle_limit` triangles: a
26
+ * proxy, for whatever wants a plain mesh of an asset that is only clusters.
27
+ *
28
+ * **No simplification happens here.** The DAG already holds the asset at every level of detail; the
29
+ * proxy is a cut through it, and the cut's clusters are meshlets already (`VGEO_FORMAT.md` §8). The
30
+ * cut starts at the roots and refines, one group at a time, the group whose parents carry the largest
31
+ * `self_error`, and stops at the first refinement that would take it over the limit — so the error is
32
+ * as uniform as the DAG allows.
33
+ *
34
+ * A group is refined only once every one of its parents is in the cut (`group_parent_count`, §6), and
35
+ * then all of them are replaced together, so the cut is watertight at every step, as a view's cut is.
36
+ *
37
+ * Pages are installed as the descent reaches them, down to one band below the cut: a small proxy of a
38
+ * large asset reads the coarse prefix of the file and nothing else.
39
+ *
40
+ * The DAG's roots are as coarse as it goes: a limit below the roots' triangle count gets the roots.
41
+ *
42
+ * @param {VGeoContainerReader} reader an open container, which is one material's geometry; the pages the
43
+ * descent reaches are installed into it and left there
44
+ * @param {number} triangle_limit
45
+ * @returns {Promise<MeshletGeometry>}
46
+ *
47
+ * @author Alex Goldring
48
+ * @copyright Company Named Limited (c) 2026
49
+ */
50
+ export async function vgeo_to_proxy_mesh(reader, triangle_limit) {
51
+ assert.defined(reader.root, 'reader.root — the container must be open');
52
+ assert.isNonNegativeInteger(triangle_limit, 'triangle_limit');
53
+
54
+ const cut = new ProxyCut(reader);
55
+
56
+ await cut.descend(triangle_limit);
57
+
58
+ return cut.build();
59
+ }
60
+
61
+ /**
62
+ * The cut, and the bookkeeping of its descent.
63
+ *
64
+ * Groups are given dense ids as their page is installed, so the per-group state is typed arrays sized
65
+ * once from the header's `total_groups`.
66
+ */
67
+ class ProxyCut {
68
+ /**
69
+ * @param {VGeoContainerReader} reader
70
+ */
71
+ constructor(reader) {
72
+ this.reader = reader;
73
+
74
+ const capacity = reader.header.total_groups;
75
+
76
+ /**
77
+ * First group id of each page; {@link NO_BASE} until the page is installed.
78
+ */
79
+ this.page_base = new Int32Array(reader.header.total_pages).fill(NO_BASE);
80
+
81
+ this.next_base = 0;
82
+
83
+ this.group_page = new Uint32Array(capacity);
84
+ this.group_index = new Uint16Array(capacity);
85
+
86
+ /**
87
+ * Parents of the group in the cut so far.
88
+ */
89
+ this.arrived = new Uint16Array(capacity);
90
+
91
+ /**
92
+ * Their triangles: what refining the group takes out of the cut.
93
+ */
94
+ this.parent_triangles = new Uint32Array(capacity);
95
+
96
+ this.refined = new Uint8Array(capacity);
97
+
98
+ /**
99
+ * Groups whose every parent is in the cut, by the error those parents carry.
100
+ */
101
+ this.refinable = new IndexedFloatMaxHeap(capacity);
102
+
103
+ /**
104
+ * Every cluster that entered the cut, as the id of its group, its index in its page and the id
105
+ * of its child group (-1 for a leaf). One leaves the cut when its child group is refined.
106
+ * @type {number[]}
107
+ */
108
+ this.entered_group = [];
109
+ this.entered_cluster = [];
110
+ this.entered_child = [];
111
+
112
+ this.triangle_count = 0;
113
+ }
114
+
115
+ /**
116
+ * @param {number} limit
117
+ * @returns {Promise<void>}
118
+ */
119
+ async descend(limit) {
120
+ const root = this.reader.root;
121
+
122
+ this.#register(root);
123
+
124
+ for (let group = 0; group < root.group_parent_count.length; group++) {
125
+ // no cluster refines into it: the top of the DAG
126
+ if (root.group_parent_count[group] === 0) {
127
+ await this.#enter(this.page_base[root.index] + group);
128
+ }
129
+ }
130
+
131
+ const refinable = this.refinable;
132
+
133
+ while (refinable.size > 0) {
134
+ const id = refinable.pop_max();
135
+
136
+ if (this.triangle_count - this.parent_triangles[id] + this.#group_triangles(id) > limit) {
137
+ // the largest error left does not fit: refining anywhere finer would make it less uniform
138
+ break;
139
+ }
140
+
141
+ this.refined[id] = 1;
142
+ this.triangle_count -= this.parent_triangles[id];
143
+
144
+ await this.#enter(id);
145
+ }
146
+ }
147
+
148
+ /**
149
+ * The cut's clusters as a meshlet geometry: their payloads gathered as they are stored, a metadata
150
+ * row each, and the BVH the mesh path builds.
151
+ *
152
+ * @returns {MeshletGeometry}
153
+ */
154
+ build() {
155
+ /** @type {VGeoPage[]} */
156
+ const pages = [];
157
+ /** @type {number[]} */
158
+ const clusters = [];
159
+
160
+ let data_size = 0;
161
+
162
+ for (let i = 0; i < this.entered_group.length; i++) {
163
+ const child = this.entered_child[i];
164
+
165
+ if (child !== -1 && this.refined[child] === 1) {
166
+ continue;
167
+ }
168
+
169
+ const page = this.reader.page(this.group_page[this.entered_group[i]]);
170
+ const cluster = this.entered_cluster[i];
171
+
172
+ pages.push(page);
173
+ clusters.push(cluster);
174
+
175
+ data_size += page.cluster_payload_size[cluster];
176
+ }
177
+
178
+ const count = clusters.length;
179
+
180
+ const data = new Uint8Array(data_size);
181
+
182
+ const metadata = BinaryBuffer.fromEndianness(platform_compute_endianness());
183
+
184
+ metadata.setCapacity(count * MESHLET_METADATA_STRUCT.size);
185
+
186
+ const result = new MeshletGeometry();
187
+
188
+ const box = result.bounding_box;
189
+
190
+ box.set([Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity]);
191
+
192
+ let address = 0;
193
+
194
+ for (let i = 0; i < count; i++) {
195
+ const page = pages[i];
196
+ const cluster = clusters[i];
197
+
198
+ const start = page.payload_offset + page.cluster_payload_offset[cluster];
199
+ const size = page.cluster_payload_size[cluster];
200
+
201
+ data.set(page.bytes.subarray(start, start + size), address);
202
+
203
+ // §11.8: every payload size is a multiple of four, so each cluster starts on a word
204
+ vgeo_meshlet_metadata_write(metadata, page, cluster, address >>> 2);
205
+
206
+ // `aabb` is the cluster's tight fit, so their union is the proxy's
207
+ aabb3_array_combine(box, 0, box, 0, page.aabb, cluster * 6);
208
+
209
+ address += size;
210
+ }
211
+
212
+ const batch = result.meshlets;
213
+
214
+ batch.count = count;
215
+ batch.data_buffer = data.buffer;
216
+ batch.metadata_buffer = metadata.data.slice(0, count * MESHLET_METADATA_STRUCT.size);
217
+
218
+ // the box-diagonal sphere `meshlet_geometry_build_from_geometry` gives a mesh
219
+ const sphere = result.bounding_sphere;
220
+
221
+ sphere[0] = (box[0] + box[3]) * 0.5;
222
+ sphere[1] = (box[1] + box[4]) * 0.5;
223
+ sphere[2] = (box[2] + box[5]) * 0.5;
224
+ sphere[3] = 0.5 * Math.hypot(box[3] - box[0], box[4] - box[1], box[5] - box[2]);
225
+
226
+ result.name = this.reader.source.name;
227
+ result.primitive_count = this.triangle_count;
228
+ result.bvh = blas_from_meshlets(batch, result.primitive_count, box);
229
+
230
+ return result;
231
+ }
232
+
233
+ /**
234
+ * @param {number} id
235
+ * @returns {number}
236
+ */
237
+ #group_triangles(id) {
238
+ const page = this.reader.page(this.group_page[id]);
239
+ const group = this.group_index[id];
240
+
241
+ const first = page.group_cluster_first[group];
242
+ const end = first + page.group_cluster_count[group];
243
+
244
+ let triangles = 0;
245
+
246
+ for (let cluster = first; cluster < end; cluster++) {
247
+ triangles += page.triangle_count[cluster];
248
+ }
249
+
250
+ return triangles;
251
+ }
252
+
253
+ /**
254
+ * Give an installed page's groups their ids.
255
+ *
256
+ * @param {VGeoPage} page
257
+ */
258
+ #register(page) {
259
+ if (this.page_base[page.index] !== NO_BASE) {
260
+ return;
261
+ }
262
+
263
+ const base = this.next_base;
264
+ const group_count = page.group_cluster_count.length;
265
+
266
+ this.page_base[page.index] = base;
267
+
268
+ for (let group = 0; group < group_count; group++) {
269
+ this.group_page[base + group] = page.index;
270
+ this.group_index[base + group] = group;
271
+ }
272
+
273
+ this.next_base = base + group_count;
274
+ }
275
+
276
+ /**
277
+ * Put a group's clusters in the cut, and count each in at its child group, which becomes
278
+ * refinable once its last parent arrives.
279
+ *
280
+ * @param {number} id
281
+ * @returns {Promise<void>}
282
+ */
283
+ async #enter(id) {
284
+ const reader = this.reader;
285
+ const page = reader.page(this.group_page[id]);
286
+ const group = this.group_index[id];
287
+
288
+ const first = page.group_cluster_first[group];
289
+ const end = first + page.group_cluster_count[group];
290
+
291
+ // the child pages first: a child group's parent count lives in its own page
292
+ const installs = [];
293
+
294
+ for (let cluster = first; cluster < end; cluster++) {
295
+ const child_ref = page.child_ref[cluster];
296
+
297
+ if (child_ref === VGEO_NO_CHILD || child_ref === VGEO_SAME_PAGE) {
298
+ continue;
299
+ }
300
+
301
+ const child_page = page.child_page_index[child_ref];
302
+
303
+ if (!reader.is_resident(child_page)) {
304
+ installs.push(reader.install(
305
+ child_page, page.child_frame_offset[child_ref], page.child_fetch_size[child_ref]
306
+ ));
307
+ }
308
+ }
309
+
310
+ for (const child_page of await Promise.all(installs)) {
311
+ this.#register(child_page);
312
+ }
313
+
314
+ for (let cluster = first; cluster < end; cluster++) {
315
+ const triangles = page.triangle_count[cluster];
316
+
317
+ this.triangle_count += triangles;
318
+
319
+ this.entered_group.push(id);
320
+ this.entered_cluster.push(cluster);
321
+
322
+ const child_ref = page.child_ref[cluster];
323
+
324
+ if (child_ref === VGEO_NO_CHILD) {
325
+ this.entered_child.push(-1);
326
+ continue;
327
+ }
328
+
329
+ const child_page = reader.page(child_ref === VGEO_SAME_PAGE ? page.index : page.child_page_index[child_ref]);
330
+ const child_group = page.child_group[cluster];
331
+ const child = this.page_base[child_page.index] + child_group;
332
+
333
+ this.entered_child.push(child);
334
+
335
+ this.arrived[child]++;
336
+ this.parent_triangles[child] += triangles;
337
+
338
+ if (this.arrived[child] === child_page.group_parent_count[child_group]) {
339
+ this.refinable.insert(child, page.self_error[cluster]);
340
+ }
341
+ }
342
+ }
343
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * One cluster's meshlet metadata row, written at `buffer`'s position.
3
+ *
4
+ * `VGEO_FORMAT.md` §8: the 40-byte rows are synthesized from the cluster record — `aabb` becomes
5
+ * `bounds_box`, the u8 counts widen to u32, `encoding_flags` passes through. Only `address` depends
6
+ * on where the payload went, so the caller says.
7
+ *
8
+ * @param {BinaryBuffer} buffer
9
+ * @param {VGeoPage} page
10
+ * @param {number} cluster index within `page`
11
+ * @param {number} address where the cluster's payload starts in the data the row will be read against, in 4-byte words
12
+ *
13
+ * @author Alex Goldring
14
+ * @copyright Company Named Limited (c) 2026
15
+ */
16
+ export function vgeo_meshlet_metadata_write(buffer: BinaryBuffer, page: VGeoPage, cluster: number, address: number): void;
17
+ //# sourceMappingURL=vgeo_meshlet_metadata_write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_meshlet_metadata_write.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AACH,2FANW,MAAM,WACN,MAAM,QAahB"}
@@ -0,0 +1,29 @@
1
+ import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
2
+ import {
3
+ MESHLET_METADATA_STRUCT
4
+ } from "../../meshlet/encoding/MESHLET_METADATA_STRUCT.js";
5
+
6
+ /**
7
+ * One cluster's meshlet metadata row, written at `buffer`'s position.
8
+ *
9
+ * `VGEO_FORMAT.md` §8: the 40-byte rows are synthesized from the cluster record — `aabb` becomes
10
+ * `bounds_box`, the u8 counts widen to u32, `encoding_flags` passes through. Only `address` depends
11
+ * on where the payload went, so the caller says.
12
+ *
13
+ * @param {BinaryBuffer} buffer
14
+ * @param {VGeoPage} page
15
+ * @param {number} cluster index within `page`
16
+ * @param {number} address where the cluster's payload starts in the data the row will be read against, in 4-byte words
17
+ *
18
+ * @author Alex Goldring
19
+ * @copyright Company Named Limited (c) 2026
20
+ */
21
+ export function vgeo_meshlet_metadata_write(buffer, page, cluster, address) {
22
+ write_wgsl_type_value({
23
+ bounds_box: page.aabb.subarray(cluster * 6, cluster * 6 + 6),
24
+ address,
25
+ primitive_count: page.triangle_count[cluster],
26
+ vertex_count: page.vertex_count[cluster],
27
+ flags: page.encoding_flags[cluster],
28
+ }, buffer, MESHLET_METADATA_STRUCT);
29
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_runtime_meshlet_batch.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,4DALa,YAAY,CA6CxB;6BA9D4B,+BAA+B"}
1
+ {"version":3,"file":"vgeo_runtime_meshlet_batch.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,4DALa,YAAY,CAuCxB;6BAzD4B,+BAA+B"}
@@ -1,11 +1,11 @@
1
1
  import { assert } from "../../../../../core/assert.js";
2
2
  import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
3
3
  import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
4
- import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
5
4
  import {
6
5
  MESHLET_METADATA_STRUCT
7
6
  } from "../../meshlet/encoding/MESHLET_METADATA_STRUCT.js";
8
7
  import { MeshletBatch } from "../../meshlet/MeshletBatch.js";
8
+ import { vgeo_meshlet_metadata_write } from "./vgeo_meshlet_metadata_write.js";
9
9
 
10
10
  /**
11
11
  * A decoded page, as the meshlet pool takes it.
@@ -46,18 +46,12 @@ export function vgeo_runtime_meshlet_batch(page) {
46
46
  metadata.setCapacity(count * MESHLET_METADATA_STRUCT.size);
47
47
 
48
48
  for (let cluster = 0; cluster < count; cluster++) {
49
- write_wgsl_type_value({
50
- bounds_box: page.aabb.subarray(cluster * 6, cluster * 6 + 6),
51
- /*
52
- Words, and relative to the page's payload section — `GPUMeshletManager` adds the
53
- allocation's own offset when it uploads. Format §11.8 makes every payload offset a
54
- multiple of four, so this division is exact rather than rounded.
55
- */
56
- address: page.cluster_payload_offset[cluster] >>> 2,
57
- primitive_count: page.triangle_count[cluster],
58
- vertex_count: page.vertex_count[cluster],
59
- flags: page.encoding_flags[cluster],
60
- }, metadata, MESHLET_METADATA_STRUCT);
49
+ /*
50
+ Words, and relative to the page's payload section — `GPUMeshletManager` adds the
51
+ allocation's own offset when it uploads. Format §11.8 makes every payload offset a
52
+ multiple of four, so this division is exact rather than rounded.
53
+ */
54
+ vgeo_meshlet_metadata_write(metadata, page, cluster, page.cluster_payload_offset[cluster] >>> 2);
61
55
  }
62
56
 
63
57
  // `BinaryBuffer.data` is the ArrayBuffer itself, and `setCapacity` may have rounded it up;
@@ -1 +1 @@
1
- {"version":3,"file":"GPUProbeClipmapGI.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js"],"names":[],"mappings":"AAeA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IA0DI;;OAEG;IACH,sBAFW,eAAe,EAMzB;IAED;;OAEG;IACH,qCAEC;IAED;;OAEG;IACH,qCAEC;IAED;;OAEG;IACH,oCAEC;IAED;;;;;;;;;;;;;;OAcG;IACH;QAT+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACgB,QAAQ,EAAtC,oBAAoB;QACJ,KAAK,EAArB,MAAM;QACU,MAAM,EAAtB,MAAM;QACK,IAAI;QACE,MAAM,GAAvB,MAAM;aAkGhB;IAED;;;OAGG;IACH,0BAEC;IAED;;;;;;;;;OASG;IACH,4CAUC;IAwDD;;;;;;;;;;OAUG;IACH;QAN+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACgB,QAAQ,EAAtC,oBAAoB;QACF,UAAU,EAA5B,MAAM,EAAE;QACN,MAAM,CAmBlB;IAED;;;;;OAKG;IACH,uBAFW,aAAa,QASvB;IAED;;;OAGG;IACH,0BAHW,aAAa,GACX,OAAO,CAanB;IAyCD;;;OAGG;IACH,gBAoBC;IAED,gBAcC;;CACJ;yBArcY,OAAO,8DAA8D,EAAE,UAAU;8BACjF,OAAO,0BAA0B,EAAE,eAAe;6BAClD,OAAO,8BAA8B,EAAE,cAAc;mCACrD,OAAO,2BAA2B,EAAE,oBAAoB;4BACxD,OAAO,4BAA4B,EAAE,aAAa;gCAjB/B,4BAA4B;gCAQ5B,4BAA4B;uCAErB,6BAA6B"}
1
+ {"version":3,"file":"GPUProbeClipmapGI.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js"],"names":[],"mappings":"AAeA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IA0DI;;OAEG;IACH,sBAFW,eAAe,EAMzB;IAED;;OAEG;IACH,qCAEC;IAED;;OAEG;IACH,qCAEC;IAED;;OAEG;IACH,oCAEC;IAED;;;;;;;;;;;;;;OAcG;IACH;QAT+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACgB,QAAQ,EAAtC,oBAAoB;QACJ,KAAK,EAArB,MAAM;QACU,MAAM,EAAtB,MAAM;QACK,IAAI;QACE,MAAM,GAAvB,MAAM;aA2FhB;IAED;;;OAGG;IACH,0BAEC;IAED;;;;;;;;;OASG;IACH,4CAUC;IAwDD;;;;;;;;;;OAUG;IACH;QAN+B,KAAK,EAAzB,UAAU;QACc,IAAI,EAA5B,cAAc;QACgB,QAAQ,EAAtC,oBAAoB;QACF,UAAU,EAA5B,MAAM,EAAE;QACN,MAAM,CAmBlB;IAED;;;;;OAKG;IACH,uBAFW,aAAa,QASvB;IAED;;;OAGG;IACH,0BAHW,aAAa,GACX,OAAO,CAanB;IAyCD;;;OAGG;IACH,gBAoBC;IAED,gBAcC;;CACJ;yBA9bY,OAAO,8DAA8D,EAAE,UAAU;8BACjF,OAAO,0BAA0B,EAAE,eAAe;6BAClD,OAAO,8BAA8B,EAAE,cAAc;mCACrD,OAAO,2BAA2B,EAAE,oBAAoB;4BACxD,OAAO,4BAA4B,EAAE,aAAa;gCAjB/B,4BAA4B;gCAQ5B,4BAA4B;uCAErB,6BAA6B"}
@@ -180,12 +180,6 @@ export class GPUProbeClipmapGI {
180
180
 
181
181
  const scene = view.scene;
182
182
  const sdf = scene.geometries.sdf;
183
- const materials = this.#graphics.materials_resident;
184
-
185
- // the scene's materials as they are this frame: a repack recaptures its pairs
186
- materials.ensure_scene_materials(scene);
187
- materials.update();
188
-
189
183
  sdf.configure(settings.mesh_sdf_voxel_size, settings.mesh_sdf_max_bricks);
190
184
  sdf.trim();
191
185
  sdf.cards.capture_mode = settings.card_capture_mode;
@@ -193,7 +187,7 @@ export class GPUProbeClipmapGI {
193
187
  graph,
194
188
  budget: settings.mesh_sdf_bake_budget,
195
189
  capture_budget: settings.card_capture_budget,
196
- materials,
190
+ materials: this.#graphics.materials_resident,
197
191
  material_contexts: this.#graphics.materials,
198
192
  });
199
193
 
@@ -235,7 +229,6 @@ export class GPUProbeClipmapGI {
235
229
  brick_clipmap: this.#brick_clipmap,
236
230
  bricks,
237
231
  scene,
238
- materials,
239
232
  card_rows: this.#holds.rows_buffer,
240
233
  resampling: settings.resampling,
241
234
  });
@@ -15,8 +15,8 @@
15
15
  * its hold and its pair, the new ones taken before the old ones go, so a cache or card set a row keeps
16
16
  * drawing is never let go in between.
17
17
  *
18
- * When the resident material context repacks a material whose version moved, each of that
19
- * material's pairs is recaptured (§6.5), and the holds of its rows move to the side it draws now.
18
+ * When the material manager restages a material whose version moved, each of that material's pairs
19
+ * is recaptured (§6.5), and the holds of its rows move to the side it draws now.
20
20
  *
21
21
  * {@link attach} subscribes and walks the rows already there; {@link detach} gives every hold and card
22
22
  * set back. Neither trims: a cache with no holder stays until its user trims, so leaving the mode keeps
@@ -25,7 +25,7 @@
25
25
  export class ProbeClipmapSceneHolds {
26
26
  /**
27
27
  * @param {GPUSceneContext} scene
28
- * @param {GraphicsContext} graphics whose resident materials' repacks recapture the pairs of the material
28
+ * @param {GraphicsContext} graphics whose material manager's restages recapture the pairs of the material
29
29
  */
30
30
  constructor(scene: GPUSceneContext, graphics: GraphicsContext);
31
31
  /**
@@ -43,7 +43,7 @@ export class ProbeClipmapSceneHolds {
43
43
  */
44
44
  get pair_count(): number;
45
45
  /**
46
- * Recaptures asked for, a pair each time its material was repacked.
46
+ * Recaptures asked for, a pair each time its material was restaged.
47
47
  * @returns {number}
48
48
  */
49
49
  get recaptures_requested(): number;
@@ -79,6 +79,6 @@ export type GPUSceneContext = import("../../scene/GPUSceneContext.js").GPUSceneC
79
79
  export type MeshletGeometry = import("../../geometry/MeshletGeometry.js").MeshletGeometry;
80
80
  export type GPUGeometryMetadata = import("../../geometry/GPUGeometryMetadata.js").GPUGeometryMetadata;
81
81
  export type ShadeMaterial = import("../../material/ShadeMaterial.js").ShadeMaterial;
82
- export type GPUResidentMaterialContext = import("../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext;
82
+ export type GPUMaterialManager = import("../../material/GPUMaterialManager.js").GPUMaterialManager;
83
83
  export type GraphicsContext = import("../../GraphicsContext.js").GraphicsContext;
84
84
  //# sourceMappingURL=ProbeClipmapSceneHolds.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProbeClipmapSceneHolds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js"],"names":[],"mappings":"AAwDA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAwEI;;;OAGG;IACH,mBAHW,eAAe,YACf,eAAe,EASzB;IAED;;OAEG;IACH,sEAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,mCAEC;IAED;;;OAGG;IACH,qCAEC;IAED,0BAEC;IAED;;;;;;OAMG;IACH,oBAJW,mBAAmB,YACnB,aAAa,GACX,MAAM,GAAC,SAAS,CAI5B;IAED;;;;OAIG;IACH,6BAIC;IAED,eAiBC;IAED,eAuCC;IAED;;OAEG;IACH,cAiBC;;CA4TJ;8BA1mBY,OAAO,gCAAgC,EAAE,eAAe;8BACxD,OAAO,mCAAmC,EAAE,eAAe;kCAC3D,OAAO,uCAAuC,EAAE,mBAAmB;4BACnE,OAAO,iCAAiC,EAAE,aAAa;yCACvD,OAAO,uDAAuD,EAAE,0BAA0B;8BAC1F,OAAO,0BAA0B,EAAE,eAAe"}
1
+ {"version":3,"file":"ProbeClipmapSceneHolds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js"],"names":[],"mappings":"AAwDA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAwEI;;;OAGG;IACH,mBAHW,eAAe,YACf,eAAe,EASzB;IAED;;OAEG;IACH,sEAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,mCAEC;IAED;;;OAGG;IACH,qCAEC;IAED,0BAEC;IAED;;;;;;OAMG;IACH,oBAJW,mBAAmB,YACnB,aAAa,GACX,MAAM,GAAC,SAAS,CAI5B;IAED;;;;OAIG;IACH,6BAIC;IAED,eAiBC;IAED,eAuCC;IAED;;OAEG;IACH,cAiBC;;CA4TJ;8BA1mBY,OAAO,gCAAgC,EAAE,eAAe;8BACxD,OAAO,mCAAmC,EAAE,eAAe;kCAC3D,OAAO,uCAAuC,EAAE,mBAAmB;4BACnE,OAAO,iCAAiC,EAAE,aAAa;iCACvD,OAAO,sCAAsC,EAAE,kBAAkB;8BACjE,OAAO,0BAA0B,EAAE,eAAe"}
@@ -10,7 +10,7 @@ import { row_of_entity } from "../../scene/rows/GPUSceneRows.js";
10
10
  * @typedef {import("../../geometry/MeshletGeometry.js").MeshletGeometry} MeshletGeometry
11
11
  * @typedef {import("../../geometry/GPUGeometryMetadata.js").GPUGeometryMetadata} GPUGeometryMetadata
12
12
  * @typedef {import("../../material/ShadeMaterial.js").ShadeMaterial} ShadeMaterial
13
- * @typedef {import("../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext} GPUResidentMaterialContext
13
+ * @typedef {import("../../material/GPUMaterialManager.js").GPUMaterialManager} GPUMaterialManager
14
14
  * @typedef {import("../../GraphicsContext.js").GraphicsContext} GraphicsContext
15
15
  */
16
16
 
@@ -71,8 +71,8 @@ class Pair {
71
71
  * its hold and its pair, the new ones taken before the old ones go, so a cache or card set a row keeps
72
72
  * drawing is never let go in between.
73
73
  *
74
- * When the resident material context repacks a material whose version moved, each of that
75
- * material's pairs is recaptured (§6.5), and the holds of its rows move to the side it draws now.
74
+ * When the material manager restages a material whose version moved, each of that material's pairs
75
+ * is recaptured (§6.5), and the holds of its rows move to the side it draws now.
76
76
  *
77
77
  * {@link attach} subscribes and walks the rows already there; {@link detach} gives every hold and card
78
78
  * set back. Neither trims: a cache with no holder stays until its user trims, so leaving the mode keeps
@@ -86,7 +86,7 @@ export class ProbeClipmapSceneHolds {
86
86
  #scene;
87
87
 
88
88
  /**
89
- * @type {GPUResidentMaterialContext}
89
+ * @type {GPUMaterialManager}
90
90
  */
91
91
  #materials;
92
92
 
@@ -152,14 +152,14 @@ export class ProbeClipmapSceneHolds {
152
152
 
153
153
  /**
154
154
  * @param {GPUSceneContext} scene
155
- * @param {GraphicsContext} graphics whose resident materials' repacks recapture the pairs of the material
155
+ * @param {GraphicsContext} graphics whose material manager's restages recapture the pairs of the material
156
156
  */
157
157
  constructor(scene, graphics) {
158
158
  assert.defined(scene, 'scene');
159
159
  assert.defined(graphics, 'graphics');
160
160
 
161
161
  this.#scene = scene;
162
- this.#materials = graphics.materials_resident;
162
+ this.#materials = graphics.materials;
163
163
  this.#device = graphics.device;
164
164
  }
165
165
 
@@ -187,7 +187,7 @@ export class ProbeClipmapSceneHolds {
187
187
  }
188
188
 
189
189
  /**
190
- * Recaptures asked for, a pair each time its material was repacked.
190
+ * Recaptures asked for, a pair each time its material was restaged.
191
191
  * @returns {number}
192
192
  */
193
193
  get recaptures_requested() {
@@ -241,7 +241,7 @@ export class ProbeClipmapSceneHolds {
241
241
  this.#scene.geometries.sdf.onBaked.add(this.#baked, this);
242
242
  cards.onResident.add(this.#card_set_resident, this);
243
243
  cards.onWithdrawn.add(this.#card_set_withdrawn, this);
244
- this.#materials.onMaterialRepacked.add(this.#repacked, this);
244
+ this.#materials.onMaterialRestaged.add(this.#restaged, this);
245
245
 
246
246
  // a row not yet written is taken now, and moved when it is
247
247
  rows.for_each_mesh((entity, geometry, material, skinned, flags) => this.#written(entity, geometry, material, flags));
@@ -263,7 +263,7 @@ export class ProbeClipmapSceneHolds {
263
263
  sdf.onBaked.remove(this.#baked, this);
264
264
  cards.onResident.remove(this.#card_set_resident, this);
265
265
  cards.onWithdrawn.remove(this.#card_set_withdrawn, this);
266
- this.#materials.onMaterialRepacked.remove(this.#repacked, this);
266
+ this.#materials.onMaterialRestaged.remove(this.#restaged, this);
267
267
 
268
268
  for (const [entity, record] of this.#held) {
269
269
  sdf.release(record, this.#pair_of.get(entity).two_sided);
@@ -524,7 +524,7 @@ export class ProbeClipmapSceneHolds {
524
524
  /**
525
525
  * @param {ShadeMaterial} material
526
526
  */
527
- #repacked(material) {
527
+ #restaged(material) {
528
528
  const of_material = this.#pairs_of_material.get(material.id);
529
529
 
530
530
  if (of_material === undefined) {
@@ -156,13 +156,11 @@ export class GPUProbeClipmap {
156
156
  * the update orders after
157
157
  * @param {import("../../../scene/GPUSceneContext.js").GPUSceneContext} options.scene the scene the rays
158
158
  * light and shade: its lights, its environment, its rows and their geometry caches' cards
159
- * @param {import("../../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext} options.materials
160
- * the resident materials, updated this frame: what a hit no card sees takes
161
159
  * @param {GPUBuffer} options.card_rows the row → card set table, a word a `meshes` row
162
160
  * @param {boolean} options.resampling whether each update re-samples its neighbours, adding what they have
163
161
  * seen to its rays (`shader_probe_clipmap_resample`)
164
162
  */
165
- graph_update({ graph, x, y, z, depth, normal, camera, stbn, resolution, response_frames, ray_budget, rays_per_probe, brick_clipmap, bricks, scene, materials, card_rows, resampling }: {
163
+ graph_update({ graph, x, y, z, depth, normal, camera, stbn, resolution, response_frames, ray_budget, rays_per_probe, brick_clipmap, bricks, scene, card_rows, resampling }: {
166
164
  graph: FrameGraph;
167
165
  x: number;
168
166
  y: number;
@@ -178,7 +176,6 @@ export class GPUProbeClipmap {
178
176
  brick_clipmap: import("../brick/GPUBrickClipmap.js").GPUBrickClipmap;
179
177
  bricks: number;
180
178
  scene: import("../../../scene/GPUSceneContext.js").GPUSceneContext;
181
- materials: import("../../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext;
182
179
  card_rows: GPUBuffer;
183
180
  resampling: boolean;
184
181
  }): void;