00001
00002
00004
00005
00006
00007
00009
00010 #ifndef glm_core_type_gentype3
00011 #define glm_core_type_gentype3
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_vec3();
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 tvec4;
00033
00036 template <typename T>
00037 struct tvec3
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 tvec3<T> type;
00046 typedef tvec3<bool> bool_type;
00047
00049
00050
00051 # if(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
00052 value_type x, y, z;
00053 # elif(GLM_COMPONENT == GLM_COMPONENT_MS_EXT)
00054 union
00055 {
00056 struct{value_type x, y, z;};
00057 struct{value_type r, g, b;};
00058 struct{value_type s, t, p;};
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 # endif//GLM_COMPONENT
00065
00067
00068
00069 value_type & operator[](size_type i);
00070 value_type const & operator[](size_type i) const;
00071
00073
00074
00075 tvec3();
00076 tvec3(tvec3<T> const & v);
00077
00079
00080
00081 explicit tvec3(
00082 ctor);
00083 explicit tvec3(
00084 value_type const & s);
00085 explicit tvec3(
00086 value_type const & s1,
00087 value_type const & s2,
00088 value_type const & s3);
00089
00091
00092
00093 tvec3(tref3<T> const & r);
00094
00096
00097
00099 template <typename U>
00100 explicit tvec3(
00101 U const & x);
00103 template <typename U, typename V, typename W>
00104 explicit tvec3(
00105 U const & x,
00106 V const & y,
00107 W const & z);
00108
00110
00111
00113 template <typename A, typename B>
00114 explicit tvec3(tvec2<A> const & v, B const & s);
00116 template <typename A, typename B>
00117 explicit tvec3(A const & s, tvec2<B> const & v);
00119 template <typename U>
00120 explicit tvec3(tvec3<U> const & v);
00122 template <typename U>
00123 explicit tvec3(tvec4<U> const & v);
00124
00126
00127
00128 tvec3<T> & operator= (tvec3<T> const & v);
00129 template <typename U>
00130 tvec3<T> & operator= (tvec3<U> const & v);
00131
00132 template <typename U>
00133 tvec3<T> & operator+=(U const & s);
00134 template <typename U>
00135 tvec3<T> & operator+=(tvec3<U> const & v);
00136 template <typename U>
00137 tvec3<T> & operator-=(U const & s);
00138 template <typename U>
00139 tvec3<T> & operator-=(tvec3<U> const & v);
00140 template <typename U>
00141 tvec3<T> & operator*=(U const & s);
00142 template <typename U>
00143 tvec3<T> & operator*=(tvec3<U> const & v);
00144 template <typename U>
00145 tvec3<T> & operator/=(U const & s);
00146 template <typename U>
00147 tvec3<T> & operator/=(tvec3<U> const & v);
00148 tvec3<T> & operator++();
00149 tvec3<T> & operator--();
00150
00152
00153
00154 template <typename U>
00155 tvec3<T> & operator%= (U const & s);
00156 template <typename U>
00157 tvec3<T> & operator%= (tvec3<U> const & v);
00158 template <typename U>
00159 tvec3<T> & operator&= (U const & s);
00160 template <typename U>
00161 tvec3<T> & operator&= (tvec3<U> const & v);
00162 template <typename U>
00163 tvec3<T> & operator|= (U const & s);
00164 template <typename U>
00165 tvec3<T> & operator|= (tvec3<U> const & v);
00166 template <typename U>
00167 tvec3<T> & operator^= (U const & s);
00168 template <typename U>
00169 tvec3<T> & operator^= (tvec3<U> const & v);
00170 template <typename U>
00171 tvec3<T> & operator<<=(U const & s);
00172 template <typename U>
00173 tvec3<T> & operator<<=(tvec3<U> const & v);
00174 template <typename U>
00175 tvec3<T> & operator>>=(U const & s);
00176 template <typename U>
00177 tvec3<T> & operator>>=(tvec3<U> const & v);
00178
00180
00181
00182 value_type swizzle(comp X) const;
00183 tvec2<T> swizzle(comp X, comp Y) const;
00184 tvec3<T> swizzle(comp X, comp Y, comp Z) const;
00185 tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
00186 tref3<T> swizzle(comp X, comp Y, comp Z);
00187 };
00188
00189 template <typename T>
00190 struct tref3
00191 {
00192 tref3(T & x, T & y, T & z);
00193 tref3(tref3<T> const & r);
00194 tref3(tvec3<T> const & v);
00195
00196 tref3<T> & operator= (tref3<T> const & r);
00197 tref3<T> & operator= (tvec3<T> const & v);
00198
00199 T & x;
00200 T & y;
00201 T & z;
00202 };
00203
00204 GLM_DETAIL_IS_VECTOR(tvec3);
00205 }
00206
00207 namespace core{
00208 namespace type{
00209
00210 namespace precision
00211 {
00216 typedef detail::tvec3<highp_float> highp_vec3;
00221 typedef detail::tvec3<mediump_float> mediump_vec3;
00226 typedef detail::tvec3<lowp_float> lowp_vec3;
00227
00232 typedef detail::tvec3<highp_int> highp_ivec3;
00237 typedef detail::tvec3<mediump_int> mediump_ivec3;
00242 typedef detail::tvec3<lowp_int> lowp_ivec3;
00243
00248 typedef detail::tvec3<highp_uint> highp_uvec3;
00253 typedef detail::tvec3<mediump_uint> mediump_uvec3;
00258 typedef detail::tvec3<lowp_uint> lowp_uvec3;
00259 }
00260
00261
00262 }
00263 }
00264 }
00265
00266 #ifndef GLM_EXTERNAL_TEMPLATE
00267 #include "type_vec3.inl"
00268 #endif
00269
00270 #endif//glm_core_type_gentype3