29# include <pmmintrin.h>
34# pragma warning( disable : 4251 )
44 const double* v_01Ptr = v_01.
ptr();
45 const double* v_11Ptr = v_11.
ptr();
47 const double* v_02Ptr = v_02.
ptr();
48 const double* v_12Ptr = v_12.
ptr();
56 __m128d tmp1 = _mm_mul_pd( _mm_load_pd( v_01Ptr + 0 ), _mm_load_pd( v_11Ptr + 0 ) );
57 __m128d tmp2 = _mm_mul_pd( _mm_load_pd( v_01Ptr + 2 ), _mm_load_pd( v_11Ptr + 2 ) );
59 __m128d tmp3 = _mm_mul_pd( _mm_load_pd( v_02Ptr + 0 ), _mm_load_pd( v_12Ptr + 0 ) );
60 __m128d tmp4 = _mm_mul_pd( _mm_load_pd( v_02Ptr + 2 ), _mm_load_pd( v_12Ptr + 2 ) );
62 tmp1 = _mm_add_pd( tmp1, tmp2 );
63 tmp3 = _mm_add_pd( tmp3, tmp4 );
67 tmp1 = _mm_hadd_pd( tmp1, tmp3 );
68 _mm_store_pd( output, tmp1 );
70 return output[0] + output[1];
72 return v_01 * v_11 + v_02 * v_12;
79 const float* v_01Ptr = v_01.
ptr();
80 const float* v_11Ptr = v_11.
ptr();
82 const float* v_02Ptr = v_02.
ptr();
83 const float* v_12Ptr = v_12.
ptr();
87 __m128 tmp1 = _mm_mul_ps( _mm_load_ps( v_01Ptr ), _mm_load_ps( v_11Ptr ) );
88 __m128 tmp2 = _mm_mul_ps( _mm_load_ps( v_02Ptr ), _mm_load_ps( v_12Ptr ) );
90 tmp1 = _mm_add_ps( tmp1, tmp2 );
92 _mm_store_ps( output, tmp1 );
94 return output[0]+output[1]+output[2];
98 return v_01 * v_11 + v_02 * v_12;
103 template <
typename T>
276 template <
typename T>
302 template <
typename T>
328 template <
typename T>
366 template <
typename T>
385 template <
typename T>
394 const float* mPtr = m.
ptr();
395 const float* vPtr = v.
ptr();
396 __m128 r1 = _mm_load_ps( mPtr + 0 );
397 __m128 r2 = _mm_load_ps( mPtr + 4 );
398 __m128 r3 = _mm_load_ps( mPtr + 8 );
400 __m128 v1 = _mm_load_ps( vPtr );
402 r1 = _mm_mul_ps( r1, v1 );
403 r2 = _mm_mul_ps( r2, v1 );
404 r3 = _mm_mul_ps( r3, v1 );
406 r1 = _mm_hadd_ps( r1, r2 );
407 r3 = _mm_hadd_ps( r3, v1 );
409 r1 = _mm_hadd_ps( r1, r3 );
412 _mm_store_ps( output.ptr(), r1 );
413 return Vec3f( output.ptr() );
421 template <
typename T>
424 template <
typename T>
427 template <
typename T>
430 template <
typename T>
433 template <
typename T>
436 template <
typename T>
440 template <
typename T>
443 template <
typename T>
446 template <
typename T>
449 template <
typename T>
452 template <
typename T>
455 template <
typename T>
460 template <
typename T>
463 template <
typename T>
466 template <
typename T>
469 template <
typename T>
472 template <
typename T>
475 template <
typename T>
479 template <
typename T>
482 template <
typename T>
485 template <
typename T>
488 template <
typename T>
491 template <
typename T>
494 template <
typename T>
499 template <
typename T>
502 template <
typename T>
505 template <
typename T>
508 template <
typename T>
511 template <
typename T>
514 template <
typename T>
518 template <
typename T>
521 template <
typename T>
524 template <
typename T>
527 template <
typename T>
530 template <
typename T>
533 template <
typename T>
#define AGX_TYPE_BINDING(_Type, _Name)
Jacobian6DOFElementT< T > & normal2()
Jacobian6DOFElementT< T > & normal1()
Jacobian6DOFElementT< T > & uTangent1()
Jacobian6DOFElementT< T > & vTangent1()
Jacobian6DOFElementT< T > & vTangent2()
Jacobian6DOFElementT< T > & uTangent2()
void add(const T &v1, const T &v2)
Add v1 to spatial and v2 to rotational.
void set(const T &v1, const T &v2)
Assignment.
Real operator*(const Jacobian6DOFElementT &rhs) const
Multiplication operator, multiply this (lhs) with another element (rhs).
Jacobian6DOFElementT & operator=(const Jacobian6DOFElementT &other)
Assignment operator, lhs.spatial = rhs.spatial and lhs.rotational = rhs.rotational.
Jacobian6DOFElementT operator/(Real rhs) const
bool operator==(const Jacobian6DOFElementT &other)
Jacobian6DOFElementT(const Jacobian6DOFElementT &other)
Copy constructor.
const T & rotational() const
Jacobian6DOFElementT()
Default constructor.
Jacobian6DOFElementT & operator*=(Real rhs)
Jacobian6DOFElementT(const T &spat, const T &rot)
Construct given spatial and rotational value.
Real mult(const T &v1, const T &v2) const
Scalar product between this and two other vectors.
Jacobian6DOFElementT & operator/=(Real rhs)
const T & spatial() const
T * ptr()
Access internal buffer.
Jacobian6DOFElementT< T > & uTangent2()
Jacobian6DOFElementT< T > & normal2()
Jacobian6DOFElementT< T > & vTangent2()
A class holding 3 dimensional vectors and providing basic arithmetic.
A class holding 4 dimensional vectors and providing basic arithmetic.
#define AGX_ALIGNED(t, a)
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
JacobianMetaT< Vec3f > JacobianMeta32
Jacobian6DOFElementT< Vec3 > Jacobian6DOFElement
ParticleParticleContactJacobianT< Vec3f > ParticleParticleContactJacobian32
ParticleBodyContactJacobianT< Vec3f > ParticleBodyContactJacobian32
Jacobian6DOFElementT< Vec3f > Jacobian6DOFElement32
BodyBodyContactJacobianT< Vec3 > BodyBodyContactJacobian
BodyBodyContactJacobianT< Vec3f > BodyBodyContactJacobian32
ParticleBodyContactJacobianT< Vec3d > ParticleBodyContactJacobian64
BodyBodyContactJacobianT< Vec3d > BodyBodyContactJacobian64
ParticleParticleContactJacobianT< Vec3 > ParticleParticleContactJacobian
ParticleParticleContactJacobianT< Vec3d > ParticleParticleContactJacobian64
double innerProd_6(const Vec3d &v_01, const Vec3d &v_02, const Vec3d &v_11, const Vec3d &v_12)
Real mult(const Jacobian6DOFElementT< T > &G1, const Jacobian6DOFElementT< T > &G2)
ParticleBodyContactJacobianT< Vec3 > ParticleBodyContactJacobian
JacobianMetaT< Vec3 > JacobianMeta
JacobianMetaT< Vec3d > JacobianMeta64
Jacobian6DOFElementT< Vec3d > Jacobian6DOFElement64