ray-tracing2/ray-tracing-core/src/math/pos3.rs
2024-10-03 22:32:37 +02:00

71 lines
1.3 KiB
Rust

use crate::prelude::*;
use core::panic;
use std::ops::{Add, Index, Sub};
#[derive(Debug, Clone, Copy)]
pub struct Pos3 {
pub(crate) x: Float,
pub(crate) y: Float,
pub(crate) z: Float,
}
impl Pos3 {
pub fn new(x: Float, y: Float, z: Float) -> Self {
Self { x, y, z }
}
pub fn x(self) -> Float {
self.x
}
pub fn y(self) -> Float {
self.y
}
pub fn z(self) -> Float {
self.z
}
pub fn zero() -> Self {
Self {
x: 0.0,
y: 0.0,
z: 0.0,
}
}
}
impl Sub for Pos3 {
type Output = Dir3;
fn sub(self, rhs: Self) -> Self::Output {
Dir3 {
x: self.x - rhs.x,
y: self.y - rhs.y,
z: self.z - rhs.z,
}
}
}
impl Add<Dir3> for Pos3 {
type Output = Pos3;
fn add(self, rhs: Dir3) -> Self::Output {
Pos3 {
x: self.x + rhs.x,
y: self.y + rhs.y,
z: self.z + rhs.z,
}
}
}
impl Index<usize> for Pos3 {
type Output = Float;
fn index(&self, index: usize) -> &Self::Output {
match index {
0 => &self.x,
1 => &self.y,
2 => &self.z,
_ => panic!("Index out of bound {}", index),
}
}
}