#![feature(core_float_math)] mod camera; mod objects; mod ray; mod vec3; use std::sync::Arc; use crate::camera::Camera; use crate::objects::materials::dielectric::Dielectric; use crate::objects::materials::lambertian::{Lambertian, Metal}; use crate::objects::sphere::Sphere; use crate::ray::Ray; use crate::vec3::Vec3; use dotenv::dotenv; use pretty_env_logger; fn main() { dotenv().ok(); pretty_env_logger::init(); // setup objects let blue = Arc::new(Metal::rgb(0.2, 0.4, 0.8, 1., 0.1)); let metal = Arc::new(Metal::rgb(0.7, 0.4, 0.2, 1., 0.1)); let ground = Arc::new(Lambertian::rgb(0.8, 0.8, 0., 1.0)); let center = Arc::new(Lambertian::rgb(0.1, 0.2, 0.5, 1.)); let left = Arc::new(Dielectric::new(1.5)); let bubble = Arc::new(Dielectric::new(1. / 1.5)); let right = Arc::new(Metal::rgb(0.8, 0.6, 0.2, 1., 1.0)); let mut world = vec![Sphere::xyz(0., 0.5, -0.8, 0.1, metal.clone())]; world.push(Sphere::xyz(0., -100.5, -1., 100., ground.clone())); world.push(Sphere::xyz(0., 0., -1.2, 0.5, center.clone())); world.push(Sphere::xyz(-1., 0., -1.0, 0.5, left.clone())); world.push(Sphere::xyz(-1., 0., -1.0, 0.4, bubble.clone())); world.push(Sphere::xyz(1., 0., -1.0, 0.5, right.clone())); world.push(Sphere::xyz(0., 0.7, -0.4, 0.2, blue.clone())); let c = Camera::new(16. / 9., 1920, 3, 50); c.render(&world); }