38 #ifndef GLM_GTX_simd_vec4
39 #define GLM_GTX_simd_vec4 GLM_VERSION
44 #if(GLM_ARCH != GLM_ARCH_PURE)
46 #if(GLM_ARCH & GLM_ARCH_SSE2)
47 # include "../core/intrinsic_common.hpp"
48 # include "../core/intrinsic_geometric.hpp"
50 # error "GLM: GLM_GTX_simd_vec4 requires compiler support of SSE2 through intrinsics"
53 #if(defined(GLM_MESSAGES) && !defined(glm_ext))
54 # pragma message("GLM: GLM_GTX_simd_vec4 extension included")
59 #if (GLM_COMPILER & GLM_COMPILER_VC)
60 # pragma warning(push)
61 # pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
70 GLM_ALIGNED_STRUCT(16) fvec4SIMD
73 typedef __m128 value_type;
74 typedef std::size_t size_type;
75 static size_type value_size();
77 typedef fvec4SIMD type;
78 typedef tvec4<bool> bool_type;
80 #ifdef GLM_SIMD_ENABLE_XYZW_UNION
84 struct {
float x, y, z, w;};
94 fvec4SIMD(__m128
const & Data);
95 fvec4SIMD(fvec4SIMD
const & v);
110 tvec4<float>
const & v);
115 fvec4SIMD(
vec2 const & v,
float const & s1,
float const & s2);
116 fvec4SIMD(
float const & s1,
vec2 const & v,
float const & s2);
117 fvec4SIMD(
float const & s1,
float const & s2,
vec2 const & v);
118 fvec4SIMD(
vec3 const & v,
float const & s);
119 fvec4SIMD(
float const & s,
vec3 const & v);
120 fvec4SIMD(
vec2 const & v1,
vec2 const & v2);
126 fvec4SIMD& operator= (fvec4SIMD
const & v);
127 fvec4SIMD& operator+=(fvec4SIMD
const & v);
128 fvec4SIMD& operator-=(fvec4SIMD
const & v);
129 fvec4SIMD& operator*=(fvec4SIMD
const & v);
130 fvec4SIMD& operator/=(fvec4SIMD
const & v);
132 fvec4SIMD& operator+=(
float const & s);
133 fvec4SIMD& operator-=(
float const & s);
134 fvec4SIMD& operator*=(
float const & s);
135 fvec4SIMD& operator/=(
float const & s);
137 fvec4SIMD& operator++();
138 fvec4SIMD& operator--();
143 template <comp X, comp Y, comp Z, comp W>
144 fvec4SIMD& swizzle();
145 template <comp X, comp Y, comp Z, comp W>
146 fvec4SIMD swizzle()
const;
147 template <comp X, comp Y, comp Z>
148 fvec4SIMD swizzle()
const;
149 template <comp X, comp Y>
150 fvec4SIMD swizzle()
const;
152 fvec4SIMD swizzle()
const;
156 typedef glm::detail::fvec4SIMD simdVec4;
163 detail::tvec4<float> vec4_cast(
164 detail::fvec4SIMD
const & x);
168 detail::fvec4SIMD
abs(detail::fvec4SIMD
const & x);
172 detail::fvec4SIMD
sign(detail::fvec4SIMD
const & x);
176 detail::fvec4SIMD
floor(detail::fvec4SIMD
const & x);
181 detail::fvec4SIMD
trunc(detail::fvec4SIMD
const & x);
189 detail::fvec4SIMD
round(detail::fvec4SIMD
const & x);
200 detail::fvec4SIMD
ceil(detail::fvec4SIMD
const & x);
204 detail::fvec4SIMD
fract(detail::fvec4SIMD
const & x);
209 detail::fvec4SIMD
mod(
210 detail::fvec4SIMD
const & x,
211 detail::fvec4SIMD
const & y);
216 detail::fvec4SIMD
mod(
217 detail::fvec4SIMD
const & x,
231 detail::fvec4SIMD
min(
232 detail::fvec4SIMD
const & x,
233 detail::fvec4SIMD
const & y);
235 detail::fvec4SIMD
min(
236 detail::fvec4SIMD
const & x,
241 detail::fvec4SIMD
max(
242 detail::fvec4SIMD
const & x,
243 detail::fvec4SIMD
const & y);
245 detail::fvec4SIMD
max(
246 detail::fvec4SIMD
const & x,
252 detail::fvec4SIMD
clamp(
253 detail::fvec4SIMD
const & x,
254 detail::fvec4SIMD
const & minVal,
255 detail::fvec4SIMD
const & maxVal);
257 detail::fvec4SIMD
clamp(
258 detail::fvec4SIMD
const & x,
259 float const & minVal,
260 float const & maxVal);
287 detail::fvec4SIMD
mix(
288 detail::fvec4SIMD
const & x,
289 detail::fvec4SIMD
const & y,
290 detail::fvec4SIMD
const & a);
294 detail::fvec4SIMD
step(
295 detail::fvec4SIMD
const & edge,
296 detail::fvec4SIMD
const & x);
298 detail::fvec4SIMD
step(
300 detail::fvec4SIMD
const & x);
313 detail::fvec4SIMD
const & edge0,
314 detail::fvec4SIMD
const & edge1,
315 detail::fvec4SIMD
const & x);
320 detail::fvec4SIMD
const & x);
354 detail::fvec4SIMD
fma(
355 detail::fvec4SIMD
const & a,
356 detail::fvec4SIMD
const & b,
357 detail::fvec4SIMD
const & c);
381 detail::fvec4SIMD
const & x);
387 detail::fvec4SIMD
const & x);
393 detail::fvec4SIMD
const & x);
397 detail::fvec4SIMD length4(
398 detail::fvec4SIMD
const & x);
403 detail::fvec4SIMD fastLength4(
404 detail::fvec4SIMD
const & x);
409 detail::fvec4SIMD niceLength4(
410 detail::fvec4SIMD
const & x);
415 detail::fvec4SIMD
const & p0,
416 detail::fvec4SIMD
const & p1);
420 detail::fvec4SIMD distance4(
421 detail::fvec4SIMD
const & p0,
422 detail::fvec4SIMD
const & p1);
427 detail::fvec4SIMD
const & x,
428 detail::fvec4SIMD
const & y);
432 detail::fvec4SIMD dot4(
433 detail::fvec4SIMD
const & x,
434 detail::fvec4SIMD
const & y);
438 detail::fvec4SIMD
cross(
439 detail::fvec4SIMD
const & x,
440 detail::fvec4SIMD
const & y);
445 detail::fvec4SIMD
const & x);
451 detail::fvec4SIMD
const & x);
455 detail::fvec4SIMD simdFaceforward(
456 detail::fvec4SIMD
const & N,
457 detail::fvec4SIMD
const & I,
458 detail::fvec4SIMD
const & Nref);
464 detail::fvec4SIMD
const & I,
465 detail::fvec4SIMD
const & N);
472 detail::fvec4SIMD
const & I,
473 detail::fvec4SIMD
const & N,
478 detail::fvec4SIMD
sqrt(
479 detail::fvec4SIMD
const & x);
484 detail::fvec4SIMD niceSqrt(
485 detail::fvec4SIMD
const & x);
491 detail::fvec4SIMD
const & x);
496 detail::fvec4SIMD
const & x);
501 detail::fvec4SIMD fastInversesqrt(
502 detail::fvec4SIMD
const & x);
507 #include "simd_vec4.inl"
510 #if (GLM_COMPILER & GLM_COMPILER_VC)
511 # pragma warning(pop)
515 #endif//(GLM_ARCH != GLM_ARCH_PURE)
517 #endif//GLM_GTX_simd_vec4