Vec.h 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Math/Common.h>
  7. #include <AnKi/Util/F16.h>
  8. namespace anki {
  9. /// @addtogroup math
  10. /// @{
  11. /// Common code for all vectors
  12. /// @tparam T The scalar type. Eg float.
  13. /// @tparam N The number of the vector components (2, 3 or 4).
  14. template<typename T, U N>
  15. class alignas(MathSimd<T, N>::ALIGNMENT) TVec
  16. {
  17. public:
  18. using Scalar = T;
  19. using Simd = typename MathSimd<T, N>::Type;
  20. static constexpr U COMPONENT_COUNT = N;
  21. static constexpr Bool IS_INTEGER = std::is_integral<T>::value;
  22. static constexpr Bool HAS_VEC4_SIMD = N == 4 && std::is_same<T, F32>::value && ANKI_ENABLE_SIMD;
  23. /// @name Constructors
  24. /// @{
  25. /// Defaut constructor. IT WILL NOT INITIALIZE ANYTHING.
  26. TVec()
  27. {
  28. }
  29. /// Copy.
  30. TVec(ANKI_ENABLE_ARG(const TVec&, !HAS_VEC4_SIMD) b)
  31. {
  32. for(U i = 0; i < N; i++)
  33. {
  34. m_arr[i] = b.m_arr[i];
  35. }
  36. }
  37. /// Copy.
  38. TVec(ANKI_ENABLE_ARG(const TVec&, HAS_VEC4_SIMD) b)
  39. {
  40. m_simd = b.m_simd;
  41. }
  42. /// Convert from another type. From int to float vectors and the opposite.
  43. template<typename Y, ANKI_ENABLE(!std::is_same<Y, T>::value)>
  44. explicit TVec(const TVec<Y, N>& b)
  45. {
  46. for(U i = 0; i < N; i++)
  47. {
  48. m_arr[i] = T(b[i]);
  49. }
  50. }
  51. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  52. explicit TVec(const T f)
  53. {
  54. for(U i = 0; i < N; ++i)
  55. {
  56. m_arr[i] = f;
  57. }
  58. }
  59. #if ANKI_ENABLE_SIMD
  60. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  61. explicit TVec(const T f)
  62. {
  63. # if ANKI_SIMD_SSE
  64. m_simd = _mm_set1_ps(f);
  65. # else
  66. m_simd = vdupq_n_f32(f);
  67. # endif
  68. }
  69. #endif
  70. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  71. explicit TVec(const T arr[])
  72. {
  73. for(U i = 0; i < N; ++i)
  74. {
  75. m_arr[i] = arr[i];
  76. }
  77. }
  78. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  79. explicit TVec(const T arr[])
  80. {
  81. m_simd = _mm_load_ps(arr);
  82. }
  83. explicit TVec(const Array<T, N>& arr)
  84. {
  85. for(U i = 0; i < N; ++i)
  86. {
  87. m_arr[i] = arr[i];
  88. }
  89. }
  90. explicit TVec(const Simd& simd)
  91. {
  92. m_simd = simd;
  93. }
  94. ANKI_ENABLE_METHOD(N == 2)
  95. TVec(const T x_, const T y_)
  96. {
  97. x() = x_;
  98. y() = y_;
  99. }
  100. // Vec3 specific
  101. ANKI_ENABLE_METHOD(N == 3)
  102. TVec(const T x_, const T y_, const T z_)
  103. {
  104. x() = x_;
  105. y() = y_;
  106. z() = z_;
  107. }
  108. ANKI_ENABLE_METHOD(N == 3)
  109. TVec(const TVec<T, 2>& a, const T z_)
  110. {
  111. x() = a.x();
  112. y() = a.y();
  113. z() = z_;
  114. }
  115. ANKI_ENABLE_METHOD(N == 3)
  116. TVec(const T x_, const TVec<T, 2>& a)
  117. {
  118. x() = x_;
  119. y() = a.x();
  120. z() = a.y();
  121. }
  122. // Vec4 specific
  123. ANKI_ENABLE_METHOD(N == 4 && !HAS_VEC4_SIMD)
  124. TVec(const T x_, const T y_, const T z_, const T w_)
  125. {
  126. x() = x_;
  127. y() = y_;
  128. z() = z_;
  129. w() = w_;
  130. }
  131. #if ANKI_ENABLE_SIMD
  132. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  133. TVec(const T x_, const T y_, const T z_, const T w_)
  134. {
  135. # if ANKI_SIMD_SSE
  136. m_simd = _mm_set_ps(w_, z_, y_, x_);
  137. # else
  138. m_simd = {x_, y_, z_, w_};
  139. # endif
  140. }
  141. #endif
  142. ANKI_ENABLE_METHOD(N == 4)
  143. TVec(const TVec<T, 3>& a, const T w_)
  144. {
  145. x() = a.x();
  146. y() = a.y();
  147. z() = a.z();
  148. w() = w_;
  149. }
  150. ANKI_ENABLE_METHOD(N == 4)
  151. TVec(const T x_, const TVec<T, 3>& a)
  152. {
  153. x() = x_;
  154. y() = a.x();
  155. z() = a.y();
  156. w() = a.z();
  157. }
  158. ANKI_ENABLE_METHOD(N == 4)
  159. TVec(const TVec<T, 2>& a, const T z_, const T w_)
  160. {
  161. x() = a.x();
  162. y() = a.y();
  163. z() = z_;
  164. w() = w_;
  165. }
  166. ANKI_ENABLE_METHOD(N == 4)
  167. TVec(const T x_, const TVec<T, 2>& a, const T w_)
  168. {
  169. x() = x_;
  170. y() = a.x();
  171. z() = a.y();
  172. w() = w_;
  173. }
  174. ANKI_ENABLE_METHOD(N == 4)
  175. TVec(const T x_, const T y_, const TVec<T, 2>& a)
  176. {
  177. x() = x_;
  178. y() = y_;
  179. z() = a.x();
  180. w() = a.y();
  181. }
  182. ANKI_ENABLE_METHOD(N == 4)
  183. TVec(const TVec<T, 2>& a, const TVec<T, 2>& b)
  184. {
  185. x() = a.x();
  186. y() = a.y();
  187. z() = b.x();
  188. w() = b.y();
  189. }
  190. /// @}
  191. /// @name Accessors
  192. /// @{
  193. T& x()
  194. {
  195. return m_arr[0];
  196. }
  197. T x() const
  198. {
  199. return m_arr[0];
  200. }
  201. T& y()
  202. {
  203. return m_arr[1];
  204. }
  205. T y() const
  206. {
  207. return m_arr[1];
  208. }
  209. ANKI_ENABLE_METHOD(N > 2)
  210. T& z()
  211. {
  212. return m_arr[2];
  213. }
  214. ANKI_ENABLE_METHOD(N > 2)
  215. T z() const
  216. {
  217. return m_arr[2];
  218. }
  219. ANKI_ENABLE_METHOD(N > 3)
  220. T& w()
  221. {
  222. return m_arr[3];
  223. }
  224. ANKI_ENABLE_METHOD(N > 3)
  225. T w() const
  226. {
  227. return m_arr[3];
  228. }
  229. ANKI_ENABLE_METHOD(N > 2)
  230. TVec<T, 4> xyz1() const
  231. {
  232. return TVec<T, 4>(x(), y(), z(), T(1));
  233. }
  234. ANKI_ENABLE_METHOD(N > 2)
  235. TVec<T, 4> xyz0() const
  236. {
  237. return TVec<T, 4>(x(), y(), z(), T(0));
  238. }
  239. T& operator[](const U i)
  240. {
  241. return m_arr[i];
  242. }
  243. const T& operator[](const U i) const
  244. {
  245. return m_arr[i];
  246. }
  247. Simd& getSimd()
  248. {
  249. return m_simd;
  250. }
  251. const Simd& getSimd() const
  252. {
  253. return m_simd;
  254. }
  255. // Swizzled accessors
  256. ANKI_ENABLE_METHOD(N > 0)
  257. TVec<T, 2> xx() const
  258. {
  259. return TVec<T, 2>(m_carr[0], m_carr[0]);
  260. }
  261. ANKI_ENABLE_METHOD(N > 1)
  262. TVec<T, 2> xy() const
  263. {
  264. return TVec<T, 2>(m_carr[0], m_carr[1]);
  265. }
  266. ANKI_ENABLE_METHOD(N > 2)
  267. TVec<T, 2> xz() const
  268. {
  269. return TVec<T, 2>(m_carr[0], m_carr[2]);
  270. }
  271. ANKI_ENABLE_METHOD(N > 3)
  272. TVec<T, 2> xw() const
  273. {
  274. return TVec<T, 2>(m_carr[0], m_carr[3]);
  275. }
  276. ANKI_ENABLE_METHOD(N > 1)
  277. TVec<T, 2> yx() const
  278. {
  279. return TVec<T, 2>(m_carr[1], m_carr[0]);
  280. }
  281. ANKI_ENABLE_METHOD(N > 1)
  282. TVec<T, 2> yy() const
  283. {
  284. return TVec<T, 2>(m_carr[1], m_carr[1]);
  285. }
  286. ANKI_ENABLE_METHOD(N > 2)
  287. TVec<T, 2> yz() const
  288. {
  289. return TVec<T, 2>(m_carr[1], m_carr[2]);
  290. }
  291. ANKI_ENABLE_METHOD(N > 3)
  292. TVec<T, 2> yw() const
  293. {
  294. return TVec<T, 2>(m_carr[1], m_carr[3]);
  295. }
  296. ANKI_ENABLE_METHOD(N > 2)
  297. TVec<T, 2> zx() const
  298. {
  299. return TVec<T, 2>(m_carr[2], m_carr[0]);
  300. }
  301. ANKI_ENABLE_METHOD(N > 2)
  302. TVec<T, 2> zy() const
  303. {
  304. return TVec<T, 2>(m_carr[2], m_carr[1]);
  305. }
  306. ANKI_ENABLE_METHOD(N > 2)
  307. TVec<T, 2> zz() const
  308. {
  309. return TVec<T, 2>(m_carr[2], m_carr[2]);
  310. }
  311. ANKI_ENABLE_METHOD(N > 3)
  312. TVec<T, 2> zw() const
  313. {
  314. return TVec<T, 2>(m_carr[2], m_carr[3]);
  315. }
  316. ANKI_ENABLE_METHOD(N > 3)
  317. TVec<T, 2> wx() const
  318. {
  319. return TVec<T, 2>(m_carr[3], m_carr[0]);
  320. }
  321. ANKI_ENABLE_METHOD(N > 3)
  322. TVec<T, 2> wy() const
  323. {
  324. return TVec<T, 2>(m_carr[3], m_carr[1]);
  325. }
  326. ANKI_ENABLE_METHOD(N > 3)
  327. TVec<T, 2> wz() const
  328. {
  329. return TVec<T, 2>(m_carr[3], m_carr[2]);
  330. }
  331. ANKI_ENABLE_METHOD(N > 3)
  332. TVec<T, 2> ww() const
  333. {
  334. return TVec<T, 2>(m_carr[3], m_carr[3]);
  335. }
  336. ANKI_ENABLE_METHOD(N > 0)
  337. TVec<T, 3> xxx() const
  338. {
  339. return TVec<T, 3>(m_carr[0], m_carr[0], m_carr[0]);
  340. }
  341. ANKI_ENABLE_METHOD(N > 1)
  342. TVec<T, 3> xxy() const
  343. {
  344. return TVec<T, 3>(m_carr[0], m_carr[0], m_carr[1]);
  345. }
  346. ANKI_ENABLE_METHOD(N > 2)
  347. TVec<T, 3> xxz() const
  348. {
  349. return TVec<T, 3>(m_carr[0], m_carr[0], m_carr[2]);
  350. }
  351. ANKI_ENABLE_METHOD(N > 3)
  352. TVec<T, 3> xxw() const
  353. {
  354. return TVec<T, 3>(m_carr[0], m_carr[0], m_carr[3]);
  355. }
  356. ANKI_ENABLE_METHOD(N > 1)
  357. TVec<T, 3> xyx() const
  358. {
  359. return TVec<T, 3>(m_carr[0], m_carr[1], m_carr[0]);
  360. }
  361. ANKI_ENABLE_METHOD(N > 1)
  362. TVec<T, 3> xyy() const
  363. {
  364. return TVec<T, 3>(m_carr[0], m_carr[1], m_carr[1]);
  365. }
  366. ANKI_ENABLE_METHOD(N > 2)
  367. TVec<T, 3> xyz() const
  368. {
  369. return TVec<T, 3>(m_carr[0], m_carr[1], m_carr[2]);
  370. }
  371. ANKI_ENABLE_METHOD(N > 3)
  372. TVec<T, 3> xyw() const
  373. {
  374. return TVec<T, 3>(m_carr[0], m_carr[1], m_carr[3]);
  375. }
  376. ANKI_ENABLE_METHOD(N > 2)
  377. TVec<T, 3> xzx() const
  378. {
  379. return TVec<T, 3>(m_carr[0], m_carr[2], m_carr[0]);
  380. }
  381. ANKI_ENABLE_METHOD(N > 2)
  382. TVec<T, 3> xzy() const
  383. {
  384. return TVec<T, 3>(m_carr[0], m_carr[2], m_carr[1]);
  385. }
  386. ANKI_ENABLE_METHOD(N > 2)
  387. TVec<T, 3> xzz() const
  388. {
  389. return TVec<T, 3>(m_carr[0], m_carr[2], m_carr[2]);
  390. }
  391. ANKI_ENABLE_METHOD(N > 3)
  392. TVec<T, 3> xzw() const
  393. {
  394. return TVec<T, 3>(m_carr[0], m_carr[2], m_carr[3]);
  395. }
  396. ANKI_ENABLE_METHOD(N > 3)
  397. TVec<T, 3> xwx() const
  398. {
  399. return TVec<T, 3>(m_carr[0], m_carr[3], m_carr[0]);
  400. }
  401. ANKI_ENABLE_METHOD(N > 3)
  402. TVec<T, 3> xwy() const
  403. {
  404. return TVec<T, 3>(m_carr[0], m_carr[3], m_carr[1]);
  405. }
  406. ANKI_ENABLE_METHOD(N > 3)
  407. TVec<T, 3> xwz() const
  408. {
  409. return TVec<T, 3>(m_carr[0], m_carr[3], m_carr[2]);
  410. }
  411. ANKI_ENABLE_METHOD(N > 3)
  412. TVec<T, 3> xww() const
  413. {
  414. return TVec<T, 3>(m_carr[0], m_carr[3], m_carr[3]);
  415. }
  416. ANKI_ENABLE_METHOD(N > 1)
  417. TVec<T, 3> yxx() const
  418. {
  419. return TVec<T, 3>(m_carr[1], m_carr[0], m_carr[0]);
  420. }
  421. ANKI_ENABLE_METHOD(N > 1)
  422. TVec<T, 3> yxy() const
  423. {
  424. return TVec<T, 3>(m_carr[1], m_carr[0], m_carr[1]);
  425. }
  426. ANKI_ENABLE_METHOD(N > 2)
  427. TVec<T, 3> yxz() const
  428. {
  429. return TVec<T, 3>(m_carr[1], m_carr[0], m_carr[2]);
  430. }
  431. ANKI_ENABLE_METHOD(N > 3)
  432. TVec<T, 3> yxw() const
  433. {
  434. return TVec<T, 3>(m_carr[1], m_carr[0], m_carr[3]);
  435. }
  436. ANKI_ENABLE_METHOD(N > 1)
  437. TVec<T, 3> yyx() const
  438. {
  439. return TVec<T, 3>(m_carr[1], m_carr[1], m_carr[0]);
  440. }
  441. ANKI_ENABLE_METHOD(N > 1)
  442. TVec<T, 3> yyy() const
  443. {
  444. return TVec<T, 3>(m_carr[1], m_carr[1], m_carr[1]);
  445. }
  446. ANKI_ENABLE_METHOD(N > 2)
  447. TVec<T, 3> yyz() const
  448. {
  449. return TVec<T, 3>(m_carr[1], m_carr[1], m_carr[2]);
  450. }
  451. ANKI_ENABLE_METHOD(N > 3)
  452. TVec<T, 3> yyw() const
  453. {
  454. return TVec<T, 3>(m_carr[1], m_carr[1], m_carr[3]);
  455. }
  456. ANKI_ENABLE_METHOD(N > 2)
  457. TVec<T, 3> yzx() const
  458. {
  459. return TVec<T, 3>(m_carr[1], m_carr[2], m_carr[0]);
  460. }
  461. ANKI_ENABLE_METHOD(N > 2)
  462. TVec<T, 3> yzy() const
  463. {
  464. return TVec<T, 3>(m_carr[1], m_carr[2], m_carr[1]);
  465. }
  466. ANKI_ENABLE_METHOD(N > 2)
  467. TVec<T, 3> yzz() const
  468. {
  469. return TVec<T, 3>(m_carr[1], m_carr[2], m_carr[2]);
  470. }
  471. ANKI_ENABLE_METHOD(N > 3)
  472. TVec<T, 3> yzw() const
  473. {
  474. return TVec<T, 3>(m_carr[1], m_carr[2], m_carr[3]);
  475. }
  476. ANKI_ENABLE_METHOD(N > 3)
  477. TVec<T, 3> ywx() const
  478. {
  479. return TVec<T, 3>(m_carr[1], m_carr[3], m_carr[0]);
  480. }
  481. ANKI_ENABLE_METHOD(N > 3)
  482. TVec<T, 3> ywy() const
  483. {
  484. return TVec<T, 3>(m_carr[1], m_carr[3], m_carr[1]);
  485. }
  486. ANKI_ENABLE_METHOD(N > 3)
  487. TVec<T, 3> ywz() const
  488. {
  489. return TVec<T, 3>(m_carr[1], m_carr[3], m_carr[2]);
  490. }
  491. ANKI_ENABLE_METHOD(N > 3)
  492. TVec<T, 3> yww() const
  493. {
  494. return TVec<T, 3>(m_carr[1], m_carr[3], m_carr[3]);
  495. }
  496. ANKI_ENABLE_METHOD(N > 2)
  497. TVec<T, 3> zxx() const
  498. {
  499. return TVec<T, 3>(m_carr[2], m_carr[0], m_carr[0]);
  500. }
  501. ANKI_ENABLE_METHOD(N > 2)
  502. TVec<T, 3> zxy() const
  503. {
  504. return TVec<T, 3>(m_carr[2], m_carr[0], m_carr[1]);
  505. }
  506. ANKI_ENABLE_METHOD(N > 2)
  507. TVec<T, 3> zxz() const
  508. {
  509. return TVec<T, 3>(m_carr[2], m_carr[0], m_carr[2]);
  510. }
  511. ANKI_ENABLE_METHOD(N > 3)
  512. TVec<T, 3> zxw() const
  513. {
  514. return TVec<T, 3>(m_carr[2], m_carr[0], m_carr[3]);
  515. }
  516. ANKI_ENABLE_METHOD(N > 2)
  517. TVec<T, 3> zyx() const
  518. {
  519. return TVec<T, 3>(m_carr[2], m_carr[1], m_carr[0]);
  520. }
  521. ANKI_ENABLE_METHOD(N > 2)
  522. TVec<T, 3> zyy() const
  523. {
  524. return TVec<T, 3>(m_carr[2], m_carr[1], m_carr[1]);
  525. }
  526. ANKI_ENABLE_METHOD(N > 2)
  527. TVec<T, 3> zyz() const
  528. {
  529. return TVec<T, 3>(m_carr[2], m_carr[1], m_carr[2]);
  530. }
  531. ANKI_ENABLE_METHOD(N > 3)
  532. TVec<T, 3> zyw() const
  533. {
  534. return TVec<T, 3>(m_carr[2], m_carr[1], m_carr[3]);
  535. }
  536. ANKI_ENABLE_METHOD(N > 2)
  537. TVec<T, 3> zzx() const
  538. {
  539. return TVec<T, 3>(m_carr[2], m_carr[2], m_carr[0]);
  540. }
  541. ANKI_ENABLE_METHOD(N > 2)
  542. TVec<T, 3> zzy() const
  543. {
  544. return TVec<T, 3>(m_carr[2], m_carr[2], m_carr[1]);
  545. }
  546. ANKI_ENABLE_METHOD(N > 2)
  547. TVec<T, 3> zzz() const
  548. {
  549. return TVec<T, 3>(m_carr[2], m_carr[2], m_carr[2]);
  550. }
  551. ANKI_ENABLE_METHOD(N > 3)
  552. TVec<T, 3> zzw() const
  553. {
  554. return TVec<T, 3>(m_carr[2], m_carr[2], m_carr[3]);
  555. }
  556. ANKI_ENABLE_METHOD(N > 3)
  557. TVec<T, 3> zwx() const
  558. {
  559. return TVec<T, 3>(m_carr[2], m_carr[3], m_carr[0]);
  560. }
  561. ANKI_ENABLE_METHOD(N > 3)
  562. TVec<T, 3> zwy() const
  563. {
  564. return TVec<T, 3>(m_carr[2], m_carr[3], m_carr[1]);
  565. }
  566. ANKI_ENABLE_METHOD(N > 3)
  567. TVec<T, 3> zwz() const
  568. {
  569. return TVec<T, 3>(m_carr[2], m_carr[3], m_carr[2]);
  570. }
  571. ANKI_ENABLE_METHOD(N > 3)
  572. TVec<T, 3> zww() const
  573. {
  574. return TVec<T, 3>(m_carr[2], m_carr[3], m_carr[3]);
  575. }
  576. ANKI_ENABLE_METHOD(N > 3)
  577. TVec<T, 3> wxx() const
  578. {
  579. return TVec<T, 3>(m_carr[3], m_carr[0], m_carr[0]);
  580. }
  581. ANKI_ENABLE_METHOD(N > 3)
  582. TVec<T, 3> wxy() const
  583. {
  584. return TVec<T, 3>(m_carr[3], m_carr[0], m_carr[1]);
  585. }
  586. ANKI_ENABLE_METHOD(N > 3)
  587. TVec<T, 3> wxz() const
  588. {
  589. return TVec<T, 3>(m_carr[3], m_carr[0], m_carr[2]);
  590. }
  591. ANKI_ENABLE_METHOD(N > 3)
  592. TVec<T, 3> wxw() const
  593. {
  594. return TVec<T, 3>(m_carr[3], m_carr[0], m_carr[3]);
  595. }
  596. ANKI_ENABLE_METHOD(N > 3)
  597. TVec<T, 3> wyx() const
  598. {
  599. return TVec<T, 3>(m_carr[3], m_carr[1], m_carr[0]);
  600. }
  601. ANKI_ENABLE_METHOD(N > 3)
  602. TVec<T, 3> wyy() const
  603. {
  604. return TVec<T, 3>(m_carr[3], m_carr[1], m_carr[1]);
  605. }
  606. ANKI_ENABLE_METHOD(N > 3)
  607. TVec<T, 3> wyz() const
  608. {
  609. return TVec<T, 3>(m_carr[3], m_carr[1], m_carr[2]);
  610. }
  611. ANKI_ENABLE_METHOD(N > 3)
  612. TVec<T, 3> wyw() const
  613. {
  614. return TVec<T, 3>(m_carr[3], m_carr[1], m_carr[3]);
  615. }
  616. ANKI_ENABLE_METHOD(N > 3)
  617. TVec<T, 3> wzx() const
  618. {
  619. return TVec<T, 3>(m_carr[3], m_carr[2], m_carr[0]);
  620. }
  621. ANKI_ENABLE_METHOD(N > 3)
  622. TVec<T, 3> wzy() const
  623. {
  624. return TVec<T, 3>(m_carr[3], m_carr[2], m_carr[1]);
  625. }
  626. ANKI_ENABLE_METHOD(N > 3)
  627. TVec<T, 3> wzz() const
  628. {
  629. return TVec<T, 3>(m_carr[3], m_carr[2], m_carr[2]);
  630. }
  631. ANKI_ENABLE_METHOD(N > 3)
  632. TVec<T, 3> wzw() const
  633. {
  634. return TVec<T, 3>(m_carr[3], m_carr[2], m_carr[3]);
  635. }
  636. ANKI_ENABLE_METHOD(N > 3)
  637. TVec<T, 3> wwx() const
  638. {
  639. return TVec<T, 3>(m_carr[3], m_carr[3], m_carr[0]);
  640. }
  641. ANKI_ENABLE_METHOD(N > 3)
  642. TVec<T, 3> wwy() const
  643. {
  644. return TVec<T, 3>(m_carr[3], m_carr[3], m_carr[1]);
  645. }
  646. ANKI_ENABLE_METHOD(N > 3)
  647. TVec<T, 3> wwz() const
  648. {
  649. return TVec<T, 3>(m_carr[3], m_carr[3], m_carr[2]);
  650. }
  651. ANKI_ENABLE_METHOD(N > 3)
  652. TVec<T, 3> www() const
  653. {
  654. return TVec<T, 3>(m_carr[3], m_carr[3], m_carr[3]);
  655. }
  656. ANKI_ENABLE_METHOD(N > 0)
  657. TVec<T, 4> xxxx() const
  658. {
  659. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[0], m_carr[0]);
  660. }
  661. ANKI_ENABLE_METHOD(N > 1)
  662. TVec<T, 4> xxxy() const
  663. {
  664. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[0], m_carr[1]);
  665. }
  666. ANKI_ENABLE_METHOD(N > 2)
  667. TVec<T, 4> xxxz() const
  668. {
  669. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[0], m_carr[2]);
  670. }
  671. ANKI_ENABLE_METHOD(N > 3)
  672. TVec<T, 4> xxxw() const
  673. {
  674. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[0], m_carr[3]);
  675. }
  676. ANKI_ENABLE_METHOD(N > 1)
  677. TVec<T, 4> xxyx() const
  678. {
  679. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[1], m_carr[0]);
  680. }
  681. ANKI_ENABLE_METHOD(N > 1)
  682. TVec<T, 4> xxyy() const
  683. {
  684. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[1], m_carr[1]);
  685. }
  686. ANKI_ENABLE_METHOD(N > 2)
  687. TVec<T, 4> xxyz() const
  688. {
  689. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[1], m_carr[2]);
  690. }
  691. ANKI_ENABLE_METHOD(N > 3)
  692. TVec<T, 4> xxyw() const
  693. {
  694. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[1], m_carr[3]);
  695. }
  696. ANKI_ENABLE_METHOD(N > 2)
  697. TVec<T, 4> xxzx() const
  698. {
  699. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[2], m_carr[0]);
  700. }
  701. ANKI_ENABLE_METHOD(N > 2)
  702. TVec<T, 4> xxzy() const
  703. {
  704. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[2], m_carr[1]);
  705. }
  706. ANKI_ENABLE_METHOD(N > 2)
  707. TVec<T, 4> xxzz() const
  708. {
  709. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[2], m_carr[2]);
  710. }
  711. ANKI_ENABLE_METHOD(N > 3)
  712. TVec<T, 4> xxzw() const
  713. {
  714. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[2], m_carr[3]);
  715. }
  716. ANKI_ENABLE_METHOD(N > 3)
  717. TVec<T, 4> xxwx() const
  718. {
  719. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[3], m_carr[0]);
  720. }
  721. ANKI_ENABLE_METHOD(N > 3)
  722. TVec<T, 4> xxwy() const
  723. {
  724. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[3], m_carr[1]);
  725. }
  726. ANKI_ENABLE_METHOD(N > 3)
  727. TVec<T, 4> xxwz() const
  728. {
  729. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[3], m_carr[2]);
  730. }
  731. ANKI_ENABLE_METHOD(N > 3)
  732. TVec<T, 4> xxww() const
  733. {
  734. return TVec<T, 4>(m_carr[0], m_carr[0], m_carr[3], m_carr[3]);
  735. }
  736. ANKI_ENABLE_METHOD(N > 1)
  737. TVec<T, 4> xyxx() const
  738. {
  739. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[0], m_carr[0]);
  740. }
  741. ANKI_ENABLE_METHOD(N > 1)
  742. TVec<T, 4> xyxy() const
  743. {
  744. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[0], m_carr[1]);
  745. }
  746. ANKI_ENABLE_METHOD(N > 2)
  747. TVec<T, 4> xyxz() const
  748. {
  749. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[0], m_carr[2]);
  750. }
  751. ANKI_ENABLE_METHOD(N > 3)
  752. TVec<T, 4> xyxw() const
  753. {
  754. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[0], m_carr[3]);
  755. }
  756. ANKI_ENABLE_METHOD(N > 1)
  757. TVec<T, 4> xyyx() const
  758. {
  759. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[1], m_carr[0]);
  760. }
  761. ANKI_ENABLE_METHOD(N > 1)
  762. TVec<T, 4> xyyy() const
  763. {
  764. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[1], m_carr[1]);
  765. }
  766. ANKI_ENABLE_METHOD(N > 2)
  767. TVec<T, 4> xyyz() const
  768. {
  769. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[1], m_carr[2]);
  770. }
  771. ANKI_ENABLE_METHOD(N > 3)
  772. TVec<T, 4> xyyw() const
  773. {
  774. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[1], m_carr[3]);
  775. }
  776. ANKI_ENABLE_METHOD(N > 2)
  777. TVec<T, 4> xyzx() const
  778. {
  779. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[2], m_carr[0]);
  780. }
  781. ANKI_ENABLE_METHOD(N > 2)
  782. TVec<T, 4> xyzy() const
  783. {
  784. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[2], m_carr[1]);
  785. }
  786. ANKI_ENABLE_METHOD(N > 2)
  787. TVec<T, 4> xyzz() const
  788. {
  789. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[2], m_carr[2]);
  790. }
  791. ANKI_ENABLE_METHOD(N > 3)
  792. TVec<T, 4> xyzw() const
  793. {
  794. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[2], m_carr[3]);
  795. }
  796. ANKI_ENABLE_METHOD(N > 3)
  797. TVec<T, 4> xywx() const
  798. {
  799. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[3], m_carr[0]);
  800. }
  801. ANKI_ENABLE_METHOD(N > 3)
  802. TVec<T, 4> xywy() const
  803. {
  804. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[3], m_carr[1]);
  805. }
  806. ANKI_ENABLE_METHOD(N > 3)
  807. TVec<T, 4> xywz() const
  808. {
  809. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[3], m_carr[2]);
  810. }
  811. ANKI_ENABLE_METHOD(N > 3)
  812. TVec<T, 4> xyww() const
  813. {
  814. return TVec<T, 4>(m_carr[0], m_carr[1], m_carr[3], m_carr[3]);
  815. }
  816. ANKI_ENABLE_METHOD(N > 2)
  817. TVec<T, 4> xzxx() const
  818. {
  819. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[0], m_carr[0]);
  820. }
  821. ANKI_ENABLE_METHOD(N > 2)
  822. TVec<T, 4> xzxy() const
  823. {
  824. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[0], m_carr[1]);
  825. }
  826. ANKI_ENABLE_METHOD(N > 2)
  827. TVec<T, 4> xzxz() const
  828. {
  829. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[0], m_carr[2]);
  830. }
  831. ANKI_ENABLE_METHOD(N > 3)
  832. TVec<T, 4> xzxw() const
  833. {
  834. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[0], m_carr[3]);
  835. }
  836. ANKI_ENABLE_METHOD(N > 2)
  837. TVec<T, 4> xzyx() const
  838. {
  839. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[1], m_carr[0]);
  840. }
  841. ANKI_ENABLE_METHOD(N > 2)
  842. TVec<T, 4> xzyy() const
  843. {
  844. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[1], m_carr[1]);
  845. }
  846. ANKI_ENABLE_METHOD(N > 2)
  847. TVec<T, 4> xzyz() const
  848. {
  849. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[1], m_carr[2]);
  850. }
  851. ANKI_ENABLE_METHOD(N > 3)
  852. TVec<T, 4> xzyw() const
  853. {
  854. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[1], m_carr[3]);
  855. }
  856. ANKI_ENABLE_METHOD(N > 2)
  857. TVec<T, 4> xzzx() const
  858. {
  859. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[2], m_carr[0]);
  860. }
  861. ANKI_ENABLE_METHOD(N > 2)
  862. TVec<T, 4> xzzy() const
  863. {
  864. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[2], m_carr[1]);
  865. }
  866. ANKI_ENABLE_METHOD(N > 2)
  867. TVec<T, 4> xzzz() const
  868. {
  869. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[2], m_carr[2]);
  870. }
  871. ANKI_ENABLE_METHOD(N > 3)
  872. TVec<T, 4> xzzw() const
  873. {
  874. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[2], m_carr[3]);
  875. }
  876. ANKI_ENABLE_METHOD(N > 3)
  877. TVec<T, 4> xzwx() const
  878. {
  879. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[3], m_carr[0]);
  880. }
  881. ANKI_ENABLE_METHOD(N > 3)
  882. TVec<T, 4> xzwy() const
  883. {
  884. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[3], m_carr[1]);
  885. }
  886. ANKI_ENABLE_METHOD(N > 3)
  887. TVec<T, 4> xzwz() const
  888. {
  889. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[3], m_carr[2]);
  890. }
  891. ANKI_ENABLE_METHOD(N > 3)
  892. TVec<T, 4> xzww() const
  893. {
  894. return TVec<T, 4>(m_carr[0], m_carr[2], m_carr[3], m_carr[3]);
  895. }
  896. ANKI_ENABLE_METHOD(N > 3)
  897. TVec<T, 4> xwxx() const
  898. {
  899. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[0], m_carr[0]);
  900. }
  901. ANKI_ENABLE_METHOD(N > 3)
  902. TVec<T, 4> xwxy() const
  903. {
  904. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[0], m_carr[1]);
  905. }
  906. ANKI_ENABLE_METHOD(N > 3)
  907. TVec<T, 4> xwxz() const
  908. {
  909. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[0], m_carr[2]);
  910. }
  911. ANKI_ENABLE_METHOD(N > 3)
  912. TVec<T, 4> xwxw() const
  913. {
  914. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[0], m_carr[3]);
  915. }
  916. ANKI_ENABLE_METHOD(N > 3)
  917. TVec<T, 4> xwyx() const
  918. {
  919. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[1], m_carr[0]);
  920. }
  921. ANKI_ENABLE_METHOD(N > 3)
  922. TVec<T, 4> xwyy() const
  923. {
  924. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[1], m_carr[1]);
  925. }
  926. ANKI_ENABLE_METHOD(N > 3)
  927. TVec<T, 4> xwyz() const
  928. {
  929. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[1], m_carr[2]);
  930. }
  931. ANKI_ENABLE_METHOD(N > 3)
  932. TVec<T, 4> xwyw() const
  933. {
  934. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[1], m_carr[3]);
  935. }
  936. ANKI_ENABLE_METHOD(N > 3)
  937. TVec<T, 4> xwzx() const
  938. {
  939. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[2], m_carr[0]);
  940. }
  941. ANKI_ENABLE_METHOD(N > 3)
  942. TVec<T, 4> xwzy() const
  943. {
  944. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[2], m_carr[1]);
  945. }
  946. ANKI_ENABLE_METHOD(N > 3)
  947. TVec<T, 4> xwzz() const
  948. {
  949. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[2], m_carr[2]);
  950. }
  951. ANKI_ENABLE_METHOD(N > 3)
  952. TVec<T, 4> xwzw() const
  953. {
  954. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[2], m_carr[3]);
  955. }
  956. ANKI_ENABLE_METHOD(N > 3)
  957. TVec<T, 4> xwwx() const
  958. {
  959. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[3], m_carr[0]);
  960. }
  961. ANKI_ENABLE_METHOD(N > 3)
  962. TVec<T, 4> xwwy() const
  963. {
  964. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[3], m_carr[1]);
  965. }
  966. ANKI_ENABLE_METHOD(N > 3)
  967. TVec<T, 4> xwwz() const
  968. {
  969. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[3], m_carr[2]);
  970. }
  971. ANKI_ENABLE_METHOD(N > 3)
  972. TVec<T, 4> xwww() const
  973. {
  974. return TVec<T, 4>(m_carr[0], m_carr[3], m_carr[3], m_carr[3]);
  975. }
  976. ANKI_ENABLE_METHOD(N > 1)
  977. TVec<T, 4> yxxx() const
  978. {
  979. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[0], m_carr[0]);
  980. }
  981. ANKI_ENABLE_METHOD(N > 1)
  982. TVec<T, 4> yxxy() const
  983. {
  984. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[0], m_carr[1]);
  985. }
  986. ANKI_ENABLE_METHOD(N > 2)
  987. TVec<T, 4> yxxz() const
  988. {
  989. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[0], m_carr[2]);
  990. }
  991. ANKI_ENABLE_METHOD(N > 3)
  992. TVec<T, 4> yxxw() const
  993. {
  994. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[0], m_carr[3]);
  995. }
  996. ANKI_ENABLE_METHOD(N > 1)
  997. TVec<T, 4> yxyx() const
  998. {
  999. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[1], m_carr[0]);
  1000. }
  1001. ANKI_ENABLE_METHOD(N > 1)
  1002. TVec<T, 4> yxyy() const
  1003. {
  1004. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[1], m_carr[1]);
  1005. }
  1006. ANKI_ENABLE_METHOD(N > 2)
  1007. TVec<T, 4> yxyz() const
  1008. {
  1009. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[1], m_carr[2]);
  1010. }
  1011. ANKI_ENABLE_METHOD(N > 3)
  1012. TVec<T, 4> yxyw() const
  1013. {
  1014. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[1], m_carr[3]);
  1015. }
  1016. ANKI_ENABLE_METHOD(N > 2)
  1017. TVec<T, 4> yxzx() const
  1018. {
  1019. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[2], m_carr[0]);
  1020. }
  1021. ANKI_ENABLE_METHOD(N > 2)
  1022. TVec<T, 4> yxzy() const
  1023. {
  1024. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[2], m_carr[1]);
  1025. }
  1026. ANKI_ENABLE_METHOD(N > 2)
  1027. TVec<T, 4> yxzz() const
  1028. {
  1029. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[2], m_carr[2]);
  1030. }
  1031. ANKI_ENABLE_METHOD(N > 3)
  1032. TVec<T, 4> yxzw() const
  1033. {
  1034. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[2], m_carr[3]);
  1035. }
  1036. ANKI_ENABLE_METHOD(N > 3)
  1037. TVec<T, 4> yxwx() const
  1038. {
  1039. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[3], m_carr[0]);
  1040. }
  1041. ANKI_ENABLE_METHOD(N > 3)
  1042. TVec<T, 4> yxwy() const
  1043. {
  1044. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[3], m_carr[1]);
  1045. }
  1046. ANKI_ENABLE_METHOD(N > 3)
  1047. TVec<T, 4> yxwz() const
  1048. {
  1049. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[3], m_carr[2]);
  1050. }
  1051. ANKI_ENABLE_METHOD(N > 3)
  1052. TVec<T, 4> yxww() const
  1053. {
  1054. return TVec<T, 4>(m_carr[1], m_carr[0], m_carr[3], m_carr[3]);
  1055. }
  1056. ANKI_ENABLE_METHOD(N > 1)
  1057. TVec<T, 4> yyxx() const
  1058. {
  1059. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[0], m_carr[0]);
  1060. }
  1061. ANKI_ENABLE_METHOD(N > 1)
  1062. TVec<T, 4> yyxy() const
  1063. {
  1064. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[0], m_carr[1]);
  1065. }
  1066. ANKI_ENABLE_METHOD(N > 2)
  1067. TVec<T, 4> yyxz() const
  1068. {
  1069. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[0], m_carr[2]);
  1070. }
  1071. ANKI_ENABLE_METHOD(N > 3)
  1072. TVec<T, 4> yyxw() const
  1073. {
  1074. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[0], m_carr[3]);
  1075. }
  1076. ANKI_ENABLE_METHOD(N > 1)
  1077. TVec<T, 4> yyyx() const
  1078. {
  1079. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[1], m_carr[0]);
  1080. }
  1081. ANKI_ENABLE_METHOD(N > 1)
  1082. TVec<T, 4> yyyy() const
  1083. {
  1084. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[1], m_carr[1]);
  1085. }
  1086. ANKI_ENABLE_METHOD(N > 2)
  1087. TVec<T, 4> yyyz() const
  1088. {
  1089. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[1], m_carr[2]);
  1090. }
  1091. ANKI_ENABLE_METHOD(N > 3)
  1092. TVec<T, 4> yyyw() const
  1093. {
  1094. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[1], m_carr[3]);
  1095. }
  1096. ANKI_ENABLE_METHOD(N > 2)
  1097. TVec<T, 4> yyzx() const
  1098. {
  1099. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[2], m_carr[0]);
  1100. }
  1101. ANKI_ENABLE_METHOD(N > 2)
  1102. TVec<T, 4> yyzy() const
  1103. {
  1104. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[2], m_carr[1]);
  1105. }
  1106. ANKI_ENABLE_METHOD(N > 2)
  1107. TVec<T, 4> yyzz() const
  1108. {
  1109. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[2], m_carr[2]);
  1110. }
  1111. ANKI_ENABLE_METHOD(N > 3)
  1112. TVec<T, 4> yyzw() const
  1113. {
  1114. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[2], m_carr[3]);
  1115. }
  1116. ANKI_ENABLE_METHOD(N > 3)
  1117. TVec<T, 4> yywx() const
  1118. {
  1119. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[3], m_carr[0]);
  1120. }
  1121. ANKI_ENABLE_METHOD(N > 3)
  1122. TVec<T, 4> yywy() const
  1123. {
  1124. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[3], m_carr[1]);
  1125. }
  1126. ANKI_ENABLE_METHOD(N > 3)
  1127. TVec<T, 4> yywz() const
  1128. {
  1129. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[3], m_carr[2]);
  1130. }
  1131. ANKI_ENABLE_METHOD(N > 3)
  1132. TVec<T, 4> yyww() const
  1133. {
  1134. return TVec<T, 4>(m_carr[1], m_carr[1], m_carr[3], m_carr[3]);
  1135. }
  1136. ANKI_ENABLE_METHOD(N > 2)
  1137. TVec<T, 4> yzxx() const
  1138. {
  1139. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[0], m_carr[0]);
  1140. }
  1141. ANKI_ENABLE_METHOD(N > 2)
  1142. TVec<T, 4> yzxy() const
  1143. {
  1144. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[0], m_carr[1]);
  1145. }
  1146. ANKI_ENABLE_METHOD(N > 2)
  1147. TVec<T, 4> yzxz() const
  1148. {
  1149. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[0], m_carr[2]);
  1150. }
  1151. ANKI_ENABLE_METHOD(N > 3)
  1152. TVec<T, 4> yzxw() const
  1153. {
  1154. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[0], m_carr[3]);
  1155. }
  1156. ANKI_ENABLE_METHOD(N > 2)
  1157. TVec<T, 4> yzyx() const
  1158. {
  1159. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[1], m_carr[0]);
  1160. }
  1161. ANKI_ENABLE_METHOD(N > 2)
  1162. TVec<T, 4> yzyy() const
  1163. {
  1164. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[1], m_carr[1]);
  1165. }
  1166. ANKI_ENABLE_METHOD(N > 2)
  1167. TVec<T, 4> yzyz() const
  1168. {
  1169. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[1], m_carr[2]);
  1170. }
  1171. ANKI_ENABLE_METHOD(N > 3)
  1172. TVec<T, 4> yzyw() const
  1173. {
  1174. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[1], m_carr[3]);
  1175. }
  1176. ANKI_ENABLE_METHOD(N > 2)
  1177. TVec<T, 4> yzzx() const
  1178. {
  1179. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[2], m_carr[0]);
  1180. }
  1181. ANKI_ENABLE_METHOD(N > 2)
  1182. TVec<T, 4> yzzy() const
  1183. {
  1184. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[2], m_carr[1]);
  1185. }
  1186. ANKI_ENABLE_METHOD(N > 2)
  1187. TVec<T, 4> yzzz() const
  1188. {
  1189. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[2], m_carr[2]);
  1190. }
  1191. ANKI_ENABLE_METHOD(N > 3)
  1192. TVec<T, 4> yzzw() const
  1193. {
  1194. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[2], m_carr[3]);
  1195. }
  1196. ANKI_ENABLE_METHOD(N > 3)
  1197. TVec<T, 4> yzwx() const
  1198. {
  1199. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[3], m_carr[0]);
  1200. }
  1201. ANKI_ENABLE_METHOD(N > 3)
  1202. TVec<T, 4> yzwy() const
  1203. {
  1204. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[3], m_carr[1]);
  1205. }
  1206. ANKI_ENABLE_METHOD(N > 3)
  1207. TVec<T, 4> yzwz() const
  1208. {
  1209. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[3], m_carr[2]);
  1210. }
  1211. ANKI_ENABLE_METHOD(N > 3)
  1212. TVec<T, 4> yzww() const
  1213. {
  1214. return TVec<T, 4>(m_carr[1], m_carr[2], m_carr[3], m_carr[3]);
  1215. }
  1216. ANKI_ENABLE_METHOD(N > 3)
  1217. TVec<T, 4> ywxx() const
  1218. {
  1219. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[0], m_carr[0]);
  1220. }
  1221. ANKI_ENABLE_METHOD(N > 3)
  1222. TVec<T, 4> ywxy() const
  1223. {
  1224. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[0], m_carr[1]);
  1225. }
  1226. ANKI_ENABLE_METHOD(N > 3)
  1227. TVec<T, 4> ywxz() const
  1228. {
  1229. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[0], m_carr[2]);
  1230. }
  1231. ANKI_ENABLE_METHOD(N > 3)
  1232. TVec<T, 4> ywxw() const
  1233. {
  1234. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[0], m_carr[3]);
  1235. }
  1236. ANKI_ENABLE_METHOD(N > 3)
  1237. TVec<T, 4> ywyx() const
  1238. {
  1239. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[1], m_carr[0]);
  1240. }
  1241. ANKI_ENABLE_METHOD(N > 3)
  1242. TVec<T, 4> ywyy() const
  1243. {
  1244. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[1], m_carr[1]);
  1245. }
  1246. ANKI_ENABLE_METHOD(N > 3)
  1247. TVec<T, 4> ywyz() const
  1248. {
  1249. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[1], m_carr[2]);
  1250. }
  1251. ANKI_ENABLE_METHOD(N > 3)
  1252. TVec<T, 4> ywyw() const
  1253. {
  1254. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[1], m_carr[3]);
  1255. }
  1256. ANKI_ENABLE_METHOD(N > 3)
  1257. TVec<T, 4> ywzx() const
  1258. {
  1259. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[2], m_carr[0]);
  1260. }
  1261. ANKI_ENABLE_METHOD(N > 3)
  1262. TVec<T, 4> ywzy() const
  1263. {
  1264. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[2], m_carr[1]);
  1265. }
  1266. ANKI_ENABLE_METHOD(N > 3)
  1267. TVec<T, 4> ywzz() const
  1268. {
  1269. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[2], m_carr[2]);
  1270. }
  1271. ANKI_ENABLE_METHOD(N > 3)
  1272. TVec<T, 4> ywzw() const
  1273. {
  1274. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[2], m_carr[3]);
  1275. }
  1276. ANKI_ENABLE_METHOD(N > 3)
  1277. TVec<T, 4> ywwx() const
  1278. {
  1279. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[3], m_carr[0]);
  1280. }
  1281. ANKI_ENABLE_METHOD(N > 3)
  1282. TVec<T, 4> ywwy() const
  1283. {
  1284. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[3], m_carr[1]);
  1285. }
  1286. ANKI_ENABLE_METHOD(N > 3)
  1287. TVec<T, 4> ywwz() const
  1288. {
  1289. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[3], m_carr[2]);
  1290. }
  1291. ANKI_ENABLE_METHOD(N > 3)
  1292. TVec<T, 4> ywww() const
  1293. {
  1294. return TVec<T, 4>(m_carr[1], m_carr[3], m_carr[3], m_carr[3]);
  1295. }
  1296. ANKI_ENABLE_METHOD(N > 2)
  1297. TVec<T, 4> zxxx() const
  1298. {
  1299. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[0], m_carr[0]);
  1300. }
  1301. ANKI_ENABLE_METHOD(N > 2)
  1302. TVec<T, 4> zxxy() const
  1303. {
  1304. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[0], m_carr[1]);
  1305. }
  1306. ANKI_ENABLE_METHOD(N > 2)
  1307. TVec<T, 4> zxxz() const
  1308. {
  1309. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[0], m_carr[2]);
  1310. }
  1311. ANKI_ENABLE_METHOD(N > 3)
  1312. TVec<T, 4> zxxw() const
  1313. {
  1314. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[0], m_carr[3]);
  1315. }
  1316. ANKI_ENABLE_METHOD(N > 2)
  1317. TVec<T, 4> zxyx() const
  1318. {
  1319. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[1], m_carr[0]);
  1320. }
  1321. ANKI_ENABLE_METHOD(N > 2)
  1322. TVec<T, 4> zxyy() const
  1323. {
  1324. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[1], m_carr[1]);
  1325. }
  1326. ANKI_ENABLE_METHOD(N > 2)
  1327. TVec<T, 4> zxyz() const
  1328. {
  1329. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[1], m_carr[2]);
  1330. }
  1331. ANKI_ENABLE_METHOD(N > 3)
  1332. TVec<T, 4> zxyw() const
  1333. {
  1334. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[1], m_carr[3]);
  1335. }
  1336. ANKI_ENABLE_METHOD(N > 2)
  1337. TVec<T, 4> zxzx() const
  1338. {
  1339. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[2], m_carr[0]);
  1340. }
  1341. ANKI_ENABLE_METHOD(N > 2)
  1342. TVec<T, 4> zxzy() const
  1343. {
  1344. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[2], m_carr[1]);
  1345. }
  1346. ANKI_ENABLE_METHOD(N > 2)
  1347. TVec<T, 4> zxzz() const
  1348. {
  1349. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[2], m_carr[2]);
  1350. }
  1351. ANKI_ENABLE_METHOD(N > 3)
  1352. TVec<T, 4> zxzw() const
  1353. {
  1354. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[2], m_carr[3]);
  1355. }
  1356. ANKI_ENABLE_METHOD(N > 3)
  1357. TVec<T, 4> zxwx() const
  1358. {
  1359. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[3], m_carr[0]);
  1360. }
  1361. ANKI_ENABLE_METHOD(N > 3)
  1362. TVec<T, 4> zxwy() const
  1363. {
  1364. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[3], m_carr[1]);
  1365. }
  1366. ANKI_ENABLE_METHOD(N > 3)
  1367. TVec<T, 4> zxwz() const
  1368. {
  1369. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[3], m_carr[2]);
  1370. }
  1371. ANKI_ENABLE_METHOD(N > 3)
  1372. TVec<T, 4> zxww() const
  1373. {
  1374. return TVec<T, 4>(m_carr[2], m_carr[0], m_carr[3], m_carr[3]);
  1375. }
  1376. ANKI_ENABLE_METHOD(N > 2)
  1377. TVec<T, 4> zyxx() const
  1378. {
  1379. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[0], m_carr[0]);
  1380. }
  1381. ANKI_ENABLE_METHOD(N > 2)
  1382. TVec<T, 4> zyxy() const
  1383. {
  1384. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[0], m_carr[1]);
  1385. }
  1386. ANKI_ENABLE_METHOD(N > 2)
  1387. TVec<T, 4> zyxz() const
  1388. {
  1389. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[0], m_carr[2]);
  1390. }
  1391. ANKI_ENABLE_METHOD(N > 3)
  1392. TVec<T, 4> zyxw() const
  1393. {
  1394. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[0], m_carr[3]);
  1395. }
  1396. ANKI_ENABLE_METHOD(N > 2)
  1397. TVec<T, 4> zyyx() const
  1398. {
  1399. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[1], m_carr[0]);
  1400. }
  1401. ANKI_ENABLE_METHOD(N > 2)
  1402. TVec<T, 4> zyyy() const
  1403. {
  1404. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[1], m_carr[1]);
  1405. }
  1406. ANKI_ENABLE_METHOD(N > 2)
  1407. TVec<T, 4> zyyz() const
  1408. {
  1409. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[1], m_carr[2]);
  1410. }
  1411. ANKI_ENABLE_METHOD(N > 3)
  1412. TVec<T, 4> zyyw() const
  1413. {
  1414. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[1], m_carr[3]);
  1415. }
  1416. ANKI_ENABLE_METHOD(N > 2)
  1417. TVec<T, 4> zyzx() const
  1418. {
  1419. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[2], m_carr[0]);
  1420. }
  1421. ANKI_ENABLE_METHOD(N > 2)
  1422. TVec<T, 4> zyzy() const
  1423. {
  1424. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[2], m_carr[1]);
  1425. }
  1426. ANKI_ENABLE_METHOD(N > 2)
  1427. TVec<T, 4> zyzz() const
  1428. {
  1429. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[2], m_carr[2]);
  1430. }
  1431. ANKI_ENABLE_METHOD(N > 3)
  1432. TVec<T, 4> zyzw() const
  1433. {
  1434. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[2], m_carr[3]);
  1435. }
  1436. ANKI_ENABLE_METHOD(N > 3)
  1437. TVec<T, 4> zywx() const
  1438. {
  1439. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[3], m_carr[0]);
  1440. }
  1441. ANKI_ENABLE_METHOD(N > 3)
  1442. TVec<T, 4> zywy() const
  1443. {
  1444. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[3], m_carr[1]);
  1445. }
  1446. ANKI_ENABLE_METHOD(N > 3)
  1447. TVec<T, 4> zywz() const
  1448. {
  1449. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[3], m_carr[2]);
  1450. }
  1451. ANKI_ENABLE_METHOD(N > 3)
  1452. TVec<T, 4> zyww() const
  1453. {
  1454. return TVec<T, 4>(m_carr[2], m_carr[1], m_carr[3], m_carr[3]);
  1455. }
  1456. ANKI_ENABLE_METHOD(N > 2)
  1457. TVec<T, 4> zzxx() const
  1458. {
  1459. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[0], m_carr[0]);
  1460. }
  1461. ANKI_ENABLE_METHOD(N > 2)
  1462. TVec<T, 4> zzxy() const
  1463. {
  1464. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[0], m_carr[1]);
  1465. }
  1466. ANKI_ENABLE_METHOD(N > 2)
  1467. TVec<T, 4> zzxz() const
  1468. {
  1469. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[0], m_carr[2]);
  1470. }
  1471. ANKI_ENABLE_METHOD(N > 3)
  1472. TVec<T, 4> zzxw() const
  1473. {
  1474. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[0], m_carr[3]);
  1475. }
  1476. ANKI_ENABLE_METHOD(N > 2)
  1477. TVec<T, 4> zzyx() const
  1478. {
  1479. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[1], m_carr[0]);
  1480. }
  1481. ANKI_ENABLE_METHOD(N > 2)
  1482. TVec<T, 4> zzyy() const
  1483. {
  1484. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[1], m_carr[1]);
  1485. }
  1486. ANKI_ENABLE_METHOD(N > 2)
  1487. TVec<T, 4> zzyz() const
  1488. {
  1489. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[1], m_carr[2]);
  1490. }
  1491. ANKI_ENABLE_METHOD(N > 3)
  1492. TVec<T, 4> zzyw() const
  1493. {
  1494. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[1], m_carr[3]);
  1495. }
  1496. ANKI_ENABLE_METHOD(N > 2)
  1497. TVec<T, 4> zzzx() const
  1498. {
  1499. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[2], m_carr[0]);
  1500. }
  1501. ANKI_ENABLE_METHOD(N > 2)
  1502. TVec<T, 4> zzzy() const
  1503. {
  1504. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[2], m_carr[1]);
  1505. }
  1506. ANKI_ENABLE_METHOD(N > 2)
  1507. TVec<T, 4> zzzz() const
  1508. {
  1509. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[2], m_carr[2]);
  1510. }
  1511. ANKI_ENABLE_METHOD(N > 3)
  1512. TVec<T, 4> zzzw() const
  1513. {
  1514. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[2], m_carr[3]);
  1515. }
  1516. ANKI_ENABLE_METHOD(N > 3)
  1517. TVec<T, 4> zzwx() const
  1518. {
  1519. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[3], m_carr[0]);
  1520. }
  1521. ANKI_ENABLE_METHOD(N > 3)
  1522. TVec<T, 4> zzwy() const
  1523. {
  1524. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[3], m_carr[1]);
  1525. }
  1526. ANKI_ENABLE_METHOD(N > 3)
  1527. TVec<T, 4> zzwz() const
  1528. {
  1529. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[3], m_carr[2]);
  1530. }
  1531. ANKI_ENABLE_METHOD(N > 3)
  1532. TVec<T, 4> zzww() const
  1533. {
  1534. return TVec<T, 4>(m_carr[2], m_carr[2], m_carr[3], m_carr[3]);
  1535. }
  1536. ANKI_ENABLE_METHOD(N > 3)
  1537. TVec<T, 4> zwxx() const
  1538. {
  1539. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[0], m_carr[0]);
  1540. }
  1541. ANKI_ENABLE_METHOD(N > 3)
  1542. TVec<T, 4> zwxy() const
  1543. {
  1544. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[0], m_carr[1]);
  1545. }
  1546. ANKI_ENABLE_METHOD(N > 3)
  1547. TVec<T, 4> zwxz() const
  1548. {
  1549. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[0], m_carr[2]);
  1550. }
  1551. ANKI_ENABLE_METHOD(N > 3)
  1552. TVec<T, 4> zwxw() const
  1553. {
  1554. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[0], m_carr[3]);
  1555. }
  1556. ANKI_ENABLE_METHOD(N > 3)
  1557. TVec<T, 4> zwyx() const
  1558. {
  1559. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[1], m_carr[0]);
  1560. }
  1561. ANKI_ENABLE_METHOD(N > 3)
  1562. TVec<T, 4> zwyy() const
  1563. {
  1564. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[1], m_carr[1]);
  1565. }
  1566. ANKI_ENABLE_METHOD(N > 3)
  1567. TVec<T, 4> zwyz() const
  1568. {
  1569. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[1], m_carr[2]);
  1570. }
  1571. ANKI_ENABLE_METHOD(N > 3)
  1572. TVec<T, 4> zwyw() const
  1573. {
  1574. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[1], m_carr[3]);
  1575. }
  1576. ANKI_ENABLE_METHOD(N > 3)
  1577. TVec<T, 4> zwzx() const
  1578. {
  1579. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[2], m_carr[0]);
  1580. }
  1581. ANKI_ENABLE_METHOD(N > 3)
  1582. TVec<T, 4> zwzy() const
  1583. {
  1584. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[2], m_carr[1]);
  1585. }
  1586. ANKI_ENABLE_METHOD(N > 3)
  1587. TVec<T, 4> zwzz() const
  1588. {
  1589. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[2], m_carr[2]);
  1590. }
  1591. ANKI_ENABLE_METHOD(N > 3)
  1592. TVec<T, 4> zwzw() const
  1593. {
  1594. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[2], m_carr[3]);
  1595. }
  1596. ANKI_ENABLE_METHOD(N > 3)
  1597. TVec<T, 4> zwwx() const
  1598. {
  1599. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[3], m_carr[0]);
  1600. }
  1601. ANKI_ENABLE_METHOD(N > 3)
  1602. TVec<T, 4> zwwy() const
  1603. {
  1604. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[3], m_carr[1]);
  1605. }
  1606. ANKI_ENABLE_METHOD(N > 3)
  1607. TVec<T, 4> zwwz() const
  1608. {
  1609. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[3], m_carr[2]);
  1610. }
  1611. ANKI_ENABLE_METHOD(N > 3)
  1612. TVec<T, 4> zwww() const
  1613. {
  1614. return TVec<T, 4>(m_carr[2], m_carr[3], m_carr[3], m_carr[3]);
  1615. }
  1616. ANKI_ENABLE_METHOD(N > 3)
  1617. TVec<T, 4> wxxx() const
  1618. {
  1619. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[0], m_carr[0]);
  1620. }
  1621. ANKI_ENABLE_METHOD(N > 3)
  1622. TVec<T, 4> wxxy() const
  1623. {
  1624. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[0], m_carr[1]);
  1625. }
  1626. ANKI_ENABLE_METHOD(N > 3)
  1627. TVec<T, 4> wxxz() const
  1628. {
  1629. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[0], m_carr[2]);
  1630. }
  1631. ANKI_ENABLE_METHOD(N > 3)
  1632. TVec<T, 4> wxxw() const
  1633. {
  1634. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[0], m_carr[3]);
  1635. }
  1636. ANKI_ENABLE_METHOD(N > 3)
  1637. TVec<T, 4> wxyx() const
  1638. {
  1639. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[1], m_carr[0]);
  1640. }
  1641. ANKI_ENABLE_METHOD(N > 3)
  1642. TVec<T, 4> wxyy() const
  1643. {
  1644. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[1], m_carr[1]);
  1645. }
  1646. ANKI_ENABLE_METHOD(N > 3)
  1647. TVec<T, 4> wxyz() const
  1648. {
  1649. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[1], m_carr[2]);
  1650. }
  1651. ANKI_ENABLE_METHOD(N > 3)
  1652. TVec<T, 4> wxyw() const
  1653. {
  1654. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[1], m_carr[3]);
  1655. }
  1656. ANKI_ENABLE_METHOD(N > 3)
  1657. TVec<T, 4> wxzx() const
  1658. {
  1659. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[2], m_carr[0]);
  1660. }
  1661. ANKI_ENABLE_METHOD(N > 3)
  1662. TVec<T, 4> wxzy() const
  1663. {
  1664. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[2], m_carr[1]);
  1665. }
  1666. ANKI_ENABLE_METHOD(N > 3)
  1667. TVec<T, 4> wxzz() const
  1668. {
  1669. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[2], m_carr[2]);
  1670. }
  1671. ANKI_ENABLE_METHOD(N > 3)
  1672. TVec<T, 4> wxzw() const
  1673. {
  1674. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[2], m_carr[3]);
  1675. }
  1676. ANKI_ENABLE_METHOD(N > 3)
  1677. TVec<T, 4> wxwx() const
  1678. {
  1679. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[3], m_carr[0]);
  1680. }
  1681. ANKI_ENABLE_METHOD(N > 3)
  1682. TVec<T, 4> wxwy() const
  1683. {
  1684. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[3], m_carr[1]);
  1685. }
  1686. ANKI_ENABLE_METHOD(N > 3)
  1687. TVec<T, 4> wxwz() const
  1688. {
  1689. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[3], m_carr[2]);
  1690. }
  1691. ANKI_ENABLE_METHOD(N > 3)
  1692. TVec<T, 4> wxww() const
  1693. {
  1694. return TVec<T, 4>(m_carr[3], m_carr[0], m_carr[3], m_carr[3]);
  1695. }
  1696. ANKI_ENABLE_METHOD(N > 3)
  1697. TVec<T, 4> wyxx() const
  1698. {
  1699. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[0], m_carr[0]);
  1700. }
  1701. ANKI_ENABLE_METHOD(N > 3)
  1702. TVec<T, 4> wyxy() const
  1703. {
  1704. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[0], m_carr[1]);
  1705. }
  1706. ANKI_ENABLE_METHOD(N > 3)
  1707. TVec<T, 4> wyxz() const
  1708. {
  1709. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[0], m_carr[2]);
  1710. }
  1711. ANKI_ENABLE_METHOD(N > 3)
  1712. TVec<T, 4> wyxw() const
  1713. {
  1714. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[0], m_carr[3]);
  1715. }
  1716. ANKI_ENABLE_METHOD(N > 3)
  1717. TVec<T, 4> wyyx() const
  1718. {
  1719. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[1], m_carr[0]);
  1720. }
  1721. ANKI_ENABLE_METHOD(N > 3)
  1722. TVec<T, 4> wyyy() const
  1723. {
  1724. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[1], m_carr[1]);
  1725. }
  1726. ANKI_ENABLE_METHOD(N > 3)
  1727. TVec<T, 4> wyyz() const
  1728. {
  1729. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[1], m_carr[2]);
  1730. }
  1731. ANKI_ENABLE_METHOD(N > 3)
  1732. TVec<T, 4> wyyw() const
  1733. {
  1734. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[1], m_carr[3]);
  1735. }
  1736. ANKI_ENABLE_METHOD(N > 3)
  1737. TVec<T, 4> wyzx() const
  1738. {
  1739. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[2], m_carr[0]);
  1740. }
  1741. ANKI_ENABLE_METHOD(N > 3)
  1742. TVec<T, 4> wyzy() const
  1743. {
  1744. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[2], m_carr[1]);
  1745. }
  1746. ANKI_ENABLE_METHOD(N > 3)
  1747. TVec<T, 4> wyzz() const
  1748. {
  1749. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[2], m_carr[2]);
  1750. }
  1751. ANKI_ENABLE_METHOD(N > 3)
  1752. TVec<T, 4> wyzw() const
  1753. {
  1754. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[2], m_carr[3]);
  1755. }
  1756. ANKI_ENABLE_METHOD(N > 3)
  1757. TVec<T, 4> wywx() const
  1758. {
  1759. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[3], m_carr[0]);
  1760. }
  1761. ANKI_ENABLE_METHOD(N > 3)
  1762. TVec<T, 4> wywy() const
  1763. {
  1764. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[3], m_carr[1]);
  1765. }
  1766. ANKI_ENABLE_METHOD(N > 3)
  1767. TVec<T, 4> wywz() const
  1768. {
  1769. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[3], m_carr[2]);
  1770. }
  1771. ANKI_ENABLE_METHOD(N > 3)
  1772. TVec<T, 4> wyww() const
  1773. {
  1774. return TVec<T, 4>(m_carr[3], m_carr[1], m_carr[3], m_carr[3]);
  1775. }
  1776. ANKI_ENABLE_METHOD(N > 3)
  1777. TVec<T, 4> wzxx() const
  1778. {
  1779. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[0], m_carr[0]);
  1780. }
  1781. ANKI_ENABLE_METHOD(N > 3)
  1782. TVec<T, 4> wzxy() const
  1783. {
  1784. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[0], m_carr[1]);
  1785. }
  1786. ANKI_ENABLE_METHOD(N > 3)
  1787. TVec<T, 4> wzxz() const
  1788. {
  1789. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[0], m_carr[2]);
  1790. }
  1791. ANKI_ENABLE_METHOD(N > 3)
  1792. TVec<T, 4> wzxw() const
  1793. {
  1794. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[0], m_carr[3]);
  1795. }
  1796. ANKI_ENABLE_METHOD(N > 3)
  1797. TVec<T, 4> wzyx() const
  1798. {
  1799. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[1], m_carr[0]);
  1800. }
  1801. ANKI_ENABLE_METHOD(N > 3)
  1802. TVec<T, 4> wzyy() const
  1803. {
  1804. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[1], m_carr[1]);
  1805. }
  1806. ANKI_ENABLE_METHOD(N > 3)
  1807. TVec<T, 4> wzyz() const
  1808. {
  1809. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[1], m_carr[2]);
  1810. }
  1811. ANKI_ENABLE_METHOD(N > 3)
  1812. TVec<T, 4> wzyw() const
  1813. {
  1814. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[1], m_carr[3]);
  1815. }
  1816. ANKI_ENABLE_METHOD(N > 3)
  1817. TVec<T, 4> wzzx() const
  1818. {
  1819. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[2], m_carr[0]);
  1820. }
  1821. ANKI_ENABLE_METHOD(N > 3)
  1822. TVec<T, 4> wzzy() const
  1823. {
  1824. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[2], m_carr[1]);
  1825. }
  1826. ANKI_ENABLE_METHOD(N > 3)
  1827. TVec<T, 4> wzzz() const
  1828. {
  1829. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[2], m_carr[2]);
  1830. }
  1831. ANKI_ENABLE_METHOD(N > 3)
  1832. TVec<T, 4> wzzw() const
  1833. {
  1834. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[2], m_carr[3]);
  1835. }
  1836. ANKI_ENABLE_METHOD(N > 3)
  1837. TVec<T, 4> wzwx() const
  1838. {
  1839. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[3], m_carr[0]);
  1840. }
  1841. ANKI_ENABLE_METHOD(N > 3)
  1842. TVec<T, 4> wzwy() const
  1843. {
  1844. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[3], m_carr[1]);
  1845. }
  1846. ANKI_ENABLE_METHOD(N > 3)
  1847. TVec<T, 4> wzwz() const
  1848. {
  1849. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[3], m_carr[2]);
  1850. }
  1851. ANKI_ENABLE_METHOD(N > 3)
  1852. TVec<T, 4> wzww() const
  1853. {
  1854. return TVec<T, 4>(m_carr[3], m_carr[2], m_carr[3], m_carr[3]);
  1855. }
  1856. ANKI_ENABLE_METHOD(N > 3)
  1857. TVec<T, 4> wwxx() const
  1858. {
  1859. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[0], m_carr[0]);
  1860. }
  1861. ANKI_ENABLE_METHOD(N > 3)
  1862. TVec<T, 4> wwxy() const
  1863. {
  1864. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[0], m_carr[1]);
  1865. }
  1866. ANKI_ENABLE_METHOD(N > 3)
  1867. TVec<T, 4> wwxz() const
  1868. {
  1869. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[0], m_carr[2]);
  1870. }
  1871. ANKI_ENABLE_METHOD(N > 3)
  1872. TVec<T, 4> wwxw() const
  1873. {
  1874. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[0], m_carr[3]);
  1875. }
  1876. ANKI_ENABLE_METHOD(N > 3)
  1877. TVec<T, 4> wwyx() const
  1878. {
  1879. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[1], m_carr[0]);
  1880. }
  1881. ANKI_ENABLE_METHOD(N > 3)
  1882. TVec<T, 4> wwyy() const
  1883. {
  1884. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[1], m_carr[1]);
  1885. }
  1886. ANKI_ENABLE_METHOD(N > 3)
  1887. TVec<T, 4> wwyz() const
  1888. {
  1889. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[1], m_carr[2]);
  1890. }
  1891. ANKI_ENABLE_METHOD(N > 3)
  1892. TVec<T, 4> wwyw() const
  1893. {
  1894. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[1], m_carr[3]);
  1895. }
  1896. ANKI_ENABLE_METHOD(N > 3)
  1897. TVec<T, 4> wwzx() const
  1898. {
  1899. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[2], m_carr[0]);
  1900. }
  1901. ANKI_ENABLE_METHOD(N > 3)
  1902. TVec<T, 4> wwzy() const
  1903. {
  1904. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[2], m_carr[1]);
  1905. }
  1906. ANKI_ENABLE_METHOD(N > 3)
  1907. TVec<T, 4> wwzz() const
  1908. {
  1909. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[2], m_carr[2]);
  1910. }
  1911. ANKI_ENABLE_METHOD(N > 3)
  1912. TVec<T, 4> wwzw() const
  1913. {
  1914. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[2], m_carr[3]);
  1915. }
  1916. ANKI_ENABLE_METHOD(N > 3)
  1917. TVec<T, 4> wwwx() const
  1918. {
  1919. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[3], m_carr[0]);
  1920. }
  1921. ANKI_ENABLE_METHOD(N > 3)
  1922. TVec<T, 4> wwwy() const
  1923. {
  1924. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[3], m_carr[1]);
  1925. }
  1926. ANKI_ENABLE_METHOD(N > 3)
  1927. TVec<T, 4> wwwz() const
  1928. {
  1929. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[3], m_carr[2]);
  1930. }
  1931. ANKI_ENABLE_METHOD(N > 3)
  1932. TVec<T, 4> wwww() const
  1933. {
  1934. return TVec<T, 4>(m_carr[3], m_carr[3], m_carr[3], m_carr[3]);
  1935. }
  1936. /// @}
  1937. /// @name Operators with same type
  1938. /// @{
  1939. // Copy
  1940. TVec& operator=(ANKI_ENABLE_ARG(const TVec&, !HAS_VEC4_SIMD) b)
  1941. {
  1942. for(U i = 0; i < N; i++)
  1943. {
  1944. m_arr[i] = b.m_carr[i];
  1945. }
  1946. return *this;
  1947. }
  1948. // Copy
  1949. TVec& operator=(ANKI_ENABLE_ARG(const TVec&, HAS_VEC4_SIMD) b)
  1950. {
  1951. m_simd = b.m_simd;
  1952. return *this;
  1953. }
  1954. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  1955. TVec operator+(const TVec& b) const
  1956. {
  1957. TVec out;
  1958. for(U i = 0; i < N; i++)
  1959. {
  1960. out.m_arr[i] = m_arr[i] + b.m_arr[i];
  1961. }
  1962. return out;
  1963. }
  1964. #if ANKI_ENABLE_SIMD
  1965. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  1966. TVec operator+(const TVec& b) const
  1967. {
  1968. # if ANKI_SIMD_SSE
  1969. return TVec(_mm_add_ps(m_simd, b.m_simd));
  1970. # else
  1971. return TVec(m_simd + b.m_simd);
  1972. # endif
  1973. }
  1974. #endif
  1975. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  1976. TVec& operator+=(const TVec& b)
  1977. {
  1978. for(U i = 0; i < N; i++)
  1979. {
  1980. m_arr[i] += b.m_arr[i];
  1981. }
  1982. return *this;
  1983. }
  1984. #if ANKI_ENABLE_SIMD
  1985. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  1986. TVec& operator+=(const TVec& b)
  1987. {
  1988. # if ANKI_SIMD_SSE
  1989. m_simd = _mm_add_ps(m_simd, b.m_simd);
  1990. # else
  1991. m_simd += b.m_simd;
  1992. # endif
  1993. return *this;
  1994. }
  1995. #endif
  1996. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  1997. TVec operator-(const TVec& b) const
  1998. {
  1999. TVec out;
  2000. for(U i = 0; i < N; i++)
  2001. {
  2002. out.m_arr[i] = m_arr[i] - b.m_arr[i];
  2003. }
  2004. return out;
  2005. }
  2006. #if ANKI_ENABLE_SIMD
  2007. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2008. TVec operator-(const TVec& b) const
  2009. {
  2010. # if ANKI_SIMD_SSE
  2011. return TVec(_mm_sub_ps(m_simd, b.m_simd));
  2012. # else
  2013. return TVec(m_simd - b.m_simd);
  2014. # endif
  2015. }
  2016. #endif
  2017. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2018. TVec& operator-=(const TVec& b)
  2019. {
  2020. for(U i = 0; i < N; i++)
  2021. {
  2022. m_arr[i] -= b.m_arr[i];
  2023. }
  2024. return *this;
  2025. }
  2026. #if ANKI_ENABLE_SIMD
  2027. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2028. TVec& operator-=(const TVec& b)
  2029. {
  2030. # if ANKI_SIMD_SSE
  2031. m_simd = _mm_sub_ps(m_simd, b.m_simd);
  2032. # else
  2033. m_simd -= b.m_simd;
  2034. # endif
  2035. return *this;
  2036. }
  2037. #endif
  2038. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2039. TVec operator*(const TVec& b) const
  2040. {
  2041. TVec out;
  2042. for(U i = 0; i < N; i++)
  2043. {
  2044. out.m_arr[i] = m_arr[i] * b.m_arr[i];
  2045. }
  2046. return out;
  2047. }
  2048. #if ANKI_ENABLE_SIMD
  2049. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2050. TVec operator*(const TVec& b) const
  2051. {
  2052. # if ANKI_SIMD_SSE
  2053. return TVec(_mm_mul_ps(m_simd, b.m_simd));
  2054. # else
  2055. return TVec(m_simd * b.m_simd);
  2056. # endif
  2057. }
  2058. #endif
  2059. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2060. TVec& operator*=(const TVec& b)
  2061. {
  2062. for(U i = 0; i < N; i++)
  2063. {
  2064. m_arr[i] *= b.m_arr[i];
  2065. }
  2066. return *this;
  2067. }
  2068. #if ANKI_ENABLE_SIMD
  2069. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2070. TVec& operator*=(const TVec& b)
  2071. {
  2072. # if ANKI_SIMD_SSE
  2073. m_simd = _mm_mul_ps(m_simd, b.m_simd);
  2074. # else
  2075. m_simd *= b.m_simd;
  2076. # endif
  2077. return *this;
  2078. }
  2079. #endif
  2080. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2081. TVec operator/(const TVec& b) const
  2082. {
  2083. TVec out;
  2084. for(U i = 0; i < N; i++)
  2085. {
  2086. ANKI_ASSERT(b.m_arr[i] != 0.0);
  2087. out.m_arr[i] = m_arr[i] / b.m_arr[i];
  2088. }
  2089. return out;
  2090. }
  2091. #if ANKI_ENABLE_SIMD
  2092. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2093. TVec operator/(const TVec& b) const
  2094. {
  2095. # if ANKI_SIMD_SSE
  2096. return TVec(_mm_div_ps(m_simd, b.m_simd));
  2097. # else
  2098. return TVec(m_simd / b.m_simd);
  2099. # endif
  2100. }
  2101. #endif
  2102. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2103. TVec& operator/=(const TVec& b)
  2104. {
  2105. for(U i = 0; i < N; i++)
  2106. {
  2107. ANKI_ASSERT(b.m_arr[i] != 0.0);
  2108. m_arr[i] /= b.m_arr[i];
  2109. }
  2110. return *this;
  2111. }
  2112. #if ANKI_ENABLE_SIMD
  2113. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2114. TVec& operator/=(const TVec& b)
  2115. {
  2116. # if ANKI_SIMD_SSE
  2117. m_simd = _mm_div_ps(m_simd, b.m_simd);
  2118. # else
  2119. m_simd /= b.m_simd;
  2120. # endif
  2121. return *this;
  2122. }
  2123. #endif
  2124. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2125. TVec operator-() const
  2126. {
  2127. TVec out;
  2128. for(U i = 0; i < N; i++)
  2129. {
  2130. out.m_arr[i] = -m_arr[i];
  2131. }
  2132. return out;
  2133. }
  2134. #if ANKI_ENABLE_SIMD
  2135. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2136. TVec operator-() const
  2137. {
  2138. # if ANKI_SIMD_SSE
  2139. return TVec(_mm_xor_ps(m_simd, _mm_set1_ps(-0.0)));
  2140. # else
  2141. return TVec(-m_simd);
  2142. # endif
  2143. }
  2144. #endif
  2145. ANKI_ENABLE_METHOD(IS_INTEGER)
  2146. TVec operator<<(const TVec& b) const
  2147. {
  2148. TVec out;
  2149. for(U i = 0; i < N; i++)
  2150. {
  2151. out.m_carr[i] = m_carr[i] << b.m_carr[i];
  2152. }
  2153. return out;
  2154. }
  2155. ANKI_ENABLE_METHOD(IS_INTEGER)
  2156. TVec& operator<<=(const TVec& b)
  2157. {
  2158. for(U i = 0; i < N; i++)
  2159. {
  2160. m_carr[i] <<= b.m_carr[i];
  2161. }
  2162. return *this;
  2163. }
  2164. ANKI_ENABLE_METHOD(IS_INTEGER)
  2165. TVec operator>>(const TVec& b) const
  2166. {
  2167. TVec out;
  2168. for(U i = 0; i < N; i++)
  2169. {
  2170. out.m_carr[i] = m_carr[i] >> b.m_carr[i];
  2171. }
  2172. return out;
  2173. }
  2174. ANKI_ENABLE_METHOD(IS_INTEGER)
  2175. TVec& operator>>=(const TVec& b)
  2176. {
  2177. for(U i = 0; i < N; i++)
  2178. {
  2179. m_carr[i] >>= b.m_carr[i];
  2180. }
  2181. return *this;
  2182. }
  2183. ANKI_ENABLE_METHOD(IS_INTEGER)
  2184. TVec operator&(const TVec& b) const
  2185. {
  2186. TVec out;
  2187. for(U i = 0; i < N; i++)
  2188. {
  2189. out.m_carr[i] = m_carr[i] & b.m_carr[i];
  2190. }
  2191. return out;
  2192. }
  2193. ANKI_ENABLE_METHOD(IS_INTEGER)
  2194. TVec& operator&=(const TVec& b)
  2195. {
  2196. for(U i = 0; i < N; i++)
  2197. {
  2198. m_carr[i] &= b.m_carr[i];
  2199. }
  2200. return *this;
  2201. }
  2202. ANKI_ENABLE_METHOD(IS_INTEGER)
  2203. TVec operator|(const TVec& b) const
  2204. {
  2205. TVec out;
  2206. for(U i = 0; i < N; i++)
  2207. {
  2208. out.m_carr[i] = m_carr[i] | b.m_carr[i];
  2209. }
  2210. return out;
  2211. }
  2212. ANKI_ENABLE_METHOD(IS_INTEGER)
  2213. TVec& operator|=(const TVec& b)
  2214. {
  2215. for(U i = 0; i < N; i++)
  2216. {
  2217. m_carr[i] |= b.m_carr[i];
  2218. }
  2219. return *this;
  2220. }
  2221. ANKI_ENABLE_METHOD(IS_INTEGER)
  2222. TVec operator^(const TVec& b) const
  2223. {
  2224. TVec out;
  2225. for(U i = 0; i < N; i++)
  2226. {
  2227. out.m_carr[i] = m_carr[i] ^ b.m_carr[i];
  2228. }
  2229. return out;
  2230. }
  2231. ANKI_ENABLE_METHOD(IS_INTEGER)
  2232. TVec& operator^=(const TVec& b)
  2233. {
  2234. for(U i = 0; i < N; i++)
  2235. {
  2236. m_carr[i] ^= b.m_carr[i];
  2237. }
  2238. return *this;
  2239. }
  2240. ANKI_ENABLE_METHOD(IS_INTEGER)
  2241. TVec operator%(const TVec& b) const
  2242. {
  2243. TVec out;
  2244. for(U i = 0; i < N; i++)
  2245. {
  2246. out.m_carr[i] = m_carr[i] % b.m_carr[i];
  2247. }
  2248. return out;
  2249. }
  2250. ANKI_ENABLE_METHOD(IS_INTEGER)
  2251. TVec& operator%=(const TVec& b)
  2252. {
  2253. for(U i = 0; i < N; i++)
  2254. {
  2255. m_carr[i] %= b.m_carr[i];
  2256. }
  2257. return *this;
  2258. }
  2259. Bool operator==(const TVec& b) const
  2260. {
  2261. for(U i = 0; i < N; i++)
  2262. {
  2263. if(!isZero<T>(m_arr[i] - b.m_arr[i]))
  2264. {
  2265. return false;
  2266. }
  2267. }
  2268. return true;
  2269. }
  2270. Bool operator!=(const TVec& b) const
  2271. {
  2272. return !operator==(b);
  2273. }
  2274. Bool operator<(const TVec& b) const
  2275. {
  2276. for(U i = 0; i < N; i++)
  2277. {
  2278. if(m_arr[i] >= b.m_arr[i])
  2279. {
  2280. return false;
  2281. }
  2282. }
  2283. return true;
  2284. }
  2285. Bool operator<=(const TVec& b) const
  2286. {
  2287. for(U i = 0; i < N; i++)
  2288. {
  2289. if(m_arr[i] > b.m_arr[i])
  2290. {
  2291. return false;
  2292. }
  2293. }
  2294. return true;
  2295. }
  2296. Bool operator>(const TVec& b) const
  2297. {
  2298. for(U i = 0; i < N; i++)
  2299. {
  2300. if(m_arr[i] <= b.m_arr[i])
  2301. {
  2302. return false;
  2303. }
  2304. }
  2305. return true;
  2306. }
  2307. Bool operator>=(const TVec& b) const
  2308. {
  2309. for(U i = 0; i < N; i++)
  2310. {
  2311. if(m_arr[i] < b.m_arr[i])
  2312. {
  2313. return false;
  2314. }
  2315. }
  2316. return true;
  2317. }
  2318. /// @}
  2319. /// @name Operators with T
  2320. /// @{
  2321. TVec operator+(const T f) const
  2322. {
  2323. return (*this) + TVec(f);
  2324. }
  2325. TVec& operator+=(const T f)
  2326. {
  2327. (*this) += TVec(f);
  2328. return *this;
  2329. }
  2330. TVec operator-(const T f) const
  2331. {
  2332. return (*this) - TVec(f);
  2333. }
  2334. TVec& operator-=(const T f)
  2335. {
  2336. (*this) -= TVec(f);
  2337. return *this;
  2338. }
  2339. TVec operator*(const T f) const
  2340. {
  2341. return (*this) * TVec(f);
  2342. }
  2343. TVec& operator*=(const T f)
  2344. {
  2345. (*this) *= TVec(f);
  2346. return *this;
  2347. }
  2348. TVec operator/(const T f) const
  2349. {
  2350. return (*this) / TVec(f);
  2351. }
  2352. TVec& operator/=(const T f)
  2353. {
  2354. (*this) /= TVec(f);
  2355. return *this;
  2356. }
  2357. ANKI_ENABLE_METHOD(IS_INTEGER)
  2358. TVec operator<<(const T f) const
  2359. {
  2360. return (*this) << TVec(f);
  2361. }
  2362. ANKI_ENABLE_METHOD(IS_INTEGER)
  2363. TVec& operator<<=(const T f)
  2364. {
  2365. (*this) <<= TVec(f);
  2366. return *this;
  2367. }
  2368. ANKI_ENABLE_METHOD(IS_INTEGER)
  2369. TVec operator>>(const T f) const
  2370. {
  2371. return (*this) >> TVec(f);
  2372. }
  2373. ANKI_ENABLE_METHOD(IS_INTEGER)
  2374. TVec& operator>>=(const T f)
  2375. {
  2376. (*this) >>= TVec(f);
  2377. return *this;
  2378. }
  2379. ANKI_ENABLE_METHOD(IS_INTEGER)
  2380. TVec operator&(const T f) const
  2381. {
  2382. return (*this) & TVec(f);
  2383. }
  2384. ANKI_ENABLE_METHOD(IS_INTEGER)
  2385. TVec& operator&=(const T f)
  2386. {
  2387. (*this) &= TVec(f);
  2388. return *this;
  2389. }
  2390. ANKI_ENABLE_METHOD(IS_INTEGER)
  2391. TVec operator|(const T f) const
  2392. {
  2393. return (*this) | TVec(f);
  2394. }
  2395. ANKI_ENABLE_METHOD(IS_INTEGER)
  2396. TVec& operator|=(const T f)
  2397. {
  2398. (*this) |= TVec(f);
  2399. return *this;
  2400. }
  2401. ANKI_ENABLE_METHOD(IS_INTEGER)
  2402. TVec operator^(const T f) const
  2403. {
  2404. return (*this) ^ TVec(f);
  2405. }
  2406. ANKI_ENABLE_METHOD(IS_INTEGER)
  2407. TVec& operator^=(const T f)
  2408. {
  2409. (*this) ^= TVec(f);
  2410. return *this;
  2411. }
  2412. ANKI_ENABLE_METHOD(IS_INTEGER)
  2413. TVec operator%(const T f) const
  2414. {
  2415. return (*this) % TVec(f);
  2416. }
  2417. ANKI_ENABLE_METHOD(IS_INTEGER)
  2418. TVec& operator%=(const T f)
  2419. {
  2420. (*this) %= TVec(f);
  2421. return *this;
  2422. }
  2423. Bool operator==(const T f) const
  2424. {
  2425. return *this == TVec(f);
  2426. }
  2427. Bool operator!=(const T f) const
  2428. {
  2429. return *this != TVec(f);
  2430. }
  2431. Bool operator<(const T f) const
  2432. {
  2433. return *this < TVec(f);
  2434. }
  2435. Bool operator<=(const T f) const
  2436. {
  2437. return *this <= TVec(f);
  2438. }
  2439. Bool operator>(const T f) const
  2440. {
  2441. return *this > TVec(f);
  2442. }
  2443. Bool operator>=(const T f) const
  2444. {
  2445. return *this >= TVec(f);
  2446. }
  2447. /// @}
  2448. /// @name Operators with other
  2449. /// @{
  2450. /// @note 16 muls 12 adds
  2451. ANKI_ENABLE_METHOD(N == 4)
  2452. TVec operator*(const TMat<T, 4, 4>& m4) const
  2453. {
  2454. return TVec(x() * m4(0, 0) + y() * m4(1, 0) + z() * m4(2, 0) + w() * m4(3, 0),
  2455. x() * m4(0, 1) + y() * m4(1, 1) + z() * m4(2, 1) + w() * m4(3, 1),
  2456. x() * m4(0, 2) + y() * m4(1, 2) + z() * m4(2, 2) + w() * m4(3, 2),
  2457. x() * m4(0, 3) + y() * m4(1, 3) + z() * m4(2, 3) + w() * m4(3, 3));
  2458. }
  2459. /// @}
  2460. /// @name Other
  2461. /// @{
  2462. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2463. T dot(const TVec& b) const
  2464. {
  2465. T out = T(0);
  2466. for(U i = 0; i < N; i++)
  2467. {
  2468. out += m_arr[i] * b.m_arr[i];
  2469. }
  2470. return out;
  2471. }
  2472. #if ANKI_ENABLE_SIMD
  2473. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2474. T dot(const TVec& b) const
  2475. {
  2476. T o;
  2477. # if ANKI_SIMD_SSE
  2478. _mm_store_ss(&o, _mm_dp_ps(m_simd, b.m_simd, 0xF1));
  2479. # else
  2480. const float32x4_t tmp = m_simd * b.m_simd;
  2481. float32x2_t sum = vpadd_f32(vget_low_f32(tmp), vget_high_f32(tmp));
  2482. sum = vpadd_f32(sum, sum);
  2483. o = sum[0];
  2484. # endif
  2485. return o;
  2486. }
  2487. #endif
  2488. /// 6 muls, 3 adds
  2489. ANKI_ENABLE_METHOD(N == 3)
  2490. TVec cross(const TVec& b) const
  2491. {
  2492. return TVec(y() * b.z() - z() * b.y(), z() * b.x() - x() * b.z(), x() * b.y() - y() * b.x());
  2493. }
  2494. /// It's like calculating the cross of a 3 component TVec.
  2495. ANKI_ENABLE_METHOD(N == 4 && !HAS_VEC4_SIMD)
  2496. TVec cross(const TVec& b) const
  2497. {
  2498. ANKI_ASSERT(w() == T(0));
  2499. ANKI_ASSERT(b.w() == T(0));
  2500. return TVec(xyz().cross(b.xyz()), T(0));
  2501. }
  2502. #if ANKI_ENABLE_SIMD
  2503. ANKI_ENABLE_METHOD(N == 4 && HAS_VEC4_SIMD)
  2504. TVec cross(const TVec& b) const
  2505. {
  2506. ANKI_ASSERT(w() == T(0));
  2507. ANKI_ASSERT(b.w() == T(0));
  2508. # if ANKI_SIMD_SSE
  2509. const auto& a = *this;
  2510. constexpr unsigned int mask0 = _MM_SHUFFLE(3, 0, 2, 1);
  2511. constexpr unsigned int mask1 = _MM_SHUFFLE(3, 1, 0, 2);
  2512. const __m128 tmp0 =
  2513. _mm_mul_ps(_mm_shuffle_ps(a.m_simd, a.m_simd, U8(mask0)), _mm_shuffle_ps(b.m_simd, b.m_simd, U8(mask1)));
  2514. const __m128 tmp1 =
  2515. _mm_mul_ps(_mm_shuffle_ps(a.m_simd, a.m_simd, U8(mask1)), _mm_shuffle_ps(b.m_simd, b.m_simd, U8(mask0)));
  2516. return TVec(_mm_sub_ps(tmp0, tmp1));
  2517. # else
  2518. TVec out;
  2519. float32x4_t& c = out.m_simd;
  2520. const float32x4_t& v0 = m_simd;
  2521. const float32x4_t& v1 = b.m_simd;
  2522. c = v0 * __builtin_shufflevector(v1, v1, 1, 2, 0, 3);
  2523. c = vfmsq_f32(c, __builtin_shufflevector(v0, v0, 1, 2, 0, 3), v1);
  2524. c = __builtin_shufflevector(c, c, 1, 2, 0, 3);
  2525. return out;
  2526. # endif
  2527. }
  2528. #endif
  2529. ANKI_ENABLE_METHOD(N == 3)
  2530. TVec projectTo(const TVec& toThis) const
  2531. {
  2532. return toThis * ((*this).dot(toThis) / (toThis.dot(toThis)));
  2533. }
  2534. ANKI_ENABLE_METHOD(N == 4)
  2535. TVec projectTo(const TVec& toThis) const
  2536. {
  2537. ANKI_ASSERT(w() == T(0));
  2538. return (toThis * ((*this).dot(toThis) / (toThis.dot(toThis)))).xyz0();
  2539. }
  2540. ANKI_ENABLE_METHOD(N == 3)
  2541. TVec projectTo(const TVec& rayOrigin, const TVec& rayDir) const
  2542. {
  2543. const auto& a = *this;
  2544. return rayOrigin + rayDir * ((a - rayOrigin).dot(rayDir));
  2545. }
  2546. ANKI_ENABLE_METHOD(N == 4)
  2547. TVec projectTo(const TVec& rayOrigin, const TVec& rayDir) const
  2548. {
  2549. ANKI_ASSERT(w() == T(0));
  2550. ANKI_ASSERT(rayOrigin.w() == T(0));
  2551. ANKI_ASSERT(rayDir.w() == T(0));
  2552. const auto& a = *this;
  2553. return rayOrigin + rayDir * ((a - rayOrigin).dot(rayDir));
  2554. }
  2555. /// Perspective divide. Divide the xyzw of this to the w of this. This method will handle some edge cases.
  2556. ANKI_ENABLE_METHOD(N == 4)
  2557. TVec perspectiveDivide() const
  2558. {
  2559. auto invw = T(1) / w(); // This may become (+-)inf
  2560. invw = (invw > 1e+11) ? 1e+11 : invw; // Clamp
  2561. invw = (invw < -1e+11) ? -1e+11 : invw; // Clamp
  2562. return (*this) * invw;
  2563. }
  2564. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2565. T getLengthSquared() const
  2566. {
  2567. T out = T(0);
  2568. for(U i = 0; i < N; i++)
  2569. {
  2570. out += m_arr[i] * m_arr[i];
  2571. }
  2572. return out;
  2573. }
  2574. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2575. T getLengthSquared() const
  2576. {
  2577. return dot(*this);
  2578. }
  2579. T getLength() const
  2580. {
  2581. return sqrt<T>(getLengthSquared());
  2582. }
  2583. T getDistanceSquared(const TVec& b) const
  2584. {
  2585. return ((*this) - b).getLengthSquared();
  2586. }
  2587. T getDistance(const TVec& b) const
  2588. {
  2589. return sqrt<T>(getDistance(b));
  2590. }
  2591. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2592. void normalize()
  2593. {
  2594. (*this) /= getLength();
  2595. }
  2596. #if ANKI_ENABLE_SIMD
  2597. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2598. void normalize()
  2599. {
  2600. # if ANKI_SIMD_SSE
  2601. const __m128 inverseNorm = _mm_rsqrt_ps(_mm_dp_ps(m_simd, m_simd, 0xFF));
  2602. m_simd = _mm_mul_ps(m_simd, inverseNorm);
  2603. # else
  2604. // Dot (len squared)
  2605. float32x4_t tmp = m_simd * m_simd;
  2606. float32x2_t sum = vpadd_f32(vget_low_f32(tmp), vget_high_f32(tmp));
  2607. sum = vpadd_f32(sum, sum);
  2608. float32x4_t lensq = vdupq_lane_f32(sum, 0);
  2609. // 1/sqrt(lensq)
  2610. float32x4_t mul = vrsqrteq_f32(lensq);
  2611. // Multiply
  2612. m_simd *= mul;
  2613. # endif
  2614. }
  2615. #endif
  2616. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2617. TVec getNormalized() const
  2618. {
  2619. return (*this) / getLength();
  2620. }
  2621. #if ANKI_ENABLE_SIMD
  2622. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2623. TVec getNormalized() const
  2624. {
  2625. # if ANKI_SIMD_SSE
  2626. const __m128 inverse_norm = _mm_rsqrt_ps(_mm_dp_ps(m_simd, m_simd, 0xFF));
  2627. return TVec(_mm_mul_ps(m_simd, inverse_norm));
  2628. # else
  2629. // Dot (len squared)
  2630. float32x4_t tmp = m_simd * m_simd;
  2631. float32x2_t sum = vpadd_f32(vget_low_f32(tmp), vget_high_f32(tmp));
  2632. sum = vpadd_f32(sum, sum);
  2633. float32x4_t lensq = vdupq_lane_f32(sum, 0);
  2634. // 1/sqrt(lensq)
  2635. float32x4_t mul = vrsqrteq_f32(lensq);
  2636. // Multiply
  2637. return TVec(m_simd * mul);
  2638. # endif
  2639. }
  2640. #endif
  2641. /// Return lerp(this, v1, t)
  2642. TVec lerp(const TVec& v1, T t) const
  2643. {
  2644. return ((*this) * (1.0 - t)) + (v1 * t);
  2645. }
  2646. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2647. TVec abs() const
  2648. {
  2649. TVec out;
  2650. for(U i = 0; i < N; ++i)
  2651. {
  2652. out[i] = absolute<T>(m_arr[i]);
  2653. }
  2654. return out;
  2655. }
  2656. #if ANKI_ENABLE_SIMD
  2657. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2658. TVec abs() const
  2659. {
  2660. # if ANKI_SIMD_SSE
  2661. const __m128 signMask = _mm_set1_ps(-0.0f);
  2662. return TVec(_mm_andnot_ps(signMask, m_simd));
  2663. # else
  2664. return TVec(vabsq_f32(m_simd));
  2665. # endif
  2666. }
  2667. #endif
  2668. /// Get clamped between two values.
  2669. TVec clamp(const T minv, const T maxv) const
  2670. {
  2671. return max(TVec(minv)).min(TVec(maxv));
  2672. }
  2673. /// Get clamped between two vectors.
  2674. TVec clamp(const TVec& minv, const TVec& maxv) const
  2675. {
  2676. return max(minv).min(maxv);
  2677. }
  2678. /// Get the min of all components.
  2679. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2680. TVec min(const TVec& b) const
  2681. {
  2682. TVec out;
  2683. for(U i = 0; i < N; ++i)
  2684. {
  2685. out[i] = anki::min<T>(m_arr[i], b[i]);
  2686. }
  2687. return out;
  2688. }
  2689. #if ANKI_ENABLE_SIMD
  2690. /// Get the min of all components.
  2691. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2692. TVec min(const TVec& b) const
  2693. {
  2694. # if ANKI_SIMD_SSE
  2695. return TVec(_mm_min_ps(m_simd, b.m_simd));
  2696. # else
  2697. return TVec(vminq_f32(m_simd, b.m_simd));
  2698. # endif
  2699. }
  2700. #endif
  2701. /// Get the min of all components.
  2702. TVec min(const T b) const
  2703. {
  2704. return min(TVec(b));
  2705. }
  2706. /// Get the max of all components.
  2707. ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
  2708. TVec max(const TVec& b) const
  2709. {
  2710. TVec out;
  2711. for(U i = 0; i < N; ++i)
  2712. {
  2713. out[i] = anki::max<T>(m_arr[i], b[i]);
  2714. }
  2715. return out;
  2716. }
  2717. #if ANKI_ENABLE_SIMD
  2718. /// Get the max of all components.
  2719. ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
  2720. TVec max(const TVec& b) const
  2721. {
  2722. # if ANKI_SIMD_SSE
  2723. return TVec(_mm_max_ps(m_simd, b.m_simd));
  2724. # else
  2725. return TVec(vmaxq_f32(m_simd, b.m_simd));
  2726. # endif
  2727. }
  2728. #endif
  2729. /// Get the max of all components.
  2730. TVec max(const T b) const
  2731. {
  2732. return max(TVec(b));
  2733. }
  2734. /// Get a safe 1 / (*this)
  2735. TVec reciprocal() const
  2736. {
  2737. TVec out;
  2738. for(U i = 0; i < N; ++i)
  2739. {
  2740. out[i] = T(1) / m_arr[i];
  2741. }
  2742. return out;
  2743. }
  2744. /// Serialize the structure.
  2745. void serialize(void* data, PtrSize& size) const
  2746. {
  2747. size = sizeof(*this);
  2748. if(data)
  2749. {
  2750. memcpy(data, this, sizeof(*this));
  2751. }
  2752. }
  2753. /// De-serialize the structure.
  2754. void deserialize(const void* data)
  2755. {
  2756. ANKI_ASSERT(data);
  2757. memcpy(this, data, sizeof(*this));
  2758. }
  2759. static constexpr U8 getSize()
  2760. {
  2761. return U8(N);
  2762. }
  2763. ANKI_ENABLE_METHOD(std::is_floating_point<T>::value)
  2764. void toString(StringAuto& str) const
  2765. {
  2766. for(U i = 0; i < N; ++i)
  2767. {
  2768. str.append(StringAuto(str.getAllocator()).sprintf((i < i - N) ? "%f " : "%f", m_arr[i]));
  2769. }
  2770. }
  2771. static constexpr Bool CLANG_WORKAROUND = std::is_integral<T>::value && std::is_unsigned<T>::value;
  2772. ANKI_ENABLE_METHOD(CLANG_WORKAROUND)
  2773. void toString(StringAuto& str) const
  2774. {
  2775. for(U i = 0; i < N; ++i)
  2776. {
  2777. str.append(StringAuto(str.getAllocator()).sprintf((i < i - N) ? "%u " : "%u", m_arr[i]));
  2778. }
  2779. }
  2780. static constexpr Bool CLANG_WORKAROUND2 = std::is_integral<T>::value && std::is_signed<T>::value;
  2781. ANKI_ENABLE_METHOD(CLANG_WORKAROUND2)
  2782. void toString(StringAuto& str) const
  2783. {
  2784. for(U i = 0; i < N; ++i)
  2785. {
  2786. str.append(StringAuto(str.getAllocator()).sprintf((i < i - N) ? "%d " : "%d", m_arr[i]));
  2787. }
  2788. }
  2789. /// @}
  2790. private:
  2791. /// @name Data
  2792. /// @{
  2793. union
  2794. {
  2795. Array<T, N> m_arr;
  2796. T m_carr[N]; ///< To avoid bound checks on debug builds.
  2797. Simd m_simd;
  2798. };
  2799. /// @}
  2800. };
  2801. /// @memberof TVec
  2802. template<typename T, U N>
  2803. TVec<T, N> operator+(const T f, const TVec<T, N>& v)
  2804. {
  2805. return v + f;
  2806. }
  2807. /// @memberof TVec
  2808. template<typename T, U N>
  2809. TVec<T, N> operator-(const T f, const TVec<T, N>& v)
  2810. {
  2811. return TVec<T, N>(f) - v;
  2812. }
  2813. /// @memberof TVec
  2814. template<typename T, U N>
  2815. TVec<T, N> operator*(const T f, const TVec<T, N>& v)
  2816. {
  2817. return v * f;
  2818. }
  2819. /// @memberof TVec
  2820. template<typename T, U N>
  2821. TVec<T, N> operator/(const T f, const TVec<T, N>& v)
  2822. {
  2823. return TVec<T, N>(f) / v;
  2824. }
  2825. // Types
  2826. /// F32 2D vector
  2827. using Vec2 = TVec<F32, 2>;
  2828. static_assert(sizeof(Vec2) == sizeof(F32) * 2, "Incorrect size");
  2829. /// Half float 2D vector
  2830. using HVec2 = TVec<F16, 2>;
  2831. /// 32bit signed integer 2D vector
  2832. using IVec2 = TVec<I32, 2>;
  2833. /// 16bit signed integer 2D vector
  2834. using I16Vec2 = TVec<I16, 2>;
  2835. /// 8bit signed integer 2D vector
  2836. using I8Vec2 = TVec<I8, 2>;
  2837. /// 32bit unsigned integer 2D vector
  2838. using UVec2 = TVec<U32, 2>;
  2839. /// 16bit unsigned integer 2D vector
  2840. using U16Vec2 = TVec<U16, 2>;
  2841. /// 8bit unsigned integer 2D vector
  2842. using U8Vec2 = TVec<U8, 2>;
  2843. /// F32 3D vector
  2844. using Vec3 = TVec<F32, 3>;
  2845. static_assert(sizeof(Vec3) == sizeof(F32) * 3, "Incorrect size");
  2846. /// Half float 3D vector
  2847. using HVec3 = TVec<F16, 3>;
  2848. /// 32bit signed integer 3D vector
  2849. using IVec3 = TVec<I32, 3>;
  2850. /// 16bit signed integer 3D vector
  2851. using I16Vec3 = TVec<I16, 3>;
  2852. /// 8bit signed integer 3D vector
  2853. using I8Vec3 = TVec<I8, 3>;
  2854. /// 32bit unsigned integer 3D vector
  2855. using UVec3 = TVec<U32, 3>;
  2856. /// 16bit unsigned integer 3D vector
  2857. using U16Vec3 = TVec<U16, 3>;
  2858. /// 8bit unsigned integer 3D vector
  2859. using U8Vec3 = TVec<U8, 3>;
  2860. /// F32 4D vector
  2861. using Vec4 = TVec<F32, 4>;
  2862. static_assert(sizeof(Vec4) == sizeof(F32) * 4, "Incorrect size");
  2863. /// Half float 4D vector
  2864. using HVec4 = TVec<F16, 4>;
  2865. /// 32bit signed integer 4D vector
  2866. using IVec4 = TVec<I32, 4>;
  2867. /// 16bit signed integer 4D vector
  2868. using I16Vec4 = TVec<I16, 4>;
  2869. /// 8bit signed integer 4D vector
  2870. using I8Vec4 = TVec<I8, 4>;
  2871. /// 32bit unsigned integer 4D vector
  2872. using UVec4 = TVec<U32, 4>;
  2873. /// 16bit unsigned integer 4D vector
  2874. using U16Vec4 = TVec<U16, 4>;
  2875. /// 8bit unsigned integer 4D vector
  2876. using U8Vec4 = TVec<U8, 4>;
  2877. /// @}
  2878. } // end namespace anki