@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.
- package/CHANGELOG.md +2602 -0
- package/CONTRIBUTING.md +7 -0
- package/MIGRATION_2_TO_3.md +136 -0
- package/SECURITY.md +4 -0
- package/editor/EditorCameraNavigation.d.ts +2 -1
- package/editor/EditorCameraNavigation.d.ts.map +1 -1
- package/editor/EditorCameraNavigation.js +51 -57
- package/package.json +6 -2
- package/src/engine/EngineHarness.d.ts +3 -9
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +6 -8
- package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts +9 -6
- package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts.map +1 -1
- package/src/engine/graphics/camera/makeOrbitalCameraController.js +44 -71
- package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts +64 -0
- package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts.map +1 -0
- package/src/engine/graphics/camera/orbital/MomentumAxis.js +187 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts +86 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts.map +1 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.js +319 -0
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +34 -10
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +116 -30
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +1 -7
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -37
- package/src/engine/graphics/ecs/water/Water.d.ts +8 -0
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +8 -0
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +731 -734
- package/src/engine/graphics3/decal/DecalTileShader.d.ts +61 -0
- package/src/engine/graphics3/decal/DecalTileShader.d.ts.map +1 -0
- package/src/engine/graphics3/decal/DecalTileShader.js +138 -0
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts +10 -4
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +149 -44
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts +25 -0
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts.map +1 -0
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.js +55 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts +22 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts.map +1 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.js +70 -0
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts +7 -5
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_decal_composite.js +48 -44
- package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts +12 -0
- package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -0
- package/src/engine/graphics3/decal/shader_decal_tile_copy.js +78 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts +11 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts.map +1 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.js +80 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.d.ts +13 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.d.ts.map +1 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.js +23 -0
- package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts +4 -0
- package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts.map +1 -1
- package/src/engine/input/ecs/controllers/KeyboardCameraController.js +9 -45
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/playground/water_refraction/README.md +5 -6
- package/src/shade/playground/water_refraction/index.html +1 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +7 -5
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +2 -2
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +2 -2
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +2 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +18 -1
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +1 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +5 -5
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +10 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +1 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
- package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
- package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
- package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts +7 -0
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +11 -0
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
- package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
- package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
- package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +22 -13
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water_avboit.js +7 -7
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
- package/editor/REWORK_PLAN_2026_08.md +0 -692
- package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
- package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
- package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
- package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
- package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
- package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
- package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
- package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
- package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
- package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
- package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
- package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
- package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
- package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
- package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
- package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
- package/src/REVIEW_2026_08_06/adv-core.md +0 -511
- package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
- package/src/REVIEW_2026_08_06/adv-view.md +0 -446
- package/src/REVIEW_2026_08_06/api-core.md +0 -296
- package/src/REVIEW_2026_08_06/api-engine.md +0 -195
- package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
- package/src/REVIEW_2026_08_06/core-binary.md +0 -348
- package/src/REVIEW_2026_08_06/core-collection.md +0 -376
- package/src/REVIEW_2026_08_06/core-math.md +0 -221
- package/src/REVIEW_2026_08_06/core-process.md +0 -266
- package/src/REVIEW_2026_08_06/core-science.md +0 -223
- package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
- package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
- package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
- package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
- package/src/REVIEW_2026_08_06/engine-input.md +0 -197
- package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
- package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
- package/src/REVIEW_2026_08_06/generation.md +0 -176
- package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
- package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
- package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
- package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
- package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
- package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
- package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
- package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
- package/src/REVIEW_2026_08_06/view.md +0 -667
- package/src/REVIEW_2026_08_06.md +0 -610
- package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
- package/src/core/bvh2/bvh3/NOTES.md +0 -2
- package/src/core/bvh8/NOTES.md +0 -63
- package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
- package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
- package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
- package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
- package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
- package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
- package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
- package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
- package/src/core/geom/3d/gjk/NOTES.md +0 -8
- package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
- package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
- package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
- package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
- package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
- package/src/engine/REVIEW_2026_07_03.md +0 -211
- package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
- package/src/engine/control/first-person/DESIGN.md +0 -658
- package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
- package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
- package/src/engine/control/first-person/TODO.md +0 -160
- package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
- package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
- package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
- package/src/engine/ecs/ik/PLAN.md +0 -179
- package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
- package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
- package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
- package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
- package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
- package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
- package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
- package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
- package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
- package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
- package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
- package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
- package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
- package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
- package/src/engine/network/CONGESTION_CONTROL.md +0 -87
- package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
- package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
- package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
- package/src/engine/physics/cloth/PLAN.md +0 -3056
- package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
- package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
- package/src/engine/physics/fluid/solver/NOTES.md +0 -46
- package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
- package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
- package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
- package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
- package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
- package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
- package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
- package/src/format/image/avif/DECISIONS.md +0 -545
- package/src/format/image/jpeg/NOTES.md +0 -3
- package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
- package/src/generation/COORDINATES.md +0 -54
- package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
- package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
- package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
- package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
- package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
- package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
- package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
- package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
- package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
- package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
- package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
- package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
- package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
- package/src/shade/RENDERER_CONTRACT.md +0 -697
- package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
- package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
- package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
- package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
- package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
- package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
- package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
- package/src/shade/renderer/NOTES.md +0 -78
- package/src/shade/renderer/PLAN.md +0 -8
- package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
- package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
- package/src/shade/renderer/atmosphere/NOTES.md +0 -6
- package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
- package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
- package/src/shade/renderer/camera/orbital/README.md +0 -81
- package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
- package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/index.js +0 -9
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
- package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
- package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
- package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
- package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
- package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -481
- package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
- package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
- package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -529
- package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4306
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
- package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
- package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
- package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
- package/src/shade/renderer/hiz/NOTES.md +0 -3
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
- package/src/shade/renderer/light/cluster/NOTES.md +0 -11
- package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
- package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
- package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
- package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
- package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
- package/src/shade/renderer/particles/DESIGN.md +0 -1011
- package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -280
- package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
- package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
- package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
- package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
- package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
- package/src/shade/renderer/postprocess/nss/NOTES.md +0 -332
- package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
- package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
- package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
- package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
- package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
- package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
- package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
- package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
- package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
- package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
- package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -391
- package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -153
- package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
- package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
- package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
- package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
- package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
- package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
- package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
- package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
- package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -927
- package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
- package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
- package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
- package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
- package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
- package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
- package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
- package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
- package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
- package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
- package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -3
- package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
- package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
- 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`.
|