00001
00002
00004
00005
00006
00007
00009
00010
00011
00013
00014 #ifndef glm_gtx_simd_vec4
00015 #define glm_gtx_simd_vec4
00016
00017
00018 #include "../glm.hpp"
00019
00020 #if(GLM_ARCH & GLM_ARCH_SSE2)
00021 # include "../core/intrinsic_common.hpp"
00022 # include "../core/intrinsic_geometric.hpp"
00023 #else
00024 # error "GLM: GLM_GTX_simd_vec4 requires compiler support of SSE2 through intrinsics"
00025 #endif
00026
00027 #if(defined(GLM_MESSAGES) && !defined(glm_ext))
00028 # pragma message("GLM: GLM_GTX_simd_vec4 extension included")
00029 #endif
00030
00031 namespace glm{
00032 namespace detail
00033 {
00036 GLM_ALIGNED_STRUCT(16) fvec4SIMD
00037 {
00038 enum ctor{null};
00039 typedef __m128 value_type;
00040 typedef std::size_t size_type;
00041 static size_type value_size();
00042
00043 typedef fvec4SIMD type;
00044 typedef tvec4<bool> bool_type;
00045
00046 __m128 Data;
00047
00049
00050
00051 fvec4SIMD();
00052 fvec4SIMD(__m128 const & Data);
00053 fvec4SIMD(fvec4SIMD const & v);
00054
00056
00057
00058 explicit fvec4SIMD(
00059 ctor);
00060 explicit fvec4SIMD(
00061 float const & s);
00062 explicit fvec4SIMD(
00063 float const & x,
00064 float const & y,
00065 float const & z,
00066 float const & w);
00067 explicit fvec4SIMD(
00068 tvec4<float> const & v);
00069
00072
00073 fvec4SIMD(vec2 const & v, float const & s1, float const & s2);
00074 fvec4SIMD(float const & s1, vec2 const & v, float const & s2);
00075 fvec4SIMD(float const & s1, float const & s2, vec2 const & v);
00076 fvec4SIMD(vec3 const & v, float const & s);
00077 fvec4SIMD(float const & s, vec3 const & v);
00078 fvec4SIMD(vec2 const & v1, vec2 const & v2);
00079
00080
00082
00083
00084 fvec4SIMD& operator= (fvec4SIMD const & v);
00085 fvec4SIMD& operator+=(fvec4SIMD const & v);
00086 fvec4SIMD& operator-=(fvec4SIMD const & v);
00087 fvec4SIMD& operator*=(fvec4SIMD const & v);
00088 fvec4SIMD& operator/=(fvec4SIMD const & v);
00089
00090 fvec4SIMD& operator+=(float const & s);
00091 fvec4SIMD& operator-=(float const & s);
00092 fvec4SIMD& operator*=(float const & s);
00093 fvec4SIMD& operator/=(float const & s);
00094
00095 fvec4SIMD& operator++();
00096 fvec4SIMD& operator--();
00097
00099
00100
00101 template <comp X, comp Y, comp Z, comp W>
00102 fvec4SIMD& swizzle();
00103 template <comp X, comp Y, comp Z, comp W>
00104 fvec4SIMD swizzle() const;
00105 template <comp X, comp Y, comp Z>
00106 fvec4SIMD swizzle() const;
00107 template <comp X, comp Y>
00108 fvec4SIMD swizzle() const;
00109 template <comp X>
00110 fvec4SIMD swizzle() const;
00111 };
00112 }
00113
00114 namespace gtx{
00115 namespace simd_vec4
00116 {
00117 typedef glm::detail::fvec4SIMD simdVec4;
00118
00121
00124 detail::tvec4<float> vec4_cast(
00125 detail::fvec4SIMD const & x);
00126
00129 detail::fvec4SIMD abs(detail::fvec4SIMD const & x);
00130
00133 detail::fvec4SIMD sign(detail::fvec4SIMD const & x);
00134
00137 detail::fvec4SIMD floor(detail::fvec4SIMD const & x);
00138
00142 detail::fvec4SIMD trunc(detail::fvec4SIMD const & x);
00143
00150 detail::fvec4SIMD round(detail::fvec4SIMD const & x);
00151
00156
00157
00161 detail::fvec4SIMD ceil(detail::fvec4SIMD const & x);
00162
00165 detail::fvec4SIMD fract(detail::fvec4SIMD const & x);
00166
00170 detail::fvec4SIMD mod(
00171 detail::fvec4SIMD const & x,
00172 detail::fvec4SIMD const & y);
00173
00177 detail::fvec4SIMD mod(
00178 detail::fvec4SIMD const & x,
00179 float const & y);
00180
00186
00187
00188
00189
00192 detail::fvec4SIMD min(
00193 detail::fvec4SIMD const & x,
00194 detail::fvec4SIMD const & y);
00195
00196 detail::fvec4SIMD min(
00197 detail::fvec4SIMD const & x,
00198 float const & y);
00199
00202 detail::fvec4SIMD max(
00203 detail::fvec4SIMD const & x,
00204 detail::fvec4SIMD const & y);
00205
00206 detail::fvec4SIMD max(
00207 detail::fvec4SIMD const & x,
00208 float const & y);
00209
00213 detail::fvec4SIMD clamp(
00214 detail::fvec4SIMD const & x,
00215 detail::fvec4SIMD const & minVal,
00216 detail::fvec4SIMD const & maxVal);
00217
00218 detail::fvec4SIMD clamp(
00219 detail::fvec4SIMD const & x,
00220 float const & minVal,
00221 float const & maxVal);
00222
00246
00248 detail::fvec4SIMD mix(
00249 detail::fvec4SIMD const & x,
00250 detail::fvec4SIMD const & y,
00251 detail::fvec4SIMD const & a);
00252
00255 detail::fvec4SIMD step(
00256 detail::fvec4SIMD const & edge,
00257 detail::fvec4SIMD const & x);
00258
00259 detail::fvec4SIMD step(
00260 float const & edge,
00261 detail::fvec4SIMD const & x);
00262
00273 detail::fvec4SIMD smoothstep(
00274 detail::fvec4SIMD const & edge0,
00275 detail::fvec4SIMD const & edge1,
00276 detail::fvec4SIMD const & x);
00277
00278 detail::fvec4SIMD smoothstep(
00279 float const & edge0,
00280 float const & edge1,
00281 detail::fvec4SIMD const & x);
00282
00289
00290
00297
00298
00303
00304
00311
00312
00315 detail::fvec4SIMD fma(
00316 detail::fvec4SIMD const & a,
00317 detail::fvec4SIMD const & b,
00318 detail::fvec4SIMD const & c);
00319
00329
00330
00337
00338
00341 float length(
00342 detail::fvec4SIMD const & x);
00343
00347 float fastLength(
00348 detail::fvec4SIMD const & x);
00349
00353 float niceLength(
00354 detail::fvec4SIMD const & x);
00355
00358 detail::fvec4SIMD length4(
00359 detail::fvec4SIMD const & x);
00360
00364 detail::fvec4SIMD fastLength4(
00365 detail::fvec4SIMD const & x);
00366
00370 detail::fvec4SIMD niceLength4(
00371 detail::fvec4SIMD const & x);
00372
00375 float distance(
00376 detail::fvec4SIMD const & p0,
00377 detail::fvec4SIMD const & p1);
00378
00381 detail::fvec4SIMD distance4(
00382 detail::fvec4SIMD const & p0,
00383 detail::fvec4SIMD const & p1);
00384
00387 float simdDot(
00388 detail::fvec4SIMD const & x,
00389 detail::fvec4SIMD const & y);
00390
00393 detail::fvec4SIMD dot4(
00394 detail::fvec4SIMD const & x,
00395 detail::fvec4SIMD const & y);
00396
00399 detail::fvec4SIMD cross(
00400 detail::fvec4SIMD const & x,
00401 detail::fvec4SIMD const & y);
00402
00405 detail::fvec4SIMD normalize(
00406 detail::fvec4SIMD const & x);
00407
00411 detail::fvec4SIMD fastNormalize(
00412 detail::fvec4SIMD const & x);
00413
00416 detail::fvec4SIMD simdFaceforward(
00417 detail::fvec4SIMD const & N,
00418 detail::fvec4SIMD const & I,
00419 detail::fvec4SIMD const & Nref);
00420
00424 detail::fvec4SIMD reflect(
00425 detail::fvec4SIMD const & I,
00426 detail::fvec4SIMD const & N);
00427
00432 detail::fvec4SIMD refract(
00433 detail::fvec4SIMD const & I,
00434 detail::fvec4SIMD const & N,
00435 float const & eta);
00436
00439 detail::fvec4SIMD sqrt(
00440 detail::fvec4SIMD const & x);
00441
00445 detail::fvec4SIMD niceSqrt(
00446 detail::fvec4SIMD const & x);
00447
00451 detail::fvec4SIMD fastSqrt(
00452 detail::fvec4SIMD const & x);
00453
00456 detail::fvec4SIMD inversesqrt(
00457 detail::fvec4SIMD const & x);
00458
00462 detail::fvec4SIMD fastInversesqrt(
00463 detail::fvec4SIMD const & x);
00464
00466 }
00467 }
00468 }
00469
00470 #include "simd_vec4.inl"
00471
00472 namespace glm{using namespace gtx::simd_vec4;}
00473
00474 #endif//glm_gtx_simd_vec4