From 87fa4a34785ae542f853c79884593eb5ab0c3ece Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Sun, 10 Dec 2023 15:43:02 -0800 Subject: [PATCH] Moved arc path generation to Kludgine --- Cargo.lock | 36 +++++------------------ Cargo.toml | 1 - src/animation.rs | 10 ++++++- src/widgets/progress.rs | 65 +++++++++++++---------------------------- 4 files changed, 37 insertions(+), 75 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 514a93c..a6019e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -623,7 +623,7 @@ dependencies = [ [[package]] name = "figures" version = "0.1.0" -source = "git+https://github.com/khonsulabs/figures#312f390a33025c902e94124cfab10c3dafdfb5f1" +source = "git+https://github.com/khonsulabs/figures#5b84202e60b52cc2c57c0e49031fe1a0ff87b9ec" dependencies = [ "bytemuck", "euclid", @@ -810,7 +810,6 @@ dependencies = [ "interner", "kempt", "kludgine", - "lyon_geom", "palette", "pollster", "rand", @@ -1063,7 +1062,7 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kludgine" version = "0.1.0" -source = "git+https://github.com/khonsulabs/kludgine#a9c9335df7c40f695c82b4ac74c63330d8021885" +source = "git+https://github.com/khonsulabs/kludgine#32b7e160966c58d129657f0762ecb79a4ce482a3" dependencies = [ "ahash", "alot", @@ -1090,9 +1089,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] name = "libloading" @@ -1303,12 +1302,6 @@ dependencies = [ "paste", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -1391,16 +1384,6 @@ dependencies = [ "memoffset", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1753,9 +1736,9 @@ dependencies = [ [[package]] name = "profiling" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b" +checksum = "1de09527cd2ea2c2d59fb6c2f8c1ab8c71709ed9d1b6d60b0e1c9fbb6fdcb33c" [[package]] name = "quick-xml" @@ -3074,12 +3057,9 @@ dependencies = [ [[package]] name = "xcursor" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" -dependencies = [ - "nom", -] +checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" [[package]] name = "xkbcommon-dl" diff --git a/Cargo.toml b/Cargo.toml index 97d023c..7f40e3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,6 @@ gooey-macros = { version = "0.1.0", path = "gooey-macros" } arboard = "3.2.1" zeroize = "1.6.1" unicode-segmentation = "1.10.1" -lyon_geom = "1.0.4" # [patch."https://github.com/khonsulabs/kludgine"] diff --git a/src/animation.rs b/src/animation.rs index 0558b64..f527337 100644 --- a/src/animation.rs +++ b/src/animation.rs @@ -52,7 +52,7 @@ use alot::{LotId, Lots}; use intentional::Cast; use kempt::Set; use kludgine::figures::units::{Lp, Px, UPx}; -use kludgine::figures::{Ranged, UnscaledUnit, Zero}; +use kludgine::figures::{Angle, Ranged, UnscaledUnit, Zero}; use kludgine::Color; use crate::animation::easings::Linear; @@ -873,6 +873,14 @@ impl LinearInterpolate for f64 { } } +impl LinearInterpolate for Angle { + fn lerp(&self, target: &Self, percent: f32) -> Self { + let this = self.into_degrees::(); + let delta = target.into_degrees::() - this; + Self::degrees_f(this + delta * percent) + } +} + impl LinearInterpolate for bool { fn lerp(&self, target: &Self, percent: f32) -> Self { if percent >= 0.5 { diff --git a/src/widgets/progress.rs b/src/widgets/progress.rs index eb41cdf..07c8db3 100644 --- a/src/widgets/progress.rs +++ b/src/widgets/progress.rs @@ -4,10 +4,9 @@ use std::ops::RangeInclusive; use std::time::Duration; use kludgine::figures::units::Px; -use kludgine::figures::{FloatConversion, Point, Ranged, ScreenScale, Zero}; -use kludgine::shapes::{Path, PathEvent, StrokeOptions}; +use kludgine::figures::{Angle, Point, Ranged, ScreenScale, Size, Zero}; +use kludgine::shapes::{Path, StrokeOptions}; use kludgine::Color; -use lyon_geom::Arc; use crate::animation::easings::{EaseInQuadradic, EaseOutQuadradic}; use crate::animation::{ @@ -70,7 +69,7 @@ impl MakeWidgetWithId for ProgressBar { let mut indeterminant_animation = None; let (slider, degree_offset) = if self.spinner { - let degree_offset = Dynamic::new(0.); + let degree_offset = Dynamic::new(Angle::degrees(270)); ( Spinner { start: start.clone(), @@ -124,7 +123,7 @@ fn update_progress_bar( indeterminant_animation: &mut Option, start: &Dynamic, end: &Dynamic, - degree_offset: Option<&Dynamic>, + degree_offset: Option<&Dynamic>, ) { match progress { Progress::Indeterminant => { @@ -164,11 +163,11 @@ fn update_progress_bar( .spawn(), _degree_offset: degree_offset.map(|degree_offset| { degree_offset - .transition_to(0.) + .transition_to(Angle::MIN) .immediately() .and_then( degree_offset - .transition_to(359.9) + .transition_to(Angle::MAX) .over(Duration::from_secs_f32(1.66)), ) .cycle() @@ -180,7 +179,7 @@ fn update_progress_bar( Progress::Percent(value) => { let _stopped_animation = indeterminant_animation.take(); if let Some(degree_offset) = degree_offset { - degree_offset.set(0.); + degree_offset.set(Angle::degrees(270)); } start.set(ZeroToOne::ZERO); end.set(value); @@ -303,52 +302,28 @@ where pub struct Spinner { start: Dynamic, end: Dynamic, - degree_offset: Dynamic, + degree_offset: Dynamic, } impl Spinner { fn draw_arc( track_size: Px, - radius: f32, - degree_offset: f32, + radius: Px, + degree_offset: Angle, start: ZeroToOne, sweep: ZeroToOne, color: Color, context: &mut crate::context::GraphicsContext<'_, '_, '_, '_, '_>, ) { - let mut events = Vec::>::new(); - Arc { - center: lyon_geom::point( - radius + track_size.into_float() / 2., - radius + track_size.into_float() / 2., - ), - radii: lyon_geom::vector(radius, radius), - start_angle: lyon_geom::Angle::degrees(*start * 360. - 90. + degree_offset), - sweep_angle: lyon_geom::Angle::degrees(*sweep * 360.), - x_rotation: lyon_geom::Angle::zero(), - } - .for_each_cubic_bezier(&mut |segment| { - if events.is_empty() { - events.push(PathEvent::Begin { - at: Point::new(segment.from.x, segment.from.y).cast(), - texture: Point::ZERO, - }); - } - events.push(PathEvent::Cubic { - ctrl1: Point::new(segment.ctrl1.x, segment.ctrl1.y).cast(), - ctrl2: Point::new(segment.ctrl2.x, segment.ctrl2.y).cast(), - to: Point::new(segment.to.x, segment.to.y).cast(), - texture: Point::ZERO, - }); - }); - let full = sweep == ZeroToOne::ONE; - if !events.is_empty() { - events.push(PathEvent::End { close: full }); + if sweep > 0. { context.gfx.draw_shape( - &events - .into_iter() - .collect::>() - .stroke(StrokeOptions::px_wide(track_size).colored(color)), + &Path::arc( + Point::squared(radius + track_size / 2), + Size::squared(radius), + Angle::degrees_f(*start * 360.) + degree_offset, + Angle::degrees_f(*sweep * 360.), + ) + .stroke(StrokeOptions::px_wide(track_size).colored(color)), ); } } @@ -360,8 +335,8 @@ impl Widget for Spinner { let start = self.start.get_tracking_refresh(context); let end = self.end.get_tracking_refresh(context); let size = context.gfx.region().size; - let render_size = size.width.min(size.height).into_float(); - let radius = render_size / 2. - track_size.into_float(); + let render_size = size.width.min(size.height); + let radius = render_size / 2 - track_size; let degree_offset = self.degree_offset.get(); if start > ZeroToOne::ZERO {