rustray/src/ray.rs

42 lines
1.1 KiB
Rust
Raw Normal View History

2019-03-20 14:56:29 +00:00
use cgmath::{vec2, vec3, InnerSpace, Vector3};
use super::view::View;
pub struct Ray {
pub origin: Vector3<f32>,
pub direction: Vector3<f32>,
pub inv_direction: Vector3<f32>,
pub signs: Vector3<usize>,
}
impl Ray {
pub fn new(origin: Vector3<f32>, direction: Vector3<f32>) -> Ray {
let inv_direction = 1.0 / direction;
let x = (inv_direction.x < 0.0) as usize;
let y = (inv_direction.y < 0.0) as usize;
let z = (inv_direction.z < 0.0) as usize;
Ray {
origin,
direction,
inv_direction,
signs: Vector3::new(x, y, z),
}
}
pub fn primary_ray(x: u32, y: u32, dim_y: u32, dim_x: u32, view: &View) -> Ray {
let aspect_ratio = dim_x as f32 / dim_y as f32;
let uv = vec2(x as f32, y as f32);
let (up, right) = view.axises();
let trans = 2.0 * uv - vec2(1.0, 1.0);
let mut dir = view.look_at + right * trans.x + up * trans.y;
dir = vec3(dir.x * aspect_ratio, dir.y, dir.z * aspect_ratio);
return Self::new(view.position, dir.normalize());
}
}