New Scene struct

The scene is more than just a list of hittables. It's any and all
hittables (so the list, yeah), and also the camera(s!) in the world.

This doens't compile, however. More work will need to be done to
untangle the other things that could previously see these scattered
components.
This commit is contained in:
2023-09-23 14:40:34 -07:00
parent 7c43c3fb82
commit 60b4407573
2 changed files with 101 additions and 92 deletions

View File

@@ -4,7 +4,10 @@ mod renderer;
mod scene; mod scene;
use crate::primitives::Vec3; use crate::primitives::Vec3;
use crate::scene::Camera; use crate::scene::{
Camera,
Scene
};
use crate::renderer::RenderCommand; use crate::renderer::RenderCommand;
use rand::SeedableRng; use rand::SeedableRng;
@@ -24,20 +27,19 @@ fn main() {
// random generator // random generator
let mut small_rng = SmallRng::seed_from_u64(0); let mut small_rng = SmallRng::seed_from_u64(0);
// world // Scene (now includes camera)
let world = scene::random_scene(&mut small_rng); let scene = Scene {
camera: Camera::new(
// camera Vec3::new(13.0, 2.0, 3.0), // lookfrom
Vec3::zero(), // lookat
let cam = Camera::new( Vec3::new(0.0, 1.0, 0.0), // vup
Vec3::new(13.0, 2.0, 3.0), // lookfrom 20.0,
Vec3::zero(), // lookat aspect_ratio,
Vec3::new(0.0, 1.0, 0.0), // vup 0.1, // aperture
20.0, 10.0, // dist_to_focus
aspect_ratio, ),
0.1, // aperture world: Scene::random_world(&mut small_rng)
10.0, // dist_to_focus };
);
// render // render
// The render loop should now be a job submission mechanism // The render loop should now be a job submission mechanism

View File

@@ -228,85 +228,92 @@ impl Camera {
} }
} }
pub fn random_scene(srng: &mut SmallRng) -> Hittable {
let mat_ground = Material::Lambertian { albedo: Vec3::new(0.5, 0.5, 0.5) };
let mut world = Hittable::HittableList { hittables : Vec::<Hittable>::new() };
world.push( Hittable::Sphere { center: Vec3::new(0.0, -1000.0, 0.0), radius: 1000.0, material: mat_ground }); pub struct Scene {
pub camera: Camera,
pub world: Hittable,
}
let distrib_zero_one = Uniform::new(0.0, 1.0); impl Scene {
for a in -11..11 { pub fn random_world(srng: &mut SmallRng) -> Hittable {
for b in -11..11 { let mat_ground = Material::Lambertian { albedo: Vec3::new(0.5, 0.5, 0.5) };
let choose_mat = srng.sample(distrib_zero_one); let mut world = Hittable::HittableList { hittables : Vec::<Hittable>::new() };
let center = Vec3 {
x: a as f32 + 0.9 * srng.sample(distrib_zero_one),
y: 0.2,
z: b as f32 + 0.9 * srng.sample(distrib_zero_one),
};
if (center - Vec3::new(4.0, 0.2, 0.0)).length() > 0.9 {
if choose_mat < 0.8 { world.push( Hittable::Sphere { center: Vec3::new(0.0, -1000.0, 0.0), radius: 1000.0, material: mat_ground });
// diffuse
let albedo = Vec3::rand(srng, distrib_zero_one) * Vec3::rand(srng, distrib_zero_one);
let sphere_material = Material::Lambertian { albedo };
world.push(
Hittable::Sphere {
center,
radius: 0.2,
material: sphere_material,
}
);
} else if choose_mat < 0.95 {
// metal
let distr_albedo = Uniform::new(0.5, 1.0);
let distr_fuzz = Uniform::new(0.0, 0.5);
let albedo = Vec3::rand(srng, distr_albedo);
let fuzz = srng.sample(distr_fuzz);
let material = Material::Metal { albedo, fuzz };
world.push(
Hittable::Sphere {
center,
radius: 0.2,
material: material,
}
);
} else {
// glass
let material = Material::Dielectric { index_refraction: 1.5 };
world.push(
Hittable::Sphere{
center,
radius: 0.2,
material: material,
}
);
let distrib_zero_one = Uniform::new(0.0, 1.0);
for a in -11..11 {
for b in -11..11 {
let choose_mat = srng.sample(distrib_zero_one);
let center = Vec3 {
x: a as f32 + 0.9 * srng.sample(distrib_zero_one),
y: 0.2,
z: b as f32 + 0.9 * srng.sample(distrib_zero_one),
}; };
if (center - Vec3::new(4.0, 0.2, 0.0)).length() > 0.9 {
if choose_mat < 0.8 {
// diffuse
let albedo = Vec3::rand(srng, distrib_zero_one) * Vec3::rand(srng, distrib_zero_one);
let sphere_material = Material::Lambertian { albedo };
world.push(
Hittable::Sphere {
center,
radius: 0.2,
material: sphere_material,
}
);
} else if choose_mat < 0.95 {
// metal
let distr_albedo = Uniform::new(0.5, 1.0);
let distr_fuzz = Uniform::new(0.0, 0.5);
let albedo = Vec3::rand(srng, distr_albedo);
let fuzz = srng.sample(distr_fuzz);
let material = Material::Metal { albedo, fuzz };
world.push(
Hittable::Sphere {
center,
radius: 0.2,
material: material,
}
);
} else {
// glass
let material = Material::Dielectric { index_refraction: 1.5 };
world.push(
Hittable::Sphere{
center,
radius: 0.2,
material: material,
}
);
};
}
} }
} }
let material1 = Material::Dielectric { index_refraction: 1.5 };
world.push( Hittable::Sphere{
center: Vec3::new(0.0, 1.0, 0.0),
radius: 1.0,
material: material1
});
let material2 = Material::Lambertian { albedo: Vec3::new(0.4, 0.2, 0.1) };
world.push( Hittable::Sphere {
center: Vec3::new(-4.0, 1.0, 0.0),
radius: 1.0,
material: material2
});
let material3 = Material::Metal { albedo: Vec3::new(0.7, 0.6, 0.5), fuzz: 0.0 };
world.push( Hittable::Sphere {
center: Vec3::new(4.0, 1.0, 0.0),
radius: 1.0,
material: material3
});
world
} }
let material1 = Material::Dielectric { index_refraction: 1.5 };
world.push( Hittable::Sphere{
center: Vec3::new(0.0, 1.0, 0.0),
radius: 1.0,
material: material1
});
let material2 = Material::Lambertian { albedo: Vec3::new(0.4, 0.2, 0.1) };
world.push( Hittable::Sphere {
center: Vec3::new(-4.0, 1.0, 0.0),
radius: 1.0,
material: material2
});
let material3 = Material::Metal { albedo: Vec3::new(0.7, 0.6, 0.5), fuzz: 0.0 };
world.push( Hittable::Sphere {
center: Vec3::new(4.0, 1.0, 0.0),
radius: 1.0,
material: material3
});
return world;
} }