Path: blob/main/tools/build-easefunction-graphs/src/main.rs
6595 views
//! Generates graphs for the `EaseFunction` docs.12#![expect(clippy::print_stdout, reason = "Allowed in tools.")]34use std::path::PathBuf;56use bevy_math::curve::{CurveExt, EaseFunction, EasingCurve, JumpAt};7use svg::{8node::element::{self, path::Data},9Document,10};1112fn main() {13let root_dir = PathBuf::from(14std::env::var("CARGO_MANIFEST_DIR")15.expect("Please run via cargo or set CARGO_MANIFEST_DIR"),16);17let directory = root_dir18.join("../../crates/bevy_math/images/easefunction")19.canonicalize()20.unwrap();2122for function in [23EaseFunction::SineIn,24EaseFunction::SineOut,25EaseFunction::SineInOut,26EaseFunction::QuadraticIn,27EaseFunction::QuadraticOut,28EaseFunction::QuadraticInOut,29EaseFunction::CubicIn,30EaseFunction::CubicOut,31EaseFunction::CubicInOut,32EaseFunction::QuarticIn,33EaseFunction::QuarticOut,34EaseFunction::QuarticInOut,35EaseFunction::QuinticIn,36EaseFunction::QuinticOut,37EaseFunction::QuinticInOut,38EaseFunction::SmoothStepIn,39EaseFunction::SmoothStepOut,40EaseFunction::SmoothStep,41EaseFunction::SmootherStepIn,42EaseFunction::SmootherStepOut,43EaseFunction::SmootherStep,44EaseFunction::CircularIn,45EaseFunction::CircularOut,46EaseFunction::CircularInOut,47EaseFunction::ExponentialIn,48EaseFunction::ExponentialOut,49EaseFunction::ExponentialInOut,50EaseFunction::ElasticIn,51EaseFunction::ElasticOut,52EaseFunction::ElasticInOut,53EaseFunction::BackIn,54EaseFunction::BackOut,55EaseFunction::BackInOut,56EaseFunction::BounceIn,57EaseFunction::BounceOut,58EaseFunction::BounceInOut,59EaseFunction::Linear,60EaseFunction::Steps(4, JumpAt::Start),61EaseFunction::Steps(4, JumpAt::End),62EaseFunction::Steps(4, JumpAt::None),63EaseFunction::Steps(4, JumpAt::Both),64EaseFunction::Elastic(50.0),65] {66let curve = EasingCurve::new(0.0, 1.0, function);67let samples = curve68.map(|y| {69// Fit into svg coordinate system701. - y71})72.graph()73.samples(100)74.unwrap()75.collect::<Vec<_>>();7677// Curve can go out past endpoints78let mut min = 0.0f32;79let mut max = 1.0f32;80for &(_, y) in &samples {81min = min.min(y);82max = max.max(y);83}8485let graph = element::Polyline::new()86.set("points", samples)87.set("fill", "none")88.set("stroke", "red")89.set("stroke-width", 0.04);9091let guides = element::Path::new()92.set("fill", "none")93.set("stroke", "var(--main-color)")94.set("stroke-width", 0.02)95.set("d", {96// Interval97let mut data = Data::new()98.move_to((0, 0))99.line_to((0, 1))100.move_to((1, 0))101.line_to((1, 1));102// Dotted lines y=0 | y=1103for y in 0..=1 {104data = data.move_to((0, y));105for _ in 0..5 {106data = data.move_by((0.1, 0.)).line_by((0.1, 0.));107}108}109data110});111112let opt_tag = match function {113EaseFunction::Steps(_n, jump_at) => format!("{jump_at:?}"),114_ => String::new(),115};116117let name = format!("{opt_tag}{function:?}");118let tooltip = element::Title::new(&name);119120const MARGIN: f32 = 0.04;121let document = Document::new()122.set("width", "6em")123.set(124"viewBox",125(126-MARGIN,127min - MARGIN,1281. + 2. * MARGIN,129max - min + 2. * MARGIN,130),131)132.add(tooltip)133.add(guides)134.add(graph);135136let file_path = directory137.join(name.split('(').next().unwrap())138.with_extension("svg");139println!("saving {file_path:?}");140svg::save(file_path, &document).unwrap();141}142}143144145