simd_vec4.hpp
Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 #ifndef GLM_GTX_simd_vec4
00039 #define GLM_GTX_simd_vec4 GLM_VERSION
00040 
00041 // Dependency:
00042 #include "../glm.hpp"
00043 
00044 #if(GLM_ARCH != GLM_ARCH_PURE)
00045 
00046 #if(GLM_ARCH & GLM_ARCH_SSE2)
00047 #       include "../core/intrinsic_common.hpp"
00048 #       include "../core/intrinsic_geometric.hpp"
00049 #else
00050 #       error "GLM: GLM_GTX_simd_vec4 requires compiler support of SSE2 through intrinsics"
00051 #endif
00052 
00053 #if(defined(GLM_MESSAGES) && !defined(glm_ext))
00054 #       pragma message("GLM: GLM_GTX_simd_vec4 extension included")
00055 #endif
00056 
00057 namespace glm{
00058 namespace detail
00059 {
00062         GLM_ALIGNED_STRUCT(16) fvec4SIMD
00063         {
00064                 enum ctor{null};
00065                 typedef __m128 value_type;
00066                 typedef std::size_t size_type;
00067                 static size_type value_size();
00068 
00069                 typedef fvec4SIMD type;
00070                 typedef tvec4<bool> bool_type;
00071 
00072                 __m128 Data;
00073 
00075                 // Implicit basic constructors
00076 
00077                 fvec4SIMD();
00078                 fvec4SIMD(__m128 const & Data);
00079                 fvec4SIMD(fvec4SIMD const & v);
00080 
00082                 // Explicit basic constructors
00083 
00084                 explicit fvec4SIMD(
00085                         ctor);
00086                 explicit fvec4SIMD(
00087                         float const & s);
00088                 explicit fvec4SIMD(
00089                         float const & x, 
00090                         float const & y, 
00091                         float const & z, 
00092                         float const & w);
00093                 explicit fvec4SIMD(
00094                         tvec4<float> const & v);
00095 
00098 
00099                 fvec4SIMD(vec2 const & v, float const & s1, float const & s2);
00100                 fvec4SIMD(float const & s1, vec2 const & v, float const & s2);
00101                 fvec4SIMD(float const & s1, float const & s2, vec2 const & v);
00102                 fvec4SIMD(vec3 const & v, float const & s);
00103                 fvec4SIMD(float const & s, vec3 const & v);
00104                 fvec4SIMD(vec2 const & v1, vec2 const & v2);
00105                 //fvec4SIMD(ivec4SIMD const & v);
00106 
00108                 // Unary arithmetic operators
00109 
00110                 fvec4SIMD& operator= (fvec4SIMD const & v);
00111                 fvec4SIMD& operator+=(fvec4SIMD const & v);
00112                 fvec4SIMD& operator-=(fvec4SIMD const & v);
00113                 fvec4SIMD& operator*=(fvec4SIMD const & v);
00114                 fvec4SIMD& operator/=(fvec4SIMD const & v);
00115 
00116                 fvec4SIMD& operator+=(float const & s);
00117                 fvec4SIMD& operator-=(float const & s);
00118                 fvec4SIMD& operator*=(float const & s);
00119                 fvec4SIMD& operator/=(float const & s);
00120 
00121                 fvec4SIMD& operator++();
00122                 fvec4SIMD& operator--();
00123 
00125                 // Swizzle operators
00126 
00127                 template <comp X, comp Y, comp Z, comp W>
00128                 fvec4SIMD& swizzle();
00129                 template <comp X, comp Y, comp Z, comp W>
00130                 fvec4SIMD swizzle() const;
00131                 template <comp X, comp Y, comp Z>
00132                 fvec4SIMD swizzle() const;
00133                 template <comp X, comp Y>
00134                 fvec4SIMD swizzle() const;
00135                 template <comp X>
00136                 fvec4SIMD swizzle() const;
00137         };
00138 }//namespace detail
00139 
00140         typedef glm::detail::fvec4SIMD simdVec4;
00141 
00144 
00147         detail::tvec4<float> vec4_cast(
00148                 detail::fvec4SIMD const & x);
00149 
00152         detail::fvec4SIMD abs(detail::fvec4SIMD const & x);
00153 
00156         detail::fvec4SIMD sign(detail::fvec4SIMD const & x);
00157 
00160         detail::fvec4SIMD floor(detail::fvec4SIMD const & x);
00161 
00165         detail::fvec4SIMD trunc(detail::fvec4SIMD const & x);
00166 
00173         detail::fvec4SIMD round(detail::fvec4SIMD const & x);
00174 
00179         //detail::fvec4SIMD roundEven(detail::fvec4SIMD const & x);
00180 
00184         detail::fvec4SIMD ceil(detail::fvec4SIMD const & x);
00185 
00188         detail::fvec4SIMD fract(detail::fvec4SIMD const & x);
00189 
00193         detail::fvec4SIMD mod(
00194                 detail::fvec4SIMD const & x, 
00195                 detail::fvec4SIMD const & y);
00196 
00200         detail::fvec4SIMD mod(
00201                 detail::fvec4SIMD const & x, 
00202                 float const & y);
00203 
00209         //detail::fvec4SIMD modf(
00210         //      detail::fvec4SIMD const & x, 
00211         //      detail::fvec4SIMD & i);
00212 
00215         detail::fvec4SIMD min(
00216                 detail::fvec4SIMD const & x, 
00217                 detail::fvec4SIMD const & y);
00218 
00219         detail::fvec4SIMD min(
00220                 detail::fvec4SIMD const & x, 
00221                 float const & y);
00222 
00225         detail::fvec4SIMD max(
00226                 detail::fvec4SIMD const & x, 
00227                 detail::fvec4SIMD const & y);
00228 
00229         detail::fvec4SIMD max(
00230                 detail::fvec4SIMD const & x, 
00231                 float const & y);
00232 
00236         detail::fvec4SIMD clamp(
00237                 detail::fvec4SIMD const & x, 
00238                 detail::fvec4SIMD const & minVal, 
00239                 detail::fvec4SIMD const & maxVal); 
00240 
00241         detail::fvec4SIMD clamp(
00242                 detail::fvec4SIMD const & x, 
00243                 float const & minVal, 
00244                 float const & maxVal); 
00245 
00269         // \todo Test when 'a' is a boolean.
00271         detail::fvec4SIMD mix(
00272                 detail::fvec4SIMD const & x, 
00273                 detail::fvec4SIMD const & y, 
00274                 detail::fvec4SIMD const & a);
00275 
00278         detail::fvec4SIMD step(
00279                 detail::fvec4SIMD const & edge, 
00280                 detail::fvec4SIMD const & x);
00281 
00282         detail::fvec4SIMD step(
00283                 float const & edge, 
00284                 detail::fvec4SIMD const & x);
00285 
00296         detail::fvec4SIMD smoothstep(
00297                 detail::fvec4SIMD const & edge0, 
00298                 detail::fvec4SIMD const & edge1, 
00299                 detail::fvec4SIMD const & x);
00300 
00301         detail::fvec4SIMD smoothstep(
00302                 float const & edge0, 
00303                 float const & edge1, 
00304                 detail::fvec4SIMD const & x);
00305 
00312         //bvec4 isnan(detail::fvec4SIMD const & x);
00313 
00320         //bvec4 isinf(detail::fvec4SIMD const & x);
00321 
00326         //detail::ivec4SIMD floatBitsToInt(detail::fvec4SIMD const & value);
00327 
00334         //detail::fvec4SIMD intBitsToFloat(detail::ivec4SIMD const & value);
00335 
00338         detail::fvec4SIMD fma(
00339                 detail::fvec4SIMD const & a, 
00340                 detail::fvec4SIMD const & b, 
00341                 detail::fvec4SIMD const & c);
00342 
00352         //detail::fvec4SIMD frexp(detail::fvec4SIMD const & x, detail::ivec4SIMD & exp);
00353 
00360         //detail::fvec4SIMD ldexp(detail::fvec4SIMD const & x, detail::ivec4SIMD const & exp);
00361 
00364         float length(
00365                 detail::fvec4SIMD const & x);
00366 
00370         float fastLength(
00371                 detail::fvec4SIMD const & x);
00372 
00376         float niceLength(
00377                 detail::fvec4SIMD const & x);
00378 
00381         detail::fvec4SIMD length4(
00382                 detail::fvec4SIMD const & x);
00383 
00387         detail::fvec4SIMD fastLength4(
00388                 detail::fvec4SIMD const & x);
00389 
00393         detail::fvec4SIMD niceLength4(
00394                 detail::fvec4SIMD const & x);
00395 
00398         float distance(
00399                 detail::fvec4SIMD const & p0,
00400                 detail::fvec4SIMD const & p1);
00401 
00404         detail::fvec4SIMD distance4(
00405                 detail::fvec4SIMD const & p0,
00406                 detail::fvec4SIMD const & p1);
00407 
00410         float simdDot(
00411                 detail::fvec4SIMD const & x,
00412                 detail::fvec4SIMD const & y);
00413 
00416         detail::fvec4SIMD dot4(
00417                 detail::fvec4SIMD const & x,
00418                 detail::fvec4SIMD const & y);
00419 
00422         detail::fvec4SIMD cross(
00423                 detail::fvec4SIMD const & x,
00424                 detail::fvec4SIMD const & y);
00425 
00428         detail::fvec4SIMD normalize(
00429                 detail::fvec4SIMD const & x);
00430 
00434         detail::fvec4SIMD fastNormalize(
00435                 detail::fvec4SIMD const & x);
00436 
00439         detail::fvec4SIMD simdFaceforward(
00440                 detail::fvec4SIMD const & N,
00441                 detail::fvec4SIMD const & I,
00442                 detail::fvec4SIMD const & Nref);
00443 
00447         detail::fvec4SIMD reflect(
00448                 detail::fvec4SIMD const & I,
00449                 detail::fvec4SIMD const & N);
00450 
00455         detail::fvec4SIMD refract(
00456                 detail::fvec4SIMD const & I,
00457                 detail::fvec4SIMD const & N,
00458                 float const & eta);
00459 
00462         detail::fvec4SIMD sqrt(
00463                 detail::fvec4SIMD const & x);
00464 
00468         detail::fvec4SIMD niceSqrt(
00469                 detail::fvec4SIMD const & x);
00470 
00474         detail::fvec4SIMD fastSqrt(
00475                 detail::fvec4SIMD const & x);
00476 
00479         detail::fvec4SIMD inversesqrt(
00480                 detail::fvec4SIMD const & x);
00481 
00485         detail::fvec4SIMD fastInversesqrt(
00486                 detail::fvec4SIMD const & x);
00487 
00489 }//namespace glm
00490 
00491 #include "simd_vec4.inl"
00492 
00493 #endif//(GLM_ARCH != GLM_ARCH_PURE)
00494 
00495 #endif//GLM_GTX_simd_vec4