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_gentype3
00030 #define glm_core_type_gentype3
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 tvec2;
00045 template <typename T> struct tvec4;
00046
00049 template <typename T>
00050 struct tvec3
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 static GLM_FUNC_DECL size_type value_size();
00058
00059 typedef tvec3<T> type;
00060 typedef tvec3<bool> bool_type;
00061
00063
00064
00065 # if(GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() && !defined(GLM_FORCE_ONLY_XYZW))
00066 union
00067 {
00068 # if(defined(GLM_SWIZZLE))
00069 _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, x, y, z)
00070 _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, r, g, b)
00071 _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, s, t, p)
00072 _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, x, y, z)
00073 _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, r, g, b)
00074 _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, s, t, p)
00075 _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, x, y, z)
00076 _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, r, g, b)
00077 _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, s, t, p)
00078 # endif//(defined(GLM_SWIZZLE))
00079
00080 struct{value_type r, g, b;};
00081 struct{value_type s, t, p;};
00082 struct{value_type x, y, z;};
00083 };
00084 # elif(GLM_SUPPORT_ANONYMOUS_UNION() && !defined(GLM_FORCE_ONLY_XYZW))
00085 union {value_type x, r, s;};
00086 union {value_type y, g, t;};
00087 union {value_type z, b, p;};
00088
00089 # if(defined(GLM_SWIZZLE))
00090
00091 GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, detail::tvec3, detail::tref2, detail::tref3)
00092 GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, detail::tvec3, detail::tvec2, detail::tvec3, detail::tvec4)
00093 # endif//(defined(GLM_SWIZZLE))
00094 # else
00095 value_type x, y, z;
00096
00097 # if(defined(GLM_SWIZZLE))
00098
00099 GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, detail::tvec3, detail::tref2, detail::tref3, x, y, z)
00100 GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, detail::tvec3, detail::tvec2, detail::tvec3, detail::tvec4, x, y, z)
00101 # endif//(defined(GLM_SWIZZLE))
00102 # endif//GLM_COMPONENT
00103
00105
00106
00107 GLM_FUNC_DECL value_type & operator[](size_type i);
00108 GLM_FUNC_DECL value_type const & operator[](size_type i) const;
00109
00111
00112
00113 GLM_FUNC_DECL tvec3();
00114 GLM_FUNC_DECL tvec3(tvec3<T> const & v);
00115
00117
00118
00119 GLM_FUNC_DECL explicit tvec3(
00120 ctor);
00121 GLM_FUNC_DECL explicit tvec3(
00122 value_type const & s);
00123 GLM_FUNC_DECL explicit tvec3(
00124 value_type const & s1,
00125 value_type const & s2,
00126 value_type const & s3);
00127
00129
00130
00132 template <typename U>
00133 GLM_FUNC_DECL explicit tvec3(
00134 U const & x);
00136 template <typename U, typename V, typename W>
00137 GLM_FUNC_DECL explicit tvec3(
00138 U const & x,
00139 V const & y,
00140 W const & z);
00141
00143
00144
00146 template <typename A, typename B>
00147 GLM_FUNC_DECL explicit tvec3(tvec2<A> const & v, B const & s);
00149 template <typename A, typename B>
00150 GLM_FUNC_DECL explicit tvec3(A const & s, tvec2<B> const & v);
00152 template <typename U>
00153 GLM_FUNC_DECL explicit tvec3(tvec3<U> const & v);
00155 template <typename U>
00156 GLM_FUNC_DECL explicit tvec3(tvec4<U> const & v);
00157
00159
00160
00161 GLM_FUNC_DECL tvec3(tref3<T> const & r);
00162
00163 template <typename A, typename B>
00164 GLM_FUNC_DECL explicit tvec3(tref2<A> const & v, B const & s);
00165
00166 template <typename A, typename B>
00167 GLM_FUNC_DECL explicit tvec3(A const & s, tref2<B> const & v);
00168
00169 template <int E0, int E1, int E2>
00170 GLM_FUNC_DECL tvec3(glm::detail::swizzle<3, T, tvec3<T>, E0, E1, E2, -1> const & that)
00171 {
00172 *this = that();
00173 }
00174
00175 template <int E0, int E1>
00176 GLM_FUNC_DECL tvec3(glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, T const & s)
00177 {
00178 *this = tvec3<T>(v(), s);
00179 }
00180
00181 template <int E0, int E1>
00182 GLM_FUNC_DECL tvec3(T const & s, glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v)
00183 {
00184 *this = tvec3<T>(s, v());
00185 }
00186
00188
00189
00190 GLM_FUNC_DECL tvec3<T> & operator= (tvec3<T> const & v);
00191 template <typename U>
00192 GLM_FUNC_DECL tvec3<T> & operator= (tvec3<U> const & v);
00193
00194 template <typename U>
00195 GLM_FUNC_DECL tvec3<T> & operator+=(U const & s);
00196 template <typename U>
00197 GLM_FUNC_DECL tvec3<T> & operator+=(tvec3<U> const & v);
00198 template <typename U>
00199 GLM_FUNC_DECL tvec3<T> & operator-=(U const & s);
00200 template <typename U>
00201 GLM_FUNC_DECL tvec3<T> & operator-=(tvec3<U> const & v);
00202 template <typename U>
00203 GLM_FUNC_DECL tvec3<T> & operator*=(U const & s);
00204 template <typename U>
00205 GLM_FUNC_DECL tvec3<T> & operator*=(tvec3<U> const & v);
00206 template <typename U>
00207 GLM_FUNC_DECL tvec3<T> & operator/=(U const & s);
00208 template <typename U>
00209 GLM_FUNC_DECL tvec3<T> & operator/=(tvec3<U> const & v);
00210 GLM_FUNC_DECL tvec3<T> & operator++();
00211 GLM_FUNC_DECL tvec3<T> & operator--();
00212
00214
00215
00216 template <typename U>
00217 GLM_FUNC_DECL tvec3<T> & operator%= (U const & s);
00218 template <typename U>
00219 GLM_FUNC_DECL tvec3<T> & operator%= (tvec3<U> const & v);
00220 template <typename U>
00221 GLM_FUNC_DECL tvec3<T> & operator&= (U const & s);
00222 template <typename U>
00223 GLM_FUNC_DECL tvec3<T> & operator&= (tvec3<U> const & v);
00224 template <typename U>
00225 GLM_FUNC_DECL tvec3<T> & operator|= (U const & s);
00226 template <typename U>
00227 GLM_FUNC_DECL tvec3<T> & operator|= (tvec3<U> const & v);
00228 template <typename U>
00229 GLM_FUNC_DECL tvec3<T> & operator^= (U const & s);
00230 template <typename U>
00231 GLM_FUNC_DECL tvec3<T> & operator^= (tvec3<U> const & v);
00232 template <typename U>
00233 GLM_FUNC_DECL tvec3<T> & operator<<=(U const & s);
00234 template <typename U>
00235 GLM_FUNC_DECL tvec3<T> & operator<<=(tvec3<U> const & v);
00236 template <typename U>
00237 GLM_FUNC_DECL tvec3<T> & operator>>=(U const & s);
00238 template <typename U>
00239 GLM_FUNC_DECL tvec3<T> & operator>>=(tvec3<U> const & v);
00240
00242
00243
00244 GLM_FUNC_DECL value_type swizzle(comp X) const;
00245 GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const;
00246 GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const;
00247 GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
00248 GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y);
00249 GLM_FUNC_DECL tref3<T> swizzle(comp X, comp Y, comp Z);
00250 };
00251
00252 template <typename T>
00253 struct tref3
00254 {
00255 GLM_FUNC_DECL tref3(T & x, T & y, T & z);
00256 GLM_FUNC_DECL tref3(tref3<T> const & r);
00257 GLM_FUNC_DECL explicit tref3(tvec3<T> const & v);
00258
00259 GLM_FUNC_DECL tref3<T> & operator= (tref3<T> const & r);
00260 GLM_FUNC_DECL tref3<T> & operator= (tvec3<T> const & v);
00261
00262 GLM_FUNC_DECL tvec3<T> operator() ();
00263
00264 T & x;
00265 T & y;
00266 T & z;
00267 };
00268
00269 GLM_DETAIL_IS_VECTOR(tvec3);
00270 }
00271
00276 typedef detail::tvec3<highp_float> highp_vec3;
00277
00282 typedef detail::tvec3<mediump_float> mediump_vec3;
00283
00288 typedef detail::tvec3<lowp_float> lowp_vec3;
00289
00294 typedef detail::tvec3<highp_int> highp_ivec3;
00295
00300 typedef detail::tvec3<mediump_int> mediump_ivec3;
00301
00306 typedef detail::tvec3<lowp_int> lowp_ivec3;
00307
00312 typedef detail::tvec3<highp_uint> highp_uvec3;
00313
00318 typedef detail::tvec3<mediump_uint> mediump_uvec3;
00319
00324 typedef detail::tvec3<lowp_uint> lowp_uvec3;
00325
00326 }
00327
00328 #ifndef GLM_EXTERNAL_TEMPLATE
00329 #include "type_vec3.inl"
00330 #endif//GLM_EXTERNAL_TEMPLATE
00331
00332 #endif//glm_core_type_gentype3