Moved arc path generation to Kludgine

This commit is contained in:
Jonathan Johnson 2023-12-10 15:43:02 -08:00
parent c4151d649c
commit 87fa4a3478
No known key found for this signature in database
GPG key ID: A66D6A34D6620579
4 changed files with 37 additions and 75 deletions

36
Cargo.lock generated
View file

@ -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"

View file

@ -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"]

View file

@ -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::<f32>();
let delta = target.into_degrees::<f32>() - this;
Self::degrees_f(this + delta * percent)
}
}
impl LinearInterpolate for bool {
fn lerp(&self, target: &Self, percent: f32) -> Self {
if percent >= 0.5 {

View file

@ -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<IndeterminantAnimations>,
start: &Dynamic<ZeroToOne>,
end: &Dynamic<ZeroToOne>,
degree_offset: Option<&Dynamic<f32>>,
degree_offset: Option<&Dynamic<Angle>>,
) {
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<ZeroToOne>,
end: Dynamic<ZeroToOne>,
degree_offset: Dynamic<f32>,
degree_offset: Dynamic<Angle>,
}
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::<PathEvent<Px>>::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::<Path<Px, false>>()
.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 {