2
0

Vector.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. inline Vector & operator /= (float inV2)
  104. {
  105. for (uint r = 0; r < Rows; ++r)
  106. mF32[r] /= inV2;
  107. return *this;
  108. }
  109. /// Add two float vectors (component wise)
  110. inline Vector operator + (const Vector &inV2) const
  111. {
  112. Vector v;
  113. for (uint r = 0; r < Rows; ++r)
  114. v.mF32[r] = mF32[r] + inV2.mF32[r];
  115. return v;
  116. }
  117. inline Vector & operator += (const Vector &inV2)
  118. {
  119. for (uint r = 0; r < Rows; ++r)
  120. mF32[r] += inV2.mF32[r];
  121. return *this;
  122. }
  123. /// Negate
  124. inline Vector operator - () const
  125. {
  126. Vector v;
  127. for (uint r = 0; r < Rows; ++r)
  128. v.mF32[r] = -mF32[r];
  129. return v;
  130. }
  131. /// Subtract two float vectors (component wise)
  132. inline Vector operator - (const Vector &inV2) const
  133. {
  134. Vector v;
  135. for (uint r = 0; r < Rows; ++r)
  136. v.mF32[r] = mF32[r] - inV2.mF32[r];
  137. return v;
  138. }
  139. inline Vector & operator -= (const Vector &inV2)
  140. {
  141. for (uint r = 0; r < Rows; ++r)
  142. mF32[r] -= inV2.mF32[r];
  143. return *this;
  144. }
  145. /// Dot product
  146. inline float Dot(const Vector &inV2) const
  147. {
  148. float dot = 0.0f;
  149. for (uint r = 0; r < Rows; ++r)
  150. dot += mF32[r] * inV2.mF32[r];
  151. return dot;
  152. }
  153. /// Squared length of vector
  154. inline float LengthSq() const
  155. {
  156. return Dot(*this);
  157. }
  158. /// Length of vector
  159. inline float Length() const
  160. {
  161. return sqrt(LengthSq());
  162. }
  163. /// Check if vector is normalized
  164. inline bool IsNormalized(float inToleranceSq = 1.0e-6f)
  165. {
  166. return abs(LengthSq() - 1.0f) <= inToleranceSq;
  167. }
  168. /// Normalize vector
  169. inline Vector Normalized() const
  170. {
  171. return *this / Length();
  172. }
  173. /// To String
  174. friend ostream & operator << (ostream &inStream, const Vector &inV)
  175. {
  176. inStream << "[";
  177. for (uint i = 0; i < Rows - 1; ++i)
  178. inStream << inV.mF32[i] << ", ";
  179. inStream << inV.mF32[Rows - 1] << "]";
  180. return inStream;
  181. }
  182. float mF32[Rows];
  183. };
  184. JPH_NAMESPACE_END