@woosh/meep-engine 3.28.0 → 3.29.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-terrain.js +1 -1
- package/package.json +1 -1
- 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/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_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 +47 -1
- 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 +677 -8
- 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/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/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/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/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/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 +30 -13
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +3 -3
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +57 -7
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +63 -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_CREASE_ANGLE.js +45 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +64 -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 +68 -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 +24 -8
- 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 +250 -25
- 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 +8 -1
- 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 +18 -3
- 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 +28 -5
- 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/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/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/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_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -6
- 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/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/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/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/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,104 @@
|
|
|
1
|
+
import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The 3-D quadric an attribute quadric becomes once its attributes have been solved out of it.
|
|
5
|
+
*
|
|
6
|
+
* ## Why there is one at all
|
|
7
|
+
*
|
|
8
|
+
* The accumulated form is a quadratic in `3 + m` unknowns — a position and a value per channel. But
|
|
9
|
+
* the channels appear in it only as `-2 s_i (G_i . v + D_i) + s_i^2 W`, which is minimised exactly,
|
|
10
|
+
* with no search, at `s_i = (G_i . v + D_i) / W`. Substituting that back removes them, and what is
|
|
11
|
+
* left is a quadric in the position alone:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* A = P - SUM_i (G_i G_i^T) / W
|
|
15
|
+
* b = q - SUM_i (D_i G_i) / W
|
|
16
|
+
* c = r - SUM_i (D_i^2) / W
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* That is the whole reason to hold Hoppe's form rather than the `(3 + m)`-dimensional lift: placing
|
|
20
|
+
* the vertex stays a 3x3 solve however many channels the mesh carries, and the channels' influence
|
|
21
|
+
* on *where it goes* is not lost — it is in `A` and `b`.
|
|
22
|
+
*
|
|
23
|
+
* The output is {@link Quadric3}-shaped, so `quadric3_optimize` places the vertex and
|
|
24
|
+
* `quadric3_evaluate` reads the attribute error at a position, both unchanged.
|
|
25
|
+
*
|
|
26
|
+
* ## What its weight is not
|
|
27
|
+
*
|
|
28
|
+
* Slot 10 carries the accumulated triangle count, as the header did. It is **not** a plane count,
|
|
29
|
+
* and {@link quadric3_distance} on this quadric is not a length: the value is an attribute residual
|
|
30
|
+
* in whatever units the caller's weights put it in. A caller wanting a length evaluates the *pure
|
|
31
|
+
* geometric* quadric at the position this one helped choose, which is the whole of the units
|
|
32
|
+
* discipline (`VIRTUAL_GEOMETRY_DESIGN.md` §3).
|
|
33
|
+
*
|
|
34
|
+
* A quadric that has accumulated nothing has no attributes to solve out and reduces to zero, which
|
|
35
|
+
* is what an empty quadric should add to a sum.
|
|
36
|
+
*
|
|
37
|
+
* @param {number[]|Float32Array|Float64Array} out destination, `QUADRIC3_SIZE` elements from
|
|
38
|
+
* `out_offset`, overwritten
|
|
39
|
+
* @param {number} out_offset
|
|
40
|
+
* @param {ArrayLike<number>} q `quadric_attribute_size(components)` elements from `q_offset`
|
|
41
|
+
* @param {number} q_offset
|
|
42
|
+
* @param {number} components number of scalar channels
|
|
43
|
+
*
|
|
44
|
+
* @author Alex Goldring
|
|
45
|
+
* @copyright Company Named Limited (c) 2026
|
|
46
|
+
*/
|
|
47
|
+
export function quadric_attribute_reduce(out, out_offset, q, q_offset, components) {
|
|
48
|
+
const weight = q[q_offset + 10];
|
|
49
|
+
|
|
50
|
+
if (weight <= 0) {
|
|
51
|
+
for (let i = 0; i < QUADRIC3_SIZE; i++) {
|
|
52
|
+
out[out_offset + i] = 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let a00 = q[q_offset];
|
|
59
|
+
let a01 = q[q_offset + 1];
|
|
60
|
+
let a02 = q[q_offset + 2];
|
|
61
|
+
let a11 = q[q_offset + 4];
|
|
62
|
+
let a12 = q[q_offset + 5];
|
|
63
|
+
let a22 = q[q_offset + 7];
|
|
64
|
+
|
|
65
|
+
let b0 = q[q_offset + 3];
|
|
66
|
+
let b1 = q[q_offset + 6];
|
|
67
|
+
let b2 = q[q_offset + 8];
|
|
68
|
+
|
|
69
|
+
let c = q[q_offset + 9];
|
|
70
|
+
|
|
71
|
+
for (let component = 0; component < components; component++) {
|
|
72
|
+
const tail = q_offset + QUADRIC3_SIZE + component * 4;
|
|
73
|
+
|
|
74
|
+
const gx = q[tail];
|
|
75
|
+
const gy = q[tail + 1];
|
|
76
|
+
const gz = q[tail + 2];
|
|
77
|
+
const d = q[tail + 3];
|
|
78
|
+
|
|
79
|
+
a00 -= gx * gx / weight;
|
|
80
|
+
a01 -= gx * gy / weight;
|
|
81
|
+
a02 -= gx * gz / weight;
|
|
82
|
+
a11 -= gy * gy / weight;
|
|
83
|
+
a12 -= gy * gz / weight;
|
|
84
|
+
a22 -= gz * gz / weight;
|
|
85
|
+
|
|
86
|
+
b0 -= d * gx / weight;
|
|
87
|
+
b1 -= d * gy / weight;
|
|
88
|
+
b2 -= d * gz / weight;
|
|
89
|
+
|
|
90
|
+
c -= d * d / weight;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
out[out_offset] = a00;
|
|
94
|
+
out[out_offset + 1] = a01;
|
|
95
|
+
out[out_offset + 2] = a02;
|
|
96
|
+
out[out_offset + 3] = b0;
|
|
97
|
+
out[out_offset + 4] = a11;
|
|
98
|
+
out[out_offset + 5] = a12;
|
|
99
|
+
out[out_offset + 6] = b1;
|
|
100
|
+
out[out_offset + 7] = a22;
|
|
101
|
+
out[out_offset + 8] = b2;
|
|
102
|
+
out[out_offset + 9] = c;
|
|
103
|
+
out[out_offset + 10] = weight;
|
|
104
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Set an attribute quadric to one triangle's contribution: how much a candidate `(position,
|
|
3
|
+
* attributes)` disagrees with the linear field this triangle's corners describe.
|
|
4
|
+
*
|
|
5
|
+
* ## What the field is
|
|
6
|
+
*
|
|
7
|
+
* Over a triangle, an attribute that interpolates its three corners is an affine function of
|
|
8
|
+
* position, `s(p) = g . p + d`. Three corner values give three equations in four unknowns; the
|
|
9
|
+
* fourth is that the field does not vary *off* the surface, `g . n = 0`, which is what makes it a
|
|
10
|
+
* function of the surface rather than of space. With `e1 = b - a`, `e2 = c - a` and `n` their unit
|
|
11
|
+
* cross product:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* g = ( (s_b - s_a) * (e2 x n) + (s_c - s_a) * (n x e1) ) / |e1 x e2|
|
|
15
|
+
* d = s_a - g . a
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The error of a candidate `(v, s)` against this triangle is then `(g . v + d - s)^2` per channel,
|
|
19
|
+
* and what is accumulated here is everything in that expression that does not involve `s`, plus the
|
|
20
|
+
* two terms per channel that do. {@link quadric_attribute_reduce} does the rest, once, at solve
|
|
21
|
+
* time.
|
|
22
|
+
*
|
|
23
|
+
* ## Weights
|
|
24
|
+
*
|
|
25
|
+
* `g` carries units of *attribute per length*, so the error above is dimensionless while the
|
|
26
|
+
* geometric quadric beside it evaluates to a squared length. Adding those without saying how they
|
|
27
|
+
* compare is meaningless, so each channel carries a weight with units of length and the field is
|
|
28
|
+
* built over `weight * s` rather than over `s`. {@link quadric_attribute_solve} divides it back out.
|
|
29
|
+
*
|
|
30
|
+
* ## Slivers
|
|
31
|
+
*
|
|
32
|
+
* `g` divides by twice the triangle's area, so a sliver produces an enormous gradient off a
|
|
33
|
+
* negligible amount of surface. A triangle whose corners are within `EPSILON` of collinear
|
|
34
|
+
* contributes nothing at all rather than that: the quadric is zeroed and `false` comes back.
|
|
35
|
+
* The test is on the sine of the corner angle rather than on the area, so it names slivers and not
|
|
36
|
+
* merely small triangles — a small well-shaped triangle has a large gradient *and means it*.
|
|
37
|
+
*
|
|
38
|
+
* @param {number[]|Float32Array|Float64Array} out destination, `quadric_attribute_size(components)`
|
|
39
|
+
* elements from `out_offset`, overwritten
|
|
40
|
+
* @param {number} out_offset
|
|
41
|
+
* @param {number} components number of scalar channels
|
|
42
|
+
* @param {ArrayLike<number>} weights one per channel, `components` elements
|
|
43
|
+
* @param {number} ax first corner
|
|
44
|
+
* @param {number} ay
|
|
45
|
+
* @param {number} az
|
|
46
|
+
* @param {number} bx second corner
|
|
47
|
+
* @param {number} by
|
|
48
|
+
* @param {number} bz
|
|
49
|
+
* @param {number} cx third corner
|
|
50
|
+
* @param {number} cy
|
|
51
|
+
* @param {number} cz
|
|
52
|
+
* @param {ArrayLike<number>} values the attribute vector the three corners are read out of
|
|
53
|
+
* @param {number} a_offset first corner's record within `values`
|
|
54
|
+
* @param {number} b_offset
|
|
55
|
+
* @param {number} c_offset
|
|
56
|
+
* @returns {boolean} whether the triangle described a field at all
|
|
57
|
+
*
|
|
58
|
+
* @author Alex Goldring
|
|
59
|
+
* @copyright Company Named Limited (c) 2026
|
|
60
|
+
*/
|
|
61
|
+
export function quadric_attribute_set_from_triangle(out: number[] | Float32Array | Float64Array, out_offset: number, components: number, weights: ArrayLike<number>, ax: number, ay: number, az: number, bx: number, by: number, bz: number, cx: number, cy: number, cz: number, values: ArrayLike<number>, a_offset: number, b_offset: number, c_offset: number): boolean;
|
|
62
|
+
//# sourceMappingURL=quadric_attribute_set_from_triangle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quadric_attribute_set_from_triangle.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,yDAvBW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAElC,MAAM,cACN,MAAM,WACN,UAAU,MAAM,CAAC,MACjB,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,UACN,UAAU,MAAM,CAAC,YACjB,MAAM,YACN,MAAM,YACN,MAAM,GACJ,OAAO,CAkGnB"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { assert } from "../../../assert.js";
|
|
2
|
+
import { EPSILON } from "../../../math/EPSILON.js";
|
|
3
|
+
import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Set an attribute quadric to one triangle's contribution: how much a candidate `(position,
|
|
7
|
+
* attributes)` disagrees with the linear field this triangle's corners describe.
|
|
8
|
+
*
|
|
9
|
+
* ## What the field is
|
|
10
|
+
*
|
|
11
|
+
* Over a triangle, an attribute that interpolates its three corners is an affine function of
|
|
12
|
+
* position, `s(p) = g . p + d`. Three corner values give three equations in four unknowns; the
|
|
13
|
+
* fourth is that the field does not vary *off* the surface, `g . n = 0`, which is what makes it a
|
|
14
|
+
* function of the surface rather than of space. With `e1 = b - a`, `e2 = c - a` and `n` their unit
|
|
15
|
+
* cross product:
|
|
16
|
+
*
|
|
17
|
+
* ```
|
|
18
|
+
* g = ( (s_b - s_a) * (e2 x n) + (s_c - s_a) * (n x e1) ) / |e1 x e2|
|
|
19
|
+
* d = s_a - g . a
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* The error of a candidate `(v, s)` against this triangle is then `(g . v + d - s)^2` per channel,
|
|
23
|
+
* and what is accumulated here is everything in that expression that does not involve `s`, plus the
|
|
24
|
+
* two terms per channel that do. {@link quadric_attribute_reduce} does the rest, once, at solve
|
|
25
|
+
* time.
|
|
26
|
+
*
|
|
27
|
+
* ## Weights
|
|
28
|
+
*
|
|
29
|
+
* `g` carries units of *attribute per length*, so the error above is dimensionless while the
|
|
30
|
+
* geometric quadric beside it evaluates to a squared length. Adding those without saying how they
|
|
31
|
+
* compare is meaningless, so each channel carries a weight with units of length and the field is
|
|
32
|
+
* built over `weight * s` rather than over `s`. {@link quadric_attribute_solve} divides it back out.
|
|
33
|
+
*
|
|
34
|
+
* ## Slivers
|
|
35
|
+
*
|
|
36
|
+
* `g` divides by twice the triangle's area, so a sliver produces an enormous gradient off a
|
|
37
|
+
* negligible amount of surface. A triangle whose corners are within `EPSILON` of collinear
|
|
38
|
+
* contributes nothing at all rather than that: the quadric is zeroed and `false` comes back.
|
|
39
|
+
* The test is on the sine of the corner angle rather than on the area, so it names slivers and not
|
|
40
|
+
* merely small triangles — a small well-shaped triangle has a large gradient *and means it*.
|
|
41
|
+
*
|
|
42
|
+
* @param {number[]|Float32Array|Float64Array} out destination, `quadric_attribute_size(components)`
|
|
43
|
+
* elements from `out_offset`, overwritten
|
|
44
|
+
* @param {number} out_offset
|
|
45
|
+
* @param {number} components number of scalar channels
|
|
46
|
+
* @param {ArrayLike<number>} weights one per channel, `components` elements
|
|
47
|
+
* @param {number} ax first corner
|
|
48
|
+
* @param {number} ay
|
|
49
|
+
* @param {number} az
|
|
50
|
+
* @param {number} bx second corner
|
|
51
|
+
* @param {number} by
|
|
52
|
+
* @param {number} bz
|
|
53
|
+
* @param {number} cx third corner
|
|
54
|
+
* @param {number} cy
|
|
55
|
+
* @param {number} cz
|
|
56
|
+
* @param {ArrayLike<number>} values the attribute vector the three corners are read out of
|
|
57
|
+
* @param {number} a_offset first corner's record within `values`
|
|
58
|
+
* @param {number} b_offset
|
|
59
|
+
* @param {number} c_offset
|
|
60
|
+
* @returns {boolean} whether the triangle described a field at all
|
|
61
|
+
*
|
|
62
|
+
* @author Alex Goldring
|
|
63
|
+
* @copyright Company Named Limited (c) 2026
|
|
64
|
+
*/
|
|
65
|
+
export function quadric_attribute_set_from_triangle(
|
|
66
|
+
out, out_offset, components, weights,
|
|
67
|
+
ax, ay, az, bx, by, bz, cx, cy, cz,
|
|
68
|
+
values, a_offset, b_offset, c_offset
|
|
69
|
+
) {
|
|
70
|
+
assert.isNonNegativeInteger(components, 'components');
|
|
71
|
+
|
|
72
|
+
const size = QUADRIC3_SIZE + components * 4;
|
|
73
|
+
|
|
74
|
+
for (let i = 0; i < size; i++) {
|
|
75
|
+
out[out_offset + i] = 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const e1x = bx - ax;
|
|
79
|
+
const e1y = by - ay;
|
|
80
|
+
const e1z = bz - az;
|
|
81
|
+
|
|
82
|
+
const e2x = cx - ax;
|
|
83
|
+
const e2y = cy - ay;
|
|
84
|
+
const e2z = cz - az;
|
|
85
|
+
|
|
86
|
+
const nx = e1y * e2z - e1z * e2y;
|
|
87
|
+
const ny = e1z * e2x - e1x * e2z;
|
|
88
|
+
const nz = e1x * e2y - e1y * e2x;
|
|
89
|
+
|
|
90
|
+
const determinant = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
91
|
+
|
|
92
|
+
const e1_length = Math.sqrt(e1x * e1x + e1y * e1y + e1z * e1z);
|
|
93
|
+
const e2_length = Math.sqrt(e2x * e2x + e2y * e2y + e2z * e2z);
|
|
94
|
+
|
|
95
|
+
// `determinant` is `|e1| |e2| sin(angle)`, so this is the sine, and a scale-free sliver test.
|
|
96
|
+
if (determinant <= EPSILON * e1_length * e2_length) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const unit_nx = nx / determinant;
|
|
101
|
+
const unit_ny = ny / determinant;
|
|
102
|
+
const unit_nz = nz / determinant;
|
|
103
|
+
|
|
104
|
+
// The two columns of the inverse that the corner differences multiply: e2 x n, and n x e1.
|
|
105
|
+
const p1x = e2y * unit_nz - e2z * unit_ny;
|
|
106
|
+
const p1y = e2z * unit_nx - e2x * unit_nz;
|
|
107
|
+
const p1z = e2x * unit_ny - e2y * unit_nx;
|
|
108
|
+
|
|
109
|
+
const p2x = unit_ny * e1z - unit_nz * e1y;
|
|
110
|
+
const p2y = unit_nz * e1x - unit_nx * e1z;
|
|
111
|
+
const p2z = unit_nx * e1y - unit_ny * e1x;
|
|
112
|
+
|
|
113
|
+
for (let component = 0; component < components; component++) {
|
|
114
|
+
const weight = weights[component];
|
|
115
|
+
|
|
116
|
+
const sa = values[a_offset + component] * weight;
|
|
117
|
+
const sb = values[b_offset + component] * weight;
|
|
118
|
+
const sc = values[c_offset + component] * weight;
|
|
119
|
+
|
|
120
|
+
const db = (sb - sa) / determinant;
|
|
121
|
+
const dc = (sc - sa) / determinant;
|
|
122
|
+
|
|
123
|
+
const gx = db * p1x + dc * p2x;
|
|
124
|
+
const gy = db * p1y + dc * p2y;
|
|
125
|
+
const gz = db * p1z + dc * p2z;
|
|
126
|
+
|
|
127
|
+
const d = sa - (gx * ax + gy * ay + gz * az);
|
|
128
|
+
|
|
129
|
+
// P += g g^T, in the header's `A` slots
|
|
130
|
+
out[out_offset] += gx * gx;
|
|
131
|
+
out[out_offset + 1] += gx * gy;
|
|
132
|
+
out[out_offset + 2] += gx * gz;
|
|
133
|
+
out[out_offset + 4] += gy * gy;
|
|
134
|
+
out[out_offset + 5] += gy * gz;
|
|
135
|
+
out[out_offset + 7] += gz * gz;
|
|
136
|
+
|
|
137
|
+
// q += d g, in the header's `b` slots
|
|
138
|
+
out[out_offset + 3] += d * gx;
|
|
139
|
+
out[out_offset + 6] += d * gy;
|
|
140
|
+
out[out_offset + 8] += d * gz;
|
|
141
|
+
|
|
142
|
+
// r += d^2, in the header's `c` slot
|
|
143
|
+
out[out_offset + 9] += d * d;
|
|
144
|
+
|
|
145
|
+
const tail = out_offset + QUADRIC3_SIZE + component * 4;
|
|
146
|
+
|
|
147
|
+
out[tail] = gx;
|
|
148
|
+
out[tail + 1] = gy;
|
|
149
|
+
out[tail + 2] = gz;
|
|
150
|
+
out[tail + 3] = d;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// One triangle, weighing one -- the convention `quadric3_set_from_vector4` sets for the
|
|
154
|
+
// geometric quadric this one is summed with, and what makes the two commensurate.
|
|
155
|
+
out[out_offset + 10] = 1;
|
|
156
|
+
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How many elements an attribute quadric over `components` scalar channels occupies.
|
|
3
|
+
*
|
|
4
|
+
* `QUADRIC3_SIZE` of header — which is a {@link Quadric3} in layout as well as in size, so every
|
|
5
|
+
* `quadric3_*` function reads it — followed by four per channel: the accumulated gradient and the
|
|
6
|
+
* accumulated offset of that channel's linear field.
|
|
7
|
+
*
|
|
8
|
+
* This is Hoppe's form (*New Quadric Metric for Simplifying Meshes with Appearance Attributes*,
|
|
9
|
+
* 1999) rather than the naive lift of Garland & Heckbert's metric into `3 + m` dimensions, which
|
|
10
|
+
* would need `(m + 4)(m + 5) / 2` elements and a solve of the same order. Both answer the same
|
|
11
|
+
* question; at five channels this is 31 elements against 36, at thirteen it is 63 against 136, and
|
|
12
|
+
* the placement solve stays 3x3 either way.
|
|
13
|
+
*
|
|
14
|
+
* @param {number} components number of scalar channels
|
|
15
|
+
* @returns {number}
|
|
16
|
+
*
|
|
17
|
+
* @author Alex Goldring
|
|
18
|
+
* @copyright Company Named Limited (c) 2026
|
|
19
|
+
*/
|
|
20
|
+
export function quadric_attribute_size(components: number): number;
|
|
21
|
+
//# sourceMappingURL=quadric_attribute_size.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quadric_attribute_size.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_size.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,mDANW,MAAM,GACJ,MAAM,CAOlB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* How many elements an attribute quadric over `components` scalar channels occupies.
|
|
5
|
+
*
|
|
6
|
+
* `QUADRIC3_SIZE` of header — which is a {@link Quadric3} in layout as well as in size, so every
|
|
7
|
+
* `quadric3_*` function reads it — followed by four per channel: the accumulated gradient and the
|
|
8
|
+
* accumulated offset of that channel's linear field.
|
|
9
|
+
*
|
|
10
|
+
* This is Hoppe's form (*New Quadric Metric for Simplifying Meshes with Appearance Attributes*,
|
|
11
|
+
* 1999) rather than the naive lift of Garland & Heckbert's metric into `3 + m` dimensions, which
|
|
12
|
+
* would need `(m + 4)(m + 5) / 2` elements and a solve of the same order. Both answer the same
|
|
13
|
+
* question; at five channels this is 31 elements against 36, at thirteen it is 63 against 136, and
|
|
14
|
+
* the placement solve stays 3x3 either way.
|
|
15
|
+
*
|
|
16
|
+
* @param {number} components number of scalar channels
|
|
17
|
+
* @returns {number}
|
|
18
|
+
*
|
|
19
|
+
* @author Alex Goldring
|
|
20
|
+
* @copyright Company Named Limited (c) 2026
|
|
21
|
+
*/
|
|
22
|
+
export function quadric_attribute_size(components) {
|
|
23
|
+
return QUADRIC3_SIZE + components * 4;
|
|
24
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The attribute values that best explain everything a quadric has accumulated, at a given position.
|
|
3
|
+
*
|
|
4
|
+
* `s_i = (G_i . v + D_i) / W`, which is exact rather than iterative: the channels enter the
|
|
5
|
+
* accumulated error only quadratically and separably, so each one's minimum is where its derivative
|
|
6
|
+
* is zero and there is nothing to search. {@link quadric_attribute_reduce} is the same substitution
|
|
7
|
+
* seen from the other side.
|
|
8
|
+
*
|
|
9
|
+
* The result is a **fit**, not an average, and it is not confined to the values that went in. That is
|
|
10
|
+
* correct and is the point: a linear field extrapolates, and a vertex placed a little outside the
|
|
11
|
+
* patch it stands for should carry the value the patch's field has *there*. A caller whose channel
|
|
12
|
+
* has a range — a colour, say — clamps afterwards; a caller whose channel is a direction
|
|
13
|
+
* renormalizes.
|
|
14
|
+
*
|
|
15
|
+
* Nothing comes back for a quadric that has accumulated nothing. There is no field to evaluate, and
|
|
16
|
+
* inventing one would be worse than leaving the caller its own value.
|
|
17
|
+
*
|
|
18
|
+
* @param {number[]|Float32Array|Float64Array} out destination, `components` elements from
|
|
19
|
+
* `out_offset`, written only when this returns `true`
|
|
20
|
+
* @param {number} out_offset
|
|
21
|
+
* @param {ArrayLike<number>} q `quadric_attribute_size(components)` elements from `q_offset`
|
|
22
|
+
* @param {number} q_offset
|
|
23
|
+
* @param {number} components number of scalar channels
|
|
24
|
+
* @param {ArrayLike<number>} weights one per channel, the same ones the quadric was built with
|
|
25
|
+
* @param {number} x position to evaluate the field at
|
|
26
|
+
* @param {number} y
|
|
27
|
+
* @param {number} z
|
|
28
|
+
* @returns {boolean} whether there was a field to evaluate
|
|
29
|
+
*
|
|
30
|
+
* @author Alex Goldring
|
|
31
|
+
* @copyright Company Named Limited (c) 2026
|
|
32
|
+
*/
|
|
33
|
+
export function quadric_attribute_solve(out: number[] | Float32Array | Float64Array, out_offset: number, q: ArrayLike<number>, q_offset: number, components: number, weights: ArrayLike<number>, x: number, y: number, z: number): boolean;
|
|
34
|
+
//# sourceMappingURL=quadric_attribute_solve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quadric_attribute_solve.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_solve.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,6CAfW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAElC,MAAM,KACN,UAAU,MAAM,CAAC,YACjB,MAAM,cACN,MAAM,WACN,UAAU,MAAM,CAAC,KACjB,MAAM,KACN,MAAM,KACN,MAAM,GACJ,OAAO,CAyBnB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The attribute values that best explain everything a quadric has accumulated, at a given position.
|
|
5
|
+
*
|
|
6
|
+
* `s_i = (G_i . v + D_i) / W`, which is exact rather than iterative: the channels enter the
|
|
7
|
+
* accumulated error only quadratically and separably, so each one's minimum is where its derivative
|
|
8
|
+
* is zero and there is nothing to search. {@link quadric_attribute_reduce} is the same substitution
|
|
9
|
+
* seen from the other side.
|
|
10
|
+
*
|
|
11
|
+
* The result is a **fit**, not an average, and it is not confined to the values that went in. That is
|
|
12
|
+
* correct and is the point: a linear field extrapolates, and a vertex placed a little outside the
|
|
13
|
+
* patch it stands for should carry the value the patch's field has *there*. A caller whose channel
|
|
14
|
+
* has a range — a colour, say — clamps afterwards; a caller whose channel is a direction
|
|
15
|
+
* renormalizes.
|
|
16
|
+
*
|
|
17
|
+
* Nothing comes back for a quadric that has accumulated nothing. There is no field to evaluate, and
|
|
18
|
+
* inventing one would be worse than leaving the caller its own value.
|
|
19
|
+
*
|
|
20
|
+
* @param {number[]|Float32Array|Float64Array} out destination, `components` elements from
|
|
21
|
+
* `out_offset`, written only when this returns `true`
|
|
22
|
+
* @param {number} out_offset
|
|
23
|
+
* @param {ArrayLike<number>} q `quadric_attribute_size(components)` elements from `q_offset`
|
|
24
|
+
* @param {number} q_offset
|
|
25
|
+
* @param {number} components number of scalar channels
|
|
26
|
+
* @param {ArrayLike<number>} weights one per channel, the same ones the quadric was built with
|
|
27
|
+
* @param {number} x position to evaluate the field at
|
|
28
|
+
* @param {number} y
|
|
29
|
+
* @param {number} z
|
|
30
|
+
* @returns {boolean} whether there was a field to evaluate
|
|
31
|
+
*
|
|
32
|
+
* @author Alex Goldring
|
|
33
|
+
* @copyright Company Named Limited (c) 2026
|
|
34
|
+
*/
|
|
35
|
+
export function quadric_attribute_solve(
|
|
36
|
+
out, out_offset, q, q_offset, components, weights, x, y, z
|
|
37
|
+
) {
|
|
38
|
+
const weight = q[q_offset + 10];
|
|
39
|
+
|
|
40
|
+
if (weight <= 0) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
for (let component = 0; component < components; component++) {
|
|
45
|
+
const tail = q_offset + QUADRIC3_SIZE + component * 4;
|
|
46
|
+
|
|
47
|
+
const value = (q[tail] * x + q[tail + 1] * y + q[tail + 2] * z + q[tail + 3]) / weight;
|
|
48
|
+
|
|
49
|
+
// Built over `weight * s` so the residual would compare with a squared length; this is where
|
|
50
|
+
// that comes back off.
|
|
51
|
+
out[out_offset + component] = value / weights[component];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subtract one attribute quadric from another, elementwise — the inverse of
|
|
3
|
+
* {@link quadric_attribute_add}.
|
|
4
|
+
*
|
|
5
|
+
* What it is for is the same thing {@link quadric3_sub} is for: recovering what a pass *added* to a
|
|
6
|
+
* quadric, when two passes started from the same one. Two group steps sharing a pinned boundary
|
|
7
|
+
* vertex each begin from that vertex's quadric and each fold their own victims onto it, so the two
|
|
8
|
+
* results overlap by exactly the quadric they both began with; adding them whole would count the
|
|
9
|
+
* source under that vertex twice.
|
|
10
|
+
*
|
|
11
|
+
* The difference of two quadrics is not itself a sum of anything, and its weight can come out
|
|
12
|
+
* negative. Nothing here objects — a gain is meant to be added back to the quadric it was measured
|
|
13
|
+
* against, not evaluated on its own.
|
|
14
|
+
*
|
|
15
|
+
* @param {number[]|Float32Array|Float64Array} out `quadric_attribute_size(components)` elements from
|
|
16
|
+
* `out_offset`; may alias either input
|
|
17
|
+
* @param {number} out_offset
|
|
18
|
+
* @param {ArrayLike<number>} a
|
|
19
|
+
* @param {number} a_offset
|
|
20
|
+
* @param {ArrayLike<number>} b subtracted from `a`
|
|
21
|
+
* @param {number} b_offset
|
|
22
|
+
* @param {number} components number of scalar channels
|
|
23
|
+
*
|
|
24
|
+
* @author Alex Goldring
|
|
25
|
+
* @copyright Company Named Limited (c) 2026
|
|
26
|
+
*/
|
|
27
|
+
export function quadric_attribute_sub(out: number[] | Float32Array | Float64Array, out_offset: number, a: ArrayLike<number>, a_offset: number, b: ArrayLike<number>, b_offset: number, components: number): void;
|
|
28
|
+
//# sourceMappingURL=quadric_attribute_sub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quadric_attribute_sub.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_sub.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,2CAZW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAElC,MAAM,KACN,UAAU,MAAM,CAAC,YACjB,MAAM,KACN,UAAU,MAAM,CAAC,YACjB,MAAM,cACN,MAAM,QAWhB"}
|
|
@@ -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
|
*
|