bevy_verlet 0.10.0

Verlet physics implementation in bevy
Documentation
use crate::{
    components::{VerletLocked, VerletPoint},
    config::VerletConfig,
};
use bevy::prelude::*;

fn update_point(
    transform: &mut Transform,
    point: &mut VerletPoint,
    acceleration: Vec3,
    friction: f32,
    dt: f32,
) {
    let position = transform.translation;
    let velocity = point.old_position.map_or(Vec3::ZERO, |pos| position - pos);
    transform.translation += velocity * friction + (acceleration / point.mass) * friction * dt * dt;
    point.old_position = Some(position);
}

#[allow(clippy::needless_pass_by_value, clippy::cast_possible_truncation)]
pub fn update_points(
    mut points_query: Query<(&mut Transform, &mut VerletPoint), Without<VerletLocked>>,
    time: Res<Time>,
    config: Res<VerletConfig>,
) {
    let gravity = config.gravity;
    let friction = config.friction_coefficient();

    if config.parallel_processing {
        points_query
            .par_iter_mut()
            .for_each(|(mut transform, mut point)| {
                update_point(
                    &mut transform,
                    &mut point,
                    gravity,
                    friction,
                    time.delta_secs(),
                );
            });
    } else {
        for (mut transform, mut point) in &mut points_query {
            update_point(
                &mut transform,
                &mut point,
                gravity,
                friction,
                time.delta_secs(),
            );
        }
    }
}