buttery

Exponentially smoothed transformations with a clean API.

Basic Example:

``` use glam::{Mat4, Quat, Vec3}; use buttery::{Rotate, Scaffold, TransformComponent, Translate}; struct Camera { position: TransformComponent>, looking: TransformComponent, }

let mut camera = Camera { position: TransformComponent::newtranslate(Vec3::ZERO), looking: TransformComponent::newrotate(Quat::IDENTITY), };

// Simulate user input: camera.position.target += Vec3::X; camera.looking.target *= Quat::fromrotationx(0.3);

// For each frame:

// Time since last frame in seconds. let deltatime = 0.016; let transform = camera.position.begin(|translation| Mat4::fromtranslation(translation)) .andthen(&mut camera.looking, |quat| Mat4::fromquat(quat)) .drive(delta_time);

let view_matrix = transform.inverse(); ```

Following example:

This example makes the camera follow a target.

In this case, we can't quite use the .and_then api: ``` use glam::{Mat4, Quat, Vec3}; use buttery::{Rotate, Scaffold, TransformComponent, Translate}; struct Camera { position: TransformComponent>, target: TransformComponent>, }

let mut camera = Camera { position: TransformComponent::new_translate(Vec3::ZERO), // We'll want to follow our actual target much more closely. target: TransformComponent::new(0.001, Vec3::X), };

// Simulate user input: camera.position.target += Vec3::X; camera.target.target += Vec3::NEG_Y;

// For each frame:

// Time since last frame in seconds. let delta_time = 0.016;

let cameraposition = camera.position.drive(deltatime);

let partial = camera.target.begin(|targetpos| Mat4::lookatrh(cameraposition, targetpos, Vec3::Y)) .drive(deltatime);

let transform = partial * Mat4::fromtranslation(cameraposition);

let view_matrix = transform.inverse(); ```