pub struct WindPlugin { /* private fields */ }Expand description
Wind plugin handle.
Typical setup:
let wind = WindPlugin::new(WindAuthoring::default());
wind.install(&mut resources, &device)?;
let runtime = ViewportRuntime::new()
.with_plugin(wind.cpu_plugin())
.with_gpu_plugin(wind.gpu_plugin());
// For each grass / banner / branch mesh:
let mask = WindSwayWeights::height_falloff(&positions, 0.0, top_y);
wind.attach_sway_mask(&mut resources, &device, mesh_id, &mask)?;The CPU half advances the wind clock during runtime.step(). The GPU
half writes the current field state into the deformer’s slot params
during runtime.pre_prepare() so every wind-affected mesh sees the
same global field that frame.
Implementations§
Source§impl WindPlugin
impl WindPlugin
Sourcepub fn new(authoring: WindAuthoring) -> Self
pub fn new(authoring: WindAuthoring) -> Self
Create a new plugin with the given authoring values. Call
Self::install before either trait-object half runs.
Sourcepub fn install(
&self,
resources: &mut DeviceResources,
device: &Device,
) -> Result<DeformerId, ViewportError>
pub fn install( &self, resources: &mut DeviceResources, device: &Device, ) -> Result<DeformerId, ViewportError>
Register the wind deformer against viewport-lib’s mesh shader family.
Composes the deformer body into every mesh-family shader, allocates
a registry slot, and stashes a handle the GPU half uses each frame
to push the wind state into the slot’s slot_params.
Returns the assigned DeformerId in case the host wants to
reference the slot directly.
Sourcepub fn attach_sway_mask(
&self,
resources: &mut DeviceResources,
device: &Device,
mesh_id: MeshId,
weights: &WindSwayWeights,
) -> bool
pub fn attach_sway_mask( &self, resources: &mut DeviceResources, device: &Device, mesh_id: MeshId, weights: &WindSwayWeights, ) -> bool
Attach a sway mask to one mesh. The mask’s length must equal the mesh’s vertex count.
Returns false and does nothing if Self::install has not run
yet.
Sourcepub fn detach_sway_mask(
&self,
resources: &mut DeviceResources,
device: &Device,
mesh_id: MeshId,
) -> bool
pub fn detach_sway_mask( &self, resources: &mut DeviceResources, device: &Device, mesh_id: MeshId, ) -> bool
Detach the sway mask from one mesh.
Sourcepub fn attach_material_params(
&self,
resources: &mut DeviceResources,
device: &Device,
queue: &Queue,
mesh_id: MeshId,
params: &WindMaterialParams,
) -> bool
pub fn attach_material_params( &self, resources: &mut DeviceResources, device: &Device, queue: &Queue, mesh_id: MeshId, params: &WindMaterialParams, ) -> bool
Attach per-mesh material multipliers (strength / density / speed).
Optional. Meshes that only have a sway mask attached use defaults of
1.0 across the board, matching the shipped global formula. Hosts
that import per-material wind params from their content pipeline
(e.g. Unity _WindStrength, _WindDensity, _WindSpeed) call this
once after Self::attach_sway_mask for each mesh.
Per-(mesh, instance) under the hood; for hosts that don’t care about
multiple instances per mesh, instance_id = 0 is the convention
and is what the shader body reads.
Returns false and does nothing if Self::install has not run.
Sourcepub fn cpu_plugin(&self) -> impl RuntimePlugin
pub fn cpu_plugin(&self) -> impl RuntimePlugin
Trait object for the CPU half. Runs at phase::PREPARE.
Sourcepub fn gpu_plugin(&self) -> impl GpuPlugin
pub fn gpu_plugin(&self) -> impl GpuPlugin
Trait object for the GPU half. Runs at gpu_phase::PRE_PREPARE.
Replace the authoring values. The wind clock is preserved.
Auto Trait Implementations§
impl Freeze for WindPlugin
impl RefUnwindSafe for WindPlugin
impl Send for WindPlugin
impl Sync for WindPlugin
impl Unpin for WindPlugin
impl UnsafeUnpin for WindPlugin
impl UnwindSafe for WindPlugin
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
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> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.