2
0

Vector.h 4.2 KB

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