bevy/tools/build-easefunction-graphs/src/main.rs
Cyrill Schenkel 8570af1d96
Add print_stdout and print_stderr lints (#17446) (#18233)
# Objective

- Prevent usage of `println!`, `eprintln!` and the like because they
require `std`
- Fixes #17446

## Solution

- Enable the `print_stdout` and `print_stderr` clippy lints
- Replace all `println!` and `eprintln!` occurrences with `log::*` where
applicable or alternatively ignore the warnings

## Testing

- Run `cargo clippy --workspace` to ensure that there are no warnings
relating to printing to `stdout` or `stderr`
2025-03-11 19:35:48 +00:00

144 lines
4.3 KiB
Rust

//! Generates graphs for the `EaseFunction` docs.
#![expect(clippy::print_stdout, reason = "Allowed in tools.")]
use std::path::PathBuf;
use bevy_math::curve::{CurveExt, EaseFunction, EasingCurve, JumpAt};
use svg::{
node::element::{self, path::Data},
Document,
};
fn main() {
let root_dir = PathBuf::from(
std::env::var("CARGO_MANIFEST_DIR")
.expect("Please run via cargo or set CARGO_MANIFEST_DIR"),
);
let directory = root_dir
.join("../../crates/bevy_math/images/easefunction")
.canonicalize()
.unwrap();
for function in [
EaseFunction::SineIn,
EaseFunction::SineOut,
EaseFunction::SineInOut,
EaseFunction::QuadraticIn,
EaseFunction::QuadraticOut,
EaseFunction::QuadraticInOut,
EaseFunction::CubicIn,
EaseFunction::CubicOut,
EaseFunction::CubicInOut,
EaseFunction::QuarticIn,
EaseFunction::QuarticOut,
EaseFunction::QuarticInOut,
EaseFunction::QuinticIn,
EaseFunction::QuinticOut,
EaseFunction::QuinticInOut,
EaseFunction::SmoothStepIn,
EaseFunction::SmoothStepOut,
EaseFunction::SmoothStep,
EaseFunction::SmootherStepIn,
EaseFunction::SmootherStepOut,
EaseFunction::SmootherStep,
EaseFunction::CircularIn,
EaseFunction::CircularOut,
EaseFunction::CircularInOut,
EaseFunction::ExponentialIn,
EaseFunction::ExponentialOut,
EaseFunction::ExponentialInOut,
EaseFunction::ElasticIn,
EaseFunction::ElasticOut,
EaseFunction::ElasticInOut,
EaseFunction::BackIn,
EaseFunction::BackOut,
EaseFunction::BackInOut,
EaseFunction::BounceIn,
EaseFunction::BounceOut,
EaseFunction::BounceInOut,
EaseFunction::Linear,
EaseFunction::Steps(4, JumpAt::Start),
EaseFunction::Steps(4, JumpAt::End),
EaseFunction::Steps(4, JumpAt::None),
EaseFunction::Steps(4, JumpAt::Both),
EaseFunction::Elastic(50.0),
] {
let curve = EasingCurve::new(0.0, 1.0, function);
let samples = curve
.map(|y| {
// Fit into svg coordinate system
1. - y
})
.graph()
.samples(100)
.unwrap()
.collect::<Vec<_>>();
// Curve can go out past endpoints
let mut min = 0.0f32;
let mut max = 1.0f32;
for &(_, y) in &samples {
min = min.min(y);
max = max.max(y);
}
let graph = element::Polyline::new()
.set("points", samples)
.set("fill", "none")
.set("stroke", "red")
.set("stroke-width", 0.04);
let guides = element::Path::new()
.set("fill", "none")
.set("stroke", "var(--main-color)")
.set("stroke-width", 0.02)
.set("d", {
// Interval
let mut data = Data::new()
.move_to((0, 0))
.line_to((0, 1))
.move_to((1, 0))
.line_to((1, 1));
// Dotted lines y=0 | y=1
for y in 0..=1 {
data = data.move_to((0, y));
for _ in 0..5 {
data = data.move_by((0.1, 0.)).line_by((0.1, 0.));
}
}
data
});
let opt_tag = match function {
EaseFunction::Steps(_n, jump_at) => format!("{jump_at:?}"),
_ => String::new(),
};
let name = format!("{opt_tag}{function:?}");
let tooltip = element::Title::new(&name);
const MARGIN: f32 = 0.04;
let document = Document::new()
.set("width", "6em")
.set(
"viewBox",
(
-MARGIN,
min - MARGIN,
1. + 2. * MARGIN,
max - min + 2. * MARGIN,
),
)
.add(tooltip)
.add(guides)
.add(graph);
let file_path = directory
.join(name.split('(').next().unwrap())
.with_extension("svg");
println!("saving {file_path:?}");
svg::save(file_path, &document).unwrap();
}
}