From c7cbd0d288083ad7ae132ac6627cf93ec5b3aed5 Mon Sep 17 00:00:00 2001 From: Sakarias Johansson Date: Sun, 16 Apr 2023 14:32:42 +0200 Subject: =?UTF-8?q?=E2=9C=A8=20Add=20support=20for=20camera=20configuratio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also decided to not use glam and just do the math myself. Just didn't want an entire library for such a small thing. Probably goint to replace Vec3 at some point, just not now. --- racer-tracer/src/config.rs | 87 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 18 deletions(-) (limited to 'racer-tracer/src/config.rs') diff --git a/racer-tracer/src/config.rs b/racer-tracer/src/config.rs index 7d28ebe..58e9147 100644 --- a/racer-tracer/src/config.rs +++ b/racer-tracer/src/config.rs @@ -4,22 +4,7 @@ use config::File; use serde::Deserialize; use structopt::StructOpt; -use crate::error::TracerError; - -#[derive(Default, Clone, Debug, Deserialize)] -pub struct Screen { - pub height: usize, - pub width: usize, -} - -#[derive(Default, Clone, Debug, Deserialize)] -pub struct RenderConfigData { - pub samples: usize, - pub max_depth: usize, - pub num_threads_width: usize, - pub num_threads_height: usize, - pub scale: usize, -} +use crate::{error::TracerError, vec3::Vec3}; #[derive(StructOpt, Debug)] #[structopt(name = "racer-tracer")] @@ -76,6 +61,69 @@ impl TryFrom for Config { } } +#[derive(Default, Clone, Debug, Deserialize)] +pub struct Screen { + pub height: usize, + pub width: usize, +} + +#[derive(Default, Clone, Debug, Deserialize)] +pub struct RenderConfigData { + pub samples: usize, + pub max_depth: usize, + pub num_threads_width: usize, + pub num_threads_height: usize, + pub scale: usize, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct CameraConfig { + #[serde(default = "CameraConfig::default_vfov")] + pub vfov: f64, + + #[serde(default = "CameraConfig::default_aperture")] + pub aperture: f64, + + #[serde(default = "CameraConfig::default_focus_distance")] + pub focus_distance: f64, + + #[serde(default = "CameraConfig::default_pos")] + pub pos: Vec3, + + #[serde(default)] + pub look_at: Vec3, +} + +impl CameraConfig { + fn default_vfov() -> f64 { + 20.0 + } + + fn default_aperture() -> f64 { + 0.1 + } + + fn default_focus_distance() -> f64 { + 10.0 + } + + fn default_pos() -> Vec3 { + Vec3::new(0.0, 2.0, 10.0) + } +} + +impl Default for CameraConfig { + fn default() -> Self { + Self { + vfov: CameraConfig::default_vfov(), + aperture: CameraConfig::default_aperture(), + focus_distance: CameraConfig::default_focus_distance(), + pos: CameraConfig::default_pos(), + look_at: Vec3::default(), + } + } +} + #[derive(StructOpt, Debug, Clone, Deserialize, Default)] pub enum SceneLoader { #[default] @@ -106,7 +154,7 @@ pub enum Renderer { CpuPreview, } -fn default_preview_renderer() -> Renderer { +fn default_preview() -> Renderer { Renderer::CpuPreview } @@ -148,8 +196,11 @@ pub struct Config { #[serde(default)] pub renderer: Renderer, - #[serde(default = "default_preview_renderer")] + #[serde(default = "default_preview")] pub preview_renderer: Renderer, + + #[serde(default)] + pub camera: CameraConfig, } impl Config { -- cgit v1.2.3