Vector.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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 &) = default;
  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 &) = default;
  71. /// Multiply vector with float
  72. inline Vector operator * (const float inV2) const
  73. {
  74. Vector v;
  75. for (uint r = 0; r < Rows; ++r)
  76. v.mF32[r] = mF32[r] * inV2;
  77. return v;
  78. }
  79. inline Vector & operator *= (const float inV2)
  80. {
  81. for (uint r = 0; r < Rows; ++r)
  82. mF32[r] *= inV2;
  83. return *this;
  84. }
  85. /// Multiply vector with float
  86. inline friend Vector operator * (const float inV1, const Vector &inV2)
  87. {
  88. return inV2 * inV1;
  89. }
  90. /// Divide vector by float
  91. inline Vector operator / (float inV2) const
  92. {
  93. Vector v;
  94. for (uint r = 0; r < Rows; ++r)
  95. v.mF32[r] = mF32[r] / inV2;
  96. return v;
  97. }
  98. inline Vector & operator /= (float inV2)
  99. {
  100. for (uint r = 0; r < Rows; ++r)
  101. mF32[r] /= inV2;
  102. return *this;
  103. }
  104. /// Add two float vectors (component wise)
  105. inline Vector operator + (const Vector &inV2) const
  106. {
  107. Vector v;
  108. for (uint r = 0; r < Rows; ++r)
  109. v.mF32[r] = mF32[r] + inV2.mF32[r];
  110. return v;
  111. }
  112. inline Vector & operator += (const Vector &inV2)
  113. {
  114. for (uint r = 0; r < Rows; ++r)
  115. mF32[r] += inV2.mF32[r];
  116. return *this;
  117. }
  118. /// Negate
  119. inline Vector operator - () const
  120. {
  121. Vector v;
  122. for (uint r = 0; r < Rows; ++r)
  123. v.mF32[r] = -mF32[r];
  124. return v;
  125. }
  126. /// Subtract two float vectors (component wise)
  127. inline Vector operator - (const Vector &inV2) const
  128. {
  129. Vector v;
  130. for (uint r = 0; r < Rows; ++r)
  131. v.mF32[r] = mF32[r] - inV2.mF32[r];
  132. return v;
  133. }
  134. inline Vector & operator -= (const Vector &inV2)
  135. {
  136. for (uint r = 0; r < Rows; ++r)
  137. mF32[r] -= inV2.mF32[r];
  138. return *this;
  139. }
  140. /// Dot product
  141. inline float Dot(const Vector &inV2) const
  142. {
  143. float dot = 0.0f;
  144. for (uint r = 0; r < Rows; ++r)
  145. dot += mF32[r] * inV2.mF32[r];
  146. return dot;
  147. }
  148. /// Squared length of vector
  149. inline float LengthSq() const
  150. {
  151. return Dot(*this);
  152. }
  153. /// Length of vector
  154. inline float Length() const
  155. {
  156. return sqrt(LengthSq());
  157. }
  158. /// Check if vector is normalized
  159. inline bool IsNormalized(float inToleranceSq = 1.0e-6f)
  160. {
  161. return abs(LengthSq() - 1.0f) <= inToleranceSq;
  162. }
  163. /// Normalize vector
  164. inline Vector Normalized() const
  165. {
  166. return *this / Length();
  167. }
  168. /// To String
  169. friend ostream & operator << (ostream &inStream, const Vector &inV)
  170. {
  171. inStream << "[";
  172. for (uint i = 0; i < Rows - 1; ++i)
  173. inStream << inV.mF32[i] << ", ";
  174. inStream << inV.mF32[Rows - 1] << "]";
  175. return inStream;
  176. }
  177. float mF32[Rows];
  178. };
  179. JPH_NAMESPACE_END