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_vec4.hpp 25 /// @date 2008-08-22 / 2011-06-15 26 /// @author Christophe Riccio 27 /////////////////////////////////////////////////////////////////////////////////// 28 29 #ifndef glm_core_type_gentype4 30 #define glm_core_type_gentype4 31 32 //#include "../fwd.hpp" 33 #include "setup.hpp" 34 #include "type_vec.hpp" 35 #ifdef GLM_SWIZZLE 36 # if GLM_HAS_ANONYMOUS_UNION 37 # include "_swizzle.hpp" 38 # else 39 # include "_swizzle_func.hpp" 40 # endif 41 #endif //GLM_SWIZZLE 42 #include <cstddef> 43 44 namespace glm{ 45 namespace detail 46 { 47 template <typename T, precision P> 48 struct tvec4 49 { 50 ////////////////////////////////////// 51 // Implementation detail 52 53 enum ctor{_null}; 54 55 typedef tvec4<T, P> type; 56 typedef tvec4<bool, P> bool_type; 57 typedef T value_type; 58 typedef int size_type; 59 60 ////////////////////////////////////// 61 // Helper 62 63 GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const; 64 65 ////////////////////////////////////// 66 // Data 67 68 # if(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)) 69 union 70 { 71 struct { T r, g, b, a; }; 72 struct { T s, t, p, q; }; 73 struct { T x, y, z, w;}; 74 75 _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, x, y, z, w) 76 _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, r, g, b, a) 77 _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, s, t, p, q) 78 _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, x, y, z, w) 79 _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, r, g, b, a) 80 _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, s, t, p, q) 81 _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, x, y, z, w) 82 _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, r, g, b, a) 83 _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, s, t, p, q) 84 }; 85 # else 86 union { T x, r, s; }; 87 union { T y, g, t; }; 88 union { T z, b, p; }; 89 union { T w, a, q; }; 90 91 # ifdef GLM_SWIZZLE 92 GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P, detail::tvec4, detail::tvec2, detail::tvec3, detail::tvec4) 93 # endif 94 # endif//GLM_LANG 95 96 ////////////////////////////////////// 97 // Accesses 98 99 GLM_FUNC_DECL T & operator[](length_t i); 100 GLM_FUNC_DECL T const & operator[](length_t i) const; 101 102 ////////////////////////////////////// 103 // Implicit basic constructors 104 105 GLM_FUNC_DECL tvec4(); 106 GLM_FUNC_DECL tvec4(type const & v); 107 template <precision Q> 108 GLM_FUNC_DECL tvec4(tvec4<T, Q> const & v); 109 110 ////////////////////////////////////// 111 // Explicit basic constructors 112 113 GLM_FUNC_DECL explicit tvec4( 114 ctor); 115 GLM_FUNC_DECL explicit tvec4( 116 T const & s); 117 GLM_FUNC_DECL tvec4( 118 T const & s0, 119 T const & s1, 120 T const & s2, 121 T const & s3); 122 123 ////////////////////////////////////// 124 // Conversion scalar constructors 125 126 /// Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 127 template <typename A, typename B, typename C, typename D> 128 GLM_FUNC_DECL tvec4( 129 A const & x, 130 B const & y, 131 C const & z, 132 D const & w); 133 134 ////////////////////////////////////// 135 // Conversion vector constructors 136 137 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 138 template <typename A, typename B, typename C, precision Q> 139 GLM_FUNC_DECL explicit tvec4(tvec2<A, Q> const & v, B const & s1, C const & s2); 140 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 141 template <typename A, typename B, typename C, precision Q> 142 GLM_FUNC_DECL explicit tvec4(A const & s1, tvec2<B, Q> const & v, C const & s2); 143 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 144 template <typename A, typename B, typename C, precision Q> 145 GLM_FUNC_DECL explicit tvec4(A const & s1, B const & s2, tvec2<C, Q> const & v); 146 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 147 template <typename A, typename B, precision Q> 148 GLM_FUNC_DECL explicit tvec4(tvec3<A, Q> const & v, B const & s); 149 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 150 template <typename A, typename B, precision Q> 151 GLM_FUNC_DECL explicit tvec4(A const & s, tvec3<B, Q> const & v); 152 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 153 template <typename A, typename B, precision Q> 154 GLM_FUNC_DECL explicit tvec4(tvec2<A, Q> const & v1, tvec2<B, Q> const & v2); 155 //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 156 template <typename U, precision Q> 157 GLM_FUNC_DECL explicit tvec4(tvec4<U, Q> const & v); 158 159 ////////////////////////////////////// 160 // Swizzle constructors 161 162 # if(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)) 163 template <int E0, int E1, int E2, int E3> tvec4glm::detail::tvec4164 GLM_FUNC_DECL tvec4(_swizzle<4, T, P, tvec4<T, P>, E0, E1, E2, E3> const & that) 165 { 166 *this = that(); 167 } 168 169 template <int E0, int E1, int F0, int F1> tvec4glm::detail::tvec4170 GLM_FUNC_DECL tvec4(_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const & v, _swizzle<2, T, P, tvec2<T, P>, F0, F1, -1, -2> const & u) 171 { 172 *this = tvec4<T, P>(v(), u()); 173 } 174 175 template <int E0, int E1> tvec4glm::detail::tvec4176 GLM_FUNC_DECL tvec4(T const & x, T const & y, _swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const & v) 177 { 178 *this = tvec4<T, P>(x, y, v()); 179 } 180 181 template <int E0, int E1> tvec4glm::detail::tvec4182 GLM_FUNC_DECL tvec4(T const & x, _swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const & v, T const & w) 183 { 184 *this = tvec4<T, P>(x, v(), w); 185 } 186 187 template <int E0, int E1> tvec4glm::detail::tvec4188 GLM_FUNC_DECL tvec4(_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const & v, T const & z, T const & w) 189 { 190 *this = tvec4<T, P>(v(), z, w); 191 } 192 193 template <int E0, int E1, int E2> tvec4glm::detail::tvec4194 GLM_FUNC_DECL tvec4(_swizzle<3, T, P, tvec3<T, P>, E0, E1, E2, -1> const & v, T const & w) 195 { 196 *this = tvec4<T, P>(v(), w); 197 } 198 199 template <int E0, int E1, int E2> tvec4glm::detail::tvec4200 GLM_FUNC_DECL tvec4(T const & x, _swizzle<3, T, P, tvec3<T, P>, E0, E1, E2, -1> const & v) 201 { 202 *this = tvec4<T, P>(x, v()); 203 } 204 # endif//(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)) 205 206 ////////////////////////////////////// 207 // Unary arithmetic operators 208 209 GLM_FUNC_DECL tvec4<T, P> & operator= (tvec4<T, P> const & v); 210 template <typename U, precision Q> 211 GLM_FUNC_DECL tvec4<T, P> & operator= (tvec4<U, Q> const & v); 212 213 template <typename U> 214 GLM_FUNC_DECL tvec4<T, P> & operator+=(U s); 215 template <typename U> 216 GLM_FUNC_DECL tvec4<T, P> & operator+=(tvec4<U, P> const & v); 217 template <typename U> 218 GLM_FUNC_DECL tvec4<T, P> & operator-=(U s); 219 template <typename U> 220 GLM_FUNC_DECL tvec4<T, P> & operator-=(tvec4<U, P> const & v); 221 template <typename U> 222 GLM_FUNC_DECL tvec4<T, P> & operator*=(U s); 223 template <typename U> 224 GLM_FUNC_DECL tvec4<T, P> & operator*=(tvec4<U, P> const & v); 225 template <typename U> 226 GLM_FUNC_DECL tvec4<T, P> & operator/=(U s); 227 template <typename U> 228 GLM_FUNC_DECL tvec4<T, P> & operator/=(tvec4<U, P> const & v); 229 230 ////////////////////////////////////// 231 // Increment and decrement operators 232 233 GLM_FUNC_DECL tvec4<T, P> & operator++(); 234 GLM_FUNC_DECL tvec4<T, P> & operator--(); 235 GLM_FUNC_DECL tvec4<T, P> operator++(int); 236 GLM_FUNC_DECL tvec4<T, P> operator--(int); 237 238 ////////////////////////////////////// 239 // Unary bit operators 240 241 template <typename U> 242 GLM_FUNC_DECL tvec4<T, P> & operator%= (U s); 243 template <typename U> 244 GLM_FUNC_DECL tvec4<T, P> & operator%= (tvec4<U, P> const & v); 245 template <typename U> 246 GLM_FUNC_DECL tvec4<T, P> & operator&= (U s); 247 template <typename U> 248 GLM_FUNC_DECL tvec4<T, P> & operator&= (tvec4<U, P> const & v); 249 template <typename U> 250 GLM_FUNC_DECL tvec4<T, P> & operator|= (U s); 251 template <typename U> 252 GLM_FUNC_DECL tvec4<T, P> & operator|= (tvec4<U, P> const & v); 253 template <typename U> 254 GLM_FUNC_DECL tvec4<T, P> & operator^= (U s); 255 template <typename U> 256 GLM_FUNC_DECL tvec4<T, P> & operator^= (tvec4<U, P> const & v); 257 template <typename U> 258 GLM_FUNC_DECL tvec4<T, P> & operator<<=(U s); 259 template <typename U> 260 GLM_FUNC_DECL tvec4<T, P> & operator<<=(tvec4<U, P> const & v); 261 template <typename U> 262 GLM_FUNC_DECL tvec4<T, P> & operator>>=(U s); 263 template <typename U> 264 GLM_FUNC_DECL tvec4<T, P> & operator>>=(tvec4<U, P> const & v); 265 }; 266 267 template <typename T, precision P> 268 GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v, T const & s); 269 270 template <typename T, precision P> 271 GLM_FUNC_DECL tvec4<T, P> operator+(T const & s, tvec4<T, P> const & v); 272 273 template <typename T, precision P> 274 GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 275 276 template <typename T, precision P> 277 GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v, T const & s); 278 279 template <typename T, precision P> 280 GLM_FUNC_DECL tvec4<T, P> operator-(T const & s, tvec4<T, P> const & v); 281 282 template <typename T, precision P> 283 GLM_FUNC_DECL tvec4<T, P> operator- (tvec4<T, P> const & v1, tvec4<T, P> const & v2); 284 285 template <typename T, precision P> 286 GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, T const & s); 287 288 template <typename T, precision P> 289 GLM_FUNC_DECL tvec4<T, P> operator*(T const & s, tvec4<T, P> const & v); 290 291 template <typename T, precision P> 292 GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 293 294 template <typename T, precision P> 295 GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v, T const & s); 296 297 template <typename T, precision P> 298 GLM_FUNC_DECL tvec4<T, P> operator/(T const & s, tvec4<T, P> const & v); 299 300 template <typename T, precision P> 301 GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 302 303 template <typename T, precision P> 304 GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v); 305 306 template <typename T, precision P> 307 GLM_FUNC_DECL bool operator==(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 308 309 template <typename T, precision P> 310 GLM_FUNC_DECL bool operator!=(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 311 312 template <typename T, precision P> 313 GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v, T const & s); 314 315 template <typename T, precision P> 316 GLM_FUNC_DECL tvec4<T, P> operator%(T const & s, tvec4<T, P> const & v); 317 318 template <typename T, precision P> 319 GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 320 321 template <typename T, precision P> 322 GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v, T const & s); 323 324 template <typename T, precision P> 325 GLM_FUNC_DECL tvec4<T, P> operator&(T const & s, tvec4<T, P> const & v); 326 327 template <typename T, precision P> 328 GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 329 330 template <typename T, precision P> 331 GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v, T const & s); 332 333 template <typename T, precision P> 334 GLM_FUNC_DECL tvec4<T, P> operator|(T const & s, tvec4<T, P> const & v); 335 336 template <typename T, precision P> 337 GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 338 339 template <typename T, precision P> 340 GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v, T const & s); 341 342 template <typename T, precision P> 343 GLM_FUNC_DECL tvec4<T, P> operator^(T const & s, tvec4<T, P> const & v); 344 345 template <typename T, precision P> 346 GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 347 348 template <typename T, precision P> 349 GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v, T const & s); 350 351 template <typename T, precision P> 352 GLM_FUNC_DECL tvec4<T, P> operator<<(T const & s, tvec4<T, P> const & v); 353 354 template <typename T, precision P> 355 GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 356 357 template <typename T, precision P> 358 GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v, T const & s); 359 360 template <typename T, precision P> 361 GLM_FUNC_DECL tvec4<T, P> operator>>(T const & s, tvec4<T, P> const & v); 362 363 template <typename T, precision P> 364 GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v1, tvec4<T, P> const & v2); 365 366 template <typename T, precision P> 367 GLM_FUNC_DECL tvec4<T, P> operator~(tvec4<T, P> const & v); 368 369 }//namespace detail 370 }//namespace glm 371 372 #ifndef GLM_EXTERNAL_TEMPLATE 373 #include "type_vec4.inl" 374 #endif//GLM_EXTERNAL_TEMPLATE 375 376 #endif//glm_core_type_gentype4 377