71 lines
2.1 KiB
Rust
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(),
|
|
// )
|
|
}
|