105 lines
3 KiB
Rust
105 lines
3 KiB
Rust
use crate::core::texture::{
|
|
CreateSpectrumTexture, FloatTexture, SpectrumTexture };
|
|
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::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)))
|
|
}
|
|
}
|
|
|
|
#[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)))
|
|
}
|
|
}
|
|
|
|
#[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!()
|
|
}
|
|
}
|
|
|
|
#[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!()
|
|
}
|
|
}
|
|
|