pbrt/shared/src/textures/scaled.rs

44 lines
1.1 KiB
Rust

use crate::Float;
use crate::core::texture::{FloatTexture, SpectrumTexture, TextureEvalContext};
use crate::spectra::{SampledSpectrum, SampledWavelengths};
use crate::utils::Ptr;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct FloatScaledTexture {
pub tex: Ptr<FloatTexture>,
pub scale: Ptr<FloatTexture>,
}
impl FloatScaledTexture {
pub fn evaluate(&self, ctx: &TextureEvalContext) -> Float {
let sc = self.scale.get().map(|t| t.evaluate(ctx)).unwrap();
if sc == 0. {
return 0.;
}
self.tex.get().map(|t| t.evaluate(ctx)).unwrap_or(0.0) * sc
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct SpectrumScaledTexture {
pub tex: Ptr<SpectrumTexture>,
pub scale: Ptr<FloatTexture>,
}
impl SpectrumScaledTexture {
pub fn evaluate(
&self,
ctx: &TextureEvalContext,
lambda: &SampledWavelengths,
) -> SampledSpectrum {
let sc = self.scale.get().map(|t| t.evaluate(ctx)).unwrap_or(0.);
self.tex
.get()
.map(|t| t.evaluate(ctx, lambda))
.unwrap_or(SampledSpectrum::new(0.))
* sc
}
}