You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

912 lines
24 KiB

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