pub struct WarpExecutor {
sources: Vec<String>,
compiled: CompiledBlock,
}Expand description
Pre-compiled per-vertex equation executor.
One instance lives for the lifetime of the engine; set_equations is
called whenever a new preset is loaded.
Fields§
§sources: Vec<String>Source equations as last set, retained so set_equations can no-op
when called with an unchanged set (common case during steady-state
rendering).
compiled: CompiledBlockCompiled equations packaged in a CompiledBlock — auto-lowers
to bytecode when every node is supported (~80 % of corpus
per_pixel blocks), falls back to evalexpr Node walk otherwise.
Per-vertex eval is the second-densest CPU phase after wave
per_point: 768 vertices × N equations every frame, often in
rayon. Skipping evalexpr’s recursive operator dispatch on each
op trims a measurable slice of warp_compute. May contain fewer
nodes than sources if some equations failed to compile —
failures are logged and silently dropped, matching MD2’s
“never crash on a bad preset” stance.
Implementations§
Source§impl WarpExecutor
impl WarpExecutor
pub fn new() -> Self
Sourcepub fn set_equations(&mut self, evaluator: &mut MilkEvaluator, eqs: &[String])
pub fn set_equations(&mut self, evaluator: &mut MilkEvaluator, eqs: &[String])
Replace the compiled equation set. No-op when eqs matches the
previously compiled sources.
evaluator is the per-frame evaluator; it is borrowed mutably so the
preprocess pass can register any newly seen variable names on its
context (preserving the same auto-init semantics as
MilkEvaluator::eval).
Sourcepub fn compute(
&mut self,
mesh: &WarpMesh,
evaluator: &MilkEvaluator,
time: f32,
) -> Vec<WarpVertex>
pub fn compute( &mut self, mesh: &WarpMesh, evaluator: &MilkEvaluator, time: f32, ) -> Vec<WarpVertex>
Compute one WarpVertex per mesh vertex, ready to upload to the GPU.
Pre-condition: evaluator has just finished its per-frame phase so
motion outputs, audio levels, and q* channels are up to date.
§Parallelism
When the preset has any per-vertex equations, the inner loop fans
out across rayon’s global thread pool: each worker gets one cloned
MilkContext (via map_init) and chews through its slice of the
768-vertex mesh. Per-MD2-spec, per-vertex equations have no
cross-vertex carryover, so the parallel order is invisible from the
outside. The init clone is ~1 µs (HashMap with per-frame state plus
math-function pointers), so amortised across hundreds of vertices per
worker it’s free.
Empty-equation presets stay on the simple sequential path: nothing to evaluate, so threading would only add overhead.
Sourcepub fn compiled_count(&self) -> usize
pub fn compiled_count(&self) -> usize
Number of equations currently compiled. Test/debug helper.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for WarpExecutor
impl RefUnwindSafe for WarpExecutor
impl Send for WarpExecutor
impl Sync for WarpExecutor
impl Unpin for WarpExecutor
impl UnwindSafe for WarpExecutor
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<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
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> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().