From 5f8faa17457426c4ca8c54bf67b5aa96eb7a52ea Mon Sep 17 00:00:00 2001 From: Sakarias Johansson Date: Wed, 5 Apr 2023 21:38:33 +0200 Subject: =?UTF-8?q?=F0=9F=8E=A8=20Move=20render=20to=20rendering=20interfa?= =?UTF-8?q?ce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- racer-tracer/src/renderer.rs | 51 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 racer-tracer/src/renderer.rs (limited to 'racer-tracer/src/renderer.rs') 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>, + pub camera: &'a RwLock, + 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>; +} -- cgit v1.2.3