pbrt/src/textures/mix.rs

142 lines
4 KiB
Rust

use crate::core::texture::{
CreateSpectrumTexture, FloatTexture, FloatTextureTrait, SpectrumTexture, SpectrumTextureTrait,
};
use crate::utils::{FileLoc, TextureParameterDictionary};
use crate::Arena;
use anyhow::Result;
use shared::core::geometry::{Vector3f, VectorLike};
use shared::core::texture::{SpectrumType, TextureEvalContext};
use shared::spectra::{SampledSpectrum, SampledWavelengths};
use shared::textures::{
GPUFloatDirectionMixTexture, GPUFloatMixTexture, GPUSpectrumDirectionMixTexture,
GPUSpectrumMixTexture,
};
use shared::utils::Transform;
use shared::Float;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct FloatMixTexture {
pub tex1: Arc<FloatTexture>,
pub tex2: Arc<FloatTexture>,
pub amount: Arc<FloatTexture>,
}
impl FloatMixTexture {
pub fn new(
tex1: Arc<FloatTexture>,
tex2: Arc<FloatTexture>,
amount: Arc<FloatTexture>,
) -> Self {
Self { tex1, tex2, amount }
}
pub fn create(
_render_from_texture: &Transform,
params: &TextureParameterDictionary,
_loc: &FileLoc,
_arena: &Arena,
) -> Result<FloatTexture> {
let tex1 = params.get_float_texture("tex1", 0.)?;
let tex2 = params.get_float_texture("tex2", 1.)?;
let amount = params.get_float_texture("amount", 0.5)?;
// arena.alloc(Self::new(tex1, tex2, amount));
Ok(FloatTexture::Mix(Self::new(tex1, tex2, amount)))
}
}
impl FloatTextureTrait for FloatMixTexture {
fn evaluate(&self, ctx: &TextureEvalContext) -> Float {
let amt = self.amount.evaluate(ctx);
let mut t1 = 0.;
let mut t2 = 0.;
if amt != 1. {
t1 = self.tex1.evaluate(ctx);
}
if amt != 0. {
t2 = self.tex2.evaluate(ctx);
}
(1. - amt) * t1 + amt * t2
}
}
#[derive(Clone, Debug)]
pub struct FloatDirectionMixTexture {
pub tex1: Arc<FloatTexture>,
pub tex2: Arc<FloatTexture>,
pub dir: Vector3f,
}
impl FloatDirectionMixTexture {
pub fn new(tex1: Arc<FloatTexture>, tex2: Arc<FloatTexture>, dir: Vector3f) -> Self {
Self { tex1, tex2, dir }
}
pub fn create(
render_from_texture: &Transform,
params: &TextureParameterDictionary,
_loc: &FileLoc,
_arena: &Arena,
) -> Result<FloatTexture> {
let dir_raw = params.get_one_vector3f("dir", Vector3f::new(0., 1., 0.))?;
let dir = render_from_texture.apply_to_vector(dir_raw).normalize();
let tex1 = params.get_float_texture("tex1", 0.)?;
let tex2 = params.get_float_texture("tex2", 1.)?;
// arena.alloc(Self::new(tex1, tex2, dir))
Ok(FloatTexture::DirectionMix(Self::new(tex1, tex2, dir)))
}
}
impl FloatTextureTrait for FloatDirectionMixTexture {
fn evaluate(&self, _ctx: &TextureEvalContext) -> Float {
todo!()
}
}
#[derive(Clone, Debug)]
pub struct SpectrumMixTexture {
pub tex1: Arc<SpectrumTexture>,
pub tex2: Arc<SpectrumTexture>,
pub amount: Arc<FloatTexture>,
}
impl CreateSpectrumTexture for SpectrumMixTexture {
fn create(
_render_from_texture: Transform,
_parameters: TextureParameterDictionary,
_spectrum_type: SpectrumType,
_loc: FileLoc,
) -> Result<SpectrumTexture> {
todo!()
}
}
impl SpectrumTextureTrait for SpectrumMixTexture {
fn evaluate(&self, _ctx: &TextureEvalContext, _lambda: &SampledWavelengths) -> SampledSpectrum {
todo!()
}
}
#[derive(Clone, Debug)]
pub struct SpectrumDirectionMixTexture {
pub tex1: Arc<SpectrumTexture>,
pub tex2: Arc<SpectrumTexture>,
pub dir: Vector3f,
}
impl CreateSpectrumTexture for SpectrumDirectionMixTexture {
fn create(
_render_from_texture: Transform,
_parameters: TextureParameterDictionary,
_spectrum_type: SpectrumType,
_loc: FileLoc,
) -> Result<SpectrumTexture> {
todo!()
}
}
impl SpectrumTextureTrait for SpectrumDirectionMixTexture {
fn evaluate(&self, _ctx: &TextureEvalContext, _lambda: &SampledWavelengths) -> SampledSpectrum {
todo!()
}
}