aboutsummaryrefslogtreecommitdiff
path: root/src/camera
diff options
context:
space:
mode:
authorJulian T <julian@jtle.dk>2021-01-25 14:43:46 +0100
committerJulian T <julian@jtle.dk>2021-01-25 14:43:46 +0100
commit33a35c50c20e863123642c8c9ea31dfc006945f6 (patch)
tree6bbdd9f0f5d4deddec50fca1c3dbff3f2878ffac /src/camera
parent41ea2d8f94043d49fc26aaaa8030a73dcfdc2da9 (diff)
Started work on implementing vectors bounding and film
Diffstat (limited to 'src/camera')
-rw-r--r--src/camera/film.rs51
-rw-r--r--src/camera/filter/mod.rs22
-rw-r--r--src/camera/mod.rs2
3 files changed, 75 insertions, 0 deletions
diff --git a/src/camera/film.rs b/src/camera/film.rs
new file mode 100644
index 0000000..c4a65ce
--- /dev/null
+++ b/src/camera/film.rs
@@ -0,0 +1,51 @@
+use crate::vector::{Vector2, Vector2f};
+use crate::Float;
+use crate::bounding::Bound2i;
+use super::filter::Filter;
+
+#[derive(Clone)]
+pub struct Pixel {
+ pub rgb: [Float; 3],
+}
+
+pub struct Film<'a> {
+ pub resolution: Vector2<usize>,
+
+ pixels: Vec<Pixel>,
+ filter: &'a dyn Filter,
+ filter_radius: Vector2f,
+}
+
+pub struct FilmTile {
+
+}
+
+impl Pixel {
+ fn new() -> Pixel {
+ Pixel { rgb: [0.0, 0.0, 0.0] }
+ }
+}
+
+impl Film<'_> {
+ fn new(resolution: Vector2<usize>, filter: & dyn Filter) -> Film {
+ let area = resolution.x * resolution.y;
+ Film {
+ resolution,
+ pixels: vec![Pixel::new(); area],
+ filter,
+ filter_radius: filter.radius()
+ }
+ }
+
+ fn get_tile(bound: &Bound2i) {
+ // Used to calculate descrete coordinates into continues
+ let halfpixel = Vector2f::from_xy(0.5, 0.5);
+ }
+
+ fn splat(&mut self, point: &Vector2<usize>, pixel: &Pixel) {
+ let index = point.x + point.y * self.resolution.x;
+
+ self.pixels[index] = pixel.clone();
+ }
+}
+
diff --git a/src/camera/filter/mod.rs b/src/camera/filter/mod.rs
new file mode 100644
index 0000000..93c6fc5
--- /dev/null
+++ b/src/camera/filter/mod.rs
@@ -0,0 +1,22 @@
+use crate::vector::Vector2f;
+use crate::Float;
+
+pub trait Filter {
+ fn eval(&self, point: &Vector2f) -> Float;
+ fn radius(&self) -> Vector2f;
+}
+
+pub struct BoxFilter {
+ radius: Vector2f,
+}
+
+// The same a no filter, and can give aliasing in final image
+impl Filter for BoxFilter {
+ fn eval(&self, _: &Vector2f) -> Float {
+ 1.0
+ }
+
+ fn radius(&self) -> Vector2f {
+ self.radius
+ }
+}
diff --git a/src/camera/mod.rs b/src/camera/mod.rs
new file mode 100644
index 0000000..bba95f7
--- /dev/null
+++ b/src/camera/mod.rs
@@ -0,0 +1,2 @@
+mod film;
+mod filter;