@woosh/meep-engine 3.44.0 → 3.45.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/collection/array/array_sort_insertion_ascending.d.ts +19 -0
- package/src/core/collection/array/array_sort_insertion_ascending.d.ts.map +1 -0
- package/src/core/collection/array/array_sort_insertion_ascending.js +31 -0
- package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts +27 -0
- package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.d.ts.map +1 -0
- package/src/core/geom/3d/aabb/aabb3_array_round_outward_f32.js +39 -0
- package/src/core/geom/3d/aabb/aabb3_from_v3_array.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +4 -1
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +2 -2
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +1 -1
- package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts +21 -0
- package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.d.ts.map +1 -0
- package/src/core/geom/3d/pose/pose3_apply_inverse_point_array.js +36 -0
- package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts +25 -0
- package/src/core/geom/3d/pose/pose3_apply_point_array.d.ts.map +1 -0
- package/src/core/geom/3d/pose/pose3_apply_point_array.js +40 -0
- package/src/core/geom/3d/pose/pose3_compose_array.d.ts +28 -0
- package/src/core/geom/3d/pose/pose3_compose_array.d.ts.map +1 -0
- package/src/core/geom/3d/pose/pose3_compose_array.js +41 -0
- package/src/core/geom/3d/pose/pose3_to_local_array.d.ts +29 -0
- package/src/core/geom/3d/pose/pose3_to_local_array.d.ts.map +1 -0
- package/src/core/geom/3d/pose/pose3_to_local_array.js +42 -0
- package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts +28 -0
- package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_clamp_angle_array.js +66 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts +22 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_left_array.js +30 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts +23 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js +31 -0
- package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts +26 -0
- package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.d.ts.map +1 -0
- package/src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js +46 -0
- package/src/core/geom/vec3/v3_distance_array.d.ts +11 -0
- package/src/core/geom/vec3/v3_distance_array.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_distance_array.js +19 -0
- package/src/core/geom/vec3/v3_normalize_array_checked.d.ts +23 -0
- package/src/core/geom/vec3/v3_normalize_array_checked.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_normalize_array_checked.js +49 -0
- package/src/core/geom/vec3/v3_reject_array.d.ts +15 -0
- package/src/core/geom/vec3/v3_reject_array.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_reject_array.js +32 -0
- package/src/core/graph/csr/csr_build_incidence.d.ts +26 -0
- package/src/core/graph/csr/csr_build_incidence.d.ts.map +1 -0
- package/src/core/graph/csr/csr_build_incidence.js +71 -0
- package/src/core/graph/csr/csr_graph_color_greedy.d.ts +25 -0
- package/src/core/graph/csr/csr_graph_color_greedy.d.ts.map +1 -0
- package/src/core/graph/csr/csr_graph_color_greedy.js +83 -0
- package/src/core/graph/csr/csr_graph_validate_coloring.d.ts +15 -0
- package/src/core/graph/csr/csr_graph_validate_coloring.d.ts.map +1 -0
- package/src/core/graph/csr/csr_graph_validate_coloring.js +33 -0
- package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts +26 -0
- package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.d.ts.map +1 -0
- package/src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js +71 -0
- package/src/core/math/max2_exact.d.ts +15 -0
- package/src/core/math/max2_exact.d.ts.map +1 -0
- package/src/core/math/max2_exact.js +30 -0
- package/src/core/math/min2_exact.d.ts +20 -0
- package/src/core/math/min2_exact.d.ts.map +1 -0
- package/src/core/math/min2_exact.js +35 -0
- package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKGoalSystem.js +3 -19
- package/src/engine/ecs/parent/parent_entity_model_of.d.ts +17 -0
- package/src/engine/ecs/parent/parent_entity_model_of.d.ts.map +1 -0
- package/src/engine/ecs/parent/parent_entity_model_of.js +26 -0
- package/src/engine/ecs/transform/t64_read_pose_array.d.ts +15 -0
- package/src/engine/ecs/transform/t64_read_pose_array.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_read_pose_array.js +24 -0
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +2 -0
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -1
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +10 -21
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +5 -0
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +48 -2
- package/src/engine/graphics3/AnimationSystem.d.ts +5 -0
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +47 -2
- package/src/engine/graphics3/register_clips.d.ts +29 -0
- package/src/engine/graphics3/register_clips.d.ts.map +1 -1
- package/src/engine/graphics3/register_clips.js +52 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +9 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -1
- package/src/engine/physics/cloth/PLAN.md +10 -8
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +22 -0
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +51 -19
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +16 -2
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +19 -24
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +7 -0
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/ClothColliderIndex.js +85 -67
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +19 -101
- package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +2 -5
- package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_pack.js +7 -15
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +16 -61
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +0 -1
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +6 -19
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +1 -2
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +3 -12
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +40 -130
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +17 -58
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +3 -3
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +44 -104
- package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_geodesic.js +6 -13
- package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_holds.js +15 -40
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +45 -79
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +7 -27
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +30 -62
- package/src/engine/physics/cloth/playground/cloth_playground_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/cloth_playground_build.js +2 -3
- package/src/engine/physics/cloth/playground/collide_main.js +2 -28
- package/src/engine/physics/cloth/playground/garment_main.js +4 -19
- package/src/engine/physics/cloth/playground/main.js +6 -48
- package/src/engine/physics/cloth/playground/rig_main.js +947 -955
- package/src/engine/physics/cloth/playground/wind_main.js +8 -7
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +16 -76
- package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts +10 -8
- package/src/engine/physics/cloth/solver/cloth_color_particles.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_color_particles.js +30 -102
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.js +3 -2
- package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_hold_line.js +2 -14
- package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts +21 -0
- package/src/engine/physics/cloth/solver/cloth_kinetic_energy.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_kinetic_energy.js +45 -0
- package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts +32 -0
- package/src/engine/physics/cloth/solver/cloth_particle_coupling.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_particle_coupling.js +133 -0
- package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts +16 -0
- package/src/engine/physics/cloth/solver/cloth_particle_of_source.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_particle_of_source.js +19 -0
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_self_find.js +6 -55
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +30 -65
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +6 -28
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +2 -3
- package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts +21 -0
- package/src/engine/physics/cloth/solver/cloth_stretch_residual.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_stretch_residual.js +54 -0
- package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts +15 -0
- package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_vertex_accumulator.js +28 -0
- package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts +30 -0
- package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_worst_tether_ratio.js +56 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +3 -17
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +2 -1
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -25
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +3 -1
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/cloth_sample_air.js +40 -62
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/ContactProbeSystem.js +2 -18
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +9 -50
- package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts +24 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_domain_bounds.js +42 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts +25 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/fluid_sample_velocity_world_mps.js +40 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -1
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +40 -90
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/capsule_contacts.js +3 -5
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +2 -14
- package/src/engine/physics/narrowphase/hull_sphere_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/hull_sphere_contact.js +2 -5
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/narrowphase_step.js +13 -32
- package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/sphere_box_contact.js +2 -5
- package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -1
- package/src/format/texture/basis/transcode/etc1s_to_astc.js +2 -1
- package/src/shade/playground/image_decode_bench/main.js +2 -1
- package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/diff_traced_against_rasterized.js +2 -1
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +2 -1
- package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -1
- package/src/shade/playground/ssr_variance/statistics.js +2 -1
- package/src/shade/playground/texture_encode/main.d.ts.map +1 -1
- package/src/shade/playground/texture_encode/main.js +2 -1
- package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/measure.js +2 -1
- package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/gpu_database_check_links.js +2 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +3 -2
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +2 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +2 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +2 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +3 -2
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.js +2 -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 +2 -1
- 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 +3 -2
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +3 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hamilton product with the right operand conjugated, `out = a ⊗ b*`, both read from arrays.
|
|
3
|
+
*
|
|
4
|
+
* For unit quaternions the conjugate is the inverse, so this is `a ⊗ b⁻¹`: the world-frame rotation
|
|
5
|
+
* that takes orientation `b` to orientation `a` — the turn a holder made since a hold began, the
|
|
6
|
+
* rotation a body must make to reach a target. Callers used to build `b*` in a scratch array, or pass
|
|
7
|
+
* its components negated, to {@link quat3_multiply_array}; the conjugate's signs are folded into the
|
|
8
|
+
* product here instead.
|
|
9
|
+
*
|
|
10
|
+
* Sign convention: `(x, y, z, w)` — `w` last, matching {@link Quaternion} and the rest of the
|
|
11
|
+
* `core/geom/3d/quaternion/` family.
|
|
12
|
+
*
|
|
13
|
+
* `out` may be `a` or `b`: all eight components are read before the first write.
|
|
14
|
+
*
|
|
15
|
+
* @param {number[]|Float32Array|Float64Array} out
|
|
16
|
+
* @param {number} out_offset offset into `out`; receives 4 floats (x, y, z, w)
|
|
17
|
+
* @param {number[]|Float32Array|Float64Array} a `[x, y, z, w]`
|
|
18
|
+
* @param {number} a_offset
|
|
19
|
+
* @param {number[]|Float32Array|Float64Array} b `[x, y, z, w]`, the operand that is conjugated
|
|
20
|
+
* @param {number} b_offset
|
|
21
|
+
*/
|
|
22
|
+
export function quat3_multiply_conjugate_right_array(out: number[] | Float32Array | Float64Array, out_offset: number, a: number[] | Float32Array | Float64Array, a_offset: number, b: number[] | Float32Array | Float64Array, b_offset: number): void;
|
|
23
|
+
//# sourceMappingURL=quat3_multiply_conjugate_right_array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quat3_multiply_conjugate_right_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quaternion/quat3_multiply_conjugate_right_array.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,0DAPW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,QAWhB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hamilton product with the right operand conjugated, `out = a ⊗ b*`, both read from arrays.
|
|
3
|
+
*
|
|
4
|
+
* For unit quaternions the conjugate is the inverse, so this is `a ⊗ b⁻¹`: the world-frame rotation
|
|
5
|
+
* that takes orientation `b` to orientation `a` — the turn a holder made since a hold began, the
|
|
6
|
+
* rotation a body must make to reach a target. Callers used to build `b*` in a scratch array, or pass
|
|
7
|
+
* its components negated, to {@link quat3_multiply_array}; the conjugate's signs are folded into the
|
|
8
|
+
* product here instead.
|
|
9
|
+
*
|
|
10
|
+
* Sign convention: `(x, y, z, w)` — `w` last, matching {@link Quaternion} and the rest of the
|
|
11
|
+
* `core/geom/3d/quaternion/` family.
|
|
12
|
+
*
|
|
13
|
+
* `out` may be `a` or `b`: all eight components are read before the first write.
|
|
14
|
+
*
|
|
15
|
+
* @param {number[]|Float32Array|Float64Array} out
|
|
16
|
+
* @param {number} out_offset offset into `out`; receives 4 floats (x, y, z, w)
|
|
17
|
+
* @param {number[]|Float32Array|Float64Array} a `[x, y, z, w]`
|
|
18
|
+
* @param {number} a_offset
|
|
19
|
+
* @param {number[]|Float32Array|Float64Array} b `[x, y, z, w]`, the operand that is conjugated
|
|
20
|
+
* @param {number} b_offset
|
|
21
|
+
*/
|
|
22
|
+
export function quat3_multiply_conjugate_right_array(out, out_offset, a, a_offset, b, b_offset) {
|
|
23
|
+
const ax = a[a_offset], ay = a[a_offset + 1], az = a[a_offset + 2], aw = a[a_offset + 3];
|
|
24
|
+
const bx = b[b_offset], by = b[b_offset + 1], bz = b[b_offset + 2], bw = b[b_offset + 3];
|
|
25
|
+
|
|
26
|
+
// quat3_multiply with (bx, by, bz) negated
|
|
27
|
+
out[out_offset] = ax * bw - aw * bx - ay * bz + az * by;
|
|
28
|
+
out[out_offset + 1] = ay * bw - aw * by + ax * bz - az * bx;
|
|
29
|
+
out[out_offset + 2] = az * bw - aw * bz - ax * by + ay * bx;
|
|
30
|
+
out[out_offset + 3] = aw * bw + ax * bx + ay * by + az * bz;
|
|
31
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The face normal of triangle `abc`, NOT normalised: the raw cross product `(c − b) × (a − b)`, whose
|
|
3
|
+
* magnitude is twice the triangle's area and whose direction follows the counter-clockwise winding
|
|
4
|
+
* `a → b → c`, the same winding {@link tri3_compute_normal} uses.
|
|
5
|
+
*
|
|
6
|
+
* The magnitude is the point. A pass that accumulates one normal per incident face and normalises at
|
|
7
|
+
* the end wants each face to pull in proportion to how much surface it is, so that a sliver beside a
|
|
8
|
+
* large face hardly moves the result and retriangulating the same surface does not change it. A
|
|
9
|
+
* triangle with no area contributes a zero vector, which is the right vote for nothing, where a
|
|
10
|
+
* normalising helper has to invent some unit vector.
|
|
11
|
+
*
|
|
12
|
+
* Each corner is its own array and offset, so corners may live in one shared position buffer
|
|
13
|
+
* (`positions, index * 3`) or anywhere else. `out` may alias any of them.
|
|
14
|
+
*
|
|
15
|
+
* @param {number[]|Float32Array|Float64Array} out
|
|
16
|
+
* @param {number} out_offset
|
|
17
|
+
* @param {number[]|Float32Array|Float64Array} a
|
|
18
|
+
* @param {number} a_offset
|
|
19
|
+
* @param {number[]|Float32Array|Float64Array} b
|
|
20
|
+
* @param {number} b_offset
|
|
21
|
+
* @param {number[]|Float32Array|Float64Array} c
|
|
22
|
+
* @param {number} c_offset
|
|
23
|
+
* @returns {void}
|
|
24
|
+
*/
|
|
25
|
+
export function tri3_compute_normal_area_weighted_array(out: number[] | Float32Array | Float64Array, out_offset: number, a: number[] | Float32Array | Float64Array, a_offset: number, b: number[] | Float32Array | Float64Array, b_offset: number, c: number[] | Float32Array | Float64Array, c_offset: number): void;
|
|
26
|
+
//# sourceMappingURL=tri3_compute_normal_area_weighted_array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tri3_compute_normal_area_weighted_array.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/triangle/tri3_compute_normal_area_weighted_array.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,6DAVW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,GACJ,IAAI,CAuBhB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The face normal of triangle `abc`, NOT normalised: the raw cross product `(c − b) × (a − b)`, whose
|
|
3
|
+
* magnitude is twice the triangle's area and whose direction follows the counter-clockwise winding
|
|
4
|
+
* `a → b → c`, the same winding {@link tri3_compute_normal} uses.
|
|
5
|
+
*
|
|
6
|
+
* The magnitude is the point. A pass that accumulates one normal per incident face and normalises at
|
|
7
|
+
* the end wants each face to pull in proportion to how much surface it is, so that a sliver beside a
|
|
8
|
+
* large face hardly moves the result and retriangulating the same surface does not change it. A
|
|
9
|
+
* triangle with no area contributes a zero vector, which is the right vote for nothing, where a
|
|
10
|
+
* normalising helper has to invent some unit vector.
|
|
11
|
+
*
|
|
12
|
+
* Each corner is its own array and offset, so corners may live in one shared position buffer
|
|
13
|
+
* (`positions, index * 3`) or anywhere else. `out` may alias any of them.
|
|
14
|
+
*
|
|
15
|
+
* @param {number[]|Float32Array|Float64Array} out
|
|
16
|
+
* @param {number} out_offset
|
|
17
|
+
* @param {number[]|Float32Array|Float64Array} a
|
|
18
|
+
* @param {number} a_offset
|
|
19
|
+
* @param {number[]|Float32Array|Float64Array} b
|
|
20
|
+
* @param {number} b_offset
|
|
21
|
+
* @param {number[]|Float32Array|Float64Array} c
|
|
22
|
+
* @param {number} c_offset
|
|
23
|
+
* @returns {void}
|
|
24
|
+
*/
|
|
25
|
+
export function tri3_compute_normal_area_weighted_array(
|
|
26
|
+
out, out_offset,
|
|
27
|
+
a, a_offset,
|
|
28
|
+
b, b_offset,
|
|
29
|
+
c, c_offset
|
|
30
|
+
) {
|
|
31
|
+
const bx = b[b_offset];
|
|
32
|
+
const by = b[b_offset + 1];
|
|
33
|
+
const bz = b[b_offset + 2];
|
|
34
|
+
|
|
35
|
+
const cb_x = c[c_offset] - bx;
|
|
36
|
+
const cb_y = c[c_offset + 1] - by;
|
|
37
|
+
const cb_z = c[c_offset + 2] - bz;
|
|
38
|
+
|
|
39
|
+
const ab_x = a[a_offset] - bx;
|
|
40
|
+
const ab_y = a[a_offset + 1] - by;
|
|
41
|
+
const ab_z = a[a_offset + 2] - bz;
|
|
42
|
+
|
|
43
|
+
out[out_offset] = cb_y * ab_z - cb_z * ab_y;
|
|
44
|
+
out[out_offset + 1] = cb_z * ab_x - cb_x * ab_z;
|
|
45
|
+
out[out_offset + 2] = cb_x * ab_y - cb_y * ab_x;
|
|
46
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Euclidean distance between two 3-vectors stored in arrays.
|
|
3
|
+
*
|
|
4
|
+
* @param {number[]|Float32Array|Float64Array} a
|
|
5
|
+
* @param {number} a_offset
|
|
6
|
+
* @param {number[]|Float32Array|Float64Array} b
|
|
7
|
+
* @param {number} b_offset
|
|
8
|
+
* @returns {number}
|
|
9
|
+
*/
|
|
10
|
+
export function v3_distance_array(a: number[] | Float32Array | Float64Array, a_offset: number, b: number[] | Float32Array | Float64Array, b_offset: number): number;
|
|
11
|
+
//# sourceMappingURL=v3_distance_array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3_distance_array.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/vec3/v3_distance_array.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qCANW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,KACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,YAClC,MAAM,GACJ,MAAM,CAWlB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Euclidean distance between two 3-vectors stored in arrays.
|
|
3
|
+
*
|
|
4
|
+
* @param {number[]|Float32Array|Float64Array} a
|
|
5
|
+
* @param {number} a_offset
|
|
6
|
+
* @param {number[]|Float32Array|Float64Array} b
|
|
7
|
+
* @param {number} b_offset
|
|
8
|
+
* @returns {number}
|
|
9
|
+
*/
|
|
10
|
+
export function v3_distance_array(
|
|
11
|
+
a, a_offset,
|
|
12
|
+
b, b_offset
|
|
13
|
+
) {
|
|
14
|
+
const dx = b[b_offset] - a[a_offset];
|
|
15
|
+
const dy = b[b_offset + 1] - a[a_offset + 1];
|
|
16
|
+
const dz = b[b_offset + 2] - a[a_offset + 2];
|
|
17
|
+
|
|
18
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalise a vector, reporting whether it had a direction to normalise.
|
|
3
|
+
*
|
|
4
|
+
* Unlike {@link v3_normalize_array}, which passes a zero vector through and scales anything else, a
|
|
5
|
+
* vector whose squared length is below `epsilon_sqr` is refused: `false` is returned and `output` is
|
|
6
|
+
* not written at all, so with `output === input` the vector is left as it was. A vector that short
|
|
7
|
+
* has a direction made of rounding, and a caller that builds a rotation from it wants to know.
|
|
8
|
+
*
|
|
9
|
+
* So is a vector with no finite squared length — a NaN component, an infinite one, or one so long
|
|
10
|
+
* its square overflows — since none of those leaves a unit vector to write.
|
|
11
|
+
*
|
|
12
|
+
* `output` may alias `input`.
|
|
13
|
+
*
|
|
14
|
+
* @param {number[]|Float32Array|Float64Array} output
|
|
15
|
+
* @param {number} output_offset
|
|
16
|
+
* @param {number[]|Float32Array|Float64Array} input
|
|
17
|
+
* @param {number} input_offset
|
|
18
|
+
* @param {number} epsilon_sqr squared length below which the vector has no direction; positive, since at
|
|
19
|
+
* zero a zero vector would pass and normalise to NaN
|
|
20
|
+
* @returns {boolean} true when `output` received the unit vector, false when it was not written
|
|
21
|
+
*/
|
|
22
|
+
export function v3_normalize_array_checked(output: number[] | Float32Array | Float64Array, output_offset: number, input: number[] | Float32Array | Float64Array, input_offset: number, epsilon_sqr: number): boolean;
|
|
23
|
+
//# sourceMappingURL=v3_normalize_array_checked.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3_normalize_array_checked.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/vec3/v3_normalize_array_checked.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,mDARW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,SACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,gBAClC,MAAM,eACN,MAAM,GAEJ,OAAO,CA2BnB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { assert } from "../../assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Normalise a vector, reporting whether it had a direction to normalise.
|
|
5
|
+
*
|
|
6
|
+
* Unlike {@link v3_normalize_array}, which passes a zero vector through and scales anything else, a
|
|
7
|
+
* vector whose squared length is below `epsilon_sqr` is refused: `false` is returned and `output` is
|
|
8
|
+
* not written at all, so with `output === input` the vector is left as it was. A vector that short
|
|
9
|
+
* has a direction made of rounding, and a caller that builds a rotation from it wants to know.
|
|
10
|
+
*
|
|
11
|
+
* So is a vector with no finite squared length — a NaN component, an infinite one, or one so long
|
|
12
|
+
* its square overflows — since none of those leaves a unit vector to write.
|
|
13
|
+
*
|
|
14
|
+
* `output` may alias `input`.
|
|
15
|
+
*
|
|
16
|
+
* @param {number[]|Float32Array|Float64Array} output
|
|
17
|
+
* @param {number} output_offset
|
|
18
|
+
* @param {number[]|Float32Array|Float64Array} input
|
|
19
|
+
* @param {number} input_offset
|
|
20
|
+
* @param {number} epsilon_sqr squared length below which the vector has no direction; positive, since at
|
|
21
|
+
* zero a zero vector would pass and normalise to NaN
|
|
22
|
+
* @returns {boolean} true when `output` received the unit vector, false when it was not written
|
|
23
|
+
*/
|
|
24
|
+
export function v3_normalize_array_checked(
|
|
25
|
+
output, output_offset,
|
|
26
|
+
input, input_offset,
|
|
27
|
+
epsilon_sqr
|
|
28
|
+
) {
|
|
29
|
+
assert.greaterThan(epsilon_sqr, 0, 'epsilon_sqr');
|
|
30
|
+
|
|
31
|
+
const x = input[input_offset];
|
|
32
|
+
const y = input[input_offset + 1];
|
|
33
|
+
const z = input[input_offset + 2];
|
|
34
|
+
|
|
35
|
+
const length_sqr = x * x + y * y + z * z;
|
|
36
|
+
|
|
37
|
+
// Written so that NaN, which fails every comparison, lands on the refusing side.
|
|
38
|
+
if (!(length_sqr >= epsilon_sqr && length_sqr < Infinity)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const inverse = 1 / Math.sqrt(length_sqr);
|
|
43
|
+
|
|
44
|
+
output[output_offset] = x * inverse;
|
|
45
|
+
output[output_offset + 1] = y * inverse;
|
|
46
|
+
output[output_offset + 2] = z * inverse;
|
|
47
|
+
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector rejection: the part of `v` square to the unit vector `n`, `v − (v·n) n`. Equivalently, `v`
|
|
3
|
+
* projected onto the plane through the origin whose normal is `n`.
|
|
4
|
+
*
|
|
5
|
+
* `n` must be of unit length; nothing here normalises it. `output` may alias `input` or `normal`.
|
|
6
|
+
*
|
|
7
|
+
* @param {number[]|Float32Array|Float64Array} output
|
|
8
|
+
* @param {number} output_offset
|
|
9
|
+
* @param {number[]|Float32Array|Float64Array} input `v`
|
|
10
|
+
* @param {number} input_offset
|
|
11
|
+
* @param {number[]|Float32Array|Float64Array} normal `n`, unit length
|
|
12
|
+
* @param {number} normal_offset
|
|
13
|
+
*/
|
|
14
|
+
export function v3_reject_array(output: number[] | Float32Array | Float64Array, output_offset: number, input: number[] | Float32Array | Float64Array, input_offset: number, normal: number[] | Float32Array | Float64Array, normal_offset: number): void;
|
|
15
|
+
//# sourceMappingURL=v3_reject_array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3_reject_array.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/vec3/v3_reject_array.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wCAPW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,SACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,gBAClC,MAAM,UACN,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,iBAClC,MAAM,QAoBhB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector rejection: the part of `v` square to the unit vector `n`, `v − (v·n) n`. Equivalently, `v`
|
|
3
|
+
* projected onto the plane through the origin whose normal is `n`.
|
|
4
|
+
*
|
|
5
|
+
* `n` must be of unit length; nothing here normalises it. `output` may alias `input` or `normal`.
|
|
6
|
+
*
|
|
7
|
+
* @param {number[]|Float32Array|Float64Array} output
|
|
8
|
+
* @param {number} output_offset
|
|
9
|
+
* @param {number[]|Float32Array|Float64Array} input `v`
|
|
10
|
+
* @param {number} input_offset
|
|
11
|
+
* @param {number[]|Float32Array|Float64Array} normal `n`, unit length
|
|
12
|
+
* @param {number} normal_offset
|
|
13
|
+
*/
|
|
14
|
+
export function v3_reject_array(
|
|
15
|
+
output, output_offset,
|
|
16
|
+
input, input_offset,
|
|
17
|
+
normal, normal_offset
|
|
18
|
+
) {
|
|
19
|
+
const x = input[input_offset];
|
|
20
|
+
const y = input[input_offset + 1];
|
|
21
|
+
const z = input[input_offset + 2];
|
|
22
|
+
|
|
23
|
+
const nx = normal[normal_offset];
|
|
24
|
+
const ny = normal[normal_offset + 1];
|
|
25
|
+
const nz = normal[normal_offset + 2];
|
|
26
|
+
|
|
27
|
+
const d = x * nx + y * ny + z * nz;
|
|
28
|
+
|
|
29
|
+
output[output_offset] = x - d * nx;
|
|
30
|
+
output[output_offset + 1] = y - d * ny;
|
|
31
|
+
output[output_offset + 2] = z - d * nz;
|
|
32
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Group the indices of a key array by key, as CSR: for every bucket `k`, the items
|
|
3
|
+
* `out_items[out_offset[k] .. out_offset[k + 1])` are the indices `i` with `keys[i] === k`, in ascending order.
|
|
4
|
+
*
|
|
5
|
+
* This is the counting sort behind every "which rows touch this vertex" table — count each key into
|
|
6
|
+
* `out_offset[k + 1]`, prefix-sum, then scatter each index through a per-bucket cursor. A key array with a
|
|
7
|
+
* fixed arity (two vertices per edge, three per triangle) is passed flat, and an item is then the flat index
|
|
8
|
+
* `element · arity + slot`; a caller that wants the element divides by the arity. Ascending order within a
|
|
9
|
+
* bucket is what makes the result a function of the keys alone, and what lets a consumer walking a bucket
|
|
10
|
+
* read its elements' tables forwards.
|
|
11
|
+
*
|
|
12
|
+
* A negative key is skipped: it is in no bucket and its index appears nowhere — the form a parent array takes
|
|
13
|
+
* at its roots.
|
|
14
|
+
*
|
|
15
|
+
* Allocation-free: `out_offset` itself is the scatter cursor. After the scatter every `out_offset[k]` has
|
|
16
|
+
* advanced to the start of bucket `k + 1`, so one shift down by a slot restores the starts.
|
|
17
|
+
*
|
|
18
|
+
* @param {Int32Array|Uint32Array|number[]} out_offset written whole, `bucket_count + 1` entries; the last is the
|
|
19
|
+
* number of items written
|
|
20
|
+
* @param {Int32Array|Uint32Array|number[]} out_items at least as long as the number of non-negative keys
|
|
21
|
+
* @param {ArrayLike<number>} keys bucket of each index, in `[0, bucket_count)`, or negative for none
|
|
22
|
+
* @param {number} key_count how many leading entries of `keys` to group
|
|
23
|
+
* @param {number} bucket_count
|
|
24
|
+
*/
|
|
25
|
+
export function csr_build_incidence(out_offset: Int32Array | Uint32Array | number[], out_items: Int32Array | Uint32Array | number[], keys: ArrayLike<number>, key_count: number, bucket_count: number): void;
|
|
26
|
+
//# sourceMappingURL=csr_build_incidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csr_build_incidence.d.ts","sourceRoot":"","sources":["../../../../../src/core/graph/csr/csr_build_incidence.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,gDAPW,UAAU,GAAC,WAAW,GAAC,MAAM,EAAE,aAE/B,UAAU,GAAC,WAAW,GAAC,MAAM,EAAE,QAC/B,UAAU,MAAM,CAAC,aACjB,MAAM,gBACN,MAAM,QA8ChB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { assert } from "../../assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Group the indices of a key array by key, as CSR: for every bucket `k`, the items
|
|
5
|
+
* `out_items[out_offset[k] .. out_offset[k + 1])` are the indices `i` with `keys[i] === k`, in ascending order.
|
|
6
|
+
*
|
|
7
|
+
* This is the counting sort behind every "which rows touch this vertex" table — count each key into
|
|
8
|
+
* `out_offset[k + 1]`, prefix-sum, then scatter each index through a per-bucket cursor. A key array with a
|
|
9
|
+
* fixed arity (two vertices per edge, three per triangle) is passed flat, and an item is then the flat index
|
|
10
|
+
* `element · arity + slot`; a caller that wants the element divides by the arity. Ascending order within a
|
|
11
|
+
* bucket is what makes the result a function of the keys alone, and what lets a consumer walking a bucket
|
|
12
|
+
* read its elements' tables forwards.
|
|
13
|
+
*
|
|
14
|
+
* A negative key is skipped: it is in no bucket and its index appears nowhere — the form a parent array takes
|
|
15
|
+
* at its roots.
|
|
16
|
+
*
|
|
17
|
+
* Allocation-free: `out_offset` itself is the scatter cursor. After the scatter every `out_offset[k]` has
|
|
18
|
+
* advanced to the start of bucket `k + 1`, so one shift down by a slot restores the starts.
|
|
19
|
+
*
|
|
20
|
+
* @param {Int32Array|Uint32Array|number[]} out_offset written whole, `bucket_count + 1` entries; the last is the
|
|
21
|
+
* number of items written
|
|
22
|
+
* @param {Int32Array|Uint32Array|number[]} out_items at least as long as the number of non-negative keys
|
|
23
|
+
* @param {ArrayLike<number>} keys bucket of each index, in `[0, bucket_count)`, or negative for none
|
|
24
|
+
* @param {number} key_count how many leading entries of `keys` to group
|
|
25
|
+
* @param {number} bucket_count
|
|
26
|
+
*/
|
|
27
|
+
export function csr_build_incidence(out_offset, out_items, keys, key_count, bucket_count) {
|
|
28
|
+
assert.isNonNegativeInteger(key_count, 'key_count');
|
|
29
|
+
assert.isNonNegativeInteger(bucket_count, 'bucket_count');
|
|
30
|
+
assert.greaterThanOrEqual(out_offset.length, bucket_count + 1, 'out_offset shorter than bucket_count + 1');
|
|
31
|
+
assert.greaterThanOrEqual(keys.length, key_count, 'keys shorter than key_count');
|
|
32
|
+
|
|
33
|
+
for (let k = 0; k <= bucket_count; k++) {
|
|
34
|
+
out_offset[k] = 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
for (let i = 0; i < key_count; i++) {
|
|
38
|
+
const key = keys[i];
|
|
39
|
+
|
|
40
|
+
if (key < 0) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
assert.lessThan(key, bucket_count, 'key out of range');
|
|
45
|
+
|
|
46
|
+
out_offset[key + 1]++;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
for (let k = 0; k < bucket_count; k++) {
|
|
50
|
+
out_offset[k + 1] += out_offset[k];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
assert.greaterThanOrEqual(out_items.length, out_offset[bucket_count], 'out_items shorter than the item count');
|
|
54
|
+
|
|
55
|
+
// `out_offset[k]` is bucket `k`'s write cursor; it ends at the start of bucket `k + 1`
|
|
56
|
+
for (let i = 0; i < key_count; i++) {
|
|
57
|
+
const key = keys[i];
|
|
58
|
+
|
|
59
|
+
if (key < 0) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
out_items[out_offset[key]++] = i;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (let k = bucket_count; k > 0; k--) {
|
|
67
|
+
out_offset[k] = out_offset[k - 1];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
out_offset[0] = 0;
|
|
71
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Greedy graph colouring over a CSR adjacency: visit the vertices in `order`, and give each the lowest colour
|
|
3
|
+
* none of its already-coloured neighbours holds.
|
|
4
|
+
*
|
|
5
|
+
* Greedy colouring is order-sensitive, and the order is the caller's — Welsh–Powell's largest-degree-first
|
|
6
|
+
* is the usual choice, and the reason it is a parameter rather than a policy. For a given order the result
|
|
7
|
+
* is fully determined: the order of neighbours within a row, and duplicate entries in a row, do not change
|
|
8
|
+
* it. A vertex's colour is at most its degree, so the colour count is at most the largest degree plus one.
|
|
9
|
+
*
|
|
10
|
+
* Works on the raw CSR arrays rather than a {@link CSRGraph}, so any row-pointer/column-index pair can be
|
|
11
|
+
* coloured without being copied into one; for a `CSRGraph` pass `graph.edge_addresses, graph.adjacency`.
|
|
12
|
+
* A self-loop is ignored, since a vertex is uncoloured while its own colour is being chosen.
|
|
13
|
+
*
|
|
14
|
+
* Allocation-free per call, beyond growing the module scratch to `vertex_count + 1`; not reentrant.
|
|
15
|
+
*
|
|
16
|
+
* @param {Uint32Array|Int32Array|number[]} out_colors colour of every vertex, written for `[0, vertex_count)`
|
|
17
|
+
* @param {Uint32Array|Int32Array|ArrayLike<number>} edge_addresses row offsets, `vertex_count + 1` entries
|
|
18
|
+
* @param {Uint32Array|Int32Array|ArrayLike<number>} adjacency neighbour ids, rows
|
|
19
|
+
* `adjacency[edge_addresses[v] .. edge_addresses[v + 1])`
|
|
20
|
+
* @param {ArrayLike<number>} order a permutation of `[0, vertex_count)`, the visit order
|
|
21
|
+
* @param {number} vertex_count
|
|
22
|
+
* @returns {number} number of colours used; colours are `[0, count)`
|
|
23
|
+
*/
|
|
24
|
+
export function csr_graph_color_greedy(out_colors: Uint32Array | Int32Array | number[], edge_addresses: Uint32Array | Int32Array | ArrayLike<number>, adjacency: Uint32Array | Int32Array | ArrayLike<number>, order: ArrayLike<number>, vertex_count: number): number;
|
|
25
|
+
//# sourceMappingURL=csr_graph_color_greedy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csr_graph_color_greedy.d.ts","sourceRoot":"","sources":["../../../../../src/core/graph/csr/csr_graph_color_greedy.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,mDARW,WAAW,GAAC,UAAU,GAAC,MAAM,EAAE,kBAC/B,WAAW,GAAC,UAAU,GAAC,UAAU,MAAM,CAAC,aACxC,WAAW,GAAC,UAAU,GAAC,UAAU,MAAM,CAAC,SAExC,UAAU,MAAM,CAAC,gBACjB,MAAM,GACJ,MAAM,CAmDlB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { assert } from "../../assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Per-colour stamp: `MARK[c] === i + 1` while visiting the `i`-th vertex of the order means a neighbour
|
|
5
|
+
* already holds colour `c`. Module-static and grown on demand; the colouring runs synchronously start to
|
|
6
|
+
* finish, so reuse is safe.
|
|
7
|
+
* @type {Uint32Array}
|
|
8
|
+
*/
|
|
9
|
+
let MARK = new Uint32Array(0);
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Greedy graph colouring over a CSR adjacency: visit the vertices in `order`, and give each the lowest colour
|
|
13
|
+
* none of its already-coloured neighbours holds.
|
|
14
|
+
*
|
|
15
|
+
* Greedy colouring is order-sensitive, and the order is the caller's — Welsh–Powell's largest-degree-first
|
|
16
|
+
* is the usual choice, and the reason it is a parameter rather than a policy. For a given order the result
|
|
17
|
+
* is fully determined: the order of neighbours within a row, and duplicate entries in a row, do not change
|
|
18
|
+
* it. A vertex's colour is at most its degree, so the colour count is at most the largest degree plus one.
|
|
19
|
+
*
|
|
20
|
+
* Works on the raw CSR arrays rather than a {@link CSRGraph}, so any row-pointer/column-index pair can be
|
|
21
|
+
* coloured without being copied into one; for a `CSRGraph` pass `graph.edge_addresses, graph.adjacency`.
|
|
22
|
+
* A self-loop is ignored, since a vertex is uncoloured while its own colour is being chosen.
|
|
23
|
+
*
|
|
24
|
+
* Allocation-free per call, beyond growing the module scratch to `vertex_count + 1`; not reentrant.
|
|
25
|
+
*
|
|
26
|
+
* @param {Uint32Array|Int32Array|number[]} out_colors colour of every vertex, written for `[0, vertex_count)`
|
|
27
|
+
* @param {Uint32Array|Int32Array|ArrayLike<number>} edge_addresses row offsets, `vertex_count + 1` entries
|
|
28
|
+
* @param {Uint32Array|Int32Array|ArrayLike<number>} adjacency neighbour ids, rows
|
|
29
|
+
* `adjacency[edge_addresses[v] .. edge_addresses[v + 1])`
|
|
30
|
+
* @param {ArrayLike<number>} order a permutation of `[0, vertex_count)`, the visit order
|
|
31
|
+
* @param {number} vertex_count
|
|
32
|
+
* @returns {number} number of colours used; colours are `[0, count)`
|
|
33
|
+
*/
|
|
34
|
+
export function csr_graph_color_greedy(out_colors, edge_addresses, adjacency, order, vertex_count) {
|
|
35
|
+
assert.isNonNegativeInteger(vertex_count, 'vertex_count');
|
|
36
|
+
assert.greaterThanOrEqual(order.length, vertex_count, 'order shorter than vertex_count');
|
|
37
|
+
assert.greaterThanOrEqual(out_colors.length, vertex_count, 'out_colors shorter than vertex_count');
|
|
38
|
+
|
|
39
|
+
if (MARK.length < vertex_count + 1) {
|
|
40
|
+
MARK = new Uint32Array(vertex_count + 1);
|
|
41
|
+
} else {
|
|
42
|
+
MARK.fill(0, 0, vertex_count + 1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const mark = MARK;
|
|
46
|
+
|
|
47
|
+
// No colour reaches `vertex_count`, so it stands for "not coloured yet" in whatever type the caller's
|
|
48
|
+
// array is.
|
|
49
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
50
|
+
out_colors[v] = vertex_count;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let colour_count = 0;
|
|
54
|
+
|
|
55
|
+
for (let i = 0; i < vertex_count; i++) {
|
|
56
|
+
const v = order[i];
|
|
57
|
+
const stamp = i + 1;
|
|
58
|
+
|
|
59
|
+
const end = edge_addresses[v + 1];
|
|
60
|
+
|
|
61
|
+
for (let k = edge_addresses[v]; k < end; k++) {
|
|
62
|
+
const neighbour_colour = out_colors[adjacency[k]];
|
|
63
|
+
|
|
64
|
+
if (neighbour_colour < vertex_count) {
|
|
65
|
+
mark[neighbour_colour] = stamp;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let colour = 0;
|
|
70
|
+
|
|
71
|
+
while (mark[colour] === stamp) {
|
|
72
|
+
colour++;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
out_colors[v] = colour;
|
|
76
|
+
|
|
77
|
+
if (colour >= colour_count) {
|
|
78
|
+
colour_count = colour + 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return colour_count;
|
|
83
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a colouring is proper over a CSR adjacency: no vertex shares its colour with any of its neighbours.
|
|
3
|
+
* A self-loop is not a conflict.
|
|
4
|
+
*
|
|
5
|
+
* A debug check, meant to sit behind `assert.*` after a colouring is built; it reads every adjacency entry
|
|
6
|
+
* once. Works on the raw CSR arrays, like {@link csr_graph_color_greedy}.
|
|
7
|
+
*
|
|
8
|
+
* @param {ArrayLike<number>} colors colour of every vertex
|
|
9
|
+
* @param {ArrayLike<number>} edge_addresses row offsets, `vertex_count + 1` entries
|
|
10
|
+
* @param {ArrayLike<number>} adjacency neighbour ids
|
|
11
|
+
* @param {number} vertex_count
|
|
12
|
+
* @returns {boolean} true when no edge joins two vertices of one colour
|
|
13
|
+
*/
|
|
14
|
+
export function csr_graph_validate_coloring(colors: ArrayLike<number>, edge_addresses: ArrayLike<number>, adjacency: ArrayLike<number>, vertex_count: number): boolean;
|
|
15
|
+
//# sourceMappingURL=csr_graph_validate_coloring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csr_graph_validate_coloring.d.ts","sourceRoot":"","sources":["../../../../../src/core/graph/csr/csr_graph_validate_coloring.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,oDANW,UAAU,MAAM,CAAC,kBACjB,UAAU,MAAM,CAAC,aACjB,UAAU,MAAM,CAAC,gBACjB,MAAM,GACJ,OAAO,CAqBnB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a colouring is proper over a CSR adjacency: no vertex shares its colour with any of its neighbours.
|
|
3
|
+
* A self-loop is not a conflict.
|
|
4
|
+
*
|
|
5
|
+
* A debug check, meant to sit behind `assert.*` after a colouring is built; it reads every adjacency entry
|
|
6
|
+
* once. Works on the raw CSR arrays, like {@link csr_graph_color_greedy}.
|
|
7
|
+
*
|
|
8
|
+
* @param {ArrayLike<number>} colors colour of every vertex
|
|
9
|
+
* @param {ArrayLike<number>} edge_addresses row offsets, `vertex_count + 1` entries
|
|
10
|
+
* @param {ArrayLike<number>} adjacency neighbour ids
|
|
11
|
+
* @param {number} vertex_count
|
|
12
|
+
* @returns {boolean} true when no edge joins two vertices of one colour
|
|
13
|
+
*/
|
|
14
|
+
export function csr_graph_validate_coloring(colors, edge_addresses, adjacency, vertex_count) {
|
|
15
|
+
if (colors.length < vertex_count) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
20
|
+
const colour = colors[v];
|
|
21
|
+
const end = edge_addresses[v + 1];
|
|
22
|
+
|
|
23
|
+
for (let k = edge_addresses[v]; k < end; k++) {
|
|
24
|
+
const neighbour = adjacency[k];
|
|
25
|
+
|
|
26
|
+
if (neighbour !== v && colors[neighbour] === colour) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solve `M·x = b` for a symmetric positive definite 3×3 `M`, by LDLᵀ factorisation.
|
|
3
|
+
*
|
|
4
|
+
* `M` is read as its six distinct entries, diagonal first: `[m00, m11, m22, m01, m02, m12]`.
|
|
5
|
+
*
|
|
6
|
+
* LDLᵀ rather than a cofactor inverse. The two agree in exact arithmetic and do not agree in Float64: an SPD
|
|
7
|
+
* matrix with a condition number in the billions has a cofactor determinant — a sum of triple products that
|
|
8
|
+
* has to cancel down by that ratio squared — that can come out *negative* although every eigenvalue is
|
|
9
|
+
* positive. The factorisation never forms those products, so its pivots stay positive where the determinant
|
|
10
|
+
* does not, and their product is the determinant to full precision.
|
|
11
|
+
*
|
|
12
|
+
* The pivots of an SPD matrix are `M` restricted to nested subspaces, so all three positive *is* positive
|
|
13
|
+
* definiteness: the function checks exactly that, and returns `false` without writing `out` when a pivot is
|
|
14
|
+
* not positive and finite — an indefinite, singular or non-finite `M`. An infinite pivot needs refusing
|
|
15
|
+
* explicitly: it is positive, and dividing by it reads as a finite solution, zero along that axis.
|
|
16
|
+
*
|
|
17
|
+
* @param {Float64Array|Float32Array|number[]} out solution `x`, 3 entries at `out_offset`
|
|
18
|
+
* @param {number} out_offset
|
|
19
|
+
* @param {Float64Array|Float32Array|number[]} m `[m00, m11, m22, m01, m02, m12]` at `m_offset`
|
|
20
|
+
* @param {number} m_offset
|
|
21
|
+
* @param {Float64Array|Float32Array|number[]} b right-hand side, 3 entries at `b_offset`
|
|
22
|
+
* @param {number} b_offset
|
|
23
|
+
* @returns {boolean} true when `M` was positive definite and `out` holds the solution
|
|
24
|
+
*/
|
|
25
|
+
export function matrix_symmetric_3x3_solve_ldlt(out: Float64Array | Float32Array | number[], out_offset: number, m: Float64Array | Float32Array | number[], m_offset: number, b: Float64Array | Float32Array | number[], b_offset: number): boolean;
|
|
26
|
+
//# sourceMappingURL=matrix_symmetric_3x3_solve_ldlt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix_symmetric_3x3_solve_ldlt.d.ts","sourceRoot":"","sources":["../../../../../src/core/math/linalg/matrix_symmetric_3x3_solve_ldlt.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qDARW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,cAClC,MAAM,KACN,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,YAClC,MAAM,KACN,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,YAClC,MAAM,GACJ,OAAO,CAgDnB"}
|