dolly 0.6.0

Composable camera rigs
Documentation
pub use crate::{drivers::*, handedness::*, rig::CameraRig};

#[test]
fn orbit_example_compile_test() {
    use glam::Vec3;

    let mut camera: CameraRig = CameraRig::builder()
        .with(YawPitch::new().yaw_degrees(45.0).pitch_degrees(-30.0))
        .with(Smooth::new_rotation(1.5))
        .with(Arm::new(Vec3::Z * 4.0))
        .build();

    // ...

    fn was_key_pressed(_: char) -> bool {
        true
    }

    let camera_driver = camera.driver_mut::<YawPitch>();
    if was_key_pressed('Z') {
        camera_driver.rotate_yaw_pitch(-90.0, 0.0);
    }
    if was_key_pressed('X') {
        camera_driver.rotate_yaw_pitch(90.0, 0.0);
    }

    let time_delta_seconds = 1.0 / 60.0;
    camera.update(time_delta_seconds);
}

#[test]
fn follow_example_compile_test() {
    use glam::{Quat, Vec3};

    #[derive(Default)]
    struct Car {
        position: Vec3,
        rotation: Quat,
    }

    let car = Car::default();

    let mut camera: CameraRig = CameraRig::builder()
        .with(Position::new(car.position))
        .with(Rotation::new(car.rotation))
        .with(Smooth::new_position(1.25).predictive(true))
        .with(Arm::new(Vec3::new(0.0, 1.5, -3.5)))
        .with(Smooth::new_position(2.5))
        .with(
            LookAt::new(car.position + Vec3::Y)
                .tracking_smoothness(1.25)
                .tracking_predictive(true),
        )
        .build();

    // ...

    camera.driver_mut::<Position>().position = car.position.into();
    camera.driver_mut::<Rotation>().rotation = car.rotation.into();
    camera.driver_mut::<LookAt>().target = (car.position + Vec3::Y).into();
}

#[test]
fn lookat_example_compile_test() {
    use glam::Vec3;

    let mut camera: CameraRig = CameraRig::builder()
        .with(Position::new(Vec3::Y * 3.0))
        .with(LookAt::new(Vec3::ZERO))
        .build();

    // ...

    let time_delta_seconds = 1.0 / 60.0;
    camera.driver_mut::<LookAt>().target = Vec3::X.into();
    camera.update(time_delta_seconds);
}

#[test]
fn free_example_compile_test() {
    use glam::Vec3;

    let mut camera: CameraRig = CameraRig::builder()
        .with(Position::new(Vec3::Y))
        .with(YawPitch::new())
        .with(Smooth::new_position_rotation(1.0, 1.0))
        .build();

    // ...

    let move_vec = Vec3::new(0.1, 0.2, 0.3);
    let time_delta_seconds = 1.0 / 60.0;

    camera.driver_mut::<YawPitch>().rotate_yaw_pitch(-0.3, -0.2);
    camera
        .driver_mut::<Position>()
        .translate(move_vec * time_delta_seconds);
    camera.update(time_delta_seconds);
}