A toy ray tracer for educational purposes (i.e. my own education).
```rust use raytracer::vector::Vec3; use raytracer::scene::Scene; use raytracer::hitable::primitive::Sphere; use raytracer::hitable::primitive::Rectangle; use raytracer::hitable::transform::Translation; use raytracer::camera::perspective::PerspectiveCamera; use raytracer::renderer::Renderer; use raytracer::material::Material; use raytracer::material::plain::PlainMaterial; use raytracer::material::lambertian::LambertianMaterial; use raytracer::material::metal::MetalMaterial; use raytracer::actor::Actor; use raytracer::texture::uniform::UniformTexture; use raytracer::constants::Axis;
let mut scene = Scene::
// The floor let hitable = Box::new(Rectangle::new(100.0, Axis::X, 100.0, Axis::Y)); let texture = Box::new(UniformTexture::new(Vec3::fromarray([0.8, 0.8, 0.8]))); let material = Box::new(LambertianMaterial::new(texture, 0.65)); let actor = Actor { hitable, material}; scene.addactor(actor);
// A sphere let hitable = Box::new(Sphere::new(1.5)); let hitable = Box::new(Translation::new(hitable, Vec3::fromarray([0.0, 0.0, 1.5]))); let texture = Box::new(UniformTexture::new(Vec3::fromarray([1.0, 0.2, 0.2]))); let material = Box::new(MetalMaterial::new(texture, 0.0)); let actor = Actor { hitable, material}; scene.add_actor(actor);
// A light let hitable = Box::new(Sphere::new(2.5)); let hitable = Box::new(Translation::new(hitable, Vec3::fromarray([0.0, -2.0, 12.5]))); let texture = Box::new(UniformTexture::new(Vec3::fromarray([1.0, 1.0, 1.0]))); let material = Box::new(PlainMaterial::new(texture)); let actor = Actor { hitable, material}; scene.add_actor(actor);
// Set up the camera let width = 320; let height = 180; let aspect = width as f64 / height as f64;
let mut camera = PerspectiveCamera::
// Set up the renderer let samples = 256; let maxreflections = 8; let antialiasing = false let renderer = Renderer::new(width, height, samples, maxreflections, antialiasing);
// Process the image let image = renderer.render(&scene, &camera); ```