diff options
| author | Sakarias Johansson <sakarias.johansson@goodbyekansas.com> | 2023-04-05 21:38:33 +0200 |
|---|---|---|
| committer | Sakarias Johansson <sakariasjohansson@hotmail.com> | 2023-04-05 22:06:03 +0200 |
| commit | 5f8faa17457426c4ca8c54bf67b5aa96eb7a52ea (patch) | |
| tree | fd2972858804a93294e4ad95057b19c17340acbb /racer-tracer/src/renderer.rs | |
| parent | 71ea29e48bdfc500a4e958cc1f37eddbd1d7bd2c (diff) | |
| download | racer-tracer-5f8faa17457426c4ca8c54bf67b5aa96eb7a52ea.tar.gz racer-tracer-5f8faa17457426c4ca8c54bf67b5aa96eb7a52ea.tar.xz racer-tracer-5f8faa17457426c4ca8c54bf67b5aa96eb7a52ea.zip | |
🎨 Move render to rendering interface
Removed render.rs and added a renderer trait.
Planning on making several implementations so it makes sense to move
it to a trait so you can change implementations.
Diffstat (limited to 'racer-tracer/src/renderer.rs')
| -rw-r--r-- | racer-tracer/src/renderer.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/racer-tracer/src/renderer.rs b/racer-tracer/src/renderer.rs new file mode 100644 index 0000000..162dc4b --- /dev/null +++ b/racer-tracer/src/renderer.rs @@ -0,0 +1,51 @@ +use std::{sync::RwLock, time::Duration}; + +use synchronoise::SignalEvent; + +use crate::{ + camera::Camera, config::Config, error::TracerError, geometry::Hittable, image::Image, ray::Ray, + vec3::Color, vec3::Vec3, +}; + +pub mod cpu; +pub mod cpu_scaled; + +fn do_cancel(cancel_event: Option<&SignalEvent>) -> bool { + match cancel_event { + Some(event) => event.wait_timeout(Duration::from_secs(0)), + None => false, + } +} + +fn ray_color(scene: &dyn Hittable, ray: &Ray, depth: usize) -> Vec3 { + if depth == 0 { + return Vec3::default(); + } + + if let Some(rec) = scene.hit(ray, 0.001, std::f64::INFINITY) { + if let Some((scattered, attenuation)) = rec.material.scatter(ray, &rec) { + return attenuation * ray_color(scene, &scattered, depth - 1); + } + return Color::default(); + } + + // Sky + let first_color = Vec3::new(1.0, 1.0, 1.0); + let second_color = Vec3::new(0.5, 0.7, 1.0); + let unit_direction = ray.direction().unit_vector(); + let t = 0.5 * (unit_direction.y() + 1.0); + (1.0 - t) * first_color + t * second_color +} + +pub struct RenderData<'a> { + pub buffer: &'a RwLock<Vec<u32>>, + pub camera: &'a RwLock<Camera>, + pub image: &'a Image, + pub scene: &'a dyn Hittable, + pub config: &'a Config, + pub cancel_event: Option<&'a SignalEvent>, +} + +pub trait Renderer: Send + Sync { + fn render(&self, render_data: RenderData) -> Result<(), TracerError>; +} |
