simd_vec4.hpp

00001 
00002 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
00004 // Created : 2009-05-07
00005 // Updated : 2009-05-07
00006 // Licence : This source is under MIT License
00007 // File    : glm/gtx/simd_vec4.hpp
00009 // Dependency:
00010 // - GLM core
00011 // - intrinsic
00013 
00014 #ifndef glm_gtx_simd_vec4
00015 #define glm_gtx_simd_vec4
00016 
00017 // Dependency:
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 {
00033         namespace detail
00034         {
00037                 GLM_ALIGNED_STRUCT(4) fvec4SIMD
00038                 {
00039                         enum ctor{null};
00040                         typedef __m128 value_type;
00041                         typedef std::size_t size_type;
00042                         static size_type value_size();
00043 
00044                         typedef fvec4SIMD type;
00045                         typedef tvec4<bool> bool_type;
00046 
00047                         __m128 Data;
00048 
00050                         // Implicit basic constructors
00051 
00052                         fvec4SIMD();
00053                         fvec4SIMD(__m128 const & Data);
00054                         fvec4SIMD(fvec4SIMD const & v);
00055 
00057                         // Explicit basic constructors
00058 
00059                         explicit fvec4SIMD(
00060                                 ctor);
00061                         explicit fvec4SIMD(
00062                                 float const & s);
00063                         explicit fvec4SIMD(
00064                                 float const & x, 
00065                                 float const & y, 
00066                                 float const & z, 
00067                                 float const & w);
00068                         explicit fvec4SIMD(
00069                                 tvec4<float> const & v);
00070 
00073 
00074                         fvec4SIMD(vec2 const & v, float const & s1, float const & s2);
00075                         fvec4SIMD(float const & s1, vec2 const & v, float const & s2);
00076                         fvec4SIMD(float const & s1, float const & s2, vec2 const & v);
00077                         fvec4SIMD(vec3 const & v, float const & s);
00078                         fvec4SIMD(float const & s, vec3 const & v);
00079                         fvec4SIMD(vec2 const & v1, vec2 const & v2);
00080                         //fvec4SIMD(ivec4SIMD const & v);
00081 
00083                         // Unary arithmetic operators
00084 
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                         fvec4SIMD& operator/=(fvec4SIMD const & v);
00090 
00091                         fvec4SIMD& operator+=(float const & s);
00092                         fvec4SIMD& operator-=(float const & s);
00093                         fvec4SIMD& operator*=(float const & s);
00094                         fvec4SIMD& operator/=(float const & s);
00095 
00096                         fvec4SIMD& operator++();
00097                         fvec4SIMD& operator--();
00098 
00100                         // Swizzle operators
00101 
00102                         template <comp X, comp Y, comp Z, comp W>
00103                         fvec4SIMD& swizzle();
00104                         template <comp X, comp Y, comp Z, comp W>
00105                         fvec4SIMD swizzle() const;
00106                         template <comp X, comp Y, comp Z>
00107                         fvec4SIMD swizzle() const;
00108                         template <comp X, comp Y>
00109                         fvec4SIMD swizzle() const;
00110                         template <comp X>
00111                         fvec4SIMD swizzle() const;
00112                 };
00113 
00114         }//namespace detail
00115 
00116         namespace gtx{
00118         namespace simd_vec4
00119         {
00120                 typedef detail::fvec4SIMD simdVec4;
00121 
00124 
00127                 detail::tvec4<float> vec4_cast(
00128                         detail::fvec4SIMD const & x);
00129 
00132                 detail::fvec4SIMD abs(detail::fvec4SIMD const & x);
00133 
00136                 detail::fvec4SIMD sign(detail::fvec4SIMD const & x);
00137 
00140                 detail::fvec4SIMD floor(detail::fvec4SIMD const & x);
00141 
00145                 detail::fvec4SIMD trunc(detail::fvec4SIMD const & x);
00146 
00153                 detail::fvec4SIMD round(detail::fvec4SIMD const & x);
00154 
00159                 //detail::fvec4SIMD roundEven(detail::fvec4SIMD const & x);
00160 
00164                 detail::fvec4SIMD ceil(detail::fvec4SIMD const & x);
00165 
00168                 detail::fvec4SIMD fract(detail::fvec4SIMD const & x);
00169 
00173                 detail::fvec4SIMD mod(
00174                         detail::fvec4SIMD const & x, 
00175                         detail::fvec4SIMD const & y);
00176 
00180                 detail::fvec4SIMD mod(
00181                         detail::fvec4SIMD const & x, 
00182                         float const & y);
00183 
00189                 //detail::fvec4SIMD modf(
00190                 //      detail::fvec4SIMD const & x, 
00191                 //      detail::fvec4SIMD & i);
00192 
00195                 detail::fvec4SIMD min(
00196                         detail::fvec4SIMD const & x, 
00197                         detail::fvec4SIMD const & y);
00198 
00199                 detail::fvec4SIMD min(
00200                         detail::fvec4SIMD const & x, 
00201                         float const & y);
00202 
00205                 detail::fvec4SIMD max(
00206                         detail::fvec4SIMD const & x, 
00207                         detail::fvec4SIMD const & y);
00208 
00209                 detail::fvec4SIMD max(
00210                         detail::fvec4SIMD const & x, 
00211                         float const & y);
00212 
00216                 detail::fvec4SIMD clamp(
00217                         detail::fvec4SIMD const & x, 
00218                         detail::fvec4SIMD const & minVal, 
00219                         detail::fvec4SIMD const & maxVal); 
00220 
00221                 detail::fvec4SIMD clamp(
00222                         detail::fvec4SIMD const & x, 
00223                         float const & minVal, 
00224                         float const & maxVal); 
00225 
00249                 // \todo Test when 'a' is a boolean.
00251                 detail::fvec4SIMD mix(
00252                         detail::fvec4SIMD const & x, 
00253                         detail::fvec4SIMD const & y, 
00254                         detail::fvec4SIMD const & a);
00255 
00258                 detail::fvec4SIMD step(
00259                         detail::fvec4SIMD const & edge, 
00260                         detail::fvec4SIMD const & x);
00261 
00262                 detail::fvec4SIMD step(
00263                         float const & edge, 
00264                         detail::fvec4SIMD const & x);
00265 
00276                 detail::fvec4SIMD smoothstep(
00277                         detail::fvec4SIMD const & edge0, 
00278                         detail::fvec4SIMD const & edge1, 
00279                         detail::fvec4SIMD const & x);
00280 
00281                 detail::fvec4SIMD smoothstep(
00282                         float const & edge0, 
00283                         float const & edge1, 
00284                         detail::fvec4SIMD const & x);
00285 
00292                 //bvec4 isnan(detail::fvec4SIMD const & x);
00293 
00300                 //bvec4 isinf(detail::fvec4SIMD const & x);
00301 
00306                 //detail::ivec4SIMD floatBitsToInt(detail::fvec4SIMD const & value);
00307 
00314                 //detail::fvec4SIMD intBitsToFloat(detail::ivec4SIMD const & value);
00315 
00318                 detail::fvec4SIMD fma(
00319                         detail::fvec4SIMD const & a, 
00320                         detail::fvec4SIMD const & b, 
00321                         detail::fvec4SIMD const & c);
00322 
00332                 //detail::fvec4SIMD frexp(detail::fvec4SIMD const & x, detail::ivec4SIMD & exp);
00333 
00340                 //detail::fvec4SIMD ldexp(detail::fvec4SIMD const & x, detail::ivec4SIMD const & exp);
00341 
00344                 float length(
00345                         detail::fvec4SIMD const & x);
00346 
00350                 float fastLength(
00351                         detail::fvec4SIMD const & x);
00352 
00356                 float niceLength(
00357                         detail::fvec4SIMD const & x);
00358 
00361                 detail::fvec4SIMD length4(
00362                         detail::fvec4SIMD const & x);
00363 
00367                 detail::fvec4SIMD fastLength4(
00368                         detail::fvec4SIMD const & x);
00369 
00373                 detail::fvec4SIMD niceLength4(
00374                         detail::fvec4SIMD const & x);
00375 
00378                 float distance(
00379                         detail::fvec4SIMD const & p0,
00380                         detail::fvec4SIMD const & p1);
00381 
00384                 detail::fvec4SIMD distance4(
00385                         detail::fvec4SIMD const & p0,
00386                         detail::fvec4SIMD const & p1);
00387 
00390                 float simdDot(
00391                         detail::fvec4SIMD const & x,
00392                         detail::fvec4SIMD const & y);
00393 
00396                 detail::fvec4SIMD dot4(
00397                         detail::fvec4SIMD const & x,
00398                         detail::fvec4SIMD const & y);
00399 
00402                 detail::fvec4SIMD cross(
00403                         detail::fvec4SIMD const & x,
00404                         detail::fvec4SIMD const & y);
00405 
00408                 detail::fvec4SIMD normalize(
00409                         detail::fvec4SIMD const & x);
00410 
00414                 detail::fvec4SIMD fastNormalize(
00415                         detail::fvec4SIMD const & x);
00416 
00419                 detail::fvec4SIMD simdFaceforward(
00420                         detail::fvec4SIMD const & N,
00421                         detail::fvec4SIMD const & I,
00422                         detail::fvec4SIMD const & Nref);
00423 
00427                 detail::fvec4SIMD reflect(
00428                         detail::fvec4SIMD const & I,
00429                         detail::fvec4SIMD const & N);
00430 
00435                 detail::fvec4SIMD refract(
00436                         detail::fvec4SIMD const & I,
00437                         detail::fvec4SIMD const & N,
00438                         float const & eta);
00439 
00442                 detail::fvec4SIMD sqrt(
00443                         detail::fvec4SIMD const & x);
00444 
00448                 detail::fvec4SIMD niceSqrt(
00449                         detail::fvec4SIMD const & x);
00450 
00454                 detail::fvec4SIMD fastSqrt(
00455                         detail::fvec4SIMD const & x);
00456 
00459                 detail::fvec4SIMD inversesqrt(
00460                         detail::fvec4SIMD const & x);
00461 
00465                 detail::fvec4SIMD fastInversesqrt(
00466                         detail::fvec4SIMD const & x);
00467 
00469         }//namespace simd_vec4
00470         }//namespace gtx
00471 }//namespace glm
00472 
00473 #include "simd_vec4.inl"
00474 
00475 namespace glm{using namespace gtx::simd_vec4;}
00476 
00477 #endif//glm_gtx_simd_vec4