ext funcs non-arithmetic T support

This commit is contained in:
BlackMATov
2021-02-21 01:09:25 +07:00
parent 347c721a7f
commit 8e971073af
5 changed files with 205 additions and 166 deletions

View File

@@ -1556,6 +1556,8 @@ template < typename T > inline constexpr mat<T, 4> unit4x4;
template < typename T > inline constexpr mat<T, 2> identity2x2;
template < typename T > inline constexpr mat<T, 3> identity3x3;
template < typename T > inline constexpr mat<T, 4> identity4x4;
template < typename T > inline constexpr qua<T> qidentity;
```
### Cast

View File

@@ -19,37 +19,72 @@
namespace vmath_hpp
{
template < typename T > inline constexpr vec<T, 2> zero2{0, 0};
template < typename T > inline constexpr vec<T, 3> zero3{0, 0, 0};
template < typename T > inline constexpr vec<T, 4> zero4{0, 0, 0, 0};
template < typename T > inline constexpr vec<T, 2> zero2{T{0}, T{0}};
template < typename T > inline constexpr vec<T, 3> zero3{T{0}, T{0}, T{0}};
template < typename T > inline constexpr vec<T, 4> zero4{T{0}, T{0}, T{0}, T{0}};
template < typename T > inline constexpr vec<T, 2> unit2{1, 1};
template < typename T > inline constexpr vec<T, 3> unit3{1, 1, 1};
template < typename T > inline constexpr vec<T, 4> unit4{1, 1, 1, 1};
template < typename T > inline constexpr vec<T, 2> unit2{T{1}, T{1}};
template < typename T > inline constexpr vec<T, 3> unit3{T{1}, T{1}, T{1}};
template < typename T > inline constexpr vec<T, 4> unit4{T{1}, T{1}, T{1}, T{1}};
template < typename T > inline constexpr vec<T, 2> unit2_x{1, 0};
template < typename T > inline constexpr vec<T, 2> unit2_y{0, 1};
template < typename T > inline constexpr vec<T, 2> unit2_x{T{1}, T{0}};
template < typename T > inline constexpr vec<T, 2> unit2_y{T{0}, T{1}};
template < typename T > inline constexpr vec<T, 3> unit3_x{1, 0, 0};
template < typename T > inline constexpr vec<T, 3> unit3_y{0, 1, 0};
template < typename T > inline constexpr vec<T, 3> unit3_z{0, 0, 1};
template < typename T > inline constexpr vec<T, 3> unit3_x{T{1}, T{0}, T{0}};
template < typename T > inline constexpr vec<T, 3> unit3_y{T{0}, T{1}, T{0}};
template < typename T > inline constexpr vec<T, 3> unit3_z{T{0}, T{0}, T{1}};
template < typename T > inline constexpr vec<T, 4> unit4_x{1, 0, 0, 0};
template < typename T > inline constexpr vec<T, 4> unit4_y{0, 1, 0, 0};
template < typename T > inline constexpr vec<T, 4> unit4_z{0, 0, 1, 0};
template < typename T > inline constexpr vec<T, 4> unit4_w{0, 0, 0, 1};
template < typename T > inline constexpr vec<T, 4> unit4_x{T{1}, T{0}, T{0}, T{0}};
template < typename T > inline constexpr vec<T, 4> unit4_y{T{0}, T{1}, T{0}, T{0}};
template < typename T > inline constexpr vec<T, 4> unit4_z{T{0}, T{0}, T{1}, T{0}};
template < typename T > inline constexpr vec<T, 4> unit4_w{T{0}, T{0}, T{0}, T{1}};
template < typename T > inline constexpr mat<T, 2> zero2x2{0, 0, 0, 0};
template < typename T > inline constexpr mat<T, 3> zero3x3{0, 0, 0, 0, 0, 0, 0, 0, 0};
template < typename T > inline constexpr mat<T, 4> zero4x4{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
template < typename T > inline constexpr mat<T, 2> zero2x2{
T{0}, T{0},
T{0}, T{0}};
template < typename T > inline constexpr mat<T, 2> unit2x2{1, 1, 1, 1};
template < typename T > inline constexpr mat<T, 3> unit3x3{1, 1, 1, 1, 1, 1, 1, 1, 1};
template < typename T > inline constexpr mat<T, 4> unit4x4{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
template < typename T > inline constexpr mat<T, 3> 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<T, 2> identity2x2{1, 0, 0, 1};
template < typename T > inline constexpr mat<T, 3> identity3x3{1, 0, 0, 0, 1, 0, 0, 0, 1};
template < typename T > inline constexpr mat<T, 4> identity4x4{1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
template < typename T > inline constexpr mat<T, 4> 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<T, 2> unit2x2{
T{1}, T{1},
T{1}, T{1}};
template < typename T > inline constexpr mat<T, 3> 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<T, 4> 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<T, 2> identity2x2{
T{1}, T{0},
T{0}, T{1}};
template < typename T > inline constexpr mat<T, 3> 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<T, 4> 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<T> 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<T, Size>& x, const vec<T, Size>& 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,7 +946,7 @@ 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};
@@ -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 >

View File

@@ -17,7 +17,7 @@ namespace vmath_hpp
template < typename T >
[[nodiscard]] std::enable_if_t<std::is_signed_v<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<std::is_arithmetic_v<T>, T>
constexpr sign(T x) noexcept {
return static_cast<T>((T(0) < x) - (x < T(0)));
return static_cast<T>((T{0} < x) - (x < T{0}));
}
template < typename T >
[[nodiscard]] std::enable_if_t<std::is_floating_point_v<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<std::is_arithmetic_v<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<std::is_floating_point_v<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<std::is_floating_point_v<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<std::is_floating_point_v<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<std::is_floating_point_v<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<std::is_floating_point_v<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<T>::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<T> ) {
/// 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;
}

View File

@@ -52,6 +52,8 @@ TEST_CASE("vmath/ext/units") {
STATIC_CHECK(identity2x2<int> == int2x2());
STATIC_CHECK(identity3x3<int> == int3x3());
STATIC_CHECK(identity4x4<int> == int4x4());
STATIC_CHECK(qidentity<float> == qfloat());
}
TEST_CASE("vmath/ext/hash") {

View File

@@ -13,7 +13,7 @@ namespace vmath_tests
template < typename T >
struct uapprox_base {
T epsilon = T(10) * std::numeric_limits<T>::epsilon();
T epsilon = T{10} * std::numeric_limits<T>::epsilon();
};
template < typename T >