00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 #ifndef glm_core_type_gentype2
00030 #define glm_core_type_gentype2
00031 
00032 #include "type_vec.hpp"
00033 #include "type_float.hpp"
00034 #include "type_int.hpp"
00035 #include "type_size.hpp"
00036 #include "_swizzle.hpp"
00037 
00038 namespace glm{
00039 namespace detail
00040 {
00041         template <typename T> struct tref2;
00042         template <typename T> struct tref3;
00043         template <typename T> struct tref4;
00044         template <typename T> struct tvec3;
00045         template <typename T> struct tvec4;
00046 
00047         
00048         
00049         template <typename T>
00050         struct tvec2
00051         {
00052                 enum ctor{null};
00053 
00054                 typedef T value_type;
00055                 typedef std::size_t size_type;
00056                 GLM_FUNC_DECL size_type length() const;
00057 
00058                 typedef tvec2<T> type;
00059                 typedef tvec2<bool> bool_type;
00060 
00062                 
00063 
00064 #       if(GLM_COMPONENT == GLM_COMPONENT_CXX11)
00065                 union 
00066                 {
00067 #               if(defined(GLM_SWIZZLE))
00068                         _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, x, y)
00069                         _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, r, g)
00070                         _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, s, t)
00071                         _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, x, y)
00072                         _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, r, g)
00073                         _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, s, t)
00074                         _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, x, y)
00075                         _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, r, g)
00076                         _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, s, t)
00077 #               endif//(defined(GLM_SWIZZLE))
00078 
00079                         struct{value_type r, g;};
00080                         struct{value_type s, t;};
00081                         struct{value_type x, y;};
00082                 };
00083 #       elif(GLM_COMPONENT == GLM_COMPONENT_CXX98)
00084                 union {value_type x, r, s;};
00085                 union {value_type y, g, t;};
00086 
00087 #               if(defined(GLM_SWIZZLE))
00088                         
00089                         GLM_SWIZZLE_GEN_REF_FROM_VEC2(value_type, detail::tvec2, detail::tref2)
00090                         GLM_SWIZZLE_GEN_VEC_FROM_VEC2(value_type, detail::tvec2, detail::tvec2, detail::tvec3, detail::tvec4)
00091 #               endif//(defined(GLM_SWIZZLE))
00092 #       else //(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
00093                 value_type x, y;
00094 
00095 #               if(defined(GLM_SWIZZLE))
00096                         
00097                         GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(value_type, detail::tvec2, detail::tref2, x, y)
00098                         GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(value_type, detail::tvec2, detail::tvec2, detail::tvec3, detail::tvec4, x, y)
00099 #               endif//(defined(GLM_SWIZZLE))
00100 #       endif//GLM_COMPONENT
00101 
00103                 
00104 
00105                 GLM_FUNC_DECL value_type & operator[](size_type i);
00106                 GLM_FUNC_DECL value_type const & operator[](size_type i) const;
00107 
00109                 
00110 
00111                 GLM_FUNC_DECL tvec2();
00112                 GLM_FUNC_DECL tvec2(tvec2<T> const & v);
00113 
00115                 
00116 
00117                 GLM_FUNC_DECL explicit tvec2(
00118                         ctor);
00119                 GLM_FUNC_DECL explicit tvec2(
00120                         value_type const & s);
00121                 GLM_FUNC_DECL explicit tvec2(
00122                         value_type const & s1, 
00123                         value_type const & s2);
00124 
00126                 
00127 
00128                 tvec2(tref2<T> const & r);
00129 
00130         template <int E0, int E1>
00131         GLM_FUNC_DECL tvec2(const glm::detail::swizzle<2,T,tvec2<T>,E0,E1,-1,-2>& that)
00132         {
00133             *this = that();
00134         }
00135 
00137                 
00138 
00140                 template <typename U> 
00141                 GLM_FUNC_DECL explicit tvec2(
00142                         U const & x);
00144                 template <typename U, typename V> 
00145                 GLM_FUNC_DECL explicit tvec2(
00146                         U const & x, 
00147                         V const & y);
00148 
00150                 
00151 
00153                 template <typename U> 
00154                 GLM_FUNC_DECL explicit tvec2(tvec2<U> const & v);
00156                 template <typename U> 
00157                 GLM_FUNC_DECL explicit tvec2(tvec3<U> const & v);
00159                 template <typename U> 
00160                 GLM_FUNC_DECL explicit tvec2(tvec4<U> const & v);
00161 
00163                 
00164 
00165                 GLM_FUNC_DECL tvec2<T> & operator= (tvec2<T> const & v);
00166                 template <typename U> 
00167                 GLM_FUNC_DECL tvec2<T> & operator= (tvec2<U> const & v);
00168 
00169                 template <typename U> 
00170                 GLM_FUNC_DECL tvec2<T> & operator+=(U const & s);
00171                 template <typename U> 
00172                 GLM_FUNC_DECL tvec2<T> & operator+=(tvec2<U> const & v);
00173                 template <typename U> 
00174                 GLM_FUNC_DECL tvec2<T> & operator-=(U const & s);
00175                 template <typename U> 
00176                 GLM_FUNC_DECL tvec2<T> & operator-=(tvec2<U> const & v);
00177                 template <typename U> 
00178                 GLM_FUNC_DECL tvec2<T> & operator*=(U const & s);
00179                 template <typename U> 
00180                 GLM_FUNC_DECL tvec2<T> & operator*=(tvec2<U> const & v);
00181                 template <typename U> 
00182                 GLM_FUNC_DECL tvec2<T> & operator/=(U const & s);
00183                 template <typename U> 
00184                 GLM_FUNC_DECL tvec2<T> & operator/=(tvec2<U> const & v);
00185                 GLM_FUNC_DECL tvec2<T> & operator++();
00186                 GLM_FUNC_DECL tvec2<T> & operator--();
00187 
00189                 
00190 
00191                 template <typename U> 
00192                 GLM_FUNC_DECL tvec2<T> & operator%= (U const & s);
00193                 template <typename U> 
00194                 GLM_FUNC_DECL tvec2<T> & operator%= (tvec2<U> const & v);
00195                 template <typename U> 
00196                 GLM_FUNC_DECL tvec2<T> & operator&= (U const & s);
00197                 template <typename U> 
00198                 GLM_FUNC_DECL tvec2<T> & operator&= (tvec2<U> const & v);
00199                 template <typename U> 
00200                 GLM_FUNC_DECL tvec2<T> & operator|= (U const & s);
00201                 template <typename U> 
00202                 GLM_FUNC_DECL tvec2<T> & operator|= (tvec2<U> const & v);
00203                 template <typename U> 
00204                 GLM_FUNC_DECL tvec2<T> & operator^= (U const & s);
00205                 template <typename U> 
00206                 GLM_FUNC_DECL tvec2<T> & operator^= (tvec2<U> const & v);
00207                 template <typename U> 
00208                 GLM_FUNC_DECL tvec2<T> & operator<<=(U const & s);
00209                 template <typename U> 
00210                 GLM_FUNC_DECL tvec2<T> & operator<<=(tvec2<U> const & v);
00211                 template <typename U> 
00212                 GLM_FUNC_DECL tvec2<T> & operator>>=(U const & s);
00213                 template <typename U> 
00214                 GLM_FUNC_DECL tvec2<T> & operator>>=(tvec2<U> const & v);
00215 
00217                 
00218 
00219                 GLM_FUNC_DECL value_type swizzle(comp X) const;
00220                 GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const;
00221                 GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const;
00222                 GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
00223                 GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y);
00224         };
00225 
00226         template <typename T>
00227         struct tref2
00228         {
00229                 GLM_FUNC_DECL tref2(T & x, T & y);
00230                 GLM_FUNC_DECL tref2(tref2<T> const & r);
00231                 GLM_FUNC_DECL explicit tref2(tvec2<T> const & v);
00232 
00233                 GLM_FUNC_DECL tref2<T> & operator= (tref2<T> const & r);
00234                 GLM_FUNC_DECL tref2<T> & operator= (tvec2<T> const & v);
00235 
00236                 GLM_FUNC_DECL tvec2<T> operator() ();
00237 
00238                 T & x;
00239                 T & y;
00240         };
00241 
00242         GLM_DETAIL_IS_VECTOR(tvec2);
00243 
00244 } 
00245 
00248 
00254         typedef detail::tvec2<highp_float>              highp_vec2;
00255 
00261         typedef detail::tvec2<mediump_float>    mediump_vec2;
00262 
00268         typedef detail::tvec2<lowp_float>               lowp_vec2;
00269 
00275         typedef detail::tvec2<highp_int>                highp_ivec2;
00276 
00282         typedef detail::tvec2<mediump_int>              mediump_ivec2;
00283 
00289         typedef detail::tvec2<lowp_int>                 lowp_ivec2;
00290         
00296         typedef detail::tvec2<highp_uint>               highp_uvec2;
00297 
00303         typedef detail::tvec2<mediump_uint>             mediump_uvec2;
00304 
00310         typedef detail::tvec2<lowp_uint>                lowp_uvec2;
00311 
00313 }
00314 
00315 #ifndef GLM_EXTERNAL_TEMPLATE
00316 #include "type_vec2.inl"
00317 #endif//GLM_EXTERNAL_TEMPLATE
00318 
00319 #endif//glm_core_type_gentype2