pub struct Iterative<E: IterativeEval> {
eval: E,
initial: E::Output,
sim_step: f64,
snapshot: RefCell<Snapshot<E::Output>>,
}Expand description
Adapter turning an IterativeEval into the general Eval protocol.
The adapter owns the segment’s definition — the initial state, the sim_step,
and the stepping closure — all immutable. The only mutation is the snapshot
cache (alpha + state) behind a RefCell, so eval_alpha(target)
integrates to target only when target is ahead of the snapshot, resets
and replays when behind, and otherwise returns the cached state directly.
Repeated queries at the same alpha are O(1).
let sim_secs = 10.0;
let animation = Iterative::from_fn(state0, move |state, _alpha, delta_alpha| {
state.integrate(sim_secs * delta_alpha);
})
.with_steps(240)
.with_duration(sim_secs);Fields§
§eval: E§initial: E::Output§sim_step: f64§snapshot: RefCell<Snapshot<E::Output>>Implementations§
Source§impl<E> Iterative<E>
impl<E> Iterative<E>
Sourcepub fn new(initial: E::Output, eval: E) -> Self
pub fn new(initial: E::Output, eval: E) -> Self
Create an iterative segment from an initial state and a named
IterativeEval implementation.
The content step defaults to 1 / 120 of normalized progress. Call
with_steps to override it, e.g.
.with_steps(240) for 1 / 240 progress increments.
Sourcepub fn with_steps(self, n: usize) -> Self
pub fn with_steps(self, n: usize) -> Self
Declare the content’s step count N.
The segment then integrates in uniform 1 / N progress increments, so
every IterativeEval::step call receives delta_alpha = 1 / N.
Without this call the default is 1 / 120 (DEFAULT_SIM_STEP).
This is the segment’s content resolution, not the render sampling
rate and not the scene clock. A physical time step can be recovered as
duration_secs * delta_alpha.
Iterative::from_fn(initial_state, step_function)
.with_steps(240) // 1/240 progress per integration step
.with_duration(10.0); // => 1/24 seconds per integration stepTrait Implementations§
Source§impl<E> Eval for Iterative<E>
impl<E> Eval for Iterative<E>
Source§type Output = <E as IterativeEval>::Output
type Output = <E as IterativeEval>::Output
Source§fn sim_step(&self) -> Option<f64>
fn sim_step(&self) -> Option<f64>
1/N progress
per integration step (N declared via
Iterative::with_steps). Read moreSource§fn eval_alpha(&self, target: f64) -> Self::Output
fn eval_alpha(&self, target: f64) -> Self::Output
alpha.Auto Trait Implementations§
impl<E> !Freeze for Iterative<E>
impl<E> !RefUnwindSafe for Iterative<E>
impl<E> !Sync for Iterative<E>
impl<E> Send for Iterative<E>
impl<E> Unpin for Iterative<E>
impl<E> UnsafeUnpin for Iterative<E>
impl<E> UnwindSafe for Iterative<E>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> ConditionalSend for Twhere
T: Send,
Source§impl<E> EvalExt for Ewhere
E: Eval,
impl<E> EvalExt for Ewhere
E: Eval,
Source§fn apply_alpha_to(self, item: &mut Self::Output, alpha: f64) -> Self
fn apply_alpha_to(self, item: &mut Self::Output, alpha: f64) -> Self
alpha into item and return this
evaluator (defined through eval_alpha).Source§fn apply_to(self, item: &mut Self::Output) -> Self
fn apply_to(self, item: &mut Self::Output) -> Self
alpha == 1.0) into item and return this
evaluator (defined through EvalExt::apply_alpha_to).§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<E> IntoAnimNode for E
impl<E> IntoAnimNode for E
Source§fn into_anim_node(self) -> AnimNode
fn into_anim_node(self) -> AnimNode
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<A> PlaybackExt for Awhere
A: Unplaced,
impl<A> PlaybackExt for Awhere
A: Unplaced,
Source§fn with_rate_func(self, rate_func: fn(f64) -> f64) -> Paramed<Self>
fn with_rate_func(self, rate_func: fn(f64) -> f64) -> Paramed<Self>
Source§fn with_duration(self, duration_secs: f64) -> Paramed<Self>
fn with_duration(self, duration_secs: f64) -> Paramed<Self>
Source§fn with_enabled(self, enabled: bool) -> Paramed<Self>
fn with_enabled(self, enabled: bool) -> Paramed<Self>
§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> TransformedExt for T
impl<T> TransformedExt for T
Source§fn transformed<G>(self, transform: G) -> Transformed<Self, G>
fn transformed<G>(self, transform: G) -> Transformed<Self, G>
self wrapped with transform stored exactly as G.