Skip to main content

Spring

Struct Spring 

Source
pub struct Spring {
    pub stiffness: f32,
    pub damping: f32,
    pub mass: f32,
}
Expand description

A damped spring, solved in closed form so a position is a function of time rather than of how many frames happened to be delivered.

Fields§

§stiffness: f32§damping: f32§mass: f32

Implementations§

Source§

impl Spring

Source

pub fn new(stiffness: f32, damping: f32, mass: f32) -> Self

Source

pub fn perceptual(duration: Duration, bounce: f32) -> Self

A spring described the way a design decision is: how long it takes and how much it overshoots.

Stiffness, damping and mass are three numbers for two decisions, and neither decision is either of the three. This is the same parameterisation as SwiftUI’s Spring(duration:bounce:), and it is a change of variables rather than an approximation:

  • mass is fixed at 1. A spring’s behaviour depends on stiffness and damping only through k/m and c/m, so nothing is lost by it;
  • duration is the period of the undamped oscillation, which is what sets the pace whatever the damping does: omega = 2 * PI / duration, and stiffness = omega^2 * mass;
  • bounce is the damping ratio turned inside out, so that 0 is critically damped whichever side of it the value is on: zeta = 1 - bounce for a positive bounce, which reaches the undamped zeta = 0 at 1, and zeta = 1 / (1 + bounce) for a negative one, which grows without bound toward -1. Damping follows from the ratio: damping = 2 * zeta * sqrt(stiffness * mass), which with the frequency above is 4 * PI * zeta * mass / duration.

So a bounce of 0 settles without passing its target, a positive bounce overshoots and comes back, and a negative one crawls in. The bounce is held inside -0.99..=0.99.

Spring::new is unchanged and remains the way in for a spring whose three constants are already known, a token preset included.

Source

pub fn preset(theme: &Theme, preset: SpringPreset) -> Self

Source

pub fn damping_ratio(self) -> f32

Damping ratio: below one oscillates, one settles fastest, above one crawls.

Source

pub fn perceptual_duration(self) -> Duration

The duration half of Spring::perceptual, for a spring built any other way: the period of the undamped oscillation.

It is not the settle time. A spring is still perceptibly arriving after its perceptual duration — at a bounce of 0 it is roughly 99% of the way there — and Spring::settle_time is the honest end of the motion.

Source

pub fn bounce(self) -> f32

The bounce half, inverted from the damping ratio.

Source

pub fn value(self, elapsed: Duration) -> f32

Normalized step response: 0 at rest, approaching 1 as it settles.

Source

pub fn value_at(self, elapsed: Duration, velocity: f32) -> (f32, f32)

Normalized step response for a spring that was already moving when it was aimed here.

velocity is the speed carried into the motion, in units of the full distance per second and positive toward the target. The pair is the value and its own velocity, so a caller that retargets again can hand the motion on rather than restarting it.

Source

pub fn settle_time(self) -> Duration

How long until the spring stays within one part in a thousand of its target.

Source

pub fn settle_time_at(self, velocity: f32) -> Duration

The same, for a spring released with velocity already carried into the motion: one that is travelling fast needs longer to come to rest.

Source

pub fn animation(self) -> Animation

Expresses the spring as a GPUI animation, so it can drive with_animation alongside curve-based motion.

Trait Implementations§

Source§

impl Clone for Spring

Source§

fn clone(&self) -> Spring

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Spring

Source§

impl Debug for Spring

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<SpringTokens> for Spring

Source§

fn from(tokens: SpringTokens) -> Self

Converts to this type from the input type.
Source§

impl PartialEq for Spring

Source§

fn eq(&self, other: &Spring) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Spring

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more