buttery
Exponentially smoothed transformations with a clean API.
```rs
use glam::{Mat4, Quat, Vec3};
use buttery::{Rotate, Scaffold, TransformComponent, Translate};
struct Camera {
position: 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(); ```
This example makes the camera follow a target.
In this case, we can't quite use the .and_then
api:
```rs
use glam::{Mat4, Quat, Vec3};
use buttery::{Rotate, Scaffold, TransformComponent, Translate};
struct Camera {
position: 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(); ```