@woosh/meep-engine 3.28.0 → 3.30.0
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/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
- package/src/core/binary/BinaryBuffer.js +14 -2
- package/src/core/binary/BitSet.d.ts +16 -0
- package/src/core/binary/BitSet.d.ts.map +1 -1
- package/src/core/binary/BitSet.js +159 -49
- package/src/core/binary/allocator/OffsetAllocator.d.ts +48 -0
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +208 -9
- package/src/core/binary/compression/compress_bytes.d.ts +20 -0
- package/src/core/binary/compression/compress_bytes.d.ts.map +1 -0
- package/src/core/binary/compression/compress_bytes.js +35 -0
- package/src/core/binary/compression/decompress_bytes_into.d.ts +30 -0
- package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -0
- package/src/core/binary/compression/decompress_bytes_into.js +87 -0
- package/src/core/binary/compression/deflate_decompress_bound.d.ts +27 -0
- package/src/core/binary/compression/deflate_decompress_bound.d.ts.map +1 -0
- package/src/core/binary/compression/deflate_decompress_bound.js +32 -0
- package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BVH.js +14 -1
- package/src/core/cache/FrequencySketch.d.ts +3 -1
- package/src/core/cache/FrequencySketch.d.ts.map +1 -1
- package/src/core/cache/FrequencySketch.js +10 -4
- package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts.map +1 -1
- package/src/core/cache/wtinylfu/CacheWTinylfu.js +24 -2
- package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts +24 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.js +31 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts +46 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.js +104 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts +62 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js +158 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts +21 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.js +24 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts +34 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.js +55 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts +28 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.js +35 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts +15 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +35 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts +93 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.js +128 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts +20 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +69 -4
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts +38 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +113 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +93 -17
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +930 -69
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts +22 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.js +46 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts +19 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.js +49 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts +25 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.js +228 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts +13 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.js +10 -128
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js +11 -1
- package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts +63 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts.map +1 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.js +80 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.d.ts +35 -0
- package/src/core/graph/layout/layered/LayoutBoxGraph.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.js +53 -1
- package/src/core/graph/layout/layered/layout_assign_coordinates.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.js +72 -68
- package/src/core/graph/layout/layered/layout_assign_layers.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.js +4 -2
- package/src/core/graph/layout/layered/layout_break_cycles.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_insert_lanes.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_order_layers.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_orient_links.d.ts.map +1 -0
- package/src/core/graph/mn_graph_collapse_weighted_edge.js +6 -6
- package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
- package/src/core/math/lookup/ParameterLookupTable.js +10 -5
- package/src/core/math/noise/sdnoise.d.ts.map +1 -1
- package/src/core/math/noise/sdnoise.js +16 -10
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +7 -51
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +8 -69
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +1 -1
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +6 -6
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +1 -1
- package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
- package/src/core/model/object/ImmutableObjectPool.js +17 -7
- package/src/core/process/executor/ConcurrentExecutor.d.ts +1 -5
- package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
- package/src/core/process/executor/ConcurrentExecutor.js +95 -1
- package/src/core/process/task/task_find_dependency_cycle.d.ts +17 -0
- package/src/core/process/task/task_find_dependency_cycle.d.ts.map +1 -0
- package/src/core/process/task/task_find_dependency_cycle.js +81 -0
- package/src/core/wfc/WFCCellChoice.d.ts +17 -0
- package/src/core/wfc/WFCCellChoice.d.ts.map +1 -0
- package/src/core/wfc/WFCCellChoice.js +36 -0
- package/src/core/wfc/WFCLattice.d.ts +105 -0
- package/src/core/wfc/WFCLattice.d.ts.map +1 -0
- package/src/core/wfc/WFCLattice.js +235 -0
- package/src/core/wfc/WFCRuleTable.d.ts +172 -0
- package/src/core/wfc/WFCRuleTable.d.ts.map +1 -0
- package/src/core/wfc/WFCRuleTable.js +334 -0
- package/src/core/wfc/WFCState.d.ts +273 -0
- package/src/core/wfc/WFCState.d.ts.map +1 -0
- package/src/core/wfc/WFCState.js +552 -0
- package/src/core/wfc/WFCStatus.d.ts +11 -0
- package/src/core/wfc/WFCStatus.d.ts.map +1 -0
- package/src/core/wfc/WFCStatus.js +28 -0
- package/src/core/wfc/WFCTileWeights.d.ts +48 -0
- package/src/core/wfc/WFCTileWeights.d.ts.map +1 -0
- package/src/core/wfc/WFCTileWeights.js +86 -0
- package/src/core/wfc/WFC_UNRESOLVED.d.ts +12 -0
- package/src/core/wfc/WFC_UNRESOLVED.d.ts.map +1 -0
- package/src/core/wfc/WFC_UNRESOLVED.js +11 -0
- package/src/core/wfc/wfc_estimate_bytes.d.ts +24 -0
- package/src/core/wfc/wfc_estimate_bytes.d.ts.map +1 -0
- package/src/core/wfc/wfc_estimate_bytes.js +47 -0
- package/src/core/wfc/wfc_rule_table_tile_components.d.ts +27 -0
- package/src/core/wfc/wfc_rule_table_tile_components.d.ts.map +1 -0
- package/src/core/wfc/wfc_rule_table_tile_components.js +80 -0
- package/src/core/wfc/wfc_solve.d.ts +21 -0
- package/src/core/wfc/wfc_solve.d.ts.map +1 -0
- package/src/core/wfc/wfc_solve.js +154 -0
- package/src/core/wfc/wfc_state_apply_boundary.d.ts +18 -0
- package/src/core/wfc/wfc_state_apply_boundary.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_apply_boundary.js +61 -0
- package/src/core/wfc/wfc_state_assign.d.ts +11 -0
- package/src/core/wfc/wfc_state_assign.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_assign.js +36 -0
- package/src/core/wfc/wfc_state_ban_bits.d.ts +17 -0
- package/src/core/wfc/wfc_state_ban_bits.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_ban_bits.js +81 -0
- package/src/core/wfc/wfc_state_collapse.d.ts +12 -0
- package/src/core/wfc/wfc_state_collapse.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_collapse.js +73 -0
- package/src/core/wfc/wfc_state_flush_dirty.d.ts +12 -0
- package/src/core/wfc/wfc_state_flush_dirty.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_flush_dirty.js +39 -0
- package/src/core/wfc/wfc_state_propagate.d.ts +14 -0
- package/src/core/wfc/wfc_state_propagate.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_propagate.js +155 -0
- package/src/core/wfc/wfc_state_read.d.ts +11 -0
- package/src/core/wfc/wfc_state_read.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_read.js +38 -0
- package/src/core/wfc/wfc_state_restrict.d.ts +18 -0
- package/src/core/wfc/wfc_state_restrict.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_restrict.js +39 -0
- package/src/core/wfc/wfc_state_set_eligible.d.ts +24 -0
- package/src/core/wfc/wfc_state_set_eligible.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_set_eligible.js +49 -0
- package/src/core/wfc/wfc_state_undo_to.d.ts +13 -0
- package/src/core/wfc/wfc_state_undo_to.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_undo_to.js +84 -0
- package/src/core/wfc/wfc_words_per_cell.d.ts +11 -0
- package/src/core/wfc/wfc_words_per_cell.d.ts.map +1 -0
- package/src/core/wfc/wfc_words_per_cell.js +16 -0
- package/src/engine/ecs/EntityComponentDataset.d.ts +8 -0
- package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
- package/src/engine/ecs/EntityComponentDataset.js +37 -14
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +8 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +37 -2
- package/src/engine/ecs/guid/UUID.d.ts.map +1 -1
- package/src/engine/ecs/guid/UUID.js +45 -17
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +1 -1
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +3 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +366 -360
- package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.js +24 -10
- package/src/engine/graphics3/DebugDrawSystem.d.ts +7 -5
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +206 -203
- package/src/engine/graphics3/DecalSystem.d.ts +4 -5
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +5 -5
- package/src/engine/graphics3/FogOfWarSystem.d.ts +7 -12
- package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -1
- package/src/engine/graphics3/FogOfWarSystem.js +8 -12
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +24 -5
- package/src/engine/interpolation/Interpoland.d.ts +7 -1
- package/src/engine/interpolation/Interpoland.d.ts.map +1 -1
- package/src/engine/interpolation/Interpoland.js +8 -1
- package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
- package/src/engine/interpolation/InterpolationSystem.js +3 -0
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +5 -3
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -3
- package/src/engine/interpolation/pose_interpoland.d.ts.map +1 -1
- package/src/engine/interpolation/pose_interpoland.js +2 -0
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +15 -10
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +17 -0
- package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
- package/src/engine/physics/mls-mpm/MLS_MPM.js +14 -0
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +2 -1
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +1 -1
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +1 -0
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +1 -0
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +2 -1
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +12 -3
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +1 -0
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.js +4 -1
- package/src/format/image/avif/av1/decode/decode_coefficients.d.ts.map +1 -1
- package/src/format/image/avif/av1/decode/decode_coefficients.js +248 -259
- package/src/format/image/avif/av1/decode/read_golomb.d.ts +21 -0
- package/src/format/image/avif/av1/decode/read_golomb.d.ts.map +1 -0
- package/src/format/image/avif/av1/decode/read_golomb.js +49 -0
- package/src/format/image/avif/av1/filter/loop_restoration.js +461 -451
- package/src/format/image/avif/av1/util/round2.d.ts +19 -2
- package/src/format/image/avif/av1/util/round2.d.ts.map +1 -1
- package/src/format/image/avif/av1/util/round2.js +51 -27
- package/src/format/image/avif/heif/parse_avif_file.js +24 -0
- package/src/shade/RENDERER_CONTRACT.md +12 -7
- package/src/shade/playground/caldera/README.md +529 -0
- package/src/shade/playground/caldera/caldera_format.d.ts +151 -0
- package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -0
- package/src/shade/playground/caldera/caldera_format.js +241 -0
- package/src/shade/playground/caldera/index.html +126 -0
- package/src/shade/playground/caldera/main.d.ts.map +1 -0
- package/src/shade/playground/caldera/main.js +1565 -0
- package/src/shade/playground/mesh_row_ceiling/README.md +85 -0
- package/src/shade/playground/mesh_row_ceiling/index.html +31 -0
- package/src/shade/playground/mesh_row_ceiling/main.d.ts +2 -0
- package/src/shade/playground/mesh_row_ceiling/main.d.ts.map +1 -0
- package/src/shade/playground/mesh_row_ceiling/main.js +389 -0
- package/src/shade/playground/vgeo_runtime/README.md +5 -3
- package/src/shade/playground/vgeo_runtime/main.js +3 -2
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +3 -3
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -1
- package/src/shade/playground/vgeo_runtime/sample_asset.js +3 -3
- package/src/shade/playground/vgeo_scene/README.md +103 -24
- package/src/shade/playground/vgeo_scene/main.js +525 -24
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +6 -0
- package/src/shade/renderer/Renderer.d.ts +2 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +23 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +100 -8
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +14 -0
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +69 -33
- package/src/shade/renderer/extension/RenderExtension.d.ts +15 -18
- package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtension.js +15 -19
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +5 -5
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtensionRegistry.js +29 -166
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.js +73 -16
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -3
- package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +663 -0
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +100 -5
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +688 -81
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +155 -64
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +76 -16
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +3 -3
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +448 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +44 -7
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +48 -9
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts +40 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.js +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +91 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +91 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.js +25 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +77 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +84 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +19 -6
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.js +20 -7
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.js +58 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.js +116 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +545 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +110 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +2 -27
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +120 -1564
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts +26 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.js +123 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts +26 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.js +78 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +337 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +147 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts +37 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.js +243 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +117 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +46 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +74 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +78 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +12 -7
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.js +33 -11
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts +58 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.js +79 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.js +68 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts +53 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.js +243 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +32 -7
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +243 -24
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +12 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +58 -50
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +5 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +13 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts +38 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.js +81 -0
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +23 -5
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js +28 -21
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.js +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +224 -60
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +17 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +19 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +10 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +103 -9
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +14 -2
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +38 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts +6 -2
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +27 -4
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts +32 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.js +93 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +20 -6
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +22 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/{vgeo_layers_copy_vertex.js → vgeo_layers_copy_corner.js} +8 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts +18 -7
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +19 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.d.ts +3 -3
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +3 -3
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts +27 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.js +97 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts +7 -3
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +21 -11
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts +21 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.js +41 -0
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +19 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +20 -1
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts +25 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.js +24 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts +10 -3
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +37 -3
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +21 -13
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +37 -13
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts +8 -2
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +14 -2
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +19 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +6 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts +21 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.js +20 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +10 -1
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +1 -2
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +10 -3
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.js +43 -0
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +4 -2
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +8 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +2 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts +6 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.js +6 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +5 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +14 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts +4 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js +53 -11
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +7 -3
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts +12 -2
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +111 -33
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts +6 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +112 -42
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +51 -21
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +14 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +34 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +18 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +47 -19
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +22 -4
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +7 -2
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +8 -3
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +13 -11
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +13 -11
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +4 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +12 -3
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -4
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +6 -2
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +90 -12
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +22 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +21 -0
- package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.js +7 -1
- package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/GPULightMap.js +349 -336
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +1137 -1128
- package/src/shade/renderer/particles/DESIGN.md +14 -5
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +25 -10
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +182 -38
- package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/simplex_reference.js +16 -10
- package/src/shade/renderer/particles/graph_particles.d.ts +4 -2
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +8 -2
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +8 -2
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +10 -4
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +13 -8
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +31 -0
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.js +62 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -6
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +13 -0
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +95 -17
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +4 -12
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts +21 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.js +28 -0
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +4 -5
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +5 -3
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +11 -4
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -3
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +3 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +94 -90
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +13 -5
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +96 -89
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +3 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.js +4 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +100 -89
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +31 -7
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +1 -7
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +161 -153
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +2 -7
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +19 -2
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +4 -8
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +5 -8
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +19 -2
- package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/WebGPUStruct.js +12 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +25 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +24 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +10 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +30 -21
- package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts +8 -2
- package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts.map +1 -1
- package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +41 -6
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +2383 -2356
- package/src/view/tooltip/DomTooltipManager.d.ts +7 -0
- package/src/view/tooltip/DomTooltipManager.d.ts.map +1 -1
- package/src/view/tooltip/DomTooltipManager.js +22 -0
- package/src/view/tooltip/DomTooltipObserver.d.ts.map +1 -1
- package/src/view/tooltip/DomTooltipObserver.js +13 -3
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts +0 -61
- package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts +0 -18
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/select_cut.d.ts +0 -173
- package/src/shade/playground/vgeo_viewer/select_cut.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts +0 -52
- package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts +0 -24
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts +0 -32
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts +0 -59
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts +0 -44
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts +0 -20
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts +0 -73
- package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +0 -13
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts +0 -36
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts +0 -13
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts +0 -19
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts +0 -29
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts +0 -31
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts +0 -18
- package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts +0 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts +0 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts +0 -11
- package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts +0 -46
- package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +0 -22
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts +0 -29
- package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts +0 -9
- package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts +0 -10
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts +0 -15
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts +0 -16
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts.map +0 -1
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts +0 -10
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts +0 -17
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts +0 -3
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts +0 -8
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +0 -1
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.js +0 -0
- /package/src/shade/playground/{vgeo_viewer → caldera}/main.d.ts +0 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
# `caldera` — a production map, whole
|
|
2
|
+
|
|
3
|
+
Activision's [Caldera](https://github.com/Activision/caldera) — the Call of Duty: Warzone map — is
|
|
4
|
+
17.5 million primitives and two billion points across two miles square, released as OpenUSD. This
|
|
5
|
+
page converts it and hands the whole thing to the ordinary renderer.
|
|
6
|
+
|
|
7
|
+
That last part is the point, and it is what makes this page different from
|
|
8
|
+
[`../vgeo_scene/`](../vgeo_scene/README.md). `vgeo_scene` asks what a virtual-geometry cut costs
|
|
9
|
+
across a whole scene, and to answer it puts *every* asset on the virtual backing, because the cut is
|
|
10
|
+
the subject. This page asks the opposite question — **what does meep do when a real production map
|
|
11
|
+
arrives all at once** — so the default backing is the plain meshlet path every game asset takes,
|
|
12
|
+
the placements are ordinary mesh rows, and virtual geometry is a *promotion* a few hundred of the
|
|
13
|
+
largest geometries get. Which is how a game would actually use it, and which puts both paths in one
|
|
14
|
+
frame instead of across two pages.
|
|
15
|
+
|
|
16
|
+
## Converting it
|
|
17
|
+
|
|
18
|
+
Caldera is 63,683 binary crate (`PXR-USDC`) layers composed through sublayers, references, payloads,
|
|
19
|
+
variants and native instancing. meep reads USD — `src/format/scene/usd/` — but only the ASCII form
|
|
20
|
+
of a single layer, and it warns on a `references` arc rather than following one. Composition is what
|
|
21
|
+
this data *is*, so the extraction runs under OpenUSD and nothing downstream of it knows USD exists.
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pip install usd-core numpy
|
|
25
|
+
python tools/caldera/caldera_extract.py H:/git/caldera H:/tmp/caldera-extract
|
|
26
|
+
node tools/caldera/caldera_build.js H:/tmp/caldera-extract H:/git/caldera/meep
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The first step is composition and nothing else: it opens each district at its `districtLod=full`
|
|
30
|
+
variant, walks the composed stage, and writes triangle soup and matrices. The second is the engine's
|
|
31
|
+
own code — meshlets, the BLAS, `.vgeo` — run offline across every core. `H:/tmp/caldera-extract` is
|
|
32
|
+
scratch and can be deleted the moment the build finishes; `H:/git/caldera/meep` is the converted
|
|
33
|
+
set.
|
|
34
|
+
|
|
35
|
+
Both tools' docblocks are the reference for their options. The two decisions worth repeating here:
|
|
36
|
+
|
|
37
|
+
- **Distinctness is content, not provenance.** Two placements of one model are two prims at two
|
|
38
|
+
paths, and keying on the layer that authored the points misses that one model is authored in
|
|
39
|
+
several prefabs. On `map_airfield` the layer key finds 88,583 distinct geometries where a content
|
|
40
|
+
hash finds 64,438 — a quarter of that district's containers would have been duplicates. The layer
|
|
41
|
+
key survives as a *pre*-filter, which is what keeps 3.8 million placements down to 683 thousand
|
|
42
|
+
mesh reads.
|
|
43
|
+
- **The BLAS travels in the packs, and that is a measurement.** It is **51% of them** — the same
|
|
44
|
+
two districts build to 250.8 MiB with it and 122.9 MiB without — and leaving it out does not mean
|
|
45
|
+
shipping without one: `MeshletGeometrySerializationAdapter` rebuilds a missing BVH on load, at a
|
|
46
|
+
measured **34 ms per MiB saved** on this geometry. Over the whole set that is **253 seconds of
|
|
47
|
+
blocked main thread** to save 7.3 GiB of transfer off a local disk, which is the wrong way round
|
|
48
|
+
for a set whose point is how fast it opens. `--no-blas` inverts the trade for a slow network, and
|
|
49
|
+
watching it invert is a reasonable thing to do with this page.
|
|
50
|
+
|
|
51
|
+
## Running it
|
|
52
|
+
|
|
53
|
+
Three things: the dev server in front of the page, an asset server in front of the converted set,
|
|
54
|
+
and a browser.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm run dev --workspace @woosh/meep-engine
|
|
58
|
+
node tools/geometry/virtual/vgeo_serve.js H:/git/caldera/meep
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Then `/src/shade/playground/caldera/index.html`.
|
|
62
|
+
|
|
63
|
+
**With no parameters it opens all forty-five districts, and it does not survive that** — the device
|
|
64
|
+
runs out of memory somewhere past two million rows. That and the dispatch ceiling this page found
|
|
65
|
+
first, which is fixed, are both in [What broke](#what-broke-and-what-it-took), and finding them is
|
|
66
|
+
what the default is for. The picture fills in district by district while it runs rather than
|
|
67
|
+
appearing at the end, and the panel turns the placement count red past the largest row count this
|
|
68
|
+
set has been held to fit in VRAM.
|
|
69
|
+
|
|
70
|
+
For a look at the thing rather than at its limits, name a district: `?districts=map_capital` is
|
|
71
|
+
487,464 placements in 19.5 s, `?districts=map_ruins` is 30,250 in under one, and `?districts=st_o`
|
|
72
|
+
is the island's terrain in three. `?placements=1040000` is the largest scene measured, though it is no longer a correctness bound.
|
|
73
|
+
|
|
74
|
+
**The asset server is not optional and Vite cannot replace it.** A `.vgeo` is streamed by `Range`
|
|
75
|
+
and its reader refuses anything but a `206` naming the range it asked for; the meshlet packs are
|
|
76
|
+
read the same way, by coalesced range, and a `200` there is a server handing back the head of a
|
|
77
|
+
256 MiB file where the page asked for the middle of a geometry — silently, with entirely plausible
|
|
78
|
+
bytes. Vite also refuses `/@fs/` outside the workspace, and a converted Caldera has no business
|
|
79
|
+
inside one. `vgeo_serve.js` is ranges, CORS and nothing else.
|
|
80
|
+
|
|
81
|
+
| parameter | what it does |
|
|
82
|
+
|---|---|
|
|
83
|
+
| `?districts=a,b` | open only these, in manifest order. The camera frames the first. |
|
|
84
|
+
| `?placements=N` | stop after N rows. The way back down from a machine that cannot hold the map. |
|
|
85
|
+
| `?vgeo=off` | draw the promoted geometries from their meshlet blobs instead |
|
|
86
|
+
| `?tau=N` | the virtual cut's error threshold in pixels, before the first container opens |
|
|
87
|
+
| `?pages=N` | page slots in the VRAM tier (default 16,384) |
|
|
88
|
+
| `?side=front\|back\|double` | the whole map's draw side — `double` is the winding diagnostic |
|
|
89
|
+
| `?origin=URL` | where the asset server is (default `http://localhost:5200`) |
|
|
90
|
+
| `?scene=URL` | a manifest outright, for a set that is somewhere else |
|
|
91
|
+
|
|
92
|
+
## What the converted set is
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
caldera.meep.json the manifest: districts, packs, vgeo containers, bounds — a page of text
|
|
96
|
+
geometry.table.bin one 56-byte row per distinct geometry: where its blob is, how big it is
|
|
97
|
+
pack.NNNN.mgpack serialized MeshletGeometry blobs, concatenated in geometry-id order
|
|
98
|
+
district/<name>.bin that district's placements: geometry ids, then 4x4 matrices
|
|
99
|
+
vgeo/<asset_id>.vgeo the promoted geometries and the merged ones, as virtual-geometry containers
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Three things about this shape are load-bearing.
|
|
103
|
+
|
|
104
|
+
**The packs hold `MeshletGeometry`, which is the engine's own offline format.**
|
|
105
|
+
{@link MeshletGeometrySerializationAdapter}'s docblock says so and says why: building meshlets at
|
|
106
|
+
load costs *1,246 ms of unbroken main thread per 199k triangles*, measured, and reported as a defect
|
|
107
|
+
when a level loader did it. Caldera is two orders of magnitude past that. So opening a district here
|
|
108
|
+
is a range request, a deserialize and an upload, with no geometry processing anywhere on the path —
|
|
109
|
+
and the panel's `open` row is that claim in milliseconds.
|
|
110
|
+
|
|
111
|
+
**Packs rather than files.** Half a million geometries is half a million files a filesystem handles
|
|
112
|
+
badly and a browser handles worse. Because the extractor assigns ids in first-use order, a
|
|
113
|
+
district's own geometry lands in a contiguous run of one pack, and `caldera_coalesce_ranges` turns
|
|
114
|
+
that layout into a handful of long reads — `map_ruins`' 900 geometries come out of **two** range
|
|
115
|
+
requests with no over-fetch at all.
|
|
116
|
+
|
|
117
|
+
**The geometry table is a table.** Half a million rows of JSON is tens of megabytes a page has to
|
|
118
|
+
parse before it can draw anything; 56 fixed bytes a row is a `fetch` and six typed arrays. It
|
|
119
|
+
carries each geometry's own bounds because the questions a page asks *before* fetching a geometry —
|
|
120
|
+
where a district is, what is worth opening first — are questions about bounds.
|
|
121
|
+
|
|
122
|
+
## Where the two backings meet
|
|
123
|
+
|
|
124
|
+
`VirtualGeometry extends MeshletGeometry`, and that one fact is why this page can mix them at all:
|
|
125
|
+
`place_primitive` takes either and the placement path never learns which it was handed. So the
|
|
126
|
+
choice is per geometry and it is made twice —
|
|
127
|
+
|
|
128
|
+
- **offline**, by `--vgeo-min-triangles`: a geometry past the threshold gets a `.vgeo` built for it
|
|
129
|
+
*as well as* its meshlet blob, never instead of it;
|
|
130
|
+
- **at runtime**, by `?vgeo=off`: the page picks which of the two it opens, and the one it does not
|
|
131
|
+
open is never fetched.
|
|
132
|
+
|
|
133
|
+
What that buys is an honest comparison inside one scene. The same map, the same rows, the same
|
|
134
|
+
frame, with a few hundred of its heaviest geometries moved from "fetch and upload the whole thing"
|
|
135
|
+
to "fetch a 2.5 KiB head and then whatever a threshold in pixels asks for".
|
|
136
|
+
|
|
137
|
+
## The terrain is one asset, and that is the point of it
|
|
138
|
+
|
|
139
|
+
Caldera's ground is a heightfield the source cut into pieces. The fourteen largest sit on an **exact
|
|
140
|
+
832 m grid** aligned to the origin, one per `st_*` district, at one to two million triangles each:
|
|
141
|
+
|
|
142
|
+
| geometry | triangles | x | z |
|
|
143
|
+
|---|---:|---|---|
|
|
144
|
+
| `st_k` | 2,087,424 | [0, 832] | [0, 832] |
|
|
145
|
+
| `st_g` | 1,989,414 | [0, 832] | [-832, 0] |
|
|
146
|
+
| `st_f` | 1,989,044 | [-832, 0] | [-832, 0] |
|
|
147
|
+
| `st_j` | 1,822,742 | [-832, 0] | [0, 832] |
|
|
148
|
+
| `st_o` | 1,656,202 | [0, 832] | [832, 1608] |
|
|
149
|
+
|
|
150
|
+
Under them are finer patches at 54-89 m footprints. In all it is **452 distinct geometries placed
|
|
151
|
+
728 times**, spanning 2,889 x 195 x 3,194 m, with summed footprints 0.89 of the union area — a
|
|
152
|
+
tiling, not a scatter, and every piece placed exactly once.
|
|
153
|
+
|
|
154
|
+
Converted a geometry at a time that is 728 containers: 728 cluster DAGs over one connected surface,
|
|
155
|
+
728 roots, 728 sets of error bounds, and a cut that has to arbitrate between them at every seam.
|
|
156
|
+
Virtual geometry is built for the opposite — one DAG over one surface, where a coarse level is free
|
|
157
|
+
to simplify **across** a boundary because the boundary is not there any more. So
|
|
158
|
+
`caldera_build.js --merge terrain` bakes every placement into world space, concatenates, and builds
|
|
159
|
+
one `.vgeo` from the result. One container. One row.
|
|
160
|
+
|
|
161
|
+
**Which geometry is ground cannot be decided from the geometry.** A 60 m terrain patch and a 60 m
|
|
162
|
+
rock are indistinguishable by any test you can write over bounds and triangle counts — the first
|
|
163
|
+
attempt here used a flatness ratio and threw away four of the fourteen grid tiles, because a tile of
|
|
164
|
+
the volcano is 232 m tall over its 832 and is no less part of the ground for it. Provenance decides
|
|
165
|
+
it instead: Caldera's terrain is authored under `superterrrain/` (its own spelling) and nothing else
|
|
166
|
+
is, so `caldera_extract.py --group terrain=/superterrrain/` tags it at the source and the builder
|
|
167
|
+
acts on the tag.
|
|
168
|
+
|
|
169
|
+
**What is deliberately not merged is everything standing on it.** The `st_*` districts also hold
|
|
170
|
+
38,257 distinct geometries across 417,094 placements — rocks, foliage, scatter — and those are
|
|
171
|
+
heavily instanced: `st_k` alone places 8,051 of its geometries more than once. A geometry placed a
|
|
172
|
+
thousand times is one container and a thousand matrices, which is the cheapest it will ever be;
|
|
173
|
+
baking it out would turn 1,152 triangles into 1.1 million.
|
|
174
|
+
|
|
175
|
+
Two things the merge has to get right, both of them silent when wrong:
|
|
176
|
+
|
|
177
|
+
- **Normals go through the linear part and are renormalized**, not through the whole matrix. The
|
|
178
|
+
inverse transpose is the general answer and is unnecessary for rigid-plus-uniform-scale, which
|
|
179
|
+
every terrain placement here is — and the baker counts and reports any that are not, rather than
|
|
180
|
+
quietly mis-shading them.
|
|
181
|
+
- **A reflected placement has its winding reversed in the indices.** The engine reverses a reflected
|
|
182
|
+
*instance* in the vertex shader off the row's own flag, and a merged asset has no per-piece
|
|
183
|
+
instance left to carry that, so the reversal has to happen at bake time or the piece is inside out
|
|
184
|
+
inside an otherwise correct surface.
|
|
185
|
+
|
|
186
|
+
The merged asset is placed at the identity, has no meshlet blob to fall back to, and so is drawn
|
|
187
|
+
through the virtual path whatever `?vgeo=off` says — that switch moves the *promoted* geometries and
|
|
188
|
+
has nothing to move the ground onto.
|
|
189
|
+
|
|
190
|
+
### What it came to
|
|
191
|
+
|
|
192
|
+
| | |
|
|
193
|
+
|---|---:|
|
|
194
|
+
| source | 728 placements of 452 geometries |
|
|
195
|
+
| triangles | **20,242,704** |
|
|
196
|
+
| vertices | 10,140,561, welded down from 56,888,124 |
|
|
197
|
+
| levels / clusters / pages | 52 / 437,999 / 3,142 |
|
|
198
|
+
| container | **480.3 MiB** |
|
|
199
|
+
| bake / build | 2.2 s / 1,465 s |
|
|
200
|
+
| weld distance | 4.3 cm |
|
|
201
|
+
|
|
202
|
+
**The vertex count is the part worth reading.** 56.9 million corner vertices welded to 10.1 million
|
|
203
|
+
is a 5.6x collapse, and most of it is the tile seams: two tiles that shared an edge shared its
|
|
204
|
+
vertices, and as separate assets each kept its own copy and each DAG stopped dead at the boundary.
|
|
205
|
+
As one asset the seam is interior, and a coarse level simplifies straight through it.
|
|
206
|
+
|
|
207
|
+
The effect on the set is that the ground stops being resident. **452 geometries and 728 rows become
|
|
208
|
+
one container and one row**, the packs fall from 14.35 to **12.02 GiB**, and what is resident of the
|
|
209
|
+
terrain is whatever the cut asked for — 598 pages of 3,142 with the capital in view. `map_capital`
|
|
210
|
+
opens in **12.6 s against 19.5 s** before the merge, for the same picture plus the whole island
|
|
211
|
+
underneath it.
|
|
212
|
+
|
|
213
|
+
52 levels over a 4.3 km asset is deep, and it is what a single DAG over a 3 km surface should look
|
|
214
|
+
like: each level halves, so the root is a few hundred triangles covering two square kilometres.
|
|
215
|
+
That is the thing 452 separate DAGs could not do.
|
|
216
|
+
|
|
217
|
+
## What the panel is saying
|
|
218
|
+
|
|
219
|
+
`__state()` is the whole surface, and the panel shows nothing that is not in it — so a headless
|
|
220
|
+
session and a screenshot can never disagree about what a frame did.
|
|
221
|
+
|
|
222
|
+
**scene** is the conversion's claims. `source triangles` is the distinct geometry that has been
|
|
223
|
+
opened; `instanced triangles` is what those geometries come to once every placement of them is
|
|
224
|
+
counted, and the ratio between the two is how much of this map is reuse. `fetched` is every byte the
|
|
225
|
+
page has pulled — packs, table, placements and container heads together. `open` is wall-clock from
|
|
226
|
+
the first district's first byte to its last row.
|
|
227
|
+
|
|
228
|
+
**frame** is `frame` (the rAF delta, smoothed) against `cpu` (measured around `render` alone). At
|
|
229
|
+
this scale they separate: `cpu` is what the scene costs the main thread and `frame` is what the GPU
|
|
230
|
+
and the compositor add to it.
|
|
231
|
+
|
|
232
|
+
`mesh collection` and `meshlet collection` are the rasterization collections' **limits**, not their
|
|
233
|
+
counts — what they have had to grow to in order to hold what the frame handed them. A collection
|
|
234
|
+
that stops growing while placements keep arriving is one dropping the difference.
|
|
235
|
+
|
|
236
|
+
`dropped` is **virtual geometry's drops only**, because the ordinary meshlet path publishes none.
|
|
237
|
+
A zero there is not a statement that the frame is complete, and the dispatch ceiling below is what
|
|
238
|
+
that gap cost when it was open: every counter on this panel reported a healthy frame while the
|
|
239
|
+
screen was empty. The gap itself is still there — the fix removed the thing that fell into it, not
|
|
240
|
+
the hole.
|
|
241
|
+
|
|
242
|
+
**virtual geometry** is `vgeo_scene`'s panel in miniature. `clusters drawn` is what the cut selected
|
|
243
|
+
this frame; `pages resident` against the tier's capacity is how close the budget is to being what
|
|
244
|
+
selects the cut rather than the threshold; `refused / clamped` going non-zero is that having
|
|
245
|
+
happened.
|
|
246
|
+
|
|
247
|
+
The descent is seeded with one item per visible virtual instance, so `queue_capacity` is sized from
|
|
248
|
+
the set's instance count rather than fixed — 12,147 instances at a 20,000-triangle promotion and
|
|
249
|
+
172,764 at 4,096 are not the same scene for it, and an overflowed frontier is *thrown away* rather
|
|
250
|
+
than refused. `?queue=` overrides, and `dropped` includes `queue_dropped` for exactly that reason.
|
|
251
|
+
|
|
252
|
+
## What the conversion came to
|
|
253
|
+
|
|
254
|
+
| | |
|
|
255
|
+
|---|---:|
|
|
256
|
+
| districts | 45 |
|
|
257
|
+
| placements | 3,790,047 |
|
|
258
|
+
| distinct geometries | **478,006** (of 683,222 by layer — content hashing collapsed 30%) |
|
|
259
|
+
| distinct triangles | 122,483,082 |
|
|
260
|
+
| **instanced triangles** | **2,692,595,763** |
|
|
261
|
+
| placements after the terrain merge | 3,789,319 |
|
|
262
|
+
| meshlet packs | 49 files, **12.02 GiB** |
|
|
263
|
+
| geometry table | 25.5 MiB |
|
|
264
|
+
| `.vgeo` containers | **7,148 promoted (1.80 GiB)** + 1 merged terrain (480.3 MiB) |
|
|
265
|
+
| refused | 0 |
|
|
266
|
+
|
|
267
|
+
**43 minutes of wall clock**: 13.4 for the USD composition, 6.3 for the meshlet and `.vgeo` build
|
|
268
|
+
across 16 threads, and **23.6 for the merged terrain alone** — one 20-million-triangle DAG, on one
|
|
269
|
+
thread, holding 24 GiB while it works. The intermediate between the two steps is 9.20 GiB and is
|
|
270
|
+
deleted afterwards.
|
|
271
|
+
|
|
272
|
+
The instanced-to-distinct ratio is **22:1**, and that is the number the whole design rests on: 2.7
|
|
273
|
+
billion triangles stand on 122 million, because a geometry placed a thousand times is one container
|
|
274
|
+
and a thousand matrices. The largest districts are `map_docks` (535,436 placements, 267.9M instanced
|
|
275
|
+
triangles), `map_capital` (487,464 / 195.9M) and `map_airfield` (363,145 / 163.7M).
|
|
276
|
+
|
|
277
|
+
**7,148 of 478,006** geometries — 1.5% — are past the default 4,096-triangle promotion, and between
|
|
278
|
+
them they carry **68.4M of the 102.3M triangles that are not already in the merged terrain**. That
|
|
279
|
+
ratio is the whole case for the threshold, and it is why the default is 4,096 rather than the 20,000
|
|
280
|
+
this page started with; the measurement is below.
|
|
281
|
+
|
|
282
|
+
## Measured
|
|
283
|
+
|
|
284
|
+
An nvidia/lovelace adapter at 1578×746 in headless Chrome, against `vgeo_serve.js` on the same
|
|
285
|
+
machine — so `fetched` is local disk rather than a network, which is the honest framing for a
|
|
286
|
+
load-time claim and not the same claim over the wire.
|
|
287
|
+
|
|
288
|
+
| scene | placements | geometries | instanced tris | fetched | open | frame / cpu |
|
|
289
|
+
|---|---:|---:|---:|---:|---:|---:|
|
|
290
|
+
| `map_ruins` | 30,250 | 900 | 23.5M | 168 MiB | **0.9 s** | — / 3.9 ms |
|
|
291
|
+
| `map_ruins` + `map_gulags` | 90,400 | 3,385 | 63.1M | 257 MiB | **1.2 s** | — |
|
|
292
|
+
| `st_o` (terrain) | 51,844 | 9,762 | 103.5M | 1.15 GiB | **3.0 s** | 33 / 10.2 ms |
|
|
293
|
+
| 3 districts | 283,016 | 73,608 | 182.2M | 844 MiB | **4.3 s** | 33 / 6.4 ms |
|
|
294
|
+
| `map_capital` | 487,464 | 116,512 | 195.9M | 1.67 GiB | **19.5 s** | 56 / 8.3 ms |
|
|
295
|
+
| `map_capital` + merged terrain | 487,465 | 116,513 | 216.1M | 1.67 GiB | **16.4 s** | 48 / 7.4 ms |
|
|
296
|
+
| the same at a 4,096 promotion | 487,465 | 116,513 | 216.1M | **1.17 GiB** | **13.7 s** | **35** / 7.6 ms |
|
|
297
|
+
| 6 districts at 4,096 | 1,040,000 | 192,283 | 575.8M | **0.91 GiB** | **29.5 s** | **63** / 12.2 ms |
|
|
298
|
+
| 6 districts, capped | **1,040,000** | 192,282 | **555.6M** | 2.15 GiB | **44-54 s** | 83 / 12.9 ms |
|
|
299
|
+
|
|
300
|
+
The 1,040,000-row scene is a round number rather than a district boundary because it was measured
|
|
301
|
+
against the dispatch ceiling below, **before** that was fixed in `962e79183`. Every row here except
|
|
302
|
+
the merged-terrain one predates that fix, so they are a floor rather than a ceiling now; the scenes
|
|
303
|
+
past a million rows want re-measuring.
|
|
304
|
+
|
|
305
|
+
Open times move with the file cache — the same `map_capital` measured 12.6 s once, immediately after
|
|
306
|
+
its own build, against 16.4 s and 21.0 s later. The warm figure is the one quoted, and an A/B is only
|
|
307
|
+
honest if both sides are measured in the same state.
|
|
308
|
+
|
|
309
|
+
The `map_capital` rows are the two dials, in order: the terrain merge put **more** geometry on screen
|
|
310
|
+
(the whole island rather than one district's footprint) for less time, because 452 resident
|
|
311
|
+
geometries became one container that streams; and the 4,096 promotion took another 30% off the bytes
|
|
312
|
+
and a quarter off the frame.
|
|
313
|
+
|
|
314
|
+
**The load-time claim holds, and the conversion is what makes it hold.** `map_capital` is 116,512
|
|
315
|
+
distinct geometries and 14.1 million distinct triangles open in 19.5 seconds — a range request, a
|
|
316
|
+
deserialize and an upload per geometry, and nothing else on the path.
|
|
317
|
+
`meshlet_geometry_build_from_geometry` runs at **3.3 µs a triangle** on this machine, measured, so
|
|
318
|
+
building the same district's meshlets at load would put **47 seconds of unbroken main thread** on
|
|
319
|
+
top of that; the whole set would be **6.7 minutes**. That is the entire reason the packs hold
|
|
320
|
+
`MeshletGeometry` and not triangles.
|
|
321
|
+
|
|
322
|
+
`dropped` is zero throughout: the rasterization collections grew to hold the district (947,512
|
|
323
|
+
meshes and 4,504,447 meshlets for `map_capital`) rather than discarding what would not fit.
|
|
324
|
+
|
|
325
|
+
## What broke, and what it took
|
|
326
|
+
|
|
327
|
+
This is the part the page exists for. Every one of these is an engine limit a production map found
|
|
328
|
+
and no playground before it had.
|
|
329
|
+
|
|
330
|
+
### The picture broke at 2²⁰ mesh rows — fixed, and it was never rows
|
|
331
|
+
|
|
332
|
+
This is the first wall this page hit and the worst one, because nothing reported it. It is fixed:
|
|
333
|
+
`962e79183` and `53deaa9b5`, *"the dispatch that will not fit one dimension is a grid, and the
|
|
334
|
+
engine already flattens those"*.
|
|
335
|
+
|
|
336
|
+
| rows | what is drawn |
|
|
337
|
+
|---:|---|
|
|
338
|
+
| 1,000,000 | correct |
|
|
339
|
+
| 1,040,000 | correct |
|
|
340
|
+
| **1,048,576 = 2²⁰** | |
|
|
341
|
+
| 1,060,000 | **nothing** |
|
|
342
|
+
| 1,100,000 | **nothing** |
|
|
343
|
+
| ~1,564,000 | **garbage** — huge untextured triangles fanning across the frame |
|
|
344
|
+
|
|
345
|
+
Each of those is the same scene loaded to a different `?placements=`, the same camera, the same
|
|
346
|
+
first district in front of it. At 1,040,000 rows it is 555.6M instanced triangles at 81 ms a frame
|
|
347
|
+
and 14.8 ms of CPU. At 1,060,000 it is an empty ocean.
|
|
348
|
+
|
|
349
|
+
**Every counter says the frame is fine.** `dropped` is 0, the collections report 1,060,000 meshes
|
|
350
|
+
and 12,487,826 meshlets, no WebGPU error is raised, nothing is logged, `render` does not throw, and
|
|
351
|
+
the frame time goes *up* rather than down. The garbage at 1.5M is the same failure with the camera
|
|
352
|
+
somewhere the corrupted geometry happens to cover — which says the rasterizer is fetching vertices
|
|
353
|
+
from the wrong place rather than being handed nothing.
|
|
354
|
+
|
|
355
|
+
The panel's own `dropped` row cannot catch this either: it reads the virtual-geometry cut's drop
|
|
356
|
+
counters, and this is the ordinary meshlet path, which publishes none.
|
|
357
|
+
|
|
358
|
+
**The diagnosis this page reached was wrong, and the way it was wrong is the lesson.** The paragraph
|
|
359
|
+
that used to sit here ruled out `maxComputeWorkgroupsPerDimension` on the grounds that 65,535
|
|
360
|
+
workgroups at the engine's group size of 128 comes to 8,388,480 — far past 2²⁰ — and went looking for
|
|
361
|
+
a 20-bit field instead. The arithmetic was right and it was applied to the wrong quantity: **that
|
|
362
|
+
dispatch is over meshlets, not rows.** This scene carries about twelve meshlets per row, so a
|
|
363
|
+
`?placements=` knob that looks like it moves one number moves three, and 2²⁰ rows is simply where
|
|
364
|
+
*this* scene's visible meshlet count crossed the real ceiling. A page with one knob for three
|
|
365
|
+
quantities cannot say which of them broke, and this one confidently said the wrong one.
|
|
366
|
+
|
|
367
|
+
What it actually is: **an indirect dispatch asking for more than 65,535 workgroups does not run at
|
|
368
|
+
all.** Measured against Dawn on nvidia/lovelace — 65,535 workgroups write their elements, 65,536
|
|
369
|
+
write none, with no validation error and nothing logged. Not a short pass; no pass. The collection's
|
|
370
|
+
`count` was advanced by a separate single-thread dispatch either way, so every counter reported a
|
|
371
|
+
complete frame over an element array nothing had written, and the rasterizer drew whatever the
|
|
372
|
+
pooled frame-graph buffer last held — which is exactly the torn geometry at 1.5M.
|
|
373
|
+
|
|
374
|
+
The fix is in `IndirectComputeCommandBuildPass`: a count that will not fit `x` is **folded** into
|
|
375
|
+
`y` and then `z`, and the passes these commands drive flatten the grid back with
|
|
376
|
+
`chunk_grid3d_to_index` — the same flattening the light and decal clusters have always used —
|
|
377
|
+
instead of reading `global_invocation_id.x`, which carries the x dimension alone. One thread per
|
|
378
|
+
element still, nothing dropped, and while `y` and `z` are 1 the index is `global_invocation_id.x`
|
|
379
|
+
term for term, so a scene under the ceiling pays nothing for it. (The first attempt had each pass
|
|
380
|
+
walk its collection with a stride loop instead, off a chunk written for the occasion; a workgroup
|
|
381
|
+
count spread over three dimensions *is* a 3D grid, and the engine could already flatten one.)
|
|
382
|
+
|
|
383
|
+
Folding is opt-in, because it is only correct once the shader on the other side indexes for it: a
|
|
384
|
+
pass left on `global_invocation_id.x` under a folded command would run its first 8,388,480 elements
|
|
385
|
+
once per `y`, which is worse than dropping the rest. The meshlet-scale passes take it and nothing
|
|
386
|
+
else does — a scene is capped at 3,047,424 mesh rows by the `transforms` table, which is 23,808
|
|
387
|
+
workgroups, so the mesh-scale passes cannot reach the ceiling to begin with.
|
|
388
|
+
|
|
389
|
+
The cheap repro that found it is [`../mesh_row_ceiling/`](../mesh_row_ceiling/README.md), which has
|
|
390
|
+
**one knob per quantity** — `?rows=` moves instances and `?segments=` moves meshlets per instance —
|
|
391
|
+
and that separation is what this page could not offer. It also measures `coverage`, the fraction of
|
|
392
|
+
canvas that is not the clear colour, because when every engine counter is lying the pixels are the
|
|
393
|
+
only honest signal.
|
|
394
|
+
|
|
395
|
+
### The BLAS node arena's region ceiling — fixed
|
|
396
|
+
|
|
397
|
+
`GPUGeometryBVHManager` sized its allocator at **32,768 regions**, one per live tree plus the free
|
|
398
|
+
gaps between them, on the stated reasoning that a scene's trees are "one per geometry plus one per
|
|
399
|
+
skinned instance, so this is thousands of instances of headroom". Caldera's `map_capital` has
|
|
400
|
+
116,512 distinct geometries and the whole map 478,006, so loading a *single district* asserted
|
|
401
|
+
partway through:
|
|
402
|
+
|
|
403
|
+
```
|
|
404
|
+
BLAS node arena cannot place 3 nodes in 8177216; 32768 regions is the ceiling and grow() does not raise it
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
Raising it to 1,048,576 is a one-line change and it is what makes anything past a small district
|
|
408
|
+
possible. It costs **28 MiB** of host memory, measured (0.93 MiB at 32,768 against 29.0 MiB at
|
|
409
|
+
1,048,576), paid at construction whether a scene reaches it or not, because the allocator's node
|
|
410
|
+
table is eager. The constant carries that reasoning now; a host that wants the 28 MiB back can put
|
|
411
|
+
the old figure back and lose nothing but this map.
|
|
412
|
+
|
|
413
|
+
That the failure was an assertion rather than a silent wrong picture is the system working.
|
|
414
|
+
|
|
415
|
+
### The whole map runs out of VRAM — open, and the limit is residency
|
|
416
|
+
|
|
417
|
+
All forty-five districts at once do not fit on a 24 GB card. Two runs, two ways of finding out:
|
|
418
|
+
|
|
419
|
+
- the first reached **3,718,083 of 3,790,047 placements and 475,450 of 478,006 geometries** — 98% —
|
|
420
|
+
and then stopped answering: the main thread stopped returning to the point where CDP's
|
|
421
|
+
`Runtime.evaluate` no longer completed, while the GPU process held six cores busy for twenty
|
|
422
|
+
minutes;
|
|
423
|
+
- the second said it outright, out of `render`, at 2,232,791 placements and 372,745 geometries:
|
|
424
|
+
**`Failed to allocate GPU memory for meshlet batch`**.
|
|
425
|
+
|
|
426
|
+
Where it stops varies, which is what you would expect of a card that is also running a desktop. That
|
|
427
|
+
it *says so* on the second path is the engine behaving well; the first path is the same wall reached
|
|
428
|
+
through thrash rather than through a refused allocation, and there is nothing to report it.
|
|
429
|
+
|
|
430
|
+
**It is cumulative, not a bad district.** `st_o` — the district the first run was inside when it
|
|
431
|
+
stopped — opens **on its own in 3.0 seconds**: 9,762 geometries, 11.3M distinct triangles, 103.5M
|
|
432
|
+
instanced, 1.15 GiB fetched. The same bytes, the same geometry, a fifth of a minute. What is
|
|
433
|
+
different by the time the whole map reaches it is everything already resident.
|
|
434
|
+
|
|
435
|
+
And residency is the whole of it. The packs are 14.35 GiB, roughly half of that is BLAS, and every
|
|
436
|
+
byte is uploaded per geometry and then **kept forever** — nothing in this path evicts, because
|
|
437
|
+
nothing in it was ever meant to hold a scene that did not fit. The host pays a second copy besides:
|
|
438
|
+
the page holds the deserialized `MeshletGeometry` for every geometry, and Chrome was holding about
|
|
439
|
+
16 GiB across its processes when the first run was killed.
|
|
440
|
+
|
|
441
|
+
So the honest statement of *this* limit is: **the map ran out of VRAM at somewhere between 2.2 and
|
|
442
|
+
3.7 million rows on a 24 GB card**, measured before the terrain merge and at the old 20,000-triangle
|
|
443
|
+
promotion. Both of those have since moved a lot of geometry off the resident path — the ground
|
|
444
|
+
entirely, and two thirds of what is left — so the wall wants re-measuring and it is further out than
|
|
445
|
+
these numbers say. The way past it was never a bigger buffer. It
|
|
446
|
+
is eviction, and the
|
|
447
|
+
engine already has exactly one thing that does it: virtual geometry, whose two residency tiers exist
|
|
448
|
+
to make the drawn set a function of the view rather than of the scene.
|
|
449
|
+
|
|
450
|
+
`--vgeo-min-triangles` is the dial, and it has been turned. The reason it wants to sit so far from
|
|
451
|
+
where this page started is that the distinct triangles are not where the distinct geometries are —
|
|
452
|
+
counted after the terrain merge, over the 102.3M triangles that are not already inside it:
|
|
453
|
+
|
|
454
|
+
| threshold | containers | instances | share of the unmerged triangles |
|
|
455
|
+
|---:|---:|---:|---:|
|
|
456
|
+
| 20,000 | 213 | 12,147 | 6.0% |
|
|
457
|
+
| 8,192 | 4,091 | 51,236 | 49.8% |
|
|
458
|
+
| **4,096** *(default)* | **7,148** | **172,764** | **66.9%** |
|
|
459
|
+
| 2,048 | 10,206 | 314,965 | 74.9% |
|
|
460
|
+
|
|
461
|
+
1.5% of the geometries carry two thirds of the triangles. Built both ways and measured on the same
|
|
462
|
+
scenes, same camera, same page:
|
|
463
|
+
|
|
464
|
+
| | thr 20,000 | thr 4,096 |
|
|
465
|
+
|---|---:|---:|
|
|
466
|
+
| **`map_capital`** — fetched | 1,707 MiB | **1,198 MiB** |
|
|
467
|
+
| open (warm) | 16.4 s | **13.7 s** |
|
|
468
|
+
| frame / cpu | 48.3 / 7.4 ms | **34.5** / 7.6 ms |
|
|
469
|
+
| clusters drawn | 11,894 | **21,078** |
|
|
470
|
+
| pages resident | 598 | 1,142 |
|
|
471
|
+
| **1,040,000 rows** — fetched | 2.15 GiB | **0.91 GiB** |
|
|
472
|
+
| open | 38.7 s | **29.5 s** |
|
|
473
|
+
| frame / cpu | 87.8 / 11.5 ms | **62.6** / 12.2 ms |
|
|
474
|
+
| clusters drawn | 12,579 | **33,779** |
|
|
475
|
+
| pages resident | 864 | 2,083 |
|
|
476
|
+
| dropped / refused | 0 / 0 | 0 / 0 |
|
|
477
|
+
|
|
478
|
+
**58% fewer bytes, 29% faster frames, and 2.7x the clusters on screen** — more detail for less of
|
|
479
|
+
everything, which is what moving geometry from "fetch and upload the whole thing" to "fetch a head
|
|
480
|
+
and then whatever a threshold in pixels asks for" is supposed to buy. It costs 1.80 GiB of
|
|
481
|
+
containers on disk and about half an hour of build.
|
|
482
|
+
|
|
483
|
+
Lower is not obviously better, and this is where to stop rather than where to keep going: 2,048
|
|
484
|
+
promotes half as many again for eight more percent of the triangles, and every promotion is one more
|
|
485
|
+
container to open, one more geometry row in the virtual table, and more instances seeding the cut.
|
|
486
|
+
172,764 instances at 4,096 is already fourteen times what 20,000 gave, which is why the page now
|
|
487
|
+
sizes `queue_capacity` from the instance count rather than from a constant — see below.
|
|
488
|
+
|
|
489
|
+
The page stops loading when a frame throws, keeps what it drew, and says where it got to. It did not
|
|
490
|
+
before: the loader ran on for another twenty minutes behind a dead renderer, fetching geometry for a
|
|
491
|
+
frame that would never come and burying the one message that explained what had happened.
|
|
492
|
+
|
|
493
|
+
### Every geometry carries a BLAS, whether or not anything traces a ray
|
|
494
|
+
|
|
495
|
+
Half the set's bytes are an acceleration structure for rays this page never casts, and there is no
|
|
496
|
+
way for a scene that only rasterizes to decline it — `MeshletGeometrySerializationAdapter` rebuilds
|
|
497
|
+
one when it is absent rather than leaving it out. Over 478,006 geometries that is ~7 GiB of disk,
|
|
498
|
+
~7 GiB of VRAM and a large share of what a district spends opening.
|
|
499
|
+
|
|
500
|
+
### A single geometry's deserialize is one long task
|
|
501
|
+
|
|
502
|
+
The terrain tiles run to 2,087,424 triangles, and one of those is a ~250 MiB blob whose deserialize
|
|
503
|
+
cannot be interrupted. The page's loop is time-budgeted around it (`DESERIALIZE_BUDGET_MS`), which
|
|
504
|
+
keeps the scene responsive *between* geometries and can do nothing about one of them — the engine has
|
|
505
|
+
no incremental or worker-side path from bytes to a `MeshletGeometry`, and `meshlet_geometry_transfer`
|
|
506
|
+
exists precisely because someone wanted one.
|
|
507
|
+
|
|
508
|
+
## The headless recipe
|
|
509
|
+
|
|
510
|
+
`vgeo_runtime`'s, unchanged, and the first bullet of it is the one that costs an hour:
|
|
511
|
+
**`--enable-unsafe-webgpu` and nothing else.** `--enable-features=Vulkan`, `--use-angle=vulkan` and
|
|
512
|
+
`--disable-gpu-sandbox` all appear in the recipes people write down for headless WebGPU, and every
|
|
513
|
+
one of them makes `requestAdapter()` return nothing on this machine — which the page then reports as
|
|
514
|
+
"the browser supports WebGPU but would not provide a GPU to run on", a message that sounds like a
|
|
515
|
+
driver problem and is a flag problem. Open the page as Chrome's startup URL rather than with
|
|
516
|
+
`Page.navigate`, pick the CDP target by URL, and poll for `__state` rather than trusting `load`.
|
|
517
|
+
|
|
518
|
+
`__state()`, `__look(eye, target)` and `__opened` are what a session drives it with.
|
|
519
|
+
|
|
520
|
+
## What it does not do
|
|
521
|
+
|
|
522
|
+
- **No materials, and that is the source.** Caldera ships without textures or materials — its own
|
|
523
|
+
README says so, and says the set is about the relationships between spatial elements rather than
|
|
524
|
+
about how they look. One material over the whole map is the honest representation of that.
|
|
525
|
+
- **Nothing animates, and nothing simulates.** Every placement is static. Skinned prims in the
|
|
526
|
+
source are converted at their authored pose.
|
|
527
|
+
- **`guide` purpose is dropped at conversion.** Those are the scene annotations — the grey boxes
|
|
528
|
+
USDView opens on — and they are not part of the map. `render` purpose is kept: that is the
|
|
529
|
+
clutter, the grass and the small scattered things, and it is most of what makes this heavy.
|