61 lines
1.5 KiB
Rust
61 lines
1.5 KiB
Rust
#![feature(portable_simd)]
|
|
|
|
use raytracer::{random_f64, random_f64_range, Raytracer};
|
|
use vec3::{Color, Point3};
|
|
|
|
pub mod builder;
|
|
pub mod hittable;
|
|
pub mod interval;
|
|
pub mod material;
|
|
pub mod out;
|
|
pub mod ray;
|
|
pub mod raytracer;
|
|
pub mod vec3;
|
|
|
|
pub fn cover(width: usize, height: usize, spp: usize) -> Raytracer {
|
|
let mut builder = Raytracer::builder()
|
|
.image_size(width, height)
|
|
.samples_per_pixel(spp)
|
|
.max_depth(50)
|
|
.vertical_fov(20.0)
|
|
.look_from(13.0, 2.0, 3.0)
|
|
.look_at(0.0, 0.0, 0.0)
|
|
.vup(0.0, 1.0, 0.0)
|
|
.defocus_angle(0.6)
|
|
.focus_dist(10.0)
|
|
.with_sphere(0.0, -1000.0, 0.0, 1000.0)
|
|
.lambertian(1.0, 0.6, 0.7);
|
|
|
|
for a in -11..11 {
|
|
for b in -11..11 {
|
|
let choose_mat = random_f64();
|
|
let center =
|
|
Point3::new(a as f64 + 0.9 * random_f64(), 0.2, b as f64 + 0.9 * random_f64());
|
|
|
|
if (center - Point3::new(4.0, 0.2, 0.0)).len() > 0.9 {
|
|
let shape_builder = builder.with_sphere(center.x(), center.y(), center.z(), 0.2);
|
|
|
|
builder = if choose_mat < 0.8 {
|
|
let albedo = Color::random() * Color::random();
|
|
shape_builder.lambertian(albedo.r(), albedo.g(), albedo.b())
|
|
} else if choose_mat < 0.95 {
|
|
let albedo = Color::random_range(0.5, 1.0);
|
|
let fuzz = random_f64_range(0.0, 0.5);
|
|
shape_builder.metal(albedo.r(), albedo.g(), albedo.b(), fuzz)
|
|
} else {
|
|
shape_builder.dielectric(1.5)
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
builder
|
|
.with_sphere(0.0, 1.0, 0.0, 1.0)
|
|
.dielectric(1.5)
|
|
.with_sphere(-4.0, 1.0, 0.0, 1.0)
|
|
.lambertian(1.0, 0.5, 0.6)
|
|
.with_sphere(4.0, 1.0, 0.0, 1.0)
|
|
.metal(0.7, 0.6, 0.5, 0.0)
|
|
.finish()
|
|
}
|