Here's a little before-and-after with some of the syntax and semantic changes discussed (snippet from Sebastian Sylvan's raytracer [1] and modified slightly):

--- Before ---

    #[inline(always)]
    fn get_rand_env() -> rand_env {
        let rng = rand::rng();

        let disk_samples = vec::from_fn(513u) { |_x|
            // compute random position on light disk
            let r_sqrt = f32::sqrt(rng.next_float() as f32);
            let theta = rng.next_float() as f32 * 2f32 *
                        f32::consts::pi;
            (r_sqrt * theta.cos(), r_sqrt * theta.sin())
        }

        let mut hemicos_samples = [];
        for uint::range(0u, NUM_GI_SAMPLES_SQRT) { |x|
            for uint::range(0u, NUM_GI_SAMPLES_SQRT) { |y|
                let (u, v) = ((x as f32 + rng.next_float() as f32) /
                              NUM_GI_SAMPLES_SQRT as f32,
                              (y as f32 + rng.next_float() as f32) /
                              NUM_GI_SAMPLES_SQRT as f32);
                hemicos_samples.push(cosine_hemisphere_sample(u, v));
            }
        }

        {
            rng: rng,
            floats: vec::from_fn(513u,
                                 { |_x| rng.next_float() as f32 }),
            disk_samples: disk_samples,
            hemicos_samples: hemicos_samples
        }
    }

--- After ---

    #[inline(always)]
    fn get_rand_env() -> rand_env {
        let rng = rand::rng();

        let disk_samples = vec::from_fn(513): x {
            // compute random position on light disk
            let r_sqrt = rng.next_float().(f32).sqrt();
            let theta = rng.next_float().(f32) * 2.0 * f32::consts::pi;
            (r_sqrt * theta.cos(), r_sqrt * theta.sin());
        }

        let mut hemicos_samples = []/~;
        for uint::range(0, NUM_GI_SAMPLES_SQRT): x {
            for uint::range(0, NUM_GI_SAMPLES_SQRT): y {
                let (u, v) = ((x.(f32) + rng.next_float().(f32)) /
                              NUM_GI_SAMPLES_SQRT.(f32),
                              (y.(f32) + rng.next_float().(f32)) /
                              NUM_GI_SAMPLES_SQRT.(f32));
                hemicos_samples.push(cosine_hemisphere_sample(u, v));
            }
        }

        {
            rng: rng,
            floats: vec::from_fn(513, _ -> rng.next_float().(f32)),
            disk_samples: disk_samples,
            hemicos_samples: hemicos_samples
        };
    }

---

Patrick

[1]: https://github.com/brson/rustray/blob/master/raytracer.rs

_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to