diff --git a/README.md b/README.md index e4c5385..bb08b23 100644 --- a/README.md +++ b/README.md @@ -1556,6 +1556,8 @@ template < typename T > inline constexpr mat unit4x4; template < typename T > inline constexpr mat identity2x2; template < typename T > inline constexpr mat identity3x3; template < typename T > inline constexpr mat identity4x4; + +template < typename T > inline constexpr qua qidentity; ``` ### Cast diff --git a/headers/vmath.hpp/vmath_ext.hpp b/headers/vmath.hpp/vmath_ext.hpp index a80cfe4..c462e90 100644 --- a/headers/vmath.hpp/vmath_ext.hpp +++ b/headers/vmath.hpp/vmath_ext.hpp @@ -19,37 +19,72 @@ namespace vmath_hpp { - template < typename T > inline constexpr vec zero2{0, 0}; - template < typename T > inline constexpr vec zero3{0, 0, 0}; - template < typename T > inline constexpr vec zero4{0, 0, 0, 0}; + template < typename T > inline constexpr vec zero2{T{0}, T{0}}; + template < typename T > inline constexpr vec zero3{T{0}, T{0}, T{0}}; + template < typename T > inline constexpr vec zero4{T{0}, T{0}, T{0}, T{0}}; - template < typename T > inline constexpr vec unit2{1, 1}; - template < typename T > inline constexpr vec unit3{1, 1, 1}; - template < typename T > inline constexpr vec unit4{1, 1, 1, 1}; + template < typename T > inline constexpr vec unit2{T{1}, T{1}}; + template < typename T > inline constexpr vec unit3{T{1}, T{1}, T{1}}; + template < typename T > inline constexpr vec unit4{T{1}, T{1}, T{1}, T{1}}; - template < typename T > inline constexpr vec unit2_x{1, 0}; - template < typename T > inline constexpr vec unit2_y{0, 1}; + template < typename T > inline constexpr vec unit2_x{T{1}, T{0}}; + template < typename T > inline constexpr vec unit2_y{T{0}, T{1}}; - template < typename T > inline constexpr vec unit3_x{1, 0, 0}; - template < typename T > inline constexpr vec unit3_y{0, 1, 0}; - template < typename T > inline constexpr vec unit3_z{0, 0, 1}; + template < typename T > inline constexpr vec unit3_x{T{1}, T{0}, T{0}}; + template < typename T > inline constexpr vec unit3_y{T{0}, T{1}, T{0}}; + template < typename T > inline constexpr vec unit3_z{T{0}, T{0}, T{1}}; - template < typename T > inline constexpr vec unit4_x{1, 0, 0, 0}; - template < typename T > inline constexpr vec unit4_y{0, 1, 0, 0}; - template < typename T > inline constexpr vec unit4_z{0, 0, 1, 0}; - template < typename T > inline constexpr vec unit4_w{0, 0, 0, 1}; + template < typename T > inline constexpr vec unit4_x{T{1}, T{0}, T{0}, T{0}}; + template < typename T > inline constexpr vec unit4_y{T{0}, T{1}, T{0}, T{0}}; + template < typename T > inline constexpr vec unit4_z{T{0}, T{0}, T{1}, T{0}}; + template < typename T > inline constexpr vec unit4_w{T{0}, T{0}, T{0}, T{1}}; - template < typename T > inline constexpr mat zero2x2{0, 0, 0, 0}; - template < typename T > inline constexpr mat zero3x3{0, 0, 0, 0, 0, 0, 0, 0, 0}; - template < typename T > inline constexpr mat zero4x4{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + template < typename T > inline constexpr mat zero2x2{ + T{0}, T{0}, + T{0}, T{0}}; - template < typename T > inline constexpr mat unit2x2{1, 1, 1, 1}; - template < typename T > inline constexpr mat unit3x3{1, 1, 1, 1, 1, 1, 1, 1, 1}; - template < typename T > inline constexpr mat unit4x4{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + template < typename T > inline constexpr mat zero3x3{ + T{0}, T{0}, T{0}, + T{0}, T{0}, T{0}, + T{0}, T{0}, T{0}}; - template < typename T > inline constexpr mat identity2x2{1, 0, 0, 1}; - template < typename T > inline constexpr mat identity3x3{1, 0, 0, 0, 1, 0, 0, 0, 1}; - template < typename T > inline constexpr mat identity4x4{1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; + template < typename T > inline constexpr mat zero4x4{ + T{0}, T{0}, T{0}, T{0}, + T{0}, T{0}, T{0}, T{0}, + T{0}, T{0}, T{0}, T{0}, + T{0}, T{0}, T{0}, T{0}}; + + template < typename T > inline constexpr mat unit2x2{ + T{1}, T{1}, + T{1}, T{1}}; + + template < typename T > inline constexpr mat unit3x3{ + T{1}, T{1}, T{1}, + T{1}, T{1}, T{1}, + T{1}, T{1}, T{1}}; + + template < typename T > inline constexpr mat unit4x4{ + T{1}, T{1}, T{1}, T{1}, + T{1}, T{1}, T{1}, T{1}, + T{1}, T{1}, T{1}, T{1}, + T{1}, T{1}, T{1}, T{1}}; + + template < typename T > inline constexpr mat identity2x2{ + T{1}, T{0}, + T{0}, T{1}}; + + template < typename T > inline constexpr mat identity3x3{ + T{1}, T{0}, T{0}, + T{0}, T{1}, T{0}, + T{0}, T{0}, T{1}}; + + template < typename T > inline constexpr mat identity4x4{ + T{1}, T{0}, T{0}, T{0}, + T{0}, T{1}, T{0}, T{0}, + T{0}, T{0}, T{1}, T{0}, + T{0}, T{0}, T{0}, T{1}}; + + template < typename T > inline constexpr qua qidentity{T{0}, T{0}, T{0}, T{1}}; } // @@ -235,10 +270,10 @@ namespace vmath_hpp /// https://en.wikipedia.org/wiki/Translation_(geometry) return { - {1, 0, 0, 0}, - {0, 1, 0, 0}, - {0, 0, 1, 0}, - {x, y, z, 1}}; + {T{1}, T{0}, T{0}, T{0}}, + {T{0}, T{1}, T{0}, T{0}}, + {T{0}, T{0}, T{1}, T{0}}, + { x, y, z, T{1}}}; } template < typename T > @@ -265,9 +300,9 @@ namespace vmath_hpp const auto [qv, qs] = normalize(q); - const T x2 = qv.x * T(2); - const T y2 = qv.y * T(2); - const T z2 = qv.z * T(2); + const T x2 = qv.x * T{2}; + const T y2 = qv.y * T{2}; + const T z2 = qv.z * T{2}; const T sx2 = qs * x2; const T sy2 = qs * y2; @@ -282,10 +317,10 @@ namespace vmath_hpp const T zz2 = qv.z * z2; return { - T(1) - (yy2 + zz2), (xy2 + sz2), (xz2 - sy2), 0, - (xy2 - sz2), T(1) - (xx2 + zz2), (yz2 + sx2), 0, - (xz2 + sy2), (yz2 - sx2), T(1) - (xx2 + yy2), 0, - 0, 0, 0, 1}; + T{1} - (yy2 + zz2), (xy2 + sz2), (xz2 - sy2), T{0}, + (xy2 - sz2), T{1} - (xx2 + zz2), (yz2 + sx2), T{0}, + (xz2 + sy2), (yz2 - sx2), T{1} - (xx2 + yy2), T{0}, + T{0}, T{0}, T{0}, T{1}}; } template < typename T > @@ -309,7 +344,7 @@ namespace vmath_hpp const T ys = y * s; const T zs = z * s; - const T ic = T(1) - c; + const T ic = T{1} - c; const T xxm = xx * ic; const T yym = yy * ic; @@ -320,10 +355,10 @@ namespace vmath_hpp const T yzm = y * z * ic; return { - xxm + c, xym + zs, xzm - ys, 0, - xym - zs, yym + c, yzm + xs, 0, - xzm + ys, yzm - xs, zzm + c, 0, - 0, 0, 0, 1}; + xxm + c, xym + zs, xzm - ys, T{0}, + xym - zs, yym + c, yzm + xs, T{0}, + xzm + ys, yzm - xs, zzm + c, T{0}, + T{0}, T{0}, T{0}, T{1}}; } template < typename T > @@ -339,10 +374,10 @@ namespace vmath_hpp const auto [s, c] = sincos(angle); return { - 1, 0, 0, 0, - 0, c, s, 0, - 0, -s, c, 0, - 0, 0, 0, 1}; + T{1}, T{0}, T{0}, T{0}, + T{0}, c, s, T{0}, + T{0}, -s, c, T{0}, + T{0}, T{0}, T{0}, T{1}}; } template < typename T > @@ -358,10 +393,10 @@ namespace vmath_hpp const auto [s, c] = sincos(angle); return { - c, 0, -s, 0, - 0, 1, 0, 0, - s, 0, c, 0, - 0, 0, 0, 1}; + c, T{0}, -s, T{0}, + T{0}, T{1}, T{0}, T{0}, + s, T{0}, c, T{0}, + T{0}, T{0}, T{0}, T{1}}; } template < typename T > @@ -377,10 +412,10 @@ namespace vmath_hpp const auto [s, c] = sincos(angle); return { - c, s, 0, 0, - -s, c, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1}; + c, s, T{0}, T{0}, + -s, c, T{0}, T{0}, + T{0}, T{0}, T{1}, T{0}, + T{0}, T{0}, T{0}, T{1}}; } template < typename T > @@ -396,10 +431,10 @@ namespace vmath_hpp /// https://en.wikipedia.org/wiki/Scaling_(geometry) return { - {x, 0, 0, 0}, - {0, y, 0, 0}, - {0, 0, z, 0}, - {0, 0, 0, 1}}; + { x, T{0}, T{0}, T{0}}, + {T{0}, y, T{0}, T{0}}, + {T{0}, T{0}, z, T{0}}, + {T{0}, T{0}, T{0}, T{1}}}; } template < typename T > @@ -433,10 +468,10 @@ namespace vmath_hpp const T dz = dot(az, eye); return { - ax.x, ay.x, az.x, 0, - ax.y, ay.y, az.y, 0, - ax.z, ay.z, az.z, 0, - -dx, -dy, -dz, 1}; + ax.x, ay.x, az.x, T{0}, + ax.y, ay.y, az.y, T{0}, + ax.z, ay.z, az.z, T{0}, + -dx, -dy, -dz, T{1}}; } template < typename T > @@ -453,10 +488,10 @@ namespace vmath_hpp const T dz = dot(az, eye); return { - ax.x, ay.x, az.x, 0, - ax.y, ay.y, az.y, 0, - ax.z, ay.z, az.z, 0, - -dx, -dy, -dz, 1}; + ax.x, ay.x, az.x, T{0}, + ax.y, ay.y, az.y, T{0}, + ax.z, ay.z, az.z, T{0}, + -dx, -dy, -dz, T{1}}; } } @@ -474,9 +509,9 @@ namespace vmath_hpp /// https://en.wikipedia.org/wiki/Translation_(geometry) return { - {1, 0, 0}, - {0, 1, 0}, - {x, y, 1}}; + {T{1}, T{0}, T{0}}, + {T{0}, T{1}, T{0}}, + { x, y, T{1}}}; } template < typename T > @@ -504,9 +539,9 @@ namespace vmath_hpp const auto [s, c] = sincos(angle); return { - c, s, 0, - -s, c, 0, - 0, 0, 1}; + c, s, T{0}, + -s, c, T{0}, + T{0}, T{0}, T{1}}; } template < typename T > @@ -522,9 +557,9 @@ namespace vmath_hpp /// https://en.wikipedia.org/wiki/Scaling_(geometry) return { - {x, 0, 0}, - {0, y, 0}, - {0, 0, 1}}; + { x, T{0}, T{0}}, + {T{0}, y, T{0}}, + {T{0}, T{0}, T{1}}}; } template < typename T > @@ -550,9 +585,9 @@ namespace vmath_hpp /// https://en.wikipedia.org/wiki/Shear_matrix return { - {1, y, 0}, - {x, 1, 0}, - {0, 0, 1}}; + {T{1}, y, T{0}}, + { x, T{1}, T{0}}, + {T{0}, T{0}, T{1}}}; } template < typename T > @@ -576,9 +611,9 @@ namespace vmath_hpp /// https://en.wikipedia.org/wiki/Shear_matrix return { - {1, 0, 0}, - {x, 1, 0}, - {0, 0, 1}}; + {T{1}, T{0}, T{0}}, + { x, T{1}, T{0}}, + {T{0}, T{0}, T{1}}}; } template < typename T > @@ -592,9 +627,9 @@ namespace vmath_hpp /// https://en.wikipedia.org/wiki/Shear_matrix return { - {1, y, 0}, - {0, 1, 0}, - {0, 0, 1}}; + {T{1}, y, T{0}}, + {T{0}, T{1}, T{0}}, + {T{0}, T{0}, T{1}}}; } template < typename T > @@ -620,16 +655,16 @@ namespace vmath_hpp const T rheight = rcp(height); const T frange = rcp(zfar - znear); - const T sx = T(2) * rwidth; - const T sy = T(2) * rheight; + const T sx = T{2} * rwidth; + const T sy = T{2} * rheight; const T sz = frange; const T tz = -frange * znear; return { - sx, 0, 0, 0, - 0, sy, 0, 0, - 0, 0, sz, 0, - 0, 0, tz, 1}; + sx, T{0}, T{0}, T{0}, + T{0}, sy, T{0}, T{0}, + T{0}, T{0}, sz, T{0}, + T{0}, T{0}, tz, T{1}}; } template < typename T > @@ -641,16 +676,16 @@ namespace vmath_hpp const T rheight = rcp(height); const T frange = rcp(znear - zfar); - const T sx = T(2) * rwidth; - const T sy = T(2) * rheight; + const T sx = T{2} * rwidth; + const T sy = T{2} * rheight; const T sz = frange; const T tz = frange * znear; return { - sx, 0, 0, 0, - 0, sy, 0, 0, - 0, 0, sz, 0, - 0, 0, tz, 1}; + sx, T{0}, T{0}, T{0}, + T{0}, sy, T{0}, T{0}, + T{0}, T{0}, sz, T{0}, + T{0}, T{0}, tz, T{1}}; } template < typename T > @@ -663,10 +698,10 @@ namespace vmath_hpp const T frange = rcp(zfar - znear); return { - T(2) * rwidth, 0, 0, 0, - 0, T(2) * rheight, 0, 0, - 0, 0, frange, 0, - -(left + right) * rwidth, -(top + bottom) * rheight, -frange * znear, 1}; + T{2} * rwidth, T{0}, T{0}, T{0}, + T{0}, T{2} * rheight, T{0}, T{0}, + T{0}, T{0}, frange, T{0}, + -(left + right) * rwidth, -(top + bottom) * rheight, -frange * znear, T{1}}; } template < typename T > @@ -679,10 +714,10 @@ namespace vmath_hpp const T frange = rcp(znear - zfar); return { - T(2) * rwidth, 0, 0, 0, - 0, T(2) * rheight, 0, 0, - 0, 0, frange, 0, - -(left + right) * rwidth, -(top + bottom) * rheight, frange * znear, 1}; + T{2} * rwidth, T{0}, T{0}, T{0}, + T{0}, T{2} * rheight, T{0}, T{0}, + T{0}, T{0}, frange, T{0}, + -(left + right) * rwidth, -(top + bottom) * rheight, frange * znear, T{1}}; } // perspective @@ -692,16 +727,16 @@ namespace vmath_hpp /// REFERENCE: /// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxmatrixperspectivelh - const T sx = T(2) * znear * rcp(width); - const T sy = T(2) * znear * rcp(height); + const T sx = T{2} * znear * rcp(width); + const T sy = T{2} * znear * rcp(height); const T sz = zfar * rcp(zfar - znear); const T tz = (znear * zfar) * rcp(znear - zfar); return { - sx, 0, 0, 0, - 0, sy, 0, 0, - 0, 0, sz, 1, - 0, 0, tz, 0}; + T{sx}, T{0}, T{0}, T{0}, + T{0}, T{sy}, T{0}, T{0}, + T{0}, T{0}, T{sz}, T{1}, + T{0}, T{0}, T{tz}, T{0}}; } template < typename T > @@ -709,16 +744,16 @@ namespace vmath_hpp /// REFERENCE: /// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxmatrixperspectiverh - const T sx = T(2) * znear * rcp(width); - const T sy = T(2) * znear * rcp(height); + const T sx = T{2} * znear * rcp(width); + const T sy = T{2} * znear * rcp(height); const T sz = zfar * rcp(znear - zfar); const T tz = (znear * zfar) * rcp(znear - zfar); return { - sx, 0, 0, 0, - 0, sy, 0, 0, - 0, 0, sz, -1, - 0, 0, tz, 0}; + sx, T{0}, T{0}, T{0}, + T{0}, sy, T{0}, T{0}, + T{0}, T{0}, sz, -T{1}, + T{0}, T{0}, tz, T{0}}; } template < typename T > @@ -726,16 +761,16 @@ namespace vmath_hpp /// REFERENCE: /// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxmatrixperspectiveoffcenterlh - const T znear2 = T(2) * znear; + const T znear2 = T{2} * znear; const T rwidth = rcp(right - left); const T rheight = rcp(top - bottom); const T frange = zfar * rcp(zfar - znear); return { - znear2 * rwidth, 0, 0, 0, - 0, znear2 * rheight, 0, 0, - -(left + right) * rwidth, -(top + bottom) * rheight, frange, 1, - 0, 0, -frange * znear, 0}; + znear2 * rwidth, T{0}, T{0}, T{0}, + T{0}, znear2 * rheight, T{0}, T{0}, + -(left + right) * rwidth, -(top + bottom) * rheight, frange, T{1}, + T{0}, T{0}, -frange * znear, T{0}}; } template < typename T > @@ -743,16 +778,16 @@ namespace vmath_hpp /// REFERENCE: /// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxmatrixperspectiveoffcenterrh - const T znear2 = T(2) * znear; + const T znear2 = T{2} * znear; const T rwidth = rcp(right - left); const T rheight = rcp(top - bottom); const T frange = zfar * rcp(znear - zfar); return { - znear2 * rwidth, 0, 0, 0, - 0, znear2 * rheight, 0, 0, - (left + right) * rwidth, (top + bottom) * rheight, frange, -1, - 0, 0, frange * znear, 0}; + znear2 * rwidth, T{0}, T{0}, T{0}, + T{0}, znear2 * rheight, T{0}, T{0}, + (left + right) * rwidth, (top + bottom) * rheight, frange, -T{1}, + T{0}, T{0}, frange * znear, T{0}}; } template < typename T > @@ -760,16 +795,16 @@ namespace vmath_hpp /// REFERENCE: /// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxmatrixperspectivefovlh - const T sy = rcp(tan(fovy * T(0.5))); + const T sy = rcp(tan(fovy * T{0.5})); const T sx = sy * rcp(aspect); const T sz = zfar * rcp(zfar - znear); const T tz = (znear * zfar) * rcp(znear - zfar); return { - sx, 0, 0, 0, - 0, sy, 0, 0, - 0, 0, sz, 1, - 0, 0, tz, 0}; + sx, T{0}, T{0}, T{0}, + T{0}, sy, T{0}, T{0}, + T{0}, T{0}, sz, T{1}, + T{0}, T{0}, tz, T{0}}; } template < typename T > @@ -777,15 +812,15 @@ namespace vmath_hpp /// REFERENCE: /// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxmatrixperspectivefovrh - const T sy = rcp(tan(fovy * T(0.5))); + const T sy = rcp(tan(fovy * T{0.5})); const T sx = sy * rcp(aspect); const T sz = zfar * rcp(znear - zfar); const T tz = (znear * zfar) * rcp(znear - zfar); return { - sx, 0, 0, 0, - 0, sy, 0, 0, - 0, 0, sz, -1, - 0, 0, tz, 0}; + sx, T{0}, T{0}, T{0}, + T{0}, sy, T{0}, T{0}, + T{0}, T{0}, sz, -T{1}, + T{0}, T{0}, tz, T{0}}; } } @@ -800,7 +835,7 @@ namespace vmath_hpp template < typename T, std::size_t Size > [[nodiscard]] T angle(const vec& x, const vec& y) { const T rs = rsqrt(length2(x) * length2(y)); - return acos(clamp(dot(x, y) * rs, T(-1), T(1))); + return acos(clamp(dot(x, y) * rs, -T{1}, T{1})); } // rotate @@ -866,17 +901,17 @@ namespace vmath_hpp /// REFERENCE: /// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/ - auto xyzw = T(0.5) * sqrt(max(T(0), vec{ - T(1) + m[0][0] - m[1][1] - m[2][2], - T(1) - m[0][0] + m[1][1] - m[2][2], - T(1) - m[0][0] - m[1][1] + m[2][2], - T(1) + m[0][0] + m[1][1] + m[2][2]})); + auto xyzw = T{0.5} * sqrt(max(T{0}, vec{ + T{1} + m[0][0] - m[1][1] - m[2][2], + T{1} - m[0][0] + m[1][1] - m[2][2], + T{1} - m[0][0] - m[1][1] + m[2][2], + T{1} + m[0][0] + m[1][1] + m[2][2]})); return qua(copysign(xyzw, { m[1][2] - m[2][1], m[2][0] - m[0][2], m[0][1] - m[1][0], - T(1)})); + T{1}})); } template < typename T > @@ -892,10 +927,10 @@ namespace vmath_hpp const T n = sqrt(length2(from) * length2(to)); const T s = dot(from, to) + n; - if ( s < T(0.000001) * n ) { - return abs(from.x) > abs(from.z) - ? normalize(qua{vec{-from.y, from.x, T(0)}, T(0)}) - : normalize(qua{vec{T(0), -from.z, from.y}, T(0)}); + if ( s < T{0.000001} * n ) { + return abs(from.z) < abs(from.x) + ? normalize(qua{vec{-from.y, from.x, T{0}}, T{0}}) + : normalize(qua{vec{T{0}, -from.z, from.y}, T{0}}); } return normalize(qua{cross(from, to), s}); @@ -911,10 +946,10 @@ namespace vmath_hpp /// REFERENCE: /// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/ - const auto [s, c] = sincos(angle * T(0.5)); + const auto [s, c] = sincos(angle * T{0.5}); const auto [x, y, z] = normalize(axis); - return {vec{x,y,z} * s, c}; + return {vec{x, y, z} * s, c}; } template < typename T > @@ -927,9 +962,9 @@ namespace vmath_hpp /// REFERENCE: /// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/ - const auto [s, c] = sincos(angle * T(0.5)); + const auto [s, c] = sincos(angle * T{0.5}); - return {s, T(0), T(0), c}; + return {vec{s, T{0}, T{0}}, c}; } template < typename T > @@ -942,9 +977,9 @@ namespace vmath_hpp /// REFERENCE: /// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/ - const auto [s, c] = sincos(angle * T(0.5)); + const auto [s, c] = sincos(angle * T{0.5}); - return {T(0), s, T(0), c}; + return {vec{T{0}, s, T{0}}, c}; } template < typename T > @@ -957,9 +992,9 @@ namespace vmath_hpp /// REFERENCE: /// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/ - const auto [s, c] = sincos(angle * T(0.5)); + const auto [s, c] = sincos(angle * T{0.5}); - return {T(0), T(0), s, c}; + return {vec{T{0}, T{0}, s}, c}; } template < typename T > diff --git a/headers/vmath.hpp/vmath_fun.hpp b/headers/vmath.hpp/vmath_fun.hpp index 3701c02..aa6b37f 100644 --- a/headers/vmath.hpp/vmath_fun.hpp +++ b/headers/vmath.hpp/vmath_fun.hpp @@ -17,7 +17,7 @@ namespace vmath_hpp template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr abs(T x) noexcept { - return x >= T(0) ? x : -x; + return x < T{0} ? -x : x; } template < typename T > @@ -35,13 +35,13 @@ namespace vmath_hpp template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr sign(T x) noexcept { - return static_cast((T(0) < x) - (x < T(0))); + return static_cast((T{0} < x) - (x < T{0})); } template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr rcp(T x) noexcept { - return T(1) / x; + return T{1} / x; } template < typename T > @@ -107,13 +107,13 @@ namespace vmath_hpp template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr saturate(T x) noexcept { - return clamp(x, T(0), T(1)); + return clamp(x, T{0}, T{1}); } template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr lerp(T x, T y, T a) noexcept { - return x * (T(1) - a) + y * a; + return x * (T{1} - a) + y * a; } template < typename T > @@ -125,14 +125,14 @@ namespace vmath_hpp template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr step(T edge, T x) noexcept { - return x < edge ? T(0) : T(1); + return x < edge ? T{0} : T{1}; } template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr smoothstep(T edge0, T edge1, T x) noexcept { - const T t = clamp((x - edge0) * rcp(edge1 - edge0), T(0), T(1)); - return t * t * (T(3) - T(2) * t); + const T t = clamp((x - edge0) * rcp(edge1 - edge0), T{0}, T{1}); + return t * t * (T{3} - T{2} * t); } template < typename T > @@ -151,13 +151,13 @@ namespace vmath_hpp template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr radians(T degrees) noexcept { - return degrees * T(0.01745329251994329576923690768489); + return degrees * T{0.01745329251994329576923690768489}; } template < typename T > [[nodiscard]] std::enable_if_t, T> constexpr degrees(T radians) noexcept { - return radians * T(57.295779513082320876798154814105); + return radians * T{57.295779513082320876798154814105}; } template < typename T > @@ -369,7 +369,7 @@ namespace vmath_hpp /// REFERENCE: /// http://www.realtimecollisiondetection.net/pubs/Tolerances const T epsilon = std::numeric_limits::epsilon(); - return abs(x - y) <= epsilon * max(max(T(1), abs(x)), abs(y)); + return abs(x - y) <= epsilon * max(max(T{1}, abs(x)), abs(y)); } else { return x == y; } @@ -381,7 +381,7 @@ namespace vmath_hpp if constexpr ( std::is_floating_point_v ) { /// REFERENCE: /// http://www.realtimecollisiondetection.net/pubs/Tolerances - return abs(x - y) <= epsilon * max(max(T(1), abs(x)), abs(y)); + return abs(x - y) <= epsilon * max(max(T{1}, abs(x)), abs(y)); } else { return abs(x - y) <= epsilon; } diff --git a/untests/vmath_ext_tests.cpp b/untests/vmath_ext_tests.cpp index bfeb4ce..55b2f58 100644 --- a/untests/vmath_ext_tests.cpp +++ b/untests/vmath_ext_tests.cpp @@ -52,6 +52,8 @@ TEST_CASE("vmath/ext/units") { STATIC_CHECK(identity2x2 == int2x2()); STATIC_CHECK(identity3x3 == int3x3()); STATIC_CHECK(identity4x4 == int4x4()); + + STATIC_CHECK(qidentity == qfloat()); } TEST_CASE("vmath/ext/hash") { diff --git a/untests/vmath_tests.hpp b/untests/vmath_tests.hpp index 7b56cf7..558ecd0 100644 --- a/untests/vmath_tests.hpp +++ b/untests/vmath_tests.hpp @@ -13,7 +13,7 @@ namespace vmath_tests template < typename T > struct uapprox_base { - T epsilon = T(10) * std::numeric_limits::epsilon(); + T epsilon = T{10} * std::numeric_limits::epsilon(); }; template < typename T >