nalgebra_glm/
geometric.rs1use crate::RealNumber;
2
3use crate::aliases::{TVec, TVec3};
4use crate::traits::Number;
5
6pub fn cross<T: Number>(x: &TVec3<T>, y: &TVec3<T>) -> TVec3<T> {
8 x.cross(y)
9}
10
11pub fn distance<T: RealNumber, const D: usize>(p0: &TVec<T, D>, p1: &TVec<T, D>) -> T {
17 (p1 - p0).norm()
18}
19
20pub fn dot<T: Number, const D: usize>(x: &TVec<T, D>, y: &TVec<T, D>) -> T {
22 x.dot(y)
23}
24
25pub fn faceforward<T: Number, const D: usize>(
27 n: &TVec<T, D>,
28 i: &TVec<T, D>,
29 nref: &TVec<T, D>,
30) -> TVec<T, D> {
31 if nref.dot(i) < T::zero() {
32 n.clone()
33 } else {
34 -n.clone()
35 }
36}
37
38pub fn length<T: RealNumber, const D: usize>(x: &TVec<T, D>) -> T {
48 x.norm()
49}
50
51pub fn magnitude<T: RealNumber, const D: usize>(x: &TVec<T, D>) -> T {
61 x.norm()
62}
63
64pub fn normalize<T: RealNumber, const D: usize>(x: &TVec<T, D>) -> TVec<T, D> {
66 x.normalize()
67}
68
69pub fn reflect_vec<T: Number, const D: usize>(i: &TVec<T, D>, n: &TVec<T, D>) -> TVec<T, D> {
71 let _2 = T::one() + T::one();
72 i - n * (n.dot(i) * _2)
73}
74
75pub fn refract_vec<T: RealNumber, const D: usize>(
77 i: &TVec<T, D>,
78 n: &TVec<T, D>,
79 eta: T,
80) -> TVec<T, D> {
81 let ni = n.dot(i);
82 let k = T::one() - eta * eta * (T::one() - ni * ni);
83
84 if k < T::zero() {
85 TVec::<_, D>::zeros()
86 } else {
87 i * eta - n * (eta * dot(n, i) + k.sqrt())
88 }
89}