random scene
This commit is contained in:
61
src/main.rs
61
src/main.rs
@@ -10,9 +10,8 @@ pub mod material;
|
|||||||
|
|
||||||
use std::{io::{BufWriter, Write, stdout}, fs::File, time::Instant};
|
use std::{io::{BufWriter, Write, stdout}, fs::File, time::Instant};
|
||||||
|
|
||||||
use material::Metal;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
material::*,
|
||||||
color::*,
|
color::*,
|
||||||
sphere::*,
|
sphere::*,
|
||||||
rtweekend::*,
|
rtweekend::*,
|
||||||
@@ -23,6 +22,45 @@ use crate::{
|
|||||||
camera::*, material::{Lambertian, Dielectric},
|
camera::*, material::{Lambertian, Dielectric},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fn random_scene() -> HittableList {
|
||||||
|
let mut world = HittableList::new_empty();
|
||||||
|
|
||||||
|
static GROUND_MATERIAL: Lambertian = Lambertian::new(Color::new(0.5, 0.5, 0.5));
|
||||||
|
world.add(Box::new(Sphere::new(Point3::new(0.0, -1000.0, 0.0), 1000.0, &GROUND_MATERIAL)));
|
||||||
|
|
||||||
|
for a in 0..12 {
|
||||||
|
for b in 0..12 {
|
||||||
|
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)).length() > 0.9 {
|
||||||
|
if choose_mat < 0.8 {
|
||||||
|
//let albedo = Color::new(0.3, 0.8, 0.4);
|
||||||
|
static SPHERE_MATERIAL: Lambertian = Lambertian::new(Color::new(0.3, 0.8, 0.4));
|
||||||
|
world.add(Box::new(Sphere::new(center, 0.2, &SPHERE_MATERIAL)));
|
||||||
|
} else if choose_mat < 0.95 {
|
||||||
|
static SPHERE_MATERIAL: Metal = Metal::new(Color::new(0.3, 0.6, 0.2), 0.2);
|
||||||
|
world.add(Box::new(Sphere::new(center, 0.2, &SPHERE_MATERIAL)));
|
||||||
|
} else {
|
||||||
|
static SPHERE_MATERIAL: Dielectric = Dielectric::new(1.5);
|
||||||
|
world.add(Box::new(Sphere::new(center, 0.2, &SPHERE_MATERIAL)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static MATERIAL1: Dielectric = Dielectric::new(1.5);
|
||||||
|
world.add(Box::new(Sphere::new(Point3::new(0.0, 1.0, 0.0), 1.0, &MATERIAL1)));
|
||||||
|
|
||||||
|
static MATERIAL2: Lambertian = Lambertian::new(Color::new(0.4, 0.2, 0.1));
|
||||||
|
world.add(Box::new(Sphere::new(Point3::new(-4.0, 1.0, 0.0), 1.0, &MATERIAL2)));
|
||||||
|
|
||||||
|
static MATERIAL3: Metal = Metal::new(Color::new(0.7, 0.6, 0.5), 0.0);
|
||||||
|
world.add(Box::new(Sphere::new(Point3::new(4.0, 1.0, 0.0), 1.0, &MATERIAL3)));
|
||||||
|
|
||||||
|
world
|
||||||
|
}
|
||||||
|
|
||||||
fn ray_color(r: Ray, world: &mut dyn Hittable, depth: i32) -> Color {
|
fn ray_color(r: Ray, world: &mut dyn Hittable, depth: i32) -> Color {
|
||||||
// Limit the bounces
|
// Limit the bounces
|
||||||
if depth <= 0 {
|
if depth <= 0 {
|
||||||
@@ -48,28 +86,19 @@ fn ray_color(r: Ray, world: &mut dyn Hittable, depth: i32) -> Color {
|
|||||||
fn main() {
|
fn main() {
|
||||||
// Image
|
// Image
|
||||||
let aspect_ratio: f64 = 1.0 / 1.0;
|
let aspect_ratio: f64 = 1.0 / 1.0;
|
||||||
let image_width: i32 = 512;
|
let image_width: i32 = 1000;
|
||||||
let image_height: i32 = (image_width as f64 / aspect_ratio as f64) as i32;
|
let image_height: i32 = (image_width as f64 / aspect_ratio as f64) as i32;
|
||||||
let samples_per_pixel: i32 = 200;
|
let samples_per_pixel: i32 = 200;
|
||||||
let max_depth: i32 = 4;
|
let max_depth: i32 = 4;
|
||||||
|
|
||||||
// World
|
// World
|
||||||
let mut world = HittableList::new_empty();
|
let mut world = random_scene();
|
||||||
static MATERIAL_GROUND: Lambertian = Lambertian::new(Color::new(0.3, 0.8, 0.0));
|
|
||||||
static MATERIAL_CENTER: Lambertian = Lambertian::new(Color::new(0.1, 0.2, 0.5));
|
|
||||||
static MATERIAL_LEFT: Dielectric = Dielectric::new(1.5);
|
|
||||||
static MATERIAL_RIGHT: Metal = Metal::new(Color::new(0.8, 0.6, 0.2), 0.0);
|
|
||||||
|
|
||||||
world.add(Box::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0, &MATERIAL_GROUND)));
|
|
||||||
world.add(Box::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5, &MATERIAL_CENTER)));
|
|
||||||
world.add(Box::new(Sphere::new(Point3::new(-1.0, 0.0, -1.0), 0.5, &MATERIAL_LEFT)));
|
|
||||||
world.add(Box::new(Sphere::new(Point3::new(1.0, 0.0, -1.0), 0.5, &MATERIAL_RIGHT)));
|
|
||||||
|
|
||||||
// Camera
|
// Camera
|
||||||
let lookfrom = Point3::new(-2.0, 2.0, 1.0);
|
let lookfrom = Point3::new(-13.0, 2.0, 3.0);
|
||||||
let lookat = Point3::new(0.0, 0.0, -1.0);
|
let lookat = Point3::new(0.0, 0.0, 0.0);
|
||||||
let vup = Vec3::new(0.0, 1.0, 0.0);
|
let vup = Vec3::new(0.0, 1.0, 0.0);
|
||||||
let dist_to_focus = (lookfrom-lookat).length_squared();
|
let dist_to_focus = 10.0;//(lookfrom-lookat).length_squared();
|
||||||
|
|
||||||
let cam = Camera::new(
|
let cam = Camera::new(
|
||||||
lookfrom,
|
lookfrom,
|
||||||
|
|||||||
Reference in New Issue
Block a user