type_vec4.inl 36 KB

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