animato_spring/lib.rs
1//! # animato-spring
2//!
3//! Physics-based spring animations using a damped harmonic oscillator.
4//!
5//! - [`Spring`] — 1D spring, stack-allocated, `no_std`-compatible.
6//! - [`SpringConfig`] — stiffness / damping / mass / epsilon, with named presets.
7//! - [`SpringN<T>`] — multi-dimensional spring (requires `alloc` feature).
8//!
9//! ## Quick Start
10//!
11//! ```rust
12//! use animato_spring::{Spring, SpringConfig};
13//! use animato_core::Update;
14//!
15//! let mut spring = Spring::new(SpringConfig::wobbly());
16//! spring.set_target(200.0);
17//!
18//! let mut steps = 0;
19//! while !spring.is_settled() {
20//! spring.update(1.0 / 60.0);
21//! steps += 1;
22//! assert!(steps < 10_000, "spring should settle");
23//! }
24//! let pos = spring.position();
25//! assert!((pos - 200.0).abs() < 0.01);
26//! ```
27//!
28//! ## Feature Flags
29//!
30//! | Feature | Effect |
31//! |---------|--------|
32//! | `std` | Enables `alloc` and `animato-core/std` |
33//! | `alloc` | Enables [`SpringN<T>`] (multi-dimensional spring) |
34//! | `serde` | Derives `Serialize`/`Deserialize` on public types |
35
36#![cfg_attr(not(feature = "std"), no_std)]
37#![deny(missing_docs)]
38#![deny(missing_debug_implementations)]
39
40#[cfg(any(feature = "std", feature = "alloc"))]
41extern crate alloc;
42
43pub mod config;
44pub mod spring;
45
46#[cfg(any(feature = "std", feature = "alloc"))]
47mod decompose;
48#[cfg(any(feature = "std", feature = "alloc"))]
49pub mod spring_n;
50
51pub use config::SpringConfig;
52pub use spring::{Integrator, Spring};
53
54#[cfg(any(feature = "std", feature = "alloc"))]
55pub use spring_n::SpringN;
56
57#[cfg(any(feature = "std", feature = "alloc"))]
58pub use decompose::Decompose;