@woosh/meep-engine 3.43.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/editor/prototypeEditorShell.d.ts.map +1 -1
- package/editor/prototypeEditorShell.js +4 -2
- 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/Clock.d.ts +15 -0
- package/src/engine/Clock.d.ts.map +1 -1
- package/src/engine/Clock.js +29 -5
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +11 -19
- 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/ecs/mesh-v2/MeshSkin.d.ts +57 -0
- package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -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 +28 -13
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +107 -64
- package/src/engine/graphics3/AnimationSystem.d.ts +29 -15
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +112 -61
- package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
- package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
- package/src/engine/graphics3/MeshSkinSystem.js +317 -0
- package/src/engine/graphics3/MeshSystem.d.ts +15 -35
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +21 -298
- package/src/engine/graphics3/RowChains.d.ts +76 -0
- package/src/engine/graphics3/RowChains.d.ts.map +1 -0
- package/src/engine/graphics3/RowChains.js +347 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
- package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
- package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
- package/src/engine/graphics3/animation/AnimationClips.js +79 -0
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
- package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
- package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
- package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
- package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_place.js +175 -130
- package/src/engine/graphics3/register_clips.d.ts +93 -0
- package/src/engine/graphics3/register_clips.d.ts.map +1 -0
- package/src/engine/graphics3/register_clips.js +166 -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/MEASUREMENTS.md +795 -0
- package/src/engine/physics/cloth/PLAN.md +349 -17
- package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
- package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +44 -0
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
- package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +107 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
- 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 +371 -284
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +275 -0
- 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 +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +17 -62
- package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
- package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
- 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/ClothDynamicsFlags.js +6 -0
- package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
- package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
- package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
- package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +754 -207
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +297 -101
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +12 -10
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +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 +60 -120
- package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
- package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_geodesic.js +135 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_holds.js +583 -0
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +168 -51
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +51 -42
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +62 -50
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
- 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 +3 -29
- package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/garment_build.js +17 -5
- package/src/engine/physics/cloth/playground/garment_main.js +5 -20
- package/src/engine/physics/cloth/playground/main.js +6 -48
- package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/rig_build.js +302 -296
- 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 +45 -7
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +79 -83
- 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 +6 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.js +9 -3
- package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
- package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_hold_line.js +350 -0
- 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 +6 -2
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_self_find.js +19 -68
- 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_solver_constants.d.ts +24 -12
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +189 -48
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -6
- 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/solver/constraint/cloth_leash_row.d.ts +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
- 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 +12 -10
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/cloth_sample_air.js +60 -82
- 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/FluidObstacleSystem.d.ts +4 -4
- 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/engine/simulation/Ticker.d.ts +13 -0
- package/src/engine/simulation/Ticker.d.ts.map +1 -1
- package/src/engine/simulation/Ticker.js +43 -8
- 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/RENDERER_CONTRACT.md +8 -2
- package/src/shade/playground/image_decode_bench/main.js +2 -1
- package/src/shade/playground/mesh_row_ceiling/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_blas_refit/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +11 -19
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
- 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/README.md +129 -109
- package/src/shade/playground/texture_encode/main.d.ts.map +1 -1
- package/src/shade/playground/texture_encode/main.js +1431 -1430
- 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/animation/GPUAnimationManager.d.ts +45 -14
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -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/BoxGeometry.d.ts +1 -11
- package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
- package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
- package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
- package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
- package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
- package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
- package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
- package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
- package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
- package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
- package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
- 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/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
- package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +6 -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
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
- 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 +7 -2
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
- package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
- package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
- package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
- package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_transport.js +7 -5
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +3 -1
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +37 -20
- package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
- package/src/shade/wgsl/validate_wgsl_source.js +74 -3
- package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
- package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
- package/src/engine/graphics3/register_instance_animation.js +0 -201
|
@@ -15,9 +15,14 @@
|
|
|
15
15
|
* @param {number} dt seconds, the fixed step the discovered rows will be used
|
|
16
16
|
* across — how far a particle carries its current velocity before anything
|
|
17
17
|
* gets a chance to stop it
|
|
18
|
+
* @param {number} kinematic_travel metres, the furthest any held particle is
|
|
19
|
+
* carried this step. A cloth at rest that a holder yanks has no velocity to
|
|
20
|
+
* reach with and still moves, dragged by the particles it hangs from, so every
|
|
21
|
+
* free particle reaches this much further. Zero for a cloth whose holders ride
|
|
22
|
+
* its frame.
|
|
18
23
|
* @returns {number} how many contact rows were created
|
|
19
24
|
*/
|
|
20
|
-
export function cloth_contact_find(state: ClothState, table: Float32Array | Float64Array, keys: Int32Array, count: number, dt: number): number;
|
|
25
|
+
export function cloth_contact_find(state: ClothState, table: Float32Array | Float64Array, keys: Int32Array, count: number, dt: number, kinematic_travel: number): number;
|
|
21
26
|
/**
|
|
22
27
|
* # Finding the contacts, once per step
|
|
23
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloth_contact_find.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_contact_find.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cloth_contact_find.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_contact_find.js"],"names":[],"mappings":"AAiHA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,6DAbW,YAAY,GAAC,YAAY,QACzB,UAAU,SACV,MAAM,MACN,MAAM,oBAGN,MAAM,GAKJ,MAAM,CAwLlB;AAvSD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AAEH;;;;;;;;;GASG;AACH,mCAFU,MAAM,CAEsB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { v3_length } from "../../../../core/geom/vec3/v3_length.js";
|
|
1
2
|
import {
|
|
2
3
|
CCR_AABB_MAX_X,
|
|
3
4
|
CCR_AABB_MAX_Y,
|
|
@@ -127,9 +128,14 @@ export const CLOTH_CONTACT_MARGIN = 1;
|
|
|
127
128
|
* @param {number} dt seconds, the fixed step the discovered rows will be used
|
|
128
129
|
* across — how far a particle carries its current velocity before anything
|
|
129
130
|
* gets a chance to stop it
|
|
131
|
+
* @param {number} kinematic_travel metres, the furthest any held particle is
|
|
132
|
+
* carried this step. A cloth at rest that a holder yanks has no velocity to
|
|
133
|
+
* reach with and still moves, dragged by the particles it hangs from, so every
|
|
134
|
+
* free particle reaches this much further. Zero for a cloth whose holders ride
|
|
135
|
+
* its frame.
|
|
130
136
|
* @returns {number} how many contact rows were created
|
|
131
137
|
*/
|
|
132
|
-
export function cloth_contact_find(state, table, keys, count, dt) {
|
|
138
|
+
export function cloth_contact_find(state, table, keys, count, dt, kinematic_travel) {
|
|
133
139
|
const particle_count = state.particle_count;
|
|
134
140
|
|
|
135
141
|
const collider = state.contact_collider;
|
|
@@ -167,7 +173,7 @@ export function cloth_contact_find(state, table, keys, count, dt) {
|
|
|
167
173
|
for (let record = 0; record < count; record++) {
|
|
168
174
|
const r = record * CCR_STRIDE;
|
|
169
175
|
|
|
170
|
-
TRAVEL[record] =
|
|
176
|
+
TRAVEL[record] = v3_length(
|
|
171
177
|
table[r + CCR_TX] - table[r + CCR_PREV_TX],
|
|
172
178
|
table[r + CCR_TY] - table[r + CCR_PREV_TY],
|
|
173
179
|
table[r + CCR_TZ] - table[r + CCR_PREV_TZ]
|
|
@@ -213,7 +219,7 @@ export function cloth_contact_find(state, table, keys, count, dt) {
|
|
|
213
219
|
// How far this particle carries its current velocity across the step.
|
|
214
220
|
// Hoisted out of the record loop: it is a property of the particle, and
|
|
215
221
|
// the loop below is the hot one.
|
|
216
|
-
const travel = dt *
|
|
222
|
+
const travel = dt * v3_length(velocity[p], velocity[p + 1], velocity[p + 2]) + kinematic_travel;
|
|
217
223
|
|
|
218
224
|
let found = 0;
|
|
219
225
|
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the held particles lie on one line, and which: written to `line` as
|
|
3
|
+
* the origin then the unit direction.
|
|
4
|
+
*
|
|
5
|
+
* The origin is the first held particle and the direction runs to the one
|
|
6
|
+
* furthest from it, which spans at least half of the set. Every held particle is
|
|
7
|
+
* then measured off that line.
|
|
8
|
+
*
|
|
9
|
+
* @param {Float64Array} line out, {@link CLOTH_HOLD_LINE_WORDS}
|
|
10
|
+
* @param {Float32Array} position
|
|
11
|
+
* @param {Int32Array} held particle indices
|
|
12
|
+
* @param {number} held_count
|
|
13
|
+
* @returns {boolean} `false` when there are fewer than two distinct held points
|
|
14
|
+
* or they are not on one line; `line` is then not written
|
|
15
|
+
*/
|
|
16
|
+
export function cloth_hold_line_fit(line: Float64Array, position: Float32Array, held: Int32Array, held_count: number): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Take one Newton step of the substep's energy along the turn about `line`, and
|
|
19
|
+
* turn every free particle by the angle it gives — see the module docblock.
|
|
20
|
+
*
|
|
21
|
+
* @param {ClothState} state
|
|
22
|
+
* @param {Float64Array} line from {@link cloth_hold_line_fit}
|
|
23
|
+
* @param {number} inverse_h_squared `1/h²` for the substep in progress
|
|
24
|
+
* @param {Float32Array|Float64Array|null} collider_table as the vertex update
|
|
25
|
+
* takes it; `null` skips the contact rows
|
|
26
|
+
* @returns {number} the angle turned, radians; `0` when there is nothing to turn
|
|
27
|
+
*/
|
|
28
|
+
export function cloth_hold_line_turn(state: ClothState, line: Float64Array, inverse_h_squared: number, collider_table: Float32Array | Float64Array | null): number;
|
|
29
|
+
/**
|
|
30
|
+
* # The turn about a hold line — one more block of the descent
|
|
31
|
+
*
|
|
32
|
+
* VBD is block coordinate descent on the step's energy, one 3×3 block per
|
|
33
|
+
* particle. A cloth whose held particles lie on one line has a motion no such
|
|
34
|
+
* block can make: turning the whole cloth about that line as a rigid body. Every
|
|
35
|
+
* internal row is unchanged by it — its ends turn together, or one of them is on
|
|
36
|
+
* the axis — so the only parts of the energy that see the turn are the inertial
|
|
37
|
+
* term and the rows measured from outside the cloth. When the line is vertical
|
|
38
|
+
* nothing outside restores it either, because gravity is parallel to the axis.
|
|
39
|
+
*
|
|
40
|
+
* A vertex update moves one particle, so every update adds `x_i × m·Δx_i` of
|
|
41
|
+
* angular momentum about the line, and the step stopped at a fabric's iteration
|
|
42
|
+
* count leaves a residual whose moment about it is not zero. The warm start keeps
|
|
43
|
+
* a quarter of each hard multiplier (§5.2), so a cloth at rest re-solves three
|
|
44
|
+
* quarters of its weight every substep, is never a fixed point, and leaves that
|
|
45
|
+
* residual every substep. A flag on a pole turned at ten degrees a second for as
|
|
46
|
+
* long as it was run (PLAN §18, `MEASUREMENTS.md` §63).
|
|
47
|
+
*
|
|
48
|
+
* So the turn gets a block of its own: **one Newton step of the substep's energy
|
|
49
|
+
* along the rotation about the hold line**, then every free particle turned by
|
|
50
|
+
* the angle it gives. It is a descent step on the same energy as the vertex
|
|
51
|
+
* updates, so §5.3 is untouched, and it changes no row, multiplier or constant.
|
|
52
|
+
*
|
|
53
|
+
* ## What enters
|
|
54
|
+
*
|
|
55
|
+
* With `a` the line's unit direction, `r_i` a particle's offset from the line's
|
|
56
|
+
* origin and `t_i = a × r_i` its velocity under a unit turn, along the path
|
|
57
|
+
* `x_i(θ) = o + R(θ)·r_i`:
|
|
58
|
+
*
|
|
59
|
+
* g = dE/dθ = Σ t_i·∇E_i
|
|
60
|
+
* H = d²E/dθ² = Σ t_iᵀ·H_i·t_i + Σ ∇E_i·(a(a·r_i) − r_i)
|
|
61
|
+
* θ = −g/H
|
|
62
|
+
*
|
|
63
|
+
* - `∇E_i` and `H_i` are the vertex update's own assembly with the internal rows
|
|
64
|
+
* left out: the inertial term `(m/h²)(x − y)`, the leash rows, the backstop
|
|
65
|
+
* rows and the contacts. Stretch, bend and self-collision rows are invariant
|
|
66
|
+
* under the turn: a row's energy does not change along the path, so its share
|
|
67
|
+
* of `g` is zero and its two shares of `H` cancel, and leaving it out is
|
|
68
|
+
* leaving out a zero. A tether is invariant too, since it is measured from a
|
|
69
|
+
* held particle and that is on the axis, but it shares its accumulation with
|
|
70
|
+
* the slack row, which is not. It enters, and it can only shorten the step.
|
|
71
|
+
* - The last sum is the path's own curvature, `d²x/dθ² = −r⊥`. About a vertical
|
|
72
|
+
* axis gravity has no part in it and what is left is close to zero; about a
|
|
73
|
+
* horizontal one it is the pendulum's gravity stiffness. It is added only where
|
|
74
|
+
* it is positive, which keeps `H` at least the first sum, positive definite
|
|
75
|
+
* through the mass term: a step no longer than the one without it.
|
|
76
|
+
*
|
|
77
|
+
* ## When it runs
|
|
78
|
+
*
|
|
79
|
+
* When the held particles lie on one line **at this substep**, at two or more
|
|
80
|
+
* distinct points — a fact about the holds the predict already has in hand,
|
|
81
|
+
* since it carries every held particle. A single held point has three free turns
|
|
82
|
+
* and a cloth nothing holds has six; this block is the line's, and neither of
|
|
83
|
+
* those is handled here. It runs on a line gravity restores too, a horizontal
|
|
84
|
+
* one included, and there it has slowed some sleeps and kept one cloth awake
|
|
85
|
+
* (PLAN §18).
|
|
86
|
+
*
|
|
87
|
+
* It runs once a substep, in the **last** iteration, after the sweep and before
|
|
88
|
+
* that iteration's dual update. Run in every iteration it measured no better on
|
|
89
|
+
* a flag and cost 9–19% of a step rather than 3–9% (`MEASUREMENTS.md` §66).
|
|
90
|
+
*
|
|
91
|
+
* @author Alex Goldring
|
|
92
|
+
* @copyright Company Named Limited (c) 2026
|
|
93
|
+
*/
|
|
94
|
+
/**
|
|
95
|
+
* How far a held particle may sit off the line and still be on it, as a
|
|
96
|
+
* fraction of the largest coordinate among the held particles.
|
|
97
|
+
*
|
|
98
|
+
* Relative, because what it separates is rounding from geometry, and rounding is
|
|
99
|
+
* a proportion of magnitude. Held positions are `Float32` and are carried through
|
|
100
|
+
* the step in double and stored again at each substep. A flag turned off every
|
|
101
|
+
* axis, whose hoist is straight in exact arithmetic, measured at most 6.3e-8 of
|
|
102
|
+
* its largest coordinate off its own line — half a unit in the last place —
|
|
103
|
+
* from the origin out to four kilometres. This is 240 times that, and 15 µm at a
|
|
104
|
+
* metre. `MEASUREMENTS.md` §66.
|
|
105
|
+
*
|
|
106
|
+
* @type {number}
|
|
107
|
+
*/
|
|
108
|
+
export const CLOTH_HOLD_LINE_TOLERANCE: number;
|
|
109
|
+
/**
|
|
110
|
+
* Words of a hold line: the origin, then the unit direction.
|
|
111
|
+
* @type {number}
|
|
112
|
+
*/
|
|
113
|
+
export const CLOTH_HOLD_LINE_WORDS: number;
|
|
114
|
+
//# sourceMappingURL=cloth_hold_line.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloth_hold_line.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_hold_line.js"],"names":[],"mappings":"AAyGA;;;;;;;;;;;;;;GAcG;AACH,0CAPW,YAAY,YACZ,YAAY,QACZ,UAAU,cACV,MAAM,GACJ,OAAO,CAiGnB;AAED;;;;;;;;;;GAUG;AACH,8DANW,YAAY,qBACZ,MAAM,kBACN,YAAY,GAAC,YAAY,GAAC,IAAI,GAE5B,MAAM,CAqHlB;AArUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAEH;;;;;;;;;;;;;GAaG;AACH,wCAFU,MAAM,CAEkC;AAElD;;;GAGG;AACH,oCAFU,MAAM,CAEuB"}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { cloth_backstop_accumulate } from "./constraint/cloth_backstop_row.js";
|
|
2
|
+
import { cloth_contact_accumulate } from "./constraint/cloth_contact_row.js";
|
|
3
|
+
import { cloth_leash_accumulate } from "./constraint/cloth_leash_row.js";
|
|
4
|
+
import {
|
|
5
|
+
CVA_F_X,
|
|
6
|
+
CVA_F_Y,
|
|
7
|
+
CVA_F_Z,
|
|
8
|
+
CVA_H_XX,
|
|
9
|
+
CVA_H_XY,
|
|
10
|
+
CVA_H_XZ,
|
|
11
|
+
CVA_H_YY,
|
|
12
|
+
CVA_H_YZ,
|
|
13
|
+
CVA_H_ZZ,
|
|
14
|
+
CVA_STRIDE,
|
|
15
|
+
cloth_vertex_accumulator_seed
|
|
16
|
+
} from "./cloth_vertex_accumulator.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* # The turn about a hold line — one more block of the descent
|
|
20
|
+
*
|
|
21
|
+
* VBD is block coordinate descent on the step's energy, one 3×3 block per
|
|
22
|
+
* particle. A cloth whose held particles lie on one line has a motion no such
|
|
23
|
+
* block can make: turning the whole cloth about that line as a rigid body. Every
|
|
24
|
+
* internal row is unchanged by it — its ends turn together, or one of them is on
|
|
25
|
+
* the axis — so the only parts of the energy that see the turn are the inertial
|
|
26
|
+
* term and the rows measured from outside the cloth. When the line is vertical
|
|
27
|
+
* nothing outside restores it either, because gravity is parallel to the axis.
|
|
28
|
+
*
|
|
29
|
+
* A vertex update moves one particle, so every update adds `x_i × m·Δx_i` of
|
|
30
|
+
* angular momentum about the line, and the step stopped at a fabric's iteration
|
|
31
|
+
* count leaves a residual whose moment about it is not zero. The warm start keeps
|
|
32
|
+
* a quarter of each hard multiplier (§5.2), so a cloth at rest re-solves three
|
|
33
|
+
* quarters of its weight every substep, is never a fixed point, and leaves that
|
|
34
|
+
* residual every substep. A flag on a pole turned at ten degrees a second for as
|
|
35
|
+
* long as it was run (PLAN §18, `MEASUREMENTS.md` §63).
|
|
36
|
+
*
|
|
37
|
+
* So the turn gets a block of its own: **one Newton step of the substep's energy
|
|
38
|
+
* along the rotation about the hold line**, then every free particle turned by
|
|
39
|
+
* the angle it gives. It is a descent step on the same energy as the vertex
|
|
40
|
+
* updates, so §5.3 is untouched, and it changes no row, multiplier or constant.
|
|
41
|
+
*
|
|
42
|
+
* ## What enters
|
|
43
|
+
*
|
|
44
|
+
* With `a` the line's unit direction, `r_i` a particle's offset from the line's
|
|
45
|
+
* origin and `t_i = a × r_i` its velocity under a unit turn, along the path
|
|
46
|
+
* `x_i(θ) = o + R(θ)·r_i`:
|
|
47
|
+
*
|
|
48
|
+
* g = dE/dθ = Σ t_i·∇E_i
|
|
49
|
+
* H = d²E/dθ² = Σ t_iᵀ·H_i·t_i + Σ ∇E_i·(a(a·r_i) − r_i)
|
|
50
|
+
* θ = −g/H
|
|
51
|
+
*
|
|
52
|
+
* - `∇E_i` and `H_i` are the vertex update's own assembly with the internal rows
|
|
53
|
+
* left out: the inertial term `(m/h²)(x − y)`, the leash rows, the backstop
|
|
54
|
+
* rows and the contacts. Stretch, bend and self-collision rows are invariant
|
|
55
|
+
* under the turn: a row's energy does not change along the path, so its share
|
|
56
|
+
* of `g` is zero and its two shares of `H` cancel, and leaving it out is
|
|
57
|
+
* leaving out a zero. A tether is invariant too, since it is measured from a
|
|
58
|
+
* held particle and that is on the axis, but it shares its accumulation with
|
|
59
|
+
* the slack row, which is not. It enters, and it can only shorten the step.
|
|
60
|
+
* - The last sum is the path's own curvature, `d²x/dθ² = −r⊥`. About a vertical
|
|
61
|
+
* axis gravity has no part in it and what is left is close to zero; about a
|
|
62
|
+
* horizontal one it is the pendulum's gravity stiffness. It is added only where
|
|
63
|
+
* it is positive, which keeps `H` at least the first sum, positive definite
|
|
64
|
+
* through the mass term: a step no longer than the one without it.
|
|
65
|
+
*
|
|
66
|
+
* ## When it runs
|
|
67
|
+
*
|
|
68
|
+
* When the held particles lie on one line **at this substep**, at two or more
|
|
69
|
+
* distinct points — a fact about the holds the predict already has in hand,
|
|
70
|
+
* since it carries every held particle. A single held point has three free turns
|
|
71
|
+
* and a cloth nothing holds has six; this block is the line's, and neither of
|
|
72
|
+
* those is handled here. It runs on a line gravity restores too, a horizontal
|
|
73
|
+
* one included, and there it has slowed some sleeps and kept one cloth awake
|
|
74
|
+
* (PLAN §18).
|
|
75
|
+
*
|
|
76
|
+
* It runs once a substep, in the **last** iteration, after the sweep and before
|
|
77
|
+
* that iteration's dual update. Run in every iteration it measured no better on
|
|
78
|
+
* a flag and cost 9–19% of a step rather than 3–9% (`MEASUREMENTS.md` §66).
|
|
79
|
+
*
|
|
80
|
+
* @author Alex Goldring
|
|
81
|
+
* @copyright Company Named Limited (c) 2026
|
|
82
|
+
*/
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* How far a held particle may sit off the line and still be on it, as a
|
|
86
|
+
* fraction of the largest coordinate among the held particles.
|
|
87
|
+
*
|
|
88
|
+
* Relative, because what it separates is rounding from geometry, and rounding is
|
|
89
|
+
* a proportion of magnitude. Held positions are `Float32` and are carried through
|
|
90
|
+
* the step in double and stored again at each substep. A flag turned off every
|
|
91
|
+
* axis, whose hoist is straight in exact arithmetic, measured at most 6.3e-8 of
|
|
92
|
+
* its largest coordinate off its own line — half a unit in the last place —
|
|
93
|
+
* from the origin out to four kilometres. This is 240 times that, and 15 µm at a
|
|
94
|
+
* metre. `MEASUREMENTS.md` §66.
|
|
95
|
+
*
|
|
96
|
+
* @type {number}
|
|
97
|
+
*/
|
|
98
|
+
export const CLOTH_HOLD_LINE_TOLERANCE = 2 ** -16;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Words of a hold line: the origin, then the unit direction.
|
|
102
|
+
* @type {number}
|
|
103
|
+
*/
|
|
104
|
+
export const CLOTH_HOLD_LINE_WORDS = 6;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Whether the held particles lie on one line, and which: written to `line` as
|
|
108
|
+
* the origin then the unit direction.
|
|
109
|
+
*
|
|
110
|
+
* The origin is the first held particle and the direction runs to the one
|
|
111
|
+
* furthest from it, which spans at least half of the set. Every held particle is
|
|
112
|
+
* then measured off that line.
|
|
113
|
+
*
|
|
114
|
+
* @param {Float64Array} line out, {@link CLOTH_HOLD_LINE_WORDS}
|
|
115
|
+
* @param {Float32Array} position
|
|
116
|
+
* @param {Int32Array} held particle indices
|
|
117
|
+
* @param {number} held_count
|
|
118
|
+
* @returns {boolean} `false` when there are fewer than two distinct held points
|
|
119
|
+
* or they are not on one line; `line` is then not written
|
|
120
|
+
*/
|
|
121
|
+
export function cloth_hold_line_fit(line, position, held, held_count) {
|
|
122
|
+
if (held_count < 2) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const o = held[0] * 3;
|
|
127
|
+
|
|
128
|
+
const ox = position[o];
|
|
129
|
+
const oy = position[o + 1];
|
|
130
|
+
const oz = position[o + 2];
|
|
131
|
+
|
|
132
|
+
let scale = Math.max(Math.abs(ox), Math.abs(oy), Math.abs(oz));
|
|
133
|
+
|
|
134
|
+
let far = o;
|
|
135
|
+
let far_squared = 0;
|
|
136
|
+
|
|
137
|
+
for (let k = 1; k < held_count; k++) {
|
|
138
|
+
const p = held[k] * 3;
|
|
139
|
+
|
|
140
|
+
const x = position[p];
|
|
141
|
+
const y = position[p + 1];
|
|
142
|
+
const z = position[p + 2];
|
|
143
|
+
|
|
144
|
+
const size_x = Math.abs(x);
|
|
145
|
+
const size_y = Math.abs(y);
|
|
146
|
+
const size_z = Math.abs(z);
|
|
147
|
+
|
|
148
|
+
if (size_x > scale) {
|
|
149
|
+
scale = size_x;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (size_y > scale) {
|
|
153
|
+
scale = size_y;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (size_z > scale) {
|
|
157
|
+
scale = size_z;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const dx = x - ox;
|
|
161
|
+
const dy = y - oy;
|
|
162
|
+
const dz = z - oz;
|
|
163
|
+
|
|
164
|
+
const d_squared = dx * dx + dy * dy + dz * dz;
|
|
165
|
+
|
|
166
|
+
if (d_squared > far_squared) {
|
|
167
|
+
far_squared = d_squared;
|
|
168
|
+
far = p;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const tolerance = CLOTH_HOLD_LINE_TOLERANCE * scale;
|
|
173
|
+
|
|
174
|
+
const far_distance = Math.sqrt(far_squared);
|
|
175
|
+
|
|
176
|
+
if (!(far_distance > tolerance)) {
|
|
177
|
+
// One point, however many particles are held at it.
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const inverse = 1 / far_distance;
|
|
182
|
+
|
|
183
|
+
const ax = (position[far] - ox) * inverse;
|
|
184
|
+
const ay = (position[far + 1] - oy) * inverse;
|
|
185
|
+
const az = (position[far + 2] - oz) * inverse;
|
|
186
|
+
|
|
187
|
+
const tolerance_squared = tolerance * tolerance;
|
|
188
|
+
|
|
189
|
+
for (let k = 1; k < held_count; k++) {
|
|
190
|
+
const p = held[k] * 3;
|
|
191
|
+
|
|
192
|
+
const rx = position[p] - ox;
|
|
193
|
+
const ry = position[p + 1] - oy;
|
|
194
|
+
const rz = position[p + 2] - oz;
|
|
195
|
+
|
|
196
|
+
const along = rx * ax + ry * ay + rz * az;
|
|
197
|
+
|
|
198
|
+
const qx = rx - along * ax;
|
|
199
|
+
const qy = ry - along * ay;
|
|
200
|
+
const qz = rz - along * az;
|
|
201
|
+
|
|
202
|
+
if (qx * qx + qy * qy + qz * qz > tolerance_squared) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
line[0] = ox;
|
|
208
|
+
line[1] = oy;
|
|
209
|
+
line[2] = oz;
|
|
210
|
+
line[3] = ax;
|
|
211
|
+
line[4] = ay;
|
|
212
|
+
line[5] = az;
|
|
213
|
+
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Take one Newton step of the substep's energy along the turn about `line`, and
|
|
219
|
+
* turn every free particle by the angle it gives — see the module docblock.
|
|
220
|
+
*
|
|
221
|
+
* @param {ClothState} state
|
|
222
|
+
* @param {Float64Array} line from {@link cloth_hold_line_fit}
|
|
223
|
+
* @param {number} inverse_h_squared `1/h²` for the substep in progress
|
|
224
|
+
* @param {Float32Array|Float64Array|null} collider_table as the vertex update
|
|
225
|
+
* takes it; `null` skips the contact rows
|
|
226
|
+
* @returns {number} the angle turned, radians; `0` when there is nothing to turn
|
|
227
|
+
*/
|
|
228
|
+
export function cloth_hold_line_turn(state, line, inverse_h_squared, collider_table) {
|
|
229
|
+
const particle_count = state.particle_count;
|
|
230
|
+
|
|
231
|
+
const position = state.position;
|
|
232
|
+
const inertial = state.inertial;
|
|
233
|
+
const mass_inverse = state.mass_inverse;
|
|
234
|
+
|
|
235
|
+
const ox = line[0];
|
|
236
|
+
const oy = line[1];
|
|
237
|
+
const oz = line[2];
|
|
238
|
+
const ax = line[3];
|
|
239
|
+
const ay = line[4];
|
|
240
|
+
const az = line[5];
|
|
241
|
+
|
|
242
|
+
const accumulator = ACCUMULATOR;
|
|
243
|
+
|
|
244
|
+
let gradient = 0;
|
|
245
|
+
let curvature = 0;
|
|
246
|
+
let path = 0;
|
|
247
|
+
|
|
248
|
+
for (let i = 0; i < particle_count; i++) {
|
|
249
|
+
const inverse_mass = mass_inverse[i];
|
|
250
|
+
|
|
251
|
+
if (inverse_mass === 0) {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const p = i * 3;
|
|
256
|
+
|
|
257
|
+
const x = position[p];
|
|
258
|
+
const y = position[p + 1];
|
|
259
|
+
const z = position[p + 2];
|
|
260
|
+
|
|
261
|
+
const rx = x - ox;
|
|
262
|
+
const ry = y - oy;
|
|
263
|
+
const rz = z - oz;
|
|
264
|
+
|
|
265
|
+
const tx = ay * rz - az * ry;
|
|
266
|
+
const ty = az * rx - ax * rz;
|
|
267
|
+
const tz = ax * ry - ay * rx;
|
|
268
|
+
|
|
269
|
+
// The vertex update's assembly, seeded the same way, with only the rows
|
|
270
|
+
// the turn can see.
|
|
271
|
+
cloth_vertex_accumulator_seed(accumulator, position, inertial, p, inverse_h_squared / inverse_mass);
|
|
272
|
+
|
|
273
|
+
cloth_leash_accumulate(accumulator, state, i);
|
|
274
|
+
cloth_backstop_accumulate(accumulator, state, i);
|
|
275
|
+
|
|
276
|
+
if (collider_table !== null) {
|
|
277
|
+
cloth_contact_accumulate(accumulator, state, i, collider_table);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// `f = −∇E_i`
|
|
281
|
+
const fx = accumulator[CVA_F_X];
|
|
282
|
+
const fy = accumulator[CVA_F_Y];
|
|
283
|
+
const fz = accumulator[CVA_F_Z];
|
|
284
|
+
|
|
285
|
+
gradient -= tx * fx + ty * fy + tz * fz;
|
|
286
|
+
|
|
287
|
+
const h_xx = accumulator[CVA_H_XX];
|
|
288
|
+
const h_yy = accumulator[CVA_H_YY];
|
|
289
|
+
const h_zz = accumulator[CVA_H_ZZ];
|
|
290
|
+
const h_xy = accumulator[CVA_H_XY];
|
|
291
|
+
const h_xz = accumulator[CVA_H_XZ];
|
|
292
|
+
const h_yz = accumulator[CVA_H_YZ];
|
|
293
|
+
|
|
294
|
+
curvature += tx * (h_xx * tx + h_xy * ty + h_xz * tz)
|
|
295
|
+
+ ty * (h_xy * tx + h_yy * ty + h_yz * tz)
|
|
296
|
+
+ tz * (h_xz * tx + h_yz * ty + h_zz * tz);
|
|
297
|
+
|
|
298
|
+
// `∇E_i·(a(a·r) − r)`, which is `f·r⊥`
|
|
299
|
+
const along = ax * rx + ay * ry + az * rz;
|
|
300
|
+
|
|
301
|
+
path += fx * (rx - along * ax) + fy * (ry - along * ay) + fz * (rz - along * az);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (path > 0) {
|
|
305
|
+
curvature += path;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (!(curvature > 0)) {
|
|
309
|
+
// Every free particle is on the axis: there is no turn to take.
|
|
310
|
+
return 0;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const theta = -gradient / curvature;
|
|
314
|
+
|
|
315
|
+
if (theta === 0) {
|
|
316
|
+
return 0;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Rodrigues, about the line through `o`.
|
|
320
|
+
const cos = Math.cos(theta);
|
|
321
|
+
const sin = Math.sin(theta);
|
|
322
|
+
const versine = 1 - cos;
|
|
323
|
+
|
|
324
|
+
for (let i = 0; i < particle_count; i++) {
|
|
325
|
+
if (mass_inverse[i] === 0) {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const p = i * 3;
|
|
330
|
+
|
|
331
|
+
const rx = position[p] - ox;
|
|
332
|
+
const ry = position[p + 1] - oy;
|
|
333
|
+
const rz = position[p + 2] - oz;
|
|
334
|
+
|
|
335
|
+
const along = (ax * rx + ay * ry + az * rz) * versine;
|
|
336
|
+
|
|
337
|
+
position[p] = ox + rx * cos + (ay * rz - az * ry) * sin + ax * along;
|
|
338
|
+
position[p + 1] = oy + ry * cos + (az * rx - ax * rz) * sin + ay * along;
|
|
339
|
+
position[p + 2] = oz + rz * cos + (ax * ry - ay * rx) * sin + az * along;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return theta;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* The `(f, H)` scratch, laid out as the vertex update's. Module-level and reused.
|
|
347
|
+
* @type {Float64Array}
|
|
348
|
+
* @private
|
|
349
|
+
*/
|
|
350
|
+
const ACCUMULATOR = new Float64Array(CVA_STRIDE);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Total kinetic energy of a cloth's free particles, `Σ ½·|v|²/w` over every
|
|
3
|
+
* particle with a non-zero inverse mass `w`, in joules.
|
|
4
|
+
*
|
|
5
|
+
* A held particle (`w = 0`) is skipped rather than treated as infinitely heavy:
|
|
6
|
+
* its velocity is whatever its holder gave it, and a cloth hanging still from a
|
|
7
|
+
* moving hand has come to rest in every sense §7 P5 means. A cloth that has
|
|
8
|
+
* settled reads zero and a cloth that is ringing does not, which is why the
|
|
9
|
+
* measurements read this rather than a displacement threshold.
|
|
10
|
+
*
|
|
11
|
+
* A diagnostic for specs, measurements and the playgrounds; nothing in the
|
|
12
|
+
* step reads it.
|
|
13
|
+
*
|
|
14
|
+
* @param {ClothState} state
|
|
15
|
+
* @returns {number} joules
|
|
16
|
+
*
|
|
17
|
+
* @author Alex Goldring
|
|
18
|
+
* @copyright Company Named Limited (c) 2026
|
|
19
|
+
*/
|
|
20
|
+
export function cloth_kinetic_energy(state: ClothState): number;
|
|
21
|
+
//# sourceMappingURL=cloth_kinetic_energy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloth_kinetic_energy.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_kinetic_energy.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,yDALa,MAAM,CA8BlB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Total kinetic energy of a cloth's free particles, `Σ ½·|v|²/w` over every
|
|
3
|
+
* particle with a non-zero inverse mass `w`, in joules.
|
|
4
|
+
*
|
|
5
|
+
* A held particle (`w = 0`) is skipped rather than treated as infinitely heavy:
|
|
6
|
+
* its velocity is whatever its holder gave it, and a cloth hanging still from a
|
|
7
|
+
* moving hand has come to rest in every sense §7 P5 means. A cloth that has
|
|
8
|
+
* settled reads zero and a cloth that is ringing does not, which is why the
|
|
9
|
+
* measurements read this rather than a displacement threshold.
|
|
10
|
+
*
|
|
11
|
+
* A diagnostic for specs, measurements and the playgrounds; nothing in the
|
|
12
|
+
* step reads it.
|
|
13
|
+
*
|
|
14
|
+
* @param {ClothState} state
|
|
15
|
+
* @returns {number} joules
|
|
16
|
+
*
|
|
17
|
+
* @author Alex Goldring
|
|
18
|
+
* @copyright Company Named Limited (c) 2026
|
|
19
|
+
*/
|
|
20
|
+
export function cloth_kinetic_energy(state) {
|
|
21
|
+
const particle_count = state.particle_count;
|
|
22
|
+
|
|
23
|
+
const mass_inverse = state.mass_inverse;
|
|
24
|
+
const velocity = state.velocity;
|
|
25
|
+
|
|
26
|
+
let energy = 0;
|
|
27
|
+
|
|
28
|
+
for (let i = 0; i < particle_count; i++) {
|
|
29
|
+
const w = mass_inverse[i];
|
|
30
|
+
|
|
31
|
+
if (w === 0) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const p = i * 3;
|
|
36
|
+
|
|
37
|
+
const vx = velocity[p];
|
|
38
|
+
const vy = velocity[p + 1];
|
|
39
|
+
const vz = velocity[p + 2];
|
|
40
|
+
|
|
41
|
+
energy += 0.5 * (vx * vx + vy * vy + vz * vz) / w;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return energy;
|
|
45
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The particle graph a cloth's rows imply: an edge between every two particles
|
|
3
|
+
* that share a row, as a sorted CSR adjacency.
|
|
4
|
+
*
|
|
5
|
+
* A stretch row couples its two endpoints; a bend stencil couples all six pairs
|
|
6
|
+
* of its four particles, since every one of them appears in the same row. Two
|
|
7
|
+
* build-time consumers want exactly this set — the colouring, where an edge is
|
|
8
|
+
* a pair that must not be updated at once (`cloth_color_particles.js`), and the
|
|
9
|
+
* self-collision exclusions, where it is a pair a row already governs
|
|
10
|
+
* (`cloth_self_find.js`) — and this is the one place it is built.
|
|
11
|
+
*
|
|
12
|
+
* The set is deduplicated, because a garment adds every hinge's shared edge
|
|
13
|
+
* once as a stretch row and again as a bend pair, so duplicates are the common
|
|
14
|
+
* case; and a row that names one particle twice couples nothing. Each particle's
|
|
15
|
+
* partners come out ascending, which is the contract the exclusion scans read.
|
|
16
|
+
*
|
|
17
|
+
* Build-time only: it allocates its result and a scratch the size of the
|
|
18
|
+
* half-edge list.
|
|
19
|
+
*
|
|
20
|
+
* @param {number} particle_count
|
|
21
|
+
* @param {Int32Array|number[]} stretch_particle particle index pairs, 2 per row
|
|
22
|
+
* @param {number} stretch_count
|
|
23
|
+
* @param {Int32Array|number[]} bend_particle particle index quads, 4 per row
|
|
24
|
+
* @param {number} bend_count
|
|
25
|
+
* @returns {{offset: Int32Array, partner: Int32Array}} `partner[offset[i] .. offset[i + 1])` are the
|
|
26
|
+
* particles sharing a row with `i`, ascending, without `i` itself
|
|
27
|
+
*/
|
|
28
|
+
export function cloth_particle_coupling(particle_count: number, stretch_particle: Int32Array | number[], stretch_count: number, bend_particle: Int32Array | number[], bend_count: number): {
|
|
29
|
+
offset: Int32Array;
|
|
30
|
+
partner: Int32Array;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=cloth_particle_coupling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloth_particle_coupling.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/solver/cloth_particle_coupling.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wDARW,MAAM,oBACN,UAAU,GAAC,MAAM,EAAE,iBACnB,MAAM,iBACN,UAAU,GAAC,MAAM,EAAE,cACnB,MAAM,GACJ;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAC,CAyGrD"}
|