nalgebra_glm/
geometric.rs

1use crate::RealNumber;
2
3use crate::aliases::{TVec, TVec3};
4use crate::traits::Number;
5
6/// The cross product of two vectors.
7pub fn cross<T: Number>(x: &TVec3<T>, y: &TVec3<T>) -> TVec3<T> {
8    x.cross(y)
9}
10
11/// The distance between two points.
12///
13/// # See also:
14///
15/// * [`distance2()`](crate::distance2)
16pub fn distance<T: RealNumber, const D: usize>(p0: &TVec<T, D>, p1: &TVec<T, D>) -> T {
17    (p1 - p0).norm()
18}
19
20/// The dot product of two vectors.
21pub fn dot<T: Number, const D: usize>(x: &TVec<T, D>, y: &TVec<T, D>) -> T {
22    x.dot(y)
23}
24
25/// If `dot(nref, i) < 0.0`, return `n`, otherwise, return `-n`.
26pub 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
38/// The magnitude of a vector.
39///
40/// A synonym for [`magnitude()`].
41///
42/// # See also:
43///
44/// * [`length2()`](crate::length2)
45/// * [`magnitude()`]
46/// * [`magnitude2()`](crate::magnitude2)
47pub fn length<T: RealNumber, const D: usize>(x: &TVec<T, D>) -> T {
48    x.norm()
49}
50
51/// The magnitude of a vector.
52///
53/// A wrapper around [`nalgebra::norm`](../nalgebra/fn.norm.html).
54///
55/// # See also:
56///
57/// * [`length()`]
58/// * [`magnitude2()`](crate::magnitude2)
59/// * [`nalgebra::norm`](../nalgebra/fn.norm.html)
60pub fn magnitude<T: RealNumber, const D: usize>(x: &TVec<T, D>) -> T {
61    x.norm()
62}
63
64/// Normalizes a vector.
65pub fn normalize<T: RealNumber, const D: usize>(x: &TVec<T, D>) -> TVec<T, D> {
66    x.normalize()
67}
68
69/// For the incident vector `i` and surface orientation `n`, returns the reflection direction : `result = i - 2.0 * dot(n, i) * n`.
70pub 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
75/// For the incident vector `i` and surface normal `n`, and the ratio of indices of refraction `eta`, return the refraction vector.
76pub 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}