diff --git a/src/bin/minitracer/anim.rs b/src/bin/minitracer/anim.rs index f233a8e..bd57b6e 100644 --- a/src/bin/minitracer/anim.rs +++ b/src/bin/minitracer/anim.rs @@ -11,41 +11,22 @@ pub struct SphereParams { pub phases: Vec3, } -pub struct SphereParamsDistribution { - pub rad: Uniform, - pub pos: Uniform, - pub emit: Bernoulli, - pub ampl: Uniform, - pub freq: Uniform, - pub phase: Uniform, - pub gloss: Uniform, -} - -impl Default for SphereParamsDistribution { - fn default() -> Self { - Self { - rad: Uniform::new(-6., -4.), - pos: Uniform::new(-1.0, 1.0), - emit: Bernoulli::new(0.1).unwrap(), - ampl: Uniform::new(0.3, 0.8), - freq: Uniform::new(0.2, 1.5), - phase: Uniform::new(0., 2. * std::f32::consts::PI), - gloss: Uniform::new(0., 1.), - } - } -} - -impl SphereParamsDistribution { - pub fn make_params(&self, rgen: &mut impl rand::Rng) -> SphereParams { - SphereParams { - origin: self.pos.sample3(rgen), - radius: 2.0f32.powf(self.rad.sample(rgen)), - alpha: if self.emit.sample(rgen) { 10.0 } else { 0.0 }, - glossiness: self.gloss.sample(rgen), - amplitudes: self.ampl.sample3(rgen), - frequencies: self.freq.sample3(rgen), - phases: self.phase.sample3(rgen), - } +pub fn distr() -> impl Fn(&mut R) -> SphereParams { + let rad = Uniform::new(-6., -4.); + let pos = Uniform::new(-1.0, 1.0); + let emit = Bernoulli::new(0.1).unwrap(); + let ampl = Uniform::new(0.3, 0.8); + let freq = Uniform::new(0.2, 1.5); + let phase = Uniform::new(0., 2. * std::f32::consts::PI); + let gloss = Uniform::new(0., 1.); + move |rgen| SphereParams { + origin: pos.sample3(rgen), + radius: 2.0f32.powf(rad.sample(rgen)), + alpha: if emit.sample(rgen) { 10.0 } else { 0.0 }, + glossiness: gloss.sample(rgen), + amplitudes: ampl.sample3(rgen), + frequencies: freq.sample3(rgen), + phases: phase.sample3(rgen), } } diff --git a/src/bin/minitracer/main.rs b/src/bin/minitracer/main.rs index cc87806..8bc2d86 100644 --- a/src/bin/minitracer/main.rs +++ b/src/bin/minitracer/main.rs @@ -51,8 +51,8 @@ fn main() { let mut tracer = Tracer::new(&device, hdr_format); let sphere_params: Vec<_> = { let mut rng = rand_pcg::Pcg32::new(42, 0); - let distr = anim::SphereParamsDistribution::default(); - (0..N_SPHERES).map(|_| distr.make_params(&mut rng)).collect() + let distr = anim::distr(); + (0..N_SPHERES).map(|_| distr(&mut rng)).collect() }; let tracer_env = TracerEnv::new(&device, &tracer, &envmap);