use super::*;
impl Vector3 {
pub fn new(x: f32, y: f32, z: f32) -> Self {
Self { x, y, z }
}
pub fn zero() -> Self {
Self {
x: 0f32,
y: 0f32,
z: 0f32,
}
}
pub fn one() -> Self {
Self {
x: 1f32,
y: 1f32,
z: 1f32,
}
}
pub fn unit_x() -> Self {
Self {
x: 1.0,
y: 0.0,
z: 0.0,
}
}
pub fn unit_y() -> Self {
Self {
x: 0.0,
y: 1.0,
z: 0.0,
}
}
pub fn unit_z() -> Self {
Self {
x: 0.0,
y: 0.0,
z: 1.0,
}
}
pub fn dot(&self, rhs: &Self) -> f32 {
self.x * rhs.x + self.y * rhs.y + self.z * rhs.z
}
pub fn length_squared(&self) -> f32 {
self.dot(self)
}
#[cfg(feature = "std")]
pub fn length(&self) -> f32 {
self.length_squared().sqrt()
}
#[cfg(feature = "std")]
pub fn distance(&self, value: &Self) -> f32 {
(self - value).length()
}
pub fn distance_squared(&self, value: &Self) -> f32 {
(self - value).length_squared()
}
#[cfg(feature = "std")]
pub fn normalize(&self) -> Self {
self / self.length()
}
pub fn cross(&self, rhs: &Self) -> Self {
Self {
x: self.y * rhs.z - self.z * rhs.y,
y: self.z * rhs.x - self.x * rhs.z,
z: self.x * rhs.y - self.y * rhs.x,
}
}
fn impl_neg(&self) -> Self {
Self {
x: -self.x,
y: -self.y,
z: -self.z,
}
}
fn impl_add(&self, rhs: &Self) -> Self {
Self {
x: self.x + rhs.x,
y: self.y + rhs.y,
z: self.z + rhs.z,
}
}
fn impl_sub(&self, rhs: &Self) -> Self {
Self {
x: self.x - rhs.x,
y: self.y - rhs.y,
z: self.z - rhs.z,
}
}
fn impl_div(&self, rhs: &Self) -> Self {
Self {
x: self.x / rhs.x,
y: self.y / rhs.y,
z: self.z / rhs.z,
}
}
fn impl_div_f32(&self, rhs: f32) -> Self {
Self {
x: self.x / rhs,
y: self.y / rhs,
z: self.z / rhs,
}
}
fn impl_mul(&self, rhs: &Self) -> Self {
Self {
x: self.x * rhs.x,
y: self.y * rhs.y,
z: self.z * rhs.z,
}
}
fn impl_mul_f32(&self, rhs: f32) -> Self {
Self {
x: self.x * rhs,
y: self.y * rhs,
z: self.z * rhs,
}
}
}
impl core::ops::Neg for Vector3 {
type Output = Self;
fn neg(self) -> Self {
self.impl_neg()
}
}
impl core::ops::Neg for &Vector3 {
type Output = Vector3;
fn neg(self) -> Vector3 {
self.impl_neg()
}
}
impl core::ops::Add<Self> for Vector3 {
type Output = Self;
fn add(self, rhs: Self) -> Self {
self.impl_add(&rhs)
}
}
impl core::ops::Add<&Self> for Vector3 {
type Output = Self;
fn add(self, rhs: &Self) -> Self {
self.impl_add(rhs)
}
}
impl core::ops::Add<Vector3> for &Vector3 {
type Output = Vector3;
fn add(self, rhs: Vector3) -> Vector3 {
self.impl_add(&rhs)
}
}
impl core::ops::Add<&Vector3> for &Vector3 {
type Output = Vector3;
fn add(self, rhs: &Vector3) -> Vector3 {
self.impl_add(rhs)
}
}
impl core::ops::Sub<Self> for Vector3 {
type Output = Self;
fn sub(self, rhs: Self) -> Self {
self.impl_sub(&rhs)
}
}
impl core::ops::Sub<&Self> for Vector3 {
type Output = Self;
fn sub(self, rhs: &Self) -> Self {
self.impl_sub(rhs)
}
}
impl core::ops::Sub<Vector3> for &Vector3 {
type Output = Vector3;
fn sub(self, rhs: Vector3) -> Vector3 {
self.impl_sub(&rhs)
}
}
impl core::ops::Sub<&Vector3> for &Vector3 {
type Output = Vector3;
fn sub(self, rhs: &Vector3) -> Vector3 {
self.impl_sub(rhs)
}
}
impl core::ops::Div<Self> for Vector3 {
type Output = Self;
fn div(self, rhs: Self) -> Self {
self.impl_div(&rhs)
}
}
impl core::ops::Div<&Self> for Vector3 {
type Output = Self;
fn div(self, rhs: &Self) -> Self {
self.impl_div(rhs)
}
}
impl core::ops::Div<Vector3> for &Vector3 {
type Output = Vector3;
fn div(self, rhs: Vector3) -> Vector3 {
self.impl_div(&rhs)
}
}
impl core::ops::Div<&Vector3> for &Vector3 {
type Output = Vector3;
fn div(self, rhs: &Vector3) -> Vector3 {
self.impl_div(rhs)
}
}
impl core::ops::Div<f32> for Vector3 {
type Output = Self;
fn div(self, rhs: f32) -> Self {
self.impl_div_f32(rhs)
}
}
impl core::ops::Div<f32> for &Vector3 {
type Output = Vector3;
fn div(self, rhs: f32) -> Vector3 {
self.impl_div_f32(rhs)
}
}
impl core::ops::Mul<Self> for Vector3 {
type Output = Self;
fn mul(self, rhs: Self) -> Self {
self.impl_mul(&rhs)
}
}
impl core::ops::Mul<&Self> for Vector3 {
type Output = Self;
fn mul(self, rhs: &Self) -> Self {
self.impl_mul(rhs)
}
}
impl core::ops::Mul<Vector3> for &Vector3 {
type Output = Vector3;
fn mul(self, rhs: Vector3) -> Vector3 {
self.impl_mul(&rhs)
}
}
impl core::ops::Mul<&Vector3> for &Vector3 {
type Output = Vector3;
fn mul(self, rhs: &Vector3) -> Vector3 {
self.impl_mul(rhs)
}
}
impl core::ops::Mul<f32> for Vector3 {
type Output = Self;
fn mul(self, rhs: f32) -> Self {
self.impl_mul_f32(rhs)
}
}
impl core::ops::Mul<f32> for &Vector3 {
type Output = Vector3;
fn mul(self, rhs: f32) -> Vector3 {
self.impl_mul_f32(rhs)
}
}