mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-16 14:11:28 +07:00
return faceforward, reflect and refract functions
This commit is contained in:
@@ -358,6 +358,26 @@ namespace vmath_hpp
|
||||
normalize(T x) noexcept {
|
||||
return x * rlength(x);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] std::enable_if_t<std::is_floating_point_v<T>, T>
|
||||
constexpr faceforward(T n, T i, T nref) noexcept {
|
||||
return dot(nref, i) < T{0} ? n : -n;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] std::enable_if_t<std::is_floating_point_v<T>, T>
|
||||
constexpr reflect(T i, T n) noexcept {
|
||||
return i - T{2} * dot(n, i) * n;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
[[nodiscard]] std::enable_if_t<std::is_floating_point_v<T>, T>
|
||||
refract(T i, T n, T eta) noexcept {
|
||||
const T d = dot(n, i);
|
||||
const T k = T{1} - sqr(eta) * (T{1} - sqr(d));
|
||||
return k < T{0} ? T{0} : (eta * i - (eta * d + sqrt(k)) * n);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -834,6 +834,23 @@ namespace vmath_hpp
|
||||
[[nodiscard]] vec<T, Size> normalize(const vec<T, Size>& xs) {
|
||||
return xs * rlength(xs);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
[[nodiscard]] constexpr vec<T, Size> faceforward(const vec<T, Size>& n, const vec<T, Size>& i, const vec<T, Size>& nref) {
|
||||
return dot(nref, i) < T{0} ? n : -n;
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
[[nodiscard]] constexpr vec<T, Size> reflect(const vec<T, Size>& i, const vec<T, Size>& n) {
|
||||
return i - T{2} * dot(n, i) * n;
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
[[nodiscard]] vec<T, Size> refract(const vec<T, Size>& i, const vec<T, Size>& n, T eta) {
|
||||
const T d = dot(n, i);
|
||||
const T k = T{1} - sqr(eta) * (T{1} - sqr(d));
|
||||
return k < T{0} ? vec<T, Size>{T{0}} : (eta * i - (eta * d + sqrt(k)) * n);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user