Go to the documentation of this file.
58 # pragma warning(push)
59 # pragma warning(disable : 4201) // nonstandard extension used: nameless struct/union
65 static constexpr
double PI = 3.14159265358979323846;
66 static constexpr
float PI_F = 3.1415927f;
152 out[0] =
x * m[0][0] +
y * m[1][0];
153 out[1] =
x * m[0][1] +
y * m[1][1];
183 return x == right.
x &&
y == right.
y;
188 return !(*
this == right);
193 return Vector2{
x < right.
x ?
static_cast<T
>(1) :
static_cast<T
>(0),
194 y < right.
y ?
static_cast<T
>(1) :
static_cast<T
>(0)};
199 return Vector2{
x > right.
x ?
static_cast<T
>(1) :
static_cast<T
>(0),
200 y > right.
y ?
static_cast<T
>(1) :
static_cast<T
>(0)};
205 return Vector2{
x <= right.
x ?
static_cast<T
>(1) :
static_cast<T
>(0),
206 y <= right.
y ?
static_cast<T
>(1) :
static_cast<T
>(0)};
211 return Vector2{
x >= right.
x ?
static_cast<T
>(1) :
static_cast<T
>(0),
212 y >= right.
y ?
static_cast<T
>(1) :
static_cast<T
>(0)};
215 T*
Data() {
return reinterpret_cast<T*
>(
this); }
217 const T*
Data()
const {
return reinterpret_cast<const T*
>(
this); }
221 return Data()[index];
226 return Data()[index];
234 template <
typename Y>
239 static_cast<T
>(vals[0]),
240 static_cast<T
>(vals[1])
244 template <
typename Y>
336 return Vector3{out4.
x / out4.
w, out4.
y / out4.
w, out4.
z / out4.
w};
350 out[0] =
x * m[0][0] +
y * m[1][0] +
z * m[2][0];
351 out[1] =
x * m[0][1] +
y * m[1][1] +
z * m[2][1];
352 out[2] =
x * m[0][2] +
y * m[1][2] +
z * m[2][2];
384 return x == right.
x &&
y == right.
y &&
z == right.
z;
389 return !(*
this == right);
394 return Vector3{
x < right.
x ?
static_cast<T
>(1) :
static_cast<T
>(0),
395 y < right.
y ?
static_cast<T
>(1) :
static_cast<T
>(0),
396 z < right.
z ?
static_cast<T
>(1) :
static_cast<T
>(0)};
401 return Vector3{
x > right.
x ?
static_cast<T
>(1) :
static_cast<T
>(0),
402 y > right.
y ?
static_cast<T
>(1) :
static_cast<T
>(0),
403 z > right.
z ?
static_cast<T
>(1) :
static_cast<T
>(0)};
408 return Vector3{
x <= right.
x ?
static_cast<T
>(1) :
static_cast<T
>(0),
409 y <= right.
y ?
static_cast<T
>(1) :
static_cast<T
>(0),
410 z <= right.
z ?
static_cast<T
>(1) :
static_cast<T
>(0)};
415 return Vector3{
x >= right.
x ?
static_cast<T
>(1) :
static_cast<T
>(0),
416 y >= right.
y ?
static_cast<T
>(1) :
static_cast<T
>(0),
417 z >= right.
z ?
static_cast<T
>(1) :
static_cast<T
>(0)};
420 T*
Data() {
return reinterpret_cast<T*
>(
this); }
422 const T*
Data()
const {
return reinterpret_cast<const T*
>(
this); }
426 return Data()[index];
431 return Data()[index];
437 x{_x},
y{_y},
z{_z} {}
439 template <
typename Y>
444 static_cast<T
>(vals[0]),
445 static_cast<T
>(vals[1]),
446 static_cast<T
>(vals[2])
450 template <
typename Y>
468 template <
class T>
struct Vector4
490 return Vector4{
x - right.x,
y - right.y,
z - right.z,
w - right.w};
509 return Vector4{
x + right.x,
y + right.y,
z + right.z,
w + right.w};
537 return Vector4{
x * right.x,
y * right.y,
z * right.z,
w * right.w};
565 return Vector4{
x / right.x,
y / right.y,
z / right.z,
w / right.w};
579 return x == right.x &&
y == right.y &&
z == right.z &&
w == right.w;
584 return !(*
this == right);
590 out[0] =
x * m[0][0] +
y * m[1][0] +
z * m[2][0] +
w * m[3][0];
591 out[1] =
x * m[0][1] +
y * m[1][1] +
z * m[2][1] +
w * m[3][1];
592 out[2] =
x * m[0][2] +
y * m[1][2] +
z * m[2][2] +
w * m[3][2];
593 out[3] =
x * m[0][3] +
y * m[1][3] +
z * m[2][3] +
w * m[3][3];
609 return Vector4{
x < right.x ?
static_cast<T
>(1) :
static_cast<T
>(0),
610 y < right.y ?
static_cast<T
>(1) :
static_cast<T
>(0),
611 z < right.z ?
static_cast<T
>(1) :
static_cast<T
>(0),
612 w < right.w ?
static_cast<T
>(1) :
static_cast<T
>(0)};
617 return Vector4{
x > right.x ?
static_cast<T
>(1) :
static_cast<T
>(0),
618 y > right.y ?
static_cast<T
>(1) :
static_cast<T
>(0),
619 z > right.z ?
static_cast<T
>(1) :
static_cast<T
>(0),
620 w > right.w ?
static_cast<T
>(1) :
static_cast<T
>(0)};
625 return Vector4{
x <= right.x ?
static_cast<T
>(1) :
static_cast<T
>(0),
626 y <= right.y ?
static_cast<T
>(1) :
static_cast<T
>(0),
627 z <= right.z ?
static_cast<T
>(1) :
static_cast<T
>(0),
628 w <= right.w ?
static_cast<T
>(1) :
static_cast<T
>(0)};
633 return Vector4{
x >= right.x ?
static_cast<T
>(1) :
static_cast<T
>(0),
634 y >= right.y ?
static_cast<T
>(1) :
static_cast<T
>(0),
635 z >= right.z ?
static_cast<T
>(1) :
static_cast<T
>(0),
636 w >= right.w ?
static_cast<T
>(1) :
static_cast<T
>(0)};
639 T*
Data() {
return reinterpret_cast<T*
>(
this); }
641 const T*
Data()
const {
return reinterpret_cast<const T*
>(
this); }
645 return Data()[index];
650 return Data()[index];
654 x{0},
y{0},
z{0},
w{0} {}
656 x{_x},
y{_y},
z{_z},
w{_w} {}
658 x{v3.
x},
y{v3.y},
z{v3.z},
w{_w} {}
660 template <
typename Y>
665 static_cast<T
>(vals[0]),
666 static_cast<T
>(vals[1]),
667 static_cast<T
>(vals[2]),
668 static_cast<T
>(vals[3])
672 template <
typename Y>
695 template <
class T>
struct Matrix2x2
736 template <
typename Y>
741 static_cast<T
>(vals[0]),
static_cast<T
>(vals[1]),
742 static_cast<T
>(vals[2]),
static_cast<T
>(vals[3])
748 for (
int i = 0; i < 2; ++i)
749 for (
int j = 0; j < 2; ++j)
750 if ((*
this)[i][j] != r[i][j])
758 return !(*
this == r);
771 T*
Data() {
return (*
this)[0]; }
773 const T*
Data()
const {
return (*
this)[0]; }
778 for (
int i = 0; i < 4; ++i)
779 (
reinterpret_cast<T*
>(
this))[i] *= s;
786 *
this =
Mul(*
this, right);
807 for (
int i = 0; i < 2; i++)
809 for (
int j = 0; j < 2; j++)
811 for (
int k = 0; k < 2; k++)
813 mOut.m[i][j] += m1.m[i][k] * m2.m[k][j];
822 auto s = std::sin(angleInRadians);
823 auto c = std::cos(angleInRadians);
851 template <
class T>
struct Matrix3x3
897 T i31, T i32, T i33) :
905 template <
typename Y>
910 static_cast<T
>(vals[0]),
static_cast<T
>(vals[1]),
static_cast<T
>(vals[2]),
911 static_cast<T
>(vals[3]),
static_cast<T
>(vals[4]),
static_cast<T
>(vals[5]),
912 static_cast<T
>(vals[6]),
static_cast<T
>(vals[7]),
static_cast<T
>(vals[8])
918 for (
int i = 0; i < 3; ++i)
919 for (
int j = 0; j < 3; ++j)
920 if ((*
this)[i][j] != r[i][j])
928 return !(*
this == r);
941 T*
Data() {
return (*
this)[0]; }
943 const T*
Data()
const {
return (*
this)[0]; }
947 for (
int i = 0; i < 9; ++i)
948 (
reinterpret_cast<T*
>(
this))[i] *= s;
955 *
this =
Mul(*
this, right);
994 auto s = std::sin(angleInRadians);
995 auto c = std::cos(angleInRadians);
1010 auto s = std::sin(angleInRadians);
1011 auto c = std::cos(angleInRadians);
1026 auto s = std::sin(angleInRadians);
1027 auto c = std::cos(angleInRadians);
1040 for (
int i = 0; i < 3; i++)
1042 for (
int j = 0; j < 3; j++)
1044 for (
int k = 0; k < 3; k++)
1046 mOut.m[i][j] += m1.m[i][k] * m2.m[k][j];
1064 template <
class T>
struct Matrix4x4
1124 T i21, T i22, T i23, T i24,
1125 T i31, T i32, T i33, T i34,
1126 T i41, T i42, T i43, T i44) :
1148 template <
typename Y>
1154 static_cast<T
>(vals[ 0]),
static_cast<T
>(vals[ 1]),
static_cast<T
>(vals[ 2]),
static_cast<T
>(vals[ 3]),
1155 static_cast<T
>(vals[ 4]),
static_cast<T
>(vals[ 5]),
static_cast<T
>(vals[ 6]),
static_cast<T
>(vals[ 7]),
1156 static_cast<T
>(vals[ 8]),
static_cast<T
>(vals[ 9]),
static_cast<T
>(vals[10]),
static_cast<T
>(vals[11]),
1157 static_cast<T
>(vals[12]),
static_cast<T
>(vals[13]),
static_cast<T
>(vals[14]),
static_cast<T
>(vals[15])
1164 for (
int i = 0; i < 4; ++i)
1165 for (
int j = 0; j < 4; ++j)
1166 if ((*
this)[i][j] != r[i][j])
1174 return !(*
this == r);
1189 const T*
Data()
const {
return (*
this)[0]; }
1193 for (
int i = 0; i < 16; ++i)
1194 (
reinterpret_cast<T*
>(
this))[i] *= s;
1201 *
this =
Mul(*
this, right);
1261 return Scale(s, s, s);
1270 auto s = std::sin(angleInRadians);
1271 auto c = std::cos(angleInRadians);
1287 auto s = std::sin(angleInRadians);
1288 auto c = std::cos(angleInRadians);
1304 auto s = std::sin(angleInRadians);
1305 auto c = std::cos(angleInRadians);
1321 auto sinAngle = std::sin(angleInRadians);
1322 auto cosAngle = std::cos(angleInRadians);
1323 auto oneMinusCosAngle = 1 - cosAngle;
1327 mOut._11 = 1 + oneMinusCosAngle * (axis.
x * axis.
x - 1);
1328 mOut._12 = axis.
z * sinAngle + oneMinusCosAngle * axis.
x * axis.
y;
1329 mOut._13 = -axis.
y * sinAngle + oneMinusCosAngle * axis.
x * axis.
z;
1332 mOut._21 = -axis.
z * sinAngle + oneMinusCosAngle * axis.
y * axis.
x;
1333 mOut._22 = 1 + oneMinusCosAngle * (axis.
y * axis.
y - 1);
1334 mOut._23 = axis.
x * sinAngle + oneMinusCosAngle * axis.
y * axis.
z;
1337 mOut._31 = axis.
y * sinAngle + oneMinusCosAngle * axis.
z * axis.
x;
1338 mOut._32 = -axis.
x * sinAngle + oneMinusCosAngle * axis.
z * axis.
y;
1339 mOut._33 = 1 + oneMinusCosAngle * (axis.
z * axis.
z - 1);
1354 f3X.
x, f3Y.
x, f3Z.
x, 0,
1355 f3X.
y, f3Y.
y, f3Z.
y, 0,
1356 f3X.
z, f3Y.
z, f3Z.
z, 0,
1381 _33 = -(-(zFar + zNear) / (zFar - zNear));
1382 _43 = -2 * zNear * zFar / (zFar - zNear);
1387 _33 = zFar / (zFar - zNear);
1388 _43 = -zNear * zFar / (zFar - zNear);
1397 zNear =
_43 / (-1 -
_33);
1403 zFar =
_33 / (
_33 - 1) * zNear;
1410 auto yScale =
static_cast<T
>(1) / std::tan(fov /
static_cast<T
>(2));
1411 auto xScale = yScale / aspectRatio;
1415 mOut.SetNearFarClipPlanes(zNear, zFar, bIsGL);
1422 auto _22 = (bIsGL ? 2 : 1) / (zFar - zNear);
1423 auto _32 = (bIsGL ? zNear + zFar : zNear) / (zNear - zFar);
1427 2 / (right - left), 0, 0, 0,
1428 0, 2 / (top - bottom), 0, 0,
1430 (left + right)/(left - right), (top + bottom) / (bottom - top),
_32, 1
1438 -width *
static_cast<T
>(0.5),
1439 +width *
static_cast<T
>(0.5),
1440 -height *
static_cast<T
>(0.5),
1441 +height *
static_cast<T
>(0.5),
1442 zNear, zFar, bIsGL);
1448 for (
int i = 0; i < 4; i++)
1450 for (
int j = 0; j < 4; j++)
1452 for (
int k = 0; k < 4; k++)
1454 mOut.m[i][j] += m1.m[i][k] * m2.m[k][j];
1600 auto det =
_11 * inv._11 +
_12 * inv._12 +
_13 * inv._13 +
_14 * inv._14;
1601 inv = inv.Transpose();
1602 inv *=
static_cast<T
>(1) / det;
1625 return a.
x * b.
x + a.
y * b.
y;
1631 return a.
x * b.
x + a.
y * b.
y + a.
z * b.
z;
1637 return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
1640 template <
class VectorType>
1643 return sqrt(
dot(a, a));
1676 a.
y < 0 ? -a.
y : a.
y);
1684 a.
y < 0 ? -a.
y : a.
y,
1685 a.
z < 0 ? -a.
z : a.
z);
1693 a.y < 0 ? -a.y : a.y,
1694 a.z < 0 ? -a.z : a.z,
1695 a.w < 0 ? -a.w : a.w);
1699 template <
typename T>
1702 return val < _min ? _min : (val > _max ? _max : val);
1724 clamp(a.y, _min.y, _max.y),
1725 clamp(a.z, _min.z, _max.z),
1726 clamp(a.w, _min.w, _max.w));
1739 template <
class T,
class Y>
1747 static_cast<T
>(Y{a.
y} * Y{b.
z} - Y{a.
z} * Y{b.
y}),
1748 static_cast<T
>(Y{a.
z} * Y{b.
x} - Y{a.
x} * Y{b.
z}),
1749 static_cast<T
>(Y{a.
x} * Y{b.
y} - Y{a.
y} * Y{b.
x})
1755 return cross<float, double>(a, b);
1760 return cross<int32_t, int64_t>(a, b);
1763 template <
class VectorType>
1798 out[0] = m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w;
1799 out[1] = m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w;
1800 out[2] = m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w;
1801 out[3] = m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w;
1809 out[0] = m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z;
1810 out[1] = m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z;
1811 out[2] = m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z;
1819 out[0] = m[0][0] * v.
x + m[0][1] * v.
y;
1820 out[1] = m[1][0] * v.
x + m[1][1] * v.
y;
1867 return q == right.
q;
1870 template <
typename Y>
1879 float norm =
length(axis);
1882 float sina2 = sin(0.5f * angle);
1883 out.q[0] = sina2 * axis[0] / norm;
1884 out.q[1] = sina2 * axis[1] / norm;
1885 out.q[2] = sina2 * axis[2] / norm;
1886 out.q[3] = cos(0.5f * angle);
1893 float sina2 = sqrt(
q[0] *
q[0] +
q[1] *
q[1] +
q[2] *
q[2]);
1894 outAngle = 2.0f *
atan2(sina2,
q[3]);
1895 float r = (sina2 > 0) ? (1.0f / sina2) : 0;
1896 outAxis[0] = r *
q[0];
1897 outAxis[1] = r *
q[1];
1898 outAxis[2] = r *
q[2];
1904 float yy2 = 2.0f *
q[1] *
q[1];
1905 float xy2 = 2.0f *
q[0] *
q[1];
1906 float xz2 = 2.0f *
q[0] *
q[2];
1907 float yz2 = 2.0f *
q[1] *
q[2];
1908 float zz2 = 2.0f *
q[2] *
q[2];
1909 float wz2 = 2.0f *
q[3] *
q[2];
1910 float wy2 = 2.0f *
q[3] *
q[1];
1911 float wx2 = 2.0f *
q[3] *
q[0];
1912 float xx2 = 2.0f *
q[0] *
q[0];
1913 out[0][0] = -yy2 - zz2 + 1.0f;
1914 out[0][1] = xy2 + wz2;
1915 out[0][2] = xz2 - wy2;
1917 out[1][0] = xy2 - wz2;
1918 out[1][1] = -xx2 - zz2 + 1.0f;
1919 out[1][2] = yz2 + wx2;
1921 out[2][0] = xz2 + wy2;
1922 out[2][1] = yz2 - wx2;
1923 out[2][2] = -xx2 - yy2 + 1.0f;
1925 out[3][0] = out[3][1] = out[3][2] = 0;
1948 *
this =
Mul(*
this, rhs);
1955 return v + 2.f *
cross(axis,
cross(axis, v) +
q.
w * v);
1974 if (!DoNotNormalize)
1981 auto dp =
dot(v0.
q, v1.
q);
1993 const double DOT_THRESHOLD = 0.9995;
1994 if (dp > DOT_THRESHOLD)
2005 auto theta_0 = std::acos(dp);
2006 auto theta = theta_0 * t;
2007 auto sin_theta = std::sin(theta);
2008 auto sin_theta_0 = std::sin(theta_0);
2010 auto s0 = cos(theta) - dp * sin_theta / sin_theta_0;
2011 auto s1 = sin_theta / sin_theta_0;
2014 if (!DoNotNormalize)
2022 template <
typename T>
2023 T
lerp(
const T& Left,
const T& Right,
float w)
2025 return Left * (1.f - w) + Right * w;
2028 template <
typename T>
2031 auto t =
clamp((w - Left) / (Right - Left),
static_cast<T
>(0),
static_cast<T
>(1));
2032 return t * t * (
static_cast<T
>(3) -
static_cast<T
>(2) * t);
2035 template <
typename T>
2036 T
max3(
const T& x,
const T& y,
const T& z)
2041 template <
typename T>
2042 T
min3(
const T& x,
const T& y,
const T& z)
2052 static_cast<float>((RGBA8 >> 0u) & 0xFF) / 255.f,
2053 static_cast<float>((RGBA8 >> 8u) & 0xFF) / 255.f,
2054 static_cast<float>((RGBA8 >> 16u) & 0xFF) / 255.f,
2055 static_cast<float>((RGBA8 >> 24u) & 0xFF) / 255.f
2063 RGBA8U |=
static_cast<Uint32>(
clamp(f4Color.
r, 0.f, 1.f) * 255.f) << 0u;
2064 RGBA8U |=
static_cast<Uint32>(
clamp(f4Color.
g, 0.f, 1.f) * 255.f) << 8u;
2065 RGBA8U |=
static_cast<Uint32>(
clamp(f4Color.
b, 0.f, 1.f) * 255.f) << 16u;
2066 RGBA8U |=
static_cast<Uint32>(
clamp(f4Color.
a, 0.f, 1.f) * 255.f) << 24u;
2070 template <
typename T>
2092 template <
typename T>
2096 auto flr =
static_cast<T
>(i);
2104 return flr <= x ? flr : flr - 1;
2107 template <
typename T>
2114 template <
typename T>
2122 template <
typename T>
2131 template <
typename T>
2142 template <
typename T>
2150 template <
typename T>
2159 template <
typename T>
2180 x = (x | (x << 8u)) & 0x00FF00FFu;
2181 x = (x | (x << 4u)) & 0x0F0F0F0Fu;
2182 x = (x | (x << 2u)) & 0x33333333u;
2183 x = (x | (x << 1u)) & 0x55555555u;
2185 y = (y | (y << 8u)) & 0x00FF00FFu;
2186 y = (y | (y << 4u)) & 0x0F0F0F0Fu;
2187 y = (y | (y << 2u)) & 0x33333333u;
2188 y = (y | (y << 1u)) & 0x55555555u;
2190 return x | (y << 1u);
2194 template <
typename T>
2195 typename std::enable_if<std::is_integral<T>::value, T>::type
ExtractLSB(T& bits)
2200 const T bit = bits & ~(bits - T{1});
2207 template <
typename T>
2208 typename std::enable_if<std::is_enum<T>::value, T>::type
ExtractLSB(T& bits)
2210 return static_cast<T
>(
ExtractLSB(
reinterpret_cast<typename std::underlying_type<T>::type&
>(bits)));
2216 return os <<
"float4(" << vec.
x <<
", " << vec.
y <<
", " << vec.
z <<
", " << vec.
w <<
')';
2220 return os <<
"float3(" << vec.
x <<
", " << vec.
y <<
", " << vec.
z <<
')';
2224 return os <<
"float2(" << vec.
x <<
", " << vec.
y <<
')';
2229 return os <<
"int4(" << vec.
x <<
", " << vec.
y <<
", " << vec.
z <<
", " << vec.
w <<
')';
2233 return os <<
"int3(" << vec.
x <<
", " << vec.
y <<
", " << vec.
z <<
')';
2237 return os <<
"int2(" << vec.
x <<
", " << vec.
y <<
')';
2243 return os <<
"uint4(" << vec.
x <<
", " << vec.
y <<
", " << vec.
z <<
", " << vec.
w <<
')';
2247 return os <<
"uint3(" << vec.
x <<
", " << vec.
y <<
", " << vec.
z <<
')';
2251 return os <<
"uint2(" << vec.
x <<
", " << vec.
y <<
')';
2260 template <
typename T>
2268 template <
typename T>
2277 template <
typename T>
2288 template <
typename T>
2296 template <
typename T>
2305 template <
typename T>
2315 template <
typename T>
2323 template <
typename T>
2332 template <
typename T>
2343 template <
typename T>
2351 template <
typename T>
2360 template <
typename T>
2371 template <
typename T>
2380 template <
typename T>
2389 template <
typename T>
2398 template <
typename T>
2409 template <
typename T>
2421 template <
typename T>
2436 # pragma warning(pop)
static Matrix3x3 RotationY(T angleInRadians)
Definition: BasicMath.hpp:1008
Matrix2x2(T value)
Definition: BasicMath.hpp:716
T * Data()
Definition: BasicMath.hpp:1187
Matrix4x4 & operator*=(T s)
Definition: BasicMath.hpp:1191
uint32_t uint
Definition: BasicMath.hpp:1826
T x
Definition: BasicMath.hpp:474
static Vector4 MakeVector(const Y &vals)
Definition: BasicMath.hpp:661
Vector4 operator/(const Vector4 &right) const
Definition: BasicMath.hpp:563
const T * Data() const
Definition: BasicMath.hpp:641
bool operator!=(const Vector3 &right) const
Definition: BasicMath.hpp:387
T _21
Definition: BasicMath.hpp:860
Vector2 operator*(const Matrix2x2< T > &m) const
Definition: BasicMath.hpp:149
Vector3 operator+(const Vector3 &right) const
Definition: BasicMath.hpp:302
T _11
Definition: BasicMath.hpp:857
T m03
Definition: BasicMath.hpp:1092
size_t operator()(const Diligent::Matrix3x3< T > &m) const
Definition: BasicMath.hpp:2412
static Vector2 MakeVector(const Y &vals)
Definition: BasicMath.hpp:235
static Matrix3x3 Scale(T x, T y, T z)
Definition: BasicMath.hpp:979
static Matrix4x4 Identity()
Definition: BasicMath.hpp:1216
Matrix4x4()
Definition: BasicMath.hpp:1119
const T & operator[](size_t index) const
Definition: BasicMath.hpp:224
T _14
Definition: BasicMath.hpp:1073
Vector4(const Vector3< T > &v3, T _w)
Definition: BasicMath.hpp:657
static Matrix2x2 MakeMatrix(const Y &vals)
Definition: BasicMath.hpp:737
std::enable_if< std::is_integral< T >::value, T >::type ExtractLSB(T &bits)
Returns the least-signficant bit and clears it in the input argument.
Definition: BasicMath.hpp:2195
Vector2 operator-(const Vector2< T > &right) const
Definition: BasicMath.hpp:96
static Matrix3x3 MakeMatrix(const Y &vals)
Definition: BasicMath.hpp:906
Vector3< float > high_precision_cross(const Vector3< float > &a, const Vector3< float > &b)
Definition: BasicMath.hpp:1753
Vector2 operator>=(const Vector2 &right) const
Definition: BasicMath.hpp:209
Vector3 & operator/=(const Vector3 &right)
Definition: BasicMath.hpp:374
T m01
Definition: BasicMath.hpp:1090
T a
Definition: BasicMath.hpp:484
Vector2 operator/(const Vector2 &right) const
Definition: BasicMath.hpp:157
bool operator==(const Matrix3x3 &r) const
Definition: BasicMath.hpp:916
Vector4(T _x, T _y, T _z, T _w)
Definition: BasicMath.hpp:655
Matrix4x4(T i11, T i12, T i13, T i14, T i21, T i22, T i23, T i24, T i31, T i32, T i33, T i34, T i41, T i42, T i43, T i44)
Definition: BasicMath.hpp:1123
T m10
Definition: BasicMath.hpp:1093
Matrix3x3()
Definition: BasicMath.hpp:891
Vector4 operator>=(const Vector4 &right) const
Definition: BasicMath.hpp:631
Vector3< T > cross(const Vector3< T > &a, const Vector3< T > &b)
Definition: BasicMath.hpp:1731
T * Data()
Definition: BasicMath.hpp:420
T x
Definition: BasicMath.hpp:80
T _34
Definition: BasicMath.hpp:1081
T z
Definition: BasicMath.hpp:267
Vector3< T > min(const Vector3< T > &a, const Vector3< T > &b)
Definition: BasicMath.hpp:1648
Vector2 & operator-=(const Vector2< T > &right)
Definition: BasicMath.hpp:101
T w
Definition: BasicMath.hpp:279
Vector2 & operator/=(T s)
Definition: BasicMath.hpp:174
static Vector3 MakeVector(const Y &vals)
Definition: BasicMath.hpp:440
T m10
Definition: BasicMath.hpp:872
Matrix2x2 & operator*=(T s)
Definition: BasicMath.hpp:776
Vector4 operator-(const Vector4 &right) const
Definition: BasicMath.hpp:488
T * operator[](size_t row)
Definition: BasicMath.hpp:931
bool operator!=(const Matrix3x3 &r) const
Definition: BasicMath.hpp:926
Vector2(T _x, T _y)
Definition: BasicMath.hpp:231
Vector3< Y > Recast() const
Definition: BasicMath.hpp:451
Vector2 operator+(const Vector2< T > &right) const
Definition: BasicMath.hpp:113
T _11
Definition: BasicMath.hpp:1070
T _21
Definition: BasicMath.hpp:1074
T _44
Definition: BasicMath.hpp:1085
Vector3 operator>=(const Vector3 &right) const
Definition: BasicMath.hpp:413
Vector2< T > abs(const Vector2< T > &a)
Definition: BasicMath.hpp:1672
T b
Definition: BasicMath.hpp:483
Vector2 operator/(T s) const
Definition: BasicMath.hpp:169
T * operator[](size_t row)
Definition: BasicMath.hpp:1177
Vector2 operator-() const
Definition: BasicMath.hpp:108
Vector2< T > operator*(T s, const Vector2< T > &a)
Definition: BasicMath.hpp:253
Matrix4x4 Inverse() const
Definition: BasicMath.hpp:1493
const T * Data() const
Definition: BasicMath.hpp:217
Vector4 operator+(const Vector4 &right) const
Definition: BasicMath.hpp:507
static Matrix4x4 ViewFromBasis(const Vector3< T > &f3X, const Vector3< T > &f3Y, const Vector3< T > &f3Z)
Definition: BasicMath.hpp:1350
auto length(const VectorType &a) -> decltype(dot(a, a))
Definition: BasicMath.hpp:1641
static Matrix4x4 OrthoOffCenter(T left, T right, T bottom, T top, T zNear, T zFar, bool bIsGL)
Definition: BasicMath.hpp:1420
float4 RGBA8Unorm_To_F4Color(Uint32 RGBA8)
Definition: BasicMath.hpp:2047
T m20
Definition: BasicMath.hpp:1097
T Determinant() const
Definition: BasicMath.hpp:1462
T _23
Definition: BasicMath.hpp:862
Vector4 & operator/=(T s)
Definition: BasicMath.hpp:554
Definition: BasicMath.hpp:71
static Matrix4x4 RotationZ(T angleInRadians)
Definition: BasicMath.hpp:1302
T * Data()
Definition: BasicMath.hpp:941
const T * Data() const
Definition: BasicMath.hpp:422
T _23
Definition: BasicMath.hpp:1076
Vector3< T > max(const Vector3< T > &a, const Vector3< T > &b)
Definition: BasicMath.hpp:1660
static Matrix4x4 MakeMatrix(const Y &vals)
Definition: BasicMath.hpp:1149
T m22
Definition: BasicMath.hpp:1099
const T * operator[](size_t row) const
Definition: BasicMath.hpp:766
Vector4 & operator=(const Vector3< T > &v3)
Definition: BasicMath.hpp:597
const T & operator[](size_t index) const
Definition: BasicMath.hpp:648
T u
Definition: BasicMath.hpp:90
size_t operator()(const Diligent::Vector4< T > &v4) const
Definition: BasicMath.hpp:2392
Vector3 & operator*=(T s)
Definition: BasicMath.hpp:320
Vector4 operator<(const Vector4 &right) const
Definition: BasicMath.hpp:607
T clamp(T val, T _min, T _max)
Definition: BasicMath.hpp:1700
T _33
Definition: BasicMath.hpp:865
Diligent::Vector2< T > min(const Diligent::Vector2< T > &Left, const Diligent::Vector2< T > &Right)
Definition: BasicMath.hpp:2289
T m00
Definition: BasicMath.hpp:869
Vector4 operator*(const Matrix4x4< T > &m) const
Definition: BasicMath.hpp:587
static Quaternion MakeQuaternion(const Y &vals)
Definition: BasicMath.hpp:1871
Matrix2x2 Inverse() const
Definition: BasicMath.hpp:837
Matrix2x2 Transpose() const
Definition: BasicMath.hpp:790
Vector3(T _x, T _y, T _z)
Definition: BasicMath.hpp:436
Vector2()
Definition: BasicMath.hpp:229
T m[4][4]
Definition: BasicMath.hpp:1106
T _11
Definition: BasicMath.hpp:701
const T * Data() const
Definition: BasicMath.hpp:773
Quaternion & operator=(const Quaternion &rhs)
Definition: BasicMath.hpp:1940
T r
Definition: BasicMath.hpp:271
size_t operator()(const Diligent::Matrix4x4< T > &m) const
Definition: BasicMath.hpp:2424
Matrix4x4 RemoveTranslation() const
Definition: BasicMath.hpp:1607
Definition: BasicMath.hpp:259
static Matrix4x4 Projection(T fov, T aspectRatio, T zNear, T zFar, bool bIsGL)
Definition: BasicMath.hpp:1407
int32_t Int32
32-bit signed integer
Definition: BasicTypes.h:46
void SetNearFarClipPlanes(T zNear, T zFar, T bIsGL)
Definition: BasicMath.hpp:1362
T _33
Definition: BasicMath.hpp:1080
static Matrix4x4 Scale(const Vector3< T > &v)
Definition: BasicMath.hpp:1254
Vector4 & operator-=(const Vector4< T > &right)
Definition: BasicMath.hpp:498
T _22
Definition: BasicMath.hpp:861
T Determinant() const
Definition: BasicMath.hpp:832
static Matrix4x4 Mul(const Matrix4x4 &m1, const Matrix4x4 &m2)
Definition: BasicMath.hpp:1445
static Matrix3x3 RotationZ(T angleInRadians)
Definition: BasicMath.hpp:1024
Matrix4x4(const Vector4< T > &Row0, const Vector4< T > &Row1, const Vector4< T > &Row2, const Vector4< T > &Row3)
Definition: BasicMath.hpp:1136
Vector4 operator*(T s) const
Definition: BasicMath.hpp:521
T max3(const T &x, const T &y, const T &z)
Definition: BasicMath.hpp:2036
Vector3 operator*(const Matrix4x4< T > &m) const
Definition: BasicMath.hpp:333
Quaternion() noexcept
Definition: BasicMath.hpp:1863
T u
Definition: BasicMath.hpp:277
T m[3][3]
Definition: BasicMath.hpp:879
Matrix2x2(T i11, T i12, T i21, T i22)
Definition: BasicMath.hpp:728
T _12
Definition: BasicMath.hpp:702
T _32
Definition: BasicMath.hpp:1079
T m02
Definition: BasicMath.hpp:1091
int64_t Int64
64-bit signed integer
Definition: BasicTypes.h:45
static Matrix2x2 Rotation(T angleInRadians)
Definition: BasicMath.hpp:820
Vector4 operator<=(const Vector4 &right) const
Definition: BasicMath.hpp:623
float3 RotateVector(const float3 &v) const
Definition: BasicMath.hpp:1952
const T * Data() const
Definition: BasicMath.hpp:943
Matrix3x3(T value)
Definition: BasicMath.hpp:882
Definition: BasicMath.hpp:70
T _31
Definition: BasicMath.hpp:1078
T m30
Definition: BasicMath.hpp:1101
Uint32 F4Color_To_RGBA8Unorm(const float4 &f4Color)
Definition: BasicMath.hpp:2060
T _32
Definition: BasicMath.hpp:864
bool operator==(const Matrix4x4 &r) const
Definition: BasicMath.hpp:1162
Vector2 & operator*=(T s)
Definition: BasicMath.hpp:142
Vector4 & operator*=(T s)
Definition: BasicMath.hpp:526
Diligent::Vector2< T > floor(const Diligent::Vector2< T > &vec)
Definition: BasicMath.hpp:2316
T y
Definition: BasicMath.hpp:266
Vector2 & operator*=(const Vector2 &right)
Definition: BasicMath.hpp:135
T m32
Definition: BasicMath.hpp:1103
Matrix2x2()
Definition: BasicMath.hpp:724
static Matrix4x4 Scale(T s)
Definition: BasicMath.hpp:1259
T * operator[](size_t row)
Definition: BasicMath.hpp:761
static Matrix3x3 RotationX(T angleInRadians)
Definition: BasicMath.hpp:992
T m33
Definition: BasicMath.hpp:1104
bool operator!=(const Vector4 &right) const
Definition: BasicMath.hpp:582
T y
Definition: BasicMath.hpp:475
T v
Definition: BasicMath.hpp:278
Definition: BasicMath.hpp:69
uint32_t Uint32
32-bit unsigned integer
Definition: BasicTypes.h:51
static Matrix2x2 Identity()
Definition: BasicMath.hpp:797
std::size_t ComputeHash(const ArgsType &... Args)
Definition: HashUtils.hpp:57
Definition: BasicMath.hpp:74
static Matrix4x4 Scale(T x, T y, T z)
Definition: BasicMath.hpp:1243
Matrix3x3 & operator*=(const Matrix3x3 &right)
Definition: BasicMath.hpp:953
T _12
Definition: BasicMath.hpp:1071
Vector2 operator<(const Vector2 &right) const
Definition: BasicMath.hpp:191
T m11
Definition: BasicMath.hpp:711
T & operator[](size_t index)
Definition: BasicMath.hpp:643
T lerp(const T &Left, const T &Right, float w)
Definition: BasicMath.hpp:2023
Definition: BasicMath.hpp:72
T m[2][2]
Definition: BasicMath.hpp:713
VectorType normalize(const VectorType &a)
Definition: BasicMath.hpp:1764
Vector3 operator*(const Matrix3x3< T > &m) const
Definition: BasicMath.hpp:347
Quaternion(const float4 &_q) noexcept
Definition: BasicMath.hpp:1856
Vector2 & operator+=(const Vector2< T > &right)
Definition: BasicMath.hpp:118
T m21
Definition: BasicMath.hpp:1098
Uint32 BitInterleave16(Uint16 _x, Uint16 _y)
Definition: BasicMath.hpp:2169
Diligent::Vector2< T > ceil(const Diligent::Vector2< T > &vec)
Definition: BasicMath.hpp:2344
bool operator==(const Quaternion &right) const
Definition: BasicMath.hpp:1865
T SmoothStep(T Left, T Right, T w)
Definition: BasicMath.hpp:2029
T min3(const T &x, const T &y, const T &z)
Definition: BasicMath.hpp:2042
T m12
Definition: BasicMath.hpp:1095
static Matrix4x4 Translation(T x, T y, T z)
Definition: BasicMath.hpp:1227
Vector4 operator>(const Vector4 &right) const
Definition: BasicMath.hpp:615
T m22
Definition: BasicMath.hpp:877
Vector2 operator<=(const Vector2 &right) const
Definition: BasicMath.hpp:203
Vector2 & operator/=(const Vector2 &right)
Definition: BasicMath.hpp:162
Vector3()
Definition: BasicMath.hpp:434
Vector2< Y > Recast() const
Definition: BasicMath.hpp:245
Vector4 operator-() const
Definition: BasicMath.hpp:493
static Matrix4x4 RotationArbitrary(Vector3< T > axis, T angleInRadians)
Definition: BasicMath.hpp:1317
T _21
Definition: BasicMath.hpp:703
bool operator==(const Matrix2x2 &r) const
Definition: BasicMath.hpp:746
float4x4 ToMatrix() const
Definition: BasicMath.hpp:1901
T m00
Definition: BasicMath.hpp:708
static Matrix3x3 Mul(const Matrix3x3 &m1, const Matrix3x3 &m2)
Definition: BasicMath.hpp:1037
T _42
Definition: BasicMath.hpp:1083
Quaternion & operator*=(const Quaternion &rhs)
Definition: BasicMath.hpp:1946
T m31
Definition: BasicMath.hpp:1102
Vector4()
Definition: BasicMath.hpp:653
T m01
Definition: BasicMath.hpp:870
T FastFloor(T x)
Definition: BasicMath.hpp:2093
Matrix3x3 Transpose() const
Definition: BasicMath.hpp:959
static Matrix3x3 Identity()
Definition: BasicMath.hpp:969
Matrix3x3 & operator*=(T s)
Definition: BasicMath.hpp:945
Vector3 operator-() const
Definition: BasicMath.hpp:289
T m00
Definition: BasicMath.hpp:1089
T m13
Definition: BasicMath.hpp:1096
const T * operator[](size_t row) const
Definition: BasicMath.hpp:1182
T _12
Definition: BasicMath.hpp:858
T * Data()
Definition: BasicMath.hpp:639
Vector3 & operator+=(const Vector3< T > &right)
Definition: BasicMath.hpp:307
T g
Definition: BasicMath.hpp:482
Matrix4x4 & operator*=(const Matrix4x4 &right)
Definition: BasicMath.hpp:1199
Definition: AdvancedMath.hpp:979
Vector4 operator/(T s) const
Definition: BasicMath.hpp:549
T g
Definition: BasicMath.hpp:272
T v
Definition: BasicMath.hpp:91
Vector2 operator*(T s) const
Definition: BasicMath.hpp:125
T m10
Definition: BasicMath.hpp:710
uint16_t Uint16
16-bit unsigned integer
Definition: BasicTypes.h:52
static Matrix4x4 Ortho(T width, T height, T zNear, T zFar, bool bIsGL)
Definition: BasicMath.hpp:1435
Diligent::Vector2< T > max(const Diligent::Vector2< T > &Left, const Diligent::Vector2< T > &Right)
Definition: BasicMath.hpp:2261
Vector3 operator>(const Vector3 &right) const
Definition: BasicMath.hpp:399
T z
Definition: BasicMath.hpp:476
Vector2 operator>(const Vector2 &right) const
Definition: BasicMath.hpp:197
T * Data()
Definition: BasicMath.hpp:771
T _22
Definition: BasicMath.hpp:704
Vector4< Y > Recast() const
Definition: BasicMath.hpp:673
static Matrix2x2 Mul(const Matrix2x2 &m1, const Matrix2x2 &m2)
Definition: BasicMath.hpp:804
T _24
Definition: BasicMath.hpp:1077
float4 q
Definition: BasicMath.hpp:1854
T Determinant() const
Definition: BasicMath.hpp:1054
Vector3 & operator*=(const Vector3 &right)
Definition: BasicMath.hpp:339
T m23
Definition: BasicMath.hpp:1100
static Matrix4x4 Translation(const Vector3< T > &v)
Definition: BasicMath.hpp:1238
T _22
Definition: BasicMath.hpp:1075
T _43
Definition: BasicMath.hpp:1084
Vector3 & operator-=(const Vector3< T > &right)
Definition: BasicMath.hpp:294
T r
Definition: BasicMath.hpp:85
T m21
Definition: BasicMath.hpp:876
void GetNearFarClipPlanes(T &zNear, T &zFar, bool bIsGL) const
Definition: BasicMath.hpp:1393
Vector4 & operator*=(const Vector4 &right)
Definition: BasicMath.hpp:540
bool operator==(const Vector4 &right) const
Definition: BasicMath.hpp:577
const T * Data() const
Definition: BasicMath.hpp:1189
static Quaternion RotationFromAxisAngle(const float3 &axis, float angle)
Definition: BasicMath.hpp:1876
size_t operator()(const Diligent::Vector2< T > &v2) const
Definition: BasicMath.hpp:2374
Vector4 operator*(const Vector4 &right) const
Definition: BasicMath.hpp:535
bool operator==(const Vector2 &right) const
Definition: BasicMath.hpp:181
void GetAxisAngle(float3 &outAxis, float &outAngle) const
Definition: BasicMath.hpp:1891
T _31
Definition: BasicMath.hpp:863
bool operator!=(const Matrix4x4 &r) const
Definition: BasicMath.hpp:1172
T & operator[](size_t index)
Definition: BasicMath.hpp:424
Vector4 & operator+=(const Vector4< T > &right)
Definition: BasicMath.hpp:512
T r
Definition: BasicMath.hpp:481
Vector3 operator*(T s) const
Definition: BasicMath.hpp:315
Vector3 operator/(const Vector3 &right) const
Definition: BasicMath.hpp:369
Definition: BasicMath.hpp:1852
Matrix2x2 & operator*=(const Matrix2x2 &right)
Definition: BasicMath.hpp:784
#define atan2
Definition: GLSLDefinitions.h:101
T m01
Definition: BasicMath.hpp:709
T m11
Definition: BasicMath.hpp:873
T b
Definition: BasicMath.hpp:273
T _41
Definition: BasicMath.hpp:1082
T m02
Definition: BasicMath.hpp:871
T _13
Definition: BasicMath.hpp:859
bool operator!=(const Matrix2x2 &r) const
Definition: BasicMath.hpp:756
const T & operator[](size_t index) const
Definition: BasicMath.hpp:429
Vector3 operator<=(const Vector3 &right) const
Definition: BasicMath.hpp:406
T FastCeil(T x)
Definition: BasicMath.hpp:2108
bool operator==(const Vector3 &right) const
Definition: BasicMath.hpp:382
static Quaternion Mul(const Quaternion &q1, const Quaternion &q2)
Definition: BasicMath.hpp:1930
T g
Definition: BasicMath.hpp:86
T w
Definition: BasicMath.hpp:477
static Matrix4x4 RotationX(T angleInRadians)
Definition: BasicMath.hpp:1268
Vector3 operator-(const Vector3 &right) const
Definition: BasicMath.hpp:284
T m11
Definition: BasicMath.hpp:1094
T x
Definition: BasicMath.hpp:265
size_t operator()(const Diligent::Matrix2x2< T > &m) const
Definition: BasicMath.hpp:2401
T & operator[](size_t index)
Definition: BasicMath.hpp:219
T * Data()
Definition: BasicMath.hpp:215
Vector3 operator*(const Vector3 &right) const
Definition: BasicMath.hpp:328
T dot(const Vector2< T > &a, const Vector2< T > &b)
Definition: BasicMath.hpp:1623
T m20
Definition: BasicMath.hpp:875
std::ostream & operator<<(std::ostream &os, const float4 &vec)
Definition: BasicMath.hpp:2214
size_t operator()(const Diligent::Vector3< T > &v3) const
Definition: BasicMath.hpp:2383
bool operator!=(const Vector2 &right) const
Definition: BasicMath.hpp:186
Matrix4x4(T value)
Definition: BasicMath.hpp:1109
static Matrix4x4 RotationY(T angleInRadians)
Definition: BasicMath.hpp:1285
Vector2 operator*(const Vector2 &right) const
Definition: BasicMath.hpp:130
T _13
Definition: BasicMath.hpp:1072
Vector3 operator/(T s) const
Definition: BasicMath.hpp:356
Vector3 & operator/=(T s)
Definition: BasicMath.hpp:361
The library uses Direct3D-style math:
Definition: AdvancedMath.hpp:37
Matrix4x4 Transpose() const
Definition: BasicMath.hpp:1205
T m12
Definition: BasicMath.hpp:874
T y
Definition: BasicMath.hpp:81
Vector4 & operator/=(const Vector4 &right)
Definition: BasicMath.hpp:568
Vector3 operator<(const Vector3 &right) const
Definition: BasicMath.hpp:392
Quaternion slerp(Quaternion v0, Quaternion v1, float t, bool DoNotNormalize=false)
Definition: BasicMath.hpp:1970
Matrix3x3(T i11, T i12, T i13, T i21, T i22, T i23, T i31, T i32, T i33)
Definition: BasicMath.hpp:895
#define PI_F
Definition: GraphicsUtilities.cpp:36
Quaternion(float x, float y, float z, float w) noexcept
Definition: BasicMath.hpp:1859
const T * operator[](size_t row) const
Definition: BasicMath.hpp:936