@woosh/meep-engine 3.27.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/mat4/m4_linear_determinant.d.ts +15 -0
- package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts.map +1 -0
- package/src/core/geom/3d/mat4/m4_linear_determinant.js +24 -0
- package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts +4 -2
- package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/m4_normal_matrix3.js +21 -11
- 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/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +38 -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/GraphicsEngine.d.ts +5 -1
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +834 -830
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
- package/src/shade/RENDERER_CONTRACT.md +31 -17
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +1 -1
- 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 +32 -16
- package/src/shade/playground/vgeo_runtime/main.js +21 -7
- package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.d.ts +3 -3
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -0
- package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.js +12 -11
- package/src/shade/playground/vgeo_scene/README.md +487 -0
- package/src/shade/playground/vgeo_scene/index.html +144 -0
- package/src/shade/playground/vgeo_scene/main.d.ts +2 -0
- package/src/shade/playground/vgeo_scene/main.d.ts.map +1 -0
- package/src/shade/playground/vgeo_scene/main.js +2217 -0
- 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 +6 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +28 -2
- 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 +70 -35
- 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/meshlet/MeshletBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +3 -29
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts +22 -0
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts.map +1 -0
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.js +49 -0
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +159 -66
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +40 -21
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +15 -14
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +58 -8
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +64 -10
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +5 -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/VGeoLevel.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.d.ts → level/VGeoLevelOptions.d.ts} +19 -6
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.js → level/VGeoLevelOptions.js} +20 -7
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts.map +1 -0
- 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 +11 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +308 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.d.ts → level/vgeo_build_root_group.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.js → level/vgeo_build_root_group.js} +1 -1
- 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/{VirtualGeometryMesh.d.ts → mesh/VirtualGeometryMesh.d.ts} +13 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VirtualGeometryMesh.js → mesh/VirtualGeometryMesh.js} +40 -18
- 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 +45 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +300 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_tangents.d.ts → 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 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +151 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.d.ts → mesh/vgeo_normalize_source.d.ts} +8 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.js → mesh/vgeo_normalize_source.js} +27 -12
- 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/{vgeo_assemble_pages.d.ts → page/vgeo_assemble_pages.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_assemble_pages.js → page/vgeo_assemble_pages.js} +9 -9
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.d.ts → page/vgeo_build_page_nodes.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.js → page/vgeo_build_page_nodes.js} +4 -4
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.js → page/vgeo_page_node_count.js} +2 -2
- package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.d.ts → partition/VGeoFaceGraph.d.ts} +23 -5
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.js → partition/VGeoFaceGraph.js} +28 -21
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.js → partition/vgeo_partition_graph.js} +2 -2
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts +41 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.js +92 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.js → partition/vgeo_split_face_set.js} +13 -56
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +371 -0
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.js → sphere/vgeo_bounding_sphere.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.js → sphere/vgeo_containing_sphere.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.js → sphere/vgeo_sphere_inflate_to_contain.js} +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +42 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +37 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +39 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +23 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +135 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +95 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.js → submesh/vgeo_narrow_indices.js} +3 -3
- 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 +37 -16
- 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_attributes_read.d.ts +8 -2
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +8 -2
- 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_GROUP_OFFSET.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.js +15 -0
- 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 +32 -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 +15 -7
- 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 +120 -37
- 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 +130 -47
- 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 +60 -22
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +21 -2
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +52 -2
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +97 -1
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +4 -4
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +10 -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 +59 -34
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +8 -8
- 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 +45 -88
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +116 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +99 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.js +39 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +7 -63
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +13 -30
- 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 +53 -71
- 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/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +0 -19
- package/src/shade/renderer/material/chunk_material_draw_side.d.ts +14 -0
- package/src/shade/renderer/material/chunk_material_draw_side.d.ts.map +1 -0
- package/src/shade/renderer/material/chunk_material_draw_side.js +34 -0
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.js +8 -1
- 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/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +13 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +19 -5
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +23 -5
- package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.js +12 -5
- 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_opaque_buckets.d.ts +22 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.js +36 -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/chunk_triangle_winding_is_reversed.d.ts +15 -0
- package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +35 -0
- 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/RASTERIZATION_BUCKET_LIMIT.d.ts +10 -1
- package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.js +38 -29
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts +5 -0
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.js +63 -55
- 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/graph_meshlets_rasterize.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +1 -0
- 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 +44 -53
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -2
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -2
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +19 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +7 -4
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -2
- package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js +15 -4
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +16 -5
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +16 -5
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +2 -1
- package/src/shade/renderer/rasterize/native/rasterization_shader_resources.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/rasterization_shader_resources.js +4 -0
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +16 -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 +81 -95
- 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 +26 -39
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +2 -0
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +19 -0
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/scene/NODE3D_STRUCT.js +34 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.d.ts +9 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.d.ts.map +1 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.js +23 -0
- package/src/shade/renderer/scene/chunk_scene_database_access.d.ts.map +1 -1
- package/src/shade/renderer/scene/chunk_scene_database_access.js +15 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +9 -1
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.js +16 -4
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.js +18 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js +33 -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/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/README.md +0 -150
- 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/cut_geometry.js +0 -460
- package/src/shade/playground/vgeo_viewer/index.html +0 -77
- package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/main.js +0 -1343
- 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/playground/vgeo_viewer/select_cut.js +0 -481
- 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/VGeoGatheredFaces.js +0 -25
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
- 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/VGeoSubmesh.js +0 -20
- 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.map +0 -1
- 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_levels.js +0 -1786
- 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.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_normals.js +0 -75
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.js +0 -143
- 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_extract_submesh.js +0 -41
- 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_gather_faces.js +0 -71
- 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.map +0 -1
- 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.map +0 -1
- 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.map +0 -1
- 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.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.js +0 -207
- 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/geometry/virtual/residency/VGeoResidencyManager.d.ts +0 -258
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +0 -49
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.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/loader/gltf/fix_up_material_sides.js +0 -109
- 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/graph_triangles_filter_by_material_side.js +0 -78
- 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/expand/shader_filter_triangle_by_material_side.js +0 -100
- 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/shade/renderer/rasterize/forward/chunk_material_side_should_draw.js +0 -26
- package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts +0 -3
- package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.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
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.d.ts → level/VGeoLevel.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.js → level/VGeoLevel.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.d.ts → level/VGeoLevelSummary.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.js → level/VGeoLevelSummary.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.d.ts → page/vgeo_page_node_count.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.d.ts → partition/vgeo_graph_components.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.js → partition/vgeo_graph_components.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.d.ts → partition/vgeo_partition_graph.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.d.ts → partition/vgeo_split_face_set.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set_packed.d.ts → partition/vgeo_split_face_set_packed.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.d.ts → sphere/vgeo_bounding_sphere.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.d.ts → sphere/vgeo_containing_sphere.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.d.ts → sphere/vgeo_sphere_inflate_to_contain.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.d.ts → submesh/vgeo_narrow_indices.d.ts} +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Area-weighted normals of a mesh, split at its creases, written into its normal channel.
|
|
3
|
+
*
|
|
4
|
+
* The geometry a mesh actually has is the answer for that mesh: carrying a surviving vertex's
|
|
5
|
+
* original normal through a dozen collapses shades a coarse level by whichever vertices happened to
|
|
6
|
+
* win, which is visibly wrong.
|
|
7
|
+
*
|
|
8
|
+
* **Per corner group, not per vertex.** Averaging every face around a vertex is right for a surface
|
|
9
|
+
* and wrong for a corner. Two faces sharing an edge belong to the same group when the surface turns
|
|
10
|
+
* less than {@link VGEO_CREASE_ANGLE} across it; groups are the connected components that leaves,
|
|
11
|
+
* and each gets its own area-weighted average. A vertex on a smooth surface has exactly one, and
|
|
12
|
+
* this is then the pass it has always been. A box corner has three, and the eight vertices of a cube
|
|
13
|
+
* stop carrying a normal that is ninety degrees wrong for every face using it.
|
|
14
|
+
*
|
|
15
|
+
* Area weighting falls out of the arithmetic rather than being applied: Newell's normal *is* the
|
|
16
|
+
* face normal scaled by twice the area, so summing the raw face normals is the area-weighted sum.
|
|
17
|
+
* Which is the same thing {@link bt_mesh_compute_vertex_normals} does, one level down, for the whole
|
|
18
|
+
* vertex — and this reproduces its arithmetic step for step, down to the float32 face scratch and
|
|
19
|
+
* the reciprocal it scales by, so that a mesh without a crease in it comes out bit for bit the same
|
|
20
|
+
* as it did before any of this existed.
|
|
21
|
+
*
|
|
22
|
+
* An edge with anything other than two live triangles on it — a mesh boundary, a non-manifold fin —
|
|
23
|
+
* joins nothing. There is no pair of faces to ask the question of, and splitting is the conservative
|
|
24
|
+
* answer: it keeps each side's own normal rather than inventing an average across a join the mesh
|
|
25
|
+
* itself does not make.
|
|
26
|
+
*
|
|
27
|
+
* **Except where the vertex was pinned.** A pinned vertex is one the step was forbidden to move, and
|
|
28
|
+
* every group that touches it carries it — which is exactly what lets a cut place two levels of
|
|
29
|
+
* detail side by side without a crack. That guarantee has to cover what the vertex *carries*, not
|
|
30
|
+
* only where it is: recomputed here, a pinned vertex would get the average of the faces on this
|
|
31
|
+
* side of the seam only, the group across the seam would get the average of its own, and the two
|
|
32
|
+
* would disagree by however much the surface turns. So a pinned vertex keeps what it had, exactly
|
|
33
|
+
* as it keeps where it was, and the frame stays continuous across every cut the DAG admits.
|
|
34
|
+
*
|
|
35
|
+
* @param {VirtualGeometryMesh} mesh whose normal layer is sized by the loop pool and so carries a
|
|
36
|
+
* slot for every live corner by construction
|
|
37
|
+
* @param {Set<number>} pinned vertex ids to leave exactly as they are; empty for a mesh nothing has
|
|
38
|
+
* locked yet
|
|
39
|
+
* @param {number} [crease_angle] degrees; see {@link VGEO_CREASE_ANGLE}
|
|
40
|
+
*
|
|
41
|
+
* @author Alex Goldring
|
|
42
|
+
* @copyright Company Named Limited (c) 2026
|
|
43
|
+
*/
|
|
44
|
+
export function vgeo_compute_vertex_normals(mesh: VirtualGeometryMesh, pinned: Set<number>, crease_angle?: number): void;
|
|
45
|
+
//# sourceMappingURL=vgeo_compute_vertex_normals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_compute_vertex_normals.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,+EAPW,IAAI,MAAM,CAAC,iBAEX,MAAM,QA4MhB"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { assert } from "../../../../../../core/assert.js";
|
|
2
|
+
import {
|
|
3
|
+
NULL_POINTER
|
|
4
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
|
|
5
|
+
import {
|
|
6
|
+
bt_face_compute_newell_normal
|
|
7
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_face_compute_newell_normal.js";
|
|
8
|
+
import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
|
|
9
|
+
import { VGEO_CREASE_ANGLE } from "./VGEO_CREASE_ANGLE.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* One corner's normal, on its way into the format's channel.
|
|
13
|
+
* @type {Float32Array}
|
|
14
|
+
*/
|
|
15
|
+
const scratch_normal = new Float32Array(3);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* One face's normal, scaled by twice its area.
|
|
19
|
+
*
|
|
20
|
+
* Float32 because {@link bt_mesh_compute_vertex_normals} accumulates from a float32 scratch, and
|
|
21
|
+
* this pass has to reproduce that sum exactly: on a mesh with no crease it *is* that pass, and the
|
|
22
|
+
* whole claim below is that only geometry with a crease or a seam in it moves.
|
|
23
|
+
* @type {Float32Array}
|
|
24
|
+
*/
|
|
25
|
+
const scratch_face = new Float32Array(3);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Area-weighted normals of a mesh, split at its creases, written into its normal channel.
|
|
29
|
+
*
|
|
30
|
+
* The geometry a mesh actually has is the answer for that mesh: carrying a surviving vertex's
|
|
31
|
+
* original normal through a dozen collapses shades a coarse level by whichever vertices happened to
|
|
32
|
+
* win, which is visibly wrong.
|
|
33
|
+
*
|
|
34
|
+
* **Per corner group, not per vertex.** Averaging every face around a vertex is right for a surface
|
|
35
|
+
* and wrong for a corner. Two faces sharing an edge belong to the same group when the surface turns
|
|
36
|
+
* less than {@link VGEO_CREASE_ANGLE} across it; groups are the connected components that leaves,
|
|
37
|
+
* and each gets its own area-weighted average. A vertex on a smooth surface has exactly one, and
|
|
38
|
+
* this is then the pass it has always been. A box corner has three, and the eight vertices of a cube
|
|
39
|
+
* stop carrying a normal that is ninety degrees wrong for every face using it.
|
|
40
|
+
*
|
|
41
|
+
* Area weighting falls out of the arithmetic rather than being applied: Newell's normal *is* the
|
|
42
|
+
* face normal scaled by twice the area, so summing the raw face normals is the area-weighted sum.
|
|
43
|
+
* Which is the same thing {@link bt_mesh_compute_vertex_normals} does, one level down, for the whole
|
|
44
|
+
* vertex — and this reproduces its arithmetic step for step, down to the float32 face scratch and
|
|
45
|
+
* the reciprocal it scales by, so that a mesh without a crease in it comes out bit for bit the same
|
|
46
|
+
* as it did before any of this existed.
|
|
47
|
+
*
|
|
48
|
+
* An edge with anything other than two live triangles on it — a mesh boundary, a non-manifold fin —
|
|
49
|
+
* joins nothing. There is no pair of faces to ask the question of, and splitting is the conservative
|
|
50
|
+
* answer: it keeps each side's own normal rather than inventing an average across a join the mesh
|
|
51
|
+
* itself does not make.
|
|
52
|
+
*
|
|
53
|
+
* **Except where the vertex was pinned.** A pinned vertex is one the step was forbidden to move, and
|
|
54
|
+
* every group that touches it carries it — which is exactly what lets a cut place two levels of
|
|
55
|
+
* detail side by side without a crack. That guarantee has to cover what the vertex *carries*, not
|
|
56
|
+
* only where it is: recomputed here, a pinned vertex would get the average of the faces on this
|
|
57
|
+
* side of the seam only, the group across the seam would get the average of its own, and the two
|
|
58
|
+
* would disagree by however much the surface turns. So a pinned vertex keeps what it had, exactly
|
|
59
|
+
* as it keeps where it was, and the frame stays continuous across every cut the DAG admits.
|
|
60
|
+
*
|
|
61
|
+
* @param {VirtualGeometryMesh} mesh whose normal layer is sized by the loop pool and so carries a
|
|
62
|
+
* slot for every live corner by construction
|
|
63
|
+
* @param {Set<number>} pinned vertex ids to leave exactly as they are; empty for a mesh nothing has
|
|
64
|
+
* locked yet
|
|
65
|
+
* @param {number} [crease_angle] degrees; see {@link VGEO_CREASE_ANGLE}
|
|
66
|
+
*
|
|
67
|
+
* @author Alex Goldring
|
|
68
|
+
* @copyright Company Named Limited (c) 2026
|
|
69
|
+
*/
|
|
70
|
+
export function vgeo_compute_vertex_normals(mesh, pinned, crease_angle = VGEO_CREASE_ANGLE) {
|
|
71
|
+
const normals = mesh.layers[VGEO_ATTRIBUTE.NORMAL];
|
|
72
|
+
|
|
73
|
+
assert.notNull(normals, 'mesh normal channel');
|
|
74
|
+
|
|
75
|
+
const topology = mesh.topology;
|
|
76
|
+
|
|
77
|
+
const face_pool = topology.faces;
|
|
78
|
+
const loop_pool = topology.loops;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Each face's normal scaled by twice its area, which is Newell's as it comes.
|
|
82
|
+
* @type {Float64Array}
|
|
83
|
+
*/
|
|
84
|
+
const face_normal = new Float64Array(face_pool.size * 3);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Its length, so the angle test does not recompute one.
|
|
88
|
+
* @type {Float64Array}
|
|
89
|
+
*/
|
|
90
|
+
const face_length = new Float64Array(face_pool.size);
|
|
91
|
+
|
|
92
|
+
for (let face = 0; face < face_pool.size; face++) {
|
|
93
|
+
if (!face_pool.is_allocated(face)) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (topology.face_read_loop(face) === NULL_POINTER) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
bt_face_compute_newell_normal(scratch_face, 0, topology, face);
|
|
102
|
+
|
|
103
|
+
const nx = scratch_face[0];
|
|
104
|
+
const ny = scratch_face[1];
|
|
105
|
+
const nz = scratch_face[2];
|
|
106
|
+
|
|
107
|
+
face_normal[face * 3] = nx;
|
|
108
|
+
face_normal[face * 3 + 1] = ny;
|
|
109
|
+
face_normal[face * 3 + 2] = nz;
|
|
110
|
+
|
|
111
|
+
face_length[face] = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Union-find over corners: two corners of one vertex share a root when the surface between them
|
|
116
|
+
* never turned far enough to be a crease.
|
|
117
|
+
* @type {Uint32Array}
|
|
118
|
+
*/
|
|
119
|
+
const group = new Uint32Array(loop_pool.size);
|
|
120
|
+
|
|
121
|
+
for (let loop = 0; loop < loop_pool.size; loop++) {
|
|
122
|
+
group[loop] = loop;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const smooth_cosine = Math.cos((crease_angle * Math.PI) / 180);
|
|
126
|
+
|
|
127
|
+
const edge_pool = topology.edges;
|
|
128
|
+
|
|
129
|
+
for (let edge = 0; edge < edge_pool.size; edge++) {
|
|
130
|
+
if (!edge_pool.is_allocated(edge)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const first_loop = topology.edge_read_loop(edge);
|
|
135
|
+
|
|
136
|
+
if (first_loop === NULL_POINTER) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
let left = NULL_POINTER;
|
|
141
|
+
let right = NULL_POINTER;
|
|
142
|
+
let live = 0;
|
|
143
|
+
|
|
144
|
+
let loop = first_loop;
|
|
145
|
+
|
|
146
|
+
do {
|
|
147
|
+
const face = topology.loop_read_face(loop);
|
|
148
|
+
|
|
149
|
+
if (face !== NULL_POINTER && face_pool.is_allocated(face) && face_length[face] > 0) {
|
|
150
|
+
live++;
|
|
151
|
+
|
|
152
|
+
if (live === 1) {
|
|
153
|
+
left = loop;
|
|
154
|
+
} else if (live === 2) {
|
|
155
|
+
right = loop;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
loop = topology.loop_read_radial_next(loop);
|
|
160
|
+
} while (loop !== first_loop && loop !== NULL_POINTER);
|
|
161
|
+
|
|
162
|
+
if (live !== 2) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const left_face = topology.loop_read_face(left);
|
|
167
|
+
const right_face = topology.loop_read_face(right);
|
|
168
|
+
|
|
169
|
+
const cosine = (
|
|
170
|
+
face_normal[left_face * 3] * face_normal[right_face * 3]
|
|
171
|
+
+ face_normal[left_face * 3 + 1] * face_normal[right_face * 3 + 1]
|
|
172
|
+
+ face_normal[left_face * 3 + 2] * face_normal[right_face * 3 + 2]
|
|
173
|
+
) / (face_length[left_face] * face_length[right_face]);
|
|
174
|
+
|
|
175
|
+
if (cosine < smooth_cosine) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/*
|
|
180
|
+
A loop's edge runs from its own vertex to the next loop's, so on an edge's loop those two
|
|
181
|
+
are the edge's endpoints. Matching them up by vertex is what pairs the corner of one face
|
|
182
|
+
with the corner of the other *at the same point* -- the two faces may be wound oppositely,
|
|
183
|
+
which is exactly when the naive pairing would join the wrong ends.
|
|
184
|
+
*/
|
|
185
|
+
const left_next = topology.loop_read_next(left);
|
|
186
|
+
const right_next = topology.loop_read_next(right);
|
|
187
|
+
|
|
188
|
+
if (topology.loop_read_vertex(left) === topology.loop_read_vertex(right)) {
|
|
189
|
+
join(group, left, right);
|
|
190
|
+
join(group, left_next, right_next);
|
|
191
|
+
} else {
|
|
192
|
+
join(group, left, right_next);
|
|
193
|
+
join(group, left_next, right);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Each group's area-weighted sum, accumulated at its root.
|
|
199
|
+
* @type {Float64Array}
|
|
200
|
+
*/
|
|
201
|
+
const accumulated = new Float64Array(loop_pool.size * 3);
|
|
202
|
+
|
|
203
|
+
/*
|
|
204
|
+
Over faces and then their corners, which is the order `bt_mesh_compute_vertex_normals` sums in.
|
|
205
|
+
The order of a float64 sum is part of its answer, and reproducing it is what makes a mesh with
|
|
206
|
+
no crease byte-identical rather than merely equivalent.
|
|
207
|
+
*/
|
|
208
|
+
for (let face = 0; face < face_pool.size; face++) {
|
|
209
|
+
if (!face_pool.is_allocated(face)) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const first_loop = topology.face_read_loop(face);
|
|
214
|
+
|
|
215
|
+
if (first_loop === NULL_POINTER) {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const nx = face_normal[face * 3];
|
|
220
|
+
const ny = face_normal[face * 3 + 1];
|
|
221
|
+
const nz = face_normal[face * 3 + 2];
|
|
222
|
+
|
|
223
|
+
let loop = first_loop;
|
|
224
|
+
|
|
225
|
+
do {
|
|
226
|
+
const root = find(group, loop) * 3;
|
|
227
|
+
|
|
228
|
+
accumulated[root] += nx;
|
|
229
|
+
accumulated[root + 1] += ny;
|
|
230
|
+
accumulated[root + 2] += nz;
|
|
231
|
+
|
|
232
|
+
loop = topology.loop_read_next(loop);
|
|
233
|
+
} while (loop !== first_loop);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
for (let loop = 0; loop < loop_pool.size; loop++) {
|
|
237
|
+
if (!loop_pool.is_allocated(loop)) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (pinned.has(topology.loop_read_vertex(loop))) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const root = find(group, loop) * 3;
|
|
246
|
+
|
|
247
|
+
const x = accumulated[root];
|
|
248
|
+
const y = accumulated[root + 1];
|
|
249
|
+
const z = accumulated[root + 2];
|
|
250
|
+
|
|
251
|
+
const length = Math.sqrt(x * x + y * y + z * z);
|
|
252
|
+
|
|
253
|
+
if (length === 0) {
|
|
254
|
+
// An isolated corner, or a group whose faces cancel: no surface to take a normal from,
|
|
255
|
+
// so leave whatever it carried rather than inventing a direction.
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Scaled by the reciprocal rather than divided, because that is what
|
|
260
|
+
// `bt_mesh_compute_vertex_normals` does and `x * (1 / l)` is not `x / l`.
|
|
261
|
+
const scale = 1 / length;
|
|
262
|
+
|
|
263
|
+
scratch_normal[0] = x * scale;
|
|
264
|
+
scratch_normal[1] = y * scale;
|
|
265
|
+
scratch_normal[2] = z * scale;
|
|
266
|
+
|
|
267
|
+
normals.write(loop, scratch_normal, 0);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* @param {Uint32Array} group
|
|
273
|
+
* @param {number} index
|
|
274
|
+
* @returns {number}
|
|
275
|
+
*/
|
|
276
|
+
function find(group, index) {
|
|
277
|
+
let root = index;
|
|
278
|
+
|
|
279
|
+
while (group[root] !== root) {
|
|
280
|
+
group[root] = group[group[root]];
|
|
281
|
+
|
|
282
|
+
root = group[root];
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return root;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* @param {Uint32Array} group
|
|
290
|
+
* @param {number} a
|
|
291
|
+
* @param {number} b
|
|
292
|
+
*/
|
|
293
|
+
function join(group, a, b) {
|
|
294
|
+
const root_a = find(group, a);
|
|
295
|
+
const root_b = find(group, b);
|
|
296
|
+
|
|
297
|
+
if (root_a !== root_b) {
|
|
298
|
+
group[root_b] = root_a;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Tangents of a mesh, written into its tangent channel.
|
|
3
3
|
*
|
|
4
4
|
* A tangent is a direction *in the texture parameterization*, so where the mesh carries a `UV0` this
|
|
5
|
-
* is Lengyel's per-triangle solve accumulated per
|
|
5
|
+
* is Lengyel's per-triangle solve accumulated per **wedge** and orthogonalized against the normal —
|
|
6
6
|
* {@link geometry_build_tangents}, the same pass {@link Geometry#computeTangents} runs, so an asset
|
|
7
7
|
* that goes through the virtual-geometry builder gets the frame it would have got anywhere else.
|
|
8
8
|
* Where the mesh carries no UVs there is no parameterization to be tangent to, and the frame becomes
|
|
@@ -12,20 +12,24 @@
|
|
|
12
12
|
* the format's flat default, which is parallel to the normal over a whole band of any closed
|
|
13
13
|
* surface and degenerates the frame there.
|
|
14
14
|
*
|
|
15
|
+
* **Per wedge, and that is not a re-indexing of a per-vertex solve.** Lengyel's accumulation is over
|
|
16
|
+
* the triangles that share a value, and at a chart boundary the two sides do not: their UVs run in
|
|
17
|
+
* different directions and averaging them gives a tangent that is tangent to neither. So the solve
|
|
18
|
+
* is fed a mesh whose *vertices are the wedges* — the same substitution the cluster gather makes,
|
|
19
|
+
* and for the same reason — and the answer comes back one per wedge, which is then written to every
|
|
20
|
+
* corner of it.
|
|
21
|
+
*
|
|
15
22
|
* `pinned` carries the same meaning and the same reason as it does for
|
|
16
23
|
* {@link vgeo_compute_vertex_normals}: a vertex two groups share must carry byte-identical values in
|
|
17
24
|
* both, or the seam a cut is allowed to put between them shades as a crease.
|
|
18
25
|
*
|
|
19
|
-
*
|
|
20
|
-
* slots needs no compaction and no remap — a released slot is simply a triangle corner nothing
|
|
21
|
-
* names.
|
|
22
|
-
*
|
|
23
|
-
* @param {VirtualGeometryMesh} mesh whose tangent and normal layers are sized by the vertex pool
|
|
26
|
+
* @param {VirtualGeometryMesh} mesh whose tangent and normal layers are sized by the loop pool
|
|
24
27
|
* @param {Set<number>} pinned vertex ids to leave exactly as they are; empty for a mesh nothing has
|
|
25
28
|
* locked yet
|
|
29
|
+
* @param {BtWedgeSet} wedges which corners of each vertex shade as one
|
|
26
30
|
*
|
|
27
31
|
* @author Alex Goldring
|
|
28
32
|
* @copyright Company Named Limited (c) 2026
|
|
29
33
|
*/
|
|
30
|
-
export function vgeo_compute_vertex_tangents(mesh: VirtualGeometryMesh, pinned: Set<number
|
|
34
|
+
export function vgeo_compute_vertex_tangents(mesh: VirtualGeometryMesh, pinned: Set<number>, wedges: BtWedgeSet): void;
|
|
31
35
|
//# sourceMappingURL=vgeo_compute_vertex_tangents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_compute_vertex_tangents.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,gFAPW,IAAI,MAAM,CAAC,4BA2GrB"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { assert } from "../../../../../../core/assert.js";
|
|
2
|
+
import { build_tangent_from_normal } from "../../../normals/build_tangent_from_normal.js";
|
|
3
|
+
import { geometry_build_tangents } from "../../../normals/geometry_build_tangents.js";
|
|
4
|
+
import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* One corner's tangent, on its way into the format's channel.
|
|
8
|
+
* @type {Float32Array}
|
|
9
|
+
*/
|
|
10
|
+
const scratch_tangent = new Float32Array(4);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* One corner's normal, read back out of the channel it ships in.
|
|
14
|
+
* @type {Float32Array}
|
|
15
|
+
*/
|
|
16
|
+
const scratch_normal = new Float32Array(3);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Tangents of a mesh, written into its tangent channel.
|
|
20
|
+
*
|
|
21
|
+
* A tangent is a direction *in the texture parameterization*, so where the mesh carries a `UV0` this
|
|
22
|
+
* is Lengyel's per-triangle solve accumulated per **wedge** and orthogonalized against the normal —
|
|
23
|
+
* {@link geometry_build_tangents}, the same pass {@link Geometry#computeTangents} runs, so an asset
|
|
24
|
+
* that goes through the virtual-geometry builder gets the frame it would have got anywhere else.
|
|
25
|
+
* Where the mesh carries no UVs there is no parameterization to be tangent to, and the frame becomes
|
|
26
|
+
* an arbitrary but well-conditioned basis around the normal — Frisvad's, via
|
|
27
|
+
* {@link build_tangent_from_normal}. That is not a fallback for a broken input: a shading model that
|
|
28
|
+
* reads a tangent frame reads one whether or not the surface is textured, and the alternative is
|
|
29
|
+
* the format's flat default, which is parallel to the normal over a whole band of any closed
|
|
30
|
+
* surface and degenerates the frame there.
|
|
31
|
+
*
|
|
32
|
+
* **Per wedge, and that is not a re-indexing of a per-vertex solve.** Lengyel's accumulation is over
|
|
33
|
+
* the triangles that share a value, and at a chart boundary the two sides do not: their UVs run in
|
|
34
|
+
* different directions and averaging them gives a tangent that is tangent to neither. So the solve
|
|
35
|
+
* is fed a mesh whose *vertices are the wedges* — the same substitution the cluster gather makes,
|
|
36
|
+
* and for the same reason — and the answer comes back one per wedge, which is then written to every
|
|
37
|
+
* corner of it.
|
|
38
|
+
*
|
|
39
|
+
* `pinned` carries the same meaning and the same reason as it does for
|
|
40
|
+
* {@link vgeo_compute_vertex_normals}: a vertex two groups share must carry byte-identical values in
|
|
41
|
+
* both, or the seam a cut is allowed to put between them shades as a crease.
|
|
42
|
+
*
|
|
43
|
+
* @param {VirtualGeometryMesh} mesh whose tangent and normal layers are sized by the loop pool
|
|
44
|
+
* @param {Set<number>} pinned vertex ids to leave exactly as they are; empty for a mesh nothing has
|
|
45
|
+
* locked yet
|
|
46
|
+
* @param {BtWedgeSet} wedges which corners of each vertex shade as one
|
|
47
|
+
*
|
|
48
|
+
* @author Alex Goldring
|
|
49
|
+
* @copyright Company Named Limited (c) 2026
|
|
50
|
+
*/
|
|
51
|
+
export function vgeo_compute_vertex_tangents(mesh, pinned, wedges) {
|
|
52
|
+
const tangents = mesh.layers[VGEO_ATTRIBUTE.TANGENT];
|
|
53
|
+
const normals = mesh.layers[VGEO_ATTRIBUTE.NORMAL];
|
|
54
|
+
|
|
55
|
+
assert.notNull(tangents, 'mesh tangent channel');
|
|
56
|
+
assert.notNull(normals, 'mesh normal channel');
|
|
57
|
+
|
|
58
|
+
const topology = mesh.topology;
|
|
59
|
+
|
|
60
|
+
const loop_pool = topology.loops;
|
|
61
|
+
|
|
62
|
+
const uv = mesh.layers[VGEO_ATTRIBUTE.UV0];
|
|
63
|
+
|
|
64
|
+
if (uv === null) {
|
|
65
|
+
for (let loop = 0; loop < loop_pool.size; loop++) {
|
|
66
|
+
if (!loop_pool.is_allocated(loop)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (pinned.has(topology.loop_read_vertex(loop))) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
normals.read(scratch_normal, 0, loop);
|
|
75
|
+
|
|
76
|
+
build_tangent_from_normal(
|
|
77
|
+
scratch_normal[0], scratch_normal[1], scratch_normal[2], 0, scratch_tangent
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
tangents.write(loop, scratch_tangent, 0);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const wedge_count = wedges.count;
|
|
87
|
+
|
|
88
|
+
const position_data = new Float32Array(wedge_count * 3);
|
|
89
|
+
const normal_data = new Float32Array(wedge_count * 3);
|
|
90
|
+
const uv_data = new Float32Array(wedge_count * 2);
|
|
91
|
+
|
|
92
|
+
const face_pool = topology.faces;
|
|
93
|
+
|
|
94
|
+
const indices = [];
|
|
95
|
+
|
|
96
|
+
for (let face = 0; face < face_pool.size; face++) {
|
|
97
|
+
if (!face_pool.is_allocated(face)) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const first_loop = topology.face_read_loop(face);
|
|
102
|
+
|
|
103
|
+
let loop = first_loop;
|
|
104
|
+
|
|
105
|
+
for (let corner = 0; corner < 3; corner++) {
|
|
106
|
+
const wedge = wedges.find(wedges.of_loop[loop]);
|
|
107
|
+
|
|
108
|
+
indices.push(wedge);
|
|
109
|
+
|
|
110
|
+
topology.vertex_read_coordinate(
|
|
111
|
+
position_data, wedge * 3, topology.loop_read_vertex(loop)
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
normals.read(normal_data, wedge * 3, loop);
|
|
115
|
+
uv.read(uv_data, wedge * 2, loop);
|
|
116
|
+
|
|
117
|
+
loop = topology.loop_read_next(loop);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
assert.equal(loop, first_loop, `face ${face} is not an allocated triangle`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const tangent_data = new Float32Array(wedge_count * 4);
|
|
124
|
+
|
|
125
|
+
geometry_build_tangents(
|
|
126
|
+
indices.length, indices, wedge_count,
|
|
127
|
+
uv_data, position_data, normal_data, tangent_data
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
for (let loop = 0; loop < loop_pool.size; loop++) {
|
|
131
|
+
if (!loop_pool.is_allocated(loop)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (pinned.has(topology.loop_read_vertex(loop))) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const address = wedges.find(wedges.of_loop[loop]) * 4;
|
|
140
|
+
|
|
141
|
+
// A tangent that came out non-finite is a frame the shading model cannot use and the
|
|
142
|
+
// octahedral encoder cannot represent, and it would reach the asset as a silently wrong
|
|
143
|
+
// word. Nothing in the solve should produce one on a mesh normalization has already passed.
|
|
144
|
+
assert.isFinite(tangent_data[address], 'tangent x');
|
|
145
|
+
assert.isFinite(tangent_data[address + 1], 'tangent y');
|
|
146
|
+
assert.isFinite(tangent_data[address + 2], 'tangent z');
|
|
147
|
+
assert.isFinite(tangent_data[address + 3], 'tangent handedness');
|
|
148
|
+
|
|
149
|
+
tangents.write(loop, tangent_data, address);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -34,13 +34,20 @@
|
|
|
34
34
|
* and the fuse would then pick one of those halves to keep. Derived after it, the vertex has its
|
|
35
35
|
* whole ring. Channels the source did carry are left exactly as they came.
|
|
36
36
|
*
|
|
37
|
+
* **And the weld no longer flattens what it fused.** It merges *positions*, because connectivity is
|
|
38
|
+
* what it is for; the corners it re-points keep the values they arrived with, so a vertex the source
|
|
39
|
+
* split to say its two sides shade differently comes out of here still saying it. That is
|
|
40
|
+
* `WEDGE_PLAN_2026_09_18.md` §6.2, and the line it deleted was a whole module.
|
|
41
|
+
*
|
|
37
42
|
* @param {VirtualGeometryMesh} mesh mutated in place
|
|
38
43
|
* @param {number} weld_ratio fraction of the bounding-box diagonal; see
|
|
39
44
|
* {@link VGeoBuildOptions#weld_ratio}
|
|
45
|
+
* @param {number} [crease_angle] degrees; see {@link VGeoBuildOptions#crease_angle}. Only reaches a
|
|
46
|
+
* channel the source did not author.
|
|
40
47
|
* @returns {number} the object-space distance the ratio came to for this mesh
|
|
41
48
|
*
|
|
42
49
|
* @author Alex Goldring
|
|
43
50
|
* @copyright Company Named Limited (c) 2026
|
|
44
51
|
*/
|
|
45
|
-
export function vgeo_normalize_source(mesh: VirtualGeometryMesh, weld_ratio: number): number;
|
|
52
|
+
export function vgeo_normalize_source(mesh: VirtualGeometryMesh, weld_ratio: number, crease_angle?: number): number;
|
|
46
53
|
//# sourceMappingURL=vgeo_normalize_source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_normalize_source.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js"],"names":[],"mappings":"AAiCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,6EATW,MAAM,iBAEN,MAAM,GAEJ,MAAM,CA+ClB"}
|
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
import { assert } from "
|
|
1
|
+
import { assert } from "../../../../../../core/assert.js";
|
|
2
2
|
import {
|
|
3
3
|
bt_mesh_cleanup_faceless_references
|
|
4
|
-
} from "
|
|
4
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_cleanup_faceless_references.js";
|
|
5
5
|
import {
|
|
6
6
|
bt_mesh_collapse_short_edges
|
|
7
|
-
} from "
|
|
7
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/edge/bt_mesh_collapse_short_edges.js";
|
|
8
8
|
import {
|
|
9
9
|
bt_mesh_fuse_duplicate_edges
|
|
10
|
-
} from "
|
|
10
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js";
|
|
11
11
|
import {
|
|
12
12
|
bt_mesh_kill_degenerate_faces
|
|
13
|
-
} from "
|
|
13
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/face/bt_mesh_kill_degenerate_faces.js";
|
|
14
14
|
import {
|
|
15
15
|
bt_merge_vertices_by_distance
|
|
16
|
-
} from "
|
|
16
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/vertex/bt_merge_vertices_by_distance.js";
|
|
17
17
|
import {
|
|
18
18
|
bt_mesh_relative_merge_distance
|
|
19
|
-
} from "
|
|
20
|
-
import { bt_mesh_validate } from "
|
|
21
|
-
import { VGEO_ATTRIBUTE } from "
|
|
19
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_relative_merge_distance.js";
|
|
20
|
+
import { bt_mesh_validate } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js";
|
|
21
|
+
import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
|
|
22
|
+
import { vgeo_mesh_wedges } from "../../format/attribute/vgeo_mesh_wedges.js";
|
|
23
|
+
import { VGEO_CREASE_ANGLE } from "./VGEO_CREASE_ANGLE.js";
|
|
22
24
|
import { vgeo_compute_vertex_normals } from "./vgeo_compute_vertex_normals.js";
|
|
23
25
|
import { vgeo_compute_vertex_tangents } from "./vgeo_compute_vertex_tangents.js";
|
|
24
26
|
|
|
@@ -65,15 +67,22 @@ const NOTHING_PINNED = new Set();
|
|
|
65
67
|
* and the fuse would then pick one of those halves to keep. Derived after it, the vertex has its
|
|
66
68
|
* whole ring. Channels the source did carry are left exactly as they came.
|
|
67
69
|
*
|
|
70
|
+
* **And the weld no longer flattens what it fused.** It merges *positions*, because connectivity is
|
|
71
|
+
* what it is for; the corners it re-points keep the values they arrived with, so a vertex the source
|
|
72
|
+
* split to say its two sides shade differently comes out of here still saying it. That is
|
|
73
|
+
* `WEDGE_PLAN_2026_09_18.md` §6.2, and the line it deleted was a whole module.
|
|
74
|
+
*
|
|
68
75
|
* @param {VirtualGeometryMesh} mesh mutated in place
|
|
69
76
|
* @param {number} weld_ratio fraction of the bounding-box diagonal; see
|
|
70
77
|
* {@link VGeoBuildOptions#weld_ratio}
|
|
78
|
+
* @param {number} [crease_angle] degrees; see {@link VGeoBuildOptions#crease_angle}. Only reaches a
|
|
79
|
+
* channel the source did not author.
|
|
71
80
|
* @returns {number} the object-space distance the ratio came to for this mesh
|
|
72
81
|
*
|
|
73
82
|
* @author Alex Goldring
|
|
74
83
|
* @copyright Company Named Limited (c) 2026
|
|
75
84
|
*/
|
|
76
|
-
export function vgeo_normalize_source(mesh, weld_ratio) {
|
|
85
|
+
export function vgeo_normalize_source(mesh, weld_ratio, crease_angle = VGEO_CREASE_ANGLE) {
|
|
77
86
|
const topology = mesh.topology;
|
|
78
87
|
|
|
79
88
|
const weld_distance = bt_mesh_relative_merge_distance(topology, weld_ratio);
|
|
@@ -101,11 +110,17 @@ export function vgeo_normalize_source(mesh, weld_ratio) {
|
|
|
101
110
|
// Normals first: the tangent solve reads them, and a synthesized normal beside an authored
|
|
102
111
|
// tangent is still the pair the frame is built from.
|
|
103
112
|
if (mesh.synthesized[VGEO_ATTRIBUTE.NORMAL]) {
|
|
104
|
-
vgeo_compute_vertex_normals(mesh, NOTHING_PINNED);
|
|
113
|
+
vgeo_compute_vertex_normals(mesh, NOTHING_PINNED, crease_angle);
|
|
105
114
|
}
|
|
106
115
|
|
|
116
|
+
/*
|
|
117
|
+
And the wedges only once the normals are settled, because a crease the pass above just made is
|
|
118
|
+
one of the things a wedge is. A tangent it has not computed yet is uniform and splits nothing,
|
|
119
|
+
and the one it is about to compute is a function of the wedge -- so this partition is the same
|
|
120
|
+
one `vgeo_build_leaf_frontier` reads back afterwards, with or without the tangent in it.
|
|
121
|
+
*/
|
|
107
122
|
if (mesh.synthesized[VGEO_ATTRIBUTE.TANGENT]) {
|
|
108
|
-
vgeo_compute_vertex_tangents(mesh, NOTHING_PINNED);
|
|
123
|
+
vgeo_compute_vertex_tangents(mesh, NOTHING_PINNED, vgeo_mesh_wedges(topology));
|
|
109
124
|
}
|
|
110
125
|
|
|
111
126
|
return weld_distance;
|