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 #pragma once
00039
00040
00041 #include "../glm.hpp"
00042
00043 #if(GLM_ARCH != GLM_ARCH_PURE)
00044
00045 #if(GLM_ARCH & GLM_ARCH_SSE2)
00046 # include "../detail/intrinsic_common.hpp"
00047 # include "../detail/intrinsic_geometric.hpp"
00048 # include "../detail/intrinsic_integer.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_INCLUDED))
00054 # pragma message("GLM: GLM_GTX_simd_vec4 extension included")
00055 #endif
00056
00057
00058
00059 #if (GLM_COMPILER & GLM_COMPILER_VC)
00060 # pragma warning(push)
00061 # pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
00062 #endif
00063
00064 namespace glm
00065 {
00066 enum comp
00067 {
00068 X = 0,
00069 R = 0,
00070 S = 0,
00071 Y = 1,
00072 G = 1,
00073 T = 1,
00074 Z = 2,
00075 B = 2,
00076 P = 2,
00077 W = 3,
00078 A = 3,
00079 Q = 3
00080 };
00081
00082 }
00083
00084 namespace glm{
00085 namespace detail
00086 {
00089 GLM_ALIGNED_STRUCT(16) fvec4SIMD
00090 {
00091 enum ctor{null};
00092 typedef __m128 value_type;
00093 typedef std::size_t size_type;
00094 static size_type value_size();
00095
00096 typedef fvec4SIMD type;
00097 typedef tvec4<bool, highp> bool_type;
00098
00099 #ifdef GLM_SIMD_ENABLE_XYZW_UNION
00100 union
00101 {
00102 __m128 Data;
00103 struct {float x, y, z, w;};
00104 };
00105 #else
00106 __m128 Data;
00107 #endif
00108
00110
00111
00112 fvec4SIMD();
00113 fvec4SIMD(__m128 const & Data);
00114 fvec4SIMD(fvec4SIMD const & v);
00115
00117
00118
00119 explicit fvec4SIMD(
00120 ctor);
00121 explicit fvec4SIMD(
00122 float const & s);
00123 explicit fvec4SIMD(
00124 float const & x,
00125 float const & y,
00126 float const & z,
00127 float const & w);
00128 explicit fvec4SIMD(
00129 vec4 const & v);
00130
00133
00134 fvec4SIMD(vec2 const & v, float const & s1, float const & s2);
00135 fvec4SIMD(float const & s1, vec2 const & v, float const & s2);
00136 fvec4SIMD(float const & s1, float const & s2, vec2 const & v);
00137 fvec4SIMD(vec3 const & v, float const & s);
00138 fvec4SIMD(float const & s, vec3 const & v);
00139 fvec4SIMD(vec2 const & v1, vec2 const & v2);
00140
00141
00143
00144
00145 fvec4SIMD& operator= (fvec4SIMD const & v);
00146 fvec4SIMD& operator+=(fvec4SIMD const & v);
00147 fvec4SIMD& operator-=(fvec4SIMD const & v);
00148 fvec4SIMD& operator*=(fvec4SIMD const & v);
00149 fvec4SIMD& operator/=(fvec4SIMD const & v);
00150
00151 fvec4SIMD& operator+=(float const & s);
00152 fvec4SIMD& operator-=(float const & s);
00153 fvec4SIMD& operator*=(float const & s);
00154 fvec4SIMD& operator/=(float const & s);
00155
00156 fvec4SIMD& operator++();
00157 fvec4SIMD& operator--();
00158
00160
00161
00162 template <comp X, comp Y, comp Z, comp W>
00163 fvec4SIMD& swizzle();
00164 template <comp X, comp Y, comp Z, comp W>
00165 fvec4SIMD swizzle() const;
00166 template <comp X, comp Y, comp Z>
00167 fvec4SIMD swizzle() const;
00168 template <comp X, comp Y>
00169 fvec4SIMD swizzle() const;
00170 template <comp X>
00171 fvec4SIMD swizzle() const;
00172 };
00173 }
00174
00175 typedef glm::detail::fvec4SIMD simdVec4;
00176
00179
00182 vec4 vec4_cast(
00183 detail::fvec4SIMD const & x);
00184
00187 detail::fvec4SIMD abs(detail::fvec4SIMD const & x);
00188
00191 detail::fvec4SIMD sign(detail::fvec4SIMD const & x);
00192
00195 detail::fvec4SIMD floor(detail::fvec4SIMD const & x);
00196
00200 detail::fvec4SIMD trunc(detail::fvec4SIMD const & x);
00201
00209 detail::fvec4SIMD round(detail::fvec4SIMD const & x);
00210
00216
00217
00221 detail::fvec4SIMD ceil(detail::fvec4SIMD const & x);
00222
00226 detail::fvec4SIMD fract(detail::fvec4SIMD const & x);
00227
00232 detail::fvec4SIMD mod(
00233 detail::fvec4SIMD const & x,
00234 detail::fvec4SIMD const & y);
00235
00240 detail::fvec4SIMD mod(
00241 detail::fvec4SIMD const & x,
00242 float const & y);
00243
00249
00250
00251
00252
00256 detail::fvec4SIMD min(
00257 detail::fvec4SIMD const & x,
00258 detail::fvec4SIMD const & y);
00259
00260 detail::fvec4SIMD min(
00261 detail::fvec4SIMD const & x,
00262 float const & y);
00263
00267 detail::fvec4SIMD max(
00268 detail::fvec4SIMD const & x,
00269 detail::fvec4SIMD const & y);
00270
00271 detail::fvec4SIMD max(
00272 detail::fvec4SIMD const & x,
00273 float const & y);
00274
00279 detail::fvec4SIMD clamp(
00280 detail::fvec4SIMD const & x,
00281 detail::fvec4SIMD const & minVal,
00282 detail::fvec4SIMD const & maxVal);
00283
00284 detail::fvec4SIMD clamp(
00285 detail::fvec4SIMD const & x,
00286 float const & minVal,
00287 float const & maxVal);
00288
00315 detail::fvec4SIMD mix(
00316 detail::fvec4SIMD const & x,
00317 detail::fvec4SIMD const & y,
00318 detail::fvec4SIMD const & a);
00319
00323 detail::fvec4SIMD step(
00324 detail::fvec4SIMD const & edge,
00325 detail::fvec4SIMD const & x);
00326
00327 detail::fvec4SIMD step(
00328 float const & edge,
00329 detail::fvec4SIMD const & x);
00330
00342 detail::fvec4SIMD smoothstep(
00343 detail::fvec4SIMD const & edge0,
00344 detail::fvec4SIMD const & edge1,
00345 detail::fvec4SIMD const & x);
00346
00347 detail::fvec4SIMD smoothstep(
00348 float const & edge0,
00349 float const & edge1,
00350 detail::fvec4SIMD const & x);
00351
00359
00360
00368
00369
00375
00376
00384
00385
00389 detail::fvec4SIMD fma(
00390 detail::fvec4SIMD const & a,
00391 detail::fvec4SIMD const & b,
00392 detail::fvec4SIMD const & c);
00393
00404
00405
00413
00414
00418 float length(
00419 detail::fvec4SIMD const & x);
00420
00425 float fastLength(
00426 detail::fvec4SIMD const & x);
00427
00432 float niceLength(
00433 detail::fvec4SIMD const & x);
00434
00438 detail::fvec4SIMD length4(
00439 detail::fvec4SIMD const & x);
00440
00445 detail::fvec4SIMD fastLength4(
00446 detail::fvec4SIMD const & x);
00447
00452 detail::fvec4SIMD niceLength4(
00453 detail::fvec4SIMD const & x);
00454
00458 float distance(
00459 detail::fvec4SIMD const & p0,
00460 detail::fvec4SIMD const & p1);
00461
00465 detail::fvec4SIMD distance4(
00466 detail::fvec4SIMD const & p0,
00467 detail::fvec4SIMD const & p1);
00468
00472 float simdDot(
00473 detail::fvec4SIMD const & x,
00474 detail::fvec4SIMD const & y);
00475
00479 detail::fvec4SIMD dot4(
00480 detail::fvec4SIMD const & x,
00481 detail::fvec4SIMD const & y);
00482
00486 detail::fvec4SIMD cross(
00487 detail::fvec4SIMD const & x,
00488 detail::fvec4SIMD const & y);
00489
00493 detail::fvec4SIMD normalize(
00494 detail::fvec4SIMD const & x);
00495
00500 detail::fvec4SIMD fastNormalize(
00501 detail::fvec4SIMD const & x);
00502
00506 detail::fvec4SIMD simdFaceforward(
00507 detail::fvec4SIMD const & N,
00508 detail::fvec4SIMD const & I,
00509 detail::fvec4SIMD const & Nref);
00510
00515 detail::fvec4SIMD reflect(
00516 detail::fvec4SIMD const & I,
00517 detail::fvec4SIMD const & N);
00518
00524 detail::fvec4SIMD refract(
00525 detail::fvec4SIMD const & I,
00526 detail::fvec4SIMD const & N,
00527 float const & eta);
00528
00532 detail::fvec4SIMD sqrt(
00533 detail::fvec4SIMD const & x);
00534
00539 detail::fvec4SIMD niceSqrt(
00540 detail::fvec4SIMD const & x);
00541
00546 detail::fvec4SIMD fastSqrt(
00547 detail::fvec4SIMD const & x);
00548
00552 detail::fvec4SIMD inversesqrt(
00553 detail::fvec4SIMD const & x);
00554
00559 detail::fvec4SIMD fastInversesqrt(
00560 detail::fvec4SIMD const & x);
00561
00563 }
00564
00565 #include "simd_vec4.inl"
00566
00567 #if (GLM_COMPILER & GLM_COMPILER_VC)
00568 # pragma warning(pop)
00569 #endif
00570
00571 #endif//(GLM_ARCH != GLM_ARCH_PURE)