ray-trace-w1/src/main.rs

71 lines
2.1 KiB
Rust

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(),
// )
}