Vector.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. JPH_NAMESPACE_BEGIN
  6. /// Templatized vector class
  7. template <uint Rows>
  8. class [[nodiscard]] Vector
  9. {
  10. public:
  11. /// Constructor
  12. inline Vector() = default;
  13. inline Vector(const Vector &inRHS) { *this = inRHS; }
  14. /// Dimensions
  15. inline uint GetRows() const { return Rows; }
  16. /// Vector with all zeros
  17. inline void SetZero()
  18. {
  19. for (uint r = 0; r < Rows; ++r)
  20. mF32[r] = 0.0f;
  21. }
  22. inline static Vector sZero() { Vector v; v.SetZero(); return v; }
  23. /// Copy a (part) of another vector into this vector
  24. template <class OtherVector>
  25. void CopyPart(const OtherVector &inV, uint inSourceRow, uint inNumRows, uint inDestRow)
  26. {
  27. for (uint r = 0; r < inNumRows; ++r)
  28. mF32[inDestRow + r] = inV[inSourceRow + r];
  29. }
  30. /// Get float component by index
  31. inline float operator [] (uint inCoordinate) const
  32. {
  33. JPH_ASSERT(inCoordinate < Rows);
  34. return mF32[inCoordinate];
  35. }
  36. inline float & operator [] (uint inCoordinate)
  37. {
  38. JPH_ASSERT(inCoordinate < Rows);
  39. return mF32[inCoordinate];
  40. }
  41. /// Comparison
  42. inline bool operator == (const Vector &inV2) const
  43. {
  44. for (uint r = 0; r < Rows; ++r)
  45. if (mF32[r] != inV2.mF32[r])
  46. return false;
  47. return true;
  48. }
  49. inline bool operator != (const Vector &inV2) const
  50. {
  51. for (uint r = 0; r < Rows; ++r)
  52. if (mF32[r] != inV2.mF32[r])
  53. return true;
  54. return false;
  55. }
  56. /// Test if vector consists of all zeros
  57. inline bool IsZero() const
  58. {
  59. for (uint r = 0; r < Rows; ++r)
  60. if (mF32[r] != 0.0f)
  61. return false;
  62. return true;
  63. }
  64. /// Test if two vectors are close to each other
  65. inline bool IsClose(const Vector &inV2, float inMaxDistSq = 1.0e-12f)
  66. {
  67. return (inV2 - *this).LengthSq() <= inMaxDistSq;
  68. }
  69. /// Assignment
  70. inline Vector & operator = (const Vector &inV2)
  71. {
  72. for (uint r = 0; r < Rows; ++r)
  73. mF32[r] = inV2.mF32[r];
  74. return *this;
  75. }
  76. /// Multiply vector with float
  77. inline Vector operator * (const float inV2) const
  78. {
  79. Vector v;
  80. for (uint r = 0; r < Rows; ++r)
  81. v.mF32[r] = mF32[r] * inV2;
  82. return v;
  83. }
  84. inline Vector & operator *= (const float inV2)
  85. {
  86. for (uint r = 0; r < Rows; ++r)
  87. mF32[r] *= inV2;
  88. return *this;
  89. }
  90. /// Multiply vector with float
  91. inline friend Vector operator * (const float inV1, const Vector &inV2)
  92. {
  93. return inV2 * inV1;
  94. }
  95. /// Divide vector by float
  96. inline Vector operator / (float inV2) const
  97. {
  98. Vector v;
  99. for (uint r = 0; r < Rows; ++r)
  100. v.mF32[r] = mF32[r] / inV2;
  101. return v;
  102. }
  103. /// Add two float vectors (component wise)
  104. inline Vector operator + (const Vector &inV2) const
  105. {
  106. Vector v;
  107. for (uint r = 0; r < Rows; ++r)
  108. v.mF32[r] = mF32[r] + inV2.mF32[r];
  109. return v;
  110. }
  111. inline Vector & operator += (const Vector &inV2)
  112. {
  113. for (uint r = 0; r < Rows; ++r)
  114. mF32[r] += inV2.mF32[r];
  115. return *this;
  116. }
  117. /// Negate
  118. inline Vector operator - () const
  119. {
  120. Vector v;
  121. for (uint r = 0; r < Rows; ++r)
  122. v.mF32[r] = -mF32[r];
  123. return v;
  124. }
  125. /// Subtract two float vectors (component wise)
  126. inline Vector operator - (const Vector &inV2) const
  127. {
  128. Vector v;
  129. for (uint r = 0; r < Rows; ++r)
  130. v.mF32[r] = mF32[r] - inV2.mF32[r];
  131. return v;
  132. }
  133. inline Vector & operator -= (const Vector &inV2)
  134. {
  135. for (uint r = 0; r < Rows; ++r)
  136. mF32[r] -= inV2.mF32[r];
  137. return *this;
  138. }
  139. /// Dot product
  140. inline float Dot(const Vector &inV2) const
  141. {
  142. float dot = 0.0f;
  143. for (uint r = 0; r < Rows; ++r)
  144. dot += mF32[r] * inV2.mF32[r];
  145. return dot;
  146. }
  147. /// Squared length of vector
  148. inline float LengthSq() const
  149. {
  150. return Dot(*this);
  151. }
  152. /// Length of vector
  153. inline float Length() const
  154. {
  155. return sqrt(LengthSq());
  156. }
  157. /// Check if vector is normalized
  158. inline bool IsNormalized(float inToleranceSq = 1.0e-6f)
  159. {
  160. return abs(LengthSq() - 1.0f) <= inToleranceSq;
  161. }
  162. /// Normalize vector
  163. inline Vector Normalized() const
  164. {
  165. return *this / Length();
  166. }
  167. /// To String
  168. friend ostream & operator << (ostream &inStream, const Vector &inV)
  169. {
  170. inStream << "[";
  171. for (uint i = 0; i < Rows - 1; ++i)
  172. inStream << inV.mF32[i] << ", ";
  173. inStream << inV.mF32[Rows - 1] << "]";
  174. return inStream;
  175. }
  176. float mF32[Rows];
  177. };
  178. JPH_NAMESPACE_END