1 /////////////////////////////////////////////////////////////////////////////////// 2 /// OpenGL Mathematics (glm.g-truc.net) 3 /// 4 /// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net) 5 /// Permission is hereby granted, free of charge, to any person obtaining a copy 6 /// of this software and associated documentation files (the "Software"), to deal 7 /// in the Software without restriction, including without limitation the rights 8 /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 /// copies of the Software, and to permit persons to whom the Software is 10 /// furnished to do so, subject to the following conditions: 11 /// 12 /// The above copyright notice and this permission notice shall be included in 13 /// all copies or substantial portions of the Software. 14 /// 15 /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 /// THE SOFTWARE. 22 /// 23 /// @ref core 24 /// @file glm/core/type_vec2.hpp 25 /// @date 2008-08-18 / 2013-08-27 26 /// @author Christophe Riccio 27 /////////////////////////////////////////////////////////////////////////////////// 28 29 #ifndef glm_core_type_gentype2 30 #define glm_core_type_gentype2 31 32 //#include "../fwd.hpp" 33 #include "type_vec.hpp" 34 #ifdef GLM_SWIZZLE 35 # if GLM_HAS_ANONYMOUS_UNION 36 # include "_swizzle.hpp" 37 # else 38 # include "_swizzle_func.hpp" 39 # endif 40 #endif //GLM_SWIZZLE 41 #include <cstddef> 42 43 namespace glm{ 44 namespace detail 45 { 46 template <typename T, precision P> 47 struct tvec2 48 { 49 ////////////////////////////////////// 50 // Implementation detail 51 52 enum ctor{_null}; 53 54 typedef tvec2<T, P> type; 55 typedef tvec2<bool, P> bool_type; 56 typedef T value_type; 57 typedef int size_type; 58 59 ////////////////////////////////////// 60 // Helper 61 62 GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const; 63 64 ////////////////////////////////////// 65 // Data 66 67 # if(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)) 68 union 69 { 70 struct{ T x, y; }; 71 struct{ T r, g; }; 72 struct{ T s, t; }; 73 74 _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, x, y) 75 _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, r, g) 76 _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, s, t) 77 _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, x, y) 78 _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, r, g) 79 _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, s, t) 80 _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, x, y) 81 _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, r, g) 82 _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, s, t) 83 }; 84 # else 85 union {T x, r, s;}; 86 union {T y, g, t;}; 87 88 # ifdef GLM_SWIZZLE 89 GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P, detail::tvec2, detail::tvec2, detail::tvec3, detail::tvec4) 90 # endif 91 # endif 92 93 ////////////////////////////////////// 94 // Accesses 95 96 GLM_FUNC_DECL T & operator[](length_t i); 97 GLM_FUNC_DECL T const & operator[](length_t i) const; 98 99 ////////////////////////////////////// 100 // Implicit basic constructors 101 102 GLM_FUNC_DECL tvec2(); 103 GLM_FUNC_DECL tvec2(tvec2<T, P> const & v); 104 template <precision Q> 105 GLM_FUNC_DECL tvec2(tvec2<T, Q> const & v); 106 107 ////////////////////////////////////// 108 // Explicit basic constructors 109 110 GLM_FUNC_DECL explicit tvec2( 111 ctor); 112 GLM_FUNC_DECL explicit tvec2( 113 T const & s); 114 GLM_FUNC_DECL tvec2( 115 T const & s1, 116 T const & s2); 117 118 ////////////////////////////////////// 119 // Swizzle constructors 120 121 # if(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)) 122 template <int E0, int E1> tvec2glm::detail::tvec2123 GLM_FUNC_DECL tvec2(_swizzle<2,T, P, tvec2<T, P>, E0, E1,-1,-2> const & that) 124 { 125 *this = that(); 126 } 127 # endif//(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)) 128 129 ////////////////////////////////////// 130 // Conversion constructors 131 132 //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 133 template <typename U, typename V> 134 GLM_FUNC_DECL tvec2( 135 U const & x, 136 V const & y); 137 138 ////////////////////////////////////// 139 // Conversion vector constructors 140 141 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 142 template <typename U, precision Q> 143 GLM_FUNC_DECL tvec2(tvec2<U, Q> const & v); 144 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 145 template <typename U, precision Q> 146 GLM_FUNC_DECL explicit tvec2(tvec3<U, Q> const & v); 147 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 148 template <typename U, precision Q> 149 GLM_FUNC_DECL explicit tvec2(tvec4<U, Q> const & v); 150 151 ////////////////////////////////////// 152 // Unary arithmetic operators 153 154 GLM_FUNC_DECL tvec2<T, P> & operator= (tvec2<T, P> const & v); 155 template <typename U> 156 GLM_FUNC_DECL tvec2<T, P> & operator= (tvec2<U, P> const & v); 157 158 template <typename U> 159 GLM_FUNC_DECL tvec2<T, P> & operator+=(U s); 160 template <typename U> 161 GLM_FUNC_DECL tvec2<T, P> & operator+=(tvec2<U, P> const & v); 162 template <typename U> 163 GLM_FUNC_DECL tvec2<T, P> & operator-=(U s); 164 template <typename U> 165 GLM_FUNC_DECL tvec2<T, P> & operator-=(tvec2<U, P> const & v); 166 template <typename U> 167 GLM_FUNC_DECL tvec2<T, P> & operator*=(U s); 168 template <typename U> 169 GLM_FUNC_DECL tvec2<T, P> & operator*=(tvec2<U, P> const & v); 170 template <typename U> 171 GLM_FUNC_DECL tvec2<T, P> & operator/=(U s); 172 template <typename U> 173 GLM_FUNC_DECL tvec2<T, P> & operator/=(tvec2<U, P> const & v); 174 175 ////////////////////////////////////// 176 // Increment and decrement operators 177 178 GLM_FUNC_DECL tvec2<T, P> & operator++(); 179 GLM_FUNC_DECL tvec2<T, P> & operator--(); 180 GLM_FUNC_DECL tvec2<T, P> operator++(int); 181 GLM_FUNC_DECL tvec2<T, P> operator--(int); 182 183 ////////////////////////////////////// 184 // Unary bit operators 185 186 template <typename U> 187 GLM_FUNC_DECL tvec2<T, P> & operator%= (U s); 188 template <typename U> 189 GLM_FUNC_DECL tvec2<T, P> & operator%= (tvec2<U, P> const & v); 190 template <typename U> 191 GLM_FUNC_DECL tvec2<T, P> & operator&= (U s); 192 template <typename U> 193 GLM_FUNC_DECL tvec2<T, P> & operator&= (tvec2<U, P> const & v); 194 template <typename U> 195 GLM_FUNC_DECL tvec2<T, P> & operator|= (U s); 196 template <typename U> 197 GLM_FUNC_DECL tvec2<T, P> & operator|= (tvec2<U, P> const & v); 198 template <typename U> 199 GLM_FUNC_DECL tvec2<T, P> & operator^= (U s); 200 template <typename U> 201 GLM_FUNC_DECL tvec2<T, P> & operator^= (tvec2<U, P> const & v); 202 template <typename U> 203 GLM_FUNC_DECL tvec2<T, P> & operator<<=(U s); 204 template <typename U> 205 GLM_FUNC_DECL tvec2<T, P> & operator<<=(tvec2<U, P> const & v); 206 template <typename U> 207 GLM_FUNC_DECL tvec2<T, P> & operator>>=(U s); 208 template <typename U> 209 GLM_FUNC_DECL tvec2<T, P> & operator>>=(tvec2<U, P> const & v); 210 }; 211 212 template <typename T, precision P> 213 GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v, T const & s); 214 215 template <typename T, precision P> 216 GLM_FUNC_DECL tvec2<T, P> operator+(T const & s, tvec2<T, P> const & v); 217 218 template <typename T, precision P> 219 GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 220 221 template <typename T, precision P> 222 GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v, T const & s); 223 224 template <typename T, precision P> 225 GLM_FUNC_DECL tvec2<T, P> operator-(T const & s, tvec2<T, P> const & v); 226 227 template <typename T, precision P> 228 GLM_FUNC_DECL tvec2<T, P> operator- (tvec2<T, P> const & v1, tvec2<T, P> const & v2); 229 230 template <typename T, precision P> 231 GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v, T const & s); 232 233 template <typename T, precision P> 234 GLM_FUNC_DECL tvec2<T, P> operator*(T const & s, tvec2<T, P> const & v); 235 236 template <typename T, precision P> 237 GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 238 239 template <typename T, precision P> 240 GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v, T const & s); 241 242 template <typename T, precision P> 243 GLM_FUNC_DECL tvec2<T, P> operator/(T const & s, tvec2<T, P> const & v); 244 245 template <typename T, precision P> 246 GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 247 248 template <typename T, precision P> 249 GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v); 250 251 template <typename T, precision P> 252 GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v, T const & s); 253 254 template <typename T, precision P> 255 GLM_FUNC_DECL tvec2<T, P> operator%(T const & s, tvec2<T, P> const & v); 256 257 template <typename T, precision P> 258 GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 259 260 template <typename T, precision P> 261 GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v, T const & s); 262 263 template <typename T, precision P> 264 GLM_FUNC_DECL tvec2<T, P> operator&(T const & s, tvec2<T, P> const & v); 265 266 template <typename T, precision P> 267 GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 268 269 template <typename T, precision P> 270 GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v, T const & s); 271 272 template <typename T, precision P> 273 GLM_FUNC_DECL tvec2<T, P> operator|(T const & s, tvec2<T, P> const & v); 274 275 template <typename T, precision P> 276 GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 277 278 template <typename T, precision P> 279 GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v, T const & s); 280 281 template <typename T, precision P> 282 GLM_FUNC_DECL tvec2<T, P> operator^(T const & s, tvec2<T, P> const & v); 283 284 template <typename T, precision P> 285 GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 286 287 template <typename T, precision P> 288 GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v, T const & s); 289 290 template <typename T, precision P> 291 GLM_FUNC_DECL tvec2<T, P> operator<<(T const & s, tvec2<T, P> const & v); 292 293 template <typename T, precision P> 294 GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 295 296 template <typename T, precision P> 297 GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v, T const & s); 298 299 template <typename T, precision P> 300 GLM_FUNC_DECL tvec2<T, P> operator>>(T const & s, tvec2<T, P> const & v); 301 302 template <typename T, precision P> 303 GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec2<T, P> const & v2); 304 305 template <typename T, precision P> 306 GLM_FUNC_DECL tvec2<T, P> operator~(tvec2<T, P> const & v); 307 308 }//namespace detail 309 }//namespace glm 310 311 #ifndef GLM_EXTERNAL_TEMPLATE 312 #include "type_vec2.inl" 313 #endif//GLM_EXTERNAL_TEMPLATE 314 315 #endif//glm_core_type_gentype2 316