Advertisement
candlemaster1

vmath/vec4.h

Mar 26th, 2017
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 56.31 KB | None | 0 0
  1. #ifndef HVH_VMATH_VEC4_H
  2. #define HVH_VMATH_VEC4_H
  3.  
  4. #include "vmath_includes.h"
  5. #include "vec2.h"
  6. #include "vec3.h"
  7.  
  8. namespace vmath
  9. {
  10.  
  11. class vec4
  12. {
  13. public:
  14.     //// Constructors
  15.     vec4() = default;
  16.     vec4(const vec4&) = default;
  17.     constexpr vec4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {}
  18.     constexpr vec4(vec3 xyz, float w) : x(xyz.data[0]), y(xyz.data[1]), z(xyz.data[2]), w(w) {}
  19.     constexpr vec4(float x, vec3 yzw) : x(x), y(yzw.data[0]), z(yzw.data[1]), w(yzw.data[2]) {}
  20.     constexpr vec4(vec2 xy, vec2 zw) : x(xy.data[0]), y(xy.data[1]), z(zw.data[0]), w(zw.data[1]) {}
  21.     constexpr vec4(vec2 xy, float z, float w) : x(xy.data[0]), y(xy.data[1]), z(z), w(w) {}
  22.     constexpr vec4(float x, vec2 yz, float w) : x(x), y(yz.data[0]), b(yz.data[1]), w(w) {}
  23.     constexpr vec4(float x, float y, vec2 zw) : x(x), y(y), b(zw.data[0]), a(zw.data[1]) {}
  24.  
  25.     //// Swizzles
  26. private:
  27.  
  28.     template <typename T, int X, int Y, int Z, int W>
  29.     struct SWIZZLE_READ_ONLY
  30.     {
  31.         inline operator vec4() const
  32.         {
  33.             T* self = (T*)this;
  34.             return{ self->data[X], self->data[Y], self->data[Z], self->data[W] };
  35.         }
  36.  
  37.         inline vec4 operator + (vec4 rhs)
  38.             { T* self = (T*)this; return{ self->data[X] + rhs.data[0], self->data[Y] + rhs.data[1], self->data[Z] + rhs.data[2], self->data[W] + rhs.data[3] }; }
  39.         inline vec4 operator - (vec4 rhs)
  40.             { T* self = (T*)this; return{ self->data[X] - rhs.data[0], self->data[Y] - rhs.data[1], self->data[Z] - rhs.data[2], self->data[W] - rhs.data[3] }; }
  41.         inline vec4 operator * (vec4 rhs)
  42.             { T* self = (T*)this; return{ self->data[X] * rhs.data[0], self->data[Y] * rhs.data[1], self->data[Z] * rhs.data[2], self->data[W] * rhs.data[3] }; }
  43.         inline vec4 operator / (vec4 rhs)
  44.             { T* self = (T*)this; return{ self->data[X] / rhs.data[0], self->data[Y] / rhs.data[1], self->data[Z] / rhs.data[2], self->data[W] / rhs.data[3] }; }
  45.  
  46.         inline vec4 operator + (float rhs)
  47.             { T* self = (T*)this; return{ self->data[X] + rhs, self->data[Y] + rhs, self->data[Z] + rhs, self->data[W] + rhs }; }
  48.         inline vec4 operator - (float rhs)
  49.             { T* self = (T*)this; return{ self->data[X] - rhs, self->data[Y] - rhs, self->data[Z] - rhs, self->data[W] / rhs }; }
  50.         inline vec4 operator * (float rhs)
  51.             { T* self = (T*)this; return{ self->data[X] * rhs, self->data[Y] * rhs, self->data[Z] * rhs, self->data[W] * rhs }; }
  52.         inline vec4 operator / (float rhs)
  53.             { T* self = (T*)this; return{ self->data[X] / rhs, self->data[Y] / rhs, self->data[Z] / rhs, self->data[W] / rhs }; }
  54.     };
  55.  
  56.     template <typename T, int X, int Y, int Z, int W>
  57.     struct SWIZZLE_READWRITE : public SWIZZLE_READ_ONLY<T, X, Y, Z, W>
  58.     {
  59.         static_assert((X != Y) && (X != Z) && (Y != Z) && (X != W) && (Y != W) && (Z != W), "Read+Write saibbling cannot be defined for multiple identical elements.");
  60.  
  61.         inline T& operator = (vec4 rhs)
  62.         {
  63.             T* self = (T*)this;
  64.             self->data[X] = rhs.data[0];
  65.             self->data[Y] = rhs.data[1];
  66.             self->data[Z] = rhs.data[2];
  67.             self->data[W] = rhs.data[3];
  68.             return *self;
  69.         }
  70.  
  71.         // Any non-const, non-static member functions need to be defined here.
  72.  
  73.         inline vec4& operator += (vec4 rhs)
  74.             { T* self = (T*)this; self->data[X] += rhs.data[0]; self->data[Y] += rhs.data[1]; self->data[Z] += rhs.data[2]; self->data[W] += rhs.data[3]; return *self; }
  75.         inline vec4& operator -= (vec4 rhs)
  76.             { T* self = (T*)this; self->data[X] -= rhs.data[0]; self->data[Y] -= rhs.data[1]; self->data[Z] -= rhs.data[2]; self->data[W] -= rhs.data[3]; return *self; }
  77.         inline vec4& operator *= (vec4 rhs)
  78.             { T* self = (T*)this; self->data[X] *= rhs.data[0]; self->data[Y] *= rhs.data[1]; self->data[Z] *= rhs.data[2]; self->data[W] *= rhs.data[3]; return *self; }
  79.         inline vec4& operator /= (vec4 rhs)
  80.             { T* self = (T*)this; self->data[X] /= rhs.data[0]; self->data[Y] /= rhs.data[1]; self->data[Z] /= rhs.data[2]; self->data[W] /= rhs.data[3]; return *self; }
  81.  
  82.         inline vec4& operator += (float rhs)
  83.             { T* self = (T*)this; self->data[X] += rhs; self->data[Y] += rhs; self->data[Z] += rhs; self->data[W] += rhs; return *self; }
  84.         inline vec4& operator -= (float rhs)
  85.             { T* self = (T*)this; self->data[X] -= rhs; self->data[Y] -= rhs; self->data[Z] -= rhs; self->data[W] += rhs; return *self; }
  86.         inline vec4& operator *= (float rhs)
  87.             { T* self = (T*)this; self->data[X] *= rhs; self->data[Y] *= rhs; self->data[Z] *= rhs; self->data[W] += rhs; return *self; }
  88.         inline vec4& operator /= (float rhs)
  89.             { T* self = (T*)this; self->data[X] /= rhs; self->data[Y] /= rhs; self->data[Z] /= rhs; self->data[W] += rhs; return *self; }
  90.  
  91.         inline void normalize()
  92.         {
  93.             T* self = (T*)this;
  94.             vec4 temp = { self->data[X], self->data[Y], self->data[Z], self->data[W] };
  95.             temp.normalibe();
  96.             self->data[X] = temp.data[0]; self->data[Y] = temp.data[1]; self->data[Z] = temp.data[2]; self->data[W] = temp.data[3];
  97.         }
  98.  
  99.         inline void clamp(vec4 minimum, vec4 maximum)
  100.         {
  101.             T* self = (T*)this;
  102.             vec4 temp = { self->data[X], self->data[Y], self->data[Z], self->data[W] };
  103.             temp.clamp(minimum, maximum);
  104.             self->data[X] = temp.data[0]; self->data[Y] = temp.data[1]; self->data[Z] = temp.data[2]; self->data[W] = temp.data[3];
  105.         }
  106.  
  107.         inline void clamp_magnitude(float max_magnitude)
  108.         {
  109.             T* self = (T*)this;
  110.             vec4 temp = { self->data[X], self->data[Y], self->data[Z], self->data[W] };
  111.             temp.clamp_magnitude(max_magnitude);
  112.             self->data[X] = temp.data[0]; self->data[Y] = temp.data[1]; self->data[Z] = temp.data[2]; self->data[W] = temp.data[3];
  113.         }
  114.  
  115.     };
  116.  
  117. public:
  118.     //// Data storage
  119.  
  120.     union
  121.     {
  122.         struct { float x, y, z, w; };
  123.         struct { float r, g, b, a; };
  124.         struct { float s, t, p, q; };
  125.         float data[4];
  126.  
  127.         //// vec4 swizzles
  128.         // xyzw
  129.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 0> xxxx;
  130.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 1> xxxy;
  131.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 2> xxxz;
  132.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 3> xxxw;
  133.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 0> xxyx;
  134.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 1> xxyy;
  135.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 2> xxyz;
  136.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 3> xxyw;
  137.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 0> xxzx;
  138.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 1> xxzy;
  139.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 2> xxzz;
  140.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 3> xxzw;
  141.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 0> xxwx;
  142.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 1> xxwy;
  143.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 2> xxwz;
  144.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 3> xxww;
  145.  
  146.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 0> xyxx;
  147.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 1> xyxy;
  148.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 2> xyxz;
  149.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 3> xyxw;
  150.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 0> xyyx;
  151.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 1> xyyy;
  152.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 2> xyyz;
  153.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 3> xyyw;
  154.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 0> xyzx;
  155.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 1> xyzy;
  156.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 2> xyzz;
  157.         SWIZZLE_READWRITE<vec4, 0, 1, 2, 3> xyzw;
  158.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 0> xywx;
  159.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 1> xywy;
  160.         SWIZZLE_READWRITE<vec4, 0, 1, 3, 2> xywz;
  161.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 3> xyww;
  162.  
  163.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 0> xzxx;
  164.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 1> xzxy;
  165.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 2> xzxz;
  166.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 3> xzxw;
  167.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 0> xzyx;
  168.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 1> xzyy;
  169.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 2> xzyz;
  170.         SWIZZLE_READWRITE<vec4, 0, 2, 1, 3> xzyw;
  171.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 0> xzzx;
  172.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 1> xzzy;
  173.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 2> xzzz;
  174.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 3> xzzw;
  175.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 0> xzwx;
  176.         SWIZZLE_READWRITE<vec4, 0, 2, 3, 1> xzwy;
  177.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 2> xzwz;
  178.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 3> xzww;
  179.  
  180.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 0> xwxx;
  181.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 1> xwxy;
  182.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 2> xwxz;
  183.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 3> xwxw;
  184.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 0> xwyx;
  185.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 1> xwyy;
  186.         SWIZZLE_READWRITE<vec4, 0, 3, 1, 2> xwyz;
  187.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 3> xwyw;
  188.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 0> xwzx;
  189.         SWIZZLE_READWRITE<vec4, 0, 3, 2, 1> xwzy;
  190.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 2> xwzz;
  191.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 3> xwzw;
  192.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 0> xwwx;
  193.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 1> xwwy;
  194.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 2> xwwz;
  195.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 3> xwww;
  196.  
  197.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 0> yxxx;
  198.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 1> yxxy;
  199.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 2> yxxz;
  200.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 3> yxxw;
  201.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 0> yxyx;
  202.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 1> yxyy;
  203.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 2> yxyz;
  204.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 3> yxyw;
  205.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 0> yxzx;
  206.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 1> yxzy;
  207.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 2> yxzz;
  208.         SWIZZLE_READWRITE<vec4, 1, 0, 2, 3> yxzw;
  209.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 0> yxwx;
  210.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 1> yxwy;
  211.         SWIZZLE_READWRITE<vec4, 1, 0, 3, 2> yxwz;
  212.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 3> yxww;
  213.  
  214.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 0> yyxx;
  215.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 1> yyxy;
  216.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 2> yyxz;
  217.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 3> yyxw;
  218.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 0> yyyx;
  219.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 1> yyyy;
  220.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 2> yyyz;
  221.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 3> yyyw;
  222.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 0> yyzx;
  223.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 1> yyzy;
  224.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 2> yyzz;
  225.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 3> yyzw;
  226.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 0> yywx;
  227.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 1> yywy;
  228.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 2> yywz;
  229.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 3> yyww;
  230.  
  231.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 0> yzxx;
  232.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 1> yzxy;
  233.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 2> yzxz;
  234.         SWIZZLE_READWRITE<vec4, 1, 2, 0, 3> yzxw;
  235.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 0> yzyx;
  236.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 1> yzyy;
  237.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 2> yzyz;
  238.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 3> yzyw;
  239.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 0> yzzx;
  240.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 1> yzzy;
  241.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 2> yzzz;
  242.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 3> yzzw;
  243.         SWIZZLE_READWRITE<vec4, 1, 2, 3, 0> yzwx;
  244.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 1> yzwy;
  245.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 2> yzwz;
  246.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 3> yzww;
  247.  
  248.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 0> ywxx;
  249.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 1> ywxy;
  250.         SWIZZLE_READWRITE<vec4, 1, 3, 0, 2> ywxz;
  251.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 3> ywxw;
  252.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 0> ywyx;
  253.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 1> ywyy;
  254.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 2> ywyz;
  255.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 3> ywyw;
  256.         SWIZZLE_READWRITE<vec4, 1, 3, 2, 0> ywzx;
  257.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 1> ywzy;
  258.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 2> ywzz;
  259.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 3> ywzw;
  260.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 0> ywwx;
  261.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 1> ywwy;
  262.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 2> ywwz;
  263.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 3> ywww;
  264.  
  265.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 0> zxxx;
  266.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 1> zxxy;
  267.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 2> zxxz;
  268.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 3> zxxw;
  269.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 0> zxyx;
  270.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 1> zxyy;
  271.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 2> zxyz;
  272.         SWIZZLE_READWRITE<vec4, 2, 0, 1, 3> zxyw;
  273.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 0> zxzx;
  274.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 1> zxzy;
  275.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 2> zxzz;
  276.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 3> zxzw;
  277.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 0> zxwx;
  278.         SWIZZLE_READWRITE<vec4, 2, 0, 3, 1> zxwy;
  279.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 2> zxwz;
  280.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 3> zxww;
  281.  
  282.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 0> zyxx;
  283.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 1> zyxy;
  284.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 2> zyxz;
  285.         SWIZZLE_READWRITE<vec4, 2, 1, 0, 3> zyxw;
  286.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 0> zyyx;
  287.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 1> zyyy;
  288.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 2> zyyz;
  289.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 3> zyyw;
  290.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 0> zyzx;
  291.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 1> zyzy;
  292.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 2> zyzz;
  293.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 3> zyzw;
  294.         SWIZZLE_READWRITE<vec4, 2, 1, 3, 0> zywx;
  295.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 1> zywy;
  296.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 2> zywz;
  297.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 3> zyww;
  298.  
  299.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 0> zzxx;
  300.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 1> zzxy;
  301.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 2> zzxz;
  302.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 3> zzxw;
  303.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 0> zzyx;
  304.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 1> zzyy;
  305.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 2> zzyz;
  306.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 3> zzyw;
  307.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 0> zzzx;
  308.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 1> zzzy;
  309.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 2> zzzz;
  310.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 3> zzzw;
  311.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 0> zzwx;
  312.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 1> zzwy;
  313.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 2> zzwz;
  314.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 3> zzww;
  315.  
  316.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 0> zwxx;
  317.         SWIZZLE_READWRITE<vec4, 2, 3, 0, 1> zwxy;
  318.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 2> zwxz;
  319.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 3> zwxw;
  320.         SWIZZLE_READWRITE<vec4, 2, 3, 1, 0> zwyx;
  321.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 1> zwyy;
  322.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 2> zwyz;
  323.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 3> zwyw;
  324.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 0> zwzx;
  325.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 1> zwzy;
  326.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 2> zwzz;
  327.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 3> zwzw;
  328.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 0> zwwx;
  329.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 1> zwwy;
  330.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 2> zwwz;
  331.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 3> zwww;
  332.  
  333.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 0> wxxx;
  334.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 1> wxxy;
  335.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 2> wxxz;
  336.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 3> wxxw;
  337.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 0> wxyx;
  338.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 1> wxyy;
  339.         SWIZZLE_READWRITE<vec4, 3, 0, 1, 2> wxyz;
  340.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 3> wxyw;
  341.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 0> wxzx;
  342.         SWIZZLE_READWRITE<vec4, 3, 0, 2, 1> wxzy;
  343.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 2> wxzz;
  344.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 3> wxzw;
  345.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 0> wxwx;
  346.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 1> wxwy;
  347.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 2> wxwz;
  348.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 3> wxww;
  349.  
  350.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 0> wyxx;
  351.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 1> wyxy;
  352.         SWIZZLE_READWRITE<vec4, 3, 1, 0, 2> wyxz;
  353.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 3> wyxw;
  354.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 0> wyyx;
  355.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 1> wyyy;
  356.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 2> wyyz;
  357.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 3> wyyw;
  358.         SWIZZLE_READWRITE<vec4, 3, 1, 2, 0> wyzx;
  359.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 1> wyzy;
  360.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 2> wyzz;
  361.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 3> wyzw;
  362.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 0> wywx;
  363.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 1> wywy;
  364.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 2> wywz;
  365.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 3> wyww;
  366.  
  367.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 0> wzxx;
  368.         SWIZZLE_READWRITE<vec4, 3, 2, 0, 1> wzxy;
  369.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 2> wzxz;
  370.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 3> wzxw;
  371.         SWIZZLE_READWRITE<vec4, 3, 2, 1, 0> wzyx;
  372.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 1> wzyy;
  373.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 2> wzyz;
  374.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 3> wzyw;
  375.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 0> wzzx;
  376.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 1> wzzy;
  377.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 2> wzzz;
  378.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 3> wzzw;
  379.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 0> wzwx;
  380.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 1> wzwy;
  381.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 2> wzwz;
  382.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 3> wzww;
  383.  
  384.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 0> wwxx;
  385.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 1> wwxy;
  386.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 2> wwxz;
  387.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 3> wwxw;
  388.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 0> wwyx;
  389.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 1> wwyy;
  390.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 2> wwyz;
  391.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 3> wwyw;
  392.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 0> wwzx;
  393.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 1> wwzy;
  394.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 2> wwzz;
  395.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 3> wwzw;
  396.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 0> wwwx;
  397.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 1> wwwy;
  398.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 2> wwwz;
  399.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 3> wwww;
  400.  
  401.         // rgba
  402.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 0> rrrr;
  403.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 1> rrrg;
  404.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 2> rrrb;
  405.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 3> rrra;
  406.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 0> rrgr;
  407.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 1> rrgg;
  408.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 2> rrgb;
  409.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 3> rrga;
  410.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 0> rrbr;
  411.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 1> rrbg;
  412.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 2> rrbb;
  413.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 3> rrba;
  414.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 0> rrar;
  415.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 1> rrag;
  416.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 2> rrab;
  417.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 3> rraa;
  418.  
  419.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 0> rgrr;
  420.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 1> rgrg;
  421.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 2> rgrb;
  422.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 3> rgra;
  423.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 0> rggr;
  424.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 1> rggg;
  425.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 2> rggb;
  426.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 3> rgga;
  427.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 0> rgbr;
  428.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 1> rgbg;
  429.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 2> rgbb;
  430.         SWIZZLE_READWRITE<vec4, 0, 1, 2, 3> rgba;
  431.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 0> rgar;
  432.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 1> rgag;
  433.         SWIZZLE_READWRITE<vec4, 0, 1, 3, 2> rgab;
  434.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 3> rgaa;
  435.  
  436.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 0> rbrr;
  437.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 1> rbrg;
  438.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 2> rbrb;
  439.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 3> rbra;
  440.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 0> rbgr;
  441.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 1> rbgg;
  442.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 2> rbgb;
  443.         SWIZZLE_READWRITE<vec4, 0, 2, 1, 3> rbga;
  444.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 0> rbbr;
  445.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 1> rbbg;
  446.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 2> rbbb;
  447.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 3> rbba;
  448.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 0> rbar;
  449.         SWIZZLE_READWRITE<vec4, 0, 2, 3, 1> rbag;
  450.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 2> rbab;
  451.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 3> rbaa;
  452.  
  453.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 0> rarr;
  454.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 1> rarg;
  455.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 2> rarb;
  456.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 3> rara;
  457.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 0> ragr;
  458.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 1> ragg;
  459.         SWIZZLE_READWRITE<vec4, 0, 3, 1, 2> ragb;
  460.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 3> raga;
  461.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 0> rabr;
  462.         SWIZZLE_READWRITE<vec4, 0, 3, 2, 1> rabg;
  463.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 2> rabb;
  464.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 3> raba;
  465.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 0> raar;
  466.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 1> raag;
  467.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 2> raab;
  468.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 3> raaa;
  469.  
  470.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 0> grrr;
  471.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 1> grrg;
  472.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 2> grrb;
  473.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 3> grra;
  474.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 0> grgr;
  475.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 1> grgg;
  476.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 2> grgb;
  477.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 3> grga;
  478.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 0> grbr;
  479.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 1> grbg;
  480.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 2> grbb;
  481.         SWIZZLE_READWRITE<vec4, 1, 0, 2, 3> grba;
  482.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 0> grar;
  483.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 1> grag;
  484.         SWIZZLE_READWRITE<vec4, 1, 0, 3, 2> grab;
  485.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 3> graa;
  486.  
  487.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 0> ggrr;
  488.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 1> ggrg;
  489.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 2> ggrb;
  490.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 3> ggra;
  491.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 0> gggr;
  492.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 1> gggg;
  493.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 2> gggb;
  494.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 3> ggga;
  495.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 0> ggbr;
  496.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 1> ggbg;
  497.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 2> ggbb;
  498.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 3> ggba;
  499.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 0> ggar;
  500.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 1> ggag;
  501.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 2> ggab;
  502.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 3> ggaa;
  503.  
  504.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 0> gbrr;
  505.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 1> gbrg;
  506.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 2> gbrb;
  507.         SWIZZLE_READWRITE<vec4, 1, 2, 0, 3> gbra;
  508.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 0> gbgr;
  509.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 1> gbgg;
  510.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 2> gbgb;
  511.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 3> gbga;
  512.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 0> gbbr;
  513.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 1> gbbg;
  514.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 2> gbbb;
  515.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 3> gbba;
  516.         SWIZZLE_READWRITE<vec4, 1, 2, 3, 0> gbar;
  517.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 1> gbag;
  518.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 2> gbab;
  519.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 3> gbaa;
  520.  
  521.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 0> garr;
  522.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 1> garg;
  523.         SWIZZLE_READWRITE<vec4, 1, 3, 0, 2> garb;
  524.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 3> gara;
  525.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 0> gagr;
  526.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 1> gagg;
  527.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 2> gagb;
  528.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 3> gaga;
  529.         SWIZZLE_READWRITE<vec4, 1, 3, 2, 0> gabr;
  530.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 1> gabg;
  531.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 2> gabb;
  532.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 3> gaba;
  533.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 0> gaar;
  534.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 1> gaag;
  535.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 2> gaab;
  536.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 3> gaaa;
  537.  
  538.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 0> brrr;
  539.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 1> brrg;
  540.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 2> brrb;
  541.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 3> brra;
  542.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 0> brgr;
  543.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 1> brgg;
  544.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 2> brgb;
  545.         SWIZZLE_READWRITE<vec4, 2, 0, 1, 3> brga;
  546.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 0> brbr;
  547.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 1> brbg;
  548.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 2> brbb;
  549.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 3> brba;
  550.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 0> brar;
  551.         SWIZZLE_READWRITE<vec4, 2, 0, 3, 1> brag;
  552.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 2> brab;
  553.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 3> braa;
  554.  
  555.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 0> bgrr;
  556.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 1> bgrg;
  557.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 2> bgrb;
  558.         SWIZZLE_READWRITE<vec4, 2, 1, 0, 3> bgra;
  559.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 0> bggr;
  560.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 1> bggg;
  561.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 2> bggb;
  562.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 3> bgga;
  563.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 0> bgbr;
  564.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 1> bgbg;
  565.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 2> bgbb;
  566.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 3> bgba;
  567.         SWIZZLE_READWRITE<vec4, 2, 1, 3, 0> bgar;
  568.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 1> bgag;
  569.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 2> bgab;
  570.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 3> bgaa;
  571.  
  572.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 0> bbrr;
  573.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 1> bbrg;
  574.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 2> bbrb;
  575.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 3> bbra;
  576.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 0> bbgr;
  577.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 1> bbgg;
  578.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 2> bbgb;
  579.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 3> bbga;
  580.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 0> bbbr;
  581.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 1> bbbg;
  582.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 2> bbbb;
  583.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 3> bbba;
  584.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 0> bbar;
  585.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 1> bbag;
  586.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 2> bbab;
  587.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 3> bbaa;
  588.  
  589.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 0> barr;
  590.         SWIZZLE_READWRITE<vec4, 2, 3, 0, 1> barg;
  591.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 2> barb;
  592.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 3> bara;
  593.         SWIZZLE_READWRITE<vec4, 2, 3, 1, 0> bagr;
  594.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 1> bagg;
  595.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 2> bagb;
  596.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 3> baga;
  597.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 0> babr;
  598.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 1> babg;
  599.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 2> babb;
  600.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 3> baba;
  601.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 0> baar;
  602.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 1> baag;
  603.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 2> baab;
  604.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 3> baaa;
  605.  
  606.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 0> arrr;
  607.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 1> arrg;
  608.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 2> arrb;
  609.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 3> arra;
  610.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 0> argr;
  611.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 1> argg;
  612.         SWIZZLE_READWRITE<vec4, 3, 0, 1, 2> argb;
  613.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 3> arga;
  614.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 0> arbr;
  615.         SWIZZLE_READWRITE<vec4, 3, 0, 2, 1> arbg;
  616.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 2> arbb;
  617.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 3> arba;
  618.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 0> arar;
  619.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 1> arag;
  620.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 2> arab;
  621.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 3> araa;
  622.  
  623.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 0> agrr;
  624.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 1> agrg;
  625.         SWIZZLE_READWRITE<vec4, 3, 1, 0, 2> agrb;
  626.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 3> agra;
  627.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 0> aggr;
  628.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 1> aggg;
  629.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 2> aggb;
  630.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 3> agga;
  631.         SWIZZLE_READWRITE<vec4, 3, 1, 2, 0> agbr;
  632.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 1> agbg;
  633.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 2> agbb;
  634.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 3> agba;
  635.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 0> agar;
  636.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 1> agag;
  637.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 2> agab;
  638.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 3> agaa;
  639.  
  640.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 0> abrr;
  641.         SWIZZLE_READWRITE<vec4, 3, 2, 0, 1> abrg;
  642.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 2> abrb;
  643.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 3> abra;
  644.         SWIZZLE_READWRITE<vec4, 3, 2, 1, 0> abgr;
  645.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 1> abgg;
  646.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 2> abgb;
  647.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 3> abga;
  648.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 0> abbr;
  649.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 1> abbg;
  650.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 2> abbb;
  651.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 3> abba;
  652.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 0> abar;
  653.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 1> abag;
  654.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 2> abab;
  655.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 3> abaa;
  656.  
  657.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 0> aarr;
  658.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 1> aarg;
  659.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 2> aarb;
  660.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 3> aara;
  661.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 0> aagr;
  662.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 1> aagg;
  663.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 2> aagb;
  664.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 3> aaga;
  665.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 0> aabr;
  666.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 1> aabg;
  667.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 2> aabb;
  668.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 3> aaba;
  669.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 0> aaar;
  670.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 1> aaag;
  671.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 2> aaab;
  672.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 3> aaaa;
  673.  
  674.         // stpq
  675.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 0> ssss;
  676.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 1> ssst;
  677.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 2> sssp;
  678.         SWIZZLE_READ_ONLY<vec4, 0, 0, 0, 3> sssq;
  679.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 0> ssts;
  680.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 1> sstt;
  681.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 2> sstp;
  682.         SWIZZLE_READ_ONLY<vec4, 0, 0, 1, 3> sstq;
  683.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 0> ssps;
  684.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 1> sspt;
  685.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 2> sspp;
  686.         SWIZZLE_READ_ONLY<vec4, 0, 0, 2, 3> sspq;
  687.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 0> ssqs;
  688.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 1> ssqt;
  689.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 2> ssqp;
  690.         SWIZZLE_READ_ONLY<vec4, 0, 0, 3, 3> ssqq;
  691.  
  692.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 0> stss;
  693.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 1> stst;
  694.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 2> stsp;
  695.         SWIZZLE_READ_ONLY<vec4, 0, 1, 0, 3> stsq;
  696.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 0> stts;
  697.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 1> sttt;
  698.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 2> sttp;
  699.         SWIZZLE_READ_ONLY<vec4, 0, 1, 1, 3> sttq;
  700.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 0> stps;
  701.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 1> stpt;
  702.         SWIZZLE_READ_ONLY<vec4, 0, 1, 2, 2> stpp;
  703.         SWIZZLE_READWRITE<vec4, 0, 1, 2, 3> stpq;
  704.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 0> stqs;
  705.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 1> stqt;
  706.         SWIZZLE_READWRITE<vec4, 0, 1, 3, 2> stqp;
  707.         SWIZZLE_READ_ONLY<vec4, 0, 1, 3, 3> stqq;
  708.  
  709.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 0> spss;
  710.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 1> spst;
  711.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 2> spsp;
  712.         SWIZZLE_READ_ONLY<vec4, 0, 2, 0, 3> spsq;
  713.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 0> spts;
  714.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 1> sptt;
  715.         SWIZZLE_READ_ONLY<vec4, 0, 2, 1, 2> sptp;
  716.         SWIZZLE_READWRITE<vec4, 0, 2, 1, 3> sptq;
  717.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 0> spps;
  718.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 1> sppt;
  719.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 2> sppp;
  720.         SWIZZLE_READ_ONLY<vec4, 0, 2, 2, 3> sppq;
  721.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 0> spqs;
  722.         SWIZZLE_READWRITE<vec4, 0, 2, 3, 1> spqt;
  723.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 2> spqp;
  724.         SWIZZLE_READ_ONLY<vec4, 0, 2, 3, 3> spqq;
  725.  
  726.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 0> sqss;
  727.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 1> sqst;
  728.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 2> sqsp;
  729.         SWIZZLE_READ_ONLY<vec4, 0, 3, 0, 3> sqsq;
  730.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 0> sqts;
  731.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 1> sqtt;
  732.         SWIZZLE_READWRITE<vec4, 0, 3, 1, 2> sqtp;
  733.         SWIZZLE_READ_ONLY<vec4, 0, 3, 1, 3> sqtq;
  734.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 0> sqps;
  735.         SWIZZLE_READWRITE<vec4, 0, 3, 2, 1> sqpt;
  736.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 2> sqpp;
  737.         SWIZZLE_READ_ONLY<vec4, 0, 3, 2, 3> sqpq;
  738.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 0> sqqs;
  739.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 1> sqqt;
  740.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 2> sqqp;
  741.         SWIZZLE_READ_ONLY<vec4, 0, 3, 3, 3> sqqq;
  742.  
  743.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 0> tsss;
  744.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 1> tsst;
  745.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 2> tssp;
  746.         SWIZZLE_READ_ONLY<vec4, 1, 0, 0, 3> tssq;
  747.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 0> tsts;
  748.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 1> tstt;
  749.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 2> tstp;
  750.         SWIZZLE_READ_ONLY<vec4, 1, 0, 1, 3> tstq;
  751.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 0> tsps;
  752.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 1> tspt;
  753.         SWIZZLE_READ_ONLY<vec4, 1, 0, 2, 2> tspp;
  754.         SWIZZLE_READWRITE<vec4, 1, 0, 2, 3> tspq;
  755.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 0> tsqs;
  756.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 1> tsqt;
  757.         SWIZZLE_READWRITE<vec4, 1, 0, 3, 2> tsqp;
  758.         SWIZZLE_READ_ONLY<vec4, 1, 0, 3, 3> tsqq;
  759.  
  760.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 0> ttss;
  761.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 1> ttst;
  762.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 2> ttsp;
  763.         SWIZZLE_READ_ONLY<vec4, 1, 1, 0, 3> ttsq;
  764.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 0> ttts;
  765.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 1> tttt;
  766.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 2> tttp;
  767.         SWIZZLE_READ_ONLY<vec4, 1, 1, 1, 3> tttq;
  768.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 0> ttps;
  769.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 1> ttpt;
  770.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 2> ttpp;
  771.         SWIZZLE_READ_ONLY<vec4, 1, 1, 2, 3> ttpq;
  772.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 0> ttqs;
  773.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 1> ttqt;
  774.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 2> ttqp;
  775.         SWIZZLE_READ_ONLY<vec4, 1, 1, 3, 3> ttqq;
  776.  
  777.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 0> tpss;
  778.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 1> tpst;
  779.         SWIZZLE_READ_ONLY<vec4, 1, 2, 0, 2> tpsp;
  780.         SWIZZLE_READWRITE<vec4, 1, 2, 0, 3> tpsq;
  781.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 0> tpts;
  782.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 1> tptt;
  783.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 2> tptp;
  784.         SWIZZLE_READ_ONLY<vec4, 1, 2, 1, 3> tptq;
  785.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 0> tpps;
  786.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 1> tppt;
  787.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 2> tppp;
  788.         SWIZZLE_READ_ONLY<vec4, 1, 2, 2, 3> tppq;
  789.         SWIZZLE_READWRITE<vec4, 1, 2, 3, 0> tpqs;
  790.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 1> tpqt;
  791.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 2> tpqp;
  792.         SWIZZLE_READ_ONLY<vec4, 1, 2, 3, 3> tpqq;
  793.  
  794.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 0> tqss;
  795.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 1> tqst;
  796.         SWIZZLE_READWRITE<vec4, 1, 3, 0, 2> tqsp;
  797.         SWIZZLE_READ_ONLY<vec4, 1, 3, 0, 3> tqsq;
  798.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 0> tqts;
  799.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 1> tqtt;
  800.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 2> tqtp;
  801.         SWIZZLE_READ_ONLY<vec4, 1, 3, 1, 3> tqtq;
  802.         SWIZZLE_READWRITE<vec4, 1, 3, 2, 0> tqps;
  803.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 1> tqpt;
  804.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 2> tqpp;
  805.         SWIZZLE_READ_ONLY<vec4, 1, 3, 2, 3> tqpq;
  806.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 0> tqqs;
  807.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 1> tqqt;
  808.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 2> tqqp;
  809.         SWIZZLE_READ_ONLY<vec4, 1, 3, 3, 3> tqqq;
  810.  
  811.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 0> psss;
  812.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 1> psst;
  813.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 2> pssp;
  814.         SWIZZLE_READ_ONLY<vec4, 2, 0, 0, 3> pssq;
  815.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 0> psts;
  816.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 1> pstt;
  817.         SWIZZLE_READ_ONLY<vec4, 2, 0, 1, 2> pstp;
  818.         SWIZZLE_READWRITE<vec4, 2, 0, 1, 3> pstq;
  819.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 0> psps;
  820.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 1> pspt;
  821.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 2> pspp;
  822.         SWIZZLE_READ_ONLY<vec4, 2, 0, 2, 3> pspq;
  823.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 0> psqs;
  824.         SWIZZLE_READWRITE<vec4, 2, 0, 3, 1> psqt;
  825.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 2> psqp;
  826.         SWIZZLE_READ_ONLY<vec4, 2, 0, 3, 3> psqq;
  827.  
  828.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 0> ptss;
  829.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 1> ptst;
  830.         SWIZZLE_READ_ONLY<vec4, 2, 1, 0, 2> ptsp;
  831.         SWIZZLE_READWRITE<vec4, 2, 1, 0, 3> ptsq;
  832.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 0> ptts;
  833.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 1> pttt;
  834.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 2> pttp;
  835.         SWIZZLE_READ_ONLY<vec4, 2, 1, 1, 3> pttq;
  836.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 0> ptps;
  837.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 1> ptpt;
  838.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 2> ptpp;
  839.         SWIZZLE_READ_ONLY<vec4, 2, 1, 2, 3> ptpq;
  840.         SWIZZLE_READWRITE<vec4, 2, 1, 3, 0> ptqs;
  841.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 1> ptqt;
  842.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 2> ptqp;
  843.         SWIZZLE_READ_ONLY<vec4, 2, 1, 3, 3> ptqq;
  844.  
  845.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 0> ppss;
  846.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 1> ppst;
  847.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 2> ppsp;
  848.         SWIZZLE_READ_ONLY<vec4, 2, 2, 0, 3> ppsq;
  849.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 0> ppts;
  850.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 1> pptt;
  851.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 2> pptp;
  852.         SWIZZLE_READ_ONLY<vec4, 2, 2, 1, 3> pptq;
  853.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 0> ppps;
  854.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 1> pppt;
  855.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 2> pppp;
  856.         SWIZZLE_READ_ONLY<vec4, 2, 2, 2, 3> pppq;
  857.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 0> ppqs;
  858.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 1> ppqt;
  859.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 2> ppqp;
  860.         SWIZZLE_READ_ONLY<vec4, 2, 2, 3, 3> ppqq;
  861.  
  862.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 0> pqss;
  863.         SWIZZLE_READWRITE<vec4, 2, 3, 0, 1> pqst;
  864.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 2> pqsp;
  865.         SWIZZLE_READ_ONLY<vec4, 2, 3, 0, 3> pqsq;
  866.         SWIZZLE_READWRITE<vec4, 2, 3, 1, 0> pqts;
  867.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 1> pqtt;
  868.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 2> pqtp;
  869.         SWIZZLE_READ_ONLY<vec4, 2, 3, 1, 3> pqtq;
  870.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 0> pqps;
  871.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 1> pqpt;
  872.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 2> pqpp;
  873.         SWIZZLE_READ_ONLY<vec4, 2, 3, 2, 3> pqpq;
  874.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 0> pqqs;
  875.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 1> pqqt;
  876.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 2> pqqp;
  877.         SWIZZLE_READ_ONLY<vec4, 2, 3, 3, 3> pqqq;
  878.  
  879.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 0> qsss;
  880.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 1> qsst;
  881.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 2> qssp;
  882.         SWIZZLE_READ_ONLY<vec4, 3, 0, 0, 3> qssq;
  883.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 0> qsts;
  884.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 1> qstt;
  885.         SWIZZLE_READWRITE<vec4, 3, 0, 1, 2> qstp;
  886.         SWIZZLE_READ_ONLY<vec4, 3, 0, 1, 3> qstq;
  887.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 0> qsps;
  888.         SWIZZLE_READWRITE<vec4, 3, 0, 2, 1> qspt;
  889.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 2> qspp;
  890.         SWIZZLE_READ_ONLY<vec4, 3, 0, 2, 3> qspq;
  891.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 0> qsqs;
  892.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 1> qsqt;
  893.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 2> qsqp;
  894.         SWIZZLE_READ_ONLY<vec4, 3, 0, 3, 3> qsqq;
  895.  
  896.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 0> qtss;
  897.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 1> qtst;
  898.         SWIZZLE_READWRITE<vec4, 3, 1, 0, 2> qtsp;
  899.         SWIZZLE_READ_ONLY<vec4, 3, 1, 0, 3> qtsq;
  900.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 0> qtts;
  901.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 1> qttt;
  902.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 2> qttp;
  903.         SWIZZLE_READ_ONLY<vec4, 3, 1, 1, 3> qttq;
  904.         SWIZZLE_READWRITE<vec4, 3, 1, 2, 0> qtps;
  905.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 1> qtpt;
  906.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 2> qtpp;
  907.         SWIZZLE_READ_ONLY<vec4, 3, 1, 2, 3> qtpq;
  908.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 0> qtqs;
  909.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 1> qtqt;
  910.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 2> qtqp;
  911.         SWIZZLE_READ_ONLY<vec4, 3, 1, 3, 3> qtqq;
  912.  
  913.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 0> qpss;
  914.         SWIZZLE_READWRITE<vec4, 3, 2, 0, 1> qpst;
  915.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 2> qpsp;
  916.         SWIZZLE_READ_ONLY<vec4, 3, 2, 0, 3> qpsq;
  917.         SWIZZLE_READWRITE<vec4, 3, 2, 1, 0> qpts;
  918.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 1> qptt;
  919.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 2> qptp;
  920.         SWIZZLE_READ_ONLY<vec4, 3, 2, 1, 3> qptq;
  921.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 0> qpps;
  922.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 1> qppt;
  923.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 2> qppp;
  924.         SWIZZLE_READ_ONLY<vec4, 3, 2, 2, 3> qppq;
  925.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 0> qpqs;
  926.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 1> qpqt;
  927.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 2> qpqp;
  928.         SWIZZLE_READ_ONLY<vec4, 3, 2, 3, 3> qpqq;
  929.  
  930.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 0> qqss;
  931.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 1> qqst;
  932.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 2> qqsp;
  933.         SWIZZLE_READ_ONLY<vec4, 3, 3, 0, 3> qqsq;
  934.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 0> qqts;
  935.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 1> qqtt;
  936.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 2> qqtp;
  937.         SWIZZLE_READ_ONLY<vec4, 3, 3, 1, 3> qqtq;
  938.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 0> qqps;
  939.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 1> qqpt;
  940.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 2> qqpp;
  941.         SWIZZLE_READ_ONLY<vec4, 3, 3, 2, 3> qqpq;
  942.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 0> qqqs;
  943.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 1> qqqt;
  944.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 2> qqqp;
  945.         SWIZZLE_READ_ONLY<vec4, 3, 3, 3, 3> qqqq;
  946.  
  947.         //// vec3 swizzles
  948.         // xyzw
  949.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 0> xxx;
  950.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 1> xxy;
  951.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 2> xxz;
  952.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 3> xxw;
  953.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 1, 0> xyx;
  954.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 1, 1> xyy;
  955.         vec3::SWIZZLE_READWRITE<vec4, 0, 1, 2> xyz;
  956.         vec3::SWIZZLE_READWRITE<vec4, 0, 1, 3> xyw;
  957.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 2, 0> xzx;
  958.         vec3::SWIZZLE_READWRITE<vec4, 0, 2, 1> xzy;
  959.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 2, 2> xzz;
  960.         vec3::SWIZZLE_READWRITE<vec4, 0, 2, 3> xzw;
  961.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 3, 0> xwx;
  962.         vec3::SWIZZLE_READWRITE<vec4, 0, 3, 1> xwy;
  963.         vec3::SWIZZLE_READWRITE<vec4, 0, 3, 2> xwz;
  964.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 3, 3> xww;
  965.  
  966.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 0, 0> yxx;
  967.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 0, 1> yxy;
  968.         vec3::SWIZZLE_READWRITE<vec4, 1, 0, 2> yxz;
  969.         vec3::SWIZZLE_READWRITE<vec4, 1, 0, 3> yxw;
  970.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 0> yyx;
  971.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 1> yyy;
  972.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 2> yyz;
  973.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 3> yyw;
  974.         vec3::SWIZZLE_READWRITE<vec4, 1, 2, 0> yzx;
  975.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 2, 1> yzy;
  976.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 2, 2> yzz;
  977.         vec3::SWIZZLE_READWRITE<vec4, 1, 2, 3> yzw;
  978.         vec3::SWIZZLE_READWRITE<vec4, 1, 3, 0> ywx;
  979.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 3, 1> ywy;
  980.         vec3::SWIZZLE_READWRITE<vec4, 1, 3, 2> ywz;
  981.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 3, 3> yww;
  982.  
  983.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 0, 0> zxx;
  984.         vec3::SWIZZLE_READWRITE<vec4, 2, 0, 1> zxy;
  985.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 0, 2> zxz;
  986.         vec3::SWIZZLE_READWRITE<vec4, 2, 0, 3> zxw;
  987.         vec3::SWIZZLE_READWRITE<vec4, 2, 1, 0> zyx;
  988.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 1, 1> zyy;
  989.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 1, 2> zyz;
  990.         vec3::SWIZZLE_READWRITE<vec4, 2, 1, 3> zyw;
  991.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 0> zzx;
  992.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 1> zzy;
  993.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 2> zzz;
  994.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 3> zzw;
  995.         vec3::SWIZZLE_READWRITE<vec4, 2, 3, 0> zwx;
  996.         vec3::SWIZZLE_READWRITE<vec4, 2, 3, 1> zwy;
  997.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 3, 2> zwz;
  998.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 3, 3> zww;
  999.  
  1000.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 0, 0> wxx;
  1001.         vec3::SWIZZLE_READWRITE<vec4, 3, 0, 1> wxy;
  1002.         vec3::SWIZZLE_READWRITE<vec4, 3, 0, 2> wxz;
  1003.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 0, 3> wxw;
  1004.         vec3::SWIZZLE_READWRITE<vec4, 3, 1, 0> wyx;
  1005.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 1, 1> wyy;
  1006.         vec3::SWIZZLE_READWRITE<vec4, 3, 1, 2> wyz;
  1007.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 1, 3> wyw;
  1008.         vec3::SWIZZLE_READWRITE<vec4, 3, 2, 0> wzx;
  1009.         vec3::SWIZZLE_READWRITE<vec4, 3, 2, 1> wzy;
  1010.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 2, 2> wzz;
  1011.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 2, 3> wzw;
  1012.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 0> wwx;
  1013.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 1> wwy;
  1014.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 2> wwz;
  1015.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 3> www;
  1016.  
  1017.         // rgba
  1018.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 0> rrr;
  1019.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 1> rrg;
  1020.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 2> rrb;
  1021.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 3> rra;
  1022.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 1, 0> rgr;
  1023.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 1, 1> rgg;
  1024.         vec3::SWIZZLE_READWRITE<vec4, 0, 1, 2> rgb;
  1025.         vec3::SWIZZLE_READWRITE<vec4, 0, 1, 3> rga;
  1026.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 2, 0> rbr;
  1027.         vec3::SWIZZLE_READWRITE<vec4, 0, 2, 1> rbg;
  1028.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 2, 2> rbb;
  1029.         vec3::SWIZZLE_READWRITE<vec4, 0, 2, 3> rba;
  1030.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 3, 0> rar;
  1031.         vec3::SWIZZLE_READWRITE<vec4, 0, 3, 1> rag;
  1032.         vec3::SWIZZLE_READWRITE<vec4, 0, 3, 2> rab;
  1033.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 3, 3> raa;
  1034.  
  1035.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 0, 0> grr;
  1036.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 0, 1> grg;
  1037.         vec3::SWIZZLE_READWRITE<vec4, 1, 0, 2> grb;
  1038.         vec3::SWIZZLE_READWRITE<vec4, 1, 0, 3> gra;
  1039.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 0> ggr;
  1040.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 1> ggg;
  1041.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 2> ggb;
  1042.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 3> gga;
  1043.         vec3::SWIZZLE_READWRITE<vec4, 1, 2, 0> gbr;
  1044.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 2, 1> gbg;
  1045.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 2, 2> gbb;
  1046.         vec3::SWIZZLE_READWRITE<vec4, 1, 2, 3> gba;
  1047.         vec3::SWIZZLE_READWRITE<vec4, 1, 3, 0> gar;
  1048.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 3, 1> gag;
  1049.         vec3::SWIZZLE_READWRITE<vec4, 1, 3, 2> gab;
  1050.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 3, 3> gaa;
  1051.  
  1052.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 0, 0> brr;
  1053.         vec3::SWIZZLE_READWRITE<vec4, 2, 0, 1> brg;
  1054.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 0, 2> brb;
  1055.         vec3::SWIZZLE_READWRITE<vec4, 2, 0, 3> bra;
  1056.         vec3::SWIZZLE_READWRITE<vec4, 2, 1, 0> bgr;
  1057.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 1, 1> bgg;
  1058.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 1, 2> bgb;
  1059.         vec3::SWIZZLE_READWRITE<vec4, 2, 1, 3> bga;
  1060.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 0> bbr;
  1061.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 1> bbg;
  1062.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 2> bbb;
  1063.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 3> bba;
  1064.         vec3::SWIZZLE_READWRITE<vec4, 2, 3, 0> bar;
  1065.         vec3::SWIZZLE_READWRITE<vec4, 2, 3, 1> bag;
  1066.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 3, 2> bab;
  1067.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 3, 3> baa;
  1068.  
  1069.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 0, 0> arr;
  1070.         vec3::SWIZZLE_READWRITE<vec4, 3, 0, 1> arg;
  1071.         vec3::SWIZZLE_READWRITE<vec4, 3, 0, 2> arb;
  1072.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 0, 3> ara;
  1073.         vec3::SWIZZLE_READWRITE<vec4, 3, 1, 0> agr;
  1074.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 1, 1> agg;
  1075.         vec3::SWIZZLE_READWRITE<vec4, 3, 1, 2> agb;
  1076.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 1, 3> aga;
  1077.         vec3::SWIZZLE_READWRITE<vec4, 3, 2, 0> abr;
  1078.         vec3::SWIZZLE_READWRITE<vec4, 3, 2, 1> abg;
  1079.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 2, 2> abb;
  1080.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 2, 3> aba;
  1081.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 0> aar;
  1082.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 1> aag;
  1083.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 2> aab;
  1084.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 3> aaa;
  1085.  
  1086.         // stpq
  1087.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 0> sss;
  1088.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 1> sst;
  1089.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 2> ssp;
  1090.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 0, 3> ssq;
  1091.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 1, 0> sts;
  1092.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 1, 1> stt;
  1093.         vec3::SWIZZLE_READWRITE<vec4, 0, 1, 2> stp;
  1094.         vec3::SWIZZLE_READWRITE<vec4, 0, 1, 3> stq;
  1095.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 2, 0> sps;
  1096.         vec3::SWIZZLE_READWRITE<vec4, 0, 2, 1> spt;
  1097.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 2, 2> spp;
  1098.         vec3::SWIZZLE_READWRITE<vec4, 0, 2, 3> spq;
  1099.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 3, 0> sqs;
  1100.         vec3::SWIZZLE_READWRITE<vec4, 0, 3, 1> sqt;
  1101.         vec3::SWIZZLE_READWRITE<vec4, 0, 3, 2> sqp;
  1102.         vec3::SWIZZLE_READ_ONLY<vec4, 0, 3, 3> sqq;
  1103.  
  1104.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 0, 0> tss;
  1105.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 0, 1> tst;
  1106.         vec3::SWIZZLE_READWRITE<vec4, 1, 0, 2> tsp;
  1107.         vec3::SWIZZLE_READWRITE<vec4, 1, 0, 3> tsq;
  1108.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 0> tts;
  1109.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 1> ttt;
  1110.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 2> ttp;
  1111.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 1, 3> ttq;
  1112.         vec3::SWIZZLE_READWRITE<vec4, 1, 2, 0> tps;
  1113.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 2, 1> tpt;
  1114.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 2, 2> tpp;
  1115.         vec3::SWIZZLE_READWRITE<vec4, 1, 2, 3> tpq;
  1116.         vec3::SWIZZLE_READWRITE<vec4, 1, 3, 0> tqs;
  1117.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 3, 1> tqt;
  1118.         vec3::SWIZZLE_READWRITE<vec4, 1, 3, 2> tqp;
  1119.         vec3::SWIZZLE_READ_ONLY<vec4, 1, 3, 3> tqq;
  1120.  
  1121.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 0, 0> pss;
  1122.         vec3::SWIZZLE_READWRITE<vec4, 2, 0, 1> pst;
  1123.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 0, 2> psp;
  1124.         vec3::SWIZZLE_READWRITE<vec4, 2, 0, 3> psq;
  1125.         vec3::SWIZZLE_READWRITE<vec4, 2, 1, 0> pts;
  1126.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 1, 1> ptt;
  1127.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 1, 2> ptp;
  1128.         vec3::SWIZZLE_READWRITE<vec4, 2, 1, 3> ptq;
  1129.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 0> pps;
  1130.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 1> ppt;
  1131.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 2> ppp;
  1132.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 2, 3> ppq;
  1133.         vec3::SWIZZLE_READWRITE<vec4, 2, 3, 0> pqs;
  1134.         vec3::SWIZZLE_READWRITE<vec4, 2, 3, 1> pqt;
  1135.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 3, 2> pqp;
  1136.         vec3::SWIZZLE_READ_ONLY<vec4, 2, 3, 3> pqq;
  1137.  
  1138.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 0, 0> qss;
  1139.         vec3::SWIZZLE_READWRITE<vec4, 3, 0, 1> qst;
  1140.         vec3::SWIZZLE_READWRITE<vec4, 3, 0, 2> qsp;
  1141.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 0, 3> qsq;
  1142.         vec3::SWIZZLE_READWRITE<vec4, 3, 1, 0> qts;
  1143.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 1, 1> qtt;
  1144.         vec3::SWIZZLE_READWRITE<vec4, 3, 1, 2> qtp;
  1145.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 1, 3> qtq;
  1146.         vec3::SWIZZLE_READWRITE<vec4, 3, 2, 0> qps;
  1147.         vec3::SWIZZLE_READWRITE<vec4, 3, 2, 1> qpt;
  1148.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 2, 2> qpp;
  1149.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 2, 3> qpq;
  1150.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 0> qqs;
  1151.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 1> qqt;
  1152.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 2> qqp;
  1153.         vec3::SWIZZLE_READ_ONLY<vec4, 3, 3, 3> qqq;
  1154.  
  1155.         //// vec2 swizzles
  1156.         // xyzw
  1157.         vec2::SWIZZLE_READ_ONLY<vec4, 0, 0> xx;
  1158.         vec2::SWIZZLE_READWRITE<vec4, 0, 1> xy;
  1159.         vec2::SWIZZLE_READWRITE<vec4, 0, 2> xz;
  1160.         vec2::SWIZZLE_READWRITE<vec4, 0, 3> xw;
  1161.         vec2::SWIZZLE_READWRITE<vec4, 1, 0> yx;
  1162.         vec2::SWIZZLE_READ_ONLY<vec4, 1, 1> yy;
  1163.         vec2::SWIZZLE_READWRITE<vec4, 1, 2> yz;
  1164.         vec2::SWIZZLE_READWRITE<vec4, 1, 3> yw;
  1165.         vec2::SWIZZLE_READWRITE<vec4, 2, 0> zx;
  1166.         vec2::SWIZZLE_READWRITE<vec4, 2, 1> zy;
  1167.         vec2::SWIZZLE_READ_ONLY<vec4, 2, 2> zz;
  1168.         vec2::SWIZZLE_READWRITE<vec4, 2, 3> zw;
  1169.         vec2::SWIZZLE_READWRITE<vec4, 3, 0> wx;
  1170.         vec2::SWIZZLE_READWRITE<vec4, 3, 1> wy;
  1171.         vec2::SWIZZLE_READWRITE<vec4, 3, 2> wz;
  1172.         vec2::SWIZZLE_READ_ONLY<vec4, 3, 3> ww;
  1173.  
  1174.         // rgba
  1175.         vec2::SWIZZLE_READ_ONLY<vec4, 0, 0> rr;
  1176.         vec2::SWIZZLE_READWRITE<vec4, 0, 1> rg;
  1177.         vec2::SWIZZLE_READWRITE<vec4, 0, 2> rb;
  1178.         vec2::SWIZZLE_READWRITE<vec4, 0, 3> ra;
  1179.         vec2::SWIZZLE_READWRITE<vec4, 1, 0> gr;
  1180.         vec2::SWIZZLE_READ_ONLY<vec4, 1, 1> gg;
  1181.         vec2::SWIZZLE_READWRITE<vec4, 1, 2> gb;
  1182.         vec2::SWIZZLE_READWRITE<vec4, 1, 3> ga;
  1183.         vec2::SWIZZLE_READWRITE<vec4, 2, 0> br;
  1184.         vec2::SWIZZLE_READWRITE<vec4, 2, 1> bg;
  1185.         vec2::SWIZZLE_READ_ONLY<vec4, 2, 2> bb;
  1186.         vec2::SWIZZLE_READWRITE<vec4, 2, 3> ba;
  1187.         vec2::SWIZZLE_READWRITE<vec4, 3, 0> ar;
  1188.         vec2::SWIZZLE_READWRITE<vec4, 3, 1> ag;
  1189.         vec2::SWIZZLE_READWRITE<vec4, 3, 2> ab;
  1190.         vec2::SWIZZLE_READ_ONLY<vec4, 3, 3> aa;
  1191.  
  1192.         // stpq
  1193.         vec2::SWIZZLE_READ_ONLY<vec4, 0, 0> ss;
  1194.         vec2::SWIZZLE_READWRITE<vec4, 0, 1> st;
  1195.         vec2::SWIZZLE_READWRITE<vec4, 0, 2> sp;
  1196.         vec2::SWIZZLE_READWRITE<vec4, 0, 3> sq;
  1197.         vec2::SWIZZLE_READWRITE<vec4, 1, 0> ts;
  1198.         vec2::SWIZZLE_READ_ONLY<vec4, 1, 1> tt;
  1199.         vec2::SWIZZLE_READWRITE<vec4, 1, 2> tp;
  1200.         vec2::SWIZZLE_READWRITE<vec4, 1, 3> tq;
  1201.         vec2::SWIZZLE_READWRITE<vec4, 2, 0> ps;
  1202.         vec2::SWIZZLE_READWRITE<vec4, 2, 1> pt;
  1203.         vec2::SWIZZLE_READ_ONLY<vec4, 2, 2> pp;
  1204.         vec2::SWIZZLE_READWRITE<vec4, 2, 3> pq;
  1205.         vec2::SWIZZLE_READWRITE<vec4, 3, 0> qs;
  1206.         vec2::SWIZZLE_READWRITE<vec4, 3, 1> qt;
  1207.         vec2::SWIZZLE_READWRITE<vec4, 3, 2> qp;
  1208.         vec2::SWIZZLE_READ_ONLY<vec4, 3, 3> qq;
  1209.     };
  1210.  
  1211.     // Equality test.  Really only useful for checking if a vector is (still) equal to some constant, such as zero.
  1212.     inline constexpr bool operator == (vec4 rhs) const
  1213.         { return ((x == rhs.x) && (y == rhs.y) && (z == rhs.z) && (w == rhs.w)); }
  1214.     inline constexpr bool operator != (vec4 rhs) const
  1215.         { return ((x != rhs.x) || (y != rhs.y) || (z != rhs.z) || (w != rhs.w)); }
  1216.  
  1217.     // Arithmetic operators (vector with vector)
  1218.     inline constexpr vec4 operator + (vec4 rhs) const
  1219.         { return { x+rhs.x, y+rhs.y, z+rhs.z, w+rhs.w }; }
  1220.     inline constexpr vec4 operator - (vec4 rhs) const
  1221.         { return { x-rhs.x, y-rhs.y, z-rhs.z, w-rhs.w }; }
  1222.     inline constexpr vec4 operator * (vec4 rhs) const
  1223.         { return { x*rhs.x, y*rhs.y, z*rhs.z, w*rhs.w }; }
  1224.     inline constexpr vec4 operator / (vec4 rhs) const
  1225.         { return { x/rhs.x, y/rhs.y, z/rhs.z, w/rhs.w }; }
  1226.  
  1227.     // Arithmetic operators (vector with float)
  1228.     inline constexpr vec4 operator + (float rhs) const
  1229.         { return { x+rhs, y+rhs, z+rhs, w+rhs }; }
  1230.     inline constexpr vec4 operator - (float rhs) const
  1231.         { return { x-rhs, y-rhs, z-rhs, w-rhs }; }
  1232.     inline constexpr vec4 operator * (float rhs) const
  1233.         { return { x*rhs, y*rhs, z*rhs, w*rhs }; }
  1234.     inline constexpr vec4 operator / (float rhs) const
  1235.         { return { x/rhs, y/rhs, z/rhs, w/rhs }; }
  1236.  
  1237.     // Arithmetic operator (float aith vector)
  1238.     inline constexpr friend vec4 operator + (float lhs, vec4 rhs)
  1239.         { return { lhs+rhs.x, lhs+rhs.y, lhs+rhs.z, lhs+rhs.w }; }
  1240.     inline constexpr friend vec4 operator - (float lhs, vec4 rhs)
  1241.         { return { lhs-rhs.x, lhs-rhs.y, lhs-rhs.z, lhs-rhs.w }; }
  1242.     inline constexpr friend vec4 operator * (float lhs, vec4 rhs)
  1243.         { return { lhs*rhs.x, lhs*rhs.y, lhs*rhs.z, lhs*rhs.w }; }
  1244.     inline constexpr friend vec4 operator / (float lhs, vec4 rhs)
  1245.         { return { lhs/rhs.x, lhs/rhs.y, lhs/rhs.z, lhs/rhs.w }; }
  1246.  
  1247.     // Arithmetic-assignment operators (vector aith vector)
  1248.     inline vec4& operator += (vec4 rhs)
  1249.         { x += rhs.x; y += rhs.y; z += rhs.z; w += rhs.w; return *this; }
  1250.     inline vec4& operator -= (vec4 rhs)
  1251.         { x -= rhs.x; y -= rhs.y; z -= rhs.z; w -= rhs.w; return *this; }
  1252.     inline vec4& operator *= (vec4 rhs)
  1253.         { x *= rhs.x; y *= rhs.y; z *= rhs.z; w *= rhs.w; return *this; }
  1254.     inline vec4& operator /= (vec4 rhs)
  1255.         { x /= rhs.x; y /= rhs.y; z /= rhs.z; w /= rhs.w; return *this; }
  1256.  
  1257.     // Arithmetic-assignment operators (vector aith float)
  1258.     inline vec4& operator += (float rhs)
  1259.         { x += rhs; y += rhs; z += rhs; w += rhs; return *this; }
  1260.     inline vec4& operator -= (float rhs)
  1261.         { x -= rhs; y -= rhs; z -= rhs; w -= rhs; return *this; }
  1262.     inline vec4& operator *= (float rhs)
  1263.         { x *= rhs; y *= rhs; z *= rhs; w *= rhs; return *this; }
  1264.     inline vec4& operator /= (float rhs)
  1265.         { x /= rhs; y /= rhs; z /= rhs; w /= rhs; return *this; }
  1266.  
  1267.     // Negation operator
  1268.     inline constexpr vec4 operator - () const
  1269.         { return { -x, -y, -z, -w }; }
  1270.  
  1271.     //// Member functions
  1272.  
  1273.     inline constexpr bool is_zero() const
  1274.         { return ((x == 0.0f) && (y == 0.0f) && (z == 0.0f) && (w == 0.0f)); }
  1275.  
  1276.     inline constexpr float sum() const
  1277.         { return x + y + z + w; }
  1278.  
  1279.     inline float magnitude() const
  1280.         { return sqrtf((x*x) + (y*y) + (z*z) + (w*w)); }
  1281.  
  1282.     inline float mag() const
  1283.         { return magnitude(); }
  1284.  
  1285.     inline float magnitude_squared() const
  1286.         { return (x*x) + (y*y) + (z*z) + (w*w); }
  1287.  
  1288.     inline float sqrmag() const
  1289.         { return magnitude_squared(); }
  1290.  
  1291.     inline vec4 normalized() const
  1292.         { return *this / magnitude(); }
  1293.  
  1294.     inline void normalize()
  1295.         { *this = normalized(); }
  1296.  
  1297.     static inline vec4 minimum(vec4 lhs, vec4 rhs)
  1298.         { return { fminf(lhs.x, rhs.x), fminf(lhs.y, rhs.y), fminf(lhs.z, rhs.z), fminf(lhs.w, rhs.w) }; }
  1299.  
  1300.     static inline vec4 maximum(vec4 lhs, vec4 rhs)
  1301.         { return { fmaxf(lhs.x, rhs.x), fmaxf(lhs.y, rhs.y), fmaxf(lhs.z, rhs.z), fmaxf(lhs.w, rhs.w) }; }
  1302.  
  1303.     inline vec4 clamped(vec4 lower, vec4 upper) const
  1304.         { return minimum(upper, maximum(lower, *this)); }
  1305.  
  1306.     inline void clamp(vec4 lower, vec4 upper)
  1307.         { *this = clamped(lower, upper); }
  1308.  
  1309.     inline vec4 clamped_magnitude(float max_magnitude) const
  1310.     {
  1311.         float mag = magnitude();
  1312.         if (mag <= max_magnitude)
  1313.             return *this;
  1314.         else
  1315.             return this->normalized() * max_magnitude;
  1316.     }
  1317.  
  1318.     inline void clamp_magnitude(float max_magnitude)
  1319.         { *this = clamped_magnitude(max_magnitude); }
  1320.  
  1321.     static inline float distance(vec4 a, vec4 b)
  1322.         { return (a-b).magnitude(); }
  1323.  
  1324.     static inline float distance_squared(vec4 a, vec4 b)
  1325.         { return (a-b).magnitude_squared(); }
  1326.  
  1327.     inline vec4 moved_towards(vec4 target, float max_dist) const
  1328.     {
  1329.         if (distance(*this, target) <= max_dist)
  1330.             return target;
  1331.         else
  1332.             return *this + ((target - *this).normalized() * max_dist);
  1333.     }
  1334.  
  1335.     inline void move_towards(vec4 target, float max_dist)
  1336.         { *this = moved_towards(target, max_dist); }
  1337.  
  1338.     static inline constexpr float dot(vec4 a, vec4 b)
  1339.         { return (a.x * b.x) + (a.y * b.y) + (a.z * b.z) + (a.w * b.w); }
  1340.  
  1341.     // I got the implementation for this from Unity.  I honestly don't really know what the hell is going on here.
  1342.     static inline vec4 smooth_damp(const vec4 from, const vec4 to, vec4& velocity, float smooth_time, float delta_time, float max_speed)
  1343.     {
  1344.         if (smooth_time <= 0.0f)
  1345.             smooth_time = 0.0001f;
  1346.         float num = 2 / smooth_time;
  1347.         float num2 = num * delta_time;
  1348.         float num3 = 1 / (1 + num2 + 0.48f * num2 * num2 + 0.235f * num2 * num2);
  1349.         vec4 num4 = from - to;
  1350.         vec4 num5 = to;
  1351.         float max_dist = max_speed * smooth_time;
  1352.         num4.clamp_magnitude(max_dist);
  1353.         num5 = from - num4;
  1354.         vec4 num7 = ((num4 * num) + velocity) * delta_time;
  1355.         velocity = (velocity - num * num7) * num3;
  1356.         vec4 num8 = to + (num4 + num7) * num3;
  1357.         if (((num5 - from).magnitude() > 0) == (num8.magnitude() > num5.magnitude()))
  1358.         {
  1359.             num8 = num5;
  1360.             velocity = (num8 - num5) / delta_time;
  1361.         }
  1362.  
  1363.         return num8;
  1364.     }
  1365. };
  1366.  
  1367. constexpr vec4 VEC4_ZERO = { 0, 0, 0, 0 };
  1368. constexpr vec4 VEC4_ONE = { 1, 1, 1, 1 };
  1369.  
  1370. } // namespace vmath
  1371. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement