Compare commits

...

2 Commits

Author SHA1 Message Date
Jon Janzen
8a0f44144d Tuple point and vector take any time 2022-01-01 16:51:36 -07:00
Jon Janzen
71fc73bf1a tuple::new can take any type of number 2022-01-01 16:30:51 -07:00
7 changed files with 120 additions and 14 deletions

45
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,45 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'ray-tracer'",
"cargo": {
"args": [
"build",
"--bin=ray-tracer",
"--package=ray-tracer"
],
"filter": {
"name": "ray-tracer",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'ray-tracer'",
"cargo": {
"args": [
"test",
"--no-run",
"--bin=ray-tracer",
"--package=ray-tracer"
],
"filter": {
"name": "ray-tracer",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

1
Cargo.lock generated
View File

@@ -22,6 +22,7 @@ name = "features"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"approx", "approx",
"num-traits",
] ]
[[package]] [[package]]

1
features/Cargo.lock generated
View File

@@ -22,6 +22,7 @@ name = "features"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"approx", "approx",
"num-traits",
] ]
[[package]] [[package]]

View File

@@ -7,3 +7,4 @@ edition = "2018"
[dependencies] [dependencies]
approx = "0.5" approx = "0.5"
num-traits = "0.2"

View File

@@ -1,5 +1,6 @@
#[macro_use] #[macro_use]
extern crate approx; extern crate approx;
extern crate num_traits;
pub mod structs; pub mod structs;
pub mod color; pub mod color;

View File

@@ -1,6 +1,9 @@
use std::fmt; use std::fmt;
use std::ops; use std::ops;
use num_traits::NumCast;
use num_traits::cast;
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct Tuple { pub struct Tuple {
x: f32, x: f32,
@@ -9,13 +12,24 @@ pub struct Tuple {
w: f32, w: f32,
} }
macro_rules! num_traits_cast {
($tt:ident) => {
cast($tt).unwrap()
};
}
impl Tuple { impl Tuple {
pub fn new(x: f32, y: f32, z: f32, w: f32) -> Tuple { pub fn new<X, Y, Z, W>(x: X, y: Y, z: Z, w: W) -> Tuple
where X: NumCast,
Y: NumCast,
Z: NumCast,
W: NumCast,
{
Tuple { Tuple {
x, x: num_traits_cast!(x),
y, y: num_traits_cast!(y),
z, z: num_traits_cast!(z),
w, w: num_traits_cast!(w),
} }
} }
@@ -28,20 +42,28 @@ impl Tuple {
} }
} }
pub fn point(x: f32, y: f32, z: f32) -> Tuple { pub fn point<T, U, V>(x: T, y: U, z: V) -> Tuple
where T: NumCast,
U: NumCast,
V: NumCast,
{
Tuple { Tuple {
x, x: num_traits_cast!(x),
y, y: num_traits_cast!(y),
z, z: num_traits_cast!(z),
w: 1.0, w: 1.0,
} }
} }
pub fn vector(x: f32, y: f32, z: f32) -> Tuple { pub fn vector<X, Y, Z>(x: X, y: Y, z: Z) -> Tuple
where X: NumCast,
Y: NumCast,
Z: NumCast {
Tuple { Tuple {
x, x: num_traits_cast!(x),
y, y: num_traits_cast!(y),
z, z: num_traits_cast!(z),
w: 0.0, w: 0.0,
} }
} }
@@ -424,4 +446,39 @@ mod tests {
let b_cross_a = Tuple::vector(1.0, -2.0, 1.0); let b_cross_a = Tuple::vector(1.0, -2.0, 1.0);
assert_eq!(b_cross_a, b.cross(&a)); assert_eq!(b_cross_a, b.cross(&a));
} }
#[test]
fn works_with_i32() {
let a = Tuple::new(1, 2, 3, 0);
assert_eq!(1.0, a.x());
assert_eq!(2.0, a.y());
assert_eq!(3.0, a.z());
}
#[test]
fn works_with_mixed_types() {
let a = Tuple::new(1.1, 2.2, 3, 0);
assert_eq!(1.1, a.x());
assert_eq!(2.2, a.y());
assert_eq!(3.0, a.z());
}
#[test]
fn point_with_mixed_types() {
let a = Tuple::point(1.0, 2.2, 3);
assert_eq!(1.0, a.x());
assert_eq!(2.2, a.y());
assert_eq!(3.0, a.z());
assert_eq!(1.0, a.w());
}
#[test]
fn vector_with_mixed_types() {
let a = Tuple::vector(1.0, 2.2, 3);
assert_eq!(1.0, a.x());
assert_eq!(2.2, a.y());
assert_eq!(3.0, a.z());
assert_eq!(0.0, a.w());
}
} }

View File

@@ -175,7 +175,7 @@ fn clock() {
let mut canvas = Canvas::new(1024, 1024); let mut canvas = Canvas::new(1024, 1024);
let color = Color::new(1.0, 0.0, 0.0); let color = Color::new(1.0, 0.0, 0.0);
let middle = 1024.0 / 2.0; let middle = 1024.0 / 2.0;
canvas.write_pixel(middle as usize, middle as usize, Color::new(0.0, 1.0, 0.0));
let middle_point = &Tuple::point_zero() * &Matrix::translation(middle, middle, 0.0); let middle_point = &Tuple::point_zero() * &Matrix::translation(middle, middle, 0.0);
draw_cross(&mut canvas, &middle_point, Color::new(0.0, 1.0, 0.0)); draw_cross(&mut canvas, &middle_point, Color::new(0.0, 1.0, 0.0));