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 {
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
00051
00052 fvec4SIMD();
00053 fvec4SIMD(__m128 const & Data);
00054 fvec4SIMD(fvec4SIMD const & v);
00055
00057
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
00081
00083
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
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 }
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
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
00190
00191
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
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
00293
00300
00301
00306
00307
00314
00315
00318 detail::fvec4SIMD fma(
00319 detail::fvec4SIMD const & a,
00320 detail::fvec4SIMD const & b,
00321 detail::fvec4SIMD const & c);
00322
00332
00333
00340
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 }
00470 }
00471 }
00472
00473 #include "simd_vec4.inl"
00474
00475 namespace glm{using namespace gtx::simd_vec4;}
00476
00477 #endif//glm_gtx_simd_vec4