71 lines
1.3 KiB
Rust
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),
|
|
}
|
|
}
|
|
}
|