return faceforward, reflect and refract functions

This commit is contained in:
BlackMATov
2021-02-24 03:40:22 +07:00
parent e80f49133b
commit e95b9cf898
7 changed files with 67 additions and 1 deletions

View File

@@ -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);
}
}
//

View File

@@ -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);
}
}
//