A Rust implementation of a small ray/pathtracer.
Inspired by Kevin Beason's educational 99-line raytracer/pathtracer.
Usage
[dependencies]
smallpt = "0.1.8"
Example
extern crate smallpt;
use smallpt::*;
let mut scene = Scene::init();
scene.add(Box::new(Sphere::new(
16.5,
Float3::new(27.0, 16.5, 47.0),
Material::new(Float3::zero(), Float3::new(1.0, 1.0, 1.0), BSDF::Mirror),
)));
scene.add(Box::new(Sphere::new(
16.5,
Float3::new(73.0, 16.5, 78.0),
Material::new(Float3::zero(), Float3::new(1.0, 1.0, 1.0), BSDF::Glass),
)));
scene.add(Box::new(Plane::new(
Float3::new(0.0, 0.0, 0.0),
Float3::new(0.0, 1.0, 0.0),
Material::new(Float3::zero(), Float3::new(0.75, 0.75, 0.75), BSDF::Diffuse),
)));
scene.add(Box::new(Plane::new(
Float3::new(1.0, 0.0, 0.0),
Float3::new(1.0, 0.0, 0.0),
Material::new(Float3::zero(), Float3::new(0.75, 0.25, 0.25), BSDF::Diffuse),
)));
scene.add(Box::new(Plane::new(
Float3::new(99.0, 0.0, 0.0),
Float3::new(-1.0, 0.0, 0.0),
Material::new(Float3::zero(), Float3::new(0.25, 0.25, 0.75), BSDF::Diffuse),
)));
scene.add(Box::new(Plane::new(
Float3::new(0.0, 0.0, 0.0),
Float3::new(0.0, 0.0, 1.0),
Material::new(Float3::zero(), Float3::new(0.75, 0.75, 0.75), BSDF::Diffuse),
)));
scene.add(Box::new(Plane::new(
Float3::new(0.0, 0.0, 170.0),
Float3::new(0.0, 0.0, -1.0),
Material::new(Float3::zero(), Float3::zero(), BSDF::Diffuse),
)));
scene.add(Box::new(Plane::new(
Float3::new(0.0, 81.6, 0.0),
Float3::new(0.0, -1.0, 0.0),
Material::new(Float3::zero(), Float3::new(0.75, 0.75, 0.75), BSDF::Diffuse),
)));
scene.add(Box::new(Rectangle::new(
Float3::new(50.0, 81.5, 50.0),
Float3::new(0.0, -1.0, 0.0),
Float3::new(1.0, 0.0, 0.0),
Float3::new(0.0, 0.0, 1.0),
33.0,
33.0,
Material::new(Float3::new(12.0, 12.0, 12.0), Float3::zero(), BSDF::Diffuse),
)));
scene.add(Box::new(Rectangle::new(
Float3::new(50.0, 81.5, 50.0),
Float3::new(0.0, -1.0, 0.0),
Float3::new(1.0, 0.0, 0.0),
Float3::new(0.0, 0.0, 1.0),
33.0,
33.0,
Material::new(Float3::new(12.0, 12.0, 12.0), Float3::zero(), BSDF::Diffuse),
)));
let camera = Ray {
origin: Float3::new(50.0, 50.0, 300.0),
direction: Float3::new(0.0, -0.05, -1.0).normalize(),
};
let num_samples = 16;
let width = 512;
let height = 512;
let mut backbuffer = vec![Float3::zero(); width * height];
trace(&scene, &camera, width, height, num_samples, &mut backbuffer);
Status
Code is still quite in flux, being refined on a weekly basis. More simplification and changes coming soon.