pub struct Sim {
pub world: World,
pub step: Duration,
pub time_scale: f32,
pub max_steps: u32,
/* private fields */
}Expand description
Fixed-step sim state. Game registers systems,
feeds wall time with step, reads world for the snapshot.
Fields§
§world: WorldEntity/component store. Game crates add their own components here.
step: DurationFixed step size. Default 60 Hz.
Each tick adds this to SimTime. Set before first step.
time_scale: f32§max_steps: u32Max ticks per step call. Default 8.
Caps catch-up after hitches. Excess wall time is dropped.
Clamped to a minimum of 1 so the sim keeps moving.
Implementations§
Source§impl Sim
impl Sim
pub fn new(step: Duration) -> Sim
Sourcepub fn with_default_step() -> Sim
pub fn with_default_step() -> Sim
60 Hz fixed-step sim.
Sourcepub fn add_system<M>(&mut self, system: impl IntoSystem<(), (), M>) -> &mut Sim
pub fn add_system<M>(&mut self, system: impl IntoSystem<(), (), M>) -> &mut Sim
Register a system into the per-step schedule.
Sourcepub fn add_chained_systems<M>(
&mut self,
systems: impl IntoScheduleConfigs<Box<dyn System<In = (), Out = ()>>, M>,
) -> &mut Sim
pub fn add_chained_systems<M>( &mut self, systems: impl IntoScheduleConfigs<Box<dyn System<In = (), Out = ()>>, M>, ) -> &mut Sim
Register systems with a fixed execution order.
Use one (a, b, c).chain() tuple for pipelines that need order.
Sourcepub fn step(&mut self, dt: Duration) -> u32
pub fn step(&mut self, dt: Duration) -> u32
Advance by dt wall time. Returns ticks run.
Small dt banks for later. Large dt runs up to max_steps
ticks, then drops leftover whole steps. Example:
let steps = sim.step(frame_dt);pub fn step_with( &mut self, dt: Duration, after_tick: impl FnMut(&mut World), ) -> u32
Sourcepub fn alpha(&self) -> f32
pub fn alpha(&self) -> f32
Blend factor accumulator / step, clamped to 0..1.
Zero step returns 0.0. For render blending between snapshots: keep
the previous snapshot and lerp toward the current one by this alpha
(NT motion at 30 Hz sim on 144 Hz display needs it; without it every
fast mover judders on 4-5 identical frames then jumps).
Auto Trait Implementations§
impl !Freeze for Sim
impl !RefUnwindSafe for Sim
impl !UnwindSafe for Sim
impl Send for Sim
impl Sync for Sim
impl Unpin for Sim
impl UnsafeUnpin for Sim
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ConditionalSend for Twhere
T: Send,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.