GLM Version 0.9.0
|
00001 00002 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) 00004 // Created : 2008-08-22 00005 // Updated : 2010-02-03 00006 // Licence : This source is under MIT License 00007 // File : glm/core/type_tvec4.hpp 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 #include "_detail.hpp" 00019 00020 namespace glm 00021 { 00022 namespace test 00023 { 00024 void main_vec4(); 00025 }//namespace test 00026 00027 namespace detail 00028 { 00029 template <typename T> struct tref2; 00030 template <typename T> struct tref3; 00031 template <typename T> struct tref4; 00032 template <typename T> struct tvec2; 00033 template <typename T> struct tvec3; 00034 00035 template <typename T> 00036 struct tvec4 00037 { 00038 enum ctor{null}; 00039 typedef T value_type; 00040 typedef std::size_t size_type; 00041 static size_type value_size(); 00042 00043 typedef tvec4<T> type; 00044 typedef tvec4<bool> bool_type; 00045 00047 // Data 00048 00049 # if defined(GLM_USE_ONLY_XYZW) 00050 value_type x, y, z, w; 00051 # else//GLM_USE_ONLY_XYZW 00052 # ifdef GLM_USE_ANONYMOUS_UNION 00053 union 00054 { 00055 struct{value_type x, y, z, w;}; 00056 struct{value_type r, g, b, a;}; 00057 struct{value_type s, t, p, q;}; 00058 }; 00059 # else//GLM_USE_ANONYMOUS_UNION 00060 union {value_type x, r, s;}; 00061 union {value_type y, g, t;}; 00062 union {value_type z, b, p;}; 00063 union {value_type w, a, q;}; 00064 # endif//GLM_USE_ANONYMOUS_UNION 00065 # endif//GLM_USE_ONLY_XYZW 00066 00068 // Accesses 00069 00070 value_type & operator[](size_type i); 00071 value_type const & operator[](size_type i) const; 00072 00074 // Implicit basic constructors 00075 00076 tvec4(); 00077 tvec4(type const & v); 00078 00080 // Explicit basic constructors 00081 00082 explicit tvec4( 00083 ctor); 00084 explicit tvec4( 00085 value_type const & s); 00086 explicit tvec4( 00087 value_type const & s0, 00088 value_type const & s1, 00089 value_type const & s2, 00090 value_type const & s3); 00091 00093 // Swizzle constructors 00094 00095 tvec4(tref4<T> const & r); 00096 00098 // Convertion scalar constructors 00099 00101 template <typename U> 00102 explicit tvec4( 00103 U const & x); 00105 template <typename A, typename B, typename C, typename D> 00106 explicit tvec4( 00107 A const & x, 00108 B const & y, 00109 C const & z, 00110 D const & w); 00111 00113 // Convertion vector constructors 00114 00116 template <typename A, typename B, typename C> 00117 explicit tvec4(tvec2<A> const & v, B const & s1, C const & s2); 00119 template <typename A, typename B, typename C> 00120 explicit tvec4(A const & s1, tvec2<B> const & v, C const & s2); 00122 template <typename A, typename B, typename C> 00123 explicit tvec4(A const & s1, B const & s2, tvec2<C> const & v); 00125 template <typename A, typename B> 00126 explicit tvec4(tvec3<A> const & v, B const & s); 00128 template <typename A, typename B> 00129 explicit tvec4(A const & s, tvec3<B> const & v); 00131 template <typename A, typename B> 00132 explicit tvec4(tvec2<A> const & v1, tvec2<B> const & v2); 00134 template <typename U> 00135 explicit tvec4(tvec4<U> const & v); 00136 00138 // Unary arithmetic operators 00139 00140 tvec4<T> & operator= (tvec4<T> const & v); 00141 template <typename U> 00142 tvec4<T> & operator= (tvec4<U> const & v); 00143 00144 template <typename U> 00145 tvec4<T> & operator+=(U const & s); 00146 template <typename U> 00147 tvec4<T> & operator+=(tvec4<U> const & v); 00148 template <typename U> 00149 tvec4<T> & operator-=(U const & s); 00150 template <typename U> 00151 tvec4<T> & operator-=(tvec4<U> const & v); 00152 template <typename U> 00153 tvec4<T> & operator*=(U const & s); 00154 template <typename U> 00155 tvec4<T> & operator*=(tvec4<U> const & v); 00156 template <typename U> 00157 tvec4<T> & operator/=(U const & s); 00158 template <typename U> 00159 tvec4<T> & operator/=(tvec4<U> const & v); 00160 tvec4<T> & operator++(); 00161 tvec4<T> & operator--(); 00162 00164 // Unary bit operators 00165 00166 template <typename U> 00167 tvec4<T> & operator%= (U const & s); 00168 template <typename U> 00169 tvec4<T> & operator%= (tvec4<U> const & v); 00170 template <typename U> 00171 tvec4<T> & operator&= (U const & s); 00172 template <typename U> 00173 tvec4<T> & operator&= (tvec4<U> const & v); 00174 template <typename U> 00175 tvec4<T> & operator|= (U const & s); 00176 template <typename U> 00177 tvec4<T> & operator|= (tvec4<U> const & v); 00178 template <typename U> 00179 tvec4<T> & operator^= (U const & s); 00180 template <typename U> 00181 tvec4<T> & operator^= (tvec4<U> const & v); 00182 template <typename U> 00183 tvec4<T> & operator<<=(U const & s); 00184 template <typename U> 00185 tvec4<T> & operator<<=(tvec4<U> const & v); 00186 template <typename U> 00187 tvec4<T> & operator>>=(U const & s); 00188 template <typename U> 00189 tvec4<T> & operator>>=(tvec4<U> const & v); 00190 00192 // Swizzle operators 00193 00194 value_type swizzle(comp X) const; 00195 tvec2<T> swizzle(comp X, comp Y) const; 00196 tvec3<T> swizzle(comp X, comp Y, comp Z) const; 00197 tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const; 00198 tref4<T> swizzle(comp X, comp Y, comp Z, comp W); 00199 }; 00200 00201 template <typename T> 00202 struct tref4 00203 { 00204 tref4(T & x, T & y, T & z, T & w); 00205 tref4(tref4<T> const & r); 00206 tref4(tvec4<T> const & v); 00207 00208 tref4<T> & operator= (tref4<T> const & r); 00209 tref4<T> & operator= (tvec4<T> const & v); 00210 00211 T & x; 00212 T & y; 00213 T & z; 00214 T & w; 00215 }; 00216 } //namespace detail 00217 00218 namespace core{ 00219 namespace type{ 00220 00222 // Float definition 00223 00224 namespace precision 00225 { 00229 typedef detail::tvec4<highp_float> highp_vec4; 00233 typedef detail::tvec4<mediump_float> mediump_vec4; 00237 typedef detail::tvec4<lowp_float> lowp_vec4; 00238 00242 typedef detail::tvec4<highp_int> highp_ivec4; 00246 typedef detail::tvec4<mediump_int> mediump_ivec4; 00250 typedef detail::tvec4<lowp_int> lowp_ivec4; 00251 00255 typedef detail::tvec4<highp_uint> highp_uvec4; 00259 typedef detail::tvec4<mediump_uint> mediump_uvec4; 00263 typedef detail::tvec4<lowp_uint> lowp_uvec4; 00264 } 00265 //namespace precision 00266 00267 }//namespace type 00268 }//namespace core 00269 00270 using namespace core::type; 00271 00272 }//namespace glm 00273 00274 #include "type_vec4.inl" 00275 00276 #endif//glm_core_type_gentype4