diff --git a/rtchallenge/src/world.rs b/rtchallenge/src/world.rs index dce199b..c940368 100644 --- a/rtchallenge/src/world.rs +++ b/rtchallenge/src/world.rs @@ -1,4 +1,10 @@ -use crate::{lights::PointLight, spheres::Sphere}; +use crate::{ + lights::PointLight, + materials::Material, + matrices::{Matrix2x2, Matrix4x4}, + spheres::Sphere, + tuples::{Color, Tuple}, +}; /// World holds all drawable objects and the light(s) that illuminate them. /// @@ -17,3 +23,32 @@ pub struct World { pub light: Option, pub objects: Vec, } + +impl World { + /// Creates a world suitable for use across multiple tests in from the book. + /// + /// # Examples + /// ``` + /// use rtchallenge::world::World; + /// + /// let w = World::test_world(); + /// assert_eq!(w.objects.len(), 2); + /// assert!(w.light.is_some()); + /// ``` + pub fn test_world() -> World { + let light = PointLight::new(Tuple::point(-10., 10., -10.), Color::new(1., 1., 1.)); + let mut s1 = Sphere::default(); + s1.material = Material { + color: Color::new(0.8, 1., 0.6), + diffuse: 0.7, + specular: 0.2, + ..Material::default() + }; + let mut s2 = Sphere::default(); + s2.transform = Matrix4x4::scaling(0.5, 0.5, 0.5); + World { + light: Some(light), + objects: vec![s1, s2], + } + } +}