Vec3.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  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 template. One of the most used classes
  8. template<typename T>
  9. class TVec3
  10. {
  11. /// @name Friends
  12. /// @{
  13. template<typename Y>
  14. friend TVec3<Y> operator+(const Y f, const TVec3<Y>& v);
  15. template<typename Y>
  16. friend TVec3<Y> operator-(const Y f, const TVec3<Y>& v);
  17. template<typename Y>
  18. friend TVec3<Y> operator*(const Y f, const TVec3<Y>& v);
  19. template<typename Y>
  20. friend TVec3<Y> operator/(const Y f, const TVec3<Y>& v);
  21. /// @}
  22. public:
  23. /// @name Constructors
  24. /// @{
  25. explicit TVec3()
  26. {}
  27. explicit TVec3(const T x_, const T y_, const T z_)
  28. {
  29. x() = x_;
  30. y() = y_;
  31. z() = z_;
  32. }
  33. explicit TVec3(const T f)
  34. {
  35. arr[0] = arr[1] = arr[2] = f;
  36. }
  37. explicit TVec3(const T arr_[])
  38. {
  39. arr[0] = arr_[0];
  40. arr[1] = arr_[1];
  41. arr[2] = arr_[2];
  42. }
  43. explicit TVec3(const TVec2<T>& v2, const T z_)
  44. {
  45. x() = v2.x();
  46. y() = v2.y();
  47. z() = z_;
  48. }
  49. TVec3(const TVec3& b)
  50. {
  51. arr[0] = b.arr[0];
  52. arr[1] = b.arr[1];
  53. arr[2] = b.arr[2];
  54. }
  55. explicit TVec3(const TVec4<T>& v4)
  56. {
  57. arr[0] = v4[0];
  58. arr[1] = v4[1];
  59. arr[2] = v4[2];
  60. }
  61. explicit TVec3(const TQuat<T>& q)
  62. {
  63. x() = q.x();
  64. y() = q.y();
  65. z() = q.z();
  66. }
  67. /// @}
  68. /// @name Accessors
  69. /// @{
  70. T& x()
  71. {
  72. return vec.x;
  73. }
  74. T x() const
  75. {
  76. return vec.x;
  77. }
  78. T& y()
  79. {
  80. return vec.y;
  81. }
  82. T y() const
  83. {
  84. return vec.y;
  85. }
  86. T& z()
  87. {
  88. return vec.z;
  89. }
  90. T z() const
  91. {
  92. return vec.z;
  93. }
  94. T& operator[](const U i)
  95. {
  96. return arr[i];
  97. }
  98. T operator[](const U i) const
  99. {
  100. return arr[i];
  101. }
  102. TVec2<T> xy() const
  103. {
  104. return TVec2<T>(x(), y());
  105. }
  106. /// @}
  107. /// @name Operators with same type
  108. /// @{
  109. TVec3& operator=(const TVec3& b)
  110. {
  111. arr[0] = b.arr[0];
  112. arr[1] = b.arr[1];
  113. arr[2] = b.arr[2];
  114. return (*this);
  115. }
  116. TVec3 operator+(const TVec3& b) const
  117. {
  118. return TVec3(x() + b.x(), y() + b.y(), z() + b.z());
  119. }
  120. TVec3& operator+=(const TVec3& b)
  121. {
  122. x() += b.x();
  123. y() += b.y();
  124. z() += b.z();
  125. return *this;
  126. }
  127. TVec3 operator-(const TVec3& b) const
  128. {
  129. return TVec3(x() - b.x(), y() - b.y(), z() - b.z());
  130. }
  131. TVec3& operator-=(const TVec3& b)
  132. {
  133. x() -= b.x();
  134. y() -= b.y();
  135. z() -= b.z();
  136. return (*this);
  137. }
  138. TVec3 operator*(const TVec3& b) const
  139. {
  140. return TVec3(x() * b.x(), y() * b.y(), z() * b.z());
  141. }
  142. TVec3& operator*=(const TVec3& b)
  143. {
  144. x() *= b.x();
  145. y() *= b.y();
  146. z() *= b.z();
  147. return (*this);
  148. }
  149. TVec3 operator/(const TVec3& b) const
  150. {
  151. return TVec3(x() / b.x(), y() / b.y(), z() / b.z());
  152. }
  153. TVec3& operator/=(const TVec3& b)
  154. {
  155. x() /= b.x();
  156. y() /= b.y();
  157. z() /= b.z();
  158. return (*this);
  159. }
  160. TVec3 operator-() const
  161. {
  162. return TVec3(-x(), -y(), -z());
  163. }
  164. Bool operator==(const TVec3& b) const
  165. {
  166. return isZero<T>(x() - b.x())
  167. && isZero<T>(y() - b.y())
  168. && isZero<T>(z() - b.z());
  169. }
  170. Bool operator!=(const TVec3& b) const
  171. {
  172. return !operator==(b);
  173. }
  174. Bool operator<(const TVec3& b) const
  175. {
  176. return x() < b.x() && y() < b.y() && z() < b.z();
  177. }
  178. Bool operator<=(const TVec3& b) const
  179. {
  180. return x() <= b.x() && y() <= b.y() && z() <= b.z();
  181. }
  182. Bool operator>(const TVec3& b) const
  183. {
  184. return x() > b.x() && y() > b.y() && z() > b.z();
  185. }
  186. Bool operator>=(const TVec3& b) const
  187. {
  188. return x() >= b.x() && y() >= b.y() && z() >= b.z();
  189. }
  190. /// @}
  191. /// @name Operators with T
  192. /// @{
  193. TVec3 operator+(const T f) const
  194. {
  195. return (*this) + TVec3(f);
  196. }
  197. TVec3& operator+=(const T f)
  198. {
  199. (*this) += TVec3(f);
  200. return (*this);
  201. }
  202. TVec3 operator-(const T f) const
  203. {
  204. return (*this) - TVec3(f);
  205. }
  206. TVec3& operator-=(const T f)
  207. {
  208. (*this) -= TVec3(f);
  209. return (*this);
  210. }
  211. TVec3 operator*(const T f) const
  212. {
  213. return (*this) * TVec3(f);
  214. }
  215. TVec3& operator*=(const T f)
  216. {
  217. (*this) *= TVec3(f);
  218. return (*this);
  219. }
  220. TVec3 operator/(const T f) const
  221. {
  222. return (*this) / TVec3(f);
  223. }
  224. TVec3& operator/=(const T f)
  225. {
  226. (*this) /= TVec3(f);
  227. return (*this);
  228. }
  229. /// @}
  230. /// @name Operators with other types
  231. /// @{
  232. TVec3 operator*(const TMat3<T>& m3) const
  233. {
  234. ANKI_ASSERT(0 && "TODO");
  235. return TVec3(0.0);
  236. }
  237. /// @}
  238. /// @name Other
  239. /// @{
  240. /// 3 muls, 2 adds
  241. T dot(const TVec3& b) const
  242. {
  243. return x() * b.x() + y() * b.y() + z() * b.z();
  244. }
  245. /// 6 muls, 3 adds
  246. TVec3 cross(const TVec3& b) const
  247. {
  248. return TVec3(y() * b.z() - z() * b.y(),
  249. z() * b.x() - x() * b.z(),
  250. x() * b.y() - y() * b.x());
  251. }
  252. T getLengthSquared() const
  253. {
  254. return x() * x() + y() * y() + z() * z();
  255. }
  256. T getLength() const
  257. {
  258. return sqrt(getLengthSquared());
  259. }
  260. T getDistanceSquared(const TVec3& b) const
  261. {
  262. return ((*this) - b).getLengthSquared();
  263. }
  264. void normalize()
  265. {
  266. (*this) /= getLength();
  267. }
  268. TVec3 getNormalized() const
  269. {
  270. return (*this) / getLength();
  271. }
  272. TVec3 getProjection(const TVec3& toThis) const
  273. {
  274. return toThis * ((*this).dot(toThis) / (toThis.dot(toThis)));
  275. }
  276. /// Returns q * this * q.Conjucated() aka returns a rotated this.
  277. /// 18 muls, 12 adds
  278. TVec3 getRotated(const TQuat<T>& q) const
  279. {
  280. ANKI_ASSERT(isZero<T>(1.0 - q.getLength())); // Not normalized quat
  281. TVec3 qXyz(q);
  282. return
  283. (*this) + qXyz.cross(qXyz.cross((*this)) + (*this) * q.w()) * 2.0;
  284. }
  285. void rotate(const TQuat<T>& q)
  286. {
  287. (*this) = getRotated(q);
  288. }
  289. /// Return lerp(this, v1, t)
  290. TVec3 lerp(const TVec3& v1, T t) const
  291. {
  292. return ((*this) * (1.0 - t)) + (v1 * t);
  293. }
  294. /// @}
  295. /// @name Transformations
  296. /// The faster way is by far the TMat4 * TVec3 or the
  297. /// getTransformed(const TVec3&, const TMat3&)
  298. /// @{
  299. TVec3 getTransformed(const TVec3& translate, const TMat3<T>& rotate,
  300. T scale) const
  301. {
  302. return (rotate * ((*this) * scale)) + translate;
  303. }
  304. void transform(const TVec3& translate, const TMat3<T>& rotate, T scale)
  305. {
  306. (*this) = getTransformed(translate, rotate, scale);
  307. }
  308. TVec3 getTransformed(const TVec3& translate, const TMat3<T>& rotate) const
  309. {
  310. return (rotate * (*this)) + translate;
  311. }
  312. void transform(const TVec3& translate, const TMat3<T>& rotate)
  313. {
  314. (*this) = getTransformed(translate, rotate);
  315. }
  316. TVec3 getTransformed(const TVec3& translate, const TQuat<T>& rotate,
  317. T scale) const
  318. {
  319. return ((*this) * scale).getRotated(rotate) + translate;
  320. }
  321. void transform(const TVec3& translate, const TQuat<T>& rotate, T scale)
  322. {
  323. (*this) = getTransformed(translate, rotate, scale);
  324. }
  325. TVec3 getTransformed(const TVec3& translate, const TQuat<T>& rotate) const
  326. {
  327. return getRotated(rotate) + translate;
  328. }
  329. void transform(const TVec3& translate, const TQuat<T>& rotate)
  330. {
  331. (*this) = getTransformed(translate, rotate);
  332. }
  333. /// Transform the vector
  334. /// @param transform A transformation matrix
  335. ///
  336. /// @note 9 muls, 9 adds
  337. TVec3 getTransformed(const TMat4<T>& transform) const
  338. {
  339. return TVec3(
  340. transform(0, 0) * x() + transform(0, 1) * y()
  341. + transform(0, 2) * z() + transform(0, 3),
  342. transform(1, 0) * x() + transform(1, 1) * y()
  343. + transform(1, 2) * z() + transform(1, 3),
  344. transform(2, 0) * x() + transform(2, 1) * y()
  345. + transform(2, 2) * z() + transform(2, 3));
  346. }
  347. void transform(const TMat4<T>& transform)
  348. {
  349. (*this) = getTransformed(transform);
  350. }
  351. /// 12 muls, 9 adds
  352. TVec3 getTransformed(const TTransform<T>& transform) const
  353. {
  354. return (transform.getRotation() * ((*this) * transform.getScale()))
  355. + transform.getOrigin();
  356. }
  357. void transform(const TTransform<T>& transform)
  358. {
  359. (*this) = getTransformed(transform);
  360. }
  361. std::string toString() const
  362. {
  363. return std::to_string(x()) + " " + std::to_string(y()) + " "
  364. + std::to_string(z());
  365. }
  366. /// @}
  367. private:
  368. /// @name Data
  369. /// @{
  370. union
  371. {
  372. struct
  373. {
  374. T x, y, z;
  375. } vec;
  376. Array<T, 3> arr;
  377. };
  378. /// @}
  379. };
  380. template<typename T>
  381. TVec3<T> operator+(const T f, const TVec3<T>& v)
  382. {
  383. return v + f;
  384. }
  385. template<typename T>
  386. TVec3<T> operator-(const T f, const TVec3<T>& v)
  387. {
  388. return TVec3<T>(f) - v;
  389. }
  390. template<typename T>
  391. TVec3<T> operator*(const T f, const TVec3<T>& v)
  392. {
  393. return v * f;
  394. }
  395. template<typename T>
  396. TVec3<T> operator/(const T f, const TVec3<T>& v)
  397. {
  398. return TVec3<T>(f) / v;
  399. }
  400. /// F32 3D vector
  401. typedef TVec3<F32> Vec3;
  402. static_assert(sizeof(Vec3) == sizeof(F32) * 3, "Incorrect size");
  403. /// Half float 3D vector
  404. typedef TVec3<F16> HVec3;
  405. /// 32bit signed integer 3D vector
  406. typedef TVec3<I32> IVec3;
  407. /// 32bit unsigned integer 3D vector
  408. typedef TVec3<U32> UVec3;
  409. /// @}
  410. } // end namespace anki
  411. #endif