use crate::IsFloat;
use crate::geo::Vec3h;
pub trait Vec3hUtilities<T: IsFloat> {
fn dot(a_vec: &Vec3h<T>, b_vec: &Vec3h<T>) -> T;
fn cross(left: &Vec3h<T>, right: &Vec3h<T>) -> Vec3h<T>;
}
impl Vec3hUtilities<f32> for Vec3h<f32> {
fn dot(a_vec: &Vec3h<f32>, b_vec: &Vec3h<f32>) -> f32 {
let dot_prod: f32 = a_vec.x * b_vec.x + a_vec.y * b_vec.y + a_vec.z * b_vec.z;
return dot_prod
}
fn cross(left: &Vec3h<f32>, right: &Vec3h<f32>) -> Vec3h<f32> {
let cross_x: f32 = left.y * right.z - left.z * right.y;
let cross_y: f32 = left.z * right.x - left.x * right.z;
let cross_z: f32 = left.x * right.y - left.y * right.x;
return Vec3h { x: cross_x, y: cross_y, z: cross_z, w: 1.0 }
}
}
impl Vec3hUtilities<f64> for Vec3h<f64> {
fn dot(a_vec: &Vec3h<f64>, b_vec: &Vec3h<f64>) -> f64 {
let dot_prod: f64 = a_vec.x * b_vec.x + a_vec.y * b_vec.y + a_vec.z * b_vec.z;
return dot_prod
}
fn cross(left: &Vec3h<f64>, right: &Vec3h<f64>) -> Vec3h<f64> {
let cross_x: f64 = left.y * right.z - left.z * right.y;
let cross_y: f64 = left.z * right.x - left.x * right.z;
let cross_z: f64 = left.x * right.y - left.y * right.x;
return Vec3h { x: cross_x, y: cross_y, z: cross_z, w: 1.0 }
}
}