use crate::{
Vec3
};
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct Ray {
pub origin: Vec3,
pub direction: Vec3
}
impl Ray {
pub fn new(origin: Vec3, direction: Vec3) -> Ray {
Ray {origin, direction}
}
pub fn at(self, t: f32) -> Vec3 {
self.origin + t * self.direction
}
}
#[macro_export]
macro_rules! ray {
($origin:expr, $direction:expr) => { $crate::Ray::new($origin, $direction) };
}
#[cfg(test)]
mod tests {
use crate::vec3;
use super::*;
#[test]
fn macro_ray() {
let ra = ray!(vec3!(0.0), vec3!(1.0));
let rb = Ray::new(vec3!(0.0), vec3!(1.0));
assert_eq!(ra, rb);
}
#[test]
fn ray_new() {
let o = vec3!(1.0, 2.0, 3.0);
let d = vec3!(4.0, 5.0, 6.0);
let r = Ray::new(o, d);
assert_eq!(r.origin.x, 1.0);
assert_eq!(r.origin.y, 2.0);
assert_eq!(r.origin.z, 3.0);
assert_eq!(r.direction.x, 4.0);
assert_eq!(r.direction.y, 5.0);
assert_eq!(r.direction.z, 6.0);
}
#[test]
fn ray_at() {
let r = ray!(vec3!(0.0), vec3!(10.0));
assert_eq!(r.at(0.0), vec3!(0.0));
assert_eq!(r.at(0.25), vec3!(2.5));
assert_eq!(r.at(0.5), vec3!(5.0));
assert_eq!(r.at(0.75), vec3!(7.5));
}
}