1 /// @ref core 2 /// @file glm/detail/type_vec4.hpp 3 4 #pragma once 5 6 #include "qualifier.hpp" 7 #if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR 8 # include "_swizzle.hpp" 9 #elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION 10 # include "_swizzle_func.hpp" 11 #endif 12 #include <cstddef> 13 14 namespace glm 15 { 16 template<typename T, qualifier Q> 17 struct vec<4, T, Q> 18 { 19 // -- Implementation detail -- 20 21 typedef T value_type; 22 typedef vec<4, T, Q> type; 23 typedef vec<4, bool, Q> bool_type; 24 25 // -- Data -- 26 27 # if GLM_SILENT_WARNINGS == GLM_ENABLE 28 # if GLM_COMPILER & GLM_COMPILER_GCC 29 # pragma GCC diagnostic push 30 # pragma GCC diagnostic ignored "-Wpedantic" 31 # elif GLM_COMPILER & GLM_COMPILER_CLANG 32 # pragma clang diagnostic push 33 # pragma clang diagnostic ignored "-Wgnu-anonymous-struct" 34 # pragma clang diagnostic ignored "-Wnested-anon-types" 35 # elif GLM_COMPILER & GLM_COMPILER_VC 36 # pragma warning(push) 37 # pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union 38 # endif 39 # endif 40 41 # if GLM_CONFIG_XYZW_ONLY 42 T x, y, z, w; 43 # elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE 44 union 45 { 46 struct { T x, y, z, w; }; 47 struct { T r, g, b, a; }; 48 struct { T s, t, p, q; }; 49 50 typename detail::storage<4, T, detail::is_aligned<Q>::value>::type data; 51 52 # if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR 53 GLM_SWIZZLE4_2_MEMBERS(T, Q, x, y, z, w) 54 GLM_SWIZZLE4_2_MEMBERS(T, Q, r, g, b, a) 55 GLM_SWIZZLE4_2_MEMBERS(T, Q, s, t, p, q) 56 GLM_SWIZZLE4_3_MEMBERS(T, Q, x, y, z, w) 57 GLM_SWIZZLE4_3_MEMBERS(T, Q, r, g, b, a) 58 GLM_SWIZZLE4_3_MEMBERS(T, Q, s, t, p, q) 59 GLM_SWIZZLE4_4_MEMBERS(T, Q, x, y, z, w) 60 GLM_SWIZZLE4_4_MEMBERS(T, Q, r, g, b, a) 61 GLM_SWIZZLE4_4_MEMBERS(T, Q, s, t, p, q) 62 # endif 63 }; 64 # else 65 union { T x, r, s; }; 66 union { T y, g, t; }; 67 union { T z, b, p; }; 68 union { T w, a, q; }; 69 70 # if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION 71 GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, Q) 72 # endif 73 # endif 74 75 # if GLM_SILENT_WARNINGS == GLM_ENABLE 76 # if GLM_COMPILER & GLM_COMPILER_CLANG 77 # pragma clang diagnostic pop 78 # elif GLM_COMPILER & GLM_COMPILER_GCC 79 # pragma GCC diagnostic pop 80 # elif GLM_COMPILER & GLM_COMPILER_VC 81 # pragma warning(pop) 82 # endif 83 # endif 84 85 // -- Component accesses -- 86 87 typedef length_t length_type; 88 89 /// Return the count of components of the vector lengthglm::vec90 GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;} 91 92 GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i); 93 GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const; 94 95 // -- Implicit basic constructors -- 96 97 GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT; 98 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<4, T, Q> const& v) GLM_DEFAULT; 99 template<qualifier P> 100 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<4, T, P> const& v); 101 102 // -- Explicit basic constructors -- 103 104 GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar); 105 GLM_FUNC_DECL GLM_CONSTEXPR vec(T x, T y, T z, T w); 106 107 // -- Conversion scalar constructors -- 108 109 template<typename U, qualifier P> 110 GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(vec<1, U, P> const& v); 111 112 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 113 template<typename X, typename Y, typename Z, typename W> 114 GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, Z _z, W _w); 115 template<typename X, typename Y, typename Z, typename W> 116 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z, W _w); 117 template<typename X, typename Y, typename Z, typename W> 118 GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z, W _w); 119 template<typename X, typename Y, typename Z, typename W> 120 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, W _w); 121 template<typename X, typename Y, typename Z, typename W> 122 GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z, W _w); 123 template<typename X, typename Y, typename Z, typename W> 124 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, W _w); 125 template<typename X, typename Y, typename Z, typename W> 126 GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w); 127 template<typename X, typename Y, typename Z, typename W> 128 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w); 129 template<typename X, typename Y, typename Z, typename W> 130 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z, vec<1, W, Q> const& _w); 131 template<typename X, typename Y, typename Z, typename W> 132 GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w); 133 template<typename X, typename Y, typename Z, typename W> 134 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w); 135 template<typename X, typename Y, typename Z, typename W> 136 GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); 137 template<typename X, typename Y, typename Z, typename W> 138 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); 139 template<typename X, typename Y, typename Z, typename W> 140 GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); 141 template<typename X, typename Y, typename Z, typename W> 142 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _Y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w); 143 144 // -- Conversion vector constructors -- 145 146 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 147 template<typename A, typename B, typename C, qualifier P> 148 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z, C _w); 149 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 150 template<typename A, typename B, typename C, qualifier P> 151 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, C _w); 152 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 153 template<typename A, typename B, typename C, qualifier P> 154 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z, vec<1, C, P> const& _w); 155 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 156 template<typename A, typename B, typename C, qualifier P> 157 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w); 158 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 159 template<typename A, typename B, typename C, qualifier P> 160 GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz, C _w); 161 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 162 template<typename A, typename B, typename C, qualifier P> 163 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, C _w); 164 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 165 template<typename A, typename B, typename C, qualifier P> 166 GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w); 167 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 168 template<typename A, typename B, typename C, qualifier P> 169 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w); 170 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 171 template<typename A, typename B, typename C, qualifier P> 172 GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, B _y, vec<2, C, P> const& _zw); 173 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 174 template<typename A, typename B, typename C, qualifier P> 175 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, B _y, vec<2, C, P> const& _zw); 176 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 177 template<typename A, typename B, typename C, qualifier P> 178 GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw); 179 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 180 template<typename A, typename B, typename C, qualifier P> 181 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw); 182 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 183 template<typename A, typename B, qualifier P> 184 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, A, P> const& _xyz, B _w); 185 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 186 template<typename A, typename B, qualifier P> 187 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w); 188 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 189 template<typename A, typename B, qualifier P> 190 GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<3, B, P> const& _yzw); 191 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 192 template<typename A, typename B, qualifier P> 193 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw); 194 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 195 template<typename A, typename B, qualifier P> 196 GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw); 197 198 /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) 199 template<typename U, qualifier P> 200 GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v); 201 202 // -- Swizzle constructors -- 203 # if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR 204 template<int E0, int E1, int E2, int E3> vecglm::vec205 GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<4, T, Q, E0, E1, E2, E3> const& that) 206 { 207 *this = that(); 208 } 209 210 template<int E0, int E1, int F0, int F1> vecglm::vec211 GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, detail::_swizzle<2, T, Q, F0, F1, -1, -2> const& u) 212 { 213 *this = vec<4, T, Q>(v(), u()); 214 } 215 216 template<int E0, int E1> vecglm::vec217 GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, T const& y, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v) 218 { 219 *this = vec<4, T, Q>(x, y, v()); 220 } 221 222 template<int E0, int E1> vecglm::vec223 GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& w) 224 { 225 *this = vec<4, T, Q>(x, v(), w); 226 } 227 228 template<int E0, int E1> vecglm::vec229 GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& z, T const& w) 230 { 231 *this = vec<4, T, Q>(v(), z, w); 232 } 233 234 template<int E0, int E1, int E2> vecglm::vec235 GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v, T const& w) 236 { 237 *this = vec<4, T, Q>(v(), w); 238 } 239 240 template<int E0, int E1, int E2> vecglm::vec241 GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v) 242 { 243 *this = vec<4, T, Q>(x, v()); 244 } 245 # endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR 246 247 // -- Unary arithmetic operators -- 248 249 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator=(vec<4, T, Q> const& v) GLM_DEFAULT; 250 251 template<typename U> 252 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator=(vec<4, U, Q> const& v); 253 template<typename U> 254 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(U scalar); 255 template<typename U> 256 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(vec<1, U, Q> const& v); 257 template<typename U> 258 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(vec<4, U, Q> const& v); 259 template<typename U> 260 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(U scalar); 261 template<typename U> 262 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(vec<1, U, Q> const& v); 263 template<typename U> 264 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(vec<4, U, Q> const& v); 265 template<typename U> 266 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(U scalar); 267 template<typename U> 268 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(vec<1, U, Q> const& v); 269 template<typename U> 270 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(vec<4, U, Q> const& v); 271 template<typename U> 272 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(U scalar); 273 template<typename U> 274 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(vec<1, U, Q> const& v); 275 template<typename U> 276 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(vec<4, U, Q> const& v); 277 278 // -- Increment and decrement operators -- 279 280 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator++(); 281 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator--(); 282 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator++(int); 283 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator--(int); 284 285 // -- Unary bit operators -- 286 287 template<typename U> 288 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(U scalar); 289 template<typename U> 290 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(vec<1, U, Q> const& v); 291 template<typename U> 292 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(vec<4, U, Q> const& v); 293 template<typename U> 294 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(U scalar); 295 template<typename U> 296 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(vec<1, U, Q> const& v); 297 template<typename U> 298 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(vec<4, U, Q> const& v); 299 template<typename U> 300 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(U scalar); 301 template<typename U> 302 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(vec<1, U, Q> const& v); 303 template<typename U> 304 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(vec<4, U, Q> const& v); 305 template<typename U> 306 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(U scalar); 307 template<typename U> 308 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(vec<1, U, Q> const& v); 309 template<typename U> 310 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(vec<4, U, Q> const& v); 311 template<typename U> 312 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(U scalar); 313 template<typename U> 314 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(vec<1, U, Q> const& v); 315 template<typename U> 316 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(vec<4, U, Q> const& v); 317 template<typename U> 318 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(U scalar); 319 template<typename U> 320 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(vec<1, U, Q> const& v); 321 template<typename U> 322 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(vec<4, U, Q> const& v); 323 }; 324 325 // -- Unary operators -- 326 327 template<typename T, qualifier Q> 328 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v); 329 330 template<typename T, qualifier Q> 331 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v); 332 333 // -- Binary operators -- 334 335 template<typename T, qualifier Q> 336 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v, T const & scalar); 337 338 template<typename T, qualifier Q> 339 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); 340 341 template<typename T, qualifier Q> 342 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v); 343 344 template<typename T, qualifier Q> 345 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); 346 347 template<typename T, qualifier Q> 348 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 349 350 template<typename T, qualifier Q> 351 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v, T const & scalar); 352 353 template<typename T, qualifier Q> 354 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); 355 356 template<typename T, qualifier Q> 357 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v); 358 359 template<typename T, qualifier Q> 360 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); 361 362 template<typename T, qualifier Q> 363 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 364 365 template<typename T, qualifier Q> 366 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, T const & scalar); 367 368 template<typename T, qualifier Q> 369 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); 370 371 template<typename T, qualifier Q> 372 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v); 373 374 template<typename T, qualifier Q> 375 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); 376 377 template<typename T, qualifier Q> 378 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 379 380 template<typename T, qualifier Q> 381 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v, T const & scalar); 382 383 template<typename T, qualifier Q> 384 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2); 385 386 template<typename T, qualifier Q> 387 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v); 388 389 template<typename T, qualifier Q> 390 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2); 391 392 template<typename T, qualifier Q> 393 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 394 395 template<typename T, qualifier Q> 396 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar); 397 398 template<typename T, qualifier Q> 399 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); 400 401 template<typename T, qualifier Q> 402 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v); 403 404 template<typename T, qualifier Q> 405 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); 406 407 template<typename T, qualifier Q> 408 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 409 410 template<typename T, qualifier Q> 411 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar); 412 413 template<typename T, qualifier Q> 414 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); 415 416 template<typename T, qualifier Q> 417 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v); 418 419 template<typename T, qualifier Q> 420 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); 421 422 template<typename T, qualifier Q> 423 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 424 425 template<typename T, qualifier Q> 426 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar); 427 428 template<typename T, qualifier Q> 429 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); 430 431 template<typename T, qualifier Q> 432 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v); 433 434 template<typename T, qualifier Q> 435 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); 436 437 template<typename T, qualifier Q> 438 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 439 440 template<typename T, qualifier Q> 441 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar); 442 443 template<typename T, qualifier Q> 444 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); 445 446 template<typename T, qualifier Q> 447 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v); 448 449 template<typename T, qualifier Q> 450 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); 451 452 template<typename T, qualifier Q> 453 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 454 455 template<typename T, qualifier Q> 456 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar); 457 458 template<typename T, qualifier Q> 459 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); 460 461 template<typename T, qualifier Q> 462 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v); 463 464 template<typename T, qualifier Q> 465 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); 466 467 template<typename T, qualifier Q> 468 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 469 470 template<typename T, qualifier Q> 471 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar); 472 473 template<typename T, qualifier Q> 474 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar); 475 476 template<typename T, qualifier Q> 477 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v); 478 479 template<typename T, qualifier Q> 480 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v); 481 482 template<typename T, qualifier Q> 483 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 484 485 template<typename T, qualifier Q> 486 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator~(vec<4, T, Q> const& v); 487 488 // -- Boolean operators -- 489 490 template<typename T, qualifier Q> 491 GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 492 493 template<typename T, qualifier Q> 494 GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2); 495 496 template<qualifier Q> 497 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2); 498 499 template<qualifier Q> 500 GLM_FUNC_DECL GLM_CONSTEXPR vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2); 501 }//namespace glm 502 503 #ifndef GLM_EXTERNAL_TEMPLATE 504 #include "type_vec4.inl" 505 #endif//GLM_EXTERNAL_TEMPLATE 506