Vec3.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #ifndef ANKI_MATH_VEC3_H
  2. #define ANKI_MATH_VEC3_H
  3. #include "anki/math/CommonIncludes.h"
  4. namespace anki {
  5. /// @addtogroup Math
  6. /// @{
  7. /// 3D vector. One of the most used classes
  8. class Vec3
  9. {
  10. public:
  11. /// @name Constructors
  12. /// @{
  13. explicit Vec3();
  14. explicit Vec3(const F32 x, const F32 y, const F32 z);
  15. explicit Vec3(const F32 f);
  16. explicit Vec3(const F32 arr[]);
  17. explicit Vec3(const Vec2& v2, const F32 z);
  18. Vec3(const Vec3& b);
  19. explicit Vec3(const Vec4& v4);
  20. explicit Vec3(const Quat& q);
  21. /// @}
  22. /// @name Accessors
  23. /// @{
  24. F32& x();
  25. F32 x() const;
  26. F32& y();
  27. F32 y() const;
  28. F32& z();
  29. F32 z() const;
  30. F32& operator[](const U i);
  31. F32 operator[](const U i) const;
  32. Vec2 xy() const;
  33. /// @}
  34. /// @name Operators with same type
  35. /// @{
  36. Vec3& operator=(const Vec3& b);
  37. Vec3 operator+(const Vec3& b) const;
  38. Vec3& operator+=(const Vec3& b);
  39. Vec3 operator-(const Vec3& b) const;
  40. Vec3& operator-=(const Vec3& b);
  41. Vec3 operator*(const Vec3& b) const;
  42. Vec3& operator*=(const Vec3& b);
  43. Vec3 operator/(const Vec3& b) const;
  44. Vec3& operator/=(const Vec3& b);
  45. Vec3 operator-() const;
  46. Bool operator==(const Vec3& b) const;
  47. Bool operator!=(const Vec3& b) const;
  48. Bool operator<(const Vec3& b) const;
  49. Bool operator<=(const Vec3& b) const;
  50. Bool operator>(const Vec3& b) const;
  51. Bool operator>=(const Vec3& b) const;
  52. /// @}
  53. /// @name Operators with F32
  54. /// @{
  55. Vec3 operator+(const F32 f) const;
  56. Vec3& operator+=(const F32 f);
  57. Vec3 operator-(const F32 f) const;
  58. Vec3& operator-=(const F32 f);
  59. Vec3 operator*(const F32 f) const;
  60. Vec3& operator*=(const F32 f);
  61. Vec3 operator/(const F32 f) const;
  62. Vec3& operator/=(const F32 f);
  63. /// @}
  64. /// @name Operators with other types
  65. /// @{
  66. Vec3 operator*(const Mat3& m3) const;
  67. /// @}
  68. /// @name Other
  69. /// @{
  70. F32 dot(const Vec3& b) const; ///< 3 muls, 2 adds
  71. Vec3 cross(const Vec3& b) const; ///< 6 muls, 3 adds
  72. F32 getLength() const;
  73. F32 getLengthSquared() const;
  74. F32 getDistanceSquared(const Vec3& b) const;
  75. void normalize();
  76. Vec3 getNormalized() const;
  77. Vec3 getProjection(const Vec3& toThis) const;
  78. /// Returns q * this * q.Conjucated() aka returns a rotated this.
  79. /// 18 muls, 12 adds
  80. Vec3 getRotated(const Quat& q) const;
  81. void rotate(const Quat& q);
  82. Vec3 lerp(const Vec3& v1, F32 t) const; ///< Return lerp(this, v1, t)
  83. /// @}
  84. /// @name Transformations
  85. /// The faster way is by far the Mat4 * Vec3 or the
  86. /// getTransformed(const Vec3&, const Mat3&)
  87. /// @{
  88. Vec3 getTransformed(const Vec3& translate, const Mat3& rotate,
  89. F32 scale) const;
  90. void transform(const Vec3& translate, const Mat3& rotate, F32 scale);
  91. Vec3 getTransformed(const Vec3& translate, const Mat3& rotate) const;
  92. void transform(const Vec3& translate, const Mat3& rotate);
  93. Vec3 getTransformed(const Vec3& translate, const Quat& rotate,
  94. F32 scale) const;
  95. void transform(const Vec3& translate, const Quat& rotate, F32 scale);
  96. Vec3 getTransformed(const Vec3& translate, const Quat& rotate) const;
  97. void transform(const Vec3& translate, const Quat& rotate);
  98. Vec3 getTransformed(const Mat4& transform) const; ///< 9 muls, 9 adds
  99. void transform(const Mat4& transform);
  100. Vec3 getTransformed(const Transform& transform) const;
  101. void transform(const Transform& transform);
  102. /// @}
  103. /// @name Friends
  104. /// @{
  105. friend Vec3 operator+(const F32 f, const Vec3& v);
  106. friend Vec3 operator-(const F32 f, const Vec3& v);
  107. friend Vec3 operator*(const F32 f, const Vec3& v);
  108. friend Vec3 operator/(const F32 f, const Vec3& v);
  109. friend std::ostream& operator<<(std::ostream& s, const Vec3& v);
  110. /// @}
  111. private:
  112. /// @name Data
  113. /// @{
  114. union
  115. {
  116. struct
  117. {
  118. F32 x, y, z;
  119. } vec;
  120. Array<F32, 3> arr;
  121. };
  122. /// @}
  123. };
  124. /// @}
  125. static_assert(sizeof(Vec3) == sizeof(F32) * 3, "Incorrect size");
  126. } // end namespace
  127. #include "anki/math/Vec3.inl.h"
  128. #endif