@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
@@ -14,7 +14,8 @@ export const MESH_SDF_BAKE_BUDGET_MAX: number;
14
14
  * queues a bake; the last one going leaves the cache in place until {@link trim}, which only a user of
15
15
  * the caches calls, so a cache outlives a mode that stops using it and is there when the mode comes
16
16
  * back (D28). {@link forget} drops a geometry the geometry manager has let go of, whatever holds it.
17
- * {@link alias} points a skinned clone's id at its source's cache, which readers follow.
17
+ * {@link alias} points a geometry's id at another's cache, which readers follow, and whose holders and card sets
18
+ * the aliased geometry's become: a skinned clone's at its source's, a virtual geometry's at its proxy's.
18
19
  *
19
20
  * **Side.** A holder says whether it draws both sides of the geometry. A field is baked two-sided
20
21
  * while any of its holders does: its vote then counts no back face, so nothing is inside it.
@@ -36,11 +37,11 @@ export const MESH_SDF_BAKE_BUDGET_MAX: number;
36
37
  * {@link cards}, whose card sets — one per (geometry, material) pair — are captured after the bake,
37
38
  * `capture_budget` pages a frame.
38
39
  *
39
- * **Sources** ({@link add_source}) make the caches of geometries with no tree of their own to bake from,
40
- * a virtual geometry's: such a geometry waits queued, as one whose tree is not resident yet does. A
41
- * source hears of each geometry queued ({@link onRequested}), records its own work each frame ahead of
42
- * the bake, and bakes a proxy of it here as any geometry, whose resident cache it then gives the
43
- * geometry ({@link adopt}).
40
+ * **A geometry with no tree of its own** to bake from, a virtual geometry's, waits queued, as one whose
41
+ * tree is not resident yet does, until it is pointed at a stand-in ({@link alias}): an ordinary geometry
42
+ * in the same local space, baked, placed and captured here as any is. Whoever makes stand-ins hears of
43
+ * each geometry queued ({@link onRequested}) and let go ({@link onForgotten}), and aliases between
44
+ * frames, its stand-in added to the geometry manager as any geometry is.
44
45
  *
45
46
  * **Readers** bind {@link headers}, {@link indirection}, {@link texture} and {@link MESH_SDF_SAMPLER}
46
47
  * (see {@link write_bindings}) and sample through `mesh_sdf_sample`, which only a resident header
@@ -55,15 +56,23 @@ export class GPUGeometrySDFManager {
55
56
  */
56
57
  constructor(device: GPUDevice, geometries: GPUGeometryManager);
57
58
  /**
58
- * Sent with a geometry id when its cache turns resident, on the frame its completion is read back.
59
+ * Sent with a geometry id when its cache turns resident, on the frame its completion is read back, and with each
60
+ * geometry aliased to it, whose readers read that cache: also when the alias is made to a cache resident already.
59
61
  * @type {Signal<number>}
60
62
  */
61
63
  onBaked: any;
62
64
  /**
63
- * Sent with a geometry's record each time its cache is queued for a bake: what a source listens to.
65
+ * Sent with a geometry's record each time its cache is queued for a bake: what a maker of stand-ins
66
+ * listens to.
64
67
  * @type {Signal<GPUGeometryMetadata>}
65
68
  */
66
69
  onRequested: any;
70
+ /**
71
+ * Sent with a geometry's record when {@link forget} lets it go: what a maker of stand-ins that made one for it
72
+ * listens to.
73
+ * @type {Signal<GPUGeometryMetadata>}
74
+ */
75
+ onForgotten: any;
67
76
  /**
68
77
  * The card sets: one capture of a geometry's layout per (geometry, material) pair, which their
69
78
  * user acquires and releases. Layouts reach it as they are placed.
@@ -87,14 +96,14 @@ export class GPUGeometrySDFManager {
87
96
  */
88
97
  get max_bricks(): number;
89
98
  /**
90
- * One more holder of a geometry's cache; the first queues its bake.
99
+ * One more holder of a geometry's cache; the first queues its bake. A holder of an alias holds its source.
91
100
  *
92
101
  * @param {GPUGeometryMetadata} record
93
102
  * @param {boolean} two_sided whether the holder draws both sides of the geometry
94
103
  */
95
104
  acquire(record: GPUGeometryMetadata, two_sided: boolean): void;
96
105
  /**
97
- * One holder fewer. The cache stays until {@link trim}.
106
+ * One holder fewer. The cache stays until {@link trim}. A holder of an alias holds its source.
98
107
  *
99
108
  * @param {GPUGeometryMetadata} record
100
109
  * @param {boolean} two_sided as the holder acquired it
@@ -113,7 +122,13 @@ export class GPUGeometrySDFManager {
113
122
  forget(record: GPUGeometryMetadata): void;
114
123
  /**
115
124
  * Readers of `clone` read `source`'s cache: the hook for a skinned clone, whose unskinned shape is
116
- * its source's (§6.3). Written once; it follows the source through its bake.
125
+ * its source's (§6.3), and for a virtual geometry, whose proxy is its stand-in (§17). Written once; it
126
+ * follows the source through its bake.
127
+ *
128
+ * Whatever held `clone`'s own cache holds `source`'s from here on, its side included, as does every holder of
129
+ * `clone` after; and `clone`'s card sets capture `source`'s layout through `source`'s meshlets
130
+ * ({@link GPUMeshCardSets#alias}). So a source whose stand-in arrives after `clone` was asked for needs
131
+ * nothing moved by its holders.
117
132
  *
118
133
  * @param {GPUGeometryMetadata} clone
119
134
  * @param {GPUGeometryMetadata} source
@@ -141,27 +156,6 @@ export class GPUGeometrySDFManager {
141
156
  * @returns {boolean}
142
157
  */
143
158
  holds_two_sided(record: GPUGeometryMetadata): boolean;
144
- /**
145
- * @param {MeshSDFSource} source run first in each {@link graph_bake} from here on
146
- */
147
- add_source(source: MeshSDFSource): void;
148
- /**
149
- * @param {MeshSDFSource} source
150
- */
151
- remove_source(source: MeshSDFSource): void;
152
- /**
153
- * Give `target` the resident cache baked for `proxy`: a source's hand-in, for a geometry with no tree of its own,
154
- * of a proxy in the same local space baked as any geometry is. Nothing is copied. The target's header takes the
155
- * proxy's layout, entries and side, and the proxy's reads None, as dropped; {@link onBaked} is sent with the
156
- * target. The cache has no cards, the target having no tree to capture them with. Held for another side than the
157
- * proxy was baked for, it is queued again at the next bake, as any cache is.
158
- *
159
- * @param {GPUGeometryMetadata} target waiting for its bake ({@link is_requested})
160
- * @param {GPUGeometryMetadata} proxy whose cache is resident
161
- * @returns {boolean} whether it was adopted: false, changing nothing, when `target` no longer waits or `proxy`'s
162
- * cache is not resident
163
- */
164
- adopt(target: GPUGeometryMetadata, proxy: GPUGeometryMetadata): boolean;
165
159
  /**
166
160
  * Geometries whose layout was coarsened by the cap, of those baked: coarser than asked.
167
161
  * @returns {number}
@@ -245,8 +239,8 @@ export class GPUGeometrySDFManager {
245
239
  * @param {number} options.budget bricks evaluated at most, `mesh_sdf_bake_budget`
246
240
  * @param {number} [options.capture_budget] card pages captured at most, `card_capture_budget`; 0
247
241
  * captures nothing
248
- * @param {GPUResidentMaterialContext|null} [options.materials] what the capture shades with, as it
249
- * stands this frame; needed with a `capture_budget`
242
+ * @param {GPUResidentMaterialContext|null} [options.materials] what a traced capture shades with,
243
+ * which makes what it traces resident; needed with a `capture_budget`
250
244
  * @param {GPUMaterialManager|null} [options.material_contexts] what a raster capture draws with
251
245
  * ({@link GPUMeshCardSets#capture_mode}); needed with a `capture_budget` in that mode
252
246
  */
@@ -265,17 +259,6 @@ export type GPUGeometryManager = import("../GPUGeometryManager.js").GPUGeometryM
265
259
  export type GPUGeometryMetadata = import("../GPUGeometryMetadata.js").GPUGeometryMetadata;
266
260
  export type GPUResidentMaterialContext = import("../../material/resident/GPUResidentMaterialContext.js").GPUResidentMaterialContext;
267
261
  export type GPUMaterialManager = import("../../material/GPUMaterialManager.js").GPUMaterialManager;
268
- /**
269
- * What makes caches for geometries the bake cannot bake from a tree of their own
270
- * ({@link GPUGeometrySDFManageradd_source }): it learns what is asked for from `onRequested`, records its own work in
271
- * each frame's graph ahead of the bake, and hands each cache in through `adopt`.
272
- */
273
- export type MeshSDFSource = {
274
- /**
275
- * records the source's work for the frame, ahead of the bake
276
- */
277
- graph_update: (arg0: FrameGraph) => void;
278
- };
279
262
  import { GPUMeshCardSets } from "./cards/GPUMeshCardSets.js";
280
263
  import { MeshSDFState } from "./MESH_SDF.js";
281
264
  //# sourceMappingURL=GPUGeometrySDFManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GPUGeometrySDFManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js"],"names":[],"mappings":"AA+IA;;;;GAIG;AACH,uCAFU,MAAM,CAEuH;AAgDvI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH;IAsQI;;;OAGG;IACH,2CAFW,kBAAkB,EAS5B;IArQD;;;OAGG;IACH,aAAuB;IAEvB;;;OAGG;IACH,iBAA2B;IA6P3B;;;;OAIG;IACH,6BAEC;IAED;;;;;;OAMG;IACH,sBAHW,MAAM,cACN,MAAM,QAkChB;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,yBAEC;IAED;;;;;OAKG;IACH,gBAHW,mBAAmB,aACnB,OAAO,QAqBjB;IAED;;;;;OAKG;IACH,gBAHW,mBAAmB,aACnB,OAAO,QAqBjB;IAED;;OAEG;IACH,aAYC;IAED;;;;;OAKG;IACH,eAFW,mBAAmB,QAe7B;IAED;;;;;;OAMG;IACH,aAHW,mBAAmB,UACnB,mBAAmB,QA0B7B;IAQD;;;;;OAKG;IACH,iBAHW,mBAAmB,GACjB,YAAY,CAaxB;IAED;;;;;;OAMG;IACH,qBAHW,mBAAmB,GACjB,OAAO,CAInB;IAED;;;;;OAKG;IACH,wBAHW,mBAAmB,GACjB,OAAO,CAInB;IAED;;OAEG;IACH,mBAFW,aAAa,QAOvB;IAED;;OAEG;IACH,sBAFW,aAAa,QAQvB;IAED;;;;;;;;;;;OAWG;IACH,cALW,mBAAmB,SACnB,mBAAmB,GACjB,OAAO,CA4CnB;IAED;;;OAGG;IACH,8BAEC;IAED;;OAEG;IACH,6BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAUC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,+BAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,4BAEC;IAED;;;OAGG;IACH,yBAIC;IAED;;;OAGG;IACH,6BAIC;IAED;;;OAGG;IACH,8EAIC;IAED;;;;;;OAMG;IACH,mCAOC;IAED;;OAEG;IACH,+BAcC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH;QAT+B,KAAK,EAAzB,UAAU;QACM,MAAM,EAAtB,MAAM;QACW,cAAc,GAA/B,MAAM;QAEoC,SAAS,GAAnD,0BAA0B,GAAC,IAAI;QAEG,iBAAiB,GAAnD,kBAAkB,GAAC,IAAI;aA8EjC;IAwiCD,gBAsBC;;CACJ;yBAljEY,OAAO,8DAA8D,EAAE,UAAU;iCACjF,OAAO,0BAA0B,EAAE,kBAAkB;kCACrD,OAAO,2BAA2B,EAAE,mBAAmB;yCACvD,OAAO,uDAAuD,EAAE,0BAA0B;iCAC1F,OAAO,sCAAsC,EAAE,kBAAkB;;;;;;;;;;yBASvD,UAAU,KAAG,IAAI;;gCA3BsB,4BAA4B;6BAQf,eAAe"}
1
+ {"version":3,"file":"GPUGeometrySDFManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js"],"names":[],"mappings":"AAsIA;;;;GAIG;AACH,uCAFU,MAAM,CAEuH;AAgDvI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH;IAyQI;;;OAGG;IACH,2CAFW,kBAAkB,EAS5B;IAxQD;;;;OAIG;IACH,aAAuB;IAEvB;;;;OAIG;IACH,iBAA2B;IAE3B;;;;OAIG;IACH,iBAA2B;IAuP3B;;;;OAIG;IACH,6BAEC;IAED;;;;;;OAMG;IACH,sBAHW,MAAM,cACN,MAAM,QAkChB;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,yBAEC;IAED;;;;;OAKG;IACH,gBAHW,mBAAmB,aACnB,OAAO,QAajB;IAiCD;;;;;OAKG;IACH,gBAHW,mBAAmB,aACnB,OAAO,QAqBjB;IAED;;OAEG;IACH,aAYC;IAED;;;;;OAKG;IACH,eAFW,mBAAmB,QAiB7B;IAED;;;;;;;;;;;;OAYG;IACH,aAHW,mBAAmB,UACnB,mBAAmB,QAwD7B;IAcD;;;;;OAKG;IACH,iBAHW,mBAAmB,GACjB,YAAY,CAaxB;IAED;;;;;;OAMG;IACH,qBAHW,mBAAmB,GACjB,OAAO,CAInB;IAED;;;;;OAKG;IACH,wBAHW,mBAAmB,GACjB,OAAO,CAInB;IAED;;;OAGG;IACH,8BAEC;IAED;;OAEG;IACH,6BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAUC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,+BAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,4BAEC;IAED;;;OAGG;IACH,yBAIC;IAED;;;OAGG;IACH,6BAIC;IAED;;;OAGG;IACH,8EAIC;IAED;;;;;;OAMG;IACH,mCAOC;IAED;;OAEG;IACH,+BAcC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH;QAT+B,KAAK,EAAzB,UAAU;QACM,MAAM,EAAtB,MAAM;QACW,cAAc,GAA/B,MAAM;QAEoC,SAAS,GAAnD,0BAA0B,GAAC,IAAI;QAEG,iBAAiB,GAAnD,kBAAkB,GAAC,IAAI;aAuEjC;IAqjCD,gBAsBC;;CACJ;yBA1iEY,OAAO,8DAA8D,EAAE,UAAU;iCACjF,OAAO,0BAA0B,EAAE,kBAAkB;kCACrD,OAAO,2BAA2B,EAAE,mBAAmB;yCACvD,OAAO,uDAAuD,EAAE,0BAA0B;iCAC1F,OAAO,sCAAsC,EAAE,kBAAkB;gCAlBhB,4BAA4B;6BAQf,eAAe"}
@@ -56,15 +56,6 @@ import { MeshSDFLayout } from "./MeshSDFLayout.js";
56
56
  * @typedef {import("../../material/GPUMaterialManager.js").GPUMaterialManager} GPUMaterialManager
57
57
  */
58
58
 
59
- /**
60
- * What makes caches for geometries the bake cannot bake from a tree of their own
61
- * ({@link GPUGeometrySDFManager#add_source}): it learns what is asked for from `onRequested`, records its own work in
62
- * each frame's graph ahead of the bake, and hands each cache in through `adopt`.
63
- *
64
- * @typedef {Object} MeshSDFSource
65
- * @property {function(FrameGraph): void} graph_update records the source's work for the frame, ahead of the bake
66
- */
67
-
68
59
  /*
69
60
  What the host knows of a geometry id. `Queued` is the host's alone: the header reads None until the
70
61
  bake is admitted and the indirection range is the geometry's.
@@ -204,7 +195,8 @@ function grow_typed(array, length) {
204
195
  * queues a bake; the last one going leaves the cache in place until {@link trim}, which only a user of
205
196
  * the caches calls, so a cache outlives a mode that stops using it and is there when the mode comes
206
197
  * back (D28). {@link forget} drops a geometry the geometry manager has let go of, whatever holds it.
207
- * {@link alias} points a skinned clone's id at its source's cache, which readers follow.
198
+ * {@link alias} points a geometry's id at another's cache, which readers follow, and whose holders and card sets
199
+ * the aliased geometry's become: a skinned clone's at its source's, a virtual geometry's at its proxy's.
208
200
  *
209
201
  * **Side.** A holder says whether it draws both sides of the geometry. A field is baked two-sided
210
202
  * while any of its holders does: its vote then counts no back face, so nothing is inside it.
@@ -226,11 +218,11 @@ function grow_typed(array, length) {
226
218
  * {@link cards}, whose card sets — one per (geometry, material) pair — are captured after the bake,
227
219
  * `capture_budget` pages a frame.
228
220
  *
229
- * **Sources** ({@link add_source}) make the caches of geometries with no tree of their own to bake from,
230
- * a virtual geometry's: such a geometry waits queued, as one whose tree is not resident yet does. A
231
- * source hears of each geometry queued ({@link onRequested}), records its own work each frame ahead of
232
- * the bake, and bakes a proxy of it here as any geometry, whose resident cache it then gives the
233
- * geometry ({@link adopt}).
221
+ * **A geometry with no tree of its own** to bake from, a virtual geometry's, waits queued, as one whose
222
+ * tree is not resident yet does, until it is pointed at a stand-in ({@link alias}): an ordinary geometry
223
+ * in the same local space, baked, placed and captured here as any is. Whoever makes stand-ins hears of
224
+ * each geometry queued ({@link onRequested}) and let go ({@link onForgotten}), and aliases between
225
+ * frames, its stand-in added to the geometry manager as any geometry is.
234
226
  *
235
227
  * **Readers** bind {@link headers}, {@link indirection}, {@link texture} and {@link MESH_SDF_SAMPLER}
236
228
  * (see {@link write_bindings}) and sample through `mesh_sdf_sample`, which only a resident header
@@ -251,22 +243,25 @@ export class GPUGeometrySDFManager {
251
243
  #geometries;
252
244
 
253
245
  /**
254
- * Sent with a geometry id when its cache turns resident, on the frame its completion is read back.
246
+ * Sent with a geometry id when its cache turns resident, on the frame its completion is read back, and with each
247
+ * geometry aliased to it, whose readers read that cache: also when the alias is made to a cache resident already.
255
248
  * @type {Signal<number>}
256
249
  */
257
250
  onBaked = new Signal();
258
251
 
259
252
  /**
260
- * Sent with a geometry's record each time its cache is queued for a bake: what a source listens to.
253
+ * Sent with a geometry's record each time its cache is queued for a bake: what a maker of stand-ins
254
+ * listens to.
261
255
  * @type {Signal<GPUGeometryMetadata>}
262
256
  */
263
257
  onRequested = new Signal();
264
258
 
265
259
  /**
266
- * Run first in each {@link graph_bake}.
267
- * @type {MeshSDFSource[]}
260
+ * Sent with a geometry's record when {@link forget} lets it go: what a maker of stand-ins that made one for it
261
+ * listens to.
262
+ * @type {Signal<GPUGeometryMetadata>}
268
263
  */
269
- #sources = [];
264
+ onForgotten = new Signal();
270
265
 
271
266
  #voxel_size = 0.125;
272
267
  #max_bricks = 18;
@@ -578,7 +573,7 @@ export class GPUGeometrySDFManager {
578
573
  }
579
574
 
580
575
  /**
581
- * One more holder of a geometry's cache; the first queues its bake.
576
+ * One more holder of a geometry's cache; the first queues its bake. A holder of an alias holds its source.
582
577
  *
583
578
  * @param {GPUGeometryMetadata} record
584
579
  * @param {boolean} two_sided whether the holder draws both sides of the geometry
@@ -587,17 +582,40 @@ export class GPUGeometrySDFManager {
587
582
  assert.defined(record, 'record');
588
583
  assert.isBoolean(two_sided, 'two_sided');
589
584
 
590
- const id = record.index;
585
+ this.#ensure_id(record.index);
591
586
 
592
- this.#ensure_id(id);
587
+ if (this.#state[record.index] !== HOST_ALIAS) {
588
+ this.#records[record.index] = record;
589
+ }
593
590
 
594
- this.#records[id] = record;
591
+ this.#hold(this.#holder_id(record.index), 1, two_sided ? 1 : 0);
592
+ }
595
593
 
596
- if (two_sided) {
597
- this.#two_sided_references[id]++;
598
- }
594
+ /**
595
+ * The id a holder of `id` holds: its source's, for an alias.
596
+ *
597
+ * @param {number} id
598
+ * @returns {number}
599
+ */
600
+ #holder_id(id) {
601
+ return this.#state[id] === HOST_ALIAS ? this.#aliases.get(id) : id;
602
+ }
603
+
604
+ /**
605
+ * `count` more holders of `id`, `two_sided` of them drawing both sides; the first queues its bake.
606
+ *
607
+ * @param {number} id
608
+ * @param {number} count
609
+ * @param {number} two_sided
610
+ */
611
+ #hold(id, count, two_sided) {
612
+ this.#two_sided_references[id] += two_sided;
599
613
 
600
- if (++this.#references[id] === 1 && this.#state[id] === HOST_NONE) {
614
+ const before = this.#references[id];
615
+
616
+ this.#references[id] = before + count;
617
+
618
+ if (before === 0 && this.#state[id] === HOST_NONE) {
601
619
  this.#request(id);
602
620
  }
603
621
 
@@ -605,7 +623,7 @@ export class GPUGeometrySDFManager {
605
623
  }
606
624
 
607
625
  /**
608
- * One holder fewer. The cache stays until {@link trim}.
626
+ * One holder fewer. The cache stays until {@link trim}. A holder of an alias holds its source.
609
627
  *
610
628
  * @param {GPUGeometryMetadata} record
611
629
  * @param {boolean} two_sided as the holder acquired it
@@ -614,7 +632,7 @@ export class GPUGeometrySDFManager {
614
632
  assert.defined(record, 'record');
615
633
  assert.isBoolean(two_sided, 'two_sided');
616
634
 
617
- const id = record.index;
635
+ const id = this.#holder_id(record.index);
618
636
 
619
637
  assert.greaterThan(this.#references[id] ?? 0, 0, `geometry ${id} released more often than acquired`);
620
638
 
@@ -667,11 +685,19 @@ export class GPUGeometrySDFManager {
667
685
  this.#two_sided_references[id] = 0;
668
686
  this.#drop(id);
669
687
  this.#records[id] = undefined;
688
+
689
+ this.onForgotten.send1(record);
670
690
  }
671
691
 
672
692
  /**
673
693
  * Readers of `clone` read `source`'s cache: the hook for a skinned clone, whose unskinned shape is
674
- * its source's (§6.3). Written once; it follows the source through its bake.
694
+ * its source's (§6.3), and for a virtual geometry, whose proxy is its stand-in (§17). Written once; it
695
+ * follows the source through its bake.
696
+ *
697
+ * Whatever held `clone`'s own cache holds `source`'s from here on, its side included, as does every holder of
698
+ * `clone` after; and `clone`'s card sets capture `source`'s layout through `source`'s meshlets
699
+ * ({@link GPUMeshCardSets#alias}). So a source whose stand-in arrives after `clone` was asked for needs
700
+ * nothing moved by its holders.
675
701
  *
676
702
  * @param {GPUGeometryMetadata} clone
677
703
  * @param {GPUGeometryMetadata} source
@@ -693,6 +719,20 @@ export class GPUGeometrySDFManager {
693
719
 
694
720
  this.#state[id] = HOST_ALIAS;
695
721
 
722
+ const held = this.#references[id];
723
+ const held_two_sided = this.#two_sided_references[id];
724
+
725
+ this.#references[id] = 0;
726
+ this.#two_sided_references[id] = 0;
727
+
728
+ if (this.#state[source.index] !== HOST_ALIAS) {
729
+ this.#records[source.index] = source;
730
+ }
731
+
732
+ if (held > 0) {
733
+ this.#hold(source.index, held, held_two_sided);
734
+ }
735
+
696
736
  if (this.#headers !== null) {
697
737
  this.#ensure_headers(id + 1);
698
738
  this.#write_header_alias(id, source.index);
@@ -700,6 +740,22 @@ export class GPUGeometrySDFManager {
700
740
 
701
741
  this.#records[id] = clone;
702
742
  this.#aliases.set(id, source.index);
743
+
744
+ let clones = this.#clones_of.get(source.index);
745
+
746
+ if (clones === undefined) {
747
+ clones = [];
748
+ this.#clones_of.set(source.index, clones);
749
+ }
750
+
751
+ clones.push(id);
752
+
753
+ this.#cards.alias(id, source.index);
754
+
755
+ if (this.#state[source.index] === HOST_RESIDENT) {
756
+ // its readers read a resident cache from here on
757
+ this.onBaked.send1(id);
758
+ }
703
759
  }
704
760
 
705
761
  /**
@@ -708,6 +764,12 @@ export class GPUGeometrySDFManager {
708
764
  */
709
765
  #aliases = new Map();
710
766
 
767
+ /**
768
+ * The ids aliased to each source id: the readers {@link onBaked} tells of the source's bake too.
769
+ * @type {Map<number, number[]>}
770
+ */
771
+ #clones_of = new Map();
772
+
711
773
  /**
712
774
  * What a reader finds in the geometry's header.
713
775
  *
@@ -748,82 +810,6 @@ export class GPUGeometrySDFManager {
748
810
  return (this.#two_sided_references[record.index] ?? 0) > 0;
749
811
  }
750
812
 
751
- /**
752
- * @param {MeshSDFSource} source run first in each {@link graph_bake} from here on
753
- */
754
- add_source(source) {
755
- assert.defined(source, 'source');
756
- assert.equal(this.#sources.includes(source), false, 'source added already');
757
-
758
- this.#sources.push(source);
759
- }
760
-
761
- /**
762
- * @param {MeshSDFSource} source
763
- */
764
- remove_source(source) {
765
- const index = this.#sources.indexOf(source);
766
-
767
- if (index !== -1) {
768
- this.#sources.splice(index, 1);
769
- }
770
- }
771
-
772
- /**
773
- * Give `target` the resident cache baked for `proxy`: a source's hand-in, for a geometry with no tree of its own,
774
- * of a proxy in the same local space baked as any geometry is. Nothing is copied. The target's header takes the
775
- * proxy's layout, entries and side, and the proxy's reads None, as dropped; {@link onBaked} is sent with the
776
- * target. The cache has no cards, the target having no tree to capture them with. Held for another side than the
777
- * proxy was baked for, it is queued again at the next bake, as any cache is.
778
- *
779
- * @param {GPUGeometryMetadata} target waiting for its bake ({@link is_requested})
780
- * @param {GPUGeometryMetadata} proxy whose cache is resident
781
- * @returns {boolean} whether it was adopted: false, changing nothing, when `target` no longer waits or `proxy`'s
782
- * cache is not resident
783
- */
784
- adopt(target, proxy) {
785
- assert.defined(target, 'target');
786
- assert.defined(proxy, 'proxy');
787
- assert.notEqual(target.index, proxy.index, 'a geometry cannot adopt its own cache');
788
-
789
- const id = target.index;
790
- const from = proxy.index;
791
-
792
- if (!this.is_requested(target) || this.#state[from] !== HOST_RESIDENT) {
793
- return false;
794
- }
795
-
796
- this.#drop_cards(from);
797
-
798
- const range = this.#ranges[from];
799
-
800
- this.#ranges[id] = range;
801
- this.#ranges[from] = null;
802
- this.#brick_count[id] = this.#brick_count[from];
803
- this.#two_sided[id] = this.#two_sided[from];
804
- this.#generation[id]++;
805
-
806
- this.#state[from] = HOST_NONE;
807
- this.#state[id] = HOST_RESIDENT;
808
-
809
- // the layout the proxy was admitted with: a configure since would have dropped its cache
810
- const layout = this.#layout;
811
-
812
- layout.compute(proxy.geometry.bounding_box, this.#voxel_size, this.#max_bricks);
813
-
814
- this.#write_header(id, layout, range.offset + 1, MeshSDFState.Resident);
815
-
816
- this.#word_scratch[0] = MeshSDFState.None;
817
- this.#device.queue.writeBuffer(this.#headers, from * HEADER_BYTES + HEADER_STATE, this.#word_scratch, 0, 1);
818
-
819
- // the side its holders draw is checked at the next bake
820
- this.#holders_changed.push(id);
821
-
822
- this.onBaked.send1(id);
823
-
824
- return true;
825
- }
826
-
827
813
  /**
828
814
  * Geometries whose layout was coarsened by the cap, of those baked: coarser than asked.
829
815
  * @returns {number}
@@ -980,8 +966,8 @@ export class GPUGeometrySDFManager {
980
966
  * @param {number} options.budget bricks evaluated at most, `mesh_sdf_bake_budget`
981
967
  * @param {number} [options.capture_budget] card pages captured at most, `card_capture_budget`; 0
982
968
  * captures nothing
983
- * @param {GPUResidentMaterialContext|null} [options.materials] what the capture shades with, as it
984
- * stands this frame; needed with a `capture_budget`
969
+ * @param {GPUResidentMaterialContext|null} [options.materials] what a traced capture shades with,
970
+ * which makes what it traces resident; needed with a `capture_budget`
985
971
  * @param {GPUMaterialManager|null} [options.material_contexts] what a raster capture draws with
986
972
  * ({@link GPUMeshCardSets#capture_mode}); needed with a `capture_budget` in that mode
987
973
  */
@@ -994,13 +980,6 @@ export class GPUGeometrySDFManager {
994
980
 
995
981
  this.#frame++;
996
982
 
997
- // the sources first: a cache adopted here is not admitted to a bake of its own below
998
- const sources = this.#sources;
999
-
1000
- for (let i = 0; i < sources.length; i++) {
1001
- sources[i].graph_update(graph);
1002
- }
1003
-
1004
983
  this.#follow_sides();
1005
984
 
1006
985
  // the last bake's commands were submitted before this call: what they read may be handed out
@@ -1233,7 +1212,7 @@ export class GPUGeometrySDFManager {
1233
1212
  /**
1234
1213
  * Whether a queued geometry's tree is traceable, so that a bake could admit it. A geometry that
1235
1214
  * waits for its tree, or for a source's cache, records no bake while it waits. Drops from the queue
1236
- * what was dropped, or adopted, since it was queued.
1215
+ * what was dropped, or aliased, since it was queued.
1237
1216
  *
1238
1217
  * @returns {boolean}
1239
1218
  */
@@ -1264,8 +1243,8 @@ export class GPUGeometrySDFManager {
1264
1243
  }
1265
1244
 
1266
1245
  /**
1267
- * Whether a resident geometry's cards wait for placement. Drops from the queue what was dropped, or
1268
- * adopted away, since it was queued.
1246
+ * Whether a resident geometry's cards wait for placement. Drops from the queue what was dropped
1247
+ * since it was queued.
1269
1248
  *
1270
1249
  * @returns {boolean}
1271
1250
  */
@@ -1693,6 +1672,14 @@ export class GPUGeometrySDFManager {
1693
1672
  this.#place_queue.push(id);
1694
1673
 
1695
1674
  this.onBaked.send1(id);
1675
+
1676
+ const clones = this.#clones_of.get(id);
1677
+
1678
+ if (clones !== undefined) {
1679
+ for (let i = 0; i < clones.length; i++) {
1680
+ this.onBaked.send1(clones[i]);
1681
+ }
1682
+ }
1696
1683
  }
1697
1684
  }
1698
1685
 
@@ -1779,7 +1766,12 @@ export class GPUGeometrySDFManager {
1779
1766
  }
1780
1767
 
1781
1768
  if (state === HOST_ALIAS) {
1769
+ const clones = this.#clones_of.get(this.#aliases.get(id));
1770
+
1771
+ clones.splice(clones.indexOf(id), 1);
1772
+
1782
1773
  this.#aliases.delete(id);
1774
+ this.#cards.unalias(id);
1783
1775
  } else {
1784
1776
  if (state === HOST_BAKING) {
1785
1777
  this.#baking--;
@@ -24,7 +24,8 @@ export const MESH_CARD_CAPTURE_BUDGET_MAX: number;
24
24
  * - Its record (`MESH_CARD_SET_STRUCT`) is written when a capture starts.
25
25
  *
26
26
  * **Lifetime.** {@link acquire} makes a card set for a pair and {@link release} gives it back; the
27
- * caller keeps one per pair. A card set waits until its geometry's layout is placed
27
+ * caller keeps one per pair. A card set of an aliased geometry ({@link alias}) is its source's: it
28
+ * captures the source's layout through the source's meshlets. A card set waits until its geometry's layout is placed
28
29
  * ({@link set_layout}), is then captured, and turns resident ({@link onResident}) on the frame its
29
30
  * last page is recorded: the capture's writes come before any later pass reads it. A layout that
30
31
  * goes ({@link drop_layout}) withdraws its card sets ({@link onWithdrawn}) back to waiting.
@@ -121,7 +122,8 @@ export class GPUMeshCardSets {
121
122
  /**
122
123
  * A card set for a pair. The caller keeps one per pair.
123
124
  *
124
- * @param {number} geometry the geometry id whose layout it captures: the source's, for a skinned row
125
+ * @param {number} geometry the geometry id the pair draws; an aliased one's card set captures its source's
126
+ * layout ({@link alias})
125
127
  * @param {ShadeMaterial} material
126
128
  * @returns {number} card set id
127
129
  */
@@ -152,6 +154,22 @@ export class GPUMeshCardSets {
152
154
  * @param {number} geometry
153
155
  */
154
156
  drop_layout(geometry: number): void;
157
+ /**
158
+ * The geometry `clone` is drawn as `source` from here on: its card sets, and those acquired for it after, capture
159
+ * `source`'s layout through `source`'s meshlets, the two being in one local space. A card set of `clone` waits
160
+ * for `source`'s layout, as one acquired for `source` does.
161
+ *
162
+ * @param {number} clone
163
+ * @param {number} source
164
+ */
165
+ alias(clone: number, source: number): void;
166
+ /**
167
+ * `clone` is no longer aliased: card sets acquired for it from here on capture its own layout. Those it has keep
168
+ * capturing its source's until they are given back.
169
+ *
170
+ * @param {number} clone
171
+ */
172
+ unalias(clone: number): void;
155
173
  /**
156
174
  * Record the frame's capture: at most `budget` pages. Records nothing when nothing waits. Card
157
175
  * sets whose first capture this completes are resident from here, and {@link onResident} is sent
@@ -162,7 +180,8 @@ export class GPUMeshCardSets {
162
180
  * @param {number} options.budget pages captured at most, `card_capture_budget`
163
181
  * @param {number} options.arena graph handle of the arena, as the frame's bake left it
164
182
  * @param {GPUBuffer} options.headers
165
- * @param {GPUResidentMaterialContext} options.materials what the trace shades with
183
+ * @param {GPUResidentMaterialContext} options.materials what the trace shades with: each traced
184
+ * material is made resident, and the rows committed, before the trace is recorded
166
185
  * @param {GPUMaterialManager} options.material_contexts what the raster draws with: each
167
186
  * material's template and bind group
168
187
  * @param {Object} options.blas the geometry bindings `ray_query_blas_nearest` reads, whose
@@ -1 +1 @@
1
- {"version":3,"file":"GPUMeshCardSets.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js"],"names":[],"mappings":"AAyEA;;;;;;GAMG;AACH,sDAHW,aAAa,GACX,MAAM,CAUlB;AApCD;;;GAGG;AACH,2CAFU,MAAM,CAEmF;AA0DnG;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;IAmLI;;OAEG;IACH,+BAIC;IAnLD;;;OAGG;IACH,gBAA0B;IAE1B;;;OAGG;IACH,iBAA2B;IA2K3B;;;OAGG;IACH,oBAUC;IAED;;OAEG;IACH,6BAEC;IAED;;;OAGG;IACH,mCAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;;OAIG;IACH,mCAIC;IAED;;;OAGG;IACH,2BAcC;IASD;;;;;OAKG;IACH,+BAgBC;IA7BD;;OAEG;IACH,2BAEC;IA0BD;;;;;OAKG;IACH,gBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;OAKG;IACH,gBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,yBAIC;IAED;;;OAGG;IACH,4BAIC;IAED;;;;;;OAMG;IACH,kBAJW,MAAM,YACN,aAAa,GACX,MAAM,CA+BlB;IAED;;OAEG;IACH,YAFW,MAAM,QA2BhB;IAED;;;;;OAKG;IACH,cAFW,MAAM,QAqBhB;IAED;;;;;;;OAOG;IACH,qBALW,MAAM,SACN,MAAM,QACN,MAAM,QAqBhB;IAED;;;;OAIG;IACH,sBAFW,MAAM,QA+BhB;IAuSD;;;;;;;;;;;;;;;OAeG;IACH;QAV+B,KAAK,EAAzB,UAAU;QACM,MAAM,EAAtB,MAAM;QACU,KAAK,EAArB,MAAM;QACa,OAAO;QACU,SAAS,EAA7C,0BAA0B;QACE,iBAAiB,EAA7C,kBAAkB;QAEF,IAAI;aAiG9B;IAiTD;;OAEG;IACH,+BAuBC;IAED,gBAoBC;;CACJ;yBA70CY,OAAO,iEAAiE,EAAE,UAAU;4BACpF,OAAO,oCAAoC,EAAE,aAAa;yCAC1D,OAAO,0DAA0D,EAAE,0BAA0B;iCAC7F,OAAO,yCAAyC,EAAE,kBAAkB;iCACpE,OAAO,yCAAyC,EAAE,kBAAkB;yBACpE,OAAO,yDAAyD,EAAE,UAAU;+BAxB1D,0CAA0C"}
1
+ {"version":3,"file":"GPUMeshCardSets.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js"],"names":[],"mappings":"AAyEA;;;;;;GAMG;AACH,sDAHW,aAAa,GACX,MAAM,CAUlB;AApCD;;;GAGG;AACH,2CAFU,MAAM,CAEmF;AA0DnG;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;IAiMI;;OAEG;IACH,+BAIC;IAjMD;;;OAGG;IACH,gBAA0B;IAE1B;;;OAGG;IACH,iBAA2B;IAyL3B;;;OAGG;IACH,oBAUC;IAED;;OAEG;IACH,6BAEC;IAED;;;OAGG;IACH,mCAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;;OAIG;IACH,mCAIC;IAED;;;OAGG;IACH,2BAcC;IASD;;;;;OAKG;IACH,+BAgBC;IA7BD;;OAEG;IACH,2BAEC;IA0BD;;;;;OAKG;IACH,gBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;OAKG;IACH,gBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,yBAIC;IAED;;;OAGG;IACH,4BAIC;IAED;;;;;;;OAOG;IACH,kBALW,MAAM,YAEN,aAAa,GACX,MAAM,CAiClB;IAED;;OAEG;IACH,YAFW,MAAM,QA2BhB;IAED;;;;;OAKG;IACH,cAFW,MAAM,QAqBhB;IAED;;;;;;;OAOG;IACH,qBALW,MAAM,SACN,MAAM,QACN,MAAM,QAqBhB;IAED;;;;OAIG;IACH,sBAFW,MAAM,QA+BhB;IAED;;;;;;;OAOG;IACH,aAHW,MAAM,UACN,MAAM,QAoChB;IAED;;;;;OAKG;IACH,eAFW,MAAM,QAIhB;IA0SD;;;;;;;;;;;;;;;;OAgBG;IACH;QAX+B,KAAK,EAAzB,UAAU;QACM,MAAM,EAAtB,MAAM;QACU,KAAK,EAArB,MAAM;QACa,OAAO;QACU,SAAS,EAA7C,0BAA0B;QAEE,iBAAiB,EAA7C,kBAAkB;QAEF,IAAI;aAsG9B;IAiTD;;OAEG;IACH,+BAuBC;IAED,gBAoBC;;CACJ;yBA95CY,OAAO,iEAAiE,EAAE,UAAU;4BACpF,OAAO,oCAAoC,EAAE,aAAa;yCAC1D,OAAO,0DAA0D,EAAE,0BAA0B;iCAC7F,OAAO,yCAAyC,EAAE,kBAAkB;iCACpE,OAAO,yCAAyC,EAAE,kBAAkB;yBACpE,OAAO,yDAAyD,EAAE,UAAU;+BAxB1D,0CAA0C"}