| @@ -28,6 +28,14 @@ | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| /* Some compilers do not support const members in anonymous unions. So | |||||
| * far, GCC (>= 4.6), CLang (3.0) and Visual Studio (>= 2010) appear to | |||||
| * work properly. */ | |||||
| #undef LOL_NO_CONST_MEMBERS_IN_ANONYMOUS_UNIONS | |||||
| #if defined __GNUC__ && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)) | |||||
| # define LOL_NO_CONST_MEMBERS_IN_ANONYMOUS_UNIONS 1 | |||||
| #endif | |||||
| #define DECLARE_VECTOR_TYPEDEFS(tname, suffix) \ | #define DECLARE_VECTOR_TYPEDEFS(tname, suffix) \ | ||||
| template <typename T> struct tname; \ | template <typename T> struct tname; \ | ||||
| typedef tname<half> f16##suffix; \ | typedef tname<half> f16##suffix; \ | ||||
| @@ -128,6 +136,9 @@ template <typename T> struct BVec2 | |||||
| struct { T r, g; }; | struct { T r, g; }; | ||||
| struct { T s, t; }; | struct { T s, t; }; | ||||
| #if LOL_NO_CONST_MEMBERS_IN_ANONYMOUS_UNIONS | |||||
| # define const /* disabled */ | |||||
| #endif | |||||
| XVec2<T,0x00> const xx, rr, ss; | XVec2<T,0x00> const xx, rr, ss; | ||||
| XVec2<T,0x01> const xy, rg, st; /* lvalue */ | XVec2<T,0x01> const xy, rg, st; /* lvalue */ | ||||
| XVec2<T,0x10> const yx, gr, ts; /* lvalue */ | XVec2<T,0x10> const yx, gr, ts; /* lvalue */ | ||||
| @@ -158,6 +169,9 @@ template <typename T> struct BVec2 | |||||
| XVec4<T,0x1101> const yyxy, ggrg, ttst; | XVec4<T,0x1101> const yyxy, ggrg, ttst; | ||||
| XVec4<T,0x1110> const yyyx, gggr, ttts; | XVec4<T,0x1110> const yyyx, gggr, ttts; | ||||
| XVec4<T,0x1111> const yyyy, gggg, tttt; | XVec4<T,0x1111> const yyyy, gggg, tttt; | ||||
| #if LOL_NO_CONST_MEMBERS_IN_ANONYMOUS_UNIONS | |||||
| # undef const | |||||
| #endif | |||||
| }; | }; | ||||
| }; | }; | ||||
| @@ -287,6 +301,9 @@ template <typename T> struct BVec3 | |||||
| struct { T r, g, b; }; | struct { T r, g, b; }; | ||||
| struct { T s, t, p; }; | struct { T s, t, p; }; | ||||
| #if LOL_NO_CONST_MEMBERS_IN_ANONYMOUS_UNIONS | |||||
| # define const /* disabled */ | |||||
| #endif | |||||
| XVec2<T,0x00> const xx, rr, ss; | XVec2<T,0x00> const xx, rr, ss; | ||||
| XVec2<T,0x01> const xy, rg, st; /* lvalue */ | XVec2<T,0x01> const xy, rg, st; /* lvalue */ | ||||
| XVec2<T,0x02> const xz, rb, sp; /* lvalue */ | XVec2<T,0x02> const xz, rb, sp; /* lvalue */ | ||||
| @@ -406,6 +423,9 @@ template <typename T> struct BVec3 | |||||
| XVec4<T,0x2220> const zzzx, bbbr, ppps; | XVec4<T,0x2220> const zzzx, bbbr, ppps; | ||||
| XVec4<T,0x2221> const zzzy, bbbg, pppt; | XVec4<T,0x2221> const zzzy, bbbg, pppt; | ||||
| XVec4<T,0x2222> const zzzz, bbbb, pppp; | XVec4<T,0x2222> const zzzz, bbbb, pppp; | ||||
| #if LOL_NO_CONST_MEMBERS_IN_ANONYMOUS_UNIONS | |||||
| # undef const | |||||
| #endif | |||||
| }; | }; | ||||
| }; | }; | ||||
| @@ -468,6 +488,9 @@ template <typename T> struct BVec4 | |||||
| struct { T r, g, b, a; }; | struct { T r, g, b, a; }; | ||||
| struct { T s, t, p, q; }; | struct { T s, t, p, q; }; | ||||
| #if LOL_NO_CONST_MEMBERS_IN_ANONYMOUS_UNIONS | |||||
| # define const /* disabled */ | |||||
| #endif | |||||
| XVec2<T,0x00> const xx, rr, ss; | XVec2<T,0x00> const xx, rr, ss; | ||||
| XVec2<T,0x01> const xy, rg, st; /* lvalue */ | XVec2<T,0x01> const xy, rg, st; /* lvalue */ | ||||
| XVec2<T,0x02> const xz, rb, sp; /* lvalue */ | XVec2<T,0x02> const xz, rb, sp; /* lvalue */ | ||||
| @@ -806,6 +829,9 @@ template <typename T> struct BVec4 | |||||
| XVec4<T,0x3331> const wwwy, aaag, qqqt; | XVec4<T,0x3331> const wwwy, aaag, qqqt; | ||||
| XVec4<T,0x3332> const wwwz, aaab, qqqp; | XVec4<T,0x3332> const wwwz, aaab, qqqp; | ||||
| XVec4<T,0x3333> const wwww, aaaa, qqqq; | XVec4<T,0x3333> const wwww, aaaa, qqqq; | ||||
| #if LOL_NO_CONST_MEMBERS_IN_ANONYMOUS_UNIONS | |||||
| # undef const | |||||
| #endif | |||||
| }; | }; | ||||
| }; | }; | ||||