Add operators

This commit is contained in:
Georg Hagen
2025-05-13 17:36:54 +02:00
parent 6409884713
commit 9215a0a305

View File

@@ -61,25 +61,25 @@ namespace OpenVulkano::Math
} }
template<typename T, qualifier Q> template<typename T, qualifier Q>
T maxVal(const glm::tvec3<T, Q>& vec) T maxVal(const tvec3<T, Q>& vec)
{ {
return std::max(vec.x, std::max(vec.y, vec.z)); return std::max(vec.x, std::max(vec.y, vec.z));
} }
template<typename T, qualifier Q> template<typename T, qualifier Q>
T maxVal(const glm::tvec4<T, Q>& vec) T maxVal(const tvec4<T, Q>& vec)
{ {
return std::max(std::max(vec.x, vec.y), std::max(vec.z, vec.w)); return std::max(std::max(vec.x, vec.y), std::max(vec.z, vec.w));
} }
template<typename T, qualifier Q> template<typename T, qualifier Q>
T minVal(const glm::tvec3<T, Q>& vec) T minVal(const tvec3<T, Q>& vec)
{ {
return std::min(vec.x, std::min(vec.y, vec.z)); return std::min(vec.x, std::min(vec.y, vec.z));
} }
template<typename T, qualifier Q> template<typename T, qualifier Q>
T minVal(const glm::tvec4<T, Q>& vec) T minVal(const tvec4<T, Q>& vec)
{ {
return std::min(std::min(vec.x, vec.y), std::min(vec.z, vec.w)); return std::min(std::min(vec.x, vec.y), std::min(vec.z, vec.w));
} }
@@ -203,20 +203,33 @@ namespace OpenVulkano::Math
typedef Quaternion<int> QuaternionI; typedef Quaternion<int> QuaternionI;
} }
template<glm::length_t L, typename T, glm::qualifier Q, typename = std::enable_if_t<std::is_integral_v<T>>> namespace glm
glm::vec<L, float, Q> operator / (const float lhs, const glm::vec<L, T, Q>& rhs)
{ {
return lhs / glm::vec<L, float, Q>(rhs); template<length_t L, typename T, typename F, qualifier Q>
} requires (std::is_integral_v<T> && std::is_floating_point_v<F>)
vec<L, F, Q> operator / (const F lhs, const vec<L, T, Q>& rhs)
{
return lhs / glm::vec<L, F, Q>(rhs);
}
template<glm::length_t L, typename T, glm::qualifier Q, typename = std::enable_if_t<std::is_integral_v<T>>> template<length_t L, typename T, typename F, qualifier Q>
glm::vec<L, float, Q> operator * (const float lhs, const glm::vec<L, T, Q>& rhs) requires (std::is_integral_v<T> && std::is_floating_point_v<F>)
{ vec<L, F, Q> operator / (const vec<L, F, Q>& lhs, const T rhs)
return lhs * glm::vec<L, float, Q>(rhs); {
} return lhs / static_cast<F>(rhs);
}
template<glm::length_t L, typename T, glm::qualifier Q, typename = std::enable_if_t<std::is_integral_v<T>>> template<length_t L, typename T, typename F, qualifier Q>
glm::vec<L, float, Q> operator * (const glm::vec<L, float, Q>& lhs, const T rhs) requires (std::is_integral_v<T> && std::is_floating_point_v<F>)
{ vec<L, F, Q> operator * (const F lhs, const vec<L, T, Q>& rhs)
return lhs * static_cast<float>(rhs); {
} return lhs * glm::vec<L, F, Q>(rhs);
}
template<length_t L, typename F, typename T, qualifier Q>
requires (std::is_integral_v<T> && std::is_floating_point_v<F>)
vec<L, F, Q> operator * (const vec<L, F, Q>& lhs, const T rhs)
{
return lhs * static_cast<F>(rhs);
}
}