rpt 0.2.1

Physically-based path tracing renderer written in Rust
Documentation
//! Compound of five cubes: https://en.wikipedia.org/wiki/Compound_of_five_cubes

use rpt::*;

#[allow(clippy::many_single_char_names)]
fn lamp(x: f64, y: f64, z: f64, r: f64, e: f64) -> Light {
    Light::Object(
        Object::new(
            sphere()
                .scale(&glm::vec3(r, r, r))
                .translate(&glm::vec3(x, y, z)),
        )
        .material(Material::light(glm::vec3(1.0, 1.0, 1.0), e)),
    )
}

fn main() -> color_eyre::Result<()> {
    color_eyre::install()?;

    let mut scene = Scene::new();

    // Related to the golden ratio, computed by hand with some geometry
    let magic_angle = ((3.0 * 5.0_f64.sqrt() - 1.0) / 8.0).acos();

    // Five cubes make up the compound; exploit symmetries
    let c_central = Cube;
    let c_green = c_central.rotate(-magic_angle, &glm::vec3(1.0, 1.0, 1.0));
    let c_red = c_green.scale(&glm::vec3(-1.0, 1.0, 1.0));
    let c_blue = c_green.scale(&glm::vec3(1.0, -1.0, 1.0));
    let c_orange = c_red.scale(&glm::vec3(1.0, -1.0, 1.0));

    scene.add(Object::new(c_central).material(Material::specular(hex_color(0xC144EB), 0.4)));
    scene.add(Object::new(c_green).material(Material::specular(hex_color(0x45E542), 0.4)));
    scene.add(Object::new(c_red).material(Material::specular(hex_color(0xF55142), 0.4)));
    scene.add(Object::new(c_blue).material(Material::specular(hex_color(0x4275F5), 0.4)));
    scene.add(Object::new(c_orange).material(Material::specular(hex_color(0xF5BF42), 0.4)));

    scene.add(
        Object::new(plane(glm::vec3(0.0, 1.0, 0.0), -0.80902))
            .material(Material::diffuse(hex_color(0xFFFFFF))),
    );

    scene.add(lamp(-2.0, 3.5, 0.5, 0.5, 60.0));
    scene.add(lamp(0.0, 0.5, 5.0, 1.0, 2.0));
    scene.add(lamp(2.0, 1.0, -5.0, 0.6, 10.0));

    let camera = Camera::look_at(
        glm::vec3(-0.9, 1.2, 2.4),
        glm::vec3(0.0, 0.0, 0.0),
        glm::vec3(0.0, 1.0, 0.0),
        std::f64::consts::FRAC_PI_4,
    );
    Renderer::new(&scene, camera)
        .width(1024)
        .height(1024)
        .max_bounces(5)
        .num_samples(50)
        .render()
        .save("output.png")?;

    Ok(())
}