@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,35 @@
|
|
|
1
|
+
import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Subtract one attribute quadric from another, elementwise — the inverse of
|
|
5
|
+
* {@link quadric_attribute_add}.
|
|
6
|
+
*
|
|
7
|
+
* What it is for is the same thing {@link quadric3_sub} is for: recovering what a pass *added* to a
|
|
8
|
+
* quadric, when two passes started from the same one. Two group steps sharing a pinned boundary
|
|
9
|
+
* vertex each begin from that vertex's quadric and each fold their own victims onto it, so the two
|
|
10
|
+
* results overlap by exactly the quadric they both began with; adding them whole would count the
|
|
11
|
+
* source under that vertex twice.
|
|
12
|
+
*
|
|
13
|
+
* The difference of two quadrics is not itself a sum of anything, and its weight can come out
|
|
14
|
+
* negative. Nothing here objects — a gain is meant to be added back to the quadric it was measured
|
|
15
|
+
* against, not evaluated on its own.
|
|
16
|
+
*
|
|
17
|
+
* @param {number[]|Float32Array|Float64Array} out `quadric_attribute_size(components)` elements from
|
|
18
|
+
* `out_offset`; may alias either input
|
|
19
|
+
* @param {number} out_offset
|
|
20
|
+
* @param {ArrayLike<number>} a
|
|
21
|
+
* @param {number} a_offset
|
|
22
|
+
* @param {ArrayLike<number>} b subtracted from `a`
|
|
23
|
+
* @param {number} b_offset
|
|
24
|
+
* @param {number} components number of scalar channels
|
|
25
|
+
*
|
|
26
|
+
* @author Alex Goldring
|
|
27
|
+
* @copyright Company Named Limited (c) 2026
|
|
28
|
+
*/
|
|
29
|
+
export function quadric_attribute_sub(out, out_offset, a, a_offset, b, b_offset, components) {
|
|
30
|
+
const size = QUADRIC3_SIZE + components * 4;
|
|
31
|
+
|
|
32
|
+
for (let i = 0; i < size; i++) {
|
|
33
|
+
out[out_offset + i] = a[a_offset + i] - b[b_offset + i];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -107,6 +107,21 @@ export class BinaryDataBlock {
|
|
|
107
107
|
* @param {number} source_id element id in `source`
|
|
108
108
|
*/
|
|
109
109
|
copy_record(id: number, source: BinaryDataBlock, source_id: number): void;
|
|
110
|
+
/**
|
|
111
|
+
* Do two records hold the same bytes?
|
|
112
|
+
*
|
|
113
|
+
* Bytes, not values, and that is the point: this is the test a *wedge* is defined by — a set of
|
|
114
|
+
* corners at one vertex that shade identically — and identity has to be exact for the grouping
|
|
115
|
+
* to be an equivalence relation. A tolerance is not transitive, so grouping by one would depend
|
|
116
|
+
* on the order the corners were visited in, and two runs over the same mesh could disagree.
|
|
117
|
+
*
|
|
118
|
+
* Every byte of the record, so a block gaining a layer needs nothing here.
|
|
119
|
+
*
|
|
120
|
+
* @param {number} a element id in this block
|
|
121
|
+
* @param {number} b element id in this block
|
|
122
|
+
* @returns {boolean}
|
|
123
|
+
*/
|
|
124
|
+
record_equal(a: number, b: number): boolean;
|
|
110
125
|
/**
|
|
111
126
|
* Take on another block's layers and contents.
|
|
112
127
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BinaryDataBlock.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAwCI;;OAEG;IACH,kBAFW,iBAAiB,EAM3B;IAED;;;OAGG;IACH,0BAEC;IAED;;;OAGG;IACH,gCAEC;IAED;;;OAGG;IACH,uBAEC;IAED;;OAEG;IACH,uBAEC;IAED;;OAEG;IACH,0BAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH,gBAJW,cAAc,cACd,MAAM,GACJ,eAAe,CAa3B;IAED;;;OAGG;IACH,0BAFW,MAAM,QAUhB;IAED;;;OAGG;IACH,sBAEC;IAED;;OAEG;IACH,aAQC;IAED;;;;;;;;OAQG;IACH,QAHW,MAAM,KACN,MAAM,QAiBhB;IAED;;;;;;;;;;;;;;OAcG;IACH,gBAJW,MAAM,UACN,eAAe,aACf,MAAM,QAchB;IAED;;;;;;;;OAQG;IACH,YAFW,eAAe,QAyBzB;IA8CL;;;;OAIG;IACH,4BAFU,OAAO,CAE0B;;CAP1C;
|
|
1
|
+
{"version":3,"file":"BinaryDataBlock.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAwCI;;OAEG;IACH,kBAFW,iBAAiB,EAM3B;IAED;;;OAGG;IACH,0BAEC;IAED;;;OAGG;IACH,gCAEC;IAED;;;OAGG;IACH,uBAEC;IAED;;OAEG;IACH,uBAEC;IAED;;OAEG;IACH,0BAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH,gBAJW,cAAc,cACd,MAAM,GACJ,eAAe,CAa3B;IAED;;;OAGG;IACH,0BAFW,MAAM,QAUhB;IAED;;;OAGG;IACH,sBAEC;IAED;;OAEG;IACH,aAQC;IAED;;;;;;;;OAQG;IACH,QAHW,MAAM,KACN,MAAM,QAiBhB;IAED;;;;;;;;;;;;;;OAcG;IACH,gBAJW,MAAM,UACN,eAAe,aACf,MAAM,QAchB;IAED;;;;;;;;;;;;;OAaG;IACH,gBAJW,MAAM,KACN,MAAM,GACJ,OAAO,CAqBnB;IAED;;;;;;;;OAQG;IACH,YAFW,eAAe,QAyBzB;IA8CL;;;;OAIG;IACH,4BAFU,OAAO,CAE0B;;CAP1C;6BArVY,OAAO,8CAA8C,EAAE,cAAc;gCACrE,OAAO,wBAAwB,EAAE,iBAAiB;gCAJ/B,sBAAsB"}
|
|
@@ -233,6 +233,41 @@ export class BinaryDataBlock {
|
|
|
233
233
|
);
|
|
234
234
|
}
|
|
235
235
|
|
|
236
|
+
/**
|
|
237
|
+
* Do two records hold the same bytes?
|
|
238
|
+
*
|
|
239
|
+
* Bytes, not values, and that is the point: this is the test a *wedge* is defined by — a set of
|
|
240
|
+
* corners at one vertex that shade identically — and identity has to be exact for the grouping
|
|
241
|
+
* to be an equivalence relation. A tolerance is not transitive, so grouping by one would depend
|
|
242
|
+
* on the order the corners were visited in, and two runs over the same mesh could disagree.
|
|
243
|
+
*
|
|
244
|
+
* Every byte of the record, so a block gaining a layer needs nothing here.
|
|
245
|
+
*
|
|
246
|
+
* @param {number} a element id in this block
|
|
247
|
+
* @param {number} b element id in this block
|
|
248
|
+
* @returns {boolean}
|
|
249
|
+
*/
|
|
250
|
+
record_equal(a, b) {
|
|
251
|
+
if (a === b) {
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const record_size = this.#record_size;
|
|
256
|
+
|
|
257
|
+
const from_a = a * record_size;
|
|
258
|
+
const from_b = b * record_size;
|
|
259
|
+
|
|
260
|
+
const data = this.#data_uint8;
|
|
261
|
+
|
|
262
|
+
for (let offset = 0; offset < record_size; offset++) {
|
|
263
|
+
if (data[from_a + offset] !== data[from_b + offset]) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
|
|
236
271
|
/**
|
|
237
272
|
* Take on another block's layers and contents.
|
|
238
273
|
*
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which corners of a mesh shade as one.
|
|
3
|
+
*
|
|
4
|
+
* A **wedge** is a set of loops at one vertex that carry the same appearance. A vertex has one
|
|
5
|
+
* position and the topology says so; it does not have one *appearance*, and a hard edge or a texture
|
|
6
|
+
* seam is exactly a vertex whose corners disagree. This is the structure that lets them.
|
|
7
|
+
*
|
|
8
|
+
* Three things, and the split between them is the whole design:
|
|
9
|
+
*
|
|
10
|
+
* - **{@link of_loop} is never written after construction.** A collapse re-points a victim's loops
|
|
11
|
+
* onto the survivor and leaves the loops themselves alone, so a corner's wedge id travels with it
|
|
12
|
+
* for free. Nothing has to find a corner in order to move it.
|
|
13
|
+
* - **{@link parent} is a union-find**, and merging two wedges is a union. That is what makes the
|
|
14
|
+
* previous point affordable: the ids a loop holds go stale, {@link find} resolves them, and no
|
|
15
|
+
* pass over the loop pool is ever needed to keep them true.
|
|
16
|
+
* - **{@link first_of_vertex} and {@link next_of_wedge} are one intrusive list per vertex**, which
|
|
17
|
+
* is what a collapse iterates. Two typed arrays rather than an array of arrays per vertex: a
|
|
18
|
+
* frontier holds every vertex of a level, and on smooth geometry every one of those lists has
|
|
19
|
+
* exactly one entry.
|
|
20
|
+
*
|
|
21
|
+
* Wedge ids need not be dense and need not agree with vertex ids. {@link bt_wedges_per_vertex}
|
|
22
|
+
* builds the degenerate set where they are vertex ids — one wedge per vertex, which is a mesh with
|
|
23
|
+
* no seams and is what every caller that does not care about appearance wants.
|
|
24
|
+
*
|
|
25
|
+
* @author Alex Goldring
|
|
26
|
+
* @copyright Company Named Limited (c) 2026
|
|
27
|
+
*/
|
|
28
|
+
export class BtWedgeSet {
|
|
29
|
+
/**
|
|
30
|
+
* The wedge each loop belongs to, indexed by loop id. Read through {@link find}, never trusted
|
|
31
|
+
* raw: a merge leaves it naming a wedge that is no longer a root.
|
|
32
|
+
* @type {Uint32Array}
|
|
33
|
+
*/
|
|
34
|
+
of_loop: Uint32Array;
|
|
35
|
+
/**
|
|
36
|
+
* Union-find over wedge ids. A root is its own parent.
|
|
37
|
+
* @type {Uint32Array}
|
|
38
|
+
*/
|
|
39
|
+
parent: Uint32Array;
|
|
40
|
+
/**
|
|
41
|
+
* Head of each vertex's wedge list, or `NULL_POINTER` for a vertex with no corners.
|
|
42
|
+
* @type {Uint32Array}
|
|
43
|
+
*/
|
|
44
|
+
first_of_vertex: Uint32Array;
|
|
45
|
+
/**
|
|
46
|
+
* Next wedge at the same vertex, or `NULL_POINTER`.
|
|
47
|
+
* @type {Uint32Array}
|
|
48
|
+
*/
|
|
49
|
+
next_of_wedge: Uint32Array;
|
|
50
|
+
/**
|
|
51
|
+
* How many wedge ids exist, live and merged-away together.
|
|
52
|
+
* @type {number}
|
|
53
|
+
*/
|
|
54
|
+
count: number;
|
|
55
|
+
/**
|
|
56
|
+
* The root of the wedge `wedge` has been merged into, or itself.
|
|
57
|
+
*
|
|
58
|
+
* Path-halving rather than full compression: it is one write per step instead of a second walk,
|
|
59
|
+
* and it gives the same near-constant amortized bound. This runs once per corner of every
|
|
60
|
+
* candidate the heap scores, which is several times per edge per round.
|
|
61
|
+
*
|
|
62
|
+
* @param {number} wedge
|
|
63
|
+
* @returns {number}
|
|
64
|
+
*/
|
|
65
|
+
find(wedge: number): number;
|
|
66
|
+
/**
|
|
67
|
+
* Make `other` part of `wedge`.
|
|
68
|
+
*
|
|
69
|
+
* Directed on purpose, where a union-find would normally pick the taller tree: the caller is
|
|
70
|
+
* merging a victim's wedge into a survivor's, and which id survives decides which vertex's list
|
|
71
|
+
* the result is on. Correctness beats the tree height, and the depth this trades away is what
|
|
72
|
+
* {@link find}'s path halving pays back.
|
|
73
|
+
*
|
|
74
|
+
* @param {number} wedge the root that survives
|
|
75
|
+
* @param {number} other the root that does not
|
|
76
|
+
* @returns {boolean} `false` when they were already one wedge and nothing was done
|
|
77
|
+
*/
|
|
78
|
+
merge(wedge: number, other: number): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Put `wedge` at the head of `vertex`'s list. It must be a root and must not be on any list.
|
|
81
|
+
*
|
|
82
|
+
* @param {number} wedge
|
|
83
|
+
* @param {number} vertex
|
|
84
|
+
*/
|
|
85
|
+
attach(wedge: number, vertex: number): void;
|
|
86
|
+
/**
|
|
87
|
+
* Drop every wedge `vertex` holds, without touching the wedges themselves.
|
|
88
|
+
*
|
|
89
|
+
* @param {number} vertex
|
|
90
|
+
*/
|
|
91
|
+
detach_all(vertex: number): void;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=BtWedgeSet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BtWedgeSet.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/geom/3d/topology/struct/binary/BtWedgeSet.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;IACI;;;;OAIG;IACH,SAFU,WAAW,CAEQ;IAE7B;;;OAGG;IACH,QAFU,WAAW,CAEO;IAE5B;;;OAGG;IACH,iBAFU,WAAW,CAEgB;IAErC;;;OAGG;IACH,eAFU,WAAW,CAEc;IAEnC;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;;;;OASG;IACH,YAHW,MAAM,GACJ,MAAM,CAclB;IAED;;;;;;;;;;;OAWG;IACH,aAJW,MAAM,SACN,MAAM,GACJ,OAAO,CAUnB;IAED;;;;;OAKG;IACH,cAHW,MAAM,UACN,MAAM,QAMhB;IAED;;;;OAIG;IACH,mBAFW,MAAM,QAIhB;CACJ"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { NULL_POINTER } from "./BinaryTopology.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Which corners of a mesh shade as one.
|
|
5
|
+
*
|
|
6
|
+
* A **wedge** is a set of loops at one vertex that carry the same appearance. A vertex has one
|
|
7
|
+
* position and the topology says so; it does not have one *appearance*, and a hard edge or a texture
|
|
8
|
+
* seam is exactly a vertex whose corners disagree. This is the structure that lets them.
|
|
9
|
+
*
|
|
10
|
+
* Three things, and the split between them is the whole design:
|
|
11
|
+
*
|
|
12
|
+
* - **{@link of_loop} is never written after construction.** A collapse re-points a victim's loops
|
|
13
|
+
* onto the survivor and leaves the loops themselves alone, so a corner's wedge id travels with it
|
|
14
|
+
* for free. Nothing has to find a corner in order to move it.
|
|
15
|
+
* - **{@link parent} is a union-find**, and merging two wedges is a union. That is what makes the
|
|
16
|
+
* previous point affordable: the ids a loop holds go stale, {@link find} resolves them, and no
|
|
17
|
+
* pass over the loop pool is ever needed to keep them true.
|
|
18
|
+
* - **{@link first_of_vertex} and {@link next_of_wedge} are one intrusive list per vertex**, which
|
|
19
|
+
* is what a collapse iterates. Two typed arrays rather than an array of arrays per vertex: a
|
|
20
|
+
* frontier holds every vertex of a level, and on smooth geometry every one of those lists has
|
|
21
|
+
* exactly one entry.
|
|
22
|
+
*
|
|
23
|
+
* Wedge ids need not be dense and need not agree with vertex ids. {@link bt_wedges_per_vertex}
|
|
24
|
+
* builds the degenerate set where they are vertex ids — one wedge per vertex, which is a mesh with
|
|
25
|
+
* no seams and is what every caller that does not care about appearance wants.
|
|
26
|
+
*
|
|
27
|
+
* @author Alex Goldring
|
|
28
|
+
* @copyright Company Named Limited (c) 2026
|
|
29
|
+
*/
|
|
30
|
+
export class BtWedgeSet {
|
|
31
|
+
/**
|
|
32
|
+
* The wedge each loop belongs to, indexed by loop id. Read through {@link find}, never trusted
|
|
33
|
+
* raw: a merge leaves it naming a wedge that is no longer a root.
|
|
34
|
+
* @type {Uint32Array}
|
|
35
|
+
*/
|
|
36
|
+
of_loop = new Uint32Array(0);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Union-find over wedge ids. A root is its own parent.
|
|
40
|
+
* @type {Uint32Array}
|
|
41
|
+
*/
|
|
42
|
+
parent = new Uint32Array(0);
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Head of each vertex's wedge list, or `NULL_POINTER` for a vertex with no corners.
|
|
46
|
+
* @type {Uint32Array}
|
|
47
|
+
*/
|
|
48
|
+
first_of_vertex = new Uint32Array(0);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Next wedge at the same vertex, or `NULL_POINTER`.
|
|
52
|
+
* @type {Uint32Array}
|
|
53
|
+
*/
|
|
54
|
+
next_of_wedge = new Uint32Array(0);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* How many wedge ids exist, live and merged-away together.
|
|
58
|
+
* @type {number}
|
|
59
|
+
*/
|
|
60
|
+
count = 0;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The root of the wedge `wedge` has been merged into, or itself.
|
|
64
|
+
*
|
|
65
|
+
* Path-halving rather than full compression: it is one write per step instead of a second walk,
|
|
66
|
+
* and it gives the same near-constant amortized bound. This runs once per corner of every
|
|
67
|
+
* candidate the heap scores, which is several times per edge per round.
|
|
68
|
+
*
|
|
69
|
+
* @param {number} wedge
|
|
70
|
+
* @returns {number}
|
|
71
|
+
*/
|
|
72
|
+
find(wedge) {
|
|
73
|
+
const parent = this.parent;
|
|
74
|
+
|
|
75
|
+
let root = wedge;
|
|
76
|
+
|
|
77
|
+
while (parent[root] !== root) {
|
|
78
|
+
parent[root] = parent[parent[root]];
|
|
79
|
+
|
|
80
|
+
root = parent[root];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return root;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Make `other` part of `wedge`.
|
|
88
|
+
*
|
|
89
|
+
* Directed on purpose, where a union-find would normally pick the taller tree: the caller is
|
|
90
|
+
* merging a victim's wedge into a survivor's, and which id survives decides which vertex's list
|
|
91
|
+
* the result is on. Correctness beats the tree height, and the depth this trades away is what
|
|
92
|
+
* {@link find}'s path halving pays back.
|
|
93
|
+
*
|
|
94
|
+
* @param {number} wedge the root that survives
|
|
95
|
+
* @param {number} other the root that does not
|
|
96
|
+
* @returns {boolean} `false` when they were already one wedge and nothing was done
|
|
97
|
+
*/
|
|
98
|
+
merge(wedge, other) {
|
|
99
|
+
if (wedge === other) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.parent[other] = wedge;
|
|
104
|
+
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Put `wedge` at the head of `vertex`'s list. It must be a root and must not be on any list.
|
|
110
|
+
*
|
|
111
|
+
* @param {number} wedge
|
|
112
|
+
* @param {number} vertex
|
|
113
|
+
*/
|
|
114
|
+
attach(wedge, vertex) {
|
|
115
|
+
this.next_of_wedge[wedge] = this.first_of_vertex[vertex];
|
|
116
|
+
|
|
117
|
+
this.first_of_vertex[vertex] = wedge;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Drop every wedge `vertex` holds, without touching the wedges themselves.
|
|
122
|
+
*
|
|
123
|
+
* @param {number} vertex
|
|
124
|
+
*/
|
|
125
|
+
detach_all(vertex) {
|
|
126
|
+
this.first_of_vertex[vertex] = NULL_POINTER;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -5,6 +5,26 @@
|
|
|
5
5
|
* vertices; the corresponding quadric is then accumulated onto each of those
|
|
6
6
|
* three vertices' Quadric3. Non-triangular faces are skipped.
|
|
7
7
|
*
|
|
8
|
+
* **Each plane weighs the surface standing behind it, not one.** What a vertex reports is the mean
|
|
9
|
+
* over its planes ({@link Quadric3#distance}), and a mean over a count is a statement about how the
|
|
10
|
+
* surface was *cut* rather than about the surface: cutting one face in two along its own plane adds
|
|
11
|
+
* no surface and the metric hears the same plane twice, so a finely tessellated patch outvotes a
|
|
12
|
+
* coarse one many times its size. Weighing each plane by its triangle's area is what makes the mean
|
|
13
|
+
* an average over the surface, and it is what makes an in-plane subdivision — which says nothing new
|
|
14
|
+
* — change nothing.
|
|
15
|
+
*
|
|
16
|
+
* The weights are **areas as a multiple of this mesh's own mean triangle**, not areas. A ratio is
|
|
17
|
+
* what every other number here is stated against: {@link BOUNDARY_WEIGHT} is three *faces*, and the
|
|
18
|
+
* attribute quadric a virtual-geometry build sums with these weighs one per triangle and says so
|
|
19
|
+
* ({@link quadric_attribute_set_from_triangle}) — both of which are answers to "how much is a face
|
|
20
|
+
* worth", and neither survives the slot becoming square metres. It costs nothing that matters: a
|
|
21
|
+
* mean divides the weights out again, so what a vertex reports is identical either way, and
|
|
22
|
+
* {@link quadric3_optimize} is scale-invariant, so placement is too.
|
|
23
|
+
*
|
|
24
|
+
* A triangle with no area is skipped entirely rather than weighed at zero. It has no plane —
|
|
25
|
+
* {@link tri3_compute_normal} hands it an arbitrary direction — so it neither contributes one nor
|
|
26
|
+
* counts towards the mean it would otherwise drag down.
|
|
27
|
+
*
|
|
8
28
|
* @param {BinaryTopology} mesh
|
|
9
29
|
* @returns {Quadric3[]} Array indexed by vertex ID. Entries for unallocated
|
|
10
30
|
* vertex slots are `undefined`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bt_mesh_compute_vertex_quadrics.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bt_mesh_compute_vertex_quadrics.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js"],"names":[],"mappings":"AAmCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,uEAHa,QAAQ,EAAE,CAgHtB;yBA1KwB,iCAAiC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { quadric3_set_from_plane_through_point } from "../../../../quadric/quadric3_set_from_plane_through_point.js";
|
|
2
2
|
import { assert } from "../../../../../../assert.js";
|
|
3
3
|
import { v3_dot } from "../../../../../vec3/v3_dot.js";
|
|
4
|
+
import { tri3_area } from "../../../../triangle/tri3_area.js";
|
|
4
5
|
import { tri3_compute_normal } from "../../../../triangle/tri3_compute_normal.js";
|
|
5
6
|
import { Quadric3 } from "../../../../quadric/Quadric3.js";
|
|
6
7
|
import { NULL_POINTER } from "../BinaryTopology.js";
|
|
@@ -12,7 +13,7 @@ const scratch_normal = new Float32Array(3);
|
|
|
12
13
|
const boundary_quadric = new Quadric3();
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
|
-
* How much a boundary constraint plane weighs against one face plane
|
|
16
|
+
* How much a boundary constraint plane weighs against one face plane **of the same area**.
|
|
16
17
|
*
|
|
17
18
|
* Three, measured. A face-plane quadric alone says nothing about a vertex sliding *within* the
|
|
18
19
|
* surface, which is exactly what an open edge does when it erodes, so without this term a boundary
|
|
@@ -22,6 +23,11 @@ const boundary_quadric = new Quadric3();
|
|
|
22
23
|
* roughly the displacement itself, while leaving the boundary free enough to erode at all — which
|
|
23
24
|
* it must, or a mesh made of open shells has no coarse form and no root.
|
|
24
25
|
*
|
|
26
|
+
* It is a ratio against a face, so it is applied on top of the face's own area weight rather than
|
|
27
|
+
* instead of it. Three flat is a number of square metres, which is not a ratio at all: the same
|
|
28
|
+
* border would weigh a millionth of its fan on a model authored in millimetres and a million times
|
|
29
|
+
* it on one authored in kilometres, and the measurement above would hold for neither.
|
|
30
|
+
*
|
|
25
31
|
* @readonly
|
|
26
32
|
* @type {number}
|
|
27
33
|
*/
|
|
@@ -34,6 +40,26 @@ const BOUNDARY_WEIGHT = 3;
|
|
|
34
40
|
* vertices; the corresponding quadric is then accumulated onto each of those
|
|
35
41
|
* three vertices' Quadric3. Non-triangular faces are skipped.
|
|
36
42
|
*
|
|
43
|
+
* **Each plane weighs the surface standing behind it, not one.** What a vertex reports is the mean
|
|
44
|
+
* over its planes ({@link Quadric3#distance}), and a mean over a count is a statement about how the
|
|
45
|
+
* surface was *cut* rather than about the surface: cutting one face in two along its own plane adds
|
|
46
|
+
* no surface and the metric hears the same plane twice, so a finely tessellated patch outvotes a
|
|
47
|
+
* coarse one many times its size. Weighing each plane by its triangle's area is what makes the mean
|
|
48
|
+
* an average over the surface, and it is what makes an in-plane subdivision — which says nothing new
|
|
49
|
+
* — change nothing.
|
|
50
|
+
*
|
|
51
|
+
* The weights are **areas as a multiple of this mesh's own mean triangle**, not areas. A ratio is
|
|
52
|
+
* what every other number here is stated against: {@link BOUNDARY_WEIGHT} is three *faces*, and the
|
|
53
|
+
* attribute quadric a virtual-geometry build sums with these weighs one per triangle and says so
|
|
54
|
+
* ({@link quadric_attribute_set_from_triangle}) — both of which are answers to "how much is a face
|
|
55
|
+
* worth", and neither survives the slot becoming square metres. It costs nothing that matters: a
|
|
56
|
+
* mean divides the weights out again, so what a vertex reports is identical either way, and
|
|
57
|
+
* {@link quadric3_optimize} is scale-invariant, so placement is too.
|
|
58
|
+
*
|
|
59
|
+
* A triangle with no area is skipped entirely rather than weighed at zero. It has no plane —
|
|
60
|
+
* {@link tri3_compute_normal} hands it an arbitrary direction — so it neither contributes one nor
|
|
61
|
+
* counts towards the mean it would otherwise drag down.
|
|
62
|
+
*
|
|
37
63
|
* @param {BinaryTopology} mesh
|
|
38
64
|
* @returns {Quadric3[]} Array indexed by vertex ID. Entries for unallocated
|
|
39
65
|
* vertex slots are `undefined`.
|
|
@@ -58,6 +84,11 @@ export function bt_mesh_compute_vertex_quadrics(mesh) {
|
|
|
58
84
|
|
|
59
85
|
const q = new Quadric3();
|
|
60
86
|
|
|
87
|
+
// The mesh's own scale, for the normalization below. Accumulated as the faces go by rather than
|
|
88
|
+
// swept for beforehand, since the loop below already has every area it needs.
|
|
89
|
+
let total_area = 0;
|
|
90
|
+
let triangle_count = 0;
|
|
91
|
+
|
|
61
92
|
for (let f = 0; f < face_count; f++) {
|
|
62
93
|
if (!face_pool.is_allocated(f)) {
|
|
63
94
|
continue;
|
|
@@ -85,6 +116,19 @@ export function bt_mesh_compute_vertex_quadrics(mesh) {
|
|
|
85
116
|
mesh.vertex_read_coordinate(scratch_coord_b, 0, vb);
|
|
86
117
|
mesh.vertex_read_coordinate(scratch_coord_c, 0, vc);
|
|
87
118
|
|
|
119
|
+
const area = tri3_area(
|
|
120
|
+
scratch_coord_a[0], scratch_coord_a[1], scratch_coord_a[2],
|
|
121
|
+
scratch_coord_b[0], scratch_coord_b[1], scratch_coord_b[2],
|
|
122
|
+
scratch_coord_c[0], scratch_coord_c[1], scratch_coord_c[2]
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
if (area === 0) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
total_area += area;
|
|
130
|
+
triangle_count++;
|
|
131
|
+
|
|
88
132
|
tri3_compute_normal(
|
|
89
133
|
scratch_normal, 0,
|
|
90
134
|
scratch_coord_a[0], scratch_coord_a[1], scratch_coord_a[2],
|
|
@@ -102,11 +146,30 @@ export function bt_mesh_compute_vertex_quadrics(mesh) {
|
|
|
102
146
|
scratch_coord_a[0], scratch_coord_a[1], scratch_coord_a[2]
|
|
103
147
|
);
|
|
104
148
|
|
|
149
|
+
// Weight and matrix together, which is what {@link quadric3_scale} is for: the plane counts
|
|
150
|
+
// for its area in the sum *and* declares that it does, so the mean stays a length.
|
|
151
|
+
q.multiplyScalar(area);
|
|
152
|
+
|
|
105
153
|
quadratics[va].add(q);
|
|
106
154
|
quadratics[vb].add(q);
|
|
107
155
|
quadratics[vc].add(q);
|
|
108
156
|
|
|
109
|
-
add_boundary_constraints(mesh, quadratics, f, nx, ny, nz);
|
|
157
|
+
add_boundary_constraints(mesh, quadratics, f, nx, ny, nz, area);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (triangle_count > 0) {
|
|
161
|
+
// Areas into multiples of the mean triangle. One pass at the end rather than a pass for the
|
|
162
|
+
// mean before the accumulation: scaling is linear and uniform, so dividing every quadric
|
|
163
|
+
// here is dividing every plane's weight there.
|
|
164
|
+
const of_a_mean_triangle = triangle_count / total_area;
|
|
165
|
+
|
|
166
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
167
|
+
const quadric = quadratics[v];
|
|
168
|
+
|
|
169
|
+
if (quadric !== undefined) {
|
|
170
|
+
quadric.multiplyScalar(of_a_mean_triangle);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
110
173
|
}
|
|
111
174
|
|
|
112
175
|
return quadratics;
|
|
@@ -170,8 +233,10 @@ function count_edge_faces(mesh, edge) {
|
|
|
170
233
|
* @param {number} nx face normal, unit
|
|
171
234
|
* @param {number} ny
|
|
172
235
|
* @param {number} nz
|
|
236
|
+
* @param {number} area of the face, which the constraint carries so that it stays
|
|
237
|
+
* {@link BOUNDARY_WEIGHT} times a face rather than a fixed number of square metres
|
|
173
238
|
*/
|
|
174
|
-
function add_boundary_constraints(mesh, quadratics, face, nx, ny, nz) {
|
|
239
|
+
function add_boundary_constraints(mesh, quadratics, face, nx, ny, nz, area) {
|
|
175
240
|
const first = mesh.face_read_loop(face);
|
|
176
241
|
|
|
177
242
|
let loop = first;
|
|
@@ -217,7 +282,7 @@ function add_boundary_constraints(mesh, quadratics, face, nx, ny, nz) {
|
|
|
217
282
|
scratch_coord_a[0], scratch_coord_a[1], scratch_coord_a[2]
|
|
218
283
|
);
|
|
219
284
|
|
|
220
|
-
boundary_quadric.multiplyScalar(BOUNDARY_WEIGHT);
|
|
285
|
+
boundary_quadric.multiplyScalar(BOUNDARY_WEIGHT * area);
|
|
221
286
|
|
|
222
287
|
quadratics[v1].add(boundary_quadric);
|
|
223
288
|
quadratics[v2].add(boundary_quadric);
|
package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One attribute quadric per wedge, accumulated from every allocated triangle.
|
|
3
|
+
*
|
|
4
|
+
* The companion of {@link bt_mesh_compute_vertex_quadrics}, and deliberately its *companion* rather
|
|
5
|
+
* than an extension of it: that one stays the pure geometric quadric, which is what lets the error a
|
|
6
|
+
* caller reports stay an object-space length no matter what this one does to the placement
|
|
7
|
+
* (`VIRTUAL_GEOMETRY_DESIGN.md` §3). Solve in the higher-dimensional metric, evaluate in the 3-D one.
|
|
8
|
+
*
|
|
9
|
+
* The attribute values arrive as a flat array indexed by **wedge** id — `components` scalars each,
|
|
10
|
+
* whatever they happen to mean. This pass does not know and does not need to: a channel is a number
|
|
11
|
+
* per corner that varies affinely over a triangle, and a normal, a texture coordinate and a colour
|
|
12
|
+
* are all that.
|
|
13
|
+
*
|
|
14
|
+
* Per wedge rather than per vertex because a vertex has one position and not one appearance, and per
|
|
15
|
+
* wedge rather than per *corner* because a single corner's quadric would only ever hold its own
|
|
16
|
+
* triangle — a field fitted from one triangle is exact and says nothing. The history is what a
|
|
17
|
+
* quadric is for, and the history belongs to the set of corners that share a value.
|
|
18
|
+
* {@link bt_wedges_per_vertex} is the set for a mesh with no seams, where a wedge id *is* a vertex
|
|
19
|
+
* id and this is per vertex again.
|
|
20
|
+
*
|
|
21
|
+
* Non-triangular faces are skipped, as they are in the geometric pass. So are slivers, by
|
|
22
|
+
* {@link quadric_attribute_set_from_triangle}'s own test — a gradient that divides by twice the area
|
|
23
|
+
* would otherwise outweigh every honest triangle around it.
|
|
24
|
+
*
|
|
25
|
+
* @param {BinaryTopology} mesh
|
|
26
|
+
* @param {ArrayLike<number>} values `wedges.count * components` scalars, indexed by wedge id
|
|
27
|
+
* @param {number} components number of scalar channels
|
|
28
|
+
* @param {ArrayLike<number>} weights one per channel, mapping it into units of length
|
|
29
|
+
* @param {BtWedgeSet} wedges which corners of each vertex shade as one
|
|
30
|
+
* @returns {Float64Array} `wedges.count * quadric_attribute_size(components)` elements, indexed by
|
|
31
|
+
* wedge id; a slot no triangle used holds a quadric of zero weight, which
|
|
32
|
+
* {@link quadric_attribute_solve} refuses rather than answering from
|
|
33
|
+
*
|
|
34
|
+
* @author Alex Goldring
|
|
35
|
+
* @copyright Company Named Limited (c) 2026
|
|
36
|
+
*/
|
|
37
|
+
export function bt_mesh_compute_wedge_attribute_quadrics(mesh: BinaryTopology, values: ArrayLike<number>, components: number, weights: ArrayLike<number>, wedges: BtWedgeSet): Float64Array;
|
|
38
|
+
//# sourceMappingURL=bt_mesh_compute_wedge_attribute_quadrics.d.ts.map
|
package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bt_mesh_compute_wedge_attribute_quadrics.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,uFAXW,UAAU,MAAM,CAAC,cACjB,MAAM,WACN,UAAU,MAAM,CAAC,uBAEf,YAAY,CAmExB"}
|
package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { assert } from "../../../../../../assert.js";
|
|
2
|
+
import {
|
|
3
|
+
quadric_attribute_add
|
|
4
|
+
} from "../../../../quadric/quadric_attribute_add.js";
|
|
5
|
+
import {
|
|
6
|
+
quadric_attribute_set_from_triangle
|
|
7
|
+
} from "../../../../quadric/quadric_attribute_set_from_triangle.js";
|
|
8
|
+
import { quadric_attribute_size } from "../../../../quadric/quadric_attribute_size.js";
|
|
9
|
+
import { NULL_POINTER } from "../BinaryTopology.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* One triangle's contribution, before it is accumulated onto each of its corners.
|
|
13
|
+
* @type {Float64Array}
|
|
14
|
+
*/
|
|
15
|
+
let scratch_quadric = new Float64Array(0);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* One attribute quadric per wedge, accumulated from every allocated triangle.
|
|
19
|
+
*
|
|
20
|
+
* The companion of {@link bt_mesh_compute_vertex_quadrics}, and deliberately its *companion* rather
|
|
21
|
+
* than an extension of it: that one stays the pure geometric quadric, which is what lets the error a
|
|
22
|
+
* caller reports stay an object-space length no matter what this one does to the placement
|
|
23
|
+
* (`VIRTUAL_GEOMETRY_DESIGN.md` §3). Solve in the higher-dimensional metric, evaluate in the 3-D one.
|
|
24
|
+
*
|
|
25
|
+
* The attribute values arrive as a flat array indexed by **wedge** id — `components` scalars each,
|
|
26
|
+
* whatever they happen to mean. This pass does not know and does not need to: a channel is a number
|
|
27
|
+
* per corner that varies affinely over a triangle, and a normal, a texture coordinate and a colour
|
|
28
|
+
* are all that.
|
|
29
|
+
*
|
|
30
|
+
* Per wedge rather than per vertex because a vertex has one position and not one appearance, and per
|
|
31
|
+
* wedge rather than per *corner* because a single corner's quadric would only ever hold its own
|
|
32
|
+
* triangle — a field fitted from one triangle is exact and says nothing. The history is what a
|
|
33
|
+
* quadric is for, and the history belongs to the set of corners that share a value.
|
|
34
|
+
* {@link bt_wedges_per_vertex} is the set for a mesh with no seams, where a wedge id *is* a vertex
|
|
35
|
+
* id and this is per vertex again.
|
|
36
|
+
*
|
|
37
|
+
* Non-triangular faces are skipped, as they are in the geometric pass. So are slivers, by
|
|
38
|
+
* {@link quadric_attribute_set_from_triangle}'s own test — a gradient that divides by twice the area
|
|
39
|
+
* would otherwise outweigh every honest triangle around it.
|
|
40
|
+
*
|
|
41
|
+
* @param {BinaryTopology} mesh
|
|
42
|
+
* @param {ArrayLike<number>} values `wedges.count * components` scalars, indexed by wedge id
|
|
43
|
+
* @param {number} components number of scalar channels
|
|
44
|
+
* @param {ArrayLike<number>} weights one per channel, mapping it into units of length
|
|
45
|
+
* @param {BtWedgeSet} wedges which corners of each vertex shade as one
|
|
46
|
+
* @returns {Float64Array} `wedges.count * quadric_attribute_size(components)` elements, indexed by
|
|
47
|
+
* wedge id; a slot no triangle used holds a quadric of zero weight, which
|
|
48
|
+
* {@link quadric_attribute_solve} refuses rather than answering from
|
|
49
|
+
*
|
|
50
|
+
* @author Alex Goldring
|
|
51
|
+
* @copyright Company Named Limited (c) 2026
|
|
52
|
+
*/
|
|
53
|
+
export function bt_mesh_compute_wedge_attribute_quadrics(mesh, values, components, weights, wedges) {
|
|
54
|
+
assert.equal(mesh.isBinaryTopology, true, 'mesh.isBinaryTopology !== true');
|
|
55
|
+
assert.isPositiveInteger(components, 'components');
|
|
56
|
+
|
|
57
|
+
const size = quadric_attribute_size(components);
|
|
58
|
+
|
|
59
|
+
if (scratch_quadric.length < size) {
|
|
60
|
+
scratch_quadric = new Float64Array(size);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const result = new Float64Array(wedges.count * size);
|
|
64
|
+
|
|
65
|
+
const face_pool = mesh.faces;
|
|
66
|
+
|
|
67
|
+
const coordinate = new Float32Array(9);
|
|
68
|
+
|
|
69
|
+
for (let face = 0; face < face_pool.size; face++) {
|
|
70
|
+
if (!face_pool.is_allocated(face)) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const la = mesh.face_read_loop(face);
|
|
75
|
+
|
|
76
|
+
if (la === NULL_POINTER) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const lb = mesh.loop_read_next(la);
|
|
81
|
+
const lc = mesh.loop_read_next(lb);
|
|
82
|
+
|
|
83
|
+
if (mesh.loop_read_next(lc) !== la) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
mesh.vertex_read_coordinate(coordinate, 0, mesh.loop_read_vertex(la));
|
|
88
|
+
mesh.vertex_read_coordinate(coordinate, 3, mesh.loop_read_vertex(lb));
|
|
89
|
+
mesh.vertex_read_coordinate(coordinate, 6, mesh.loop_read_vertex(lc));
|
|
90
|
+
|
|
91
|
+
const wa = wedges.find(wedges.of_loop[la]);
|
|
92
|
+
const wb = wedges.find(wedges.of_loop[lb]);
|
|
93
|
+
const wc = wedges.find(wedges.of_loop[lc]);
|
|
94
|
+
|
|
95
|
+
const built = quadric_attribute_set_from_triangle(
|
|
96
|
+
scratch_quadric, 0, components, weights,
|
|
97
|
+
coordinate[0], coordinate[1], coordinate[2],
|
|
98
|
+
coordinate[3], coordinate[4], coordinate[5],
|
|
99
|
+
coordinate[6], coordinate[7], coordinate[8],
|
|
100
|
+
values, wa * components, wb * components, wc * components
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
if (!built) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
quadric_attribute_add(result, wa * size, result, wa * size, scratch_quadric, 0, components);
|
|
108
|
+
quadric_attribute_add(result, wb * size, result, wb * size, scratch_quadric, 0, components);
|
|
109
|
+
quadric_attribute_add(result, wc * size, result, wc * size, scratch_quadric, 0, components);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return result;
|
|
113
|
+
}
|