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
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
00076
00077 fvec4SIMD();
00078 fvec4SIMD(__m128 const & Data);
00079 fvec4SIMD(fvec4SIMD const & v);
00080
00082
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
00106
00108
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
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 }
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
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
00210
00211
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
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
00313
00320
00321
00326
00327
00334
00335
00338 detail::fvec4SIMD fma(
00339 detail::fvec4SIMD const & a,
00340 detail::fvec4SIMD const & b,
00341 detail::fvec4SIMD const & c);
00342
00352
00353
00360
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 }
00490
00491 #include "simd_vec4.inl"
00492
00493 #endif//(GLM_ARCH != GLM_ARCH_PURE)
00494
00495 #endif//GLM_GTX_simd_vec4