Allow scenes to specify their camera
This commit is contained in:
parent
d69fd86f8b
commit
19107f20c9
91
src/main.rs
91
src/main.rs
@ -30,7 +30,14 @@ mod perlin;
|
|||||||
mod noise;
|
mod noise;
|
||||||
mod image_texture;
|
mod image_texture;
|
||||||
|
|
||||||
fn earth() -> HittableList {
|
// Image
|
||||||
|
const ASPECT_RATIO: f64 = 3.0 / 2.0;
|
||||||
|
const IMAGE_WIDTH: usize = 400;
|
||||||
|
const IMAGE_HEIGHT: usize = (IMAGE_WIDTH as f64 / ASPECT_RATIO) as usize;
|
||||||
|
const SAMPLES_PER_PIXEL: i32 = 100;
|
||||||
|
const MAX_DEPTH: i32 = 50;
|
||||||
|
|
||||||
|
fn earth() -> (HittableList, Camera) {
|
||||||
let mut world:HittableList = Vec::new();
|
let mut world:HittableList = Vec::new();
|
||||||
let earth_texture = ImageTexture::new("textures/earthmap.jpg");
|
let earth_texture = ImageTexture::new("textures/earthmap.jpg");
|
||||||
let earth_material = Arc::new(
|
let earth_material = Arc::new(
|
||||||
@ -40,10 +47,26 @@ fn earth() -> HittableList {
|
|||||||
radius: 2.0,
|
radius: 2.0,
|
||||||
material: earth_material
|
material: earth_material
|
||||||
}));
|
}));
|
||||||
world
|
|
||||||
|
let look_from = Point3::new(13.0, 2.0, 3.0);
|
||||||
|
let look_at = Point3::new(0.0, 0.0, 0.0);
|
||||||
|
let focus_dist = 2.0;
|
||||||
|
|
||||||
|
let cam = Camera::new(
|
||||||
|
look_from,
|
||||||
|
look_at,
|
||||||
|
Vec3::new(0.0, 1.0, 0.0),
|
||||||
|
ASPECT_RATIO,
|
||||||
|
20.0,
|
||||||
|
0.0,
|
||||||
|
focus_dist,
|
||||||
|
0.0,
|
||||||
|
1.0);
|
||||||
|
|
||||||
|
(world, cam)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn two_spheres() -> HittableList {
|
fn two_spheres() -> (HittableList, Camera) {
|
||||||
let mut world:HittableList = Vec::new();
|
let mut world:HittableList = Vec::new();
|
||||||
let checker = CheckerTexture::colored(
|
let checker = CheckerTexture::colored(
|
||||||
Color::new(0.2, 0.3, 0.1),
|
Color::new(0.2, 0.3, 0.1),
|
||||||
@ -59,9 +82,25 @@ fn two_spheres() -> HittableList {
|
|||||||
radius: 10.0,
|
radius: 10.0,
|
||||||
material: checker_material
|
material: checker_material
|
||||||
}));
|
}));
|
||||||
world
|
|
||||||
|
let look_from = Point3::new(13.0, 2.0, 3.0);
|
||||||
|
let look_at = Point3::new(0.0, 0.0, 0.0);
|
||||||
|
let focus_dist = 2.0;
|
||||||
|
|
||||||
|
let cam = Camera::new(
|
||||||
|
look_from,
|
||||||
|
look_at,
|
||||||
|
Vec3::new(0.0, 1.0, 0.0),
|
||||||
|
ASPECT_RATIO,
|
||||||
|
20.0,
|
||||||
|
0.0,
|
||||||
|
focus_dist,
|
||||||
|
0.0,
|
||||||
|
1.0);
|
||||||
|
|
||||||
|
(world, cam)
|
||||||
}
|
}
|
||||||
fn two_perlin_spheres() -> HittableList {
|
fn two_perlin_spheres() -> (HittableList, Camera) {
|
||||||
let mut world:HittableList = Vec::new();
|
let mut world:HittableList = Vec::new();
|
||||||
let noise = NoiseTexture { noise: Perlin::new(), scale: 4.0 };
|
let noise = NoiseTexture { noise: Perlin::new(), scale: 4.0 };
|
||||||
let noise_material = Arc::new(Material::Lambertian(Lambertian::textured(Arc::new(noise))));
|
let noise_material = Arc::new(Material::Lambertian(Lambertian::textured(Arc::new(noise))));
|
||||||
@ -75,10 +114,26 @@ fn two_perlin_spheres() -> HittableList {
|
|||||||
radius: 2.0,
|
radius: 2.0,
|
||||||
material: noise_material
|
material: noise_material
|
||||||
}));
|
}));
|
||||||
world
|
|
||||||
|
let look_from = Point3::new(13.0, 2.0, 3.0);
|
||||||
|
let look_at = Point3::new(0.0, 0.0, 0.0);
|
||||||
|
let focus_dist = 2.0;
|
||||||
|
|
||||||
|
let cam = Camera::new(
|
||||||
|
look_from,
|
||||||
|
look_at,
|
||||||
|
Vec3::new(0.0, 1.0, 0.0),
|
||||||
|
ASPECT_RATIO,
|
||||||
|
20.0,
|
||||||
|
0.0,
|
||||||
|
focus_dist,
|
||||||
|
0.0,
|
||||||
|
1.0);
|
||||||
|
|
||||||
|
(world, cam)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn random_scene() -> HittableList {
|
fn random_scene() -> (HittableList, Camera) {
|
||||||
let mut world: HittableList = Vec::new();
|
let mut world: HittableList = Vec::new();
|
||||||
|
|
||||||
let checker = CheckerTexture::colored(
|
let checker = CheckerTexture::colored(
|
||||||
@ -155,22 +210,10 @@ fn random_scene() -> HittableList {
|
|||||||
material: material3
|
material: material3
|
||||||
}));
|
}));
|
||||||
|
|
||||||
world
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
// Image
|
|
||||||
const ASPECT_RATIO: f64 = 3.0 / 2.0;
|
|
||||||
const IMAGE_WIDTH: usize = 400;
|
|
||||||
const IMAGE_HEIGHT: usize = (IMAGE_WIDTH as f64 / ASPECT_RATIO) as usize;
|
|
||||||
const SAMPLES_PER_PIXEL: i32 = 1;
|
|
||||||
const MAX_DEPTH: i32 = 50;
|
|
||||||
|
|
||||||
let look_from = Point3::new(13.0, 2.0, 3.0);
|
let look_from = Point3::new(13.0, 2.0, 3.0);
|
||||||
let look_at = Point3::new(0.0, 0.0, 0.0);
|
let look_at = Point3::new(0.0, 0.0, 0.0);
|
||||||
let focus_dist = 2.0;
|
let focus_dist = 2.0;
|
||||||
|
|
||||||
// Camera
|
|
||||||
let cam = Camera::new(
|
let cam = Camera::new(
|
||||||
look_from,
|
look_from,
|
||||||
look_at,
|
look_at,
|
||||||
@ -179,12 +222,16 @@ fn main() {
|
|||||||
20.0,
|
20.0,
|
||||||
0.0,
|
0.0,
|
||||||
focus_dist,
|
focus_dist,
|
||||||
0.0,
|
0.0,
|
||||||
1.0);
|
1.0);
|
||||||
|
|
||||||
|
(world, cam)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
// World
|
// World
|
||||||
let scene: u8 = 2;
|
let scene: u8 = 2;
|
||||||
let world = match scene {
|
let (world, cam) = match scene {
|
||||||
0 => two_spheres(),
|
0 => two_spheres(),
|
||||||
1 => two_perlin_spheres(),
|
1 => two_perlin_spheres(),
|
||||||
2 => earth(),
|
2 => earth(),
|
||||||
|
Loading…
Reference in New Issue
Block a user