type_vec3.inl 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068
  1. /// @ref core
  2. #include "compute_vector_relational.hpp"
  3. namespace glm
  4. {
  5. // -- Implicit basic constructors --
  6. # if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
  7. template<typename T, qualifier Q>
  8. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec()
  9. # if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE
  10. : x(0), y(0), z(0)
  11. # endif
  12. {}
  13. template<typename T, qualifier Q>
  14. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, T, Q> const& v)
  15. : x(v.x), y(v.y), z(v.z)
  16. {}
  17. # endif
  18. template<typename T, qualifier Q>
  19. template<qualifier P>
  20. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, T, P> const& v)
  21. : x(v.x), y(v.y), z(v.z)
  22. {}
  23. // -- Explicit basic constructors --
  24. template<typename T, qualifier Q>
  25. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(T scalar)
  26. : x(scalar), y(scalar), z(scalar)
  27. {}
  28. template <typename T, qualifier Q>
  29. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(T _x, T _y, T _z)
  30. : x(_x), y(_y), z(_z)
  31. {}
  32. // -- Conversion scalar constructors --
  33. template<typename T, qualifier Q>
  34. template<typename U, qualifier P>
  35. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, U, P> const& v)
  36. : x(static_cast<T>(v.x))
  37. , y(static_cast<T>(v.x))
  38. , z(static_cast<T>(v.x))
  39. {}
  40. template<typename T, qualifier Q>
  41. template<typename X, typename Y, typename Z>
  42. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, Y _y, Z _z)
  43. : x(static_cast<T>(_x))
  44. , y(static_cast<T>(_y))
  45. , z(static_cast<T>(_z))
  46. {}
  47. template<typename T, qualifier Q>
  48. template<typename X, typename Y, typename Z>
  49. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z)
  50. : x(static_cast<T>(_x.x))
  51. , y(static_cast<T>(_y))
  52. , z(static_cast<T>(_z))
  53. {}
  54. template<typename T, qualifier Q>
  55. template<typename X, typename Y, typename Z>
  56. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z)
  57. : x(static_cast<T>(_x))
  58. , y(static_cast<T>(_y.x))
  59. , z(static_cast<T>(_z))
  60. {}
  61. template<typename T, qualifier Q>
  62. template<typename X, typename Y, typename Z>
  63. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z)
  64. : x(static_cast<T>(_x.x))
  65. , y(static_cast<T>(_y.x))
  66. , z(static_cast<T>(_z))
  67. {}
  68. template<typename T, qualifier Q>
  69. template<typename X, typename Y, typename Z>
  70. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z)
  71. : x(static_cast<T>(_x))
  72. , y(static_cast<T>(_y))
  73. , z(static_cast<T>(_z.x))
  74. {}
  75. template<typename T, qualifier Q>
  76. template<typename X, typename Y, typename Z>
  77. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z)
  78. : x(static_cast<T>(_x.x))
  79. , y(static_cast<T>(_y))
  80. , z(static_cast<T>(_z.x))
  81. {}
  82. template<typename T, qualifier Q>
  83. template<typename X, typename Y, typename Z>
  84. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z)
  85. : x(static_cast<T>(_x))
  86. , y(static_cast<T>(_y.x))
  87. , z(static_cast<T>(_z.x))
  88. {}
  89. template<typename T, qualifier Q>
  90. template<typename X, typename Y, typename Z>
  91. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z)
  92. : x(static_cast<T>(_x.x))
  93. , y(static_cast<T>(_y.x))
  94. , z(static_cast<T>(_z.x))
  95. {}
  96. // -- Conversion vector constructors --
  97. template<typename T, qualifier Q>
  98. template<typename A, typename B, qualifier P>
  99. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, B _z)
  100. : x(static_cast<T>(_xy.x))
  101. , y(static_cast<T>(_xy.y))
  102. , z(static_cast<T>(_z))
  103. {}
  104. template<typename T, qualifier Q>
  105. template<typename A, typename B, qualifier P>
  106. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z)
  107. : x(static_cast<T>(_xy.x))
  108. , y(static_cast<T>(_xy.y))
  109. , z(static_cast<T>(_z.x))
  110. {}
  111. template<typename T, qualifier Q>
  112. template<typename A, typename B, qualifier P>
  113. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(A _x, vec<2, B, P> const& _yz)
  114. : x(static_cast<T>(_x))
  115. , y(static_cast<T>(_yz.x))
  116. , z(static_cast<T>(_yz.y))
  117. {}
  118. template<typename T, qualifier Q>
  119. template<typename A, typename B, qualifier P>
  120. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz)
  121. : x(static_cast<T>(_x.x))
  122. , y(static_cast<T>(_yz.x))
  123. , z(static_cast<T>(_yz.y))
  124. {}
  125. template<typename T, qualifier Q>
  126. template<typename U, qualifier P>
  127. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, U, P> const& v)
  128. : x(static_cast<T>(v.x))
  129. , y(static_cast<T>(v.y))
  130. , z(static_cast<T>(v.z))
  131. {}
  132. template<typename T, qualifier Q>
  133. template<typename U, qualifier P>
  134. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<4, U, P> const& v)
  135. : x(static_cast<T>(v.x))
  136. , y(static_cast<T>(v.y))
  137. , z(static_cast<T>(v.z))
  138. {}
  139. // -- Component accesses --
  140. template<typename T, qualifier Q>
  141. GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i)
  142. {
  143. assert(i >= 0 && i < this->length());
  144. switch(i)
  145. {
  146. default:
  147. case 0:
  148. return x;
  149. case 1:
  150. return y;
  151. case 2:
  152. return z;
  153. }
  154. }
  155. template<typename T, qualifier Q>
  156. GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) const
  157. {
  158. assert(i >= 0 && i < this->length());
  159. switch(i)
  160. {
  161. default:
  162. case 0:
  163. return x;
  164. case 1:
  165. return y;
  166. case 2:
  167. return z;
  168. }
  169. }
  170. // -- Unary arithmetic operators --
  171. # if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
  172. template<typename T, qualifier Q>
  173. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, T, Q> const& v)
  174. {
  175. this->x = v.x;
  176. this->y = v.y;
  177. this->z = v.z;
  178. return *this;
  179. }
  180. # endif
  181. template<typename T, qualifier Q>
  182. template<typename U>
  183. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, U, Q> const& v)
  184. {
  185. this->x = static_cast<T>(v.x);
  186. this->y = static_cast<T>(v.y);
  187. this->z = static_cast<T>(v.z);
  188. return *this;
  189. }
  190. template<typename T, qualifier Q>
  191. template<typename U>
  192. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(U scalar)
  193. {
  194. this->x += static_cast<T>(scalar);
  195. this->y += static_cast<T>(scalar);
  196. this->z += static_cast<T>(scalar);
  197. return *this;
  198. }
  199. template<typename T, qualifier Q>
  200. template<typename U>
  201. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<1, U, Q> const& v)
  202. {
  203. this->x += static_cast<T>(v.x);
  204. this->y += static_cast<T>(v.x);
  205. this->z += static_cast<T>(v.x);
  206. return *this;
  207. }
  208. template<typename T, qualifier Q>
  209. template<typename U>
  210. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<3, U, Q> const& v)
  211. {
  212. this->x += static_cast<T>(v.x);
  213. this->y += static_cast<T>(v.y);
  214. this->z += static_cast<T>(v.z);
  215. return *this;
  216. }
  217. template<typename T, qualifier Q>
  218. template<typename U>
  219. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(U scalar)
  220. {
  221. this->x -= static_cast<T>(scalar);
  222. this->y -= static_cast<T>(scalar);
  223. this->z -= static_cast<T>(scalar);
  224. return *this;
  225. }
  226. template<typename T, qualifier Q>
  227. template<typename U>
  228. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<1, U, Q> const& v)
  229. {
  230. this->x -= static_cast<T>(v.x);
  231. this->y -= static_cast<T>(v.x);
  232. this->z -= static_cast<T>(v.x);
  233. return *this;
  234. }
  235. template<typename T, qualifier Q>
  236. template<typename U>
  237. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<3, U, Q> const& v)
  238. {
  239. this->x -= static_cast<T>(v.x);
  240. this->y -= static_cast<T>(v.y);
  241. this->z -= static_cast<T>(v.z);
  242. return *this;
  243. }
  244. template<typename T, qualifier Q>
  245. template<typename U>
  246. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(U scalar)
  247. {
  248. this->x *= static_cast<T>(scalar);
  249. this->y *= static_cast<T>(scalar);
  250. this->z *= static_cast<T>(scalar);
  251. return *this;
  252. }
  253. template<typename T, qualifier Q>
  254. template<typename U>
  255. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<1, U, Q> const& v)
  256. {
  257. this->x *= static_cast<T>(v.x);
  258. this->y *= static_cast<T>(v.x);
  259. this->z *= static_cast<T>(v.x);
  260. return *this;
  261. }
  262. template<typename T, qualifier Q>
  263. template<typename U>
  264. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<3, U, Q> const& v)
  265. {
  266. this->x *= static_cast<T>(v.x);
  267. this->y *= static_cast<T>(v.y);
  268. this->z *= static_cast<T>(v.z);
  269. return *this;
  270. }
  271. template<typename T, qualifier Q>
  272. template<typename U>
  273. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(U v)
  274. {
  275. this->x /= static_cast<T>(v);
  276. this->y /= static_cast<T>(v);
  277. this->z /= static_cast<T>(v);
  278. return *this;
  279. }
  280. template<typename T, qualifier Q>
  281. template<typename U>
  282. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<1, U, Q> const& v)
  283. {
  284. this->x /= static_cast<T>(v.x);
  285. this->y /= static_cast<T>(v.x);
  286. this->z /= static_cast<T>(v.x);
  287. return *this;
  288. }
  289. template<typename T, qualifier Q>
  290. template<typename U>
  291. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<3, U, Q> const& v)
  292. {
  293. this->x /= static_cast<T>(v.x);
  294. this->y /= static_cast<T>(v.y);
  295. this->z /= static_cast<T>(v.z);
  296. return *this;
  297. }
  298. // -- Increment and decrement operators --
  299. template<typename T, qualifier Q>
  300. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator++()
  301. {
  302. ++this->x;
  303. ++this->y;
  304. ++this->z;
  305. return *this;
  306. }
  307. template<typename T, qualifier Q>
  308. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator--()
  309. {
  310. --this->x;
  311. --this->y;
  312. --this->z;
  313. return *this;
  314. }
  315. template<typename T, qualifier Q>
  316. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> vec<3, T, Q>::operator++(int)
  317. {
  318. vec<3, T, Q> Result(*this);
  319. ++*this;
  320. return Result;
  321. }
  322. template<typename T, qualifier Q>
  323. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> vec<3, T, Q>::operator--(int)
  324. {
  325. vec<3, T, Q> Result(*this);
  326. --*this;
  327. return Result;
  328. }
  329. // -- Unary bit operators --
  330. template<typename T, qualifier Q>
  331. template<typename U>
  332. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(U scalar)
  333. {
  334. this->x %= scalar;
  335. this->y %= scalar;
  336. this->z %= scalar;
  337. return *this;
  338. }
  339. template<typename T, qualifier Q>
  340. template<typename U>
  341. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<1, U, Q> const& v)
  342. {
  343. this->x %= v.x;
  344. this->y %= v.x;
  345. this->z %= v.x;
  346. return *this;
  347. }
  348. template<typename T, qualifier Q>
  349. template<typename U>
  350. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<3, U, Q> const& v)
  351. {
  352. this->x %= v.x;
  353. this->y %= v.y;
  354. this->z %= v.z;
  355. return *this;
  356. }
  357. template<typename T, qualifier Q>
  358. template<typename U>
  359. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(U scalar)
  360. {
  361. this->x &= scalar;
  362. this->y &= scalar;
  363. this->z &= scalar;
  364. return *this;
  365. }
  366. template<typename T, qualifier Q>
  367. template<typename U>
  368. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<1, U, Q> const& v)
  369. {
  370. this->x &= v.x;
  371. this->y &= v.x;
  372. this->z &= v.x;
  373. return *this;
  374. }
  375. template<typename T, qualifier Q>
  376. template<typename U>
  377. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<3, U, Q> const& v)
  378. {
  379. this->x &= v.x;
  380. this->y &= v.y;
  381. this->z &= v.z;
  382. return *this;
  383. }
  384. template<typename T, qualifier Q>
  385. template<typename U>
  386. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(U scalar)
  387. {
  388. this->x |= scalar;
  389. this->y |= scalar;
  390. this->z |= scalar;
  391. return *this;
  392. }
  393. template<typename T, qualifier Q>
  394. template<typename U>
  395. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<1, U, Q> const& v)
  396. {
  397. this->x |= v.x;
  398. this->y |= v.x;
  399. this->z |= v.x;
  400. return *this;
  401. }
  402. template<typename T, qualifier Q>
  403. template<typename U>
  404. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<3, U, Q> const& v)
  405. {
  406. this->x |= v.x;
  407. this->y |= v.y;
  408. this->z |= v.z;
  409. return *this;
  410. }
  411. template<typename T, qualifier Q>
  412. template<typename U>
  413. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(U scalar)
  414. {
  415. this->x ^= scalar;
  416. this->y ^= scalar;
  417. this->z ^= scalar;
  418. return *this;
  419. }
  420. template<typename T, qualifier Q>
  421. template<typename U>
  422. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<1, U, Q> const& v)
  423. {
  424. this->x ^= v.x;
  425. this->y ^= v.x;
  426. this->z ^= v.x;
  427. return *this;
  428. }
  429. template<typename T, qualifier Q>
  430. template<typename U>
  431. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<3, U, Q> const& v)
  432. {
  433. this->x ^= v.x;
  434. this->y ^= v.y;
  435. this->z ^= v.z;
  436. return *this;
  437. }
  438. template<typename T, qualifier Q>
  439. template<typename U>
  440. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(U scalar)
  441. {
  442. this->x <<= scalar;
  443. this->y <<= scalar;
  444. this->z <<= scalar;
  445. return *this;
  446. }
  447. template<typename T, qualifier Q>
  448. template<typename U>
  449. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<1, U, Q> const& v)
  450. {
  451. this->x <<= static_cast<T>(v.x);
  452. this->y <<= static_cast<T>(v.x);
  453. this->z <<= static_cast<T>(v.x);
  454. return *this;
  455. }
  456. template<typename T, qualifier Q>
  457. template<typename U>
  458. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<3, U, Q> const& v)
  459. {
  460. this->x <<= static_cast<T>(v.x);
  461. this->y <<= static_cast<T>(v.y);
  462. this->z <<= static_cast<T>(v.z);
  463. return *this;
  464. }
  465. template<typename T, qualifier Q>
  466. template<typename U>
  467. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(U scalar)
  468. {
  469. this->x >>= static_cast<T>(scalar);
  470. this->y >>= static_cast<T>(scalar);
  471. this->z >>= static_cast<T>(scalar);
  472. return *this;
  473. }
  474. template<typename T, qualifier Q>
  475. template<typename U>
  476. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<1, U, Q> const& v)
  477. {
  478. this->x >>= static_cast<T>(v.x);
  479. this->y >>= static_cast<T>(v.x);
  480. this->z >>= static_cast<T>(v.x);
  481. return *this;
  482. }
  483. template<typename T, qualifier Q>
  484. template<typename U>
  485. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<3, U, Q> const& v)
  486. {
  487. this->x >>= static_cast<T>(v.x);
  488. this->y >>= static_cast<T>(v.y);
  489. this->z >>= static_cast<T>(v.z);
  490. return *this;
  491. }
  492. // -- Unary arithmetic operators --
  493. template<typename T, qualifier Q>
  494. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v)
  495. {
  496. return v;
  497. }
  498. template<typename T, qualifier Q>
  499. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v)
  500. {
  501. return vec<3, T, Q>(
  502. -v.x,
  503. -v.y,
  504. -v.z);
  505. }
  506. // -- Binary arithmetic operators --
  507. template<typename T, qualifier Q>
  508. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar)
  509. {
  510. return vec<3, T, Q>(
  511. v.x + scalar,
  512. v.y + scalar,
  513. v.z + scalar);
  514. }
  515. template<typename T, qualifier Q>
  516. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  517. {
  518. return vec<3, T, Q>(
  519. v.x + scalar.x,
  520. v.y + scalar.x,
  521. v.z + scalar.x);
  522. }
  523. template<typename T, qualifier Q>
  524. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v)
  525. {
  526. return vec<3, T, Q>(
  527. scalar + v.x,
  528. scalar + v.y,
  529. scalar + v.z);
  530. }
  531. template<typename T, qualifier Q>
  532. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  533. {
  534. return vec<3, T, Q>(
  535. scalar.x + v.x,
  536. scalar.x + v.y,
  537. scalar.x + v.z);
  538. }
  539. template<typename T, qualifier Q>
  540. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  541. {
  542. return vec<3, T, Q>(
  543. v1.x + v2.x,
  544. v1.y + v2.y,
  545. v1.z + v2.z);
  546. }
  547. template<typename T, qualifier Q>
  548. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar)
  549. {
  550. return vec<3, T, Q>(
  551. v.x - scalar,
  552. v.y - scalar,
  553. v.z - scalar);
  554. }
  555. template<typename T, qualifier Q>
  556. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  557. {
  558. return vec<3, T, Q>(
  559. v.x - scalar.x,
  560. v.y - scalar.x,
  561. v.z - scalar.x);
  562. }
  563. template<typename T, qualifier Q>
  564. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v)
  565. {
  566. return vec<3, T, Q>(
  567. scalar - v.x,
  568. scalar - v.y,
  569. scalar - v.z);
  570. }
  571. template<typename T, qualifier Q>
  572. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  573. {
  574. return vec<3, T, Q>(
  575. scalar.x - v.x,
  576. scalar.x - v.y,
  577. scalar.x - v.z);
  578. }
  579. template<typename T, qualifier Q>
  580. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  581. {
  582. return vec<3, T, Q>(
  583. v1.x - v2.x,
  584. v1.y - v2.y,
  585. v1.z - v2.z);
  586. }
  587. template<typename T, qualifier Q>
  588. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar)
  589. {
  590. return vec<3, T, Q>(
  591. v.x * scalar,
  592. v.y * scalar,
  593. v.z * scalar);
  594. }
  595. template<typename T, qualifier Q>
  596. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  597. {
  598. return vec<3, T, Q>(
  599. v.x * scalar.x,
  600. v.y * scalar.x,
  601. v.z * scalar.x);
  602. }
  603. template<typename T, qualifier Q>
  604. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v)
  605. {
  606. return vec<3, T, Q>(
  607. scalar * v.x,
  608. scalar * v.y,
  609. scalar * v.z);
  610. }
  611. template<typename T, qualifier Q>
  612. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  613. {
  614. return vec<3, T, Q>(
  615. scalar.x * v.x,
  616. scalar.x * v.y,
  617. scalar.x * v.z);
  618. }
  619. template<typename T, qualifier Q>
  620. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  621. {
  622. return vec<3, T, Q>(
  623. v1.x * v2.x,
  624. v1.y * v2.y,
  625. v1.z * v2.z);
  626. }
  627. template<typename T, qualifier Q>
  628. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar)
  629. {
  630. return vec<3, T, Q>(
  631. v.x / scalar,
  632. v.y / scalar,
  633. v.z / scalar);
  634. }
  635. template<typename T, qualifier Q>
  636. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  637. {
  638. return vec<3, T, Q>(
  639. v.x / scalar.x,
  640. v.y / scalar.x,
  641. v.z / scalar.x);
  642. }
  643. template<typename T, qualifier Q>
  644. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v)
  645. {
  646. return vec<3, T, Q>(
  647. scalar / v.x,
  648. scalar / v.y,
  649. scalar / v.z);
  650. }
  651. template<typename T, qualifier Q>
  652. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  653. {
  654. return vec<3, T, Q>(
  655. scalar.x / v.x,
  656. scalar.x / v.y,
  657. scalar.x / v.z);
  658. }
  659. template<typename T, qualifier Q>
  660. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  661. {
  662. return vec<3, T, Q>(
  663. v1.x / v2.x,
  664. v1.y / v2.y,
  665. v1.z / v2.z);
  666. }
  667. // -- Binary bit operators --
  668. template<typename T, qualifier Q>
  669. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar)
  670. {
  671. return vec<3, T, Q>(
  672. v.x % scalar,
  673. v.y % scalar,
  674. v.z % scalar);
  675. }
  676. template<typename T, qualifier Q>
  677. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  678. {
  679. return vec<3, T, Q>(
  680. v.x % scalar.x,
  681. v.y % scalar.x,
  682. v.z % scalar.x);
  683. }
  684. template<typename T, qualifier Q>
  685. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(T scalar, vec<3, T, Q> const& v)
  686. {
  687. return vec<3, T, Q>(
  688. scalar % v.x,
  689. scalar % v.y,
  690. scalar % v.z);
  691. }
  692. template<typename T, qualifier Q>
  693. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  694. {
  695. return vec<3, T, Q>(
  696. scalar.x % v.x,
  697. scalar.x % v.y,
  698. scalar.x % v.z);
  699. }
  700. template<typename T, qualifier Q>
  701. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  702. {
  703. return vec<3, T, Q>(
  704. v1.x % v2.x,
  705. v1.y % v2.y,
  706. v1.z % v2.z);
  707. }
  708. template<typename T, qualifier Q>
  709. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v, T scalar)
  710. {
  711. return vec<3, T, Q>(
  712. v.x & scalar,
  713. v.y & scalar,
  714. v.z & scalar);
  715. }
  716. template<typename T, qualifier Q>
  717. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  718. {
  719. return vec<3, T, Q>(
  720. v.x & scalar.x,
  721. v.y & scalar.x,
  722. v.z & scalar.x);
  723. }
  724. template<typename T, qualifier Q>
  725. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v)
  726. {
  727. return vec<3, T, Q>(
  728. scalar & v.x,
  729. scalar & v.y,
  730. scalar & v.z);
  731. }
  732. template<typename T, qualifier Q>
  733. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  734. {
  735. return vec<3, T, Q>(
  736. scalar.x & v.x,
  737. scalar.x & v.y,
  738. scalar.x & v.z);
  739. }
  740. template<typename T, qualifier Q>
  741. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  742. {
  743. return vec<3, T, Q>(
  744. v1.x & v2.x,
  745. v1.y & v2.y,
  746. v1.z & v2.z);
  747. }
  748. template<typename T, qualifier Q>
  749. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar)
  750. {
  751. return vec<3, T, Q>(
  752. v.x | scalar,
  753. v.y | scalar,
  754. v.z | scalar);
  755. }
  756. template<typename T, qualifier Q>
  757. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  758. {
  759. return vec<3, T, Q>(
  760. v.x | scalar.x,
  761. v.y | scalar.x,
  762. v.z | scalar.x);
  763. }
  764. template<typename T, qualifier Q>
  765. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v)
  766. {
  767. return vec<3, T, Q>(
  768. scalar | v.x,
  769. scalar | v.y,
  770. scalar | v.z);
  771. }
  772. template<typename T, qualifier Q>
  773. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  774. {
  775. return vec<3, T, Q>(
  776. scalar.x | v.x,
  777. scalar.x | v.y,
  778. scalar.x | v.z);
  779. }
  780. template<typename T, qualifier Q>
  781. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  782. {
  783. return vec<3, T, Q>(
  784. v1.x | v2.x,
  785. v1.y | v2.y,
  786. v1.z | v2.z);
  787. }
  788. template<typename T, qualifier Q>
  789. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar)
  790. {
  791. return vec<3, T, Q>(
  792. v.x ^ scalar,
  793. v.y ^ scalar,
  794. v.z ^ scalar);
  795. }
  796. template<typename T, qualifier Q>
  797. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  798. {
  799. return vec<3, T, Q>(
  800. v.x ^ scalar.x,
  801. v.y ^ scalar.x,
  802. v.z ^ scalar.x);
  803. }
  804. template<typename T, qualifier Q>
  805. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v)
  806. {
  807. return vec<3, T, Q>(
  808. scalar ^ v.x,
  809. scalar ^ v.y,
  810. scalar ^ v.z);
  811. }
  812. template<typename T, qualifier Q>
  813. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  814. {
  815. return vec<3, T, Q>(
  816. scalar.x ^ v.x,
  817. scalar.x ^ v.y,
  818. scalar.x ^ v.z);
  819. }
  820. template<typename T, qualifier Q>
  821. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  822. {
  823. return vec<3, T, Q>(
  824. v1.x ^ v2.x,
  825. v1.y ^ v2.y,
  826. v1.z ^ v2.z);
  827. }
  828. template<typename T, qualifier Q>
  829. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar)
  830. {
  831. return vec<3, T, Q>(
  832. v.x << scalar,
  833. v.y << scalar,
  834. v.z << scalar);
  835. }
  836. template<typename T, qualifier Q>
  837. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  838. {
  839. return vec<3, T, Q>(
  840. v.x << scalar.x,
  841. v.y << scalar.x,
  842. v.z << scalar.x);
  843. }
  844. template<typename T, qualifier Q>
  845. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v)
  846. {
  847. return vec<3, T, Q>(
  848. scalar << v.x,
  849. scalar << v.y,
  850. scalar << v.z);
  851. }
  852. template<typename T, qualifier Q>
  853. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  854. {
  855. return vec<3, T, Q>(
  856. scalar.x << v.x,
  857. scalar.x << v.y,
  858. scalar.x << v.z);
  859. }
  860. template<typename T, qualifier Q>
  861. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  862. {
  863. return vec<3, T, Q>(
  864. v1.x << v2.x,
  865. v1.y << v2.y,
  866. v1.z << v2.z);
  867. }
  868. template<typename T, qualifier Q>
  869. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar)
  870. {
  871. return vec<3, T, Q>(
  872. v.x >> scalar,
  873. v.y >> scalar,
  874. v.z >> scalar);
  875. }
  876. template<typename T, qualifier Q>
  877. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)
  878. {
  879. return vec<3, T, Q>(
  880. v.x >> scalar.x,
  881. v.y >> scalar.x,
  882. v.z >> scalar.x);
  883. }
  884. template<typename T, qualifier Q>
  885. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v)
  886. {
  887. return vec<3, T, Q>(
  888. scalar >> v.x,
  889. scalar >> v.y,
  890. scalar >> v.z);
  891. }
  892. template<typename T, qualifier Q>
  893. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)
  894. {
  895. return vec<3, T, Q>(
  896. scalar.x >> v.x,
  897. scalar.x >> v.y,
  898. scalar.x >> v.z);
  899. }
  900. template<typename T, qualifier Q>
  901. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  902. {
  903. return vec<3, T, Q>(
  904. v1.x >> v2.x,
  905. v1.y >> v2.y,
  906. v1.z >> v2.z);
  907. }
  908. template<typename T, qualifier Q>
  909. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator~(vec<3, T, Q> const& v)
  910. {
  911. return vec<3, T, Q>(
  912. ~v.x,
  913. ~v.y,
  914. ~v.z);
  915. }
  916. // -- Boolean operators --
  917. template<typename T, qualifier Q>
  918. GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  919. {
  920. return
  921. detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.x, v2.x) &&
  922. detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.y, v2.y) &&
  923. detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.z, v2.z);
  924. }
  925. template<typename T, qualifier Q>
  926. GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)
  927. {
  928. return !(v1 == v2);
  929. }
  930. template<qualifier Q>
  931. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2)
  932. {
  933. return vec<3, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z);
  934. }
  935. template<qualifier Q>
  936. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2)
  937. {
  938. return vec<3, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z);
  939. }
  940. }//namespace glm