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 {
00021 namespace test
00022 {
00023 void main_vec4();
00024 }
00025
00026 namespace detail
00027 {
00028 template <typename T> struct tref2;
00029 template <typename T> struct tref3;
00030 template <typename T> struct tref4;
00031 template <typename T> struct tvec2;
00032 template <typename T> struct tvec3;
00033
00036 template <typename T>
00037 struct tvec4
00038 {
00039 enum ctor{null};
00040
00041 typedef T value_type;
00042 typedef std::size_t size_type;
00043 static size_type value_size();
00044
00045 typedef tvec4<T> type;
00046 typedef tvec4<bool> bool_type;
00047
00049
00050
00051 # if(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
00052 value_type x, y, z, w;
00053 # elif(GLM_COMPONENT == GLM_COMPONENT_MS_EXT)
00054 union
00055 {
00056 struct{value_type x, y, z, w;};
00057 struct{value_type r, g, b, a;};
00058 struct{value_type s, t, p, q;};
00059 };
00060 # else//(GLM_COMPONENT == GLM_COMPONENT_GLSL_NAMES)
00061 union {value_type x, r, s;};
00062 union {value_type y, g, t;};
00063 union {value_type z, b, p;};
00064 union {value_type w, a, q;};
00065 # endif//GLM_COMPONENT
00066
00068
00069
00070 value_type & operator[](size_type i);
00071 value_type const & operator[](size_type i) const;
00072
00074
00075
00076 tvec4();
00077 tvec4(type const & v);
00078
00080
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
00094
00095 tvec4(tref4<T> const & r);
00096
00098
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
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
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
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
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
00217 GLM_DETAIL_IS_VECTOR(tvec4);
00218 }
00219
00220 namespace core{
00221 namespace type{
00222
00224
00225
00226 namespace precision
00227 {
00232 typedef detail::tvec4<highp_float> highp_vec4;
00237 typedef detail::tvec4<mediump_float> mediump_vec4;
00242 typedef detail::tvec4<lowp_float> lowp_vec4;
00243
00248 typedef detail::tvec4<highp_int> highp_ivec4;
00253 typedef detail::tvec4<mediump_int> mediump_ivec4;
00258 typedef detail::tvec4<lowp_int> lowp_ivec4;
00259
00264 typedef detail::tvec4<highp_uint> highp_uvec4;
00269 typedef detail::tvec4<mediump_uint> mediump_uvec4;
00274 typedef detail::tvec4<lowp_uint> lowp_uvec4;
00275 }
00276
00277
00278 }
00279 }
00280
00281 using namespace core::type;
00282
00283 }
00284
00285 #ifndef GLM_EXTERNAL_TEMPLATE
00286 #include "type_vec4.inl"
00287 #endif
00288
00289 #endif//glm_core_type_gentype4