@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
@@ -1,305 +0,0 @@
1
- # Micron — what the prior WebGL implementation knows
2
-
3
- Review of `moicon/prime/src/components/Viewer/Viewer.Meep/Micron/` (~11.8k lines, three.js /
4
- WebGL) against the current design and builder. Micron is this system's direct ancestor:
5
- same author, same problem, same 128-triangle patch. It shipped, which is worth something —
6
- where it agrees with the design that is corroboration, and where it disagrees it is usually
7
- because it hit something.
8
-
9
- Paths below are relative to the Micron root.
10
-
11
- > **Status.** Reviewed and decided. What was taken, what was declined and why, and what is
12
- > scheduled but not yet built, all live in
13
- > [VIRTUAL_GEOMETRY_PLAN.md](./VIRTUAL_GEOMETRY_PLAN.md) — that file is the one to act on.
14
- > This one is kept as the analysis behind those decisions.
15
- >
16
- > It is a **snapshot dated in its filename** and is not maintained against the code. Statements
17
- > about meep that have since gone stale are corrected inline in block quotes like this one,
18
- > rather than edited away — the argument that was made at the time is the reason the decision
19
- > was taken, and rewriting it hides that.
20
-
21
- ## 1. Where the two already agree
22
-
23
- Not findings, but worth stating, because agreement across a decade-apart rewrite is the
24
- cheapest evidence available that a decision is not arbitrary.
25
-
26
- | | Micron | meep |
27
- |---|---|---|
28
- | Patch/cluster cap | `MICRON_PATCH_SIZE_MAX = 128` | `VGEO_MAX_CLUSTER_TRIANGLE_COUNT = 128` |
29
- | Merge unit | group of patches, one error and one bounds for the whole step | same |
30
- | Termination | `while (__node_count > 1)`, throws when it cannot reduce | same, throws |
31
- | Nothing to merge with | `merge_patches`: `node_count === 1` → forward to output unchanged | frontier pass-through |
32
- | Group size | starts at 4, doubles on stall, hard limit 64 | starts at 4, doubles on stall |
33
- | Islands | `graph_create_off_mesh_links` once adjacency runs out | Morton proximity bundling once adjacency runs out |
34
-
35
- `build/hierarchy/buildAbstractPatchHierarchy.js` is the loop, and it reads like the round
36
- loop that just landed — including the two things that were fixed this week (single root,
37
- pass-through). Micron had both from the start.
38
-
39
- ## 2. Worth borrowing
40
-
41
- Ranked by what they would actually change.
42
-
43
- ### 2.1 Accumulated vertex quadrics carried through the whole hierarchy
44
-
45
- `buildAbstractPatchHierarchy` builds `Map<vertex_index, Quadratic3>` **once, from the
46
- leaves**, and threads it through every merge. `many_to_many_merge` deep-copies the relevant
47
- entries, simplifies against them, and writes them back only if the merge is accepted. The
48
- group's error is then
49
-
50
- ```js
51
- vertex_error_sqr = vertex_quadratic.evaluate(vertex.x, vertex.y, vertex.z) // max over vertices
52
- ```
53
-
54
- — the accumulated quadric evaluated at the vertex's *final* position.
55
-
56
- meep instead composes per-step residuals: `step.error = Math.sqrt(residual) + max(child
57
- error)`. Design §4 already admits this over-estimates ("a sum over accumulated planes
58
- (over-scales with plane count)"), and the triangle inequality is doing the work. Micron's
59
- number is a deviation from the **original surface**, measured once, not a sum of deviations
60
- from each intermediate one. It is strictly tighter, and it costs one persistent map.
61
-
62
- Caveats, both real: accumulated quadrics drift over many collapses (the memoryless-vs-
63
- accumulated argument is not settled in the literature either way), and the map needs a
64
- vertex identity stable across levels. meep already has that identity —
65
- `VGeoSubmesh.source_vertex_ids` and the stitch's unify-by-source-id are exactly it.
66
-
67
- **This is the single largest algorithmic idea in Micron**, and it is the one thing that
68
- would materially improve the metric without a Hausdorff pass.
69
-
70
- ### 2.2 Simplify to a cluster-count target, not a triangle ratio
71
-
72
- `many_to_many_merge`:
73
-
74
- ```js
75
- const target_face_count = up_count * MICRON_PATCH_SIZE_MAX;
76
- ```
77
-
78
- with `up_count = ceilPowerOfTwo(ceil(nodes.length / 2))`. Micron asks the simplifier for
79
- exactly as many triangles as `up_count` **full** patches hold, then splits into that many.
80
- Cluster-count halving is guaranteed by construction, and parents come out at the cap.
81
-
82
- meep simplifies to 50% of the triangle count and takes whatever cluster count falls out of
83
- the re-split. Measured fill on the current builder: 120 tris/cluster at the leaves, dropping
84
- to 67–98 in the coarse levels — up to 45% of the cap wasted where the DAG is narrowest.
85
- Since a cluster is a draw slot and a residency slot, that is a direct cost, and it compounds
86
- with §2.5.
87
-
88
- (The `ceilPowerOfTwo` is an artifact of Micron's recursive-bisection fallback and should not
89
- be copied — it rounds a target of 3 up to 4 and throws away simplification budget.)
90
-
91
- ### 2.3 A merge objective richer than edge cut — especially `volume_score`
92
-
93
- `build/hierarchy/computePatchMergeScore.js` scores a candidate pair on six terms. Three are
94
- worth taking:
95
-
96
- ```js
97
- volume_score = (vol(a) + vol(b)) / vol(bounding_sphere_of(a, b))
98
- ```
99
-
100
- A **scale-free compactness penalty**: merging two things that are far apart produces a
101
- merged sphere far larger than the sum of its parts, and the score collapses. No absolute
102
- distance constant, no scene-scale tuning. This is precisely the criterion the packing pass
103
- needed and could not find — the current code settles for "the group already bounded it",
104
- which is true but coarse, and it is why leaf-level packing had to be dropped entirely rather
105
- than bounded.
106
-
107
- ```js
108
- lod_score = 1 - normalized_difference(a.lod, b.lod) // "creates a more flat hierarchy"
109
- ```
110
-
111
- A **soft** version of meep's error octave. Micron prefers merging patches of similar level;
112
- meep hard-gates on an error band and falls back to a full sweep when the band has no work.
113
- The soft form has no escape hatch to justify, and would work as a tie-breaker *inside* a
114
- band, which is where meep currently uses shared-boundary weight alone.
115
-
116
- > **Since this was written**: not alone any more. The adjacency edge weight is shared boundary
117
- > *times* `compactness()` (plan §1), so the tie-break slot this proposes is occupied — by a
118
- > spatial term rather than an error-similarity one. A level tie-break would now have to argue
119
- > its way past compactness, not past nothing.
120
-
121
- ```js
122
- normal_score = 1 - merged_cone_angle² / π²
123
- ```
124
-
125
- Prefers merging co-facing patches, which keeps the normal cone tight. meep reserves
126
- `cone_reserved` in the cluster record and has no producer; if the cone ever lands, the
127
- grouping should be aware of it or the cones will be useless at coarse levels.
128
-
129
- > **Since this was written**: moot — **backface cone culling is declined** (plan §5). The
130
- > warning above turned out to be the argument against the whole idea rather than a caveat on
131
- > implementing it: making cones tight enough to be worth testing means letting cone angle
132
- > distort grouping, to feed a cull the two-pass HZB was already performing on evidence. The
133
- > producer did land in the meantime and has no callers
134
- > (`bt_face_cluster_compute_normal_bounding_cone`); `cone_reserved` stays 0 for good.
135
-
136
- The weighting itself should **not** be copied: the terms are heterogeneous in scale and
137
- `shared_vertex_count` enters unnormalized, so it dominates everything else. The terms are
138
- the finding, not the sum.
139
-
140
- ### 2.4 Speculative merge with rollback
141
-
142
- `many_to_many_merge` copies the quadrics, simplifies, and if the face-count target is missed
143
- **rejects the merge and forwards the children unchanged**:
144
-
145
- ```js
146
- if (merged_mesh_face_count > target_face_count) {
147
- // simplification failed, reject
148
- array_copy(nodes, 0, output, t, input_node_count);
149
- ```
150
-
151
- meep's equivalents throw (`group boundary edge did not survive simplification`) or
152
- pass-through the whole group at the same face count. Reject-and-forward is gentler and fits
153
- the frontier model exactly: a group that cannot be simplified is a group whose clusters wait
154
- for a different grouping, which is already the model for a group that cannot be *formed*.
155
-
156
- ### 2.5 Fixed-size residency slots
157
-
158
- `render/instanced/PatchDataTextures.js` gives every resident patch one slot of
159
- `MICRON_PATCH_SIZE_MAX * 3` vertices, occupancy in a `BitSet`, capacity grown by a factor.
160
- No allocator, no fragmentation, no compaction, **no address migration**.
161
-
162
- Design §2 records that `GPUMeshletManager` pools variable-size allocations through
163
- OffsetAllocator, that its compaction/growth is a CPU-side rebuild costing ~2× VRAM
164
- transiently, and that meshlet-address migration is an *acknowledged unhandled TODO* in
165
- `GPUGeometryManager`. Fixed slots delete that problem rather than solving it. The cost is
166
- internal fragmentation proportional to `1 − fill`, which is exactly what §2.2 is about —
167
- the two findings are one decision.
168
-
169
- Worth a measurement before committing: at 120/128 fill, fixed slots cost 6%; at 67/128 they
170
- cost 48%.
171
-
172
- ### 2.6 Proxy geometry, free from the DAG
173
-
174
- `format/micron_build_proxy_geometry.js` extracts a low-poly stand-in by refining from the
175
- root with a heap keyed on `-patch.lod` until a target polygon fraction is reached. Shadows,
176
- physics, raycasts, editor previews, impostors — all of them want a cheap whole-object mesh,
177
- and a cluster DAG hands one over for the cost of a heap walk. Nothing in the design mentions
178
- it.
179
-
180
- ### 2.7 Object-space refinement
181
-
182
- `render/refinement/RefinementSpec.js`:
183
-
184
- ```js
185
- mat4.multiply(projection_matrix, view_projection_matrix, transform);
186
- frustum_from_projection_matrix_array(this.frustum_f32, projection_matrix);
187
- ```
188
-
189
- One matrix multiply per *instance*, then every cull and error test runs in object space
190
- against untransformed cluster bounds. With thousands of instances sharing one geometry, the
191
- alternative — transforming every cluster's bounds to world space — is the whole cost. meep's
192
- cut pass will need this; it is not in the design.
193
-
194
- ### 2.8 Two smaller ones
195
-
196
- **Sub-pixel patch culling.** `render/refinement/is_patch_visible.js` drops a patch whose
197
- entire projected area is below the error threshold. (Dead code in Micron — the function is
198
- not exported — but the idea stands.)
199
-
200
- **Anti-stranding in leaf clustering.** `build/clustering/computeOpenFaceFreedom.js` counts a
201
- candidate face's neighbours still in the open set, so the region-growing clusterer prefers
202
- faces that are about to be stranded. meep gets the same effect structurally, via
203
- `absorb_singleton_pieces`, but only *after* the partition; Micron avoids creating the
204
- orphan.
205
-
206
- ## 3. What not to borrow
207
-
208
- ### 3.1 The shipped error metric is a density heuristic
209
-
210
- `many_to_many_merge` computes two candidate errors and ships neither:
211
-
212
- ```js
213
- const area_based_qem_error = largest_squared_error / group_bounding_sphere_section_area;
214
- const group_per_pixel_error = group_inverse_polycount; // <-- 1 / face_count
215
- // const group_per_pixel_error = Math.sqrt(largest_squared_error);
216
- ```
217
-
218
- `group_inverse_polycount` is `1 / face_count`. Design §4 explicitly **rejects**
219
- "pixels-per-triangle density heuristics — they fail the flat-wall test".
220
-
221
- This matters beyond the metric itself: §4 cites the prior implementation for "pops stay
222
- invisible well above 1 px". That empirical result was obtained with `1 / face_count`, not
223
- with `r_e`. It is evidence about a threshold dial under a *different* metric and should not
224
- be read as calibration for the pinned one.
225
-
226
- The commented-out `area_based_qem_error` is more interesting than either — a dimensionless
227
- error, unit-matched to Micron's area-based screen projection.
228
-
229
- ### 3.2 Crack repair instead of crack prevention
230
-
231
- `build/hierarchy/patch_fill_holes_by_uncollapse.js` and `patch_stitch_parent_border.js` are
232
- both unreferenced anywhere in the tree. They are attempts to let the simplifier move group
233
- boundaries freely and then repair the resulting cracks — by un-collapsing border edges, and
234
- by solving a min-cost matching between two patches' border vertices. Neither shipped.
235
- Locked perimeters won. That is a road already walked; there is no need to walk it again.
236
-
237
- ### 3.3 Spectral partitioning
238
-
239
- `merge_patches.js` carries a third partitioner: build the face graph's Laplacian as a dense
240
- `SquareMatrix`, take its eigenvalues, and cut the Fiedler ordering into equal runs. O(n²)
241
- memory in face count, and the ordering is used as a 1-D sort rather than a real bisection.
242
- It exists as a fallback behind METIS and recursive bisection. Not worth porting.
243
-
244
- ### 3.4 No paging
245
-
246
- `format/serialization/serialize_patch.js` writes the whole DAG as one blob, with parent and
247
- child references resolved by `patch_array.indexOf(...)` per edge — O(n²) serialization, and
248
- an all-or-nothing load. The `.vgeo` container's page/band/child-table structure is the
249
- clearest advance the rewrite makes over its ancestor, and there is nothing here to learn
250
- from except that the gap is real.
251
-
252
- ## 4. The one genuine architectural fork: traversal vs flat evaluation
253
-
254
- Micron's cut is a **top-down DAG traversal** (`render/refinement/get_geometry_patch_cut.js`):
255
- push the root, frustum-test, and if the group's screen-space error exceeds the threshold push
256
- the children; a `BitSet` dedupes clusters reachable through more than one parent. Design §4
257
- pins the opposite — "evaluated independently per cluster, no traversal".
258
-
259
- Both are defensible and they trade cleanly:
260
-
261
- | | Micron traversal | meep flat rule |
262
- |---|---|---|
263
- | Work per frame | O(cut size) | O(resident clusters) |
264
- | Off-screen geometry | whole subtrees skipped, never visited | every resident cluster still evaluated |
265
- | Parallelism | serial, pointer-chasing, CPU | data-parallel, one GPU dispatch |
266
- | Views | inherently one view; a shadow view needs its own traversal | view-agnostic by construction (§7, §9) |
267
- | Streaming | a missing page stops the descent naturally | needs the residency clamp to avoid holes |
268
- | State | stateless here, but Micron also carries a stateful incremental variant | stateless |
269
-
270
- The design's choice is right for the stated goals (GPU cut, shadow reuse, dynamic
271
- resolution). But the traversal's ability to skip an entire off-screen subtree is a real
272
- advantage that grows with cluster count, and the flat rule pays for it in full every frame.
273
- Worth measuring rather than assuming: at billions of triangles the resident cluster count is
274
- in the millions, and a flat pass over all of them is not obviously cheap.
275
-
276
- Two details from the traversal are worth keeping regardless of which way that goes:
277
-
278
- - **A DAG cut needs a visited set.** A cluster reachable from two parents is emitted twice
279
- without one. Any future traversal-shaped tool — the proxy builder of §2.6, a validator,
280
- an offline cut — needs the same `BitSet`.
281
- - **Capacity-grow-and-retry.** `get_geometry_patch_cut` writes optimistically, and on
282
- overflow grows the destination and redoes the whole cut. Simple, and correct because the
283
- cut is a pure function of the spec.
284
-
285
- Micron also carries a **stateful incremental cut** (`render/refinement/ActivePatchList.js`)
286
- — a linked list of active patches with split/merge from frame to frame, amortising the cut
287
- across frames since the camera moves little. It is dead code; the stateless rebuild is what
288
- is wired. That is itself a data point: the stateful version was built and abandoned.
289
-
290
- ## 5. Recommendation
291
-
292
- In order:
293
-
294
- 1. **Accumulated quadrics** (§2.1). Biggest metric win available, and it does not touch the
295
- format.
296
- 2. **Cluster-count simplification target** (§2.2) — and measure fill before and after, since
297
- §2.5 depends on the answer.
298
- 3. **`volume_score` as the packing/bundling criterion** (§2.3). It is the missing piece that
299
- forced leaf packing to be dropped rather than bounded.
300
- 4. **Reject-and-forward instead of throw** on a failed simplification (§2.4).
301
- 5. **Object-space refinement spec** (§2.7) when the cut pass is written.
302
- 6. Park §2.5 (fixed slots) and §2.6 (proxy) as scoped follow-ups; both are self-contained.
303
-
304
- And one correction to the design rather than the code: §4's "pops stay invisible well above
305
- 1 px (prior implementation)" should be marked as measured under `1 / face_count`, not `r_e`.