00001
00002
00004
00005
00006
00007
00009
00010 #ifndef glm_core_type_gentype4
00011 #define glm_core_type_gentype4
00012
00013 #include "type_vec.hpp"
00014 #include "type_float.hpp"
00015 #include "type_int.hpp"
00016 #include "type_size.hpp"
00017 #include "_swizzle.hpp"
00018
00019 namespace glm{
00020 namespace detail
00021 {
00022 template <typename T> struct tref2;
00023 template <typename T> struct tref3;
00024 template <typename T> struct tref4;
00025 template <typename T> struct tvec2;
00026 template <typename T> struct tvec3;
00027
00030 template <typename T>
00031 struct tvec4
00032 {
00033 enum ctor{null};
00034
00035 typedef T value_type;
00036 typedef std::size_t size_type;
00037 GLM_FUNC_DECL size_type length() const;
00038 static GLM_FUNC_DECL size_type value_size();
00039
00040 typedef tvec4<T> type;
00041 typedef tvec4<bool> bool_type;
00042
00044
00045
00046 # if(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
00047 value_type x, y, z, w;
00048 # elif(GLM_COMPONENT == GLM_COMPONENT_MS_EXT)
00049 union
00050 {
00051 struct{value_type r, g, b, a;};
00052 struct{value_type s, t, p, q;};
00053 struct{value_type x, y, z, w;};
00054 };
00055 # else//(GLM_COMPONENT == GLM_COMPONENT_GLSL_NAMES)
00056 union {value_type x, r, s;};
00057 union {value_type y, g, t;};
00058 union {value_type z, b, p;};
00059 union {value_type w, a, q;};
00060 # endif//GLM_COMPONENT
00061
00063
00064
00065 GLM_FUNC_DECL value_type & operator[](size_type i);
00066 GLM_FUNC_DECL value_type const & operator[](size_type i) const;
00067
00069
00070
00071 GLM_FUNC_DECL tvec4();
00072 GLM_FUNC_DECL tvec4(type const & v);
00073
00075
00076
00077 GLM_FUNC_DECL explicit tvec4(
00078 ctor);
00079 GLM_FUNC_DECL explicit tvec4(
00080 value_type const & s);
00081 GLM_FUNC_DECL explicit tvec4(
00082 value_type const & s0,
00083 value_type const & s1,
00084 value_type const & s2,
00085 value_type const & s3);
00086
00088
00089
00091 template <typename U>
00092 GLM_FUNC_DECL explicit tvec4(
00093 U const & x);
00095 template <typename A, typename B, typename C, typename D>
00096 GLM_FUNC_DECL explicit tvec4(
00097 A const & x,
00098 B const & y,
00099 C const & z,
00100 D const & w);
00101
00103
00104
00106 template <typename A, typename B, typename C>
00107 GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v, B const & s1, C const & s2);
00109 template <typename A, typename B, typename C>
00110 GLM_FUNC_DECL explicit tvec4(A const & s1, tvec2<B> const & v, C const & s2);
00112 template <typename A, typename B, typename C>
00113 GLM_FUNC_DECL explicit tvec4(A const & s1, B const & s2, tvec2<C> const & v);
00115 template <typename A, typename B>
00116 GLM_FUNC_DECL explicit tvec4(tvec3<A> const & v, B const & s);
00118 template <typename A, typename B>
00119 GLM_FUNC_DECL explicit tvec4(A const & s, tvec3<B> const & v);
00121 template <typename A, typename B>
00122 GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v1, tvec2<B> const & v2);
00124 template <typename U>
00125 GLM_FUNC_DECL explicit tvec4(tvec4<U> const & v);
00126
00128
00129
00130 GLM_FUNC_DECL tvec4(tref4<T> const & r);
00131
00133 template <typename A, typename B, typename C>
00134 GLM_FUNC_DECL explicit tvec4(tref2<A> const & v, B const & s1, C const & s2);
00136 template <typename A, typename B, typename C>
00137 GLM_FUNC_DECL explicit tvec4(A const & s1, tref2<B> const & v, C const & s2);
00139 template <typename A, typename B, typename C>
00140 GLM_FUNC_DECL explicit tvec4(A const & s1, B const & s2, tref2<C> const & v);
00142 template <typename A, typename B>
00143 GLM_FUNC_DECL explicit tvec4(tref3<A> const & v, B const & s);
00145 template <typename A, typename B>
00146 GLM_FUNC_DECL explicit tvec4(A const & s, tref3<B> const & v);
00148 template <typename A, typename B>
00149 GLM_FUNC_DECL explicit tvec4(tref2<A> const & v1, tref2<B> const & v2);
00151 template <typename A, typename B>
00152 GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v1, tref2<B> const & v2);
00154 template <typename A, typename B>
00155 GLM_FUNC_DECL explicit tvec4(tref2<A> const & v1, tvec2<B> const & v2);
00156
00158
00159
00160 GLM_FUNC_DECL tvec4<T> & operator= (tvec4<T> const & v);
00161 template <typename U>
00162 GLM_FUNC_DECL tvec4<T> & operator= (tvec4<U> const & v);
00163
00164 template <typename U>
00165 GLM_FUNC_DECL tvec4<T> & operator+=(U const & s);
00166 template <typename U>
00167 GLM_FUNC_DECL tvec4<T> & operator+=(tvec4<U> const & v);
00168 template <typename U>
00169 GLM_FUNC_DECL tvec4<T> & operator-=(U const & s);
00170 template <typename U>
00171 GLM_FUNC_DECL tvec4<T> & operator-=(tvec4<U> const & v);
00172 template <typename U>
00173 GLM_FUNC_DECL tvec4<T> & operator*=(U const & s);
00174 template <typename U>
00175 GLM_FUNC_DECL tvec4<T> & operator*=(tvec4<U> const & v);
00176 template <typename U>
00177 GLM_FUNC_DECL tvec4<T> & operator/=(U const & s);
00178 template <typename U>
00179 GLM_FUNC_DECL tvec4<T> & operator/=(tvec4<U> const & v);
00180 GLM_FUNC_DECL tvec4<T> & operator++();
00181 GLM_FUNC_DECL tvec4<T> & operator--();
00182
00184
00185
00186 template <typename U>
00187 GLM_FUNC_DECL tvec4<T> & operator%= (U const & s);
00188 template <typename U>
00189 GLM_FUNC_DECL tvec4<T> & operator%= (tvec4<U> const & v);
00190 template <typename U>
00191 GLM_FUNC_DECL tvec4<T> & operator&= (U const & s);
00192 template <typename U>
00193 GLM_FUNC_DECL tvec4<T> & operator&= (tvec4<U> const & v);
00194 template <typename U>
00195 GLM_FUNC_DECL tvec4<T> & operator|= (U const & s);
00196 template <typename U>
00197 GLM_FUNC_DECL tvec4<T> & operator|= (tvec4<U> const & v);
00198 template <typename U>
00199 GLM_FUNC_DECL tvec4<T> & operator^= (U const & s);
00200 template <typename U>
00201 GLM_FUNC_DECL tvec4<T> & operator^= (tvec4<U> const & v);
00202 template <typename U>
00203 GLM_FUNC_DECL tvec4<T> & operator<<=(U const & s);
00204 template <typename U>
00205 GLM_FUNC_DECL tvec4<T> & operator<<=(tvec4<U> const & v);
00206 template <typename U>
00207 GLM_FUNC_DECL tvec4<T> & operator>>=(U const & s);
00208 template <typename U>
00209 GLM_FUNC_DECL tvec4<T> & operator>>=(tvec4<U> const & v);
00210
00212
00213
00214 GLM_FUNC_DECL value_type swizzle(comp X) const;
00215 GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const;
00216 GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const;
00217 GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
00218 GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y);
00219 GLM_FUNC_DECL tref3<T> swizzle(comp X, comp Y, comp Z);
00220 GLM_FUNC_DECL tref4<T> swizzle(comp X, comp Y, comp Z, comp W);
00221 };
00222
00223 template <typename T>
00224 struct tref4
00225 {
00226 GLM_FUNC_DECL tref4(T & x, T & y, T & z, T & w);
00227 GLM_FUNC_DECL tref4(tref4<T> const & r);
00228 GLM_FUNC_DECL tref4(tvec4<T> const & v);
00229
00230 GLM_FUNC_DECL tref4<T> & operator= (tref4<T> const & r);
00231 GLM_FUNC_DECL tref4<T> & operator= (tvec4<T> const & v);
00232
00233 GLM_FUNC_DECL tvec4<T> operator() ();
00234
00235 T & x;
00236 T & y;
00237 T & z;
00238 T & w;
00239 };
00240
00241 GLM_DETAIL_IS_VECTOR(tvec4);
00242 }
00243
00244 namespace core{
00245 namespace type{
00246 namespace precision
00247 {
00252 typedef detail::tvec4<highp_float> highp_vec4;
00253
00258 typedef detail::tvec4<mediump_float> mediump_vec4;
00259
00264 typedef detail::tvec4<lowp_float> lowp_vec4;
00265
00270 typedef detail::tvec4<highp_int> highp_ivec4;
00271
00276 typedef detail::tvec4<mediump_int> mediump_ivec4;
00277
00282 typedef detail::tvec4<lowp_int> lowp_ivec4;
00283
00288 typedef detail::tvec4<highp_uint> highp_uvec4;
00289
00294 typedef detail::tvec4<mediump_uint> mediump_uvec4;
00295
00300 typedef detail::tvec4<lowp_uint> lowp_uvec4;
00301
00302 }
00303 }
00304 }
00305 }
00306
00307 #ifndef GLM_EXTERNAL_TEMPLATE
00308 #include "type_vec4.inl"
00309 #endif//GLM_EXTERNAL_TEMPLATE
00310
00311 #endif//glm_core_type_gentype4