use super::*;
use std::ops;
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ConstantTexture<T> {
pub value: T,
}
impl<T: Clone + Send + Sync> Texture for ConstantTexture<T> {
type Texel = T;
#[inline]
fn evaluate(&self, _si: &SurfaceInteraction, _dxy: &DxyInfo) -> T {
self.value.clone()
}
#[inline]
fn mean(&self) -> T {
self.value.clone()
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ProductTexture<T0, T1> {
pub t0: T0,
pub t1: T1,
}
impl<T0: Send + Sync, T1: Send + Sync> Texture for ProductTexture<T0, T1>
where T0: Texture,
T1: Texture,
T0::Texel: ops::Mul<T1::Texel>,
{
type Texel = <T0::Texel as ops::Mul<T1::Texel>>::Output;
#[inline]
fn evaluate(&self, si: &SurfaceInteraction, dxy: &DxyInfo) -> Self::Texel {
self.t0.evaluate(si, dxy) * self.t1.evaluate(si, dxy)
}
#[inline]
fn mean(&self) -> Self::Texel {
self.t0.mean() * self.t1.mean()
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct MixTexture<T0, T1, L> {
pub t0: T0,
pub t1: T1,
pub l: L,
}
impl<T0: Send + Sync, T1: Send + Sync, L: Send + Sync> Texture for MixTexture<T0, T1, L>
where T0: Texture,
T1: Texture,
L: Texture<Texel=Float>,
T0::Texel: ops::Mul<Float>,
T1::Texel: ops::Mul<Float>,
<T0::Texel as ops::Mul<Float>>::Output: ops::Add<<T1::Texel as ops::Mul<Float>>::Output>,
{
type Texel = <<T0::Texel as ops::Mul<Float>>::Output as ops::Add<<T1::Texel as ops::Mul<Float>>::Output>>::Output;
#[inline]
fn evaluate(&self, si: &SurfaceInteraction, dxy: &DxyInfo) -> Self::Texel {
let lerp = self.l.evaluate(si, dxy);
let t0l = self.t0.evaluate(si, dxy) * (1.0 as Float - lerp);
let t1l = self.t1.evaluate(si, dxy) * lerp;
t0l + t1l
}
#[inline]
fn mean(&self) -> Self::Texel {
let lerp = self.l.mean();
let t0l = self.t0.mean() * (1.0 as Float - lerp);
let t1l = self.t1.mean() * lerp;
t0l + t1l
}
}
pub mod image;