vec_swizzle.hpp 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782
  1. /// @ref gtx_vec_swizzle
  2. /// @file glm/gtx/vec_swizzle.hpp
  3. ///
  4. /// @see core (dependence)
  5. ///
  6. /// @defgroup gtx_vec_swizzle GLM_GTX_vec_swizzle
  7. /// @ingroup gtx
  8. ///
  9. /// Include <glm/gtx/vec_swizzle.hpp> to use the features of this extension.
  10. ///
  11. /// Functions to perform swizzle operation.
  12. #pragma once
  13. #include "../glm.hpp"
  14. #if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
  15. # ifndef GLM_ENABLE_EXPERIMENTAL
  16. # pragma message("GLM: GLM_GTX_vec_swizzle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.")
  17. # else
  18. # pragma message("GLM: GLM_GTX_vec_swizzle extension included")
  19. # endif
  20. #endif
  21. namespace glm {
  22. // xx
  23. template<typename T, qualifier Q>
  24. GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<1, T, Q> &v) {
  25. return glm::vec<2, T, Q>(v.x, v.x);
  26. }
  27. template<typename T, qualifier Q>
  28. GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<2, T, Q> &v) {
  29. return glm::vec<2, T, Q>(v.x, v.x);
  30. }
  31. template<typename T, qualifier Q>
  32. GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<3, T, Q> &v) {
  33. return glm::vec<2, T, Q>(v.x, v.x);
  34. }
  35. template<typename T, qualifier Q>
  36. GLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<4, T, Q> &v) {
  37. return glm::vec<2, T, Q>(v.x, v.x);
  38. }
  39. // xy
  40. template<typename T, qualifier Q>
  41. GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<2, T, Q> &v) {
  42. return glm::vec<2, T, Q>(v.x, v.y);
  43. }
  44. template<typename T, qualifier Q>
  45. GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<3, T, Q> &v) {
  46. return glm::vec<2, T, Q>(v.x, v.y);
  47. }
  48. template<typename T, qualifier Q>
  49. GLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<4, T, Q> &v) {
  50. return glm::vec<2, T, Q>(v.x, v.y);
  51. }
  52. // xz
  53. template<typename T, qualifier Q>
  54. GLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<3, T, Q> &v) {
  55. return glm::vec<2, T, Q>(v.x, v.z);
  56. }
  57. template<typename T, qualifier Q>
  58. GLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<4, T, Q> &v) {
  59. return glm::vec<2, T, Q>(v.x, v.z);
  60. }
  61. // xw
  62. template<typename T, qualifier Q>
  63. GLM_INLINE glm::vec<2, T, Q> xw(const glm::vec<4, T, Q> &v) {
  64. return glm::vec<2, T, Q>(v.x, v.w);
  65. }
  66. // yx
  67. template<typename T, qualifier Q>
  68. GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<2, T, Q> &v) {
  69. return glm::vec<2, T, Q>(v.y, v.x);
  70. }
  71. template<typename T, qualifier Q>
  72. GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<3, T, Q> &v) {
  73. return glm::vec<2, T, Q>(v.y, v.x);
  74. }
  75. template<typename T, qualifier Q>
  76. GLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<4, T, Q> &v) {
  77. return glm::vec<2, T, Q>(v.y, v.x);
  78. }
  79. // yy
  80. template<typename T, qualifier Q>
  81. GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<2, T, Q> &v) {
  82. return glm::vec<2, T, Q>(v.y, v.y);
  83. }
  84. template<typename T, qualifier Q>
  85. GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<3, T, Q> &v) {
  86. return glm::vec<2, T, Q>(v.y, v.y);
  87. }
  88. template<typename T, qualifier Q>
  89. GLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<4, T, Q> &v) {
  90. return glm::vec<2, T, Q>(v.y, v.y);
  91. }
  92. // yz
  93. template<typename T, qualifier Q>
  94. GLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<3, T, Q> &v) {
  95. return glm::vec<2, T, Q>(v.y, v.z);
  96. }
  97. template<typename T, qualifier Q>
  98. GLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<4, T, Q> &v) {
  99. return glm::vec<2, T, Q>(v.y, v.z);
  100. }
  101. // yw
  102. template<typename T, qualifier Q>
  103. GLM_INLINE glm::vec<2, T, Q> yw(const glm::vec<4, T, Q> &v) {
  104. return glm::vec<2, T, Q>(v.y, v.w);
  105. }
  106. // zx
  107. template<typename T, qualifier Q>
  108. GLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<3, T, Q> &v) {
  109. return glm::vec<2, T, Q>(v.z, v.x);
  110. }
  111. template<typename T, qualifier Q>
  112. GLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<4, T, Q> &v) {
  113. return glm::vec<2, T, Q>(v.z, v.x);
  114. }
  115. // zy
  116. template<typename T, qualifier Q>
  117. GLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<3, T, Q> &v) {
  118. return glm::vec<2, T, Q>(v.z, v.y);
  119. }
  120. template<typename T, qualifier Q>
  121. GLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<4, T, Q> &v) {
  122. return glm::vec<2, T, Q>(v.z, v.y);
  123. }
  124. // zz
  125. template<typename T, qualifier Q>
  126. GLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<3, T, Q> &v) {
  127. return glm::vec<2, T, Q>(v.z, v.z);
  128. }
  129. template<typename T, qualifier Q>
  130. GLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<4, T, Q> &v) {
  131. return glm::vec<2, T, Q>(v.z, v.z);
  132. }
  133. // zw
  134. template<typename T, qualifier Q>
  135. GLM_INLINE glm::vec<2, T, Q> zw(const glm::vec<4, T, Q> &v) {
  136. return glm::vec<2, T, Q>(v.z, v.w);
  137. }
  138. // wx
  139. template<typename T, qualifier Q>
  140. GLM_INLINE glm::vec<2, T, Q> wx(const glm::vec<4, T, Q> &v) {
  141. return glm::vec<2, T, Q>(v.w, v.x);
  142. }
  143. // wy
  144. template<typename T, qualifier Q>
  145. GLM_INLINE glm::vec<2, T, Q> wy(const glm::vec<4, T, Q> &v) {
  146. return glm::vec<2, T, Q>(v.w, v.y);
  147. }
  148. // wz
  149. template<typename T, qualifier Q>
  150. GLM_INLINE glm::vec<2, T, Q> wz(const glm::vec<4, T, Q> &v) {
  151. return glm::vec<2, T, Q>(v.w, v.z);
  152. }
  153. // ww
  154. template<typename T, qualifier Q>
  155. GLM_INLINE glm::vec<2, T, Q> ww(const glm::vec<4, T, Q> &v) {
  156. return glm::vec<2, T, Q>(v.w, v.w);
  157. }
  158. // xxx
  159. template<typename T, qualifier Q>
  160. GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<1, T, Q> &v) {
  161. return glm::vec<3, T, Q>(v.x, v.x, v.x);
  162. }
  163. template<typename T, qualifier Q>
  164. GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<2, T, Q> &v) {
  165. return glm::vec<3, T, Q>(v.x, v.x, v.x);
  166. }
  167. template<typename T, qualifier Q>
  168. GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<3, T, Q> &v) {
  169. return glm::vec<3, T, Q>(v.x, v.x, v.x);
  170. }
  171. template<typename T, qualifier Q>
  172. GLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<4, T, Q> &v) {
  173. return glm::vec<3, T, Q>(v.x, v.x, v.x);
  174. }
  175. // xxy
  176. template<typename T, qualifier Q>
  177. GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<2, T, Q> &v) {
  178. return glm::vec<3, T, Q>(v.x, v.x, v.y);
  179. }
  180. template<typename T, qualifier Q>
  181. GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<3, T, Q> &v) {
  182. return glm::vec<3, T, Q>(v.x, v.x, v.y);
  183. }
  184. template<typename T, qualifier Q>
  185. GLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<4, T, Q> &v) {
  186. return glm::vec<3, T, Q>(v.x, v.x, v.y);
  187. }
  188. // xxz
  189. template<typename T, qualifier Q>
  190. GLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<3, T, Q> &v) {
  191. return glm::vec<3, T, Q>(v.x, v.x, v.z);
  192. }
  193. template<typename T, qualifier Q>
  194. GLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<4, T, Q> &v) {
  195. return glm::vec<3, T, Q>(v.x, v.x, v.z);
  196. }
  197. // xxw
  198. template<typename T, qualifier Q>
  199. GLM_INLINE glm::vec<3, T, Q> xxw(const glm::vec<4, T, Q> &v) {
  200. return glm::vec<3, T, Q>(v.x, v.x, v.w);
  201. }
  202. // xyx
  203. template<typename T, qualifier Q>
  204. GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<2, T, Q> &v) {
  205. return glm::vec<3, T, Q>(v.x, v.y, v.x);
  206. }
  207. template<typename T, qualifier Q>
  208. GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<3, T, Q> &v) {
  209. return glm::vec<3, T, Q>(v.x, v.y, v.x);
  210. }
  211. template<typename T, qualifier Q>
  212. GLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<4, T, Q> &v) {
  213. return glm::vec<3, T, Q>(v.x, v.y, v.x);
  214. }
  215. // xyy
  216. template<typename T, qualifier Q>
  217. GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<2, T, Q> &v) {
  218. return glm::vec<3, T, Q>(v.x, v.y, v.y);
  219. }
  220. template<typename T, qualifier Q>
  221. GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<3, T, Q> &v) {
  222. return glm::vec<3, T, Q>(v.x, v.y, v.y);
  223. }
  224. template<typename T, qualifier Q>
  225. GLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<4, T, Q> &v) {
  226. return glm::vec<3, T, Q>(v.x, v.y, v.y);
  227. }
  228. // xyz
  229. template<typename T, qualifier Q>
  230. GLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<3, T, Q> &v) {
  231. return glm::vec<3, T, Q>(v.x, v.y, v.z);
  232. }
  233. template<typename T, qualifier Q>
  234. GLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<4, T, Q> &v) {
  235. return glm::vec<3, T, Q>(v.x, v.y, v.z);
  236. }
  237. // xyw
  238. template<typename T, qualifier Q>
  239. GLM_INLINE glm::vec<3, T, Q> xyw(const glm::vec<4, T, Q> &v) {
  240. return glm::vec<3, T, Q>(v.x, v.y, v.w);
  241. }
  242. // xzx
  243. template<typename T, qualifier Q>
  244. GLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<3, T, Q> &v) {
  245. return glm::vec<3, T, Q>(v.x, v.z, v.x);
  246. }
  247. template<typename T, qualifier Q>
  248. GLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<4, T, Q> &v) {
  249. return glm::vec<3, T, Q>(v.x, v.z, v.x);
  250. }
  251. // xzy
  252. template<typename T, qualifier Q>
  253. GLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<3, T, Q> &v) {
  254. return glm::vec<3, T, Q>(v.x, v.z, v.y);
  255. }
  256. template<typename T, qualifier Q>
  257. GLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<4, T, Q> &v) {
  258. return glm::vec<3, T, Q>(v.x, v.z, v.y);
  259. }
  260. // xzz
  261. template<typename T, qualifier Q>
  262. GLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<3, T, Q> &v) {
  263. return glm::vec<3, T, Q>(v.x, v.z, v.z);
  264. }
  265. template<typename T, qualifier Q>
  266. GLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<4, T, Q> &v) {
  267. return glm::vec<3, T, Q>(v.x, v.z, v.z);
  268. }
  269. // xzw
  270. template<typename T, qualifier Q>
  271. GLM_INLINE glm::vec<3, T, Q> xzw(const glm::vec<4, T, Q> &v) {
  272. return glm::vec<3, T, Q>(v.x, v.z, v.w);
  273. }
  274. // xwx
  275. template<typename T, qualifier Q>
  276. GLM_INLINE glm::vec<3, T, Q> xwx(const glm::vec<4, T, Q> &v) {
  277. return glm::vec<3, T, Q>(v.x, v.w, v.x);
  278. }
  279. // xwy
  280. template<typename T, qualifier Q>
  281. GLM_INLINE glm::vec<3, T, Q> xwy(const glm::vec<4, T, Q> &v) {
  282. return glm::vec<3, T, Q>(v.x, v.w, v.y);
  283. }
  284. // xwz
  285. template<typename T, qualifier Q>
  286. GLM_INLINE glm::vec<3, T, Q> xwz(const glm::vec<4, T, Q> &v) {
  287. return glm::vec<3, T, Q>(v.x, v.w, v.z);
  288. }
  289. // xww
  290. template<typename T, qualifier Q>
  291. GLM_INLINE glm::vec<3, T, Q> xww(const glm::vec<4, T, Q> &v) {
  292. return glm::vec<3, T, Q>(v.x, v.w, v.w);
  293. }
  294. // yxx
  295. template<typename T, qualifier Q>
  296. GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<2, T, Q> &v) {
  297. return glm::vec<3, T, Q>(v.y, v.x, v.x);
  298. }
  299. template<typename T, qualifier Q>
  300. GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<3, T, Q> &v) {
  301. return glm::vec<3, T, Q>(v.y, v.x, v.x);
  302. }
  303. template<typename T, qualifier Q>
  304. GLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<4, T, Q> &v) {
  305. return glm::vec<3, T, Q>(v.y, v.x, v.x);
  306. }
  307. // yxy
  308. template<typename T, qualifier Q>
  309. GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<2, T, Q> &v) {
  310. return glm::vec<3, T, Q>(v.y, v.x, v.y);
  311. }
  312. template<typename T, qualifier Q>
  313. GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<3, T, Q> &v) {
  314. return glm::vec<3, T, Q>(v.y, v.x, v.y);
  315. }
  316. template<typename T, qualifier Q>
  317. GLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<4, T, Q> &v) {
  318. return glm::vec<3, T, Q>(v.y, v.x, v.y);
  319. }
  320. // yxz
  321. template<typename T, qualifier Q>
  322. GLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<3, T, Q> &v) {
  323. return glm::vec<3, T, Q>(v.y, v.x, v.z);
  324. }
  325. template<typename T, qualifier Q>
  326. GLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<4, T, Q> &v) {
  327. return glm::vec<3, T, Q>(v.y, v.x, v.z);
  328. }
  329. // yxw
  330. template<typename T, qualifier Q>
  331. GLM_INLINE glm::vec<3, T, Q> yxw(const glm::vec<4, T, Q> &v) {
  332. return glm::vec<3, T, Q>(v.y, v.x, v.w);
  333. }
  334. // yyx
  335. template<typename T, qualifier Q>
  336. GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<2, T, Q> &v) {
  337. return glm::vec<3, T, Q>(v.y, v.y, v.x);
  338. }
  339. template<typename T, qualifier Q>
  340. GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<3, T, Q> &v) {
  341. return glm::vec<3, T, Q>(v.y, v.y, v.x);
  342. }
  343. template<typename T, qualifier Q>
  344. GLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<4, T, Q> &v) {
  345. return glm::vec<3, T, Q>(v.y, v.y, v.x);
  346. }
  347. // yyy
  348. template<typename T, qualifier Q>
  349. GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<2, T, Q> &v) {
  350. return glm::vec<3, T, Q>(v.y, v.y, v.y);
  351. }
  352. template<typename T, qualifier Q>
  353. GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<3, T, Q> &v) {
  354. return glm::vec<3, T, Q>(v.y, v.y, v.y);
  355. }
  356. template<typename T, qualifier Q>
  357. GLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<4, T, Q> &v) {
  358. return glm::vec<3, T, Q>(v.y, v.y, v.y);
  359. }
  360. // yyz
  361. template<typename T, qualifier Q>
  362. GLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<3, T, Q> &v) {
  363. return glm::vec<3, T, Q>(v.y, v.y, v.z);
  364. }
  365. template<typename T, qualifier Q>
  366. GLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<4, T, Q> &v) {
  367. return glm::vec<3, T, Q>(v.y, v.y, v.z);
  368. }
  369. // yyw
  370. template<typename T, qualifier Q>
  371. GLM_INLINE glm::vec<3, T, Q> yyw(const glm::vec<4, T, Q> &v) {
  372. return glm::vec<3, T, Q>(v.y, v.y, v.w);
  373. }
  374. // yzx
  375. template<typename T, qualifier Q>
  376. GLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<3, T, Q> &v) {
  377. return glm::vec<3, T, Q>(v.y, v.z, v.x);
  378. }
  379. template<typename T, qualifier Q>
  380. GLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<4, T, Q> &v) {
  381. return glm::vec<3, T, Q>(v.y, v.z, v.x);
  382. }
  383. // yzy
  384. template<typename T, qualifier Q>
  385. GLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<3, T, Q> &v) {
  386. return glm::vec<3, T, Q>(v.y, v.z, v.y);
  387. }
  388. template<typename T, qualifier Q>
  389. GLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<4, T, Q> &v) {
  390. return glm::vec<3, T, Q>(v.y, v.z, v.y);
  391. }
  392. // yzz
  393. template<typename T, qualifier Q>
  394. GLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<3, T, Q> &v) {
  395. return glm::vec<3, T, Q>(v.y, v.z, v.z);
  396. }
  397. template<typename T, qualifier Q>
  398. GLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<4, T, Q> &v) {
  399. return glm::vec<3, T, Q>(v.y, v.z, v.z);
  400. }
  401. // yzw
  402. template<typename T, qualifier Q>
  403. GLM_INLINE glm::vec<3, T, Q> yzw(const glm::vec<4, T, Q> &v) {
  404. return glm::vec<3, T, Q>(v.y, v.z, v.w);
  405. }
  406. // ywx
  407. template<typename T, qualifier Q>
  408. GLM_INLINE glm::vec<3, T, Q> ywx(const glm::vec<4, T, Q> &v) {
  409. return glm::vec<3, T, Q>(v.y, v.w, v.x);
  410. }
  411. // ywy
  412. template<typename T, qualifier Q>
  413. GLM_INLINE glm::vec<3, T, Q> ywy(const glm::vec<4, T, Q> &v) {
  414. return glm::vec<3, T, Q>(v.y, v.w, v.y);
  415. }
  416. // ywz
  417. template<typename T, qualifier Q>
  418. GLM_INLINE glm::vec<3, T, Q> ywz(const glm::vec<4, T, Q> &v) {
  419. return glm::vec<3, T, Q>(v.y, v.w, v.z);
  420. }
  421. // yww
  422. template<typename T, qualifier Q>
  423. GLM_INLINE glm::vec<3, T, Q> yww(const glm::vec<4, T, Q> &v) {
  424. return glm::vec<3, T, Q>(v.y, v.w, v.w);
  425. }
  426. // zxx
  427. template<typename T, qualifier Q>
  428. GLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<3, T, Q> &v) {
  429. return glm::vec<3, T, Q>(v.z, v.x, v.x);
  430. }
  431. template<typename T, qualifier Q>
  432. GLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<4, T, Q> &v) {
  433. return glm::vec<3, T, Q>(v.z, v.x, v.x);
  434. }
  435. // zxy
  436. template<typename T, qualifier Q>
  437. GLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<3, T, Q> &v) {
  438. return glm::vec<3, T, Q>(v.z, v.x, v.y);
  439. }
  440. template<typename T, qualifier Q>
  441. GLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<4, T, Q> &v) {
  442. return glm::vec<3, T, Q>(v.z, v.x, v.y);
  443. }
  444. // zxz
  445. template<typename T, qualifier Q>
  446. GLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<3, T, Q> &v) {
  447. return glm::vec<3, T, Q>(v.z, v.x, v.z);
  448. }
  449. template<typename T, qualifier Q>
  450. GLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<4, T, Q> &v) {
  451. return glm::vec<3, T, Q>(v.z, v.x, v.z);
  452. }
  453. // zxw
  454. template<typename T, qualifier Q>
  455. GLM_INLINE glm::vec<3, T, Q> zxw(const glm::vec<4, T, Q> &v) {
  456. return glm::vec<3, T, Q>(v.z, v.x, v.w);
  457. }
  458. // zyx
  459. template<typename T, qualifier Q>
  460. GLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<3, T, Q> &v) {
  461. return glm::vec<3, T, Q>(v.z, v.y, v.x);
  462. }
  463. template<typename T, qualifier Q>
  464. GLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<4, T, Q> &v) {
  465. return glm::vec<3, T, Q>(v.z, v.y, v.x);
  466. }
  467. // zyy
  468. template<typename T, qualifier Q>
  469. GLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<3, T, Q> &v) {
  470. return glm::vec<3, T, Q>(v.z, v.y, v.y);
  471. }
  472. template<typename T, qualifier Q>
  473. GLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<4, T, Q> &v) {
  474. return glm::vec<3, T, Q>(v.z, v.y, v.y);
  475. }
  476. // zyz
  477. template<typename T, qualifier Q>
  478. GLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<3, T, Q> &v) {
  479. return glm::vec<3, T, Q>(v.z, v.y, v.z);
  480. }
  481. template<typename T, qualifier Q>
  482. GLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<4, T, Q> &v) {
  483. return glm::vec<3, T, Q>(v.z, v.y, v.z);
  484. }
  485. // zyw
  486. template<typename T, qualifier Q>
  487. GLM_INLINE glm::vec<3, T, Q> zyw(const glm::vec<4, T, Q> &v) {
  488. return glm::vec<3, T, Q>(v.z, v.y, v.w);
  489. }
  490. // zzx
  491. template<typename T, qualifier Q>
  492. GLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<3, T, Q> &v) {
  493. return glm::vec<3, T, Q>(v.z, v.z, v.x);
  494. }
  495. template<typename T, qualifier Q>
  496. GLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<4, T, Q> &v) {
  497. return glm::vec<3, T, Q>(v.z, v.z, v.x);
  498. }
  499. // zzy
  500. template<typename T, qualifier Q>
  501. GLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<3, T, Q> &v) {
  502. return glm::vec<3, T, Q>(v.z, v.z, v.y);
  503. }
  504. template<typename T, qualifier Q>
  505. GLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<4, T, Q> &v) {
  506. return glm::vec<3, T, Q>(v.z, v.z, v.y);
  507. }
  508. // zzz
  509. template<typename T, qualifier Q>
  510. GLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<3, T, Q> &v) {
  511. return glm::vec<3, T, Q>(v.z, v.z, v.z);
  512. }
  513. template<typename T, qualifier Q>
  514. GLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<4, T, Q> &v) {
  515. return glm::vec<3, T, Q>(v.z, v.z, v.z);
  516. }
  517. // zzw
  518. template<typename T, qualifier Q>
  519. GLM_INLINE glm::vec<3, T, Q> zzw(const glm::vec<4, T, Q> &v) {
  520. return glm::vec<3, T, Q>(v.z, v.z, v.w);
  521. }
  522. // zwx
  523. template<typename T, qualifier Q>
  524. GLM_INLINE glm::vec<3, T, Q> zwx(const glm::vec<4, T, Q> &v) {
  525. return glm::vec<3, T, Q>(v.z, v.w, v.x);
  526. }
  527. // zwy
  528. template<typename T, qualifier Q>
  529. GLM_INLINE glm::vec<3, T, Q> zwy(const glm::vec<4, T, Q> &v) {
  530. return glm::vec<3, T, Q>(v.z, v.w, v.y);
  531. }
  532. // zwz
  533. template<typename T, qualifier Q>
  534. GLM_INLINE glm::vec<3, T, Q> zwz(const glm::vec<4, T, Q> &v) {
  535. return glm::vec<3, T, Q>(v.z, v.w, v.z);
  536. }
  537. // zww
  538. template<typename T, qualifier Q>
  539. GLM_INLINE glm::vec<3, T, Q> zww(const glm::vec<4, T, Q> &v) {
  540. return glm::vec<3, T, Q>(v.z, v.w, v.w);
  541. }
  542. // wxx
  543. template<typename T, qualifier Q>
  544. GLM_INLINE glm::vec<3, T, Q> wxx(const glm::vec<4, T, Q> &v) {
  545. return glm::vec<3, T, Q>(v.w, v.x, v.x);
  546. }
  547. // wxy
  548. template<typename T, qualifier Q>
  549. GLM_INLINE glm::vec<3, T, Q> wxy(const glm::vec<4, T, Q> &v) {
  550. return glm::vec<3, T, Q>(v.w, v.x, v.y);
  551. }
  552. // wxz
  553. template<typename T, qualifier Q>
  554. GLM_INLINE glm::vec<3, T, Q> wxz(const glm::vec<4, T, Q> &v) {
  555. return glm::vec<3, T, Q>(v.w, v.x, v.z);
  556. }
  557. // wxw
  558. template<typename T, qualifier Q>
  559. GLM_INLINE glm::vec<3, T, Q> wxw(const glm::vec<4, T, Q> &v) {
  560. return glm::vec<3, T, Q>(v.w, v.x, v.w);
  561. }
  562. // wyx
  563. template<typename T, qualifier Q>
  564. GLM_INLINE glm::vec<3, T, Q> wyx(const glm::vec<4, T, Q> &v) {
  565. return glm::vec<3, T, Q>(v.w, v.y, v.x);
  566. }
  567. // wyy
  568. template<typename T, qualifier Q>
  569. GLM_INLINE glm::vec<3, T, Q> wyy(const glm::vec<4, T, Q> &v) {
  570. return glm::vec<3, T, Q>(v.w, v.y, v.y);
  571. }
  572. // wyz
  573. template<typename T, qualifier Q>
  574. GLM_INLINE glm::vec<3, T, Q> wyz(const glm::vec<4, T, Q> &v) {
  575. return glm::vec<3, T, Q>(v.w, v.y, v.z);
  576. }
  577. // wyw
  578. template<typename T, qualifier Q>
  579. GLM_INLINE glm::vec<3, T, Q> wyw(const glm::vec<4, T, Q> &v) {
  580. return glm::vec<3, T, Q>(v.w, v.y, v.w);
  581. }
  582. // wzx
  583. template<typename T, qualifier Q>
  584. GLM_INLINE glm::vec<3, T, Q> wzx(const glm::vec<4, T, Q> &v) {
  585. return glm::vec<3, T, Q>(v.w, v.z, v.x);
  586. }
  587. // wzy
  588. template<typename T, qualifier Q>
  589. GLM_INLINE glm::vec<3, T, Q> wzy(const glm::vec<4, T, Q> &v) {
  590. return glm::vec<3, T, Q>(v.w, v.z, v.y);
  591. }
  592. // wzz
  593. template<typename T, qualifier Q>
  594. GLM_INLINE glm::vec<3, T, Q> wzz(const glm::vec<4, T, Q> &v) {
  595. return glm::vec<3, T, Q>(v.w, v.z, v.z);
  596. }
  597. // wzw
  598. template<typename T, qualifier Q>
  599. GLM_INLINE glm::vec<3, T, Q> wzw(const glm::vec<4, T, Q> &v) {
  600. return glm::vec<3, T, Q>(v.w, v.z, v.w);
  601. }
  602. // wwx
  603. template<typename T, qualifier Q>
  604. GLM_INLINE glm::vec<3, T, Q> wwx(const glm::vec<4, T, Q> &v) {
  605. return glm::vec<3, T, Q>(v.w, v.w, v.x);
  606. }
  607. // wwy
  608. template<typename T, qualifier Q>
  609. GLM_INLINE glm::vec<3, T, Q> wwy(const glm::vec<4, T, Q> &v) {
  610. return glm::vec<3, T, Q>(v.w, v.w, v.y);
  611. }
  612. // wwz
  613. template<typename T, qualifier Q>
  614. GLM_INLINE glm::vec<3, T, Q> wwz(const glm::vec<4, T, Q> &v) {
  615. return glm::vec<3, T, Q>(v.w, v.w, v.z);
  616. }
  617. // www
  618. template<typename T, qualifier Q>
  619. GLM_INLINE glm::vec<3, T, Q> www(const glm::vec<4, T, Q> &v) {
  620. return glm::vec<3, T, Q>(v.w, v.w, v.w);
  621. }
  622. // xxxx
  623. template<typename T, qualifier Q>
  624. GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<1, T, Q> &v) {
  625. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);
  626. }
  627. template<typename T, qualifier Q>
  628. GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<2, T, Q> &v) {
  629. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);
  630. }
  631. template<typename T, qualifier Q>
  632. GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<3, T, Q> &v) {
  633. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);
  634. }
  635. template<typename T, qualifier Q>
  636. GLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<4, T, Q> &v) {
  637. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);
  638. }
  639. // xxxy
  640. template<typename T, qualifier Q>
  641. GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<2, T, Q> &v) {
  642. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);
  643. }
  644. template<typename T, qualifier Q>
  645. GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<3, T, Q> &v) {
  646. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);
  647. }
  648. template<typename T, qualifier Q>
  649. GLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<4, T, Q> &v) {
  650. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);
  651. }
  652. // xxxz
  653. template<typename T, qualifier Q>
  654. GLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<3, T, Q> &v) {
  655. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z);
  656. }
  657. template<typename T, qualifier Q>
  658. GLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<4, T, Q> &v) {
  659. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z);
  660. }
  661. // xxxw
  662. template<typename T, qualifier Q>
  663. GLM_INLINE glm::vec<4, T, Q> xxxw(const glm::vec<4, T, Q> &v) {
  664. return glm::vec<4, T, Q>(v.x, v.x, v.x, v.w);
  665. }
  666. // xxyx
  667. template<typename T, qualifier Q>
  668. GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<2, T, Q> &v) {
  669. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);
  670. }
  671. template<typename T, qualifier Q>
  672. GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<3, T, Q> &v) {
  673. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);
  674. }
  675. template<typename T, qualifier Q>
  676. GLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<4, T, Q> &v) {
  677. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);
  678. }
  679. // xxyy
  680. template<typename T, qualifier Q>
  681. GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<2, T, Q> &v) {
  682. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);
  683. }
  684. template<typename T, qualifier Q>
  685. GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<3, T, Q> &v) {
  686. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);
  687. }
  688. template<typename T, qualifier Q>
  689. GLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<4, T, Q> &v) {
  690. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);
  691. }
  692. // xxyz
  693. template<typename T, qualifier Q>
  694. GLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<3, T, Q> &v) {
  695. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z);
  696. }
  697. template<typename T, qualifier Q>
  698. GLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<4, T, Q> &v) {
  699. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z);
  700. }
  701. // xxyw
  702. template<typename T, qualifier Q>
  703. GLM_INLINE glm::vec<4, T, Q> xxyw(const glm::vec<4, T, Q> &v) {
  704. return glm::vec<4, T, Q>(v.x, v.x, v.y, v.w);
  705. }
  706. // xxzx
  707. template<typename T, qualifier Q>
  708. GLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<3, T, Q> &v) {
  709. return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x);
  710. }
  711. template<typename T, qualifier Q>
  712. GLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<4, T, Q> &v) {
  713. return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x);
  714. }
  715. // xxzy
  716. template<typename T, qualifier Q>
  717. GLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<3, T, Q> &v) {
  718. return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y);
  719. }
  720. template<typename T, qualifier Q>
  721. GLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<4, T, Q> &v) {
  722. return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y);
  723. }
  724. // xxzz
  725. template<typename T, qualifier Q>
  726. GLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<3, T, Q> &v) {
  727. return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z);
  728. }
  729. template<typename T, qualifier Q>
  730. GLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<4, T, Q> &v) {
  731. return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z);
  732. }
  733. // xxzw
  734. template<typename T, qualifier Q>
  735. GLM_INLINE glm::vec<4, T, Q> xxzw(const glm::vec<4, T, Q> &v) {
  736. return glm::vec<4, T, Q>(v.x, v.x, v.z, v.w);
  737. }
  738. // xxwx
  739. template<typename T, qualifier Q>
  740. GLM_INLINE glm::vec<4, T, Q> xxwx(const glm::vec<4, T, Q> &v) {
  741. return glm::vec<4, T, Q>(v.x, v.x, v.w, v.x);
  742. }
  743. // xxwy
  744. template<typename T, qualifier Q>
  745. GLM_INLINE glm::vec<4, T, Q> xxwy(const glm::vec<4, T, Q> &v) {
  746. return glm::vec<4, T, Q>(v.x, v.x, v.w, v.y);
  747. }
  748. // xxwz
  749. template<typename T, qualifier Q>
  750. GLM_INLINE glm::vec<4, T, Q> xxwz(const glm::vec<4, T, Q> &v) {
  751. return glm::vec<4, T, Q>(v.x, v.x, v.w, v.z);
  752. }
  753. // xxww
  754. template<typename T, qualifier Q>
  755. GLM_INLINE glm::vec<4, T, Q> xxww(const glm::vec<4, T, Q> &v) {
  756. return glm::vec<4, T, Q>(v.x, v.x, v.w, v.w);
  757. }
  758. // xyxx
  759. template<typename T, qualifier Q>
  760. GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<2, T, Q> &v) {
  761. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);
  762. }
  763. template<typename T, qualifier Q>
  764. GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<3, T, Q> &v) {
  765. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);
  766. }
  767. template<typename T, qualifier Q>
  768. GLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<4, T, Q> &v) {
  769. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);
  770. }
  771. // xyxy
  772. template<typename T, qualifier Q>
  773. GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<2, T, Q> &v) {
  774. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);
  775. }
  776. template<typename T, qualifier Q>
  777. GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<3, T, Q> &v) {
  778. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);
  779. }
  780. template<typename T, qualifier Q>
  781. GLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<4, T, Q> &v) {
  782. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);
  783. }
  784. // xyxz
  785. template<typename T, qualifier Q>
  786. GLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<3, T, Q> &v) {
  787. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z);
  788. }
  789. template<typename T, qualifier Q>
  790. GLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<4, T, Q> &v) {
  791. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z);
  792. }
  793. // xyxw
  794. template<typename T, qualifier Q>
  795. GLM_INLINE glm::vec<4, T, Q> xyxw(const glm::vec<4, T, Q> &v) {
  796. return glm::vec<4, T, Q>(v.x, v.y, v.x, v.w);
  797. }
  798. // xyyx
  799. template<typename T, qualifier Q>
  800. GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<2, T, Q> &v) {
  801. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);
  802. }
  803. template<typename T, qualifier Q>
  804. GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<3, T, Q> &v) {
  805. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);
  806. }
  807. template<typename T, qualifier Q>
  808. GLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<4, T, Q> &v) {
  809. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);
  810. }
  811. // xyyy
  812. template<typename T, qualifier Q>
  813. GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<2, T, Q> &v) {
  814. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);
  815. }
  816. template<typename T, qualifier Q>
  817. GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<3, T, Q> &v) {
  818. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);
  819. }
  820. template<typename T, qualifier Q>
  821. GLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<4, T, Q> &v) {
  822. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);
  823. }
  824. // xyyz
  825. template<typename T, qualifier Q>
  826. GLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<3, T, Q> &v) {
  827. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z);
  828. }
  829. template<typename T, qualifier Q>
  830. GLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<4, T, Q> &v) {
  831. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z);
  832. }
  833. // xyyw
  834. template<typename T, qualifier Q>
  835. GLM_INLINE glm::vec<4, T, Q> xyyw(const glm::vec<4, T, Q> &v) {
  836. return glm::vec<4, T, Q>(v.x, v.y, v.y, v.w);
  837. }
  838. // xyzx
  839. template<typename T, qualifier Q>
  840. GLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<3, T, Q> &v) {
  841. return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x);
  842. }
  843. template<typename T, qualifier Q>
  844. GLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<4, T, Q> &v) {
  845. return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x);
  846. }
  847. // xyzy
  848. template<typename T, qualifier Q>
  849. GLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<3, T, Q> &v) {
  850. return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y);
  851. }
  852. template<typename T, qualifier Q>
  853. GLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<4, T, Q> &v) {
  854. return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y);
  855. }
  856. // xyzz
  857. template<typename T, qualifier Q>
  858. GLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<3, T, Q> &v) {
  859. return glm::vec<4, T, Q>(v.x, v.y, v.z, v.z);
  860. }
  861. template<typename T, qualifier Q>
  862. GLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<4, T, Q> &v) {
  863. return glm::vec<4, T, Q>(v.x, v.y, v.z, v.z);
  864. }
  865. // xyzw
  866. template<typename T, qualifier Q>
  867. GLM_INLINE glm::vec<4, T, Q> xyzw(const glm::vec<4, T, Q> &v) {
  868. return glm::vec<4, T, Q>(v.x, v.y, v.z, v.w);
  869. }
  870. // xywx
  871. template<typename T, qualifier Q>
  872. GLM_INLINE glm::vec<4, T, Q> xywx(const glm::vec<4, T, Q> &v) {
  873. return glm::vec<4, T, Q>(v.x, v.y, v.w, v.x);
  874. }
  875. // xywy
  876. template<typename T, qualifier Q>
  877. GLM_INLINE glm::vec<4, T, Q> xywy(const glm::vec<4, T, Q> &v) {
  878. return glm::vec<4, T, Q>(v.x, v.y, v.w, v.y);
  879. }
  880. // xywz
  881. template<typename T, qualifier Q>
  882. GLM_INLINE glm::vec<4, T, Q> xywz(const glm::vec<4, T, Q> &v) {
  883. return glm::vec<4, T, Q>(v.x, v.y, v.w, v.z);
  884. }
  885. // xyww
  886. template<typename T, qualifier Q>
  887. GLM_INLINE glm::vec<4, T, Q> xyww(const glm::vec<4, T, Q> &v) {
  888. return glm::vec<4, T, Q>(v.x, v.y, v.w, v.w);
  889. }
  890. // xzxx
  891. template<typename T, qualifier Q>
  892. GLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<3, T, Q> &v) {
  893. return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x);
  894. }
  895. template<typename T, qualifier Q>
  896. GLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<4, T, Q> &v) {
  897. return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x);
  898. }
  899. // xzxy
  900. template<typename T, qualifier Q>
  901. GLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<3, T, Q> &v) {
  902. return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y);
  903. }
  904. template<typename T, qualifier Q>
  905. GLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<4, T, Q> &v) {
  906. return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y);
  907. }
  908. // xzxz
  909. template<typename T, qualifier Q>
  910. GLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<3, T, Q> &v) {
  911. return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z);
  912. }
  913. template<typename T, qualifier Q>
  914. GLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<4, T, Q> &v) {
  915. return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z);
  916. }
  917. // xzxw
  918. template<typename T, qualifier Q>
  919. GLM_INLINE glm::vec<4, T, Q> xzxw(const glm::vec<4, T, Q> &v) {
  920. return glm::vec<4, T, Q>(v.x, v.z, v.x, v.w);
  921. }
  922. // xzyx
  923. template<typename T, qualifier Q>
  924. GLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<3, T, Q> &v) {
  925. return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x);
  926. }
  927. template<typename T, qualifier Q>
  928. GLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<4, T, Q> &v) {
  929. return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x);
  930. }
  931. // xzyy
  932. template<typename T, qualifier Q>
  933. GLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<3, T, Q> &v) {
  934. return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y);
  935. }
  936. template<typename T, qualifier Q>
  937. GLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<4, T, Q> &v) {
  938. return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y);
  939. }
  940. // xzyz
  941. template<typename T, qualifier Q>
  942. GLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<3, T, Q> &v) {
  943. return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z);
  944. }
  945. template<typename T, qualifier Q>
  946. GLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<4, T, Q> &v) {
  947. return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z);
  948. }
  949. // xzyw
  950. template<typename T, qualifier Q>
  951. GLM_INLINE glm::vec<4, T, Q> xzyw(const glm::vec<4, T, Q> &v) {
  952. return glm::vec<4, T, Q>(v.x, v.z, v.y, v.w);
  953. }
  954. // xzzx
  955. template<typename T, qualifier Q>
  956. GLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<3, T, Q> &v) {
  957. return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x);
  958. }
  959. template<typename T, qualifier Q>
  960. GLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<4, T, Q> &v) {
  961. return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x);
  962. }
  963. // xzzy
  964. template<typename T, qualifier Q>
  965. GLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<3, T, Q> &v) {
  966. return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y);
  967. }
  968. template<typename T, qualifier Q>
  969. GLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<4, T, Q> &v) {
  970. return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y);
  971. }
  972. // xzzz
  973. template<typename T, qualifier Q>
  974. GLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<3, T, Q> &v) {
  975. return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z);
  976. }
  977. template<typename T, qualifier Q>
  978. GLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<4, T, Q> &v) {
  979. return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z);
  980. }
  981. // xzzw
  982. template<typename T, qualifier Q>
  983. GLM_INLINE glm::vec<4, T, Q> xzzw(const glm::vec<4, T, Q> &v) {
  984. return glm::vec<4, T, Q>(v.x, v.z, v.z, v.w);
  985. }
  986. // xzwx
  987. template<typename T, qualifier Q>
  988. GLM_INLINE glm::vec<4, T, Q> xzwx(const glm::vec<4, T, Q> &v) {
  989. return glm::vec<4, T, Q>(v.x, v.z, v.w, v.x);
  990. }
  991. // xzwy
  992. template<typename T, qualifier Q>
  993. GLM_INLINE glm::vec<4, T, Q> xzwy(const glm::vec<4, T, Q> &v) {
  994. return glm::vec<4, T, Q>(v.x, v.z, v.w, v.y);
  995. }
  996. // xzwz
  997. template<typename T, qualifier Q>
  998. GLM_INLINE glm::vec<4, T, Q> xzwz(const glm::vec<4, T, Q> &v) {
  999. return glm::vec<4, T, Q>(v.x, v.z, v.w, v.z);
  1000. }
  1001. // xzww
  1002. template<typename T, qualifier Q>
  1003. GLM_INLINE glm::vec<4, T, Q> xzww(const glm::vec<4, T, Q> &v) {
  1004. return glm::vec<4, T, Q>(v.x, v.z, v.w, v.w);
  1005. }
  1006. // xwxx
  1007. template<typename T, qualifier Q>
  1008. GLM_INLINE glm::vec<4, T, Q> xwxx(const glm::vec<4, T, Q> &v) {
  1009. return glm::vec<4, T, Q>(v.x, v.w, v.x, v.x);
  1010. }
  1011. // xwxy
  1012. template<typename T, qualifier Q>
  1013. GLM_INLINE glm::vec<4, T, Q> xwxy(const glm::vec<4, T, Q> &v) {
  1014. return glm::vec<4, T, Q>(v.x, v.w, v.x, v.y);
  1015. }
  1016. // xwxz
  1017. template<typename T, qualifier Q>
  1018. GLM_INLINE glm::vec<4, T, Q> xwxz(const glm::vec<4, T, Q> &v) {
  1019. return glm::vec<4, T, Q>(v.x, v.w, v.x, v.z);
  1020. }
  1021. // xwxw
  1022. template<typename T, qualifier Q>
  1023. GLM_INLINE glm::vec<4, T, Q> xwxw(const glm::vec<4, T, Q> &v) {
  1024. return glm::vec<4, T, Q>(v.x, v.w, v.x, v.w);
  1025. }
  1026. // xwyx
  1027. template<typename T, qualifier Q>
  1028. GLM_INLINE glm::vec<4, T, Q> xwyx(const glm::vec<4, T, Q> &v) {
  1029. return glm::vec<4, T, Q>(v.x, v.w, v.y, v.x);
  1030. }
  1031. // xwyy
  1032. template<typename T, qualifier Q>
  1033. GLM_INLINE glm::vec<4, T, Q> xwyy(const glm::vec<4, T, Q> &v) {
  1034. return glm::vec<4, T, Q>(v.x, v.w, v.y, v.y);
  1035. }
  1036. // xwyz
  1037. template<typename T, qualifier Q>
  1038. GLM_INLINE glm::vec<4, T, Q> xwyz(const glm::vec<4, T, Q> &v) {
  1039. return glm::vec<4, T, Q>(v.x, v.w, v.y, v.z);
  1040. }
  1041. // xwyw
  1042. template<typename T, qualifier Q>
  1043. GLM_INLINE glm::vec<4, T, Q> xwyw(const glm::vec<4, T, Q> &v) {
  1044. return glm::vec<4, T, Q>(v.x, v.w, v.y, v.w);
  1045. }
  1046. // xwzx
  1047. template<typename T, qualifier Q>
  1048. GLM_INLINE glm::vec<4, T, Q> xwzx(const glm::vec<4, T, Q> &v) {
  1049. return glm::vec<4, T, Q>(v.x, v.w, v.z, v.x);
  1050. }
  1051. // xwzy
  1052. template<typename T, qualifier Q>
  1053. GLM_INLINE glm::vec<4, T, Q> xwzy(const glm::vec<4, T, Q> &v) {
  1054. return glm::vec<4, T, Q>(v.x, v.w, v.z, v.y);
  1055. }
  1056. // xwzz
  1057. template<typename T, qualifier Q>
  1058. GLM_INLINE glm::vec<4, T, Q> xwzz(const glm::vec<4, T, Q> &v) {
  1059. return glm::vec<4, T, Q>(v.x, v.w, v.z, v.z);
  1060. }
  1061. // xwzw
  1062. template<typename T, qualifier Q>
  1063. GLM_INLINE glm::vec<4, T, Q> xwzw(const glm::vec<4, T, Q> &v) {
  1064. return glm::vec<4, T, Q>(v.x, v.w, v.z, v.w);
  1065. }
  1066. // xwwx
  1067. template<typename T, qualifier Q>
  1068. GLM_INLINE glm::vec<4, T, Q> xwwx(const glm::vec<4, T, Q> &v) {
  1069. return glm::vec<4, T, Q>(v.x, v.w, v.w, v.x);
  1070. }
  1071. // xwwy
  1072. template<typename T, qualifier Q>
  1073. GLM_INLINE glm::vec<4, T, Q> xwwy(const glm::vec<4, T, Q> &v) {
  1074. return glm::vec<4, T, Q>(v.x, v.w, v.w, v.y);
  1075. }
  1076. // xwwz
  1077. template<typename T, qualifier Q>
  1078. GLM_INLINE glm::vec<4, T, Q> xwwz(const glm::vec<4, T, Q> &v) {
  1079. return glm::vec<4, T, Q>(v.x, v.w, v.w, v.z);
  1080. }
  1081. // xwww
  1082. template<typename T, qualifier Q>
  1083. GLM_INLINE glm::vec<4, T, Q> xwww(const glm::vec<4, T, Q> &v) {
  1084. return glm::vec<4, T, Q>(v.x, v.w, v.w, v.w);
  1085. }
  1086. // yxxx
  1087. template<typename T, qualifier Q>
  1088. GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<2, T, Q> &v) {
  1089. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);
  1090. }
  1091. template<typename T, qualifier Q>
  1092. GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<3, T, Q> &v) {
  1093. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);
  1094. }
  1095. template<typename T, qualifier Q>
  1096. GLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<4, T, Q> &v) {
  1097. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);
  1098. }
  1099. // yxxy
  1100. template<typename T, qualifier Q>
  1101. GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<2, T, Q> &v) {
  1102. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);
  1103. }
  1104. template<typename T, qualifier Q>
  1105. GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<3, T, Q> &v) {
  1106. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);
  1107. }
  1108. template<typename T, qualifier Q>
  1109. GLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<4, T, Q> &v) {
  1110. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);
  1111. }
  1112. // yxxz
  1113. template<typename T, qualifier Q>
  1114. GLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<3, T, Q> &v) {
  1115. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z);
  1116. }
  1117. template<typename T, qualifier Q>
  1118. GLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<4, T, Q> &v) {
  1119. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z);
  1120. }
  1121. // yxxw
  1122. template<typename T, qualifier Q>
  1123. GLM_INLINE glm::vec<4, T, Q> yxxw(const glm::vec<4, T, Q> &v) {
  1124. return glm::vec<4, T, Q>(v.y, v.x, v.x, v.w);
  1125. }
  1126. // yxyx
  1127. template<typename T, qualifier Q>
  1128. GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<2, T, Q> &v) {
  1129. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);
  1130. }
  1131. template<typename T, qualifier Q>
  1132. GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<3, T, Q> &v) {
  1133. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);
  1134. }
  1135. template<typename T, qualifier Q>
  1136. GLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<4, T, Q> &v) {
  1137. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);
  1138. }
  1139. // yxyy
  1140. template<typename T, qualifier Q>
  1141. GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<2, T, Q> &v) {
  1142. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);
  1143. }
  1144. template<typename T, qualifier Q>
  1145. GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<3, T, Q> &v) {
  1146. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);
  1147. }
  1148. template<typename T, qualifier Q>
  1149. GLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<4, T, Q> &v) {
  1150. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);
  1151. }
  1152. // yxyz
  1153. template<typename T, qualifier Q>
  1154. GLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<3, T, Q> &v) {
  1155. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z);
  1156. }
  1157. template<typename T, qualifier Q>
  1158. GLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<4, T, Q> &v) {
  1159. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z);
  1160. }
  1161. // yxyw
  1162. template<typename T, qualifier Q>
  1163. GLM_INLINE glm::vec<4, T, Q> yxyw(const glm::vec<4, T, Q> &v) {
  1164. return glm::vec<4, T, Q>(v.y, v.x, v.y, v.w);
  1165. }
  1166. // yxzx
  1167. template<typename T, qualifier Q>
  1168. GLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<3, T, Q> &v) {
  1169. return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x);
  1170. }
  1171. template<typename T, qualifier Q>
  1172. GLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<4, T, Q> &v) {
  1173. return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x);
  1174. }
  1175. // yxzy
  1176. template<typename T, qualifier Q>
  1177. GLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<3, T, Q> &v) {
  1178. return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y);
  1179. }
  1180. template<typename T, qualifier Q>
  1181. GLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<4, T, Q> &v) {
  1182. return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y);
  1183. }
  1184. // yxzz
  1185. template<typename T, qualifier Q>
  1186. GLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<3, T, Q> &v) {
  1187. return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z);
  1188. }
  1189. template<typename T, qualifier Q>
  1190. GLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<4, T, Q> &v) {
  1191. return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z);
  1192. }
  1193. // yxzw
  1194. template<typename T, qualifier Q>
  1195. GLM_INLINE glm::vec<4, T, Q> yxzw(const glm::vec<4, T, Q> &v) {
  1196. return glm::vec<4, T, Q>(v.y, v.x, v.z, v.w);
  1197. }
  1198. // yxwx
  1199. template<typename T, qualifier Q>
  1200. GLM_INLINE glm::vec<4, T, Q> yxwx(const glm::vec<4, T, Q> &v) {
  1201. return glm::vec<4, T, Q>(v.y, v.x, v.w, v.x);
  1202. }
  1203. // yxwy
  1204. template<typename T, qualifier Q>
  1205. GLM_INLINE glm::vec<4, T, Q> yxwy(const glm::vec<4, T, Q> &v) {
  1206. return glm::vec<4, T, Q>(v.y, v.x, v.w, v.y);
  1207. }
  1208. // yxwz
  1209. template<typename T, qualifier Q>
  1210. GLM_INLINE glm::vec<4, T, Q> yxwz(const glm::vec<4, T, Q> &v) {
  1211. return glm::vec<4, T, Q>(v.y, v.x, v.w, v.z);
  1212. }
  1213. // yxww
  1214. template<typename T, qualifier Q>
  1215. GLM_INLINE glm::vec<4, T, Q> yxww(const glm::vec<4, T, Q> &v) {
  1216. return glm::vec<4, T, Q>(v.y, v.x, v.w, v.w);
  1217. }
  1218. // yyxx
  1219. template<typename T, qualifier Q>
  1220. GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<2, T, Q> &v) {
  1221. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);
  1222. }
  1223. template<typename T, qualifier Q>
  1224. GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<3, T, Q> &v) {
  1225. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);
  1226. }
  1227. template<typename T, qualifier Q>
  1228. GLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<4, T, Q> &v) {
  1229. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);
  1230. }
  1231. // yyxy
  1232. template<typename T, qualifier Q>
  1233. GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<2, T, Q> &v) {
  1234. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);
  1235. }
  1236. template<typename T, qualifier Q>
  1237. GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<3, T, Q> &v) {
  1238. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);
  1239. }
  1240. template<typename T, qualifier Q>
  1241. GLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<4, T, Q> &v) {
  1242. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);
  1243. }
  1244. // yyxz
  1245. template<typename T, qualifier Q>
  1246. GLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<3, T, Q> &v) {
  1247. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z);
  1248. }
  1249. template<typename T, qualifier Q>
  1250. GLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<4, T, Q> &v) {
  1251. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z);
  1252. }
  1253. // yyxw
  1254. template<typename T, qualifier Q>
  1255. GLM_INLINE glm::vec<4, T, Q> yyxw(const glm::vec<4, T, Q> &v) {
  1256. return glm::vec<4, T, Q>(v.y, v.y, v.x, v.w);
  1257. }
  1258. // yyyx
  1259. template<typename T, qualifier Q>
  1260. GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<2, T, Q> &v) {
  1261. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);
  1262. }
  1263. template<typename T, qualifier Q>
  1264. GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<3, T, Q> &v) {
  1265. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);
  1266. }
  1267. template<typename T, qualifier Q>
  1268. GLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<4, T, Q> &v) {
  1269. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);
  1270. }
  1271. // yyyy
  1272. template<typename T, qualifier Q>
  1273. GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<2, T, Q> &v) {
  1274. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);
  1275. }
  1276. template<typename T, qualifier Q>
  1277. GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<3, T, Q> &v) {
  1278. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);
  1279. }
  1280. template<typename T, qualifier Q>
  1281. GLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<4, T, Q> &v) {
  1282. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);
  1283. }
  1284. // yyyz
  1285. template<typename T, qualifier Q>
  1286. GLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<3, T, Q> &v) {
  1287. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z);
  1288. }
  1289. template<typename T, qualifier Q>
  1290. GLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<4, T, Q> &v) {
  1291. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z);
  1292. }
  1293. // yyyw
  1294. template<typename T, qualifier Q>
  1295. GLM_INLINE glm::vec<4, T, Q> yyyw(const glm::vec<4, T, Q> &v) {
  1296. return glm::vec<4, T, Q>(v.y, v.y, v.y, v.w);
  1297. }
  1298. // yyzx
  1299. template<typename T, qualifier Q>
  1300. GLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<3, T, Q> &v) {
  1301. return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x);
  1302. }
  1303. template<typename T, qualifier Q>
  1304. GLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<4, T, Q> &v) {
  1305. return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x);
  1306. }
  1307. // yyzy
  1308. template<typename T, qualifier Q>
  1309. GLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<3, T, Q> &v) {
  1310. return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y);
  1311. }
  1312. template<typename T, qualifier Q>
  1313. GLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<4, T, Q> &v) {
  1314. return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y);
  1315. }
  1316. // yyzz
  1317. template<typename T, qualifier Q>
  1318. GLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<3, T, Q> &v) {
  1319. return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z);
  1320. }
  1321. template<typename T, qualifier Q>
  1322. GLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<4, T, Q> &v) {
  1323. return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z);
  1324. }
  1325. // yyzw
  1326. template<typename T, qualifier Q>
  1327. GLM_INLINE glm::vec<4, T, Q> yyzw(const glm::vec<4, T, Q> &v) {
  1328. return glm::vec<4, T, Q>(v.y, v.y, v.z, v.w);
  1329. }
  1330. // yywx
  1331. template<typename T, qualifier Q>
  1332. GLM_INLINE glm::vec<4, T, Q> yywx(const glm::vec<4, T, Q> &v) {
  1333. return glm::vec<4, T, Q>(v.y, v.y, v.w, v.x);
  1334. }
  1335. // yywy
  1336. template<typename T, qualifier Q>
  1337. GLM_INLINE glm::vec<4, T, Q> yywy(const glm::vec<4, T, Q> &v) {
  1338. return glm::vec<4, T, Q>(v.y, v.y, v.w, v.y);
  1339. }
  1340. // yywz
  1341. template<typename T, qualifier Q>
  1342. GLM_INLINE glm::vec<4, T, Q> yywz(const glm::vec<4, T, Q> &v) {
  1343. return glm::vec<4, T, Q>(v.y, v.y, v.w, v.z);
  1344. }
  1345. // yyww
  1346. template<typename T, qualifier Q>
  1347. GLM_INLINE glm::vec<4, T, Q> yyww(const glm::vec<4, T, Q> &v) {
  1348. return glm::vec<4, T, Q>(v.y, v.y, v.w, v.w);
  1349. }
  1350. // yzxx
  1351. template<typename T, qualifier Q>
  1352. GLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<3, T, Q> &v) {
  1353. return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x);
  1354. }
  1355. template<typename T, qualifier Q>
  1356. GLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<4, T, Q> &v) {
  1357. return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x);
  1358. }
  1359. // yzxy
  1360. template<typename T, qualifier Q>
  1361. GLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<3, T, Q> &v) {
  1362. return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y);
  1363. }
  1364. template<typename T, qualifier Q>
  1365. GLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<4, T, Q> &v) {
  1366. return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y);
  1367. }
  1368. // yzxz
  1369. template<typename T, qualifier Q>
  1370. GLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<3, T, Q> &v) {
  1371. return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z);
  1372. }
  1373. template<typename T, qualifier Q>
  1374. GLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<4, T, Q> &v) {
  1375. return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z);
  1376. }
  1377. // yzxw
  1378. template<typename T, qualifier Q>
  1379. GLM_INLINE glm::vec<4, T, Q> yzxw(const glm::vec<4, T, Q> &v) {
  1380. return glm::vec<4, T, Q>(v.y, v.z, v.x, v.w);
  1381. }
  1382. // yzyx
  1383. template<typename T, qualifier Q>
  1384. GLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<3, T, Q> &v) {
  1385. return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x);
  1386. }
  1387. template<typename T, qualifier Q>
  1388. GLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<4, T, Q> &v) {
  1389. return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x);
  1390. }
  1391. // yzyy
  1392. template<typename T, qualifier Q>
  1393. GLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<3, T, Q> &v) {
  1394. return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y);
  1395. }
  1396. template<typename T, qualifier Q>
  1397. GLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<4, T, Q> &v) {
  1398. return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y);
  1399. }
  1400. // yzyz
  1401. template<typename T, qualifier Q>
  1402. GLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<3, T, Q> &v) {
  1403. return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z);
  1404. }
  1405. template<typename T, qualifier Q>
  1406. GLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<4, T, Q> &v) {
  1407. return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z);
  1408. }
  1409. // yzyw
  1410. template<typename T, qualifier Q>
  1411. GLM_INLINE glm::vec<4, T, Q> yzyw(const glm::vec<4, T, Q> &v) {
  1412. return glm::vec<4, T, Q>(v.y, v.z, v.y, v.w);
  1413. }
  1414. // yzzx
  1415. template<typename T, qualifier Q>
  1416. GLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<3, T, Q> &v) {
  1417. return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x);
  1418. }
  1419. template<typename T, qualifier Q>
  1420. GLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<4, T, Q> &v) {
  1421. return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x);
  1422. }
  1423. // yzzy
  1424. template<typename T, qualifier Q>
  1425. GLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<3, T, Q> &v) {
  1426. return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y);
  1427. }
  1428. template<typename T, qualifier Q>
  1429. GLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<4, T, Q> &v) {
  1430. return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y);
  1431. }
  1432. // yzzz
  1433. template<typename T, qualifier Q>
  1434. GLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<3, T, Q> &v) {
  1435. return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z);
  1436. }
  1437. template<typename T, qualifier Q>
  1438. GLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<4, T, Q> &v) {
  1439. return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z);
  1440. }
  1441. // yzzw
  1442. template<typename T, qualifier Q>
  1443. GLM_INLINE glm::vec<4, T, Q> yzzw(const glm::vec<4, T, Q> &v) {
  1444. return glm::vec<4, T, Q>(v.y, v.z, v.z, v.w);
  1445. }
  1446. // yzwx
  1447. template<typename T, qualifier Q>
  1448. GLM_INLINE glm::vec<4, T, Q> yzwx(const glm::vec<4, T, Q> &v) {
  1449. return glm::vec<4, T, Q>(v.y, v.z, v.w, v.x);
  1450. }
  1451. // yzwy
  1452. template<typename T, qualifier Q>
  1453. GLM_INLINE glm::vec<4, T, Q> yzwy(const glm::vec<4, T, Q> &v) {
  1454. return glm::vec<4, T, Q>(v.y, v.z, v.w, v.y);
  1455. }
  1456. // yzwz
  1457. template<typename T, qualifier Q>
  1458. GLM_INLINE glm::vec<4, T, Q> yzwz(const glm::vec<4, T, Q> &v) {
  1459. return glm::vec<4, T, Q>(v.y, v.z, v.w, v.z);
  1460. }
  1461. // yzww
  1462. template<typename T, qualifier Q>
  1463. GLM_INLINE glm::vec<4, T, Q> yzww(const glm::vec<4, T, Q> &v) {
  1464. return glm::vec<4, T, Q>(v.y, v.z, v.w, v.w);
  1465. }
  1466. // ywxx
  1467. template<typename T, qualifier Q>
  1468. GLM_INLINE glm::vec<4, T, Q> ywxx(const glm::vec<4, T, Q> &v) {
  1469. return glm::vec<4, T, Q>(v.y, v.w, v.x, v.x);
  1470. }
  1471. // ywxy
  1472. template<typename T, qualifier Q>
  1473. GLM_INLINE glm::vec<4, T, Q> ywxy(const glm::vec<4, T, Q> &v) {
  1474. return glm::vec<4, T, Q>(v.y, v.w, v.x, v.y);
  1475. }
  1476. // ywxz
  1477. template<typename T, qualifier Q>
  1478. GLM_INLINE glm::vec<4, T, Q> ywxz(const glm::vec<4, T, Q> &v) {
  1479. return glm::vec<4, T, Q>(v.y, v.w, v.x, v.z);
  1480. }
  1481. // ywxw
  1482. template<typename T, qualifier Q>
  1483. GLM_INLINE glm::vec<4, T, Q> ywxw(const glm::vec<4, T, Q> &v) {
  1484. return glm::vec<4, T, Q>(v.y, v.w, v.x, v.w);
  1485. }
  1486. // ywyx
  1487. template<typename T, qualifier Q>
  1488. GLM_INLINE glm::vec<4, T, Q> ywyx(const glm::vec<4, T, Q> &v) {
  1489. return glm::vec<4, T, Q>(v.y, v.w, v.y, v.x);
  1490. }
  1491. // ywyy
  1492. template<typename T, qualifier Q>
  1493. GLM_INLINE glm::vec<4, T, Q> ywyy(const glm::vec<4, T, Q> &v) {
  1494. return glm::vec<4, T, Q>(v.y, v.w, v.y, v.y);
  1495. }
  1496. // ywyz
  1497. template<typename T, qualifier Q>
  1498. GLM_INLINE glm::vec<4, T, Q> ywyz(const glm::vec<4, T, Q> &v) {
  1499. return glm::vec<4, T, Q>(v.y, v.w, v.y, v.z);
  1500. }
  1501. // ywyw
  1502. template<typename T, qualifier Q>
  1503. GLM_INLINE glm::vec<4, T, Q> ywyw(const glm::vec<4, T, Q> &v) {
  1504. return glm::vec<4, T, Q>(v.y, v.w, v.y, v.w);
  1505. }
  1506. // ywzx
  1507. template<typename T, qualifier Q>
  1508. GLM_INLINE glm::vec<4, T, Q> ywzx(const glm::vec<4, T, Q> &v) {
  1509. return glm::vec<4, T, Q>(v.y, v.w, v.z, v.x);
  1510. }
  1511. // ywzy
  1512. template<typename T, qualifier Q>
  1513. GLM_INLINE glm::vec<4, T, Q> ywzy(const glm::vec<4, T, Q> &v) {
  1514. return glm::vec<4, T, Q>(v.y, v.w, v.z, v.y);
  1515. }
  1516. // ywzz
  1517. template<typename T, qualifier Q>
  1518. GLM_INLINE glm::vec<4, T, Q> ywzz(const glm::vec<4, T, Q> &v) {
  1519. return glm::vec<4, T, Q>(v.y, v.w, v.z, v.z);
  1520. }
  1521. // ywzw
  1522. template<typename T, qualifier Q>
  1523. GLM_INLINE glm::vec<4, T, Q> ywzw(const glm::vec<4, T, Q> &v) {
  1524. return glm::vec<4, T, Q>(v.y, v.w, v.z, v.w);
  1525. }
  1526. // ywwx
  1527. template<typename T, qualifier Q>
  1528. GLM_INLINE glm::vec<4, T, Q> ywwx(const glm::vec<4, T, Q> &v) {
  1529. return glm::vec<4, T, Q>(v.y, v.w, v.w, v.x);
  1530. }
  1531. // ywwy
  1532. template<typename T, qualifier Q>
  1533. GLM_INLINE glm::vec<4, T, Q> ywwy(const glm::vec<4, T, Q> &v) {
  1534. return glm::vec<4, T, Q>(v.y, v.w, v.w, v.y);
  1535. }
  1536. // ywwz
  1537. template<typename T, qualifier Q>
  1538. GLM_INLINE glm::vec<4, T, Q> ywwz(const glm::vec<4, T, Q> &v) {
  1539. return glm::vec<4, T, Q>(v.y, v.w, v.w, v.z);
  1540. }
  1541. // ywww
  1542. template<typename T, qualifier Q>
  1543. GLM_INLINE glm::vec<4, T, Q> ywww(const glm::vec<4, T, Q> &v) {
  1544. return glm::vec<4, T, Q>(v.y, v.w, v.w, v.w);
  1545. }
  1546. // zxxx
  1547. template<typename T, qualifier Q>
  1548. GLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<3, T, Q> &v) {
  1549. return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x);
  1550. }
  1551. template<typename T, qualifier Q>
  1552. GLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<4, T, Q> &v) {
  1553. return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x);
  1554. }
  1555. // zxxy
  1556. template<typename T, qualifier Q>
  1557. GLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<3, T, Q> &v) {
  1558. return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y);
  1559. }
  1560. template<typename T, qualifier Q>
  1561. GLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<4, T, Q> &v) {
  1562. return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y);
  1563. }
  1564. // zxxz
  1565. template<typename T, qualifier Q>
  1566. GLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<3, T, Q> &v) {
  1567. return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z);
  1568. }
  1569. template<typename T, qualifier Q>
  1570. GLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<4, T, Q> &v) {
  1571. return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z);
  1572. }
  1573. // zxxw
  1574. template<typename T, qualifier Q>
  1575. GLM_INLINE glm::vec<4, T, Q> zxxw(const glm::vec<4, T, Q> &v) {
  1576. return glm::vec<4, T, Q>(v.z, v.x, v.x, v.w);
  1577. }
  1578. // zxyx
  1579. template<typename T, qualifier Q>
  1580. GLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<3, T, Q> &v) {
  1581. return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x);
  1582. }
  1583. template<typename T, qualifier Q>
  1584. GLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<4, T, Q> &v) {
  1585. return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x);
  1586. }
  1587. // zxyy
  1588. template<typename T, qualifier Q>
  1589. GLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<3, T, Q> &v) {
  1590. return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y);
  1591. }
  1592. template<typename T, qualifier Q>
  1593. GLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<4, T, Q> &v) {
  1594. return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y);
  1595. }
  1596. // zxyz
  1597. template<typename T, qualifier Q>
  1598. GLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<3, T, Q> &v) {
  1599. return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z);
  1600. }
  1601. template<typename T, qualifier Q>
  1602. GLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<4, T, Q> &v) {
  1603. return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z);
  1604. }
  1605. // zxyw
  1606. template<typename T, qualifier Q>
  1607. GLM_INLINE glm::vec<4, T, Q> zxyw(const glm::vec<4, T, Q> &v) {
  1608. return glm::vec<4, T, Q>(v.z, v.x, v.y, v.w);
  1609. }
  1610. // zxzx
  1611. template<typename T, qualifier Q>
  1612. GLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<3, T, Q> &v) {
  1613. return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x);
  1614. }
  1615. template<typename T, qualifier Q>
  1616. GLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<4, T, Q> &v) {
  1617. return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x);
  1618. }
  1619. // zxzy
  1620. template<typename T, qualifier Q>
  1621. GLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<3, T, Q> &v) {
  1622. return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y);
  1623. }
  1624. template<typename T, qualifier Q>
  1625. GLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<4, T, Q> &v) {
  1626. return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y);
  1627. }
  1628. // zxzz
  1629. template<typename T, qualifier Q>
  1630. GLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<3, T, Q> &v) {
  1631. return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z);
  1632. }
  1633. template<typename T, qualifier Q>
  1634. GLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<4, T, Q> &v) {
  1635. return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z);
  1636. }
  1637. // zxzw
  1638. template<typename T, qualifier Q>
  1639. GLM_INLINE glm::vec<4, T, Q> zxzw(const glm::vec<4, T, Q> &v) {
  1640. return glm::vec<4, T, Q>(v.z, v.x, v.z, v.w);
  1641. }
  1642. // zxwx
  1643. template<typename T, qualifier Q>
  1644. GLM_INLINE glm::vec<4, T, Q> zxwx(const glm::vec<4, T, Q> &v) {
  1645. return glm::vec<4, T, Q>(v.z, v.x, v.w, v.x);
  1646. }
  1647. // zxwy
  1648. template<typename T, qualifier Q>
  1649. GLM_INLINE glm::vec<4, T, Q> zxwy(const glm::vec<4, T, Q> &v) {
  1650. return glm::vec<4, T, Q>(v.z, v.x, v.w, v.y);
  1651. }
  1652. // zxwz
  1653. template<typename T, qualifier Q>
  1654. GLM_INLINE glm::vec<4, T, Q> zxwz(const glm::vec<4, T, Q> &v) {
  1655. return glm::vec<4, T, Q>(v.z, v.x, v.w, v.z);
  1656. }
  1657. // zxww
  1658. template<typename T, qualifier Q>
  1659. GLM_INLINE glm::vec<4, T, Q> zxww(const glm::vec<4, T, Q> &v) {
  1660. return glm::vec<4, T, Q>(v.z, v.x, v.w, v.w);
  1661. }
  1662. // zyxx
  1663. template<typename T, qualifier Q>
  1664. GLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<3, T, Q> &v) {
  1665. return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x);
  1666. }
  1667. template<typename T, qualifier Q>
  1668. GLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<4, T, Q> &v) {
  1669. return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x);
  1670. }
  1671. // zyxy
  1672. template<typename T, qualifier Q>
  1673. GLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<3, T, Q> &v) {
  1674. return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y);
  1675. }
  1676. template<typename T, qualifier Q>
  1677. GLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<4, T, Q> &v) {
  1678. return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y);
  1679. }
  1680. // zyxz
  1681. template<typename T, qualifier Q>
  1682. GLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<3, T, Q> &v) {
  1683. return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z);
  1684. }
  1685. template<typename T, qualifier Q>
  1686. GLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<4, T, Q> &v) {
  1687. return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z);
  1688. }
  1689. // zyxw
  1690. template<typename T, qualifier Q>
  1691. GLM_INLINE glm::vec<4, T, Q> zyxw(const glm::vec<4, T, Q> &v) {
  1692. return glm::vec<4, T, Q>(v.z, v.y, v.x, v.w);
  1693. }
  1694. // zyyx
  1695. template<typename T, qualifier Q>
  1696. GLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<3, T, Q> &v) {
  1697. return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x);
  1698. }
  1699. template<typename T, qualifier Q>
  1700. GLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<4, T, Q> &v) {
  1701. return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x);
  1702. }
  1703. // zyyy
  1704. template<typename T, qualifier Q>
  1705. GLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<3, T, Q> &v) {
  1706. return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y);
  1707. }
  1708. template<typename T, qualifier Q>
  1709. GLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<4, T, Q> &v) {
  1710. return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y);
  1711. }
  1712. // zyyz
  1713. template<typename T, qualifier Q>
  1714. GLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<3, T, Q> &v) {
  1715. return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z);
  1716. }
  1717. template<typename T, qualifier Q>
  1718. GLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<4, T, Q> &v) {
  1719. return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z);
  1720. }
  1721. // zyyw
  1722. template<typename T, qualifier Q>
  1723. GLM_INLINE glm::vec<4, T, Q> zyyw(const glm::vec<4, T, Q> &v) {
  1724. return glm::vec<4, T, Q>(v.z, v.y, v.y, v.w);
  1725. }
  1726. // zyzx
  1727. template<typename T, qualifier Q>
  1728. GLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<3, T, Q> &v) {
  1729. return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x);
  1730. }
  1731. template<typename T, qualifier Q>
  1732. GLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<4, T, Q> &v) {
  1733. return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x);
  1734. }
  1735. // zyzy
  1736. template<typename T, qualifier Q>
  1737. GLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<3, T, Q> &v) {
  1738. return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y);
  1739. }
  1740. template<typename T, qualifier Q>
  1741. GLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<4, T, Q> &v) {
  1742. return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y);
  1743. }
  1744. // zyzz
  1745. template<typename T, qualifier Q>
  1746. GLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<3, T, Q> &v) {
  1747. return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z);
  1748. }
  1749. template<typename T, qualifier Q>
  1750. GLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<4, T, Q> &v) {
  1751. return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z);
  1752. }
  1753. // zyzw
  1754. template<typename T, qualifier Q>
  1755. GLM_INLINE glm::vec<4, T, Q> zyzw(const glm::vec<4, T, Q> &v) {
  1756. return glm::vec<4, T, Q>(v.z, v.y, v.z, v.w);
  1757. }
  1758. // zywx
  1759. template<typename T, qualifier Q>
  1760. GLM_INLINE glm::vec<4, T, Q> zywx(const glm::vec<4, T, Q> &v) {
  1761. return glm::vec<4, T, Q>(v.z, v.y, v.w, v.x);
  1762. }
  1763. // zywy
  1764. template<typename T, qualifier Q>
  1765. GLM_INLINE glm::vec<4, T, Q> zywy(const glm::vec<4, T, Q> &v) {
  1766. return glm::vec<4, T, Q>(v.z, v.y, v.w, v.y);
  1767. }
  1768. // zywz
  1769. template<typename T, qualifier Q>
  1770. GLM_INLINE glm::vec<4, T, Q> zywz(const glm::vec<4, T, Q> &v) {
  1771. return glm::vec<4, T, Q>(v.z, v.y, v.w, v.z);
  1772. }
  1773. // zyww
  1774. template<typename T, qualifier Q>
  1775. GLM_INLINE glm::vec<4, T, Q> zyww(const glm::vec<4, T, Q> &v) {
  1776. return glm::vec<4, T, Q>(v.z, v.y, v.w, v.w);
  1777. }
  1778. // zzxx
  1779. template<typename T, qualifier Q>
  1780. GLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<3, T, Q> &v) {
  1781. return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x);
  1782. }
  1783. template<typename T, qualifier Q>
  1784. GLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<4, T, Q> &v) {
  1785. return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x);
  1786. }
  1787. // zzxy
  1788. template<typename T, qualifier Q>
  1789. GLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<3, T, Q> &v) {
  1790. return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y);
  1791. }
  1792. template<typename T, qualifier Q>
  1793. GLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<4, T, Q> &v) {
  1794. return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y);
  1795. }
  1796. // zzxz
  1797. template<typename T, qualifier Q>
  1798. GLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<3, T, Q> &v) {
  1799. return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z);
  1800. }
  1801. template<typename T, qualifier Q>
  1802. GLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<4, T, Q> &v) {
  1803. return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z);
  1804. }
  1805. // zzxw
  1806. template<typename T, qualifier Q>
  1807. GLM_INLINE glm::vec<4, T, Q> zzxw(const glm::vec<4, T, Q> &v) {
  1808. return glm::vec<4, T, Q>(v.z, v.z, v.x, v.w);
  1809. }
  1810. // zzyx
  1811. template<typename T, qualifier Q>
  1812. GLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<3, T, Q> &v) {
  1813. return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x);
  1814. }
  1815. template<typename T, qualifier Q>
  1816. GLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<4, T, Q> &v) {
  1817. return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x);
  1818. }
  1819. // zzyy
  1820. template<typename T, qualifier Q>
  1821. GLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<3, T, Q> &v) {
  1822. return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y);
  1823. }
  1824. template<typename T, qualifier Q>
  1825. GLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<4, T, Q> &v) {
  1826. return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y);
  1827. }
  1828. // zzyz
  1829. template<typename T, qualifier Q>
  1830. GLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<3, T, Q> &v) {
  1831. return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z);
  1832. }
  1833. template<typename T, qualifier Q>
  1834. GLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<4, T, Q> &v) {
  1835. return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z);
  1836. }
  1837. // zzyw
  1838. template<typename T, qualifier Q>
  1839. GLM_INLINE glm::vec<4, T, Q> zzyw(const glm::vec<4, T, Q> &v) {
  1840. return glm::vec<4, T, Q>(v.z, v.z, v.y, v.w);
  1841. }
  1842. // zzzx
  1843. template<typename T, qualifier Q>
  1844. GLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<3, T, Q> &v) {
  1845. return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x);
  1846. }
  1847. template<typename T, qualifier Q>
  1848. GLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<4, T, Q> &v) {
  1849. return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x);
  1850. }
  1851. // zzzy
  1852. template<typename T, qualifier Q>
  1853. GLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<3, T, Q> &v) {
  1854. return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y);
  1855. }
  1856. template<typename T, qualifier Q>
  1857. GLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<4, T, Q> &v) {
  1858. return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y);
  1859. }
  1860. // zzzz
  1861. template<typename T, qualifier Q>
  1862. GLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<3, T, Q> &v) {
  1863. return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z);
  1864. }
  1865. template<typename T, qualifier Q>
  1866. GLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<4, T, Q> &v) {
  1867. return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z);
  1868. }
  1869. // zzzw
  1870. template<typename T, qualifier Q>
  1871. GLM_INLINE glm::vec<4, T, Q> zzzw(const glm::vec<4, T, Q> &v) {
  1872. return glm::vec<4, T, Q>(v.z, v.z, v.z, v.w);
  1873. }
  1874. // zzwx
  1875. template<typename T, qualifier Q>
  1876. GLM_INLINE glm::vec<4, T, Q> zzwx(const glm::vec<4, T, Q> &v) {
  1877. return glm::vec<4, T, Q>(v.z, v.z, v.w, v.x);
  1878. }
  1879. // zzwy
  1880. template<typename T, qualifier Q>
  1881. GLM_INLINE glm::vec<4, T, Q> zzwy(const glm::vec<4, T, Q> &v) {
  1882. return glm::vec<4, T, Q>(v.z, v.z, v.w, v.y);
  1883. }
  1884. // zzwz
  1885. template<typename T, qualifier Q>
  1886. GLM_INLINE glm::vec<4, T, Q> zzwz(const glm::vec<4, T, Q> &v) {
  1887. return glm::vec<4, T, Q>(v.z, v.z, v.w, v.z);
  1888. }
  1889. // zzww
  1890. template<typename T, qualifier Q>
  1891. GLM_INLINE glm::vec<4, T, Q> zzww(const glm::vec<4, T, Q> &v) {
  1892. return glm::vec<4, T, Q>(v.z, v.z, v.w, v.w);
  1893. }
  1894. // zwxx
  1895. template<typename T, qualifier Q>
  1896. GLM_INLINE glm::vec<4, T, Q> zwxx(const glm::vec<4, T, Q> &v) {
  1897. return glm::vec<4, T, Q>(v.z, v.w, v.x, v.x);
  1898. }
  1899. // zwxy
  1900. template<typename T, qualifier Q>
  1901. GLM_INLINE glm::vec<4, T, Q> zwxy(const glm::vec<4, T, Q> &v) {
  1902. return glm::vec<4, T, Q>(v.z, v.w, v.x, v.y);
  1903. }
  1904. // zwxz
  1905. template<typename T, qualifier Q>
  1906. GLM_INLINE glm::vec<4, T, Q> zwxz(const glm::vec<4, T, Q> &v) {
  1907. return glm::vec<4, T, Q>(v.z, v.w, v.x, v.z);
  1908. }
  1909. // zwxw
  1910. template<typename T, qualifier Q>
  1911. GLM_INLINE glm::vec<4, T, Q> zwxw(const glm::vec<4, T, Q> &v) {
  1912. return glm::vec<4, T, Q>(v.z, v.w, v.x, v.w);
  1913. }
  1914. // zwyx
  1915. template<typename T, qualifier Q>
  1916. GLM_INLINE glm::vec<4, T, Q> zwyx(const glm::vec<4, T, Q> &v) {
  1917. return glm::vec<4, T, Q>(v.z, v.w, v.y, v.x);
  1918. }
  1919. // zwyy
  1920. template<typename T, qualifier Q>
  1921. GLM_INLINE glm::vec<4, T, Q> zwyy(const glm::vec<4, T, Q> &v) {
  1922. return glm::vec<4, T, Q>(v.z, v.w, v.y, v.y);
  1923. }
  1924. // zwyz
  1925. template<typename T, qualifier Q>
  1926. GLM_INLINE glm::vec<4, T, Q> zwyz(const glm::vec<4, T, Q> &v) {
  1927. return glm::vec<4, T, Q>(v.z, v.w, v.y, v.z);
  1928. }
  1929. // zwyw
  1930. template<typename T, qualifier Q>
  1931. GLM_INLINE glm::vec<4, T, Q> zwyw(const glm::vec<4, T, Q> &v) {
  1932. return glm::vec<4, T, Q>(v.z, v.w, v.y, v.w);
  1933. }
  1934. // zwzx
  1935. template<typename T, qualifier Q>
  1936. GLM_INLINE glm::vec<4, T, Q> zwzx(const glm::vec<4, T, Q> &v) {
  1937. return glm::vec<4, T, Q>(v.z, v.w, v.z, v.x);
  1938. }
  1939. // zwzy
  1940. template<typename T, qualifier Q>
  1941. GLM_INLINE glm::vec<4, T, Q> zwzy(const glm::vec<4, T, Q> &v) {
  1942. return glm::vec<4, T, Q>(v.z, v.w, v.z, v.y);
  1943. }
  1944. // zwzz
  1945. template<typename T, qualifier Q>
  1946. GLM_INLINE glm::vec<4, T, Q> zwzz(const glm::vec<4, T, Q> &v) {
  1947. return glm::vec<4, T, Q>(v.z, v.w, v.z, v.z);
  1948. }
  1949. // zwzw
  1950. template<typename T, qualifier Q>
  1951. GLM_INLINE glm::vec<4, T, Q> zwzw(const glm::vec<4, T, Q> &v) {
  1952. return glm::vec<4, T, Q>(v.z, v.w, v.z, v.w);
  1953. }
  1954. // zwwx
  1955. template<typename T, qualifier Q>
  1956. GLM_INLINE glm::vec<4, T, Q> zwwx(const glm::vec<4, T, Q> &v) {
  1957. return glm::vec<4, T, Q>(v.z, v.w, v.w, v.x);
  1958. }
  1959. // zwwy
  1960. template<typename T, qualifier Q>
  1961. GLM_INLINE glm::vec<4, T, Q> zwwy(const glm::vec<4, T, Q> &v) {
  1962. return glm::vec<4, T, Q>(v.z, v.w, v.w, v.y);
  1963. }
  1964. // zwwz
  1965. template<typename T, qualifier Q>
  1966. GLM_INLINE glm::vec<4, T, Q> zwwz(const glm::vec<4, T, Q> &v) {
  1967. return glm::vec<4, T, Q>(v.z, v.w, v.w, v.z);
  1968. }
  1969. // zwww
  1970. template<typename T, qualifier Q>
  1971. GLM_INLINE glm::vec<4, T, Q> zwww(const glm::vec<4, T, Q> &v) {
  1972. return glm::vec<4, T, Q>(v.z, v.w, v.w, v.w);
  1973. }
  1974. // wxxx
  1975. template<typename T, qualifier Q>
  1976. GLM_INLINE glm::vec<4, T, Q> wxxx(const glm::vec<4, T, Q> &v) {
  1977. return glm::vec<4, T, Q>(v.w, v.x, v.x, v.x);
  1978. }
  1979. // wxxy
  1980. template<typename T, qualifier Q>
  1981. GLM_INLINE glm::vec<4, T, Q> wxxy(const glm::vec<4, T, Q> &v) {
  1982. return glm::vec<4, T, Q>(v.w, v.x, v.x, v.y);
  1983. }
  1984. // wxxz
  1985. template<typename T, qualifier Q>
  1986. GLM_INLINE glm::vec<4, T, Q> wxxz(const glm::vec<4, T, Q> &v) {
  1987. return glm::vec<4, T, Q>(v.w, v.x, v.x, v.z);
  1988. }
  1989. // wxxw
  1990. template<typename T, qualifier Q>
  1991. GLM_INLINE glm::vec<4, T, Q> wxxw(const glm::vec<4, T, Q> &v) {
  1992. return glm::vec<4, T, Q>(v.w, v.x, v.x, v.w);
  1993. }
  1994. // wxyx
  1995. template<typename T, qualifier Q>
  1996. GLM_INLINE glm::vec<4, T, Q> wxyx(const glm::vec<4, T, Q> &v) {
  1997. return glm::vec<4, T, Q>(v.w, v.x, v.y, v.x);
  1998. }
  1999. // wxyy
  2000. template<typename T, qualifier Q>
  2001. GLM_INLINE glm::vec<4, T, Q> wxyy(const glm::vec<4, T, Q> &v) {
  2002. return glm::vec<4, T, Q>(v.w, v.x, v.y, v.y);
  2003. }
  2004. // wxyz
  2005. template<typename T, qualifier Q>
  2006. GLM_INLINE glm::vec<4, T, Q> wxyz(const glm::vec<4, T, Q> &v) {
  2007. return glm::vec<4, T, Q>(v.w, v.x, v.y, v.z);
  2008. }
  2009. // wxyw
  2010. template<typename T, qualifier Q>
  2011. GLM_INLINE glm::vec<4, T, Q> wxyw(const glm::vec<4, T, Q> &v) {
  2012. return glm::vec<4, T, Q>(v.w, v.x, v.y, v.w);
  2013. }
  2014. // wxzx
  2015. template<typename T, qualifier Q>
  2016. GLM_INLINE glm::vec<4, T, Q> wxzx(const glm::vec<4, T, Q> &v) {
  2017. return glm::vec<4, T, Q>(v.w, v.x, v.z, v.x);
  2018. }
  2019. // wxzy
  2020. template<typename T, qualifier Q>
  2021. GLM_INLINE glm::vec<4, T, Q> wxzy(const glm::vec<4, T, Q> &v) {
  2022. return glm::vec<4, T, Q>(v.w, v.x, v.z, v.y);
  2023. }
  2024. // wxzz
  2025. template<typename T, qualifier Q>
  2026. GLM_INLINE glm::vec<4, T, Q> wxzz(const glm::vec<4, T, Q> &v) {
  2027. return glm::vec<4, T, Q>(v.w, v.x, v.z, v.z);
  2028. }
  2029. // wxzw
  2030. template<typename T, qualifier Q>
  2031. GLM_INLINE glm::vec<4, T, Q> wxzw(const glm::vec<4, T, Q> &v) {
  2032. return glm::vec<4, T, Q>(v.w, v.x, v.z, v.w);
  2033. }
  2034. // wxwx
  2035. template<typename T, qualifier Q>
  2036. GLM_INLINE glm::vec<4, T, Q> wxwx(const glm::vec<4, T, Q> &v) {
  2037. return glm::vec<4, T, Q>(v.w, v.x, v.w, v.x);
  2038. }
  2039. // wxwy
  2040. template<typename T, qualifier Q>
  2041. GLM_INLINE glm::vec<4, T, Q> wxwy(const glm::vec<4, T, Q> &v) {
  2042. return glm::vec<4, T, Q>(v.w, v.x, v.w, v.y);
  2043. }
  2044. // wxwz
  2045. template<typename T, qualifier Q>
  2046. GLM_INLINE glm::vec<4, T, Q> wxwz(const glm::vec<4, T, Q> &v) {
  2047. return glm::vec<4, T, Q>(v.w, v.x, v.w, v.z);
  2048. }
  2049. // wxww
  2050. template<typename T, qualifier Q>
  2051. GLM_INLINE glm::vec<4, T, Q> wxww(const glm::vec<4, T, Q> &v) {
  2052. return glm::vec<4, T, Q>(v.w, v.x, v.w, v.w);
  2053. }
  2054. // wyxx
  2055. template<typename T, qualifier Q>
  2056. GLM_INLINE glm::vec<4, T, Q> wyxx(const glm::vec<4, T, Q> &v) {
  2057. return glm::vec<4, T, Q>(v.w, v.y, v.x, v.x);
  2058. }
  2059. // wyxy
  2060. template<typename T, qualifier Q>
  2061. GLM_INLINE glm::vec<4, T, Q> wyxy(const glm::vec<4, T, Q> &v) {
  2062. return glm::vec<4, T, Q>(v.w, v.y, v.x, v.y);
  2063. }
  2064. // wyxz
  2065. template<typename T, qualifier Q>
  2066. GLM_INLINE glm::vec<4, T, Q> wyxz(const glm::vec<4, T, Q> &v) {
  2067. return glm::vec<4, T, Q>(v.w, v.y, v.x, v.z);
  2068. }
  2069. // wyxw
  2070. template<typename T, qualifier Q>
  2071. GLM_INLINE glm::vec<4, T, Q> wyxw(const glm::vec<4, T, Q> &v) {
  2072. return glm::vec<4, T, Q>(v.w, v.y, v.x, v.w);
  2073. }
  2074. // wyyx
  2075. template<typename T, qualifier Q>
  2076. GLM_INLINE glm::vec<4, T, Q> wyyx(const glm::vec<4, T, Q> &v) {
  2077. return glm::vec<4, T, Q>(v.w, v.y, v.y, v.x);
  2078. }
  2079. // wyyy
  2080. template<typename T, qualifier Q>
  2081. GLM_INLINE glm::vec<4, T, Q> wyyy(const glm::vec<4, T, Q> &v) {
  2082. return glm::vec<4, T, Q>(v.w, v.y, v.y, v.y);
  2083. }
  2084. // wyyz
  2085. template<typename T, qualifier Q>
  2086. GLM_INLINE glm::vec<4, T, Q> wyyz(const glm::vec<4, T, Q> &v) {
  2087. return glm::vec<4, T, Q>(v.w, v.y, v.y, v.z);
  2088. }
  2089. // wyyw
  2090. template<typename T, qualifier Q>
  2091. GLM_INLINE glm::vec<4, T, Q> wyyw(const glm::vec<4, T, Q> &v) {
  2092. return glm::vec<4, T, Q>(v.w, v.y, v.y, v.w);
  2093. }
  2094. // wyzx
  2095. template<typename T, qualifier Q>
  2096. GLM_INLINE glm::vec<4, T, Q> wyzx(const glm::vec<4, T, Q> &v) {
  2097. return glm::vec<4, T, Q>(v.w, v.y, v.z, v.x);
  2098. }
  2099. // wyzy
  2100. template<typename T, qualifier Q>
  2101. GLM_INLINE glm::vec<4, T, Q> wyzy(const glm::vec<4, T, Q> &v) {
  2102. return glm::vec<4, T, Q>(v.w, v.y, v.z, v.y);
  2103. }
  2104. // wyzz
  2105. template<typename T, qualifier Q>
  2106. GLM_INLINE glm::vec<4, T, Q> wyzz(const glm::vec<4, T, Q> &v) {
  2107. return glm::vec<4, T, Q>(v.w, v.y, v.z, v.z);
  2108. }
  2109. // wyzw
  2110. template<typename T, qualifier Q>
  2111. GLM_INLINE glm::vec<4, T, Q> wyzw(const glm::vec<4, T, Q> &v) {
  2112. return glm::vec<4, T, Q>(v.w, v.y, v.z, v.w);
  2113. }
  2114. // wywx
  2115. template<typename T, qualifier Q>
  2116. GLM_INLINE glm::vec<4, T, Q> wywx(const glm::vec<4, T, Q> &v) {
  2117. return glm::vec<4, T, Q>(v.w, v.y, v.w, v.x);
  2118. }
  2119. // wywy
  2120. template<typename T, qualifier Q>
  2121. GLM_INLINE glm::vec<4, T, Q> wywy(const glm::vec<4, T, Q> &v) {
  2122. return glm::vec<4, T, Q>(v.w, v.y, v.w, v.y);
  2123. }
  2124. // wywz
  2125. template<typename T, qualifier Q>
  2126. GLM_INLINE glm::vec<4, T, Q> wywz(const glm::vec<4, T, Q> &v) {
  2127. return glm::vec<4, T, Q>(v.w, v.y, v.w, v.z);
  2128. }
  2129. // wyww
  2130. template<typename T, qualifier Q>
  2131. GLM_INLINE glm::vec<4, T, Q> wyww(const glm::vec<4, T, Q> &v) {
  2132. return glm::vec<4, T, Q>(v.w, v.y, v.w, v.w);
  2133. }
  2134. // wzxx
  2135. template<typename T, qualifier Q>
  2136. GLM_INLINE glm::vec<4, T, Q> wzxx(const glm::vec<4, T, Q> &v) {
  2137. return glm::vec<4, T, Q>(v.w, v.z, v.x, v.x);
  2138. }
  2139. // wzxy
  2140. template<typename T, qualifier Q>
  2141. GLM_INLINE glm::vec<4, T, Q> wzxy(const glm::vec<4, T, Q> &v) {
  2142. return glm::vec<4, T, Q>(v.w, v.z, v.x, v.y);
  2143. }
  2144. // wzxz
  2145. template<typename T, qualifier Q>
  2146. GLM_INLINE glm::vec<4, T, Q> wzxz(const glm::vec<4, T, Q> &v) {
  2147. return glm::vec<4, T, Q>(v.w, v.z, v.x, v.z);
  2148. }
  2149. // wzxw
  2150. template<typename T, qualifier Q>
  2151. GLM_INLINE glm::vec<4, T, Q> wzxw(const glm::vec<4, T, Q> &v) {
  2152. return glm::vec<4, T, Q>(v.w, v.z, v.x, v.w);
  2153. }
  2154. // wzyx
  2155. template<typename T, qualifier Q>
  2156. GLM_INLINE glm::vec<4, T, Q> wzyx(const glm::vec<4, T, Q> &v) {
  2157. return glm::vec<4, T, Q>(v.w, v.z, v.y, v.x);
  2158. }
  2159. // wzyy
  2160. template<typename T, qualifier Q>
  2161. GLM_INLINE glm::vec<4, T, Q> wzyy(const glm::vec<4, T, Q> &v) {
  2162. return glm::vec<4, T, Q>(v.w, v.z, v.y, v.y);
  2163. }
  2164. // wzyz
  2165. template<typename T, qualifier Q>
  2166. GLM_INLINE glm::vec<4, T, Q> wzyz(const glm::vec<4, T, Q> &v) {
  2167. return glm::vec<4, T, Q>(v.w, v.z, v.y, v.z);
  2168. }
  2169. // wzyw
  2170. template<typename T, qualifier Q>
  2171. GLM_INLINE glm::vec<4, T, Q> wzyw(const glm::vec<4, T, Q> &v) {
  2172. return glm::vec<4, T, Q>(v.w, v.z, v.y, v.w);
  2173. }
  2174. // wzzx
  2175. template<typename T, qualifier Q>
  2176. GLM_INLINE glm::vec<4, T, Q> wzzx(const glm::vec<4, T, Q> &v) {
  2177. return glm::vec<4, T, Q>(v.w, v.z, v.z, v.x);
  2178. }
  2179. // wzzy
  2180. template<typename T, qualifier Q>
  2181. GLM_INLINE glm::vec<4, T, Q> wzzy(const glm::vec<4, T, Q> &v) {
  2182. return glm::vec<4, T, Q>(v.w, v.z, v.z, v.y);
  2183. }
  2184. // wzzz
  2185. template<typename T, qualifier Q>
  2186. GLM_INLINE glm::vec<4, T, Q> wzzz(const glm::vec<4, T, Q> &v) {
  2187. return glm::vec<4, T, Q>(v.w, v.z, v.z, v.z);
  2188. }
  2189. // wzzw
  2190. template<typename T, qualifier Q>
  2191. GLM_INLINE glm::vec<4, T, Q> wzzw(const glm::vec<4, T, Q> &v) {
  2192. return glm::vec<4, T, Q>(v.w, v.z, v.z, v.w);
  2193. }
  2194. // wzwx
  2195. template<typename T, qualifier Q>
  2196. GLM_INLINE glm::vec<4, T, Q> wzwx(const glm::vec<4, T, Q> &v) {
  2197. return glm::vec<4, T, Q>(v.w, v.z, v.w, v.x);
  2198. }
  2199. // wzwy
  2200. template<typename T, qualifier Q>
  2201. GLM_INLINE glm::vec<4, T, Q> wzwy(const glm::vec<4, T, Q> &v) {
  2202. return glm::vec<4, T, Q>(v.w, v.z, v.w, v.y);
  2203. }
  2204. // wzwz
  2205. template<typename T, qualifier Q>
  2206. GLM_INLINE glm::vec<4, T, Q> wzwz(const glm::vec<4, T, Q> &v) {
  2207. return glm::vec<4, T, Q>(v.w, v.z, v.w, v.z);
  2208. }
  2209. // wzww
  2210. template<typename T, qualifier Q>
  2211. GLM_INLINE glm::vec<4, T, Q> wzww(const glm::vec<4, T, Q> &v) {
  2212. return glm::vec<4, T, Q>(v.w, v.z, v.w, v.w);
  2213. }
  2214. // wwxx
  2215. template<typename T, qualifier Q>
  2216. GLM_INLINE glm::vec<4, T, Q> wwxx(const glm::vec<4, T, Q> &v) {
  2217. return glm::vec<4, T, Q>(v.w, v.w, v.x, v.x);
  2218. }
  2219. // wwxy
  2220. template<typename T, qualifier Q>
  2221. GLM_INLINE glm::vec<4, T, Q> wwxy(const glm::vec<4, T, Q> &v) {
  2222. return glm::vec<4, T, Q>(v.w, v.w, v.x, v.y);
  2223. }
  2224. // wwxz
  2225. template<typename T, qualifier Q>
  2226. GLM_INLINE glm::vec<4, T, Q> wwxz(const glm::vec<4, T, Q> &v) {
  2227. return glm::vec<4, T, Q>(v.w, v.w, v.x, v.z);
  2228. }
  2229. // wwxw
  2230. template<typename T, qualifier Q>
  2231. GLM_INLINE glm::vec<4, T, Q> wwxw(const glm::vec<4, T, Q> &v) {
  2232. return glm::vec<4, T, Q>(v.w, v.w, v.x, v.w);
  2233. }
  2234. // wwyx
  2235. template<typename T, qualifier Q>
  2236. GLM_INLINE glm::vec<4, T, Q> wwyx(const glm::vec<4, T, Q> &v) {
  2237. return glm::vec<4, T, Q>(v.w, v.w, v.y, v.x);
  2238. }
  2239. // wwyy
  2240. template<typename T, qualifier Q>
  2241. GLM_INLINE glm::vec<4, T, Q> wwyy(const glm::vec<4, T, Q> &v) {
  2242. return glm::vec<4, T, Q>(v.w, v.w, v.y, v.y);
  2243. }
  2244. // wwyz
  2245. template<typename T, qualifier Q>
  2246. GLM_INLINE glm::vec<4, T, Q> wwyz(const glm::vec<4, T, Q> &v) {
  2247. return glm::vec<4, T, Q>(v.w, v.w, v.y, v.z);
  2248. }
  2249. // wwyw
  2250. template<typename T, qualifier Q>
  2251. GLM_INLINE glm::vec<4, T, Q> wwyw(const glm::vec<4, T, Q> &v) {
  2252. return glm::vec<4, T, Q>(v.w, v.w, v.y, v.w);
  2253. }
  2254. // wwzx
  2255. template<typename T, qualifier Q>
  2256. GLM_INLINE glm::vec<4, T, Q> wwzx(const glm::vec<4, T, Q> &v) {
  2257. return glm::vec<4, T, Q>(v.w, v.w, v.z, v.x);
  2258. }
  2259. // wwzy
  2260. template<typename T, qualifier Q>
  2261. GLM_INLINE glm::vec<4, T, Q> wwzy(const glm::vec<4, T, Q> &v) {
  2262. return glm::vec<4, T, Q>(v.w, v.w, v.z, v.y);
  2263. }
  2264. // wwzz
  2265. template<typename T, qualifier Q>
  2266. GLM_INLINE glm::vec<4, T, Q> wwzz(const glm::vec<4, T, Q> &v) {
  2267. return glm::vec<4, T, Q>(v.w, v.w, v.z, v.z);
  2268. }
  2269. // wwzw
  2270. template<typename T, qualifier Q>
  2271. GLM_INLINE glm::vec<4, T, Q> wwzw(const glm::vec<4, T, Q> &v) {
  2272. return glm::vec<4, T, Q>(v.w, v.w, v.z, v.w);
  2273. }
  2274. // wwwx
  2275. template<typename T, qualifier Q>
  2276. GLM_INLINE glm::vec<4, T, Q> wwwx(const glm::vec<4, T, Q> &v) {
  2277. return glm::vec<4, T, Q>(v.w, v.w, v.w, v.x);
  2278. }
  2279. // wwwy
  2280. template<typename T, qualifier Q>
  2281. GLM_INLINE glm::vec<4, T, Q> wwwy(const glm::vec<4, T, Q> &v) {
  2282. return glm::vec<4, T, Q>(v.w, v.w, v.w, v.y);
  2283. }
  2284. // wwwz
  2285. template<typename T, qualifier Q>
  2286. GLM_INLINE glm::vec<4, T, Q> wwwz(const glm::vec<4, T, Q> &v) {
  2287. return glm::vec<4, T, Q>(v.w, v.w, v.w, v.z);
  2288. }
  2289. // wwww
  2290. template<typename T, qualifier Q>
  2291. GLM_INLINE glm::vec<4, T, Q> wwww(const glm::vec<4, T, Q> &v) {
  2292. return glm::vec<4, T, Q>(v.w, v.w, v.w, v.w);
  2293. }
  2294. }