use std::fs::File; use std::io::BufWriter; use crate::hittable::HittableList; use crate::material::{Lambertian, MaterialKind, Metal}; use crate::ppm_writer::PPMWriter; use crate::types_defined::{Camera, Color, Point, Sphere, Vec3}; mod camera; mod color; mod hittable; mod ray; mod sphere; mod types_defined; mod vec3; mod write_file_util; mod math_utils; mod ppm_writer; mod material; fn main() { camera_render(); } fn camera_render() { let width: i32 = 800/2; let height: i32 = 600/2; let pw_r = PPMWriter::new( BufWriter::new(File::create("./target/ray_sphere_normal_scene_render.ppm").unwrap()), width, height); if let Err(e) = pw_r { println!("创建文件报错:{}", e); return; } let pw = &mut pw_r.unwrap(); let mut camera: Camera = Camera::new( width, 4.0 / 3.0, 2.0, Point::new(0.0, -0.0, 0.0), Vec3::new(0.0, 0.0, 1.0), 127, 127, pw ); // world // world objects(spheres) let mut world = HittableList::new(); let plane_m = Some(MaterialKind::Lambertian(Lambertian{albedo: Color::new(0.899, 0.899, 0.999)})); let plane2_m = Some(MaterialKind::Metal(Metal{albedo: Color::new(0.784,0.784,0.784)})); let center_m = Some(MaterialKind::Lambertian(Lambertian{albedo: Color::new(0.5, 0.5, 0.5)})); let left_m = Some(MaterialKind::Metal(Metal{albedo: Color::new(0.799, 0.599, 0.799)})); let left_behind_m = Some(MaterialKind::Lambertian(Lambertian{albedo: Color::new(0.799, 0.599, 0.599)})); let right_m = Some(MaterialKind::Metal(Metal{albedo: Color::new(0.8, 0.6, 0.2)})); world.put(Box::new(Sphere::new(Point::new(0.0, 0.0, -1.0), 0.5, center_m))); world.put(Box::new(Sphere::new(Point::new(-1.0, 0.0, -1.0), 0.5, left_m))); world.put(Box::new(Sphere::new(Point::new(-2.5, 1.5, -3.5), 1.5, left_behind_m))); world.put(Box::new(Sphere::new(Point::new(1.0, 0.0, -1.0), 0.5, right_m))); world.put(Box::new(Sphere::new(Point::new(0.0, -25.5, -1.0), 25.0, plane_m))); camera.render(&world); // write_image( // ppm_content, // "".to_string(), // ) }