Renderer/src/vec3.rs

113 lines
2.3 KiB
Rust
Raw Normal View History

2022-04-12 19:14:11 +02:00
use std::ops::*;
use std::io::Write;
#[derive(Clone, Copy, Debug)]
pub struct Vec3 {
pub e: [f64; 3],
2022-04-07 23:04:50 +02:00
}
type Color = Vec3;
type Point3 = Vec3;
impl Vec3 {
pub fn new(x: f64, y: f64, z: f64) -> Self {
Vec3 { e: [x, y, z] }
}
2022-04-12 19:14:11 +02:00
pub fn length(&self) -> f64 {
2022-04-07 23:04:50 +02:00
self.length_squared().sqrt()
}
pub fn length_squared(&self) -> f64 {
self.e[0]*self.e[0]
+ self.e[1]*self.e[1]
+ self.e[2]*self.e[2]
}
2022-04-12 19:14:11 +02:00
pub fn cross(a: Vec3, b: Vec3) -> Vec3 {
Vec3::new(a.y()*b.z() - a.z()*b.y(),
a.z()*b.x() - a.x()*b.z(),
a.x()*b.y() - a.y()*b.x())
}
pub fn dot(a: Vec3, b: Vec3) -> f64 {
a.x()*b.x() + a.y()*b.y() + a.z()*b.z()
}
pub fn unit_vector(a: Vec3) -> Vec3 {
a / a.length()
}
2022-04-07 23:04:50 +02:00
pub fn x(&self) -> f64 { self.e[0] }
pub fn y(&self) -> f64 { self.e[1] }
pub fn z(&self) -> f64 { self.e[2] }
}
impl Add for Vec3 {
type Output = Vec3;
fn add(self, rhs: Self) -> Vec3 {
2022-04-12 19:14:11 +02:00
Vec3::new(self.x()+rhs.x(), self.y()+rhs.y(), self.z()+rhs.z())
2022-04-07 23:04:50 +02:00
}
}
impl AddAssign for Vec3 {
fn add_assign(&mut self, rhs: Self) {
self.e[0] += rhs.x();
self.e[1] += rhs.y();
self.e[2] += rhs.z();
}
}
impl Sub for Vec3 {
type Output = Vec3;
fn sub(self, rhs: Self) -> Vec3 {
Vec3::new(self.x()-rhs.x(), self.y()-rhs.y(), self.z()-rhs.z())
}
}
2022-04-12 19:14:11 +02:00
impl SubAssign for Vec3 {
fn sub_assign(&mut self, rhs: Self) {
self.e[0] -= rhs.x();
self.e[1] -= rhs.y();
self.e[2] -= rhs.z();
}
}
2022-04-07 23:04:50 +02:00
impl Mul<Vec3> for f64 {
type Output = Vec3;
fn mul(self, rhs: Vec3) -> Vec3 {
2022-04-12 19:14:11 +02:00
Vec3::new(self*rhs.x(), self*rhs.y(), self*rhs.z())
2022-04-07 23:04:50 +02:00
}
}
impl MulAssign<f64> for Vec3 {
fn mul_assign(&mut self, rhs: f64) {
self.e[0] *= rhs;
self.e[1] *= rhs;
self.e[2] *= rhs;
}
}
impl DivAssign<f64> for Vec3 {
2022-04-12 19:14:11 +02:00
fn div_assign(&mut self, rhs: f64) {
2022-04-07 23:04:50 +02:00
self.e[0] /= rhs;
self.e[1] /= rhs;
self.e[2] /= rhs;
}
}
2022-04-12 19:14:11 +02:00
impl Div<f64> for Vec3 {
type Output = Vec3;
fn div(self, rhs: f64) -> Vec3 {
Vec3::new(self.x()/rhs, self.y()/rhs, self.z()/rhs)
}
}
fn write_color(out: &mut impl Write, pixel_color: Color) {
write!(out, "{} {} {}\n", 255.999*pixel_color.x(), 255.999*pixel_color.y(), 255.999*pixel_color.z());
}