pub enum Falloff {
Linear,
Exponential {
scale: f32,
},
Tent {
center: f32,
width: f32,
},
Curve(Arc<dyn Curve<f32> + Sync + Send>),
}Expand description
Describes how the media in a ScatteringTerm is distributed.
This is closely related to the optical density values ScatteringTerm::absorption and
ScatteringTerm::scattering. Most media aren’t the same density everywhere;
near the edge of space Earth’s atmosphere is much less dense, and it absorbs
and scatters less light.
Falloff determines how the density of a medium changes as a function of
an abstract “falloff parameter” p. p = 1 denotes where the medium is the
densest, i.e. at the surface of the Earth, p = 0 denotes where the medium
fades away completely, i.e. at the edge of space, and values between scale
linearly with distance, so p = 0.5 would be halfway between the surface
and the edge of space.
When processing a ScatteringMedium, the absorption and scattering values
for each ScatteringTerm are multiplied by the value of the falloff function, f(p).
Variants§
Linear
A simple linear falloff function, which essentially passes the falloff parameter through unchanged.
f(1) = 1 f(0) = 0 f(p) = p
Exponential
An exponential falloff function parametrized by a proportional scale.
When paired with an absolute “falloff distance” like the distance from
Earth’s surface to the edge of space, this is analogous to the “height
scale” value common in atmospheric scattering literature, though it will
diverge from this for large or negative scale values.
f(1) = 1 f(0) = 0 f(p) = (e^((1-p)/s) - e^(1/s))/(e - e^(1/s))
Fields
scale: f32The “scale” of the exponential falloff. Values closer to zero will
produce steeper falloff, and values farther from zero will produce
gentler falloff, approaching linear falloff as scale goes to +-∞.
Negative values change the concavity of the falloff function: rather than an initial narrow region of steep falloff followed by a wide region of gentle falloff, there will be an initial wide region of gentle falloff followed by a narrow region of steep falloff.
domain: (-∞, ∞)
NOTE, this function is not defined when scale == 0.
In that case, it will fall back to linear falloff.
Tent
A tent-shaped falloff function, which produces a triangular peak at the center and linearly falls off to either side.
f(center) = 1
f(center +- width / 2) = 0
Fields
Curve(Arc<dyn Curve<f32> + Sync + Send>)
A falloff function defined by a custom curve.
domain: [0, 1], range: [0, 1],
Implementations§
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Falloff
impl !RefUnwindSafe for Falloff
impl Send for Falloff
impl Sync for Falloff
impl Unpin for Falloff
impl !UnwindSafe for Falloff
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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.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> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
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 more