Files
fennec/include/fennec/math/vector_storage.h

614 lines
21 KiB
C++

// =====================================================================================================================
// fennec, a free and open source game engine
// Copyright © 2025 Medusa Slockbower
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// =====================================================================================================================
#ifndef FENNEC_MATH_VECTOR_STORAGE_H
#define FENNEC_MATH_VECTOR_STORAGE_H
#if FENNEC_COMPILER_GCC
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
#endif
#if FENNEC_COMPILER_MSVC
#pragma warning(push)
#pragma warning(disable:4201)
#endif
namespace fennec::detail
{
//
// \brief backing storage type for vectors
// \tparam SizeV size of the vector
// \tparam SwizzleGenT generator for swizzles
// \tparam DataT backing data type
template<size_t SizeV, template<size_t...> class SwizzleGenT, typename DataT> struct vector_storage;
// specialization for single component vectors
template <template <size_t...> class SwizzleGenT, typename DataT>
struct vector_storage<1, SwizzleGenT, DataT>
{
template<size_t...IndicesV> using swizzle = typename SwizzleGenT<IndicesV...>::type;
vector_storage() = default;
union {
DataT data;
struct { swizzle<0> x; };
struct { swizzle<0> s; };
struct { swizzle<0> t; };
swizzle<0, 0> xx, rr, ss;
swizzle<0, 0, 0> xxx, rrr, sss;
swizzle<0, 0, 0, 0> xxxx, rrrr, ssss;
};
};
// specialization for two component vectors
template <template <size_t...> class SwizzleGenT, typename DataT>
struct vector_storage<2, SwizzleGenT, DataT>
{
//
// alias to allow for increased legibility
template<size_t...IndicesV> using swizzle = typename SwizzleGenT<IndicesV...>::type;
vector_storage() = default;
union {
DataT data;
struct { swizzle<0> x; swizzle<1> y; };
struct { swizzle<0> s; swizzle<1> t; };
struct { swizzle<0> r; swizzle<1> g; };
swizzle<0,0> xx, rr, ss;
swizzle<0,1> xy, rg, st;
swizzle<1,0> yx, gr, ts;
swizzle<1,1> yy, gg, tt;
swizzle<0,0,0> xxx, rrr, sss;
swizzle<0,0,1> xxy, rrg, sst;
swizzle<0,1,0> xyx, rgr, sts;
swizzle<0,1,1> xyy, rgg, stt;
swizzle<1,0,0> yxx, grr, tss;
swizzle<1,0,1> yxy, grg, tst;
swizzle<1,1,0> yyx, ggr, tts;
swizzle<1,1,1> yyy, ggg, ttt;
swizzle<0,0,0,0> xxxx, rrrr, ssss;
swizzle<0,0,0,1> xxxy, rrrg, ssst;
swizzle<0,0,1,0> xxyx, rrgr, ssts;
swizzle<0,0,1,1> xxyy, rrgg, sstt;
swizzle<0,1,0,0> xyxx, rgrr, stss;
swizzle<0,1,0,1> xyxy, rgrg, stst;
swizzle<0,1,1,0> xyyx, rggr, stts;
swizzle<0,1,1,1> xyyy, rggg, sttt;
swizzle<1,0,0,0> yxxx, grrr, tsss;
swizzle<1,0,0,1> yxxy, grrg, tsst;
swizzle<1,0,1,0> yxyx, grgr, tsts;
swizzle<1,0,1,1> yxyy, grgg, tstt;
swizzle<1,1,0,0> yyxx, ggrr, ttss;
swizzle<1,1,0,1> yyxy, ggrg, ttst;
swizzle<1,1,1,0> yyyx, gggr, ttts;
swizzle<1,1,1,1> yyyy, gggg, tttt;
};
};
// specialization for three component vectors
template <template <size_t...> class SwizzleGenT, typename DataT>
struct vector_storage<3, SwizzleGenT, DataT>
{
template<size_t...IndicesV> using swizzle = typename SwizzleGenT<IndicesV...>::type;
vector_storage() = default;
union {
DataT data;
struct { swizzle<0> x; swizzle<1> y; swizzle<2> z; };
struct { swizzle<0> s; swizzle<1> t; swizzle<2> p; };
struct { swizzle<0> r; swizzle<1> g; swizzle<2> b; };
swizzle<0,0> xx, rr, ss;
swizzle<0,1> xy, rg, st;
swizzle<0,2> xz, rb, sp;
swizzle<1,0> yx, gr, ts;
swizzle<1,1> yy, gg, tt;
swizzle<1,2> yz, gb, tp;
swizzle<2,0> zx, br, ps;
swizzle<2,1> zy, bg, pt;
swizzle<2,2> zz, bb, pp;
swizzle<0,0,0> xxx, rrr, sss;
swizzle<0,0,1> xxy, rrg, sst;
swizzle<0,0,2> xxz, rrb, ssp;
swizzle<0,1,0> xyx, rgr, sts;
swizzle<0,1,1> xyy, rgg, stt;
swizzle<0,1,2> xyz, rgb, stp;
swizzle<0,2,0> xzx, rbr, sps;
swizzle<0,2,1> xzy, rbg, spt;
swizzle<0,2,2> xzz, rbb, spp;
swizzle<1,0,0> yxx, grr, tss;
swizzle<1,0,1> yxy, grg, tst;
swizzle<1,0,2> yxz, grb, tsp;
swizzle<1,1,0> yyx, ggr, tts;
swizzle<1,1,1> yyy, ggg, ttt;
swizzle<1,1,2> yyz, ggb, ttp;
swizzle<1,2,0> yzx, gbr, tps;
swizzle<1,2,1> yzy, gbg, tpt;
swizzle<1,2,2> yzz, gbb, tpp;
swizzle<2,0,0> zxx, brr, pss;
swizzle<2,0,1> zxy, brg, pst;
swizzle<2,0,2> zxz, brb, psp;
swizzle<2,1,0> zyx, bgr, pts;
swizzle<2,1,1> zyy, bgg, ptt;
swizzle<2,1,2> zyz, bgb, ptp;
swizzle<2,2,0> zzx, bbr, pps;
swizzle<2,2,1> zzy, bbg, ppt;
swizzle<2,2,2> zzz, bbb, ppp;
swizzle<0,0,0,0> xxxx, rrrr, ssss;
swizzle<0,0,0,1> xxxy, rrrg, ssst;
swizzle<0,0,0,2> xxxz, rrrb, sssp;
swizzle<0,0,1,0> xxyx, rrgr, ssts;
swizzle<0,0,1,1> xxyy, rrgg, sstt;
swizzle<0,0,1,2> xxyz, rrgb, sstp;
swizzle<0,0,2,0> xxzx, rrbr, ssps;
swizzle<0,0,2,1> xxzy, rrbg, sspt;
swizzle<0,0,2,2> xxzz, rrbb, sspp;
swizzle<0,1,0,0> xyxx, rgrr, stss;
swizzle<0,1,0,1> xyxy, rgrg, stst;
swizzle<0,1,0,2> xyxz, rgrb, stsp;
swizzle<0,1,1,0> xyyx, rggr, stts;
swizzle<0,1,1,1> xyyy, rggg, sttt;
swizzle<0,1,1,2> xyyz, rggb, sttp;
swizzle<0,1,2,0> xyzx, rgbr, stps;
swizzle<0,1,2,1> xyzy, rgbg, stpt;
swizzle<0,1,2,2> xyzz, rgbb, stpp;
swizzle<0,2,0,0> xzxx, rbrr, spss;
swizzle<0,2,0,1> xzxy, rbrg, spst;
swizzle<0,2,0,2> xzxz, rbrb, spsp;
swizzle<0,2,1,0> xzyx, rbgr, spts;
swizzle<0,2,1,1> xzyy, rbgg, sptt;
swizzle<0,2,1,2> xzyz, rbgb, sptp;
swizzle<0,2,2,0> xzzx, rbbr, spps;
swizzle<0,2,2,1> xzzy, rbbg, sppt;
swizzle<0,2,2,2> xzzz, rbbb, sppp;
swizzle<1,0,0,0> yxxx, grrr, tsss;
swizzle<1,0,0,1> yxxy, grrg, tsst;
swizzle<1,0,0,2> yxxz, grrb, tssp;
swizzle<1,0,1,0> yxyx, grgr, tsts;
swizzle<1,0,1,1> yxyy, grgg, tstt;
swizzle<1,0,1,2> yxyz, grgb, tstp;
swizzle<1,0,2,0> yxzx, grbr, tsps;
swizzle<1,0,2,1> yxzy, grbg, tspt;
swizzle<1,0,2,2> yxzz, grbb, tspp;
swizzle<1,1,0,0> yyxx, ggrr, ttss;
swizzle<1,1,0,1> yyxy, ggrg, ttst;
swizzle<1,1,0,2> yyxz, ggrb, ttsp;
swizzle<1,1,1,0> yyyx, gggr, ttts;
swizzle<1,1,1,1> yyyy, gggg, tttt;
swizzle<1,1,1,2> yyyz, gggb, tttp;
swizzle<1,1,2,0> yyzx, ggbr, ttps;
swizzle<1,1,2,1> yyzy, ggbg, ttpt;
swizzle<1,1,2,2> yyzz, ggbb, ttpp;
swizzle<1,2,0,0> yzxx, gbrr, tpss;
swizzle<1,2,0,1> yzxy, gbrg, tpst;
swizzle<1,2,0,2> yzxz, gbrb, tpsp;
swizzle<1,2,1,0> yzyx, gbgr, tpts;
swizzle<1,2,1,1> yzyy, gbgg, tptt;
swizzle<1,2,1,2> yzyz, gbgb, tptp;
swizzle<1,2,2,0> yzzx, gbbr, tpps;
swizzle<1,2,2,1> yzzy, gbbg, tppt;
swizzle<1,2,2,2> yzzz, gbbb, tppp;
swizzle<2,0,0,0> zxxx, brrr, psss;
swizzle<2,0,0,1> zxxy, brrg, psst;
swizzle<2,0,0,2> zxxz, brrb, pssp;
swizzle<2,0,1,0> zxyx, brgr, psts;
swizzle<2,0,1,1> zxyy, brgg, pstt;
swizzle<2,0,1,2> zxyz, brgb, pstp;
swizzle<2,0,2,0> zxzx, brbr, psps;
swizzle<2,0,2,1> zxzy, brbg, pspt;
swizzle<2,0,2,2> zxzz, brbb, pspp;
swizzle<2,1,0,0> zyxx, bgrr, ptss;
swizzle<2,1,0,1> zyxy, bgrg, ptst;
swizzle<2,1,0,2> zyxz, bgrb, ptsp;
swizzle<2,1,1,0> zyyx, bggr, ptts;
swizzle<2,1,1,1> zyyy, bggg, pttt;
swizzle<2,1,1,2> zyyz, bggb, pttp;
swizzle<2,1,2,0> zyzx, bgbr, ptps;
swizzle<2,1,2,1> zyzy, bgbg, ptpt;
swizzle<2,1,2,2> zyzz, bgbb, ptpp;
swizzle<2,2,0,0> zzxx, bbrr, ppss;
swizzle<2,2,0,1> zzxy, bbrg, ppst;
swizzle<2,2,0,2> zzxz, bbrb, ppsp;
swizzle<2,2,1,0> zzyx, bbgr, ppts;
swizzle<2,2,1,1> zzyy, bbgg, pptt;
swizzle<2,2,1,2> zzyz, bbgb, pptp;
swizzle<2,2,2,0> zzzx, bbbr, ppps;
swizzle<2,2,2,1> zzzy, bbbg, pppt;
swizzle<2,2,2,2> zzzz, bbbb, pppp;
};
};
// specialization for four component vectors
template <template <size_t...> class SwizzleGenT, typename DataT>
struct vector_storage<4, SwizzleGenT, DataT>
{
template<size_t...IndicesV> using swizzle = typename SwizzleGenT<IndicesV...>::type;
vector_storage() = default;
union {
DataT data;
struct { swizzle<0> x; swizzle<1> y; swizzle<2> z; swizzle<3> w; };
struct { swizzle<0> s; swizzle<1> t; swizzle<2> p; swizzle<3> q; };
struct { swizzle<0> r; swizzle<1> g; swizzle<2> b; swizzle<3> a; };
swizzle<0,0> xx, rr, ss;
swizzle<0,1> xy, rg, st;
swizzle<0,2> xz, rb, sp;
swizzle<0,3> xw, ra, sq;
swizzle<1,0> yx, gr, ts;
swizzle<1,1> yy, gg, tt;
swizzle<1,2> yz, gb, tp;
swizzle<1,3> yw, ga, tq;
swizzle<2,0> zx, br, ps;
swizzle<2,1> zy, bg, pt;
swizzle<2,2> zz, bb, pp;
swizzle<2,3> zw, ba, pq;
swizzle<3,0> wx, ar, qs;
swizzle<3,1> wy, ag, qt;
swizzle<3,2> wz, ab, qp;
swizzle<3,3> ww, aa, qq;
swizzle<0,0,0> xxx, rrr, sss;
swizzle<0,0,1> xxy, rrg, sst;
swizzle<0,0,2> xxz, rrb, ssp;
swizzle<0,0,3> xxw, rra, ssq;
swizzle<0,1,0> xyx, rgr, sts;
swizzle<0,1,1> xyy, rgg, stt;
swizzle<0,1,2> xyz, rgb, stp;
swizzle<0,1,3> xyw, rga, stq;
swizzle<0,2,0> xzx, rbr, sps;
swizzle<0,2,1> xzy, rbg, spt;
swizzle<0,2,2> xzz, rbb, spp;
swizzle<0,2,3> xzw, rba, spq;
swizzle<0,3,0> xwx, rar, sqs;
swizzle<0,3,1> xwy, rag, sqt;
swizzle<0,3,2> xwz, rab, sqp;
swizzle<0,3,3> xww, raa, sqq;
swizzle<1,0,0> yxx, grr, tss;
swizzle<1,0,1> yxy, grg, tst;
swizzle<1,0,2> yxz, grb, tsp;
swizzle<1,0,3> yxw, gra, tsq;
swizzle<1,1,0> yyx, ggr, tts;
swizzle<1,1,1> yyy, ggg, ttt;
swizzle<1,1,2> yyz, ggb, ttp;
swizzle<1,1,3> yyw, gga, ttq;
swizzle<1,2,0> yzx, gbr, tps;
swizzle<1,2,1> yzy, gbg, tpt;
swizzle<1,2,2> yzz, gbb, tpp;
swizzle<1,2,3> yzw, gba, tpq;
swizzle<1,3,0> ywx, gar, tqs;
swizzle<1,3,1> ywy, gag, tqt;
swizzle<1,3,2> ywz, gab, tqp;
swizzle<1,3,3> yww, gaa, tqq;
swizzle<2,0,0> zxx, brr, pss;
swizzle<2,0,1> zxy, brg, pst;
swizzle<2,0,2> zxz, brb, psp;
swizzle<2,0,3> zxw, bra, psq;
swizzle<2,1,0> zyx, bgr, pts;
swizzle<2,1,1> zyy, bgg, ptt;
swizzle<2,1,2> zyz, bgb, ptp;
swizzle<2,1,3> zyw, bga, ptq;
swizzle<2,2,0> zzx, bbr, pps;
swizzle<2,2,1> zzy, bbg, ppt;
swizzle<2,2,2> zzz, bbb, ppp;
swizzle<2,2,3> zzw, bba, ppq;
swizzle<2,3,0> zwx, bar, pqs;
swizzle<2,3,1> zwy, bag, pqt;
swizzle<2,3,2> zwz, bab, pqp;
swizzle<2,3,3> zww, baa, pqq;
swizzle<3,0,0> wxx, arr, qss;
swizzle<3,0,1> wxy, arg, qst;
swizzle<3,0,2> wxz, arb, qsp;
swizzle<3,0,3> wxw, ara, qsq;
swizzle<3,1,0> wyx, agr, qts;
swizzle<3,1,1> wyy, agg, qtt;
swizzle<3,1,2> wyz, agb, qtp;
swizzle<3,1,3> wyw, aga, qtq;
swizzle<3,2,0> wzx, abr, qps;
swizzle<3,2,1> wzy, abg, qpt;
swizzle<3,2,2> wzz, abb, qpp;
swizzle<3,2,3> wzw, aba, qpq;
swizzle<3,3,0> wwx, aar, qqs;
swizzle<3,3,1> wwy, aag, qqt;
swizzle<3,3,2> wwz, aab, qqp;
swizzle<3,3,3> www, aaa, qqq;
swizzle<0,0,0,0> xxxx, rrrr, ssss;
swizzle<0,0,0,1> xxxy, rrrg, ssst;
swizzle<0,0,0,2> xxxz, rrrb, sssp;
swizzle<0,0,0,3> xxxw, rrra, sssq;
swizzle<0,0,1,0> xxyx, rrgr, ssts;
swizzle<0,0,1,1> xxyy, rrgg, sstt;
swizzle<0,0,1,2> xxyz, rrgb, sstp;
swizzle<0,0,1,3> xxyw, rrga, sstq;
swizzle<0,0,2,0> xxzx, rrbr, ssps;
swizzle<0,0,2,1> xxzy, rrbg, sspt;
swizzle<0,0,2,2> xxzz, rrbb, sspp;
swizzle<0,0,2,3> xxzw, rrba, sspq;
swizzle<0,0,3,0> xxwx, rrar, ssqs;
swizzle<0,0,3,1> xxwy, rrag, ssqt;
swizzle<0,0,3,2> xxwz, rrab, ssqp;
swizzle<0,0,3,3> xxww, rraa, ssqq;
swizzle<0,1,0,0> xyxx, rgrr, stss;
swizzle<0,1,0,1> xyxy, rgrg, stst;
swizzle<0,1,0,2> xyxz, rgrb, stsp;
swizzle<0,1,0,3> xyxw, rgra, stsq;
swizzle<0,1,1,0> xyyx, rggr, stts;
swizzle<0,1,1,1> xyyy, rggg, sttt;
swizzle<0,1,1,2> xyyz, rggb, sttp;
swizzle<0,1,1,3> xyyw, rgga, sttq;
swizzle<0,1,2,0> xyzx, rgbr, stps;
swizzle<0,1,2,1> xyzy, rgbg, stpt;
swizzle<0,1,2,2> xyzz, rgbb, stpp;
swizzle<0,1,2,3> xyzw, rgba, stpq;
swizzle<0,1,3,0> xywx, rgar, stqs;
swizzle<0,1,3,1> xywy, rgag, stqt;
swizzle<0,1,3,2> xywz, rgab, stqp;
swizzle<0,1,3,3> xyww, rgaa, stqq;
swizzle<0,2,0,0> xzxx, rbrr, spss;
swizzle<0,2,0,1> xzxy, rbrg, spst;
swizzle<0,2,0,2> xzxz, rbrb, spsp;
swizzle<0,2,0,3> xzxw, rbra, spsq;
swizzle<0,2,1,0> xzyx, rbgr, spts;
swizzle<0,2,1,1> xzyy, rbgg, sptt;
swizzle<0,2,1,2> xzyz, rbgb, sptp;
swizzle<0,2,1,3> xzyw, rbga, sptq;
swizzle<0,2,2,0> xzzx, rbbr, spps;
swizzle<0,2,2,1> xzzy, rbbg, sppt;
swizzle<0,2,2,2> xzzz, rbbb, sppp;
swizzle<0,2,2,3> xzzw, rbba, sppq;
swizzle<0,2,3,0> xzwx, rbar, spqs;
swizzle<0,2,3,1> xzwy, rbag, spqt;
swizzle<0,2,3,2> xzwz, rbab, spqp;
swizzle<0,2,3,3> xzww, rbaa, spqq;
swizzle<0,3,0,0> xwxx, rarr, sqss;
swizzle<0,3,0,1> xwxy, rarg, sqst;
swizzle<0,3,0,2> xwxz, rarb, sqsp;
swizzle<0,3,0,3> xwxw, rara, sqsq;
swizzle<0,3,1,0> xwyx, ragr, sqts;
swizzle<0,3,1,1> xwyy, ragg, sqtt;
swizzle<0,3,1,2> xwyz, ragb, sqtp;
swizzle<0,3,1,3> xwyw, raga, sqtq;
swizzle<0,3,2,0> xwzx, rabr, sqps;
swizzle<0,3,2,1> xwzy, rabg, sqpt;
swizzle<0,3,2,2> xwzz, rabb, sqpp;
swizzle<0,3,2,3> xwzw, raba, sqpq;
swizzle<0,3,3,0> xwwx, raar, sqqs;
swizzle<0,3,3,1> xwwy, raag, sqqt;
swizzle<0,3,3,2> xwwz, raab, sqqp;
swizzle<0,3,3,3> xwww, raaa, sqqq;
swizzle<1,0,0,0> yxxx, grrr, tsss;
swizzle<1,0,0,1> yxxy, grrg, tsst;
swizzle<1,0,0,2> yxxz, grrb, tssp;
swizzle<1,0,0,3> yxxw, grra, tssq;
swizzle<1,0,1,0> yxyx, grgr, tsts;
swizzle<1,0,1,1> yxyy, grgg, tstt;
swizzle<1,0,1,2> yxyz, grgb, tstp;
swizzle<1,0,1,3> yxyw, grga, tstq;
swizzle<1,0,2,0> yxzx, grbr, tsps;
swizzle<1,0,2,1> yxzy, grbg, tspt;
swizzle<1,0,2,2> yxzz, grbb, tspp;
swizzle<1,0,2,3> yxzw, grba, tspq;
swizzle<1,0,3,0> yxwx, grar, tsqs;
swizzle<1,0,3,1> yxwy, grag, tsqt;
swizzle<1,0,3,2> yxwz, grab, tsqp;
swizzle<1,0,3,3> yxww, graa, tsqq;
swizzle<1,1,0,0> yyxx, ggrr, ttss;
swizzle<1,1,0,1> yyxy, ggrg, ttst;
swizzle<1,1,0,2> yyxz, ggrb, ttsp;
swizzle<1,1,0,3> yyxw, ggra, ttsq;
swizzle<1,1,1,0> yyyx, gggr, ttts;
swizzle<1,1,1,1> yyyy, gggg, tttt;
swizzle<1,1,1,2> yyyz, gggb, tttp;
swizzle<1,1,1,3> yyyw, ggga, tttq;
swizzle<1,1,2,0> yyzx, ggbr, ttps;
swizzle<1,1,2,1> yyzy, ggbg, ttpt;
swizzle<1,1,2,2> yyzz, ggbb, ttpp;
swizzle<1,1,2,3> yyzw, ggba, ttpq;
swizzle<1,1,3,0> yywx, ggar, ttqs;
swizzle<1,1,3,1> yywy, ggag, ttqt;
swizzle<1,1,3,2> yywz, ggab, ttqp;
swizzle<1,1,3,3> yyww, ggaa, ttqq;
swizzle<1,2,0,0> yzxx, gbrr, tpss;
swizzle<1,2,0,1> yzxy, gbrg, tpst;
swizzle<1,2,0,2> yzxz, gbrb, tpsp;
swizzle<1,2,0,3> yzxw, gbra, tpsq;
swizzle<1,2,1,0> yzyx, gbgr, tpts;
swizzle<1,2,1,1> yzyy, gbgg, tptt;
swizzle<1,2,1,2> yzyz, gbgb, tptp;
swizzle<1,2,1,3> yzyw, gbga, tptq;
swizzle<1,2,2,0> yzzx, gbbr, tpps;
swizzle<1,2,2,1> yzzy, gbbg, tppt;
swizzle<1,2,2,2> yzzz, gbbb, tppp;
swizzle<1,2,2,3> yzzw, gbba, tppq;
swizzle<1,2,3,0> yzwx, gbar, tpqs;
swizzle<1,2,3,1> yzwy, gbag, tpqt;
swizzle<1,2,3,2> yzwz, gbab, tpqp;
swizzle<1,2,3,3> yzww, gbaa, tpqq;
swizzle<1,3,0,0> ywxx, garr, tqss;
swizzle<1,3,0,1> ywxy, garg, tqst;
swizzle<1,3,0,2> ywxz, garb, tqsp;
swizzle<1,3,0,3> ywxw, gara, tqsq;
swizzle<1,3,1,0> ywyx, gagr, tqts;
swizzle<1,3,1,1> ywyy, gagg, tqtt;
swizzle<1,3,1,2> ywyz, gagb, tqtp;
swizzle<1,3,1,3> ywyw, gaga, tqtq;
swizzle<1,3,2,0> ywzx, gabr, tqps;
swizzle<1,3,2,1> ywzy, gabg, tqpt;
swizzle<1,3,2,2> ywzz, gabb, tqpp;
swizzle<1,3,2,3> ywzw, gaba, tqpq;
swizzle<1,3,3,0> ywwx, gaar, tqqs;
swizzle<1,3,3,1> ywwy, gaag, tqqt;
swizzle<1,3,3,2> ywwz, gaab, tqqp;
swizzle<1,3,3,3> ywww, gaaa, tqqq;
swizzle<2,0,0,0> zxxx, brrr, psss;
swizzle<2,0,0,1> zxxy, brrg, psst;
swizzle<2,0,0,2> zxxz, brrb, pssp;
swizzle<2,0,0,3> zxxw, brra, pssq;
swizzle<2,0,1,0> zxyx, brgr, psts;
swizzle<2,0,1,1> zxyy, brgg, pstt;
swizzle<2,0,1,2> zxyz, brgb, pstp;
swizzle<2,0,1,3> zxyw, brga, pstq;
swizzle<2,0,2,0> zxzx, brbr, psps;
swizzle<2,0,2,1> zxzy, brbg, pspt;
swizzle<2,0,2,2> zxzz, brbb, pspp;
swizzle<2,0,2,3> zxzw, brba, pspq;
swizzle<2,0,3,0> zxwx, brar, psqs;
swizzle<2,0,3,1> zxwy, brag, psqt;
swizzle<2,0,3,2> zxwz, brab, psqp;
swizzle<2,0,3,3> zxww, braa, psqq;
swizzle<2,1,0,0> zyxx, bgrr, ptss;
swizzle<2,1,0,1> zyxy, bgrg, ptst;
swizzle<2,1,0,2> zyxz, bgrb, ptsp;
swizzle<2,1,0,3> zyxw, bgra, ptsq;
swizzle<2,1,1,0> zyyx, bggr, ptts;
swizzle<2,1,1,1> zyyy, bggg, pttt;
swizzle<2,1,1,2> zyyz, bggb, pttp;
swizzle<2,1,1,3> zyyw, bgga, pttq;
swizzle<2,1,2,0> zyzx, bgbr, ptps;
swizzle<2,1,2,1> zyzy, bgbg, ptpt;
swizzle<2,1,2,2> zyzz, bgbb, ptpp;
swizzle<2,1,2,3> zyzw, bgba, ptpq;
swizzle<2,1,3,0> zywx, bgar, ptqs;
swizzle<2,1,3,1> zywy, bgag, ptqt;
swizzle<2,1,3,2> zywz, bgab, ptqp;
swizzle<2,1,3,3> zyww, bgaa, ptqq;
swizzle<2,2,0,0> zzxx, bbrr, ppss;
swizzle<2,2,0,1> zzxy, bbrg, ppst;
swizzle<2,2,0,2> zzxz, bbrb, ppsp;
swizzle<2,2,0,3> zzxw, bbra, ppsq;
swizzle<2,2,1,0> zzyx, bbgr, ppts;
swizzle<2,2,1,1> zzyy, bbgg, pptt;
swizzle<2,2,1,2> zzyz, bbgb, pptp;
swizzle<2,2,1,3> zzyw, bbga, pptq;
swizzle<2,2,2,0> zzzx, bbbr, ppps;
swizzle<2,2,2,1> zzzy, bbbg, pppt;
swizzle<2,2,2,2> zzzz, bbbb, pppp;
swizzle<2,2,2,3> zzzw, bbba, pppq;
swizzle<2,2,3,0> zzwx, bbar, ppqs;
swizzle<2,2,3,1> zzwy, bbag, ppqt;
swizzle<2,2,3,2> zzwz, bbab, ppqp;
swizzle<2,2,3,3> zzww, bbaa, ppqq;
swizzle<2,3,0,0> zwxx, barr, pqss;
swizzle<2,3,0,1> zwxy, barg, pqst;
swizzle<2,3,0,2> zwxz, barb, pqsp;
swizzle<2,3,0,3> zwxw, bara, pqsq;
swizzle<2,3,1,0> zwyx, bagr, pqts;
swizzle<2,3,1,1> zwyy, bagg, pqtt;
swizzle<2,3,1,2> zwyz, bagb, pqtp;
swizzle<2,3,1,3> zwyw, baga, pqtq;
swizzle<2,3,2,0> zwzx, babr, pqps;
swizzle<2,3,2,1> zwzy, babg, pqpt;
swizzle<2,3,2,2> zwzz, babb, pqpp;
swizzle<2,3,2,3> zwzw, baba, pqpq;
swizzle<2,3,3,0> zwwx, baar, pqqs;
swizzle<2,3,3,1> zwwy, baag, pqqt;
swizzle<2,3,3,2> zwwz, baab, pqqp;
swizzle<2,3,3,3> zwww, baaa, pqqq;
swizzle<3,0,0,0> wxxx, arrr, qsss;
swizzle<3,0,0,1> wxxy, arrg, qsst;
swizzle<3,0,0,2> wxxz, arrb, qssp;
swizzle<3,0,0,3> wxxw, arra, qssq;
swizzle<3,0,1,0> wxyx, argr, qsts;
swizzle<3,0,1,1> wxyy, argg, qstt;
swizzle<3,0,1,2> wxyz, argb, qstp;
swizzle<3,0,1,3> wxyw, arga, qstq;
swizzle<3,0,2,0> wxzx, arbr, qsps;
swizzle<3,0,2,1> wxzy, arbg, qspt;
swizzle<3,0,2,2> wxzz, arbb, qspp;
swizzle<3,0,2,3> wxzw, arba, qspq;
swizzle<3,0,3,0> wxwx, arar, qsqs;
swizzle<3,0,3,1> wxwy, arag, qsqt;
swizzle<3,0,3,2> wxwz, arab, qsqp;
swizzle<3,0,3,3> wxww, araa, qsqq;
swizzle<3,1,0,0> wyxx, agrr, qtss;
swizzle<3,1,0,1> wyxy, agrg, qtst;
swizzle<3,1,0,2> wyxz, agrb, qtsp;
swizzle<3,1,0,3> wyxw, agra, qtsq;
swizzle<3,1,1,0> wyyx, aggr, qtts;
swizzle<3,1,1,1> wyyy, aggg, qttt;
swizzle<3,1,1,2> wyyz, aggb, qttp;
swizzle<3,1,1,3> wyyw, agga, qttq;
swizzle<3,1,2,0> wyzx, agbr, qtps;
swizzle<3,1,2,1> wyzy, agbg, qtpt;
swizzle<3,1,2,2> wyzz, agbb, qtpp;
swizzle<3,1,2,3> wyzw, agba, qtpq;
swizzle<3,1,3,0> wywx, agar, qtqs;
swizzle<3,1,3,1> wywy, agag, qtqt;
swizzle<3,1,3,2> wywz, agab, qtqp;
swizzle<3,1,3,3> wyww, agaa, qtqq;
swizzle<3,2,0,0> wzxx, abrr, qpss;
swizzle<3,2,0,1> wzxy, abrg, qpst;
swizzle<3,2,0,2> wzxz, abrb, qpsp;
swizzle<3,2,0,3> wzxw, abra, qpsq;
swizzle<3,2,1,0> wzyx, abgr, qpts;
swizzle<3,2,1,1> wzyy, abgg, qptt;
swizzle<3,2,1,2> wzyz, abgb, qptp;
swizzle<3,2,1,3> wzyw, abga, qptq;
swizzle<3,2,2,0> wzzx, abbr, qpps;
swizzle<3,2,2,1> wzzy, abbg, qppt;
swizzle<3,2,2,2> wzzz, abbb, qppp;
swizzle<3,2,2,3> wzzw, abba, qppq;
swizzle<3,2,3,0> wzwx, abar, qpqs;
swizzle<3,2,3,1> wzwy, abag, qpqt;
swizzle<3,2,3,2> wzwz, abab, qpqp;
swizzle<3,2,3,3> wzww, abaa, qpqq;
swizzle<3,3,0,0> wwxx, aarr, qqss;
swizzle<3,3,0,1> wwxy, aarg, qqst;
swizzle<3,3,0,2> wwxz, aarb, qqsp;
swizzle<3,3,0,3> wwxw, aara, qqsq;
swizzle<3,3,1,0> wwyx, aagr, qqts;
swizzle<3,3,1,1> wwyy, aagg, qqtt;
swizzle<3,3,1,2> wwyz, aagb, qqtp;
swizzle<3,3,1,3> wwyw, aaga, qqtq;
swizzle<3,3,2,0> wwzx, aabr, qqps;
swizzle<3,3,2,1> wwzy, aabg, qqpt;
swizzle<3,3,2,2> wwzz, aabb, qqpp;
swizzle<3,3,2,3> wwzw, aaba, qqpq;
swizzle<3,3,3,0> wwwx, aaar, qqqs;
swizzle<3,3,3,1> wwwy, aaag, qqqt;
swizzle<3,3,3,2> wwwz, aaab, qqqp;
swizzle<3,3,3,3> wwww, aaaa, qqqq;
};
};
}
#ifdef FENNEC_COMPILER_GCC
#pragma GCC diagnostic pop
#endif
#endif // FENNEC_MATH_VECTOR_STORAGE_H