9 #ifndef TurtleBrains_Vector_hpp
10 #define TurtleBrains_Vector_hpp
12 #include <turtle_brains/core/tb_configuration.hpp>
13 #include <turtle_brains/core/tb_error.hpp>
14 #include <turtle_brains/core/tb_defines.hpp>
15 #include <turtle_brains/math/tb_math.hpp>
16 #include <turtle_brains/math/tb_angle.hpp>
17 #include <turtle_brains/core/tb_string.hpp>
54 template<
typename Type>
class TypedVector2;
55 template<
typename Type>
class TypedVector3;
56 template<
typename Type>
class TypedVector4;
58 template<
typename Type> Type
Vector2DotProduct(
const TypedVector2<Type>* leftSide,
const TypedVector2<Type>* rightSide);
59 template<
typename Type> Type
Vector3DotProduct(
const TypedVector3<Type>* leftSide,
const TypedVector3<Type>* rightSide);
60 template<
typename Type> Type
Vector4DotProduct(
const TypedVector4<Type>* leftSide,
const TypedVector4<Type>* rightSide);
61 template<
typename Type> TypedVector3<Type>*
Vector3CrossProduct(TypedVector3<Type>* result,
const TypedVector3<Type>* leftSide,
62 const TypedVector3<Type>* rightSide);
64 template<
typename Type> TypedVector2<Type>*
Vector2Normalize(TypedVector2<Type>* result,
const TypedVector2<Type>* value);
65 template<
typename Type> TypedVector3<Type>*
Vector3Normalize(TypedVector3<Type>* result,
const TypedVector3<Type>* value);
66 template<
typename Type> TypedVector4<Type>*
Vector4Normalize(TypedVector4<Type>* result,
const TypedVector4<Type>* value);
68 template<
typename Type> TypedVector2<Type>*
Vector2NormalizeMagnitude(TypedVector2<Type>* result,
const TypedVector2<Type>* value, Type& magnitude);
69 template<
typename Type> TypedVector3<Type>*
Vector3NormalizeMagnitude(TypedVector3<Type>* result,
const TypedVector3<Type>* value, Type& magnitude);
70 template<
typename Type> TypedVector4<Type>*
Vector4NormalizeMagnitude(TypedVector4<Type>* result,
const TypedVector4<Type>* value, Type& magnitude);
120 #if defined(tb_visual_cpp)
121 #pragma warning(push)
122 #pragma warning(disable: 4201)
123 struct { Type x, y; };
126 struct { Type x, y; };
168 x(componentArray[0]),
187 x(static_cast<Type>(other.x)),
188 y(static_cast<Type>(other.y))
223 return (
true ==
IsEqual(x, other.x) &&
true ==
IsEqual(y, other.y)) ? true :
false;
232 return (
true ==
operator==(other)) ? false :
true;
238 inline explicit operator const Type* (void)
const {
return mComponents; }
244 inline explicit operator Type* (void) {
return mComponents; }
257 inline const Type&
operator[](
const int index)
const {
return mComponents[index]; }
258 inline const Type&
operator[](
const std::size_t& index)
const {
return mComponents[index]; }
264 inline Type&
operator[](
const int index) {
return mComponents[index]; }
265 inline Type&
operator[](
const std::size_t& index) {
return mComponents[index]; }
296 #if defined(tb_with_math_operators)
306 inline TypedVector2& operator+=(
const TypedVector2& rightSide) { x += rightSide.x; y += rightSide.y;
return *
this; }
316 inline TypedVector2& operator-=(
const TypedVector2& rightSide) { x -= rightSide.x; y -= rightSide.y;
return *
this; }
333 inline TypedVector2& operator*=(Type scalar) { x *= scalar; y *= scalar;
return *
this; }
344 inline TypedVector2& operator/=(Type scalar) { x /= scalar; y /= scalar;
return *
this; }
359 inline Type operator*(
const TypedVector2& rhs)
const {
return (x * rhs.x) + (y * rhs.y); }
365 inline Type Magnitude(
void)
const {
return sqrt((x * x) + (y * y)); }
371 inline Type MagnitudeSquared(
void)
const {
return (x * x) + (y * y); }
379 const Type magnitude(Magnitude());
380 if (
true ==
IsZero(magnitude)) {
return Zero(); }
391 const Type magnitude(Magnitude());
392 if (
false ==
IsZero(magnitude))
403 inline void Scale(Type scalar) { *
this *= scalar; }
412 inline void SetLength(Type length) {
Normalize(); *
this *= length; }
419 inline TypedAngle<Type> AngleTo(
const TypedVector2& other)
const
421 const Type productOfMagnitudes(Magnitude() * other.Magnitude());
423 const Type value(
Dot(*
this, other) / productOfMagnitudes);
424 const Type clampedValue((value < Type(-1.0)) ? Type(-1.0) : (value > Type(1.0)) ? Type(1.0) : value);
433 inline TypedVector2<Type> DirectionTo(
const TypedVector2& other)
const
435 return (other - *
this).GetNormalized();
445 return (other - *
this).Magnitude();
454 inline Type SquaredDistanceTo(
const TypedVector2& other)
const
456 return (other - *
this).MagnitudeSquared();
488 #if defined(tb_righthanded_math)
493 static TypedVector3 Backward(
void) {
return -Forward(); }
499 #if defined(tb_visual_cpp)
500 #pragma warning(push)
501 #pragma warning(disable: 4201)
502 struct { Type x, y, z; };
505 struct { Type x, y, z; };
537 inline TypedVector3(
const Type valueX,
const Type valueY,
const Type valueZ) :
563 x(componentArray[0]),
564 y(componentArray[1]),
583 x(static_cast<Type>(other.x)),
584 y(static_cast<Type>(other.y)),
585 z(static_cast<Type>(other.z))
638 return (
true ==
operator==(other)) ? false :
true;
644 inline explicit operator const Type* (void)
const {
return mComponents; }
650 inline explicit operator Type* (void) {
return mComponents; }
657 return TypedVector3<ToType>(
static_cast<ToType
>(x),
static_cast<ToType
>(y),
static_cast<ToType
>(z));
663 inline const Type&
operator[](
const int index)
const {
return mComponents[index]; }
664 inline const Type&
operator[](
const std::size_t& index)
const {
return mComponents[index]; }
670 inline Type&
operator[](
const int index) {
return mComponents[index]; }
671 inline Type&
operator[](
const std::size_t& index) {
return mComponents[index]; }
713 #if defined(tb_with_math_operators)
726 inline TypedVector3& operator+=(
const TypedVector3& rightSide) { x += rightSide.x; y += rightSide.y; z += rightSide.z;
return *
this; }
736 inline TypedVector3& operator-=(
const TypedVector3& rightSide) { x -= rightSide.x; y -= rightSide.y; z -= rightSide.z;
return *
this; }
754 inline TypedVector3& operator*=(Type scalar) { x *= scalar; y *= scalar; z *= scalar;
return *
this; }
765 inline TypedVector3& operator/=(Type scalar) { x /= scalar; y /= scalar; z /= scalar;
return *
this; }
784 inline Type operator*(
const TypedVector3& rhs)
const {
return (x * rhs.x) + (y * rhs.y) + (z * rhs.z); }
796 return TypedVector3((y * rightSide.z) - (rightSide.y * z), -((x * rightSide.z) - (rightSide.x * z)), (x * rightSide.y) - (rightSide.x * y));
804 inline Type Magnitude(
void)
const {
return sqrt((x * x) + (y * y) + (z * z)); }
810 inline Type MagnitudeSquared(
void)
const {
return (x * x) + (y * y) + (z * z); }
820 const Type magnitude(Magnitude());
821 if (
true == tbMath::IsZero(magnitude)) {
return Zero(); }
822 return TypedVector3(x / magnitude, y / magnitude, z / magnitude);
828 inline TypedVector3 GetNormalized(Type& magnitude)
const
830 magnitude = (Magnitude());
831 if (
true == tbMath::IsZero(magnitude)) {
return Zero(); }
832 return TypedVector3(x / magnitude, y / magnitude, z / magnitude);
842 const Type magnitude(Magnitude());
843 if (
false == tbMath::IsZero(magnitude))
855 inline void Scale(Type scalar) { *
this *= scalar; }
864 inline void SetLength(
const Type length) {
Normalize(); *
this *= length; }
871 inline TypedAngle<Type> AngleTo(
const TypedVector3& other)
const
873 const Type productOfMagnitudes(Magnitude() * other.Magnitude());
875 const Type value(
Dot(*
this, other) / productOfMagnitudes);
876 const Type clampedValue((value < Type(-1.0)) ? Type(-1.0) : (value > Type(1.0)) ? Type(1.0) : value);
889 inline TypedVector3<Type> DirectionTo(
const TypedVector3& other)
const
891 return (other - *
this).GetNormalized();
901 return (other - *
this).Magnitude();
910 inline Type SquaredDistanceTo(
const TypedVector3& other)
const
912 return (other - *
this).MagnitudeSquared();
943 #if defined(tb_visual_cpp)
944 #pragma warning(push)
945 #pragma warning(disable: 4201)
946 struct { Type x, y, z, w; };
949 struct { Type x, y, z, w; };
983 inline TypedVector4(
const Type valueX,
const Type valueY,
const Type valueZ,
const Type valueW) :
1026 x(componentArray[0]),
1027 y(componentArray[1]),
1028 z(componentArray[2]),
1029 w(componentArray[3])
1048 x(static_cast<Type>(other.x)),
1049 y(static_cast<Type>(other.y)),
1050 z(static_cast<Type>(other.z)),
1051 w(static_cast<Type>(other.w))
1087 return (
true ==
IsEqual(x, other.x) &&
true ==
IsEqual(y, other.y) &&
1088 true ==
IsEqual(z, other.z) &&
true ==
IsEqual(w, other.w)) ? true :
false;
1097 return (
true ==
operator==(other)) ? false :
true;
1103 inline explicit operator const Type* (void)
const {
return mComponents; }
1109 inline explicit operator Type* (void) {
return mComponents; }
1116 return TypedVector4<ToType>(
static_cast<ToType
>(x),
static_cast<ToType
>(y),
static_cast<ToType
>(z),
static_cast<ToType
>(w));
1122 inline const Type&
operator[](
const int index)
const {
return mComponents[index]; }
1123 inline const Type&
operator[](
const std::size_t& index)
const {
return mComponents[index]; }
1129 inline Type&
operator[](
const int index) {
return mComponents[index]; }
1130 inline Type&
operator[](
const std::size_t& index) {
return mComponents[index]; }
1147 Vector4CrossProduct(&result, &leftSide, &rightSide);
1173 #if defined(tb_with_math_operators)
1183 inline TypedVector4& operator+=(
const TypedVector4& rightSide) { x += rightSide.x; y += rightSide.y; z += rightSide.z; w += rightSide.w;
return *
this; }
1193 inline TypedVector4& operator-=(
const TypedVector4& rightSide) { x -= rightSide.x; y -= rightSide.y; z -= rightSide.z; w -= rightSide.w;
return *
this; }
1199 inline TypedVector4 operator*(Type scalar)
const {
return TypedVector4(x * scalar, y * scalar, z * scalar, w * scalar); }
1205 friend TypedVector4 operator*(Type scalar,
const TypedVector4& rightSide) {
return TypedVector4(scalar * rightSide.x, scalar * rightSide.y, scalar * rightSide.z, scalar * rightSide.w); }
1211 inline TypedVector4& operator*=(Type scalar) { x *= scalar; y *= scalar; z *= scalar; w *= scalar;
return *
this; }
1216 inline TypedVector4 operator/(Type scalar)
const {
return TypedVector4(x / scalar, y / scalar, z / scalar, w / scalar); }
1222 inline TypedVector4& operator/=(Type scalar) { x /= scalar; y /= scalar; z /= scalar; w /= scalar;
return *
this; }
1227 friend TypedVector4 operator/(Type scalar,
const TypedVector4& rightSide) {
return TypedVector4(scalar / rightSide.x, scalar / rightSide.y, scalar / rightSide.z, scalar / rightSide.w); }
1237 inline Type operator*(
const TypedVector4& rightSide)
const {
return (x * rightSide.x) + (y * rightSide.y) + (z * rightSide.z) + (w * rightSide.w); }
1246 inline Type Magnitude(
void)
const {
return sqrt((x * x) + (y * y) + (z * z) + (w * w)); }
1252 inline Type MagnitudeSquared(
void)
const {
return (x * x) + (y * y) + (z * z) + (w * w); }
1260 const Type magnitude(Magnitude());
1261 if (
true ==
IsZero(magnitude)) {
return Zero(); }
1262 return TypedVector4(x / magnitude, y / magnitude, z / magnitude, w / magnitude);
1272 const Type magnitude(Magnitude());
1273 if (
false ==
IsZero(magnitude))
1286 inline void Scale(Type scalar) { *
this *= scalar; }
1295 inline void SetLength(Type length) {
Normalize(); *
this *= length; }
1304 inline TypedAngle<Type> AngleTo(
const TypedVector4& other)
const
1306 const Type productOfMagnitudes(Magnitude() * other.Magnitude());
1308 const Type value(
Dot(*
this, other) / productOfMagnitudes);
1309 const Type clampedValue((value < Type(-1.0)) ? Type(-1.0) : (value > Type(1.0)) ? Type(1.0) : value);
1318 inline TypedVector4<Type> DirectionTo(
const TypedVector4& other)
const
1320 return (other - *
this).GetNormalized();
1328 inline Type DistanceTo(
const TypedVector4& other)
const
1330 return (other - *
this).Magnitude();
1339 inline Type SquaredDistanceTo(
const TypedVector4& other)
const
1341 return (other - *
this).MagnitudeSquared();
1346 typedef TypedVector2<float> Vector2;
1347 typedef TypedVector3<float> Vector3;
1348 typedef TypedVector4<float> Vector4;
1366 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1367 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1368 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1370 result->x = leftSide->x + rightSide->x;
1371 result->y = leftSide->y + rightSide->y;
1380 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1381 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1382 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1384 result->x = leftSide->x + rightSide->x;
1385 result->y = leftSide->y + rightSide->y;
1386 result->z = leftSide->z + rightSide->z;
1395 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1396 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1397 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1399 result->x = leftSide->x + rightSide->x;
1400 result->y = leftSide->y + rightSide->y;
1401 result->z = leftSide->z + rightSide->z;
1402 result->w = leftSide->w + rightSide->w;
1418 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1419 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1420 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1422 result->x = leftSide->x - rightSide->x;
1423 result->y = leftSide->y - rightSide->y;
1432 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1433 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1434 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1436 result->x = leftSide->x - rightSide->x;
1437 result->y = leftSide->y - rightSide->y;
1438 result->z = leftSide->z - rightSide->z;
1447 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1448 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1449 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1451 result->x = leftSide->x - rightSide->x;
1452 result->y = leftSide->y - rightSide->y;
1453 result->z = leftSide->z - rightSide->z;
1454 result->w = leftSide->w - rightSide->w;
1469 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1470 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1472 result->x = input->x * scalar;
1473 result->y = input->y * scalar;
1482 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1483 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1485 result->x = input->x * scalar;
1486 result->y = input->y * scalar;
1487 result->z = input->z * scalar;
1496 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1497 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1499 result->x = input->x * scalar;
1500 result->y = input->y * scalar;
1501 result->z = input->z * scalar;
1502 result->w = input->w * scalar;
1517 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1518 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1520 result->x = input->x / scalar;
1521 result->y = input->y / scalar;
1530 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1531 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1533 result->x = input->x / scalar;
1534 result->y = input->y / scalar;
1535 result->z = input->z / scalar;
1544 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1545 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1547 result->x = input->x / scalar;
1548 result->y = input->y / scalar;
1549 result->z = input->z / scalar;
1550 result->w = input->w / scalar;
1564 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1565 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1567 result->x = -input->x;
1568 result->y = -input->y;
1577 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1578 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1580 result->x = -input->x;
1581 result->y = -input->y;
1582 result->z = -input->z;
1591 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1592 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1594 result->x = -input->x;
1595 result->y = -input->y;
1596 result->z = -input->z;
1597 result->w = -input->w;
1610 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1611 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1612 return (leftSide->x * rightSide->x) + (leftSide->y * rightSide->y);
1620 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1621 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1622 return (leftSide->x * rightSide->x) + (leftSide->y * rightSide->y) + (leftSide->z * rightSide->z);
1630 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1631 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1632 return (leftSide->x * rightSide->x) + (leftSide->y * rightSide->y) + (leftSide->z * rightSide->z) + (leftSide->w * rightSide->w);
1651 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1652 tb_error_if(
nullptr == leftSide,
"tbExternalError: Invalid parameter for leftSide, expected valid pointer.");
1653 tb_error_if(
nullptr == rightSide,
"tbExternalError: Invalid parameter for rightSide, expected valid pointer.");
1654 tb_error_if(leftSide == rightSide,
"tbExternalError: Invalid parameter; expected leftSide to be different from rightSide.");
1655 tb_error_if(result == leftSide || result == rightSide,
"Invalid parameter; expected result to be different than leftSide and rightSide");
1657 result->x = ((leftSide->y * rightSide->z) - (rightSide->y * leftSide->z));
1658 result->y = -(((leftSide->x * rightSide->z) - (rightSide->x * leftSide->z)));
1659 result->z = ((leftSide->x * rightSide->y) - (rightSide->x * leftSide->y));
1680 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1681 return sqrt((input->x * input->x) + (input->y * input->y));
1689 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1690 return std::sqrt((input->x * input->x) + (input->y * input->y) + (input->z * input->z));
1698 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1699 return sqrt((input->x * input->x) + (input->y * input->y) + (input->z * input->z) + (input->w * input->w));
1712 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1713 return (input->x * input->x) + (input->y * input->y);
1721 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1722 return (input->x * input->x) + (input->y * input->y) + (input->z * input->z);
1730 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1731 return (input->x * input->x) + (input->y * input->y) + (input->z * input->z) + (input->w * input->w);
1744 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1745 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1748 if (
true ==
IsZero(magnitude))
1750 result->x = Type(0);
1751 result->y = Type(0);
1755 result->x = input->x / magnitude;
1756 result->y = input->y / magnitude;
1766 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1767 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1770 if (
true ==
IsZero(magnitude))
1772 result->x = Type(0);
1773 result->y = Type(0);
1774 result->z = Type(0);
1778 result->x = input->x / magnitude;
1779 result->y = input->y / magnitude;
1780 result->z = input->z / magnitude;
1790 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1791 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1794 if (
true ==
IsZero(magnitude))
1796 result->x = Type(0);
1797 result->y = Type(0);
1798 result->z = Type(0);
1799 result->w = Type(0);
1803 result->x = input->x / magnitude;
1804 result->y = input->y / magnitude;
1805 result->z = input->z / magnitude;
1806 result->w = input->w / magnitude;
1824 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1825 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1828 if (
true ==
IsZero(magnitude))
1830 result->x = Type(0);
1831 result->y = Type(0);
1835 result->x = input->x / magnitude;
1836 result->y = input->y / magnitude;
1847 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1848 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1851 if (
true ==
IsZero(magnitude))
1853 result->x = Type(0);
1854 result->y = Type(0);
1855 result->z = Type(0);
1859 result->x = input->x / magnitude;
1860 result->y = input->y / magnitude;
1861 result->z = input->z / magnitude;
1872 tb_error_if(
nullptr == result,
"tbExternalError: Invalid parameter for result, expected valid pointer.");
1873 tb_error_if(
nullptr == input,
"tbExternalError: Invalid parameter for input, expected valid pointer.");
1876 if (
true ==
IsZero(magnitude))
1878 result->x = Type(0);
1879 result->y = Type(0);
1880 result->z = Type(0);
1881 result->w = Type(0);
1885 result->x = input->x / magnitude;
1886 result->y = input->y / magnitude;
1887 result->z = input->z / magnitude;
1888 result->w = input->w / magnitude;
1902 const Type clampedValue((value < Type(-1)) ? Type(-1) : (value > Type(1)) ? Type(1) : value);
1912 result.x = sin(orientation.
AsRadians());
1914 result.z = -cos(orientation.
AsRadians());
1924 result.x = sin(orientation.
AsRadians());
1925 result.y = -cos(orientation.
AsRadians());
1938 Vector3 vZAxis(0.0f, 0.0f, -1.0f);
1939 float orientation = acos((vZAxis.x * forward.x) + (vZAxis.y * forward.y) + (vZAxis.z * forward.z));
1940 if (forward.x < 0.0f)
1942 orientation = fabs(orientation -
kTwoPi);
1957 float orientation = acos((yAxis.x * forward.x) + (yAxis.y * forward.y));
1958 if (forward.x < 0.0f)
1960 orientation = fabs(orientation -
kTwoPi);
1971 output <<
"{ " << data.x <<
", " << data.y <<
" }";
1979 input >> token; data.x = tbCore::FromString<Type>(token);
1980 input >> token; data.y = tbCore::FromString<Type>(token);
1987 output <<
"{ " << data.x <<
", " << data.y <<
", " << data.z <<
" }";
1995 input >> token; data.x = tbCore::FromString<Type>(token);
1996 input >> token; data.y = tbCore::FromString<Type>(token);
1997 input >> token; data.z = tbCore::FromString<Type>(token);
2004 output <<
"{ " << data.x <<
", " << data.y <<
", " << data.z <<
", " << data.w <<
" }";
2012 input >> token; data.x = tbCore::FromString<Type>(token);
2013 input >> token; data.y = tbCore::FromString<Type>(token);
2014 input >> token; data.z = tbCore::FromString<Type>(token);
2015 input >> token; data.w = tbCore::FromString<Type>(token);
Definition: tb_angle.hpp:38
static TypedAngle Radians(const Type angleInRadians)
Definition: tb_angle.hpp:51
Type AsRadians(void) const
Definition: tb_angle.hpp:87
Definition: tb_vector.hpp:99
~TypedVector2(void)
Definition: tb_vector.hpp:196
TypedVector2(const SkipInitialization &fastAndStupid)
Definition: tb_vector.hpp:136
TypedVector2(const Type valueX, const Type valueY)
Definition: tb_vector.hpp:156
TypedVector2 & operator=(const TypedVector2 &other)
Definition: tb_vector.hpp:205
static TypedVector2 Normalize(const TypedVector2< Type > &value, Type &magnitude)
Definition: tb_vector.hpp:289
static Type Dot(const TypedVector2< Type > &leftSide, const TypedVector2< Type > &rightSide)
Definition: tb_vector.hpp:270
const Type & operator[](const int index) const
Definition: tb_vector.hpp:257
bool operator==(const TypedVector2 &other) const
Definition: tb_vector.hpp:221
TypedVector2(void)
Definition: tb_vector.hpp:144
TypedVector2(const TypedVector2 &other)
Definition: tb_vector.hpp:179
bool operator!=(const TypedVector2 &other) const
Definition: tb_vector.hpp:230
static TypedVector2 Normalize(const TypedVector2< Type > &value)
Definition: tb_vector.hpp:278
static TypedVector2 One(void)
Definition: tb_vector.hpp:109
Type & operator[](const int index)
Definition: tb_vector.hpp:264
static TypedVector2 Zero(void)
Definition: tb_vector.hpp:104
TypedVector2(const Type *componentArray)
Definition: tb_vector.hpp:167
Definition: tb_vector.hpp:472
bool operator!=(const TypedVector3 &other) const
Definition: tb_vector.hpp:636
static TypedVector3 One(void)
Definition: tb_vector.hpp:482
Type & operator[](const int index)
Definition: tb_vector.hpp:670
TypedVector3(const TypedVector3< Type > &other)
Definition: tb_vector.hpp:575
static TypedVector3 Cross(const TypedVector3< Type > &leftSide, const TypedVector3< Type > &rightSide)
Definition: tb_vector.hpp:685
bool operator==(const TypedVector3 &other) const
Definition: tb_vector.hpp:627
const Type & operator[](const int index) const
Definition: tb_vector.hpp:663
TypedVector3(void)
Definition: tb_vector.hpp:523
static Type Dot(const TypedVector3< Type > &leftSide, const TypedVector3< Type > &rightSide)
Definition: tb_vector.hpp:676
TypedVector3(const SkipInitialization &fastAndStupid)
Definition: tb_vector.hpp:515
static TypedVector3 Normalize(const TypedVector3< Type > &value)
Definition: tb_vector.hpp:695
~TypedVector3(void)
Definition: tb_vector.hpp:592
static TypedVector3 Normalize(const TypedVector3< Type > &value, Type &magnitude)
Definition: tb_vector.hpp:706
TypedVector3(const Type *componentArray)
Definition: tb_vector.hpp:562
static TypedVector3 Zero(void)
Definition: tb_vector.hpp:477
TypedVector3(const Type valueX, const Type valueY, const Type valueZ)
Definition: tb_vector.hpp:537
TypedVector3 & operator=(const TypedVector3 &other)
Definition: tb_vector.hpp:601
TypedVector3(const TypedVector2< Type > &other, const Type valueZ)
Definition: tb_vector.hpp:550
Definition: tb_vector.hpp:927
bool operator!=(const TypedVector4 &other) const
Definition: tb_vector.hpp:1095
static TypedVector4 One(void)
Definition: tb_vector.hpp:937
~TypedVector4(void)
Definition: tb_vector.hpp:1058
TypedVector4(const TypedVector4 &other)
Definition: tb_vector.hpp:1039
static TypedVector4 Normalize(const TypedVector4< Type > &value)
Definition: tb_vector.hpp:1154
TypedVector4(const TypedVector3< Type > &other, const Type valueW)
Definition: tb_vector.hpp:1012
Type & operator[](const int index)
Definition: tb_vector.hpp:1129
const Type & operator[](const int index) const
Definition: tb_vector.hpp:1122
TypedVector4(const SkipInitialization &fastAndStupid)
Definition: tb_vector.hpp:959
TypedVector4(const Type valueX, const Type valueY, const Type valueZ, const Type valueW)
Definition: tb_vector.hpp:983
TypedVector4(const TypedVector2< Type > &other, const Type valueZ, const Type valueW)
Definition: tb_vector.hpp:998
static TypedVector4 Normalize(const TypedVector4< Type > &value, Type &magnitude)
Definition: tb_vector.hpp:1165
TypedVector4 & operator=(const TypedVector4 &other)
Definition: tb_vector.hpp:1067
TypedVector4(const Type *componentArray)
Definition: tb_vector.hpp:1025
static TypedVector4 Cross(const TypedVector4< Type > &leftSide, const TypedVector4< Type > &rightSide)
Definition: tb_vector.hpp:1144
bool operator==(const TypedVector4 &other) const
Definition: tb_vector.hpp:1085
static TypedVector4 Zero(void)
Definition: tb_vector.hpp:932
static Type Dot(const TypedVector4< Type > &leftSide, const TypedVector4< Type > &rightSide)
Definition: tb_vector.hpp:1135
TypedVector4(void)
Definition: tb_vector.hpp:967
#define tb_unused(parameter)
Definition: tb_defines.hpp:25
#define tb_error_if(errorTest, message,...)
Definition: tb_error.hpp:42
std::string String
Definition: tb_string.hpp:302
Contains objects and functions for dealing with Vector and Matrix math.
Type Vector3DotProduct(const TypedVector3< Type > *leftSide, const TypedVector3< Type > *rightSide)
Definition: tb_vector.hpp:1618
VectorComponent
Definition: tb_vector.hpp:87
@ kComponentY
Definition: tb_vector.hpp:89
@ kComponentZ
Definition: tb_vector.hpp:90
@ kComponentW
Definition: tb_vector.hpp:91
@ kComponentX
Definition: tb_vector.hpp:88
Type Vector3MagnitudeSquared(const TypedVector3< Type > *input)
Definition: tb_vector.hpp:1719
Vector4 * Vector4Add(Vector4 *result, const Vector4 *leftSide, const Vector4 *rightSide)
Definition: tb_vector.hpp:1393
TypedVector4< Type > * Vector4NormalizeMagnitude(TypedVector4< Type > *result, const TypedVector4< Type > *value, Type &magnitude)
Definition: tb_vector.hpp:1869
TypedVector4< Type > * Vector4Normalize(TypedVector4< Type > *result, const TypedVector4< Type > *value)
Definition: tb_vector.hpp:1788
Vector3 * Vector3Negate(Vector3 *result, const Vector3 *input)
Definition: tb_vector.hpp:1575
Type Vector4DotProduct(const TypedVector4< Type > *leftSide, const TypedVector4< Type > *rightSide)
Definition: tb_vector.hpp:1628
Type Vector2MagnitudeSquared(const TypedVector2< Type > *input)
Definition: tb_vector.hpp:1710
static const float kTwoPi
A constant for Pi * 2 stored in a float.
Definition: tb_constants.hpp:20
std::ostream & operator<<(std::ostream &output, const tbMath::TypedAngle< Type > &angle)
Definition: tb_angle.hpp:203
bool IsZero(const Type &value, const Type tolerance=tbMath::kTolerance)
Definition: tb_math.hpp:74
static Angle ForwardVector2ToRotation(const Vector2 &forward)
Definition: tb_vector.hpp:1954
bool IsEqual(const Type &leftValue, const Type &rightValue, const Type tolerance=tbMath::kTolerance)
Definition: tb_math.hpp:56
Vector4 * Vector4Scale(Vector4 *result, const Vector4 *input, const float scalar)
Definition: tb_vector.hpp:1494
Vector4 * Vector4Subtract(Vector4 *result, const Vector4 *leftSide, const Vector4 *rightSide)
Definition: tb_vector.hpp:1445
Vector2 * Vector2ScaleDivide(Vector2 *result, const Vector2 *input, const float scalar)
Definition: tb_vector.hpp:1515
Type Vector3Magnitude(const TypedVector3< Type > *input)
Definition: tb_vector.hpp:1687
Vector3 * Vector3ScaleDivide(Vector3 *result, const Vector3 *input, const float scalar)
Definition: tb_vector.hpp:1528
Vector2 * Vector2Subtract(Vector2 *result, const Vector2 *leftSide, const Vector2 *rightSide)
Definition: tb_vector.hpp:1416
Type Vector4Magnitude(const TypedVector4< Type > *input)
Definition: tb_vector.hpp:1696
TypedVector2< Type > * Vector2NormalizeMagnitude(TypedVector2< Type > *result, const TypedVector2< Type > *value, Type &magnitude)
Definition: tb_vector.hpp:1821
TypedAngle< Type > Vector3AngleBetween(const TypedVector3< Type > *left, const TypedVector3< Type > *right)
Definition: tb_vector.hpp:1897
Type Vector4MagnitudeSquared(const TypedVector4< Type > *input)
Definition: tb_vector.hpp:1728
Vector2 * Vector2Scale(Vector2 *result, const Vector2 *input, const float scalar)
Definition: tb_vector.hpp:1467
Vector3 * Vector3Scale(Vector3 *result, const Vector3 *input, const float scalar)
Definition: tb_vector.hpp:1480
TypedVector2< Type > * Vector2Normalize(TypedVector2< Type > *result, const TypedVector2< Type > *value)
Definition: tb_vector.hpp:1742
Type Vector2Magnitude(const TypedVector2< Type > *input)
Definition: tb_vector.hpp:1678
Vector3 * Vector3Add(Vector3 *result, const Vector3 *leftSide, const Vector3 *rightSide)
Definition: tb_vector.hpp:1378
static Vector3 & RotationXZToForwardVector3(Vector3 &result, const Angle &orientation)
Definition: tb_vector.hpp:1910
SkipInitialization
Definition: tb_vector.hpp:80
Vector4 * Vector4ScaleDivide(Vector4 *result, const Vector4 *input, const float scalar)
Definition: tb_vector.hpp:1542
Vector4 * Vector4Negate(Vector4 *result, const Vector4 *input)
Definition: tb_vector.hpp:1589
Vector2 * Vector2Negate(Vector2 *result, const Vector2 *input)
Definition: tb_vector.hpp:1562
Vector3 * Vector3Subtract(Vector3 *result, const Vector3 *leftSide, const Vector3 *rightSide)
Definition: tb_vector.hpp:1430
Vector2 * Vector2Add(Vector2 *result, const Vector2 *leftSide, const Vector2 *rightSide)
Definition: tb_vector.hpp:1364
static Vector2 & RotationToForwardVector2(Vector2 &result, const Angle &orientation)
Definition: tb_vector.hpp:1922
TypedVector3< Type > * Vector3NormalizeMagnitude(TypedVector3< Type > *result, const TypedVector3< Type > *value, Type &magnitude)
Definition: tb_vector.hpp:1844
TypedVector3< Type > * Vector3CrossProduct(TypedVector3< Type > *result, const TypedVector3< Type > *leftSide, const TypedVector3< Type > *rightSide)
Definition: tb_vector.hpp:1648
Type Vector2DotProduct(const TypedVector2< Type > *leftSide, const TypedVector2< Type > *rightSide)
Definition: tb_vector.hpp:1608
static Angle ForwardVector3ToRotationXZ(const Vector3 &forward)
Definition: tb_vector.hpp:1936
TypedVector3< Type > * Vector3Normalize(TypedVector3< Type > *result, const TypedVector3< Type > *value)
Definition: tb_vector.hpp:1764
Here is some information about the primary namespace.
Definition: tb_application_dialog.hpp:22