# rsrt

A raytracer built using https://raytracing.github.io as a follow up to my last attempt back in 2020 https://github.com/EliseZeroTwo/rs-ytrace/.

## Renders

### 2024-06-29

A slightly modified version of the cover of the first book "Ray Tracing in One Weekend".

![A slightly modified version of the cover from the first book "Ray Tracing in One Weekend"](./renders/1st-cover-4k.png)

```rs
let mut builder = Raytracer::builder()
    .image_size(3840, 2160)
    .samples_per_pixel(500)
    .max_depth(50)
    .vertical_fov(20.0)
    .look_from(13.0, 2.0, 3.0)
    .look_at(0.0, 0.0, 0.0)
    .vup(0.0, 1.0, 0.0)
    .defocus_angle(0.6)
    .focus_dist(10.0)
    .with_sphere(0.0, -1000.0, 0.0, 1000.0)
    .lambertian(1.0, 0.6, 0.7);

for a in -11..11 {
    for b in -11..11 {
        let choose_mat = random_f64();
        let center = Point3::new(a as f64 + 0.9 * random_f64(), 0.2, b as f64 + 0.9 * random_f64());

        if (center - Point3::new(4.0, 0.2, 0.0)).len() > 0.9 {
            let shape_builder = builder.with_sphere(center.x(), center.y(), center.z(), 0.2);

            builder = if choose_mat < 0.8 {
                let albedo = Color::random() * Color::random();
                shape_builder.lambertian(albedo.r(), albedo.g(), albedo.b())
            } else if choose_mat < 0.95 {
                let albedo = Color::random_range(0.5, 1.0);
                let fuzz = random_f64_range(0.0, 0.5);
                shape_builder.metal(albedo.r(), albedo.g(), albedo.b(), fuzz)
            } else {
                shape_builder.dielectric(1.5)
            };
        }
    }
}

let raytracer = builder
    .with_sphere(0.0, 1.0, 0.0, 1.0)
    .dielectric(1.5)
    .with_sphere(-4.0, 1.0, 0.0, 1.0)
    .lambertian(1.0, 0.5, 0.6)
    .with_sphere(4.0, 1.0, 0.0, 1.0)
    .metal(0.7, 0.6, 0.5, 0.0)
    .finish();
```