
# Objective - Adds foundational math for Bezier curves, useful for UI/2D/3D animation and smooth paths. https://user-images.githubusercontent.com/2632925/218883143-e138f994-1795-40da-8c59-21d779666991.mp4 ## Solution - Adds the generic `Bezier` type, and a `Point` trait. The `Point` trait allows us to use control points of any dimension, as long as they support vector math. I've implemented it for `f32`(1D), `Vec2`(2D), and `Vec3`/`Vec3A`(3D). - Adds `CubicBezierEasing` on top of `Bezier` with the addition of an implementation of cubic Bezier easing, which is a foundational tool for UI animation. - This involves solving for $t$ in the parametric Bezier function $B(t)$ using the Newton-Raphson method to find a value with error $\leq$ 1e-7, capped at 8 iterations. - Added type aliases for common Bezier curves: `CubicBezier2d`, `CubicBezier3d`, `QuadraticBezier2d`, and `QuadraticBezier3d`. These types use `Vec3A` to represent control points, as this was found to have an 80-90% speedup over using `Vec3`. - Benchmarking shows quadratic/cubic Bezier evaluations $B(t)$ take \~1.8/2.4ns respectively. Easing, which requires an iterative solve takes \~50ns for cubic Beziers. --- ## Changelog - Added `CubicBezier2d`, `CubicBezier3d`, `QuadraticBezier2d`, and `QuadraticBezier3d` types with methods for sampling position, velocity, and acceleration. The generic `Bezier` type is also available, and generic over any degree of Bezier curve. - Added `CubicBezierEasing`, with additional methods to allow for smooth easing animations.
59 lines
1.2 KiB
TOML
59 lines
1.2 KiB
TOML
[package]
|
|
name = "benches"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
description = "Benchmarks for Bevy engine"
|
|
publish = false
|
|
license = "MIT OR Apache-2.0"
|
|
|
|
[dev-dependencies]
|
|
glam = "0.22"
|
|
rand = "0.8"
|
|
rand_chacha = "0.3"
|
|
criterion = { version = "0.3", features = ["html_reports"] }
|
|
bevy_app = { path = "../crates/bevy_app" }
|
|
bevy_ecs = { path = "../crates/bevy_ecs" }
|
|
bevy_reflect = { path = "../crates/bevy_reflect" }
|
|
bevy_tasks = { path = "../crates/bevy_tasks" }
|
|
bevy_utils = { path = "../crates/bevy_utils" }
|
|
bevy_math = { path = "../crates/bevy_math" }
|
|
|
|
[profile.release]
|
|
opt-level = 3
|
|
lto = true
|
|
|
|
[[bench]]
|
|
name = "change_detection"
|
|
path = "benches/bevy_ecs/change_detection.rs"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "ecs"
|
|
path = "benches/bevy_ecs/benches.rs"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "reflect_list"
|
|
path = "benches/bevy_reflect/list.rs"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "reflect_map"
|
|
path = "benches/bevy_reflect/map.rs"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "reflect_struct"
|
|
path = "benches/bevy_reflect/struct.rs"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "iter"
|
|
path = "benches/bevy_tasks/iter.rs"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "bezier"
|
|
path = "benches/bevy_math/bezier.rs"
|
|
harness = false
|