@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
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { v3_distance_array } from "../../../../core/geom/vec3/v3_distance_array.js";
|
|
2
|
+
import { clamp01 } from "../../../../core/math/clamp01.js";
|
|
3
|
+
import { csr_build_incidence } from "../../../../core/graph/csr/csr_build_incidence.js";
|
|
1
4
|
import { ClothState } from "../solver/ClothState.js";
|
|
2
5
|
import { ClothDynamicsFlags } from "./ClothDynamicsFlags.js";
|
|
3
6
|
import { cloth_self_closest_free_pair, cloth_self_exclusions } from "../solver/cloth_self_find.js";
|
|
4
7
|
import { cloth_bend_ratio, cloth_strain_allowance } from "./cloth_dynamics_map.js";
|
|
8
|
+
import { cloth_edge_incidence } from "./cloth_geodesic.js";
|
|
9
|
+
import { cloth_bend_stencil_weights } from "../solver/constraint/cloth_bend_row.js";
|
|
10
|
+
import { cloth_particle_of_source } from "../solver/cloth_particle_of_source.js";
|
|
5
11
|
|
|
6
12
|
/**
|
|
7
13
|
* # The rows, and everything that is a number rather than a walk
|
|
@@ -12,12 +18,19 @@ import { cloth_bend_ratio, cloth_strain_allowance } from "./cloth_dynamics_map.j
|
|
|
12
18
|
* proxy's baked joint list — and what they do identically is everything after
|
|
13
19
|
* that, because a row does not care what a node was made of.
|
|
14
20
|
*
|
|
15
|
-
* So the split is: a seeder produces
|
|
16
|
-
* {@link
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
+
* So the split is: a seeder produces the particles' rest pose and the **graph**
|
|
22
|
+
* joining them — {@link ClothInstance#edge}, {@link ClothInstance#skip},
|
|
23
|
+
* {@link ClothInstance#hinge} — and {@link cloth_build_rows} turns those into
|
|
24
|
+
* geodesics, fabric rows, strain-limit rows, bending rows, leashes and the
|
|
25
|
+
* `ClothState` itself. M3 moved this out of `cloth_seed_subtree.js` unchanged
|
|
26
|
+
* rather than writing a second copy for the rig path, which is the whole reason
|
|
27
|
+
* §11 could say "the solver is identical either way; only seeding and
|
|
28
|
+
* write-back differ" and mean it.
|
|
29
|
+
*
|
|
30
|
+
* The rows are built from a graph rather than from a parent array because a row
|
|
31
|
+
* is a pair or a quad and has no use for a parent. A tree hands over its parent
|
|
32
|
+
* links and its skip pairs ({@link cloth_tree_graph}); a mesh would hand over
|
|
33
|
+
* its edges and hinges; the rows below are the same code either way.
|
|
21
34
|
*
|
|
22
35
|
* @author Alex Goldring
|
|
23
36
|
* @copyright Company Named Limited (c) 2026
|
|
@@ -36,9 +49,10 @@ export const CLOTH_PARTICLE_MASS = 0.02;
|
|
|
36
49
|
* Slack radius at `ClothDynamics#slack = 1`, as a multiple of `d_geo`.
|
|
37
50
|
*
|
|
38
51
|
* It is **2**, and that is a derivation rather than a taste. The tether row
|
|
39
|
-
* already holds every particle within `d_geo` of the
|
|
40
|
-
* position it is leashed to is itself within `d_geo` of
|
|
41
|
-
* never longer than the arc it subtends
|
|
52
|
+
* already holds every particle within `d_geo` of the held particle it hangs
|
|
53
|
+
* from, and the animated position it is leashed to is itself within `d_geo` of
|
|
54
|
+
* that particle — a chord is never longer than the arc it subtends, and the
|
|
55
|
+
* animated pose is the rest pose hung from it (`ClothInstance#animated_position`). By the triangle inequality the two can
|
|
42
56
|
* therefore never be more than `2·d_geo` apart, so a slack radius of `2·d_geo`
|
|
43
57
|
* is **provably inactive** and `slack = 1` means exactly "no leash" with no
|
|
44
58
|
* sentinel value and no discontinuity to code around.
|
|
@@ -62,32 +76,157 @@ export function cloth_build_children(instance) {
|
|
|
62
76
|
const node_count = instance.node_count;
|
|
63
77
|
const parent = instance.node_parent;
|
|
64
78
|
|
|
65
|
-
|
|
79
|
+
let child_count = 0;
|
|
66
80
|
|
|
67
|
-
for (let node =
|
|
68
|
-
|
|
81
|
+
for (let node = 0; node < node_count; node++) {
|
|
82
|
+
if (parent[node] >= 0) {
|
|
83
|
+
child_count++;
|
|
84
|
+
}
|
|
69
85
|
}
|
|
70
86
|
|
|
87
|
+
const offset = new Int32Array(node_count + 1);
|
|
88
|
+
const child = new Int32Array(child_count);
|
|
89
|
+
|
|
90
|
+
// a root's parent is −1, which is in no bucket
|
|
91
|
+
csr_build_incidence(offset, child, parent, node_count, node_count);
|
|
92
|
+
|
|
93
|
+
instance.node_child_offset = offset;
|
|
94
|
+
instance.node_child = child;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The particle graph of a tree: a fabric edge from every node to its parent,
|
|
99
|
+
* and a skip pair from every node to its grandparent.
|
|
100
|
+
*
|
|
101
|
+
* The skip pair is a chain's bending model (`cloth_seed_subtree.js` carries the
|
|
102
|
+
* argument), and it is part of the graph rather than something the row builder
|
|
103
|
+
* derives from a parent array, so that the row builder never needs one.
|
|
104
|
+
*
|
|
105
|
+
* @param {ClothInstance} instance with {@link ClothInstance#node_parent} set
|
|
106
|
+
* @returns {void}
|
|
107
|
+
*/
|
|
108
|
+
export function cloth_tree_graph(instance) {
|
|
109
|
+
const node_count = instance.node_count;
|
|
110
|
+
const parent = instance.node_parent;
|
|
111
|
+
|
|
112
|
+
const edge = [];
|
|
113
|
+
const skip = [];
|
|
114
|
+
|
|
71
115
|
for (let node = 0; node < node_count; node++) {
|
|
72
|
-
|
|
116
|
+
const p = parent[node];
|
|
117
|
+
|
|
118
|
+
if (p < 0) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
edge.push(p, node);
|
|
123
|
+
|
|
124
|
+
const grandparent = parent[p];
|
|
125
|
+
|
|
126
|
+
if (grandparent >= 0) {
|
|
127
|
+
skip.push(grandparent, node);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
instance.edge = Int32Array.from(edge);
|
|
132
|
+
instance.skip = Int32Array.from(skip);
|
|
133
|
+
instance.hinge = new Int32Array(0);
|
|
134
|
+
instance.triangle = new Int32Array(0);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* The triangles around each node, CSR, and one neighbour per node to measure a
|
|
139
|
+
* tangent by — what `cloth_reconstruct_pose` turns a sheet's joints with. A
|
|
140
|
+
* cloth with no triangles gets none.
|
|
141
|
+
*
|
|
142
|
+
* @param {ClothInstance} instance with {@link ClothInstance#triangle} and
|
|
143
|
+
* {@link ClothInstance#edge} set
|
|
144
|
+
* @returns {void}
|
|
145
|
+
*/
|
|
146
|
+
export function cloth_build_surface(instance) {
|
|
147
|
+
const node_count = instance.node_count;
|
|
148
|
+
const triangle = instance.triangle;
|
|
149
|
+
|
|
150
|
+
const triangle_count = triangle.length / 3;
|
|
151
|
+
|
|
152
|
+
if (triangle_count === 0) {
|
|
153
|
+
instance.surface_offset = null;
|
|
154
|
+
instance.surface_triangle = null;
|
|
155
|
+
instance.surface_neighbour = null;
|
|
156
|
+
|
|
157
|
+
return;
|
|
73
158
|
}
|
|
74
159
|
|
|
75
|
-
const
|
|
76
|
-
const
|
|
160
|
+
const offset = new Int32Array(node_count + 1);
|
|
161
|
+
const surface = new Int32Array(triangle_count * 3);
|
|
162
|
+
|
|
163
|
+
csr_build_incidence(offset, surface, triangle, triangle_count * 3, node_count);
|
|
77
164
|
|
|
78
|
-
|
|
79
|
-
|
|
165
|
+
// a corner's flat index `t·3 + k` to its triangle `t`
|
|
166
|
+
for (let i = 0; i < triangle_count * 3; i++) {
|
|
167
|
+
surface[i] = (surface[i] / 3) | 0;
|
|
80
168
|
}
|
|
81
169
|
|
|
82
|
-
|
|
83
|
-
|
|
170
|
+
// the first edge each node has: fixed for the life of the seed, which is all
|
|
171
|
+
// a reference direction has to be
|
|
172
|
+
const neighbour = new Int32Array(node_count).fill(-1);
|
|
173
|
+
|
|
174
|
+
const edge = instance.edge;
|
|
175
|
+
|
|
176
|
+
for (let e = 0; e < edge.length; e += 2) {
|
|
177
|
+
const a = edge[e];
|
|
178
|
+
const b = edge[e + 1];
|
|
179
|
+
|
|
180
|
+
if (neighbour[a] === -1) {
|
|
181
|
+
neighbour[a] = b;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (neighbour[b] === -1) {
|
|
185
|
+
neighbour[b] = a;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
instance.surface_offset = offset;
|
|
190
|
+
instance.surface_triangle = surface;
|
|
191
|
+
instance.surface_neighbour = neighbour;
|
|
84
192
|
}
|
|
85
193
|
|
|
194
|
+
/**
|
|
195
|
+
* How much a hinge resists, as a stiffness, for a fabric's `bend` ratio.
|
|
196
|
+
*
|
|
197
|
+
* The same rule the skip row follows: a ratio of the row's own effective
|
|
198
|
+
* inertia over the fixed step squared. A hinge's gradient on particle `k` is
|
|
199
|
+
* `w_k` along each axis, so its effective inertia is `1 / Σ (w_k² / m_k)` —
|
|
200
|
+
* `m / Σ w_k²` with one mass — and a hinge across a sliver, whose cotangents are
|
|
201
|
+
* large, is softer per unit `C` for exactly the reason its `C` is larger. A
|
|
202
|
+
* stiffness in newtons per metre, which is what Bergou's `6·modulus/A` is,
|
|
203
|
+
* would leave M0's dissipative band wherever the triangles are thin.
|
|
204
|
+
*
|
|
205
|
+
* @param {Float32Array} weight 4 per hinge
|
|
206
|
+
* @param {number} hinge
|
|
207
|
+
* @returns {number} the hinge's effective inertia, kg
|
|
208
|
+
*/
|
|
209
|
+
export function cloth_hinge_inertia(weight, hinge) {
|
|
210
|
+
let sum = 0;
|
|
211
|
+
|
|
212
|
+
for (let k = 0; k < 4; k++) {
|
|
213
|
+
const w = weight[hinge * 4 + k];
|
|
214
|
+
|
|
215
|
+
sum += w * w;
|
|
216
|
+
}
|
|
86
217
|
|
|
218
|
+
return sum > 0 ? CLOTH_PARTICLE_MASS / sum : 0;
|
|
219
|
+
}
|
|
87
220
|
|
|
88
221
|
/**
|
|
89
|
-
* Rows
|
|
90
|
-
*
|
|
222
|
+
* Rows and the `ClothState` itself, from a seeded rest pose and the graph over
|
|
223
|
+
* it.
|
|
224
|
+
*
|
|
225
|
+
* **Nothing is held here.** Every particle is built free, with a tether row and
|
|
226
|
+
* — when the fabric is leashed at all — a slack row of radius `Infinity`, which
|
|
227
|
+
* say nothing until `cloth_apply_holds` points them at what the particle hangs
|
|
228
|
+
* from. The shape of the leash table is fixed by the particle count, so holding
|
|
229
|
+
* and letting go rewrite numbers in it rather than building it again.
|
|
91
230
|
*
|
|
92
231
|
* @param {ClothInstance} instance
|
|
93
232
|
* @param {number} dt
|
|
@@ -96,22 +235,22 @@ export function cloth_build_children(instance) {
|
|
|
96
235
|
export function cloth_build_rows(instance, dt) {
|
|
97
236
|
const node_count = instance.node_count;
|
|
98
237
|
|
|
99
|
-
const
|
|
100
|
-
const rest = instance.animated_position;
|
|
238
|
+
const rest = instance.rest_position;
|
|
101
239
|
|
|
102
|
-
const
|
|
240
|
+
const edge = instance.edge;
|
|
241
|
+
const skip = instance.skip;
|
|
242
|
+
const hinge = instance.hinge;
|
|
103
243
|
|
|
104
|
-
const
|
|
244
|
+
const edge_count = edge.length >> 1;
|
|
245
|
+
const skip_count = skip.length >> 1;
|
|
246
|
+
const hinge_count = hinge.length >> 2;
|
|
105
247
|
|
|
106
|
-
const
|
|
248
|
+
const dynamics = instance.cloth.dynamics;
|
|
107
249
|
|
|
108
|
-
const
|
|
250
|
+
const strain_limited = (dynamics.flags & ClothDynamicsFlags.StrainLimit) !== 0;
|
|
109
251
|
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
for (let node = 1; node < node_count; node++) {
|
|
113
|
-
mass_inverse[node] = 1 / CLOTH_PARTICLE_MASS;
|
|
114
|
-
}
|
|
252
|
+
// Free, every one: what is held is the holds' business.
|
|
253
|
+
const mass_inverse = new Float32Array(node_count).fill(1 / CLOTH_PARTICLE_MASS);
|
|
115
254
|
|
|
116
255
|
const stretch_particle = [];
|
|
117
256
|
const stretch_rest = [];
|
|
@@ -119,47 +258,35 @@ export function cloth_build_rows(instance, dt) {
|
|
|
119
258
|
const stretch_force_min = [];
|
|
120
259
|
const stretch_force_max = [];
|
|
121
260
|
|
|
122
|
-
const
|
|
123
|
-
const strain_row = new Int32Array(node_count).fill(-1);
|
|
124
|
-
const skip_row = new Int32Array(node_count).fill(-1);
|
|
125
|
-
|
|
126
|
-
const strain = cloth_strain_allowance(dynamics.stretch);
|
|
261
|
+
const edge_length = new Float64Array(edge_count);
|
|
127
262
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
* (CLOTH_PARTICLE_MASS * 0.5) / (dt * dt);
|
|
132
|
-
|
|
133
|
-
let reach = 0;
|
|
263
|
+
const edge_row = new Int32Array(edge_count).fill(-1);
|
|
264
|
+
const strain_row = new Int32Array(edge_count).fill(-1);
|
|
265
|
+
const skip_row = new Int32Array(skip_count).fill(-1);
|
|
134
266
|
|
|
135
|
-
|
|
136
|
-
const p = parent[node];
|
|
267
|
+
const strain = cloth_strain_allowance(dynamics.stretch);
|
|
137
268
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
rest[node * 3 + 2] - rest[p * 3 + 2]
|
|
142
|
-
);
|
|
269
|
+
for (let e = 0; e < edge_count; e++) {
|
|
270
|
+
const a = edge[e * 2];
|
|
271
|
+
const b = edge[e * 2 + 1];
|
|
143
272
|
|
|
144
|
-
|
|
273
|
+
const length = v3_distance_array(rest, a * 3, rest, b * 3);
|
|
145
274
|
|
|
146
|
-
|
|
147
|
-
reach = geodesic[node];
|
|
148
|
-
}
|
|
275
|
+
edge_length[e] = length;
|
|
149
276
|
|
|
150
|
-
|
|
277
|
+
edge_row[e] = stretch_rest.length;
|
|
151
278
|
|
|
152
279
|
// Hard, bilateral: the fabric row. It is hard because a *penalty* stiff
|
|
153
280
|
// enough to be fabric adds energy rather than dissipating it — see
|
|
154
281
|
// `cloth_dynamics_map.js`, and `MEASUREMENTS.md` §6 for the +6.8 J.
|
|
155
|
-
stretch_particle.push(
|
|
282
|
+
stretch_particle.push(a, b);
|
|
156
283
|
stretch_rest.push(length);
|
|
157
284
|
stretch_stiffness.push(Infinity);
|
|
158
285
|
stretch_force_min.push(-Infinity);
|
|
159
286
|
stretch_force_max.push(Infinity);
|
|
160
287
|
|
|
161
288
|
if (strain_limited) {
|
|
162
|
-
strain_row[
|
|
289
|
+
strain_row[e] = stretch_rest.length;
|
|
163
290
|
|
|
164
291
|
// Hard, one-sided: §6's strain limit, and note the clamp. A row
|
|
165
292
|
// that bounds a distance from ABOVE may only apply force that
|
|
@@ -167,56 +294,89 @@ export function cloth_build_rows(instance, dt) {
|
|
|
167
294
|
// `[0, +∞)`. §6's table has this row at `(−∞, 0]`, which is the
|
|
168
295
|
// force that pushes the two ends apart; `cloth_leash_row.js`
|
|
169
296
|
// carries the derivation and a spec that shows it directly.
|
|
170
|
-
stretch_particle.push(
|
|
297
|
+
stretch_particle.push(a, b);
|
|
171
298
|
stretch_rest.push(length * (1 + strain));
|
|
172
299
|
stretch_stiffness.push(Infinity);
|
|
173
300
|
stretch_force_min.push(0);
|
|
174
301
|
stretch_force_max.push(Infinity);
|
|
175
302
|
}
|
|
303
|
+
}
|
|
176
304
|
|
|
177
|
-
|
|
305
|
+
// A skip row spans two links and both of its ends are free, so its
|
|
306
|
+
// effective inertia along the constraint is half a particle's.
|
|
307
|
+
const bend_stiffness = cloth_bend_ratio(dynamics.bend)
|
|
308
|
+
* (CLOTH_PARTICLE_MASS * 0.5) / (dt * dt);
|
|
178
309
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
rest[node * 3 + 2] - rest[grandparent * 3 + 2]
|
|
184
|
-
);
|
|
310
|
+
if (bend_stiffness > 0) {
|
|
311
|
+
for (let s = 0; s < skip_count; s++) {
|
|
312
|
+
const a = skip[s * 2];
|
|
313
|
+
const b = skip[s * 2 + 1];
|
|
185
314
|
|
|
186
|
-
skip_row[
|
|
315
|
+
skip_row[s] = stretch_rest.length;
|
|
187
316
|
|
|
188
317
|
// Soft, bilateral: the bending model. Its rest length is read from
|
|
189
318
|
// the authored pose, so a chain authored with a curve holds it.
|
|
190
|
-
stretch_particle.push(
|
|
191
|
-
stretch_rest.push(
|
|
319
|
+
stretch_particle.push(a, b);
|
|
320
|
+
stretch_rest.push(v3_distance_array(rest, a * 3, rest, b * 3));
|
|
192
321
|
stretch_stiffness.push(bend_stiffness);
|
|
193
322
|
stretch_force_min.push(-Infinity);
|
|
194
323
|
stretch_force_max.push(Infinity);
|
|
195
324
|
}
|
|
196
325
|
}
|
|
197
326
|
|
|
327
|
+
// A surface bends through its hinges: §6's quadratic stencil, its weights
|
|
328
|
+
// read from the rest pose, its stiffness a ratio of its own inertia.
|
|
329
|
+
const bend_ratio = cloth_bend_ratio(dynamics.bend);
|
|
330
|
+
|
|
331
|
+
const hinge_built = bend_ratio > 0 ? hinge_count : 0;
|
|
332
|
+
|
|
333
|
+
const bend_weight = new Float32Array(hinge_built * 4);
|
|
334
|
+
const hinge_stiffness = new Float32Array(hinge_built);
|
|
335
|
+
const hinge_inertia = new Float32Array(hinge_built);
|
|
336
|
+
|
|
337
|
+
for (let h = 0; h < hinge_built; h++) {
|
|
338
|
+
cloth_bend_stencil_weights(
|
|
339
|
+
bend_weight, h * 4, rest,
|
|
340
|
+
hinge[h * 4], hinge[h * 4 + 1], hinge[h * 4 + 2], hinge[h * 4 + 3]
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
hinge_inertia[h] = cloth_hinge_inertia(bend_weight, h);
|
|
344
|
+
hinge_stiffness[h] = bend_ratio * hinge_inertia[h] / (dt * dt);
|
|
345
|
+
}
|
|
346
|
+
|
|
198
347
|
const leash_particle = [];
|
|
199
348
|
const leash_radius = [];
|
|
200
349
|
|
|
201
350
|
const slack_row = new Int32Array(node_count).fill(-1);
|
|
202
351
|
const tether_row = new Int32Array(node_count).fill(-1);
|
|
203
352
|
|
|
204
|
-
const
|
|
353
|
+
const leashed = clamp01(dynamics.slack) < 1;
|
|
205
354
|
|
|
206
|
-
for (let node =
|
|
355
|
+
for (let node = 0; node < node_count; node++) {
|
|
207
356
|
// Tether first: §7 P2's long-range attachment, and the row that makes a
|
|
208
357
|
// low iteration budget viable at all, because being hard it is enforced
|
|
209
358
|
// almost exactly in one iteration however deep the chain is.
|
|
210
359
|
tether_row[node] = leash_radius.length;
|
|
211
360
|
|
|
212
361
|
leash_particle.push(node);
|
|
213
|
-
leash_radius.push(
|
|
362
|
+
leash_radius.push(Infinity);
|
|
214
363
|
|
|
215
|
-
if (
|
|
364
|
+
if (leashed) {
|
|
216
365
|
slack_row[node] = leash_radius.length;
|
|
217
366
|
|
|
218
367
|
leash_particle.push(node);
|
|
219
|
-
leash_radius.push(
|
|
368
|
+
leash_radius.push(Infinity);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Until the holds say otherwise, everything hangs from the frame.
|
|
373
|
+
let reach = 0;
|
|
374
|
+
|
|
375
|
+
for (let node = 0; node < node_count; node++) {
|
|
376
|
+
const r = Math.hypot(rest[node * 3], rest[node * 3 + 1], rest[node * 3 + 2]);
|
|
377
|
+
|
|
378
|
+
if (r > reach) {
|
|
379
|
+
reach = r;
|
|
220
380
|
}
|
|
221
381
|
}
|
|
222
382
|
|
|
@@ -232,9 +392,13 @@ export function cloth_build_rows(instance, dt) {
|
|
|
232
392
|
// authority to speak of and its reach is the only length it carries.
|
|
233
393
|
instance.shortest_row = shortest_row < Infinity ? shortest_row : reach;
|
|
234
394
|
|
|
235
|
-
instance.geodesic =
|
|
395
|
+
instance.geodesic = new Float32Array(node_count).fill(Infinity);
|
|
396
|
+
instance.tether_source = new Int32Array(node_count).fill(-1);
|
|
397
|
+
instance.edge_length = edge_length;
|
|
398
|
+
instance.edge_incidence = cloth_edge_incidence(node_count, edge);
|
|
399
|
+
instance.hinge_inertia = hinge_inertia;
|
|
236
400
|
instance.reach = reach;
|
|
237
|
-
instance.
|
|
401
|
+
instance.edge_row = edge_row;
|
|
238
402
|
instance.strain_row = strain_row;
|
|
239
403
|
instance.skip_row = skip_row;
|
|
240
404
|
instance.slack_row = slack_row;
|
|
@@ -248,6 +412,9 @@ export function cloth_build_rows(instance, dt) {
|
|
|
248
412
|
stretch_stiffness: Float32Array.from(stretch_stiffness),
|
|
249
413
|
stretch_force_min: Float32Array.from(stretch_force_min),
|
|
250
414
|
stretch_force_max: Float32Array.from(stretch_force_max),
|
|
415
|
+
bend_particle: hinge.subarray(0, hinge_built * 4),
|
|
416
|
+
bend_weight,
|
|
417
|
+
bend_stiffness: hinge_stiffness,
|
|
251
418
|
leash_particle: Int32Array.from(leash_particle),
|
|
252
419
|
leash_radius: Float32Array.from(leash_radius),
|
|
253
420
|
shared: instance.shared_state
|
|
@@ -255,9 +422,7 @@ export function cloth_build_rows(instance, dt) {
|
|
|
255
422
|
|
|
256
423
|
const particle_of_node = new Int32Array(node_count);
|
|
257
424
|
|
|
258
|
-
|
|
259
|
-
particle_of_node[state.source_of_particle[particle]] = particle;
|
|
260
|
-
}
|
|
425
|
+
cloth_particle_of_source(particle_of_node, state.source_of_particle, node_count);
|
|
261
426
|
|
|
262
427
|
// Everything derived from the rows, derived again — and from the bind pose,
|
|
263
428
|
// which is what `closest_free_pair` has to be measured in: the answer is a
|
|
@@ -278,19 +443,21 @@ export function cloth_build_rows(instance, dt) {
|
|
|
278
443
|
instance.particle_of_node = particle_of_node;
|
|
279
444
|
instance.blended_position = new Float64Array(node_count * 3);
|
|
280
445
|
instance.blended_rotation = new Float64Array(node_count * 4);
|
|
446
|
+
|
|
447
|
+
instance.node_hold = new Int32Array(node_count).fill(-1);
|
|
448
|
+
instance.tether_loose = new Uint8Array(node_count);
|
|
449
|
+
instance.tether_loose_count = 0;
|
|
450
|
+
instance.node_hold_slot = new Int32Array(node_count).fill(-1);
|
|
451
|
+
instance.held_target = new Float64Array(node_count * 3);
|
|
452
|
+
|
|
453
|
+
// Nothing held yet, so the animated pose is the rest pose.
|
|
454
|
+
instance.animated_position = Float64Array.from(rest);
|
|
455
|
+
instance.animated_rotation = Float64Array.from(instance.rest_rotation);
|
|
456
|
+
|
|
281
457
|
instance.state = state;
|
|
282
458
|
instance.seeded = true;
|
|
283
459
|
}
|
|
284
460
|
|
|
285
|
-
/**
|
|
286
|
-
* @param {number} v
|
|
287
|
-
* @returns {number}
|
|
288
|
-
* @private
|
|
289
|
-
*/
|
|
290
|
-
function clamp01(v) {
|
|
291
|
-
return v < 0 ? 0 : (v > 1 ? 1 : v);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
461
|
/**
|
|
295
462
|
* Re-parameterise the rows of an already-seeded cloth from its current
|
|
296
463
|
* {@link ClothDynamics}, without walking the subtree again.
|
|
@@ -313,32 +480,61 @@ export function cloth_reparameterise(instance, dt) {
|
|
|
313
480
|
|
|
314
481
|
const state = instance.state;
|
|
315
482
|
|
|
316
|
-
const node_count = instance.node_count;
|
|
317
|
-
|
|
318
483
|
const strain = cloth_strain_allowance(dynamics.stretch);
|
|
319
484
|
|
|
485
|
+
const edge_row = instance.edge_row;
|
|
486
|
+
const strain_row = instance.strain_row;
|
|
487
|
+
|
|
488
|
+
for (let e = 0; e < strain_row.length; e++) {
|
|
489
|
+
const strain_limit = strain_row[e];
|
|
490
|
+
|
|
491
|
+
if (strain_limit >= 0) {
|
|
492
|
+
state.stretch_rest[strain_limit] = state.stretch_rest[edge_row[e]] * (1 + strain);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
320
496
|
const bend_stiffness = cloth_bend_ratio(dynamics.bend)
|
|
321
497
|
* (CLOTH_PARTICLE_MASS * 0.5) / (dt * dt);
|
|
322
498
|
|
|
499
|
+
const skip_row = instance.skip_row;
|
|
500
|
+
|
|
501
|
+
for (let s = 0; s < skip_row.length; s++) {
|
|
502
|
+
const row = skip_row[s];
|
|
503
|
+
|
|
504
|
+
if (row >= 0) {
|
|
505
|
+
state.stretch_stiffness[row] = bend_stiffness;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// A hinge is bend row `h`, in the order they were built.
|
|
510
|
+
const bend_ratio = cloth_bend_ratio(dynamics.bend);
|
|
511
|
+
const hinge_inertia = instance.hinge_inertia;
|
|
512
|
+
|
|
513
|
+
for (let h = 0; h < state.bend_count; h++) {
|
|
514
|
+
const stiffness = bend_ratio * hinge_inertia[h] / (dt * dt);
|
|
515
|
+
|
|
516
|
+
state.bend_stiffness[h] = stiffness;
|
|
517
|
+
state.bend_penalty[h] = stiffness;
|
|
518
|
+
}
|
|
519
|
+
|
|
323
520
|
const slack_scale = CLOTH_SLACK_REACH * clamp01(dynamics.slack);
|
|
324
521
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
const skip = instance.skip_row[node];
|
|
522
|
+
const node_count = instance.node_count;
|
|
523
|
+
|
|
524
|
+
for (let node = 0; node < node_count; node++) {
|
|
329
525
|
const slack = instance.slack_row[node];
|
|
330
526
|
|
|
331
|
-
if (
|
|
332
|
-
|
|
527
|
+
if (slack < 0) {
|
|
528
|
+
continue;
|
|
333
529
|
}
|
|
334
530
|
|
|
335
|
-
|
|
336
|
-
state.stretch_stiffness[skip] = bend_stiffness;
|
|
337
|
-
}
|
|
531
|
+
const d = instance.geodesic[node];
|
|
338
532
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
533
|
+
// A free particle something holds; anything else has no bound to scale,
|
|
534
|
+
// and `0 · Infinity` would be a NaN where `Infinity` is meant.
|
|
535
|
+
state.leash_radius[slack] = d < Infinity && instance.node_hold[node] === -1
|
|
536
|
+
? slack_scale * d
|
|
537
|
+
: Infinity;
|
|
342
538
|
}
|
|
343
539
|
|
|
344
540
|
instance.dynamics_seen.copy(dynamics);
|
|
@@ -195,9 +195,10 @@ export const CLOTH_VELOCITY_CORRECTION_MARGIN: number;
|
|
|
195
195
|
*/
|
|
196
196
|
export const CLOTH_DAMPING_RATE: number;
|
|
197
197
|
/**
|
|
198
|
-
* How far a cloth's
|
|
198
|
+
* How far a cloth's frame may carry it in one fixed step, as a multiple of the
|
|
199
199
|
* cloth's own reach. Motion above this is felt as though it were exactly this,
|
|
200
|
-
* which is what "anchor speed limit" means in §7 P7
|
|
200
|
+
* which is what "anchor speed limit" means in §7 P7 — the frame being what the
|
|
201
|
+
* cloth rides.
|
|
201
202
|
*
|
|
202
203
|
* Expressing it as a fraction of reach rather than in metres per second is what
|
|
203
204
|
* makes it work for a 3 cm pendant and a 30 m mooring line at the same time: a
|
|
@@ -208,9 +209,9 @@ export const CLOTH_DAMPING_RATE: number;
|
|
|
208
209
|
* badly-keyed cut does exceed.
|
|
209
210
|
* @type {number}
|
|
210
211
|
*/
|
|
211
|
-
export const
|
|
212
|
+
export const CLOTH_FRAME_TRAVEL_REACH: number;
|
|
212
213
|
/**
|
|
213
|
-
* How far a cloth's
|
|
214
|
+
* How far a cloth's frame may rotate in one fixed step, radians. Rotation
|
|
214
215
|
* above this is felt as though it were exactly this.
|
|
215
216
|
*
|
|
216
217
|
* Unlike the travel limit this has no length scale to hang off — an angle is
|
|
@@ -218,10 +219,11 @@ export const CLOTH_ANCHOR_TRAVEL_REACH: number;
|
|
|
218
219
|
* about 1,700 degrees a second, which is a spin rather than a turn.
|
|
219
220
|
* @type {number}
|
|
220
221
|
*/
|
|
221
|
-
export const
|
|
222
|
+
export const CLOTH_FRAME_ROTATION_LIMIT: number;
|
|
222
223
|
/**
|
|
223
|
-
*
|
|
224
|
-
* above which the motion is a **teleport**
|
|
224
|
+
* Displacement of the frame, or of a holder in the frame, in one fixed step, as
|
|
225
|
+
* a multiple of the cloth's reach, above which the motion is a **teleport**
|
|
226
|
+
* rather than locomotion (§7 P6).
|
|
225
227
|
*
|
|
226
228
|
* Four reaches in one step is 240 reaches a second: for a 1 m rope that is
|
|
227
229
|
* 240 m/s, well past anything the world moves at and well short of the values a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloth_dynamics_map.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/ecs/cloth_dynamics_map.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cloth_dynamics_map.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/cloth/ecs/cloth_dynamics_map.js"],"names":[],"mappings":"AAuQA;;;;;;;;GAQG;AACH,gDAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;GAQG;AACH,uCAHW,MAAM,GACJ,MAAM,CAUlB;AAED;;;;;;;;;;;GAWG;AACH,mDAPW,MAAM,YAEN,MAAM,cACN,MAAM,MACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,0CAJW,MAAM,MACN,MAAM,GACJ,MAAM,CAYlB;AAED;;;;;;;;GAQG;AACH,kDAJW,MAAM,MACN,MAAM,GACJ,MAAM,CAQlB;AA7WD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH;;;;;GAKG;AACH,+BAFU,MAAM,CAEqB;AAErC;;;;;GAKG;AACH,+BAFU,MAAM,CAEqB;AAErC;;;;;;;;;;;GAWG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;GAKG;AACH,mCAFU,MAAM,CAEyB;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,+CAFU,MAAM,CAEkC;AAElD;;;;;;;;GAQG;AACH,iCAFU,MAAM,CAEqB;AAErC;;;;;;;;;;;;;;GAcG;AACH,uCAFU,MAAM,CAE4B;AAE5C;;;;;;;;GAQG;AACH,yCAFU,MAAM,CAE8B;AAE9C;;;;;;;;;GASG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;;;;GAQG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH,oCAFU,MAAM,CAEwB;AAExC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,kCAFU,MAAM,CAEsB;AAEtC;;;;;;;GAOG;AACH,sCAFU,MAAM,CAE4B;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,6CAFU,MAAM,CAEmC;AAEnD;;;;;GAKG;AACH,gCAFU,MAAM,CAEoB"}
|