diff --git a/pyraydeon/examples/py_sphere.py b/pyraydeon/examples/py_sphere.py index d2b3e2f..b830105 100644 --- a/pyraydeon/examples/py_sphere.py +++ b/pyraydeon/examples/py_sphere.py @@ -92,7 +92,8 @@ def paths(self, cam): PySphere(Point3(0, 0, 0), 1.0, Material(3.0, 3.0, 3)), PyPlane(Point3(0, -2, 0), Vec3(0, 1, 0), Material(9000.0, 3.0, 3)), ], - lights=[PointLight((4, 3, 10), 4.0, 2.0, 0.15, 0.4, 0.11)], + lights=[PointLight((4, 3, 10), 3.6, 2.0, 0.15, 0.4, 0.11)], + ambient_light=0.13, ) diff --git a/pyraydeon/examples/py_sphere_expected.svg b/pyraydeon/examples/py_sphere_expected.svg index 0eaf889..2ee92a7 100644 --- a/pyraydeon/examples/py_sphere_expected.svg +++ b/pyraydeon/examples/py_sphere_expected.svg @@ -1 +1 @@ - + diff --git a/pyraydeon/src/scene.rs b/pyraydeon/src/scene.rs index b82286d..82c09bb 100644 --- a/pyraydeon/src/scene.rs +++ b/pyraydeon/src/scene.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use numpy::{Ix1, PyArray, PyReadonlyArray1}; use pyo3::prelude::*; -use raydeon::WorldSpace; +use raydeon::{SceneLighting, WorldSpace}; use crate::light::PointLight; use crate::linear::{ArbitrarySpace, Point2, Point3, Vec3}; @@ -101,11 +101,12 @@ pub(crate) struct Scene { #[pymethods] impl Scene { #[new] - #[pyo3(signature = (geometry=None, lights=None))] + #[pyo3(signature = (geometry=None, lights=None, ambient_light=0.0))] fn new( py: Python, geometry: Option>, lights: Option>, + ambient_light: f64, ) -> PyResult { let geometry = geometry.unwrap_or_default(); let lights = lights.unwrap_or_default(); @@ -123,10 +124,13 @@ impl Scene { .into_iter() .map(|l| Arc::new(l.0) as Arc) .collect(); + let lighting = SceneLighting::new() + .with_lights(lights) + .with_ambient_lighting(ambient_light); let scene = Arc::new( raydeon::Scene::new() .with_geometry(geometry) - .with_lighting(lights), + .with_lighting(lighting), ); Ok(Self { scene }) } diff --git a/raydeon/examples/lit_cubes.rs b/raydeon/examples/lit_cubes.rs index a33c42a..35d3a85 100644 --- a/raydeon/examples/lit_cubes.rs +++ b/raydeon/examples/lit_cubes.rs @@ -1,7 +1,7 @@ use raydeon::lights::PointLight; use raydeon::material::Material; use raydeon::shapes::AxisAlignedCuboid; -use raydeon::{Camera, Scene, WPoint3, WVec3}; +use raydeon::{Camera, Scene, SceneLighting, WPoint3, WVec3}; use std::sync::Arc; fn main() { @@ -27,14 +27,18 @@ fn main() { Material::new(3.0, 2.0, 2.0, 0), )), ]) - .with_lighting(vec![Arc::new(PointLight::new( - 20.0, - 100.0, - (5.5, 12.0, 7.3), - 0.0, - 0.09, - 0.23, - ))]); + .with_lighting( + SceneLighting::new() + .with_lights(vec![Arc::new(PointLight::new( + 20.0, + 100.0, + (5.5, 12.0, 7.3), + 0.0, + 0.09, + 0.23, + ))]) + .with_ambient_lighting(0.13), + ); let eye = WPoint3::new(8.0, 6.0, 4.0); let focus = WVec3::new(0.0, 0.0, 0.0); diff --git a/raydeon/examples/lit_cubes_expected.svg b/raydeon/examples/lit_cubes_expected.svg index fdf4d07..5ff2f28 100644 --- a/raydeon/examples/lit_cubes_expected.svg +++ b/raydeon/examples/lit_cubes_expected.svg @@ -28,1476 +28,1151 @@ - - - - + + + + + + + + + + + - - - - + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + - - - + + + - - + + + + - - + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + - - - - - - + + - + + + + + + + - - - + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + - - - - - - - - + + + + + - - - - + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + - + + + + + + + - - - - - - - - - + + + + + + + + + + + + - - - - - - + + + + + - + + + + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + - - - - + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - + + - + + - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - + + + + - - - - + + + - - - - - - - - + + + - - - - - - - + + + - - - - - - - - - - + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + - - - - - - - + + + + - - - - - - - + + + + + + + + + + - - + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + - - - - - + + + + + + + + + + - - - - - - - - - + + + + + - - - - + + - - - + + - - - + + + + + + + + - - - - - - - + + + + + - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + - - - - + - - - - - + + + + + + + + + + - - - - - - + + + + + - - - - + + - - - - - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + - - - + + + + + + + + - - - - - - + + + + + - - - - - - - + + + - - - - - - - - - + + + + + - - - - - - + + + + + + + + + + + + + - - + + + + + + + + + + - - - - - - - - - - - - - - - - - + + - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + + + - + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + - - - + + + + + + - - - - + - - - - - - - - - - - - - - + + + + + + - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - + - + + + - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + + + + + - - - - - - - - - - - - - - - - - + + + - - - - - - - - + - - - - + + + + + + + + + - + + - - - - - + - - - - - - + + + + - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - + + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - + + + - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - + + - + - + + + - - - - + + + + diff --git a/raydeon/src/scene.rs b/raydeon/src/scene.rs index 88af416..4c17480 100644 --- a/raydeon/src/scene.rs +++ b/raydeon/src/scene.rs @@ -398,7 +398,8 @@ impl<'a> SceneCamera<'a, Material, SceneLighting> { .lights .iter() .map(|light| light.compute_illumination(self.scene, hitpoint, &shape)) - .sum(), + .sum::() + + self.scene.lighting.ambient, ) });