#[macro_use]
extern crate criterion;

use criterion::Criterion;
use criterion::ParameterizedBenchmark;

use rtiow::hitable::Hit;
use rtiow::material::Lambertian;
use rtiow::ray::Ray;
use rtiow::sphere::Sphere;
use rtiow::texture::ConstantTexture;
use rtiow::vec3::Vec3;

fn criterion_benchmark(c: &mut Criterion) {
    let sphere = Sphere::new(
        Vec3::new(0., 0., 0.),
        1.,
        Lambertian::new(ConstantTexture::new([1., 0., 0.])),
    );
    let rays = vec![
        // Hit
        Ray::new([0., 0., -2.], [0., 0., 1.], 0.),
        // Miss
        Ray::new([0., 0., -2.], [0., 0., -1.], 0.),
    ];
    c.bench(
        "sphere",
        ParameterizedBenchmark::new(
            "Sphere",
            move |b, r| b.iter(|| sphere.hit(*r, 0., 1.)),
            rays,
        ),
    );
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
