diff --git a/src/vectormath/sse/mat_aos.h b/src/vectormath/sse/mat_aos.h index 2ba27bf2a..fe6aa62b9 100644 --- a/src/vectormath/sse/mat_aos.h +++ b/src/vectormath/sse/mat_aos.h @@ -62,33 +62,33 @@ namespace Aos { //----------------------------------------------------------------------------- // Definitions -__forceinline Matrix3::Matrix3( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE Matrix3::Matrix3( const Matrix3 & mat ) { mCol0 = mat.mCol0; mCol1 = mat.mCol1; mCol2 = mat.mCol2; } -__forceinline Matrix3::Matrix3( float scalar ) +VECTORMATH_FORCE_INLINE Matrix3::Matrix3( float scalar ) { mCol0 = Vector3( scalar ); mCol1 = Vector3( scalar ); mCol2 = Vector3( scalar ); } -__forceinline Matrix3::Matrix3( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Matrix3::Matrix3( const floatInVec &scalar ) { mCol0 = Vector3( scalar ); mCol1 = Vector3( scalar ); mCol2 = Vector3( scalar ); } -__forceinline Matrix3::Matrix3( const Quat &unitQuat ) +VECTORMATH_FORCE_INLINE Matrix3::Matrix3( const Quat &unitQuat ) { __m128 xyzw_2, wwww, yzxw, zxyw, yzxw_2, zxyw_2; __m128 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; - __declspec(align(16)) unsigned int sx[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int sz[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int sx[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int sz[4] = {0, 0, 0xffffffff, 0}; __m128 select_x = _mm_load_ps((float *)sx); __m128 select_z = _mm_load_ps((float *)sz); @@ -114,38 +114,38 @@ __forceinline Matrix3::Matrix3( const Quat &unitQuat ) mCol2 = Vector3( vec_sel( tmp5, tmp1, select_z ) ); } -__forceinline Matrix3::Matrix3( const Vector3 &_col0, const Vector3 &_col1, const Vector3 &_col2 ) +VECTORMATH_FORCE_INLINE Matrix3::Matrix3( const Vector3 &_col0, const Vector3 &_col1, const Vector3 &_col2 ) { mCol0 = _col0; mCol1 = _col1; mCol2 = _col2; } -__forceinline Matrix3 & Matrix3::setCol0( const Vector3 &_col0 ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::setCol0( const Vector3 &_col0 ) { mCol0 = _col0; return *this; } -__forceinline Matrix3 & Matrix3::setCol1( const Vector3 &_col1 ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::setCol1( const Vector3 &_col1 ) { mCol1 = _col1; return *this; } -__forceinline Matrix3 & Matrix3::setCol2( const Vector3 &_col2 ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::setCol2( const Vector3 &_col2 ) { mCol2 = _col2; return *this; } -__forceinline Matrix3 & Matrix3::setCol( int col, const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::setCol( int col, const Vector3 &vec ) { *(&mCol0 + col) = vec; return *this; } -__forceinline Matrix3 & Matrix3::setRow( int row, const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::setRow( int row, const Vector3 &vec ) { mCol0.setElem( row, vec.getElem( 0 ) ); mCol1.setElem( row, vec.getElem( 1 ) ); @@ -153,13 +153,13 @@ __forceinline Matrix3 & Matrix3::setRow( int row, const Vector3 &vec ) return *this; } -__forceinline Matrix3 & Matrix3::setElem( int col, int row, float val ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::setElem( int col, int row, float val ) { (*this)[col].setElem(row, val); return *this; } -__forceinline Matrix3 & Matrix3::setElem( int col, int row, const floatInVec &val ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::setElem( int col, int row, const floatInVec &val ) { Vector3 tmpV3_0; tmpV3_0 = this->getCol( col ); @@ -168,47 +168,47 @@ __forceinline Matrix3 & Matrix3::setElem( int col, int row, const floatInVec &va return *this; } -__forceinline const floatInVec Matrix3::getElem( int col, int row ) const +VECTORMATH_FORCE_INLINE const floatInVec Matrix3::getElem( int col, int row ) const { return this->getCol( col ).getElem( row ); } -__forceinline const Vector3 Matrix3::getCol0( ) const +VECTORMATH_FORCE_INLINE const Vector3 Matrix3::getCol0( ) const { return mCol0; } -__forceinline const Vector3 Matrix3::getCol1( ) const +VECTORMATH_FORCE_INLINE const Vector3 Matrix3::getCol1( ) const { return mCol1; } -__forceinline const Vector3 Matrix3::getCol2( ) const +VECTORMATH_FORCE_INLINE const Vector3 Matrix3::getCol2( ) const { return mCol2; } -__forceinline const Vector3 Matrix3::getCol( int col ) const +VECTORMATH_FORCE_INLINE const Vector3 Matrix3::getCol( int col ) const { return *(&mCol0 + col); } -__forceinline const Vector3 Matrix3::getRow( int row ) const +VECTORMATH_FORCE_INLINE const Vector3 Matrix3::getRow( int row ) const { return Vector3( mCol0.getElem( row ), mCol1.getElem( row ), mCol2.getElem( row ) ); } -__forceinline Vector3 & Matrix3::operator []( int col ) +VECTORMATH_FORCE_INLINE Vector3 & Matrix3::operator []( int col ) { return *(&mCol0 + col); } -__forceinline const Vector3 Matrix3::operator []( int col ) const +VECTORMATH_FORCE_INLINE const Vector3 Matrix3::operator []( int col ) const { return *(&mCol0 + col); } -__forceinline Matrix3 & Matrix3::operator =( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::operator =( const Matrix3 & mat ) { mCol0 = mat.mCol0; mCol1 = mat.mCol1; @@ -216,14 +216,14 @@ __forceinline Matrix3 & Matrix3::operator =( const Matrix3 & mat ) return *this; } -__forceinline const Matrix3 transpose( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const Matrix3 transpose( const Matrix3 & mat ) { __m128 tmp0, tmp1, res0, res1, res2; tmp0 = vec_mergeh( mat.getCol0().get128(), mat.getCol2().get128() ); tmp1 = vec_mergel( mat.getCol0().get128(), mat.getCol2().get128() ); res0 = vec_mergeh( tmp0, mat.getCol1().get128() ); //res1 = vec_perm( tmp0, mat.getCol1().get128(), _VECTORMATH_PERM_ZBWX ); - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; res1 = _mm_shuffle_ps( tmp0, tmp0, _MM_SHUFFLE(0,3,2,2)); res1 = vec_sel(res1, mat.getCol1().get128(), select_y); //res2 = vec_perm( tmp1, mat.getCol1().get128(), _VECTORMATH_PERM_XCYX ); @@ -236,7 +236,7 @@ __forceinline const Matrix3 transpose( const Matrix3 & mat ) ); } -__forceinline const Matrix3 inverse( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const Matrix3 inverse( const Matrix3 & mat ) { __m128 tmp0, tmp1, tmp2, tmp3, tmp4, dot, invdet, inv0, inv1, inv2; tmp2 = _vmathVfCross( mat.getCol0().get128(), mat.getCol1().get128() ); @@ -249,7 +249,7 @@ __forceinline const Matrix3 inverse( const Matrix3 & mat ) tmp4 = vec_mergel( tmp0, tmp2 ); inv0 = vec_mergeh( tmp3, tmp1 ); //inv1 = vec_perm( tmp3, tmp1, _VECTORMATH_PERM_ZBWX ); - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; inv1 = _mm_shuffle_ps( tmp3, tmp3, _MM_SHUFFLE(0,3,2,2)); inv1 = vec_sel(inv1, tmp1, select_y); //inv2 = vec_perm( tmp4, tmp1, _VECTORMATH_PERM_XCYX ); @@ -265,12 +265,12 @@ __forceinline const Matrix3 inverse( const Matrix3 & mat ) ); } -__forceinline const floatInVec determinant( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const floatInVec determinant( const Matrix3 & mat ) { return dot( mat.getCol2(), cross( mat.getCol0(), mat.getCol1() ) ); } -__forceinline const Matrix3 Matrix3::operator +( const Matrix3 & mat ) const +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::operator +( const Matrix3 & mat ) const { return Matrix3( ( mCol0 + mat.mCol0 ), @@ -279,7 +279,7 @@ __forceinline const Matrix3 Matrix3::operator +( const Matrix3 & mat ) const ); } -__forceinline const Matrix3 Matrix3::operator -( const Matrix3 & mat ) const +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::operator -( const Matrix3 & mat ) const { return Matrix3( ( mCol0 - mat.mCol0 ), @@ -288,19 +288,19 @@ __forceinline const Matrix3 Matrix3::operator -( const Matrix3 & mat ) const ); } -__forceinline Matrix3 & Matrix3::operator +=( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::operator +=( const Matrix3 & mat ) { *this = *this + mat; return *this; } -__forceinline Matrix3 & Matrix3::operator -=( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::operator -=( const Matrix3 & mat ) { *this = *this - mat; return *this; } -__forceinline const Matrix3 Matrix3::operator -( ) const +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::operator -( ) const { return Matrix3( ( -mCol0 ), @@ -309,7 +309,7 @@ __forceinline const Matrix3 Matrix3::operator -( ) const ); } -__forceinline const Matrix3 absPerElem( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const Matrix3 absPerElem( const Matrix3 & mat ) { return Matrix3( absPerElem( mat.getCol0() ), @@ -318,12 +318,12 @@ __forceinline const Matrix3 absPerElem( const Matrix3 & mat ) ); } -__forceinline const Matrix3 Matrix3::operator *( float scalar ) const +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::operator *( float scalar ) const { return *this * floatInVec(scalar); } -__forceinline const Matrix3 Matrix3::operator *( const floatInVec &scalar ) const +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::operator *( const floatInVec &scalar ) const { return Matrix3( ( mCol0 * scalar ), @@ -332,28 +332,28 @@ __forceinline const Matrix3 Matrix3::operator *( const floatInVec &scalar ) cons ); } -__forceinline Matrix3 & Matrix3::operator *=( float scalar ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::operator *=( float scalar ) { return *this *= floatInVec(scalar); } -__forceinline Matrix3 & Matrix3::operator *=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::operator *=( const floatInVec &scalar ) { *this = *this * scalar; return *this; } -__forceinline const Matrix3 operator *( float scalar, const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const Matrix3 operator *( float scalar, const Matrix3 & mat ) { return floatInVec(scalar) * mat; } -__forceinline const Matrix3 operator *( const floatInVec &scalar, const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const Matrix3 operator *( const floatInVec &scalar, const Matrix3 & mat ) { return mat * scalar; } -__forceinline const Vector3 Matrix3::operator *( const Vector3 &vec ) const +VECTORMATH_FORCE_INLINE const Vector3 Matrix3::operator *( const Vector3 &vec ) const { __m128 res; __m128 xxxx, yyyy, zzzz; @@ -366,7 +366,7 @@ __forceinline const Vector3 Matrix3::operator *( const Vector3 &vec ) const return Vector3( res ); } -__forceinline const Matrix3 Matrix3::operator *( const Matrix3 & mat ) const +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::operator *( const Matrix3 & mat ) const { return Matrix3( ( *this * mat.mCol0 ), @@ -375,13 +375,13 @@ __forceinline const Matrix3 Matrix3::operator *( const Matrix3 & mat ) const ); } -__forceinline Matrix3 & Matrix3::operator *=( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE Matrix3 & Matrix3::operator *=( const Matrix3 & mat ) { *this = *this * mat; return *this; } -__forceinline const Matrix3 mulPerElem( const Matrix3 & mat0, const Matrix3 & mat1 ) +VECTORMATH_FORCE_INLINE const Matrix3 mulPerElem( const Matrix3 & mat0, const Matrix3 & mat1 ) { return Matrix3( mulPerElem( mat0.getCol0(), mat1.getCol0() ), @@ -390,7 +390,7 @@ __forceinline const Matrix3 mulPerElem( const Matrix3 & mat0, const Matrix3 & ma ); } -__forceinline const Matrix3 Matrix3::identity( ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::identity( ) { return Matrix3( Vector3::xAxis( ), @@ -399,17 +399,17 @@ __forceinline const Matrix3 Matrix3::identity( ) ); } -__forceinline const Matrix3 Matrix3::rotationX( float radians ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotationX( float radians ) { return rotationX( floatInVec(radians) ); } -__forceinline const Matrix3 Matrix3::rotationX( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotationX( const floatInVec &radians ) { __m128 s, c, res1, res2; __m128 zero; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res1 = vec_sel( zero, c, select_y ); @@ -423,17 +423,17 @@ __forceinline const Matrix3 Matrix3::rotationX( const floatInVec &radians ) ); } -__forceinline const Matrix3 Matrix3::rotationY( float radians ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotationY( float radians ) { return rotationY( floatInVec(radians) ); } -__forceinline const Matrix3 Matrix3::rotationY( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotationY( const floatInVec &radians ) { __m128 s, c, res0, res2; __m128 zero; - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res0 = vec_sel( zero, c, select_x ); @@ -447,17 +447,17 @@ __forceinline const Matrix3 Matrix3::rotationY( const floatInVec &radians ) ); } -__forceinline const Matrix3 Matrix3::rotationZ( float radians ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotationZ( float radians ) { return rotationZ( floatInVec(radians) ); } -__forceinline const Matrix3 Matrix3::rotationZ( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotationZ( const floatInVec &radians ) { __m128 s, c, res0, res1; __m128 zero; - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res0 = vec_sel( zero, c, select_x ); @@ -471,7 +471,7 @@ __forceinline const Matrix3 Matrix3::rotationZ( const floatInVec &radians ) ); } -__forceinline const Matrix3 Matrix3::rotationZYX( const Vector3 &radiansXYZ ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotationZYX( const Vector3 &radiansXYZ ) { __m128 angles, s, negS, c, X0, X1, Y0, Y1, Z0, Z1, tmp; angles = Vector4( radiansXYZ, 0.0f ).get128(); @@ -479,7 +479,7 @@ __forceinline const Matrix3 Matrix3::rotationZYX( const Vector3 &radiansXYZ ) negS = negatef4( s ); Z0 = vec_mergel( c, s ); Z1 = vec_mergel( negS, c ); - __declspec(align(16)) unsigned int select_xyz[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_xyz[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0}; Z1 = vec_and( Z1, _mm_load_ps( (float *)select_xyz ) ); Y0 = _mm_shuffle_ps( c, negS, _MM_SHUFFLE(0,1,1,1) ); Y1 = _mm_shuffle_ps( s, c, _MM_SHUFFLE(0,1,1,1) ); @@ -493,12 +493,12 @@ __forceinline const Matrix3 Matrix3::rotationZYX( const Vector3 &radiansXYZ ) ); } -__forceinline const Matrix3 Matrix3::rotation( float radians, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotation( float radians, const Vector3 &unitVec ) { return rotation( floatInVec(radians), unitVec ); } -__forceinline const Matrix3 Matrix3::rotation( const floatInVec &radians, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotation( const floatInVec &radians, const Vector3 &unitVec ) { __m128 axis, s, c, oneMinusC, axisS, negAxisS, xxxx, yyyy, zzzz, tmp0, tmp1, tmp2; axis = unitVec.get128(); @@ -509,9 +509,9 @@ __forceinline const Matrix3 Matrix3::rotation( const floatInVec &radians, const oneMinusC = vec_sub( _mm_set1_ps(1.0f), c ); axisS = vec_mul( axis, s ); negAxisS = negatef4( axisS ); - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; //tmp0 = vec_perm( axisS, negAxisS, _VECTORMATH_PERM_XZBX ); tmp0 = _mm_shuffle_ps( axisS, axisS, _MM_SHUFFLE(0,0,2,0) ); tmp0 = vec_sel(tmp0, vec_splat(negAxisS, 1), select_z); @@ -530,17 +530,17 @@ __forceinline const Matrix3 Matrix3::rotation( const floatInVec &radians, const ); } -__forceinline const Matrix3 Matrix3::rotation( const Quat &unitQuat ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::rotation( const Quat &unitQuat ) { return Matrix3( unitQuat ); } -__forceinline const Matrix3 Matrix3::scale( const Vector3 &scaleVec ) +VECTORMATH_FORCE_INLINE const Matrix3 Matrix3::scale( const Vector3 &scaleVec ) { __m128 zero = _mm_setzero_ps(); - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; return Matrix3( Vector3( vec_sel( zero, scaleVec.get128(), select_x ) ), Vector3( vec_sel( zero, scaleVec.get128(), select_y ) ), @@ -548,7 +548,7 @@ __forceinline const Matrix3 Matrix3::scale( const Vector3 &scaleVec ) ); } -__forceinline const Matrix3 appendScale( const Matrix3 & mat, const Vector3 &scaleVec ) +VECTORMATH_FORCE_INLINE const Matrix3 appendScale( const Matrix3 & mat, const Vector3 &scaleVec ) { return Matrix3( ( mat.getCol0() * scaleVec.getX( ) ), @@ -557,7 +557,7 @@ __forceinline const Matrix3 appendScale( const Matrix3 & mat, const Vector3 &sca ); } -__forceinline const Matrix3 prependScale( const Vector3 &scaleVec, const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const Matrix3 prependScale( const Vector3 &scaleVec, const Matrix3 & mat ) { return Matrix3( mulPerElem( mat.getCol0(), scaleVec ), @@ -566,7 +566,7 @@ __forceinline const Matrix3 prependScale( const Vector3 &scaleVec, const Matrix3 ); } -__forceinline const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, bool select1 ) +VECTORMATH_FORCE_INLINE const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, bool select1 ) { return Matrix3( select( mat0.getCol0(), mat1.getCol0(), select1 ), @@ -575,7 +575,7 @@ __forceinline const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, ); } -__forceinline const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, const boolInVec &select1 ) +VECTORMATH_FORCE_INLINE const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, const boolInVec &select1 ) { return Matrix3( select( mat0.getCol0(), mat1.getCol0(), select1 ), @@ -586,14 +586,14 @@ __forceinline const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, #ifdef _VECTORMATH_DEBUG -__forceinline void print( const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE void print( const Matrix3 & mat ) { print( mat.getRow( 0 ) ); print( mat.getRow( 1 ) ); print( mat.getRow( 2 ) ); } -__forceinline void print( const Matrix3 & mat, const char * name ) +VECTORMATH_FORCE_INLINE void print( const Matrix3 & mat, const char * name ) { printf("%s:\n", name); print( mat ); @@ -601,7 +601,7 @@ __forceinline void print( const Matrix3 & mat, const char * name ) #endif -__forceinline Matrix4::Matrix4( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE Matrix4::Matrix4( const Matrix4 & mat ) { mCol0 = mat.mCol0; mCol1 = mat.mCol1; @@ -609,7 +609,7 @@ __forceinline Matrix4::Matrix4( const Matrix4 & mat ) mCol3 = mat.mCol3; } -__forceinline Matrix4::Matrix4( float scalar ) +VECTORMATH_FORCE_INLINE Matrix4::Matrix4( float scalar ) { mCol0 = Vector4( scalar ); mCol1 = Vector4( scalar ); @@ -617,7 +617,7 @@ __forceinline Matrix4::Matrix4( float scalar ) mCol3 = Vector4( scalar ); } -__forceinline Matrix4::Matrix4( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Matrix4::Matrix4( const floatInVec &scalar ) { mCol0 = Vector4( scalar ); mCol1 = Vector4( scalar ); @@ -625,7 +625,7 @@ __forceinline Matrix4::Matrix4( const floatInVec &scalar ) mCol3 = Vector4( scalar ); } -__forceinline Matrix4::Matrix4( const Transform3 & mat ) +VECTORMATH_FORCE_INLINE Matrix4::Matrix4( const Transform3 & mat ) { mCol0 = Vector4( mat.getCol0(), 0.0f ); mCol1 = Vector4( mat.getCol1(), 0.0f ); @@ -633,7 +633,7 @@ __forceinline Matrix4::Matrix4( const Transform3 & mat ) mCol3 = Vector4( mat.getCol3(), 1.0f ); } -__forceinline Matrix4::Matrix4( const Vector4 &_col0, const Vector4 &_col1, const Vector4 &_col2, const Vector4 &_col3 ) +VECTORMATH_FORCE_INLINE Matrix4::Matrix4( const Vector4 &_col0, const Vector4 &_col1, const Vector4 &_col2, const Vector4 &_col3 ) { mCol0 = _col0; mCol1 = _col1; @@ -641,7 +641,7 @@ __forceinline Matrix4::Matrix4( const Vector4 &_col0, const Vector4 &_col1, cons mCol3 = _col3; } -__forceinline Matrix4::Matrix4( const Matrix3 & mat, const Vector3 &translateVec ) +VECTORMATH_FORCE_INLINE Matrix4::Matrix4( const Matrix3 & mat, const Vector3 &translateVec ) { mCol0 = Vector4( mat.getCol0(), 0.0f ); mCol1 = Vector4( mat.getCol1(), 0.0f ); @@ -649,7 +649,7 @@ __forceinline Matrix4::Matrix4( const Matrix3 & mat, const Vector3 &translateVec mCol3 = Vector4( translateVec, 1.0f ); } -__forceinline Matrix4::Matrix4( const Quat &unitQuat, const Vector3 &translateVec ) +VECTORMATH_FORCE_INLINE Matrix4::Matrix4( const Quat &unitQuat, const Vector3 &translateVec ) { Matrix3 mat; mat = Matrix3( unitQuat ); @@ -659,37 +659,37 @@ __forceinline Matrix4::Matrix4( const Quat &unitQuat, const Vector3 &translateVe mCol3 = Vector4( translateVec, 1.0f ); } -__forceinline Matrix4 & Matrix4::setCol0( const Vector4 &_col0 ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setCol0( const Vector4 &_col0 ) { mCol0 = _col0; return *this; } -__forceinline Matrix4 & Matrix4::setCol1( const Vector4 &_col1 ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setCol1( const Vector4 &_col1 ) { mCol1 = _col1; return *this; } -__forceinline Matrix4 & Matrix4::setCol2( const Vector4 &_col2 ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setCol2( const Vector4 &_col2 ) { mCol2 = _col2; return *this; } -__forceinline Matrix4 & Matrix4::setCol3( const Vector4 &_col3 ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setCol3( const Vector4 &_col3 ) { mCol3 = _col3; return *this; } -__forceinline Matrix4 & Matrix4::setCol( int col, const Vector4 &vec ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setCol( int col, const Vector4 &vec ) { *(&mCol0 + col) = vec; return *this; } -__forceinline Matrix4 & Matrix4::setRow( int row, const Vector4 &vec ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setRow( int row, const Vector4 &vec ) { mCol0.setElem( row, vec.getElem( 0 ) ); mCol1.setElem( row, vec.getElem( 1 ) ); @@ -698,13 +698,13 @@ __forceinline Matrix4 & Matrix4::setRow( int row, const Vector4 &vec ) return *this; } -__forceinline Matrix4 & Matrix4::setElem( int col, int row, float val ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setElem( int col, int row, float val ) { (*this)[col].setElem(row, val); return *this; } -__forceinline Matrix4 & Matrix4::setElem( int col, int row, const floatInVec &val ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setElem( int col, int row, const floatInVec &val ) { Vector4 tmpV3_0; tmpV3_0 = this->getCol( col ); @@ -713,52 +713,52 @@ __forceinline Matrix4 & Matrix4::setElem( int col, int row, const floatInVec &va return *this; } -__forceinline const floatInVec Matrix4::getElem( int col, int row ) const +VECTORMATH_FORCE_INLINE const floatInVec Matrix4::getElem( int col, int row ) const { return this->getCol( col ).getElem( row ); } -__forceinline const Vector4 Matrix4::getCol0( ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::getCol0( ) const { return mCol0; } -__forceinline const Vector4 Matrix4::getCol1( ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::getCol1( ) const { return mCol1; } -__forceinline const Vector4 Matrix4::getCol2( ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::getCol2( ) const { return mCol2; } -__forceinline const Vector4 Matrix4::getCol3( ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::getCol3( ) const { return mCol3; } -__forceinline const Vector4 Matrix4::getCol( int col ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::getCol( int col ) const { return *(&mCol0 + col); } -__forceinline const Vector4 Matrix4::getRow( int row ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::getRow( int row ) const { return Vector4( mCol0.getElem( row ), mCol1.getElem( row ), mCol2.getElem( row ), mCol3.getElem( row ) ); } -__forceinline Vector4 & Matrix4::operator []( int col ) +VECTORMATH_FORCE_INLINE Vector4 & Matrix4::operator []( int col ) { return *(&mCol0 + col); } -__forceinline const Vector4 Matrix4::operator []( int col ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::operator []( int col ) const { return *(&mCol0 + col); } -__forceinline Matrix4 & Matrix4::operator =( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::operator =( const Matrix4 & mat ) { mCol0 = mat.mCol0; mCol1 = mat.mCol1; @@ -767,7 +767,7 @@ __forceinline Matrix4 & Matrix4::operator =( const Matrix4 & mat ) return *this; } -__forceinline const Matrix4 transpose( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const Matrix4 transpose( const Matrix4 & mat ) { __m128 tmp0, tmp1, tmp2, tmp3, res0, res1, res2, res3; tmp0 = vec_mergeh( mat.getCol0().get128(), mat.getCol2().get128() ); @@ -787,11 +787,11 @@ __forceinline const Matrix4 transpose( const Matrix4 & mat ) } // TODO: Tidy -static __declspec(align(16)) const unsigned int _vmathPNPN[4] = {0x00000000, 0x80000000, 0x00000000, 0x80000000}; -static __declspec(align(16)) const unsigned int _vmathNPNP[4] = {0x80000000, 0x00000000, 0x80000000, 0x00000000}; -static __declspec(align(16)) const float _vmathZERONE[4] = {1.0f, 0.0f, 0.0f, 1.0f}; +static VM_ATTRIBUTE_ALIGN16 const unsigned int _vmathPNPN[4] = {0x00000000, 0x80000000, 0x00000000, 0x80000000}; +static VM_ATTRIBUTE_ALIGN16 const unsigned int _vmathNPNP[4] = {0x80000000, 0x00000000, 0x80000000, 0x00000000}; +static VM_ATTRIBUTE_ALIGN16 const float _vmathZERONE[4] = {1.0f, 0.0f, 0.0f, 1.0f}; -__forceinline const Matrix4 inverse( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const Matrix4 inverse( const Matrix4 & mat ) { __m128 Va,Vb,Vc; __m128 r1,r2,r3,tt,tt2; @@ -806,13 +806,13 @@ __forceinline const Matrix4 inverse( const Matrix4 & mat ) // _mm_ror_ps is just a macro using _mm_shuffle_ps(). tt = _L4; tt2 = _mm_ror_ps(_L3,1); - Vc = _mm_mul_ps(tt2,_mm_ror_ps(tt,0)); // V3'·V4 - Va = _mm_mul_ps(tt2,_mm_ror_ps(tt,2)); // V3'·V4" - Vb = _mm_mul_ps(tt2,_mm_ror_ps(tt,3)); // V3'·V4^ + Vc = _mm_mul_ps(tt2,_mm_ror_ps(tt,0)); // V3'dot V4 + Va = _mm_mul_ps(tt2,_mm_ror_ps(tt,2)); // V3'dot V4" + Vb = _mm_mul_ps(tt2,_mm_ror_ps(tt,3)); // V3' dot V4^ - r1 = _mm_sub_ps(_mm_ror_ps(Va,1),_mm_ror_ps(Vc,2)); // V3"·V4^ - V3^·V4" - r2 = _mm_sub_ps(_mm_ror_ps(Vb,2),_mm_ror_ps(Vb,0)); // V3^·V4' - V3'·V4^ - r3 = _mm_sub_ps(_mm_ror_ps(Va,0),_mm_ror_ps(Vc,1)); // V3'·V4" - V3"·V4' + r1 = _mm_sub_ps(_mm_ror_ps(Va,1),_mm_ror_ps(Vc,2)); // V3" dot V4^ - V3^ dot V4" + r2 = _mm_sub_ps(_mm_ror_ps(Vb,2),_mm_ror_ps(Vb,0)); // V3^ dot V4' - V3' dot V4^ + r3 = _mm_sub_ps(_mm_ror_ps(Va,0),_mm_ror_ps(Vc,1)); // V3' dot V4" - V3" dot V4' tt = _L2; Va = _mm_ror_ps(tt,1); sum = _mm_mul_ps(Va,r1); @@ -839,13 +839,13 @@ __forceinline const Matrix4 inverse( const Matrix4 & mat ) // Calculating the minterms of the third line. tt = _mm_ror_ps(_L1,1); - Va = _mm_mul_ps(tt,Vb); // V1'·V2" - Vb = _mm_mul_ps(tt,Vc); // V1'·V2^ - Vc = _mm_mul_ps(tt,_L2); // V1'·V2 + Va = _mm_mul_ps(tt,Vb); // V1' dot V2" + Vb = _mm_mul_ps(tt,Vc); // V1' dot V2^ + Vc = _mm_mul_ps(tt,_L2); // V1' dot V2 - r1 = _mm_sub_ps(_mm_ror_ps(Va,1),_mm_ror_ps(Vc,2)); // V1"·V2^ - V1^·V2" - r2 = _mm_sub_ps(_mm_ror_ps(Vb,2),_mm_ror_ps(Vb,0)); // V1^·V2' - V1'·V2^ - r3 = _mm_sub_ps(_mm_ror_ps(Va,0),_mm_ror_ps(Vc,1)); // V1'·V2" - V1"·V2' + r1 = _mm_sub_ps(_mm_ror_ps(Va,1),_mm_ror_ps(Vc,2)); // V1" dot V2^ - V1^ dot V2" + r2 = _mm_sub_ps(_mm_ror_ps(Vb,2),_mm_ror_ps(Vb,0)); // V1^ dot V2' - V1' dot V2^ + r3 = _mm_sub_ps(_mm_ror_ps(Va,0),_mm_ror_ps(Vc,1)); // V1' dot V2" - V1" dot V2' tt = _mm_ror_ps(_L4,1); sum = _mm_mul_ps(tt,r1); tt = _mm_ror_ps(tt,1); sum = _mm_add_ps(sum,_mm_mul_ps(tt,r2)); @@ -886,7 +886,7 @@ __forceinline const Matrix4 inverse( const Matrix4 & mat ) ); } -__forceinline const Matrix4 affineInverse( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const Matrix4 affineInverse( const Matrix4 & mat ) { Transform3 affineMat; affineMat.setCol0( mat.getCol0().getXYZ( ) ); @@ -896,7 +896,7 @@ __forceinline const Matrix4 affineInverse( const Matrix4 & mat ) return Matrix4( inverse( affineMat ) ); } -__forceinline const Matrix4 orthoInverse( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const Matrix4 orthoInverse( const Matrix4 & mat ) { Transform3 affineMat; affineMat.setCol0( mat.getCol0().getXYZ( ) ); @@ -906,7 +906,7 @@ __forceinline const Matrix4 orthoInverse( const Matrix4 & mat ) return Matrix4( orthoInverse( affineMat ) ); } -__forceinline const floatInVec determinant( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const floatInVec determinant( const Matrix4 & mat ) { __m128 Va,Vb,Vc; __m128 r1,r2,r3,tt,tt2; @@ -920,13 +920,13 @@ __forceinline const floatInVec determinant( const Matrix4 & mat ) // _mm_ror_ps is just a macro using _mm_shuffle_ps(). tt = _L4; tt2 = _mm_ror_ps(_L3,1); - Vc = _mm_mul_ps(tt2,_mm_ror_ps(tt,0)); // V3'·V4 - Va = _mm_mul_ps(tt2,_mm_ror_ps(tt,2)); // V3'·V4" - Vb = _mm_mul_ps(tt2,_mm_ror_ps(tt,3)); // V3'·V4^ + Vc = _mm_mul_ps(tt2,_mm_ror_ps(tt,0)); // V3' dot V4 + Va = _mm_mul_ps(tt2,_mm_ror_ps(tt,2)); // V3' dot V4" + Vb = _mm_mul_ps(tt2,_mm_ror_ps(tt,3)); // V3' dot V4^ - r1 = _mm_sub_ps(_mm_ror_ps(Va,1),_mm_ror_ps(Vc,2)); // V3"·V4^ - V3^·V4" - r2 = _mm_sub_ps(_mm_ror_ps(Vb,2),_mm_ror_ps(Vb,0)); // V3^·V4' - V3'·V4^ - r3 = _mm_sub_ps(_mm_ror_ps(Va,0),_mm_ror_ps(Vc,1)); // V3'·V4" - V3"·V4' + r1 = _mm_sub_ps(_mm_ror_ps(Va,1),_mm_ror_ps(Vc,2)); // V3" dot V4^ - V3^ dot V4" + r2 = _mm_sub_ps(_mm_ror_ps(Vb,2),_mm_ror_ps(Vb,0)); // V3^ dot V4' - V3' dot V4^ + r3 = _mm_sub_ps(_mm_ror_ps(Va,0),_mm_ror_ps(Vc,1)); // V3' dot V4" - V3" dot V4' tt = _L2; Va = _mm_ror_ps(tt,1); sum = _mm_mul_ps(Va,r1); @@ -947,7 +947,7 @@ __forceinline const floatInVec determinant( const Matrix4 & mat ) return floatInVec(Det, 0); } -__forceinline const Matrix4 Matrix4::operator +( const Matrix4 & mat ) const +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::operator +( const Matrix4 & mat ) const { return Matrix4( ( mCol0 + mat.mCol0 ), @@ -957,7 +957,7 @@ __forceinline const Matrix4 Matrix4::operator +( const Matrix4 & mat ) const ); } -__forceinline const Matrix4 Matrix4::operator -( const Matrix4 & mat ) const +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::operator -( const Matrix4 & mat ) const { return Matrix4( ( mCol0 - mat.mCol0 ), @@ -967,19 +967,19 @@ __forceinline const Matrix4 Matrix4::operator -( const Matrix4 & mat ) const ); } -__forceinline Matrix4 & Matrix4::operator +=( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::operator +=( const Matrix4 & mat ) { *this = *this + mat; return *this; } -__forceinline Matrix4 & Matrix4::operator -=( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::operator -=( const Matrix4 & mat ) { *this = *this - mat; return *this; } -__forceinline const Matrix4 Matrix4::operator -( ) const +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::operator -( ) const { return Matrix4( ( -mCol0 ), @@ -989,7 +989,7 @@ __forceinline const Matrix4 Matrix4::operator -( ) const ); } -__forceinline const Matrix4 absPerElem( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const Matrix4 absPerElem( const Matrix4 & mat ) { return Matrix4( absPerElem( mat.getCol0() ), @@ -999,12 +999,12 @@ __forceinline const Matrix4 absPerElem( const Matrix4 & mat ) ); } -__forceinline const Matrix4 Matrix4::operator *( float scalar ) const +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::operator *( float scalar ) const { return *this * floatInVec(scalar); } -__forceinline const Matrix4 Matrix4::operator *( const floatInVec &scalar ) const +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::operator *( const floatInVec &scalar ) const { return Matrix4( ( mCol0 * scalar ), @@ -1014,28 +1014,28 @@ __forceinline const Matrix4 Matrix4::operator *( const floatInVec &scalar ) cons ); } -__forceinline Matrix4 & Matrix4::operator *=( float scalar ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::operator *=( float scalar ) { return *this *= floatInVec(scalar); } -__forceinline Matrix4 & Matrix4::operator *=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::operator *=( const floatInVec &scalar ) { *this = *this * scalar; return *this; } -__forceinline const Matrix4 operator *( float scalar, const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const Matrix4 operator *( float scalar, const Matrix4 & mat ) { return floatInVec(scalar) * mat; } -__forceinline const Matrix4 operator *( const floatInVec &scalar, const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const Matrix4 operator *( const floatInVec &scalar, const Matrix4 & mat ) { return mat * scalar; } -__forceinline const Vector4 Matrix4::operator *( const Vector4 &vec ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::operator *( const Vector4 &vec ) const { return Vector4( _mm_add_ps( @@ -1044,7 +1044,7 @@ __forceinline const Vector4 Matrix4::operator *( const Vector4 &vec ) const ); } -__forceinline const Vector4 Matrix4::operator *( const Vector3 &vec ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::operator *( const Vector3 &vec ) const { return Vector4( _mm_add_ps( @@ -1053,7 +1053,7 @@ __forceinline const Vector4 Matrix4::operator *( const Vector3 &vec ) const ); } -__forceinline const Vector4 Matrix4::operator *( const Point3 &pnt ) const +VECTORMATH_FORCE_INLINE const Vector4 Matrix4::operator *( const Point3 &pnt ) const { return Vector4( _mm_add_ps( @@ -1062,7 +1062,7 @@ __forceinline const Vector4 Matrix4::operator *( const Point3 &pnt ) const ); } -__forceinline const Matrix4 Matrix4::operator *( const Matrix4 & mat ) const +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::operator *( const Matrix4 & mat ) const { return Matrix4( ( *this * mat.mCol0 ), @@ -1072,13 +1072,13 @@ __forceinline const Matrix4 Matrix4::operator *( const Matrix4 & mat ) const ); } -__forceinline Matrix4 & Matrix4::operator *=( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::operator *=( const Matrix4 & mat ) { *this = *this * mat; return *this; } -__forceinline const Matrix4 Matrix4::operator *( const Transform3 & tfrm ) const +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::operator *( const Transform3 & tfrm ) const { return Matrix4( ( *this * tfrm.getCol0() ), @@ -1088,13 +1088,13 @@ __forceinline const Matrix4 Matrix4::operator *( const Transform3 & tfrm ) const ); } -__forceinline Matrix4 & Matrix4::operator *=( const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::operator *=( const Transform3 & tfrm ) { *this = *this * tfrm; return *this; } -__forceinline const Matrix4 mulPerElem( const Matrix4 & mat0, const Matrix4 & mat1 ) +VECTORMATH_FORCE_INLINE const Matrix4 mulPerElem( const Matrix4 & mat0, const Matrix4 & mat1 ) { return Matrix4( mulPerElem( mat0.getCol0(), mat1.getCol0() ), @@ -1104,7 +1104,7 @@ __forceinline const Matrix4 mulPerElem( const Matrix4 & mat0, const Matrix4 & ma ); } -__forceinline const Matrix4 Matrix4::identity( ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::identity( ) { return Matrix4( Vector4::xAxis( ), @@ -1114,7 +1114,7 @@ __forceinline const Matrix4 Matrix4::identity( ) ); } -__forceinline Matrix4 & Matrix4::setUpper3x3( const Matrix3 & mat3 ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setUpper3x3( const Matrix3 & mat3 ) { mCol0.setXYZ( mat3.getCol0() ); mCol1.setXYZ( mat3.getCol1() ); @@ -1122,7 +1122,7 @@ __forceinline Matrix4 & Matrix4::setUpper3x3( const Matrix3 & mat3 ) return *this; } -__forceinline const Matrix3 Matrix4::getUpper3x3( ) const +VECTORMATH_FORCE_INLINE const Matrix3 Matrix4::getUpper3x3( ) const { return Matrix3( mCol0.getXYZ( ), @@ -1131,28 +1131,28 @@ __forceinline const Matrix3 Matrix4::getUpper3x3( ) const ); } -__forceinline Matrix4 & Matrix4::setTranslation( const Vector3 &translateVec ) +VECTORMATH_FORCE_INLINE Matrix4 & Matrix4::setTranslation( const Vector3 &translateVec ) { mCol3.setXYZ( translateVec ); return *this; } -__forceinline const Vector3 Matrix4::getTranslation( ) const +VECTORMATH_FORCE_INLINE const Vector3 Matrix4::getTranslation( ) const { return mCol3.getXYZ( ); } -__forceinline const Matrix4 Matrix4::rotationX( float radians ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotationX( float radians ) { return rotationX( floatInVec(radians) ); } -__forceinline const Matrix4 Matrix4::rotationX( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotationX( const floatInVec &radians ) { __m128 s, c, res1, res2; __m128 zero; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res1 = vec_sel( zero, c, select_y ); @@ -1167,17 +1167,17 @@ __forceinline const Matrix4 Matrix4::rotationX( const floatInVec &radians ) ); } -__forceinline const Matrix4 Matrix4::rotationY( float radians ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotationY( float radians ) { return rotationY( floatInVec(radians) ); } -__forceinline const Matrix4 Matrix4::rotationY( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotationY( const floatInVec &radians ) { __m128 s, c, res0, res2; __m128 zero; - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res0 = vec_sel( zero, c, select_x ); @@ -1192,17 +1192,17 @@ __forceinline const Matrix4 Matrix4::rotationY( const floatInVec &radians ) ); } -__forceinline const Matrix4 Matrix4::rotationZ( float radians ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotationZ( float radians ) { return rotationZ( floatInVec(radians) ); } -__forceinline const Matrix4 Matrix4::rotationZ( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotationZ( const floatInVec &radians ) { __m128 s, c, res0, res1; __m128 zero; - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res0 = vec_sel( zero, c, select_x ); @@ -1217,7 +1217,7 @@ __forceinline const Matrix4 Matrix4::rotationZ( const floatInVec &radians ) ); } -__forceinline const Matrix4 Matrix4::rotationZYX( const Vector3 &radiansXYZ ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotationZYX( const Vector3 &radiansXYZ ) { __m128 angles, s, negS, c, X0, X1, Y0, Y1, Z0, Z1, tmp; angles = Vector4( radiansXYZ, 0.0f ).get128(); @@ -1225,7 +1225,7 @@ __forceinline const Matrix4 Matrix4::rotationZYX( const Vector3 &radiansXYZ ) negS = negatef4( s ); Z0 = vec_mergel( c, s ); Z1 = vec_mergel( negS, c ); - __declspec(align(16)) unsigned int select_xyz[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_xyz[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0}; Z1 = vec_and( Z1, _mm_load_ps( (float *)select_xyz ) ); Y0 = _mm_shuffle_ps( c, negS, _MM_SHUFFLE(0,1,1,1) ); Y1 = _mm_shuffle_ps( s, c, _MM_SHUFFLE(0,1,1,1) ); @@ -1240,12 +1240,12 @@ __forceinline const Matrix4 Matrix4::rotationZYX( const Vector3 &radiansXYZ ) ); } -__forceinline const Matrix4 Matrix4::rotation( float radians, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotation( float radians, const Vector3 &unitVec ) { return rotation( floatInVec(radians), unitVec ); } -__forceinline const Matrix4 Matrix4::rotation( const floatInVec &radians, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotation( const floatInVec &radians, const Vector3 &unitVec ) { __m128 axis, s, c, oneMinusC, axisS, negAxisS, xxxx, yyyy, zzzz, tmp0, tmp1, tmp2; axis = unitVec.get128(); @@ -1256,9 +1256,9 @@ __forceinline const Matrix4 Matrix4::rotation( const floatInVec &radians, const oneMinusC = vec_sub( _mm_set1_ps(1.0f), c ); axisS = vec_mul( axis, s ); negAxisS = negatef4( axisS ); - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; //tmp0 = vec_perm( axisS, negAxisS, _VECTORMATH_PERM_XZBX ); tmp0 = _mm_shuffle_ps( axisS, axisS, _MM_SHUFFLE(0,0,2,0) ); tmp0 = vec_sel(tmp0, vec_splat(negAxisS, 1), select_z); @@ -1270,7 +1270,7 @@ __forceinline const Matrix4 Matrix4::rotation( const floatInVec &radians, const tmp0 = vec_sel( tmp0, c, select_x ); tmp1 = vec_sel( tmp1, c, select_y ); tmp2 = vec_sel( tmp2, c, select_z ); - __declspec(align(16)) unsigned int select_xyz[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_xyz[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0}; axis = vec_and( axis, _mm_load_ps( (float *)select_xyz ) ); tmp0 = vec_and( tmp0, _mm_load_ps( (float *)select_xyz ) ); tmp1 = vec_and( tmp1, _mm_load_ps( (float *)select_xyz ) ); @@ -1283,17 +1283,17 @@ __forceinline const Matrix4 Matrix4::rotation( const floatInVec &radians, const ); } -__forceinline const Matrix4 Matrix4::rotation( const Quat &unitQuat ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::rotation( const Quat &unitQuat ) { return Matrix4( Transform3::rotation( unitQuat ) ); } -__forceinline const Matrix4 Matrix4::scale( const Vector3 &scaleVec ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::scale( const Vector3 &scaleVec ) { __m128 zero = _mm_setzero_ps(); - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; return Matrix4( Vector4( vec_sel( zero, scaleVec.get128(), select_x ) ), Vector4( vec_sel( zero, scaleVec.get128(), select_y ) ), @@ -1302,7 +1302,7 @@ __forceinline const Matrix4 Matrix4::scale( const Vector3 &scaleVec ) ); } -__forceinline const Matrix4 appendScale( const Matrix4 & mat, const Vector3 &scaleVec ) +VECTORMATH_FORCE_INLINE const Matrix4 appendScale( const Matrix4 & mat, const Vector3 &scaleVec ) { return Matrix4( ( mat.getCol0() * scaleVec.getX( ) ), @@ -1312,7 +1312,7 @@ __forceinline const Matrix4 appendScale( const Matrix4 & mat, const Vector3 &sca ); } -__forceinline const Matrix4 prependScale( const Vector3 &scaleVec, const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE const Matrix4 prependScale( const Vector3 &scaleVec, const Matrix4 & mat ) { Vector4 scale4; scale4 = Vector4( scaleVec, 1.0f ); @@ -1324,7 +1324,7 @@ __forceinline const Matrix4 prependScale( const Vector3 &scaleVec, const Matrix4 ); } -__forceinline const Matrix4 Matrix4::translation( const Vector3 &translateVec ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::translation( const Vector3 &translateVec ) { return Matrix4( Vector4::xAxis( ), @@ -1334,7 +1334,7 @@ __forceinline const Matrix4 Matrix4::translation( const Vector3 &translateVec ) ); } -__forceinline const Matrix4 Matrix4::lookAt( const Point3 &eyePos, const Point3 &lookAtPos, const Vector3 &upVec ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::lookAt( const Point3 &eyePos, const Point3 &lookAtPos, const Vector3 &upVec ) { Matrix4 m4EyeFrame; Vector3 v3X, v3Y, v3Z; @@ -1346,7 +1346,7 @@ __forceinline const Matrix4 Matrix4::lookAt( const Point3 &eyePos, const Point3 return orthoInverse( m4EyeFrame ); } -__forceinline const Matrix4 Matrix4::perspective( float fovyRadians, float aspect, float zNear, float zFar ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::perspective( float fovyRadians, float aspect, float zNear, float zFar ) { float f, rangeInv; __m128 zero, col0, col1, col2, col3; @@ -1375,7 +1375,7 @@ __forceinline const Matrix4 Matrix4::perspective( float fovyRadians, float aspec ); } -__forceinline const Matrix4 Matrix4::frustum( float left, float right, float bottom, float top, float zNear, float zFar ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::frustum( float left, float right, float bottom, float top, float zNear, float zFar ) { /* function implementation based on code from STIDC SDK: */ /* -------------------------------------------------------------- */ @@ -1411,10 +1411,10 @@ __forceinline const Matrix4 Matrix4::frustum( float left, float right, float bot near2 = vec_add( near2, near2 ); diagonal = vec_mul( near2, inv_diff ); column = vec_mul( sum, inv_diff ); - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; - __declspec(align(16)) unsigned int select_w[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_w[4] = {0, 0, 0, 0xffffffff}; return Matrix4( Vector4( vec_sel( zero, diagonal, select_x ) ), Vector4( vec_sel( zero, diagonal, select_y ) ), @@ -1423,7 +1423,7 @@ __forceinline const Matrix4 Matrix4::frustum( float left, float right, float bot ); } -__forceinline const Matrix4 Matrix4::orthographic( float left, float right, float bottom, float top, float zNear, float zFar ) +VECTORMATH_FORCE_INLINE const Matrix4 Matrix4::orthographic( float left, float right, float bottom, float top, float zNear, float zFar ) { /* function implementation based on code from STIDC SDK: */ /* -------------------------------------------------------------- */ @@ -1457,10 +1457,10 @@ __forceinline const Matrix4 Matrix4::orthographic( float left, float right, floa inv_diff = recipf4( diff ); neg_inv_diff = negatef4( inv_diff ); diagonal = vec_add( inv_diff, inv_diff ); - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; - __declspec(align(16)) unsigned int select_w[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_w[4] = {0, 0, 0, 0xffffffff}; column = vec_mul( sum, vec_sel( neg_inv_diff, inv_diff, select_z ) ); // TODO: no madds with zero return Matrix4( Vector4( vec_sel( zero, diagonal, select_x ) ), @@ -1470,7 +1470,7 @@ __forceinline const Matrix4 Matrix4::orthographic( float left, float right, floa ); } -__forceinline const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, bool select1 ) +VECTORMATH_FORCE_INLINE const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, bool select1 ) { return Matrix4( select( mat0.getCol0(), mat1.getCol0(), select1 ), @@ -1480,7 +1480,7 @@ __forceinline const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, ); } -__forceinline const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, const boolInVec &select1 ) +VECTORMATH_FORCE_INLINE const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, const boolInVec &select1 ) { return Matrix4( select( mat0.getCol0(), mat1.getCol0(), select1 ), @@ -1492,7 +1492,7 @@ __forceinline const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, #ifdef _VECTORMATH_DEBUG -__forceinline void print( const Matrix4 & mat ) +VECTORMATH_FORCE_INLINE void print( const Matrix4 & mat ) { print( mat.getRow( 0 ) ); print( mat.getRow( 1 ) ); @@ -1500,7 +1500,7 @@ __forceinline void print( const Matrix4 & mat ) print( mat.getRow( 3 ) ); } -__forceinline void print( const Matrix4 & mat, const char * name ) +VECTORMATH_FORCE_INLINE void print( const Matrix4 & mat, const char * name ) { printf("%s:\n", name); print( mat ); @@ -1508,7 +1508,7 @@ __forceinline void print( const Matrix4 & mat, const char * name ) #endif -__forceinline Transform3::Transform3( const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE Transform3::Transform3( const Transform3 & tfrm ) { mCol0 = tfrm.mCol0; mCol1 = tfrm.mCol1; @@ -1516,7 +1516,7 @@ __forceinline Transform3::Transform3( const Transform3 & tfrm ) mCol3 = tfrm.mCol3; } -__forceinline Transform3::Transform3( float scalar ) +VECTORMATH_FORCE_INLINE Transform3::Transform3( float scalar ) { mCol0 = Vector3( scalar ); mCol1 = Vector3( scalar ); @@ -1524,7 +1524,7 @@ __forceinline Transform3::Transform3( float scalar ) mCol3 = Vector3( scalar ); } -__forceinline Transform3::Transform3( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Transform3::Transform3( const floatInVec &scalar ) { mCol0 = Vector3( scalar ); mCol1 = Vector3( scalar ); @@ -1532,7 +1532,7 @@ __forceinline Transform3::Transform3( const floatInVec &scalar ) mCol3 = Vector3( scalar ); } -__forceinline Transform3::Transform3( const Vector3 &_col0, const Vector3 &_col1, const Vector3 &_col2, const Vector3 &_col3 ) +VECTORMATH_FORCE_INLINE Transform3::Transform3( const Vector3 &_col0, const Vector3 &_col1, const Vector3 &_col2, const Vector3 &_col3 ) { mCol0 = _col0; mCol1 = _col1; @@ -1540,49 +1540,49 @@ __forceinline Transform3::Transform3( const Vector3 &_col0, const Vector3 &_col1 mCol3 = _col3; } -__forceinline Transform3::Transform3( const Matrix3 & tfrm, const Vector3 &translateVec ) +VECTORMATH_FORCE_INLINE Transform3::Transform3( const Matrix3 & tfrm, const Vector3 &translateVec ) { this->setUpper3x3( tfrm ); this->setTranslation( translateVec ); } -__forceinline Transform3::Transform3( const Quat &unitQuat, const Vector3 &translateVec ) +VECTORMATH_FORCE_INLINE Transform3::Transform3( const Quat &unitQuat, const Vector3 &translateVec ) { this->setUpper3x3( Matrix3( unitQuat ) ); this->setTranslation( translateVec ); } -__forceinline Transform3 & Transform3::setCol0( const Vector3 &_col0 ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setCol0( const Vector3 &_col0 ) { mCol0 = _col0; return *this; } -__forceinline Transform3 & Transform3::setCol1( const Vector3 &_col1 ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setCol1( const Vector3 &_col1 ) { mCol1 = _col1; return *this; } -__forceinline Transform3 & Transform3::setCol2( const Vector3 &_col2 ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setCol2( const Vector3 &_col2 ) { mCol2 = _col2; return *this; } -__forceinline Transform3 & Transform3::setCol3( const Vector3 &_col3 ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setCol3( const Vector3 &_col3 ) { mCol3 = _col3; return *this; } -__forceinline Transform3 & Transform3::setCol( int col, const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setCol( int col, const Vector3 &vec ) { *(&mCol0 + col) = vec; return *this; } -__forceinline Transform3 & Transform3::setRow( int row, const Vector4 &vec ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setRow( int row, const Vector4 &vec ) { mCol0.setElem( row, vec.getElem( 0 ) ); mCol1.setElem( row, vec.getElem( 1 ) ); @@ -1591,13 +1591,13 @@ __forceinline Transform3 & Transform3::setRow( int row, const Vector4 &vec ) return *this; } -__forceinline Transform3 & Transform3::setElem( int col, int row, float val ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setElem( int col, int row, float val ) { (*this)[col].setElem(row, val); return *this; } -__forceinline Transform3 & Transform3::setElem( int col, int row, const floatInVec &val ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setElem( int col, int row, const floatInVec &val ) { Vector3 tmpV3_0; tmpV3_0 = this->getCol( col ); @@ -1606,52 +1606,52 @@ __forceinline Transform3 & Transform3::setElem( int col, int row, const floatInV return *this; } -__forceinline const floatInVec Transform3::getElem( int col, int row ) const +VECTORMATH_FORCE_INLINE const floatInVec Transform3::getElem( int col, int row ) const { return this->getCol( col ).getElem( row ); } -__forceinline const Vector3 Transform3::getCol0( ) const +VECTORMATH_FORCE_INLINE const Vector3 Transform3::getCol0( ) const { return mCol0; } -__forceinline const Vector3 Transform3::getCol1( ) const +VECTORMATH_FORCE_INLINE const Vector3 Transform3::getCol1( ) const { return mCol1; } -__forceinline const Vector3 Transform3::getCol2( ) const +VECTORMATH_FORCE_INLINE const Vector3 Transform3::getCol2( ) const { return mCol2; } -__forceinline const Vector3 Transform3::getCol3( ) const +VECTORMATH_FORCE_INLINE const Vector3 Transform3::getCol3( ) const { return mCol3; } -__forceinline const Vector3 Transform3::getCol( int col ) const +VECTORMATH_FORCE_INLINE const Vector3 Transform3::getCol( int col ) const { return *(&mCol0 + col); } -__forceinline const Vector4 Transform3::getRow( int row ) const +VECTORMATH_FORCE_INLINE const Vector4 Transform3::getRow( int row ) const { return Vector4( mCol0.getElem( row ), mCol1.getElem( row ), mCol2.getElem( row ), mCol3.getElem( row ) ); } -__forceinline Vector3 & Transform3::operator []( int col ) +VECTORMATH_FORCE_INLINE Vector3 & Transform3::operator []( int col ) { return *(&mCol0 + col); } -__forceinline const Vector3 Transform3::operator []( int col ) const +VECTORMATH_FORCE_INLINE const Vector3 Transform3::operator []( int col ) const { return *(&mCol0 + col); } -__forceinline Transform3 & Transform3::operator =( const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::operator =( const Transform3 & tfrm ) { mCol0 = tfrm.mCol0; mCol1 = tfrm.mCol1; @@ -1660,7 +1660,7 @@ __forceinline Transform3 & Transform3::operator =( const Transform3 & tfrm ) return *this; } -__forceinline const Transform3 inverse( const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE const Transform3 inverse( const Transform3 & tfrm ) { __m128 inv0, inv1, inv2, inv3; __m128 tmp0, tmp1, tmp2, tmp3, tmp4, dot, invdet; @@ -1677,7 +1677,7 @@ __forceinline const Transform3 inverse( const Transform3 & tfrm ) inv0 = vec_mergeh( tmp3, tmp1 ); xxxx = vec_splat( inv3, 0 ); //inv1 = vec_perm( tmp3, tmp1, _VECTORMATH_PERM_ZBWX ); - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; inv1 = _mm_shuffle_ps( tmp3, tmp3, _MM_SHUFFLE(0,3,2,2)); inv1 = vec_sel(inv1, tmp1, select_y); //inv2 = vec_perm( tmp4, tmp1, _VECTORMATH_PERM_XCYX ); @@ -1700,7 +1700,7 @@ __forceinline const Transform3 inverse( const Transform3 & tfrm ) ); } -__forceinline const Transform3 orthoInverse( const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE const Transform3 orthoInverse( const Transform3 & tfrm ) { __m128 inv0, inv1, inv2, inv3; __m128 tmp0, tmp1; @@ -1711,7 +1711,7 @@ __forceinline const Transform3 orthoInverse( const Transform3 & tfrm ) inv0 = vec_mergeh( tmp0, tfrm.getCol1().get128() ); xxxx = vec_splat( inv3, 0 ); //inv1 = vec_perm( tmp0, tfrm.getCol1().get128(), _VECTORMATH_PERM_ZBWX ); - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; inv1 = _mm_shuffle_ps( tmp0, tmp0, _MM_SHUFFLE(0,3,2,2)); inv1 = vec_sel(inv1, tfrm.getCol1().get128(), select_y); //inv2 = vec_perm( tmp1, tfrm.getCol1().get128(), _VECTORMATH_PERM_XCYX ); @@ -1730,7 +1730,7 @@ __forceinline const Transform3 orthoInverse( const Transform3 & tfrm ) ); } -__forceinline const Transform3 absPerElem( const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE const Transform3 absPerElem( const Transform3 & tfrm ) { return Transform3( absPerElem( tfrm.getCol0() ), @@ -1740,7 +1740,7 @@ __forceinline const Transform3 absPerElem( const Transform3 & tfrm ) ); } -__forceinline const Vector3 Transform3::operator *( const Vector3 &vec ) const +VECTORMATH_FORCE_INLINE const Vector3 Transform3::operator *( const Vector3 &vec ) const { __m128 res; __m128 xxxx, yyyy, zzzz; @@ -1753,7 +1753,7 @@ __forceinline const Vector3 Transform3::operator *( const Vector3 &vec ) const return Vector3( res ); } -__forceinline const Point3 Transform3::operator *( const Point3 &pnt ) const +VECTORMATH_FORCE_INLINE const Point3 Transform3::operator *( const Point3 &pnt ) const { __m128 tmp0, tmp1, res; __m128 xxxx, yyyy, zzzz; @@ -1768,7 +1768,7 @@ __forceinline const Point3 Transform3::operator *( const Point3 &pnt ) const return Point3( res ); } -__forceinline const Transform3 Transform3::operator *( const Transform3 & tfrm ) const +VECTORMATH_FORCE_INLINE const Transform3 Transform3::operator *( const Transform3 & tfrm ) const { return Transform3( ( *this * tfrm.mCol0 ), @@ -1778,13 +1778,13 @@ __forceinline const Transform3 Transform3::operator *( const Transform3 & tfrm ) ); } -__forceinline Transform3 & Transform3::operator *=( const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::operator *=( const Transform3 & tfrm ) { *this = *this * tfrm; return *this; } -__forceinline const Transform3 mulPerElem( const Transform3 & tfrm0, const Transform3 & tfrm1 ) +VECTORMATH_FORCE_INLINE const Transform3 mulPerElem( const Transform3 & tfrm0, const Transform3 & tfrm1 ) { return Transform3( mulPerElem( tfrm0.getCol0(), tfrm1.getCol0() ), @@ -1794,7 +1794,7 @@ __forceinline const Transform3 mulPerElem( const Transform3 & tfrm0, const Trans ); } -__forceinline const Transform3 Transform3::identity( ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::identity( ) { return Transform3( Vector3::xAxis( ), @@ -1804,7 +1804,7 @@ __forceinline const Transform3 Transform3::identity( ) ); } -__forceinline Transform3 & Transform3::setUpper3x3( const Matrix3 & tfrm ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setUpper3x3( const Matrix3 & tfrm ) { mCol0 = tfrm.getCol0(); mCol1 = tfrm.getCol1(); @@ -1812,33 +1812,33 @@ __forceinline Transform3 & Transform3::setUpper3x3( const Matrix3 & tfrm ) return *this; } -__forceinline const Matrix3 Transform3::getUpper3x3( ) const +VECTORMATH_FORCE_INLINE const Matrix3 Transform3::getUpper3x3( ) const { return Matrix3( mCol0, mCol1, mCol2 ); } -__forceinline Transform3 & Transform3::setTranslation( const Vector3 &translateVec ) +VECTORMATH_FORCE_INLINE Transform3 & Transform3::setTranslation( const Vector3 &translateVec ) { mCol3 = translateVec; return *this; } -__forceinline const Vector3 Transform3::getTranslation( ) const +VECTORMATH_FORCE_INLINE const Vector3 Transform3::getTranslation( ) const { return mCol3; } -__forceinline const Transform3 Transform3::rotationX( float radians ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotationX( float radians ) { return rotationX( floatInVec(radians) ); } -__forceinline const Transform3 Transform3::rotationX( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotationX( const floatInVec &radians ) { __m128 s, c, res1, res2; __m128 zero; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res1 = vec_sel( zero, c, select_y ); @@ -1853,17 +1853,17 @@ __forceinline const Transform3 Transform3::rotationX( const floatInVec &radians ); } -__forceinline const Transform3 Transform3::rotationY( float radians ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotationY( float radians ) { return rotationY( floatInVec(radians) ); } -__forceinline const Transform3 Transform3::rotationY( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotationY( const floatInVec &radians ) { __m128 s, c, res0, res2; __m128 zero; - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res0 = vec_sel( zero, c, select_x ); @@ -1878,16 +1878,16 @@ __forceinline const Transform3 Transform3::rotationY( const floatInVec &radians ); } -__forceinline const Transform3 Transform3::rotationZ( float radians ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotationZ( float radians ) { return rotationZ( floatInVec(radians) ); } -__forceinline const Transform3 Transform3::rotationZ( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotationZ( const floatInVec &radians ) { __m128 s, c, res0, res1; - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; __m128 zero = _mm_setzero_ps(); sincosf4( radians.get128(), &s, &c ); res0 = vec_sel( zero, c, select_x ); @@ -1902,7 +1902,7 @@ __forceinline const Transform3 Transform3::rotationZ( const floatInVec &radians ); } -__forceinline const Transform3 Transform3::rotationZYX( const Vector3 &radiansXYZ ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotationZYX( const Vector3 &radiansXYZ ) { __m128 angles, s, negS, c, X0, X1, Y0, Y1, Z0, Z1, tmp; angles = Vector4( radiansXYZ, 0.0f ).get128(); @@ -1910,7 +1910,7 @@ __forceinline const Transform3 Transform3::rotationZYX( const Vector3 &radiansXY negS = negatef4( s ); Z0 = vec_mergel( c, s ); Z1 = vec_mergel( negS, c ); - __declspec(align(16)) unsigned int select_xyz[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_xyz[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0}; Z1 = vec_and( Z1, _mm_load_ps( (float *)select_xyz ) ); Y0 = _mm_shuffle_ps( c, negS, _MM_SHUFFLE(0,1,1,1) ); Y1 = _mm_shuffle_ps( s, c, _MM_SHUFFLE(0,1,1,1) ); @@ -1925,27 +1925,27 @@ __forceinline const Transform3 Transform3::rotationZYX( const Vector3 &radiansXY ); } -__forceinline const Transform3 Transform3::rotation( float radians, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotation( float radians, const Vector3 &unitVec ) { return rotation( floatInVec(radians), unitVec ); } -__forceinline const Transform3 Transform3::rotation( const floatInVec &radians, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotation( const floatInVec &radians, const Vector3 &unitVec ) { return Transform3( Matrix3::rotation( radians, unitVec ), Vector3( 0.0f ) ); } -__forceinline const Transform3 Transform3::rotation( const Quat &unitQuat ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::rotation( const Quat &unitQuat ) { return Transform3( Matrix3( unitQuat ), Vector3( 0.0f ) ); } -__forceinline const Transform3 Transform3::scale( const Vector3 &scaleVec ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::scale( const Vector3 &scaleVec ) { __m128 zero = _mm_setzero_ps(); - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; return Transform3( Vector3( vec_sel( zero, scaleVec.get128(), select_x ) ), Vector3( vec_sel( zero, scaleVec.get128(), select_y ) ), @@ -1954,7 +1954,7 @@ __forceinline const Transform3 Transform3::scale( const Vector3 &scaleVec ) ); } -__forceinline const Transform3 appendScale( const Transform3 & tfrm, const Vector3 &scaleVec ) +VECTORMATH_FORCE_INLINE const Transform3 appendScale( const Transform3 & tfrm, const Vector3 &scaleVec ) { return Transform3( ( tfrm.getCol0() * scaleVec.getX( ) ), @@ -1964,7 +1964,7 @@ __forceinline const Transform3 appendScale( const Transform3 & tfrm, const Vecto ); } -__forceinline const Transform3 prependScale( const Vector3 &scaleVec, const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE const Transform3 prependScale( const Vector3 &scaleVec, const Transform3 & tfrm ) { return Transform3( mulPerElem( tfrm.getCol0(), scaleVec ), @@ -1974,7 +1974,7 @@ __forceinline const Transform3 prependScale( const Vector3 &scaleVec, const Tran ); } -__forceinline const Transform3 Transform3::translation( const Vector3 &translateVec ) +VECTORMATH_FORCE_INLINE const Transform3 Transform3::translation( const Vector3 &translateVec ) { return Transform3( Vector3::xAxis( ), @@ -1984,7 +1984,7 @@ __forceinline const Transform3 Transform3::translation( const Vector3 &translate ); } -__forceinline const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, bool select1 ) +VECTORMATH_FORCE_INLINE const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, bool select1 ) { return Transform3( select( tfrm0.getCol0(), tfrm1.getCol0(), select1 ), @@ -1994,7 +1994,7 @@ __forceinline const Transform3 select( const Transform3 & tfrm0, const Transform ); } -__forceinline const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, const boolInVec &select1 ) +VECTORMATH_FORCE_INLINE const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, const boolInVec &select1 ) { return Transform3( select( tfrm0.getCol0(), tfrm1.getCol0(), select1 ), @@ -2006,14 +2006,14 @@ __forceinline const Transform3 select( const Transform3 & tfrm0, const Transform #ifdef _VECTORMATH_DEBUG -__forceinline void print( const Transform3 & tfrm ) +VECTORMATH_FORCE_INLINE void print( const Transform3 & tfrm ) { print( tfrm.getRow( 0 ) ); print( tfrm.getRow( 1 ) ); print( tfrm.getRow( 2 ) ); } -__forceinline void print( const Transform3 & tfrm, const char * name ) +VECTORMATH_FORCE_INLINE void print( const Transform3 & tfrm, const char * name ) { printf("%s:\n", name); print( tfrm ); @@ -2021,7 +2021,7 @@ __forceinline void print( const Transform3 & tfrm, const char * name ) #endif -__forceinline Quat::Quat( const Matrix3 & tfrm ) +VECTORMATH_FORCE_INLINE Quat::Quat( const Matrix3 & tfrm ) { __m128 res; __m128 col0, col1, col2; @@ -2030,10 +2030,10 @@ __forceinline Quat::Quat( const Matrix3 & tfrm ) __m128 radicand, invSqrt, scale; __m128 res0, res1, res2, res3; __m128 xx, yy, zz; - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; - __declspec(align(16)) unsigned int select_w[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_w[4] = {0, 0, 0, 0xffffffff}; col0 = tfrm.getCol0().get128(); col1 = tfrm.getCol1().get128(); @@ -2109,7 +2109,7 @@ __forceinline Quat::Quat( const Matrix3 & tfrm ) mVec128 = res; } -__forceinline const Matrix3 outer( const Vector3 &tfrm0, const Vector3 &tfrm1 ) +VECTORMATH_FORCE_INLINE const Matrix3 outer( const Vector3 &tfrm0, const Vector3 &tfrm1 ) { return Matrix3( ( tfrm0 * tfrm1.getX( ) ), @@ -2118,7 +2118,7 @@ __forceinline const Matrix3 outer( const Vector3 &tfrm0, const Vector3 &tfrm1 ) ); } -__forceinline const Matrix4 outer( const Vector4 &tfrm0, const Vector4 &tfrm1 ) +VECTORMATH_FORCE_INLINE const Matrix4 outer( const Vector4 &tfrm0, const Vector4 &tfrm1 ) { return Matrix4( ( tfrm0 * tfrm1.getX( ) ), @@ -2128,7 +2128,7 @@ __forceinline const Matrix4 outer( const Vector4 &tfrm0, const Vector4 &tfrm1 ) ); } -__forceinline const Vector3 rowMul( const Vector3 &vec, const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const Vector3 rowMul( const Vector3 &vec, const Matrix3 & mat ) { __m128 tmp0, tmp1, mcol0, mcol1, mcol2, res; __m128 xxxx, yyyy, zzzz; @@ -2137,7 +2137,7 @@ __forceinline const Vector3 rowMul( const Vector3 &vec, const Matrix3 & mat ) xxxx = vec_splat( vec.get128(), 0 ); mcol0 = vec_mergeh( tmp0, mat.getCol1().get128() ); //mcol1 = vec_perm( tmp0, mat.getCol1().get128(), _VECTORMATH_PERM_ZBWX ); - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; mcol1 = _mm_shuffle_ps( tmp0, tmp0, _MM_SHUFFLE(0,3,2,2)); mcol1 = vec_sel(mcol1, mat.getCol1().get128(), select_y); //mcol2 = vec_perm( tmp1, mat.getCol1().get128(), _VECTORMATH_PERM_XCYX ); @@ -2151,13 +2151,13 @@ __forceinline const Vector3 rowMul( const Vector3 &vec, const Matrix3 & mat ) return Vector3( res ); } -__forceinline const Matrix3 crossMatrix( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const Matrix3 crossMatrix( const Vector3 &vec ) { __m128 neg, res0, res1, res2; neg = negatef4( vec.get128() ); - __declspec(align(16)) unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_x[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_y[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int select_z[4] = {0, 0, 0xffffffff, 0}; //res0 = vec_perm( vec.get128(), neg, _VECTORMATH_PERM_XZBX ); res0 = _mm_shuffle_ps( vec.get128(), vec.get128(), _MM_SHUFFLE(0,2,2,0) ); res0 = vec_sel(res0, vec_splat(neg, 1), select_z); @@ -2166,9 +2166,9 @@ __forceinline const Matrix3 crossMatrix( const Vector3 &vec ) //res2 = vec_perm( vec.get128(), neg, _VECTORMATH_PERM_YAXX ); res2 = _mm_shuffle_ps( vec.get128(), vec.get128(), _MM_SHUFFLE(0,0,1,1) ); res2 = vec_sel(res2, vec_splat(neg, 0), select_y); - __declspec(align(16)) unsigned int filter_x[4] = {0, 0xffffffff, 0xffffffff, 0xffffffff}; - __declspec(align(16)) unsigned int filter_y[4] = {0xffffffff, 0, 0xffffffff, 0xffffffff}; - __declspec(align(16)) unsigned int filter_z[4] = {0xffffffff, 0xffffffff, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int filter_x[4] = {0, 0xffffffff, 0xffffffff, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int filter_y[4] = {0xffffffff, 0, 0xffffffff, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int filter_z[4] = {0xffffffff, 0xffffffff, 0, 0xffffffff}; res0 = vec_and( res0, _mm_load_ps((float *)filter_x ) ); res1 = vec_and( res1, _mm_load_ps((float *)filter_y ) ); res2 = vec_and( res2, _mm_load_ps((float *)filter_z ) ); // TODO: Use selects? @@ -2179,7 +2179,7 @@ __forceinline const Matrix3 crossMatrix( const Vector3 &vec ) ); } -__forceinline const Matrix3 crossMatrixMul( const Vector3 &vec, const Matrix3 & mat ) +VECTORMATH_FORCE_INLINE const Matrix3 crossMatrixMul( const Vector3 &vec, const Matrix3 & mat ) { return Matrix3( cross( vec, mat.getCol0() ), cross( vec, mat.getCol1() ), cross( vec, mat.getCol2() ) ); } diff --git a/src/vectormath/sse/quat_aos.h b/src/vectormath/sse/quat_aos.h index 3d4822142..c6cff95b6 100644 --- a/src/vectormath/sse/quat_aos.h +++ b/src/vectormath/sse/quat_aos.h @@ -42,19 +42,19 @@ namespace Vectormath { namespace Aos { -__forceinline void Quat::set128(vec_float4 vec) +VECTORMATH_FORCE_INLINE void Quat::set128(vec_float4 vec) { mVec128 = vec; } -__forceinline Quat::Quat( const floatInVec &_x, const floatInVec &_y, const floatInVec &_z, const floatInVec &_w ) +VECTORMATH_FORCE_INLINE Quat::Quat( const floatInVec &_x, const floatInVec &_y, const floatInVec &_z, const floatInVec &_w ) { mVec128 = _mm_unpacklo_ps( _mm_unpacklo_ps( _x.get128(), _z.get128() ), _mm_unpacklo_ps( _y.get128(), _w.get128() ) ); } -__forceinline Quat::Quat( const Vector3 &xyz, float _w ) +VECTORMATH_FORCE_INLINE Quat::Quat( const Vector3 &xyz, float _w ) { mVec128 = xyz.get128(); _vmathVfSetElement(mVec128, _w, 3); @@ -62,12 +62,12 @@ __forceinline Quat::Quat( const Vector3 &xyz, float _w ) -__forceinline Quat::Quat(const Quat& quat) +VECTORMATH_FORCE_INLINE Quat::Quat(const Quat& quat) { mVec128 = quat.get128(); } -__forceinline Quat::Quat( float _x, float _y, float _z, float _w ) +VECTORMATH_FORCE_INLINE Quat::Quat( float _x, float _y, float _z, float _w ) { mVec128 = _mm_setr_ps(_x, _y, _z, _w); } @@ -76,53 +76,53 @@ __forceinline Quat::Quat( float _x, float _y, float _z, float _w ) -__forceinline Quat::Quat( const Vector3 &xyz, const floatInVec &_w ) +VECTORMATH_FORCE_INLINE Quat::Quat( const Vector3 &xyz, const floatInVec &_w ) { mVec128 = xyz.get128(); mVec128 = _vmathVfInsert(mVec128, _w.get128(), 3); } -__forceinline Quat::Quat( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE Quat::Quat( const Vector4 &vec ) { mVec128 = vec.get128(); } -__forceinline Quat::Quat( float scalar ) +VECTORMATH_FORCE_INLINE Quat::Quat( float scalar ) { mVec128 = floatInVec(scalar).get128(); } -__forceinline Quat::Quat( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Quat::Quat( const floatInVec &scalar ) { mVec128 = scalar.get128(); } -__forceinline Quat::Quat( __m128 vf4 ) +VECTORMATH_FORCE_INLINE Quat::Quat( __m128 vf4 ) { mVec128 = vf4; } -__forceinline const Quat Quat::identity( ) +VECTORMATH_FORCE_INLINE const Quat Quat::identity( ) { return Quat( _VECTORMATH_UNIT_0001 ); } -__forceinline const Quat lerp( float t, const Quat &quat0, const Quat &quat1 ) +VECTORMATH_FORCE_INLINE const Quat lerp( float t, const Quat &quat0, const Quat &quat1 ) { return lerp( floatInVec(t), quat0, quat1 ); } -__forceinline const Quat lerp( const floatInVec &t, const Quat &quat0, const Quat &quat1 ) +VECTORMATH_FORCE_INLINE const Quat lerp( const floatInVec &t, const Quat &quat0, const Quat &quat1 ) { return ( quat0 + ( ( quat1 - quat0 ) * t ) ); } -__forceinline const Quat slerp( float t, const Quat &unitQuat0, const Quat &unitQuat1 ) +VECTORMATH_FORCE_INLINE const Quat slerp( float t, const Quat &unitQuat0, const Quat &unitQuat1 ) { return slerp( floatInVec(t), unitQuat0, unitQuat1 ); } -__forceinline const Quat slerp( const floatInVec &t, const Quat &unitQuat0, const Quat &unitQuat1 ) +VECTORMATH_FORCE_INLINE const Quat slerp( const floatInVec &t, const Quat &unitQuat0, const Quat &unitQuat1 ) { Quat start; vec_float4 scales, scale0, scale1, cosAngle, angle, tttt, oneMinusT, angles, sines; @@ -145,239 +145,239 @@ __forceinline const Quat slerp( const floatInVec &t, const Quat &unitQuat0, cons return Quat( vec_madd( start.get128(), scale0, vec_mul( unitQuat1.get128(), scale1 ) ) ); } -__forceinline const Quat squad( float t, const Quat &unitQuat0, const Quat &unitQuat1, const Quat &unitQuat2, const Quat &unitQuat3 ) +VECTORMATH_FORCE_INLINE const Quat squad( float t, const Quat &unitQuat0, const Quat &unitQuat1, const Quat &unitQuat2, const Quat &unitQuat3 ) { return squad( floatInVec(t), unitQuat0, unitQuat1, unitQuat2, unitQuat3 ); } -__forceinline const Quat squad( const floatInVec &t, const Quat &unitQuat0, const Quat &unitQuat1, const Quat &unitQuat2, const Quat &unitQuat3 ) +VECTORMATH_FORCE_INLINE const Quat squad( const floatInVec &t, const Quat &unitQuat0, const Quat &unitQuat1, const Quat &unitQuat2, const Quat &unitQuat3 ) { return slerp( ( ( floatInVec(2.0f) * t ) * ( floatInVec(1.0f) - t ) ), slerp( t, unitQuat0, unitQuat3 ), slerp( t, unitQuat1, unitQuat2 ) ); } -__forceinline __m128 Quat::get128( ) const +VECTORMATH_FORCE_INLINE __m128 Quat::get128( ) const { return mVec128; } -__forceinline Quat & Quat::operator =( const Quat &quat ) +VECTORMATH_FORCE_INLINE Quat & Quat::operator =( const Quat &quat ) { mVec128 = quat.mVec128; return *this; } -__forceinline Quat & Quat::setXYZ( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Quat & Quat::setXYZ( const Vector3 &vec ) { - __declspec(align(16)) unsigned int sw[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int sw[4] = {0, 0, 0, 0xffffffff}; mVec128 = vec_sel( vec.get128(), mVec128, sw ); return *this; } -__forceinline const Vector3 Quat::getXYZ( ) const +VECTORMATH_FORCE_INLINE const Vector3 Quat::getXYZ( ) const { return Vector3( mVec128 ); } -__forceinline Quat & Quat::setX( float _x ) +VECTORMATH_FORCE_INLINE Quat & Quat::setX( float _x ) { _vmathVfSetElement(mVec128, _x, 0); return *this; } -__forceinline Quat & Quat::setX( const floatInVec &_x ) +VECTORMATH_FORCE_INLINE Quat & Quat::setX( const floatInVec &_x ) { mVec128 = _vmathVfInsert(mVec128, _x.get128(), 0); return *this; } -__forceinline const floatInVec Quat::getX( ) const +VECTORMATH_FORCE_INLINE const floatInVec Quat::getX( ) const { return floatInVec( mVec128, 0 ); } -__forceinline Quat & Quat::setY( float _y ) +VECTORMATH_FORCE_INLINE Quat & Quat::setY( float _y ) { _vmathVfSetElement(mVec128, _y, 1); return *this; } -__forceinline Quat & Quat::setY( const floatInVec &_y ) +VECTORMATH_FORCE_INLINE Quat & Quat::setY( const floatInVec &_y ) { mVec128 = _vmathVfInsert(mVec128, _y.get128(), 1); return *this; } -__forceinline const floatInVec Quat::getY( ) const +VECTORMATH_FORCE_INLINE const floatInVec Quat::getY( ) const { return floatInVec( mVec128, 1 ); } -__forceinline Quat & Quat::setZ( float _z ) +VECTORMATH_FORCE_INLINE Quat & Quat::setZ( float _z ) { _vmathVfSetElement(mVec128, _z, 2); return *this; } -__forceinline Quat & Quat::setZ( const floatInVec &_z ) +VECTORMATH_FORCE_INLINE Quat & Quat::setZ( const floatInVec &_z ) { mVec128 = _vmathVfInsert(mVec128, _z.get128(), 2); return *this; } -__forceinline const floatInVec Quat::getZ( ) const +VECTORMATH_FORCE_INLINE const floatInVec Quat::getZ( ) const { return floatInVec( mVec128, 2 ); } -__forceinline Quat & Quat::setW( float _w ) +VECTORMATH_FORCE_INLINE Quat & Quat::setW( float _w ) { _vmathVfSetElement(mVec128, _w, 3); return *this; } -__forceinline Quat & Quat::setW( const floatInVec &_w ) +VECTORMATH_FORCE_INLINE Quat & Quat::setW( const floatInVec &_w ) { mVec128 = _vmathVfInsert(mVec128, _w.get128(), 3); return *this; } -__forceinline const floatInVec Quat::getW( ) const +VECTORMATH_FORCE_INLINE const floatInVec Quat::getW( ) const { return floatInVec( mVec128, 3 ); } -__forceinline Quat & Quat::setElem( int idx, float value ) +VECTORMATH_FORCE_INLINE Quat & Quat::setElem( int idx, float value ) { _vmathVfSetElement(mVec128, value, idx); return *this; } -__forceinline Quat & Quat::setElem( int idx, const floatInVec &value ) +VECTORMATH_FORCE_INLINE Quat & Quat::setElem( int idx, const floatInVec &value ) { mVec128 = _vmathVfInsert(mVec128, value.get128(), idx); return *this; } -__forceinline const floatInVec Quat::getElem( int idx ) const +VECTORMATH_FORCE_INLINE const floatInVec Quat::getElem( int idx ) const { return floatInVec( mVec128, idx ); } -__forceinline VecIdx Quat::operator []( int idx ) +VECTORMATH_FORCE_INLINE VecIdx Quat::operator []( int idx ) { return VecIdx( mVec128, idx ); } -__forceinline const floatInVec Quat::operator []( int idx ) const +VECTORMATH_FORCE_INLINE const floatInVec Quat::operator []( int idx ) const { return floatInVec( mVec128, idx ); } -__forceinline const Quat Quat::operator +( const Quat &quat ) const +VECTORMATH_FORCE_INLINE const Quat Quat::operator +( const Quat &quat ) const { return Quat( _mm_add_ps( mVec128, quat.mVec128 ) ); } -__forceinline const Quat Quat::operator -( const Quat &quat ) const +VECTORMATH_FORCE_INLINE const Quat Quat::operator -( const Quat &quat ) const { return Quat( _mm_sub_ps( mVec128, quat.mVec128 ) ); } -__forceinline const Quat Quat::operator *( float scalar ) const +VECTORMATH_FORCE_INLINE const Quat Quat::operator *( float scalar ) const { return *this * floatInVec(scalar); } -__forceinline const Quat Quat::operator *( const floatInVec &scalar ) const +VECTORMATH_FORCE_INLINE const Quat Quat::operator *( const floatInVec &scalar ) const { return Quat( _mm_mul_ps( mVec128, scalar.get128() ) ); } -__forceinline Quat & Quat::operator +=( const Quat &quat ) +VECTORMATH_FORCE_INLINE Quat & Quat::operator +=( const Quat &quat ) { *this = *this + quat; return *this; } -__forceinline Quat & Quat::operator -=( const Quat &quat ) +VECTORMATH_FORCE_INLINE Quat & Quat::operator -=( const Quat &quat ) { *this = *this - quat; return *this; } -__forceinline Quat & Quat::operator *=( float scalar ) +VECTORMATH_FORCE_INLINE Quat & Quat::operator *=( float scalar ) { *this = *this * scalar; return *this; } -__forceinline Quat & Quat::operator *=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Quat & Quat::operator *=( const floatInVec &scalar ) { *this = *this * scalar; return *this; } -__forceinline const Quat Quat::operator /( float scalar ) const +VECTORMATH_FORCE_INLINE const Quat Quat::operator /( float scalar ) const { return *this / floatInVec(scalar); } -__forceinline const Quat Quat::operator /( const floatInVec &scalar ) const +VECTORMATH_FORCE_INLINE const Quat Quat::operator /( const floatInVec &scalar ) const { return Quat( _mm_div_ps( mVec128, scalar.get128() ) ); } -__forceinline Quat & Quat::operator /=( float scalar ) +VECTORMATH_FORCE_INLINE Quat & Quat::operator /=( float scalar ) { *this = *this / scalar; return *this; } -__forceinline Quat & Quat::operator /=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Quat & Quat::operator /=( const floatInVec &scalar ) { *this = *this / scalar; return *this; } -__forceinline const Quat Quat::operator -( ) const +VECTORMATH_FORCE_INLINE const Quat Quat::operator -( ) const { return Quat(_mm_sub_ps( _mm_setzero_ps(), mVec128 ) ); } -__forceinline const Quat operator *( float scalar, const Quat &quat ) +VECTORMATH_FORCE_INLINE const Quat operator *( float scalar, const Quat &quat ) { return floatInVec(scalar) * quat; } -__forceinline const Quat operator *( const floatInVec &scalar, const Quat &quat ) +VECTORMATH_FORCE_INLINE const Quat operator *( const floatInVec &scalar, const Quat &quat ) { return quat * scalar; } -__forceinline const floatInVec dot( const Quat &quat0, const Quat &quat1 ) +VECTORMATH_FORCE_INLINE const floatInVec dot( const Quat &quat0, const Quat &quat1 ) { return floatInVec( _vmathVfDot4( quat0.get128(), quat1.get128() ), 0 ); } -__forceinline const floatInVec norm( const Quat &quat ) +VECTORMATH_FORCE_INLINE const floatInVec norm( const Quat &quat ) { return floatInVec( _vmathVfDot4( quat.get128(), quat.get128() ), 0 ); } -__forceinline const floatInVec length( const Quat &quat ) +VECTORMATH_FORCE_INLINE const floatInVec length( const Quat &quat ) { return floatInVec( _mm_sqrt_ps(_vmathVfDot4( quat.get128(), quat.get128() )), 0 ); } -__forceinline const Quat normalize( const Quat &quat ) +VECTORMATH_FORCE_INLINE const Quat normalize( const Quat &quat ) { vec_float4 dot =_vmathVfDot4( quat.get128(), quat.get128()); return Quat( _mm_mul_ps( quat.get128(), newtonrapson_rsqrt4( dot ) ) ); } -__forceinline const Quat Quat::rotation( const Vector3 &unitVec0, const Vector3 &unitVec1 ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotation( const Vector3 &unitVec0, const Vector3 &unitVec1 ) { Vector3 crossVec; __m128 cosAngle, cosAngleX2Plus2, recipCosHalfAngleX2, cosHalfAngleX2, res; @@ -387,78 +387,78 @@ __forceinline const Quat Quat::rotation( const Vector3 &unitVec0, const Vector3 cosHalfAngleX2 = vec_mul( recipCosHalfAngleX2, cosAngleX2Plus2 ); crossVec = cross( unitVec0, unitVec1 ); res = vec_mul( crossVec.get128(), recipCosHalfAngleX2 ); - __declspec(align(16)) unsigned int sw[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int sw[4] = {0, 0, 0, 0xffffffff}; res = vec_sel( res, vec_mul( cosHalfAngleX2, _mm_set1_ps(0.5f) ), sw ); return Quat( res ); } -__forceinline const Quat Quat::rotation( float radians, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotation( float radians, const Vector3 &unitVec ) { return rotation( floatInVec(radians), unitVec ); } -__forceinline const Quat Quat::rotation( const floatInVec &radians, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotation( const floatInVec &radians, const Vector3 &unitVec ) { __m128 s, c, angle, res; angle = vec_mul( radians.get128(), _mm_set1_ps(0.5f) ); sincosf4( angle, &s, &c ); - __declspec(align(16)) unsigned int sw[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int sw[4] = {0, 0, 0, 0xffffffff}; res = vec_sel( vec_mul( unitVec.get128(), s ), c, sw ); return Quat( res ); } -__forceinline const Quat Quat::rotationX( float radians ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotationX( float radians ) { return rotationX( floatInVec(radians) ); } -__forceinline const Quat Quat::rotationX( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotationX( const floatInVec &radians ) { __m128 s, c, angle, res; angle = vec_mul( radians.get128(), _mm_set1_ps(0.5f) ); sincosf4( angle, &s, &c ); - __declspec(align(16)) unsigned int xsw[4] = {0xffffffff, 0, 0, 0}; - __declspec(align(16)) unsigned int wsw[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int xsw[4] = {0xffffffff, 0, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int wsw[4] = {0, 0, 0, 0xffffffff}; res = vec_sel( _mm_setzero_ps(), s, xsw ); res = vec_sel( res, c, wsw ); return Quat( res ); } -__forceinline const Quat Quat::rotationY( float radians ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotationY( float radians ) { return rotationY( floatInVec(radians) ); } -__forceinline const Quat Quat::rotationY( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotationY( const floatInVec &radians ) { __m128 s, c, angle, res; angle = vec_mul( radians.get128(), _mm_set1_ps(0.5f) ); sincosf4( angle, &s, &c ); - __declspec(align(16)) unsigned int ysw[4] = {0, 0xffffffff, 0, 0}; - __declspec(align(16)) unsigned int wsw[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int ysw[4] = {0, 0xffffffff, 0, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int wsw[4] = {0, 0, 0, 0xffffffff}; res = vec_sel( _mm_setzero_ps(), s, ysw ); res = vec_sel( res, c, wsw ); return Quat( res ); } -__forceinline const Quat Quat::rotationZ( float radians ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotationZ( float radians ) { return rotationZ( floatInVec(radians) ); } -__forceinline const Quat Quat::rotationZ( const floatInVec &radians ) +VECTORMATH_FORCE_INLINE const Quat Quat::rotationZ( const floatInVec &radians ) { __m128 s, c, angle, res; angle = vec_mul( radians.get128(), _mm_set1_ps(0.5f) ); sincosf4( angle, &s, &c ); - __declspec(align(16)) unsigned int zsw[4] = {0, 0, 0xffffffff, 0}; - __declspec(align(16)) unsigned int wsw[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int zsw[4] = {0, 0, 0xffffffff, 0}; + VM_ATTRIBUTE_ALIGN16 unsigned int wsw[4] = {0, 0, 0, 0xffffffff}; res = vec_sel( _mm_setzero_ps(), s, zsw ); res = vec_sel( res, c, wsw ); return Quat( res ); } -__forceinline const Quat Quat::operator *( const Quat &quat ) const +VECTORMATH_FORCE_INLINE const Quat Quat::operator *( const Quat &quat ) const { __m128 ldata, rdata, qv, tmp0, tmp1, tmp2, tmp3; __m128 product, l_wxyz, r_wxyz, xy, qw; @@ -478,17 +478,17 @@ __forceinline const Quat Quat::operator *( const Quat &quat ) const qw = vec_nmsub( l_wxyz, r_wxyz, product ); xy = vec_madd( l_wxyz, r_wxyz, product ); qw = vec_sub( qw, vec_sld( xy, xy, 8 ) ); - __declspec(align(16)) unsigned int sw[4] = {0, 0, 0, 0xffffffff}; + VM_ATTRIBUTE_ALIGN16 unsigned int sw[4] = {0, 0, 0, 0xffffffff}; return Quat( vec_sel( qv, qw, sw ) ); } -__forceinline Quat & Quat::operator *=( const Quat &quat ) +VECTORMATH_FORCE_INLINE Quat & Quat::operator *=( const Quat &quat ) { *this = *this * quat; return *this; } -__forceinline const Vector3 rotate( const Quat &quat, const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const Vector3 rotate( const Quat &quat, const Vector3 &vec ) { __m128 qdata, vdata, product, tmp0, tmp1, tmp2, tmp3, wwww, qv, qw, res; qdata = quat.get128(); vdata = vec.get128(); @@ -512,23 +512,23 @@ __forceinline const Vector3 rotate( const Quat &quat, const Vector3 &vec ) return Vector3( res ); } -__forceinline const Quat conj( const Quat &quat ) +VECTORMATH_FORCE_INLINE const Quat conj( const Quat &quat ) { - __declspec(align(16)) unsigned int sw[4] = {0x80000000,0x80000000,0x80000000,0}; + VM_ATTRIBUTE_ALIGN16 unsigned int sw[4] = {0x80000000,0x80000000,0x80000000,0}; return Quat( vec_xor( quat.get128(), _mm_load_ps((float *)sw) ) ); } -__forceinline const Quat select( const Quat &quat0, const Quat &quat1, bool select1 ) +VECTORMATH_FORCE_INLINE const Quat select( const Quat &quat0, const Quat &quat1, bool select1 ) { return select( quat0, quat1, boolInVec(select1) ); } -//__forceinline const Quat select( const Quat &quat0, const Quat &quat1, const boolInVec &select1 ) +//VECTORMATH_FORCE_INLINE const Quat select( const Quat &quat0, const Quat &quat1, const boolInVec &select1 ) //{ // return Quat( vec_sel( quat0.get128(), quat1.get128(), select1.get128() ) ); //} -__forceinline void loadXYZW(Quat& quat, const float* fptr) +VECTORMATH_FORCE_INLINE void loadXYZW(Quat& quat, const float* fptr) { #ifdef USE_SSE2_LDDQU quat = Quat( SSEFloat(_mm_lddqu_si128((const __m128i*)((float*)(fptr)))).m128 ); @@ -544,7 +544,7 @@ __forceinline void loadXYZW(Quat& quat, const float* fptr) } -__forceinline void storeXYZW(const Quat& quat, float* fptr) +VECTORMATH_FORCE_INLINE void storeXYZW(const Quat& quat, float* fptr) { fptr[0] = quat.getX(); fptr[1] = quat.getY(); @@ -557,14 +557,14 @@ __forceinline void storeXYZW(const Quat& quat, float* fptr) #ifdef _VECTORMATH_DEBUG -__forceinline void print( const Quat &quat ) +VECTORMATH_FORCE_INLINE void print( const Quat &quat ) { union { __m128 v; float s[4]; } tmp; tmp.v = quat.get128(); printf( "( %f %f %f %f )\n", tmp.s[0], tmp.s[1], tmp.s[2], tmp.s[3] ); } -__forceinline void print( const Quat &quat, const char * name ) +VECTORMATH_FORCE_INLINE void print( const Quat &quat, const char * name ) { union { __m128 v; float s[4]; } tmp; tmp.v = quat.get128(); diff --git a/src/vectormath/sse/vec_aos.h b/src/vectormath/sse/vec_aos.h index 1a6e02eae..aad251ac5 100644 --- a/src/vectormath/sse/vec_aos.h +++ b/src/vectormath/sse/vec_aos.h @@ -67,13 +67,13 @@ #define _VECTORMATH_INTERNAL_FUNCTIONS #define _vmath_shufps(a, b, immx, immy, immz, immw) _mm_shuffle_ps(a, b, _MM_SHUFFLE(immw, immz, immy, immx)) -static __forceinline __m128 _vmathVfDot3( __m128 vec0, __m128 vec1 ) +static VECTORMATH_FORCE_INLINE __m128 _vmathVfDot3( __m128 vec0, __m128 vec1 ) { __m128 result = _mm_mul_ps( vec0, vec1); return _mm_add_ps( vec_splat( result, 0 ), _mm_add_ps( vec_splat( result, 1 ), vec_splat( result, 2 ) ) ); } -static __forceinline __m128 _vmathVfDot4( __m128 vec0, __m128 vec1 ) +static VECTORMATH_FORCE_INLINE __m128 _vmathVfDot4( __m128 vec0, __m128 vec1 ) { __m128 result = _mm_mul_ps(vec0, vec1); return _mm_add_ps(_mm_shuffle_ps(result, result, _MM_SHUFFLE(0,0,0,0)), @@ -81,7 +81,7 @@ static __forceinline __m128 _vmathVfDot4( __m128 vec0, __m128 vec1 ) _mm_add_ps(_mm_shuffle_ps(result, result, _MM_SHUFFLE(2,2,2,2)), _mm_shuffle_ps(result, result, _MM_SHUFFLE(3,3,3,3))))); } -static __forceinline __m128 _vmathVfCross( __m128 vec0, __m128 vec1 ) +static VECTORMATH_FORCE_INLINE __m128 _vmathVfCross( __m128 vec0, __m128 vec1 ) { __m128 tmp0, tmp1, tmp2, tmp3, result; tmp0 = _mm_shuffle_ps( vec0, vec0, _MM_SHUFFLE(3,0,2,1) ); @@ -93,7 +93,7 @@ static __forceinline __m128 _vmathVfCross( __m128 vec0, __m128 vec1 ) return result; } /* -static __forceinline vec_uint4 _vmathVfToHalfFloatsUnpacked(__m128 v) +static VECTORMATH_FORCE_INLINE vec_uint4 _vmathVfToHalfFloatsUnpacked(__m128 v) { #if 0 vec_int4 bexp; @@ -125,7 +125,7 @@ static __forceinline vec_uint4 _vmathVfToHalfFloatsUnpacked(__m128 v) #endif } -static __forceinline vec_ushort8 _vmath2VfToHalfFloats(__m128 u, __m128 v) +static VECTORMATH_FORCE_INLINE vec_ushort8 _vmath2VfToHalfFloats(__m128 u, __m128 v) { #if 0 vec_uint4 hfloat_u, hfloat_v; @@ -140,7 +140,7 @@ static __forceinline vec_ushort8 _vmath2VfToHalfFloats(__m128 u, __m128 v) } */ -static __forceinline __m128 _vmathVfInsert(__m128 dst, __m128 src, int slot) +static VECTORMATH_FORCE_INLINE __m128 _vmathVfInsert(__m128 dst, __m128 src, int slot) { SSEFloat s; s.m128 = src; @@ -152,7 +152,7 @@ static __forceinline __m128 _vmathVfInsert(__m128 dst, __m128 src, int slot) #define _vmathVfSetElement(vec, scalar, slot) ((float *)&(vec))[slot] = scalar -static __forceinline __m128 _vmathVfSplatScalar(float scalar) +static VECTORMATH_FORCE_INLINE __m128 _vmathVfSplatScalar(float scalar) { return _mm_set1_ps(scalar); } @@ -164,47 +164,47 @@ namespace Aos { #ifdef _VECTORMATH_NO_SCALAR_CAST -__forceinline VecIdx::operator floatInVec() const +VECTORMATH_FORCE_INLINE VecIdx::operator floatInVec() const { return floatInVec(ref, i); } -__forceinline float VecIdx::getAsFloat() const +VECTORMATH_FORCE_INLINE float VecIdx::getAsFloat() const #else -__forceinline VecIdx::operator float() const +VECTORMATH_FORCE_INLINE VecIdx::operator float() const #endif { return ((float *)&ref)[i]; } -__forceinline float VecIdx::operator =( float scalar ) +VECTORMATH_FORCE_INLINE float VecIdx::operator =( float scalar ) { _vmathVfSetElement(ref, scalar, i); return scalar; } -__forceinline floatInVec VecIdx::operator =( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator =( const floatInVec &scalar ) { ref = _vmathVfInsert(ref, scalar.get128(), i); return scalar; } -__forceinline floatInVec VecIdx::operator =( const VecIdx& scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator =( const VecIdx& scalar ) { return *this = floatInVec(scalar.ref, scalar.i); } -__forceinline floatInVec VecIdx::operator *=( float scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator *=( float scalar ) { return *this *= floatInVec(scalar); } -__forceinline floatInVec VecIdx::operator *=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator *=( const floatInVec &scalar ) { return *this = floatInVec(ref, i) * scalar; } -__forceinline floatInVec VecIdx::operator /=( float scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator /=( float scalar ) { return *this /= floatInVec(scalar); } @@ -214,99 +214,99 @@ inline floatInVec VecIdx::operator /=( const floatInVec &scalar ) return *this = floatInVec(ref, i) / scalar; } -__forceinline floatInVec VecIdx::operator +=( float scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator +=( float scalar ) { return *this += floatInVec(scalar); } -__forceinline floatInVec VecIdx::operator +=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator +=( const floatInVec &scalar ) { return *this = floatInVec(ref, i) + scalar; } -__forceinline floatInVec VecIdx::operator -=( float scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator -=( float scalar ) { return *this -= floatInVec(scalar); } -__forceinline floatInVec VecIdx::operator -=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE floatInVec VecIdx::operator -=( const floatInVec &scalar ) { return *this = floatInVec(ref, i) - scalar; } -__forceinline Vector3::Vector3(const Vector3& vec) +VECTORMATH_FORCE_INLINE Vector3::Vector3(const Vector3& vec) { set128(vec.get128()); } -__forceinline void Vector3::set128(vec_float4 vec) +VECTORMATH_FORCE_INLINE void Vector3::set128(vec_float4 vec) { mVec128 = vec; } -__forceinline Vector3::Vector3( float _x, float _y, float _z ) +VECTORMATH_FORCE_INLINE Vector3::Vector3( float _x, float _y, float _z ) { mVec128 = _mm_setr_ps(_x, _y, _z, 0.0f); } -__forceinline Vector3::Vector3( const floatInVec &_x, const floatInVec &_y, const floatInVec &_z ) +VECTORMATH_FORCE_INLINE Vector3::Vector3( const floatInVec &_x, const floatInVec &_y, const floatInVec &_z ) { __m128 xz = _mm_unpacklo_ps( _x.get128(), _z.get128() ); mVec128 = _mm_unpacklo_ps( xz, _y.get128() ); } -__forceinline Vector3::Vector3( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE Vector3::Vector3( const Point3 &pnt ) { mVec128 = pnt.get128(); } -__forceinline Vector3::Vector3( float scalar ) +VECTORMATH_FORCE_INLINE Vector3::Vector3( float scalar ) { mVec128 = floatInVec(scalar).get128(); } -__forceinline Vector3::Vector3( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Vector3::Vector3( const floatInVec &scalar ) { mVec128 = scalar.get128(); } -__forceinline Vector3::Vector3( __m128 vf4 ) +VECTORMATH_FORCE_INLINE Vector3::Vector3( __m128 vf4 ) { mVec128 = vf4; } -__forceinline const Vector3 Vector3::xAxis( ) +VECTORMATH_FORCE_INLINE const Vector3 Vector3::xAxis( ) { return Vector3( _VECTORMATH_UNIT_1000 ); } -__forceinline const Vector3 Vector3::yAxis( ) +VECTORMATH_FORCE_INLINE const Vector3 Vector3::yAxis( ) { return Vector3( _VECTORMATH_UNIT_0100 ); } -__forceinline const Vector3 Vector3::zAxis( ) +VECTORMATH_FORCE_INLINE const Vector3 Vector3::zAxis( ) { return Vector3( _VECTORMATH_UNIT_0010 ); } -__forceinline const Vector3 lerp( float t, const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector3 lerp( float t, const Vector3 &vec0, const Vector3 &vec1 ) { return lerp( floatInVec(t), vec0, vec1 ); } -__forceinline const Vector3 lerp( const floatInVec &t, const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector3 lerp( const floatInVec &t, const Vector3 &vec0, const Vector3 &vec1 ) { return ( vec0 + ( ( vec1 - vec0 ) * t ) ); } -__forceinline const Vector3 slerp( float t, const Vector3 &unitVec0, const Vector3 &unitVec1 ) +VECTORMATH_FORCE_INLINE const Vector3 slerp( float t, const Vector3 &unitVec0, const Vector3 &unitVec1 ) { return slerp( floatInVec(t), unitVec0, unitVec1 ); } -__forceinline const Vector3 slerp( const floatInVec &t, const Vector3 &unitVec0, const Vector3 &unitVec1 ) +VECTORMATH_FORCE_INLINE const Vector3 slerp( const floatInVec &t, const Vector3 &unitVec0, const Vector3 &unitVec1 ) { __m128 scales, scale0, scale1, cosAngle, angle, tttt, oneMinusT, angles, sines; cosAngle = _vmathVfDot3( unitVec0.get128(), unitVec1.get128() ); @@ -324,12 +324,12 @@ __forceinline const Vector3 slerp( const floatInVec &t, const Vector3 &unitVec0, return Vector3( vec_madd( unitVec0.get128(), scale0, _mm_mul_ps( unitVec1.get128(), scale1 ) ) ); } -__forceinline __m128 Vector3::get128( ) const +VECTORMATH_FORCE_INLINE __m128 Vector3::get128( ) const { return mVec128; } -__forceinline void loadXYZ(Vector3& vec, const float* fptr) +VECTORMATH_FORCE_INLINE void loadXYZ(Vector3& vec, const float* fptr) { #ifdef USE_SSE2_LDDQU vec = Vector3( SSEFloat(_mm_lddqu_si128((const __m128i*)((float*)(fptr)))).m128 ); @@ -344,7 +344,7 @@ __forceinline void loadXYZ(Vector3& vec, const float* fptr) } -__forceinline void storeXYZ( const Vector3 &vec, __m128 * quad ) +VECTORMATH_FORCE_INLINE void storeXYZ( const Vector3 &vec, __m128 * quad ) { __m128 dstVec = *quad; __declspec(align(16)) unsigned int sw[4] = {0, 0, 0, 0xffffffff}; // TODO: Centralize @@ -352,7 +352,7 @@ __forceinline void storeXYZ( const Vector3 &vec, __m128 * quad ) *quad = dstVec; } -__forceinline void storeXYZ(const Vector3& vec, float* fptr) +VECTORMATH_FORCE_INLINE void storeXYZ(const Vector3& vec, float* fptr) { fptr[0] = vec.getX(); fptr[1] = vec.getY(); @@ -360,7 +360,7 @@ __forceinline void storeXYZ(const Vector3& vec, float* fptr) } -__forceinline void loadXYZArray( Vector3 & vec0, Vector3 & vec1, Vector3 & vec2, Vector3 & vec3, const __m128 * threeQuads ) +VECTORMATH_FORCE_INLINE void loadXYZArray( Vector3 & vec0, Vector3 & vec1, Vector3 & vec2, Vector3 & vec3, const __m128 * threeQuads ) { const float *quads = (float *)threeQuads; vec0 = Vector3( _mm_load_ps(quads) ); @@ -369,7 +369,7 @@ __forceinline void loadXYZArray( Vector3 & vec0, Vector3 & vec1, Vector3 & vec2, vec3 = Vector3( _mm_loadu_ps(quads + 9) ); } -__forceinline void storeXYZArray( const Vector3 &vec0, const Vector3 &vec1, const Vector3 &vec2, const Vector3 &vec3, __m128 * threeQuads ) +VECTORMATH_FORCE_INLINE void storeXYZArray( const Vector3 &vec0, const Vector3 &vec1, const Vector3 &vec2, const Vector3 &vec3, __m128 * threeQuads ) { __m128 xxxx = _mm_shuffle_ps( vec1.get128(), vec1.get128(), _MM_SHUFFLE(0, 0, 0, 0) ); __m128 zzzz = _mm_shuffle_ps( vec2.get128(), vec2.get128(), _MM_SHUFFLE(2, 2, 2, 2) ); @@ -380,7 +380,7 @@ __forceinline void storeXYZArray( const Vector3 &vec0, const Vector3 &vec1, cons threeQuads[2] = vec_sel( _mm_shuffle_ps( vec3.get128(), vec3.get128(), _MM_SHUFFLE(2, 1, 0, 3) ), zzzz, zsw ); } /* -__forceinline void storeHalfFloats( const Vector3 &vec0, const Vector3 &vec1, const Vector3 &vec2, const Vector3 &vec3, const Vector3 &vec4, const Vector3 &vec5, const Vector3 &vec6, const Vector3 &vec7, vec_ushort8 * threeQuads ) +VECTORMATH_FORCE_INLINE void storeHalfFloats( const Vector3 &vec0, const Vector3 &vec1, const Vector3 &vec2, const Vector3 &vec3, const Vector3 &vec4, const Vector3 &vec5, const Vector3 &vec6, const Vector3 &vec7, vec_ushort8 * threeQuads ) { assert(0); #if 0 @@ -394,162 +394,162 @@ __forceinline void storeHalfFloats( const Vector3 &vec0, const Vector3 &vec1, co #endif } */ -__forceinline Vector3 & Vector3::operator =( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::operator =( const Vector3 &vec ) { mVec128 = vec.mVec128; return *this; } -__forceinline Vector3 & Vector3::setX( float _x ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::setX( float _x ) { _vmathVfSetElement(mVec128, _x, 0); return *this; } -__forceinline Vector3 & Vector3::setX( const floatInVec &_x ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::setX( const floatInVec &_x ) { mVec128 = _vmathVfInsert(mVec128, _x.get128(), 0); return *this; } -__forceinline const floatInVec Vector3::getX( ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector3::getX( ) const { return floatInVec( mVec128, 0 ); } -__forceinline Vector3 & Vector3::setY( float _y ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::setY( float _y ) { _vmathVfSetElement(mVec128, _y, 1); return *this; } -__forceinline Vector3 & Vector3::setY( const floatInVec &_y ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::setY( const floatInVec &_y ) { mVec128 = _vmathVfInsert(mVec128, _y.get128(), 1); return *this; } -__forceinline const floatInVec Vector3::getY( ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector3::getY( ) const { return floatInVec( mVec128, 1 ); } -__forceinline Vector3 & Vector3::setZ( float _z ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::setZ( float _z ) { _vmathVfSetElement(mVec128, _z, 2); return *this; } -__forceinline Vector3 & Vector3::setZ( const floatInVec &_z ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::setZ( const floatInVec &_z ) { mVec128 = _vmathVfInsert(mVec128, _z.get128(), 2); return *this; } -__forceinline const floatInVec Vector3::getZ( ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector3::getZ( ) const { return floatInVec( mVec128, 2 ); } -__forceinline Vector3 & Vector3::setElem( int idx, float value ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::setElem( int idx, float value ) { _vmathVfSetElement(mVec128, value, idx); return *this; } -__forceinline Vector3 & Vector3::setElem( int idx, const floatInVec &value ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::setElem( int idx, const floatInVec &value ) { mVec128 = _vmathVfInsert(mVec128, value.get128(), idx); return *this; } -__forceinline const floatInVec Vector3::getElem( int idx ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector3::getElem( int idx ) const { return floatInVec( mVec128, idx ); } -__forceinline VecIdx Vector3::operator []( int idx ) +VECTORMATH_FORCE_INLINE VecIdx Vector3::operator []( int idx ) { return VecIdx( mVec128, idx ); } -__forceinline const floatInVec Vector3::operator []( int idx ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector3::operator []( int idx ) const { return floatInVec( mVec128, idx ); } -__forceinline const Vector3 Vector3::operator +( const Vector3 &vec ) const +VECTORMATH_FORCE_INLINE const Vector3 Vector3::operator +( const Vector3 &vec ) const { return Vector3( _mm_add_ps( mVec128, vec.mVec128 ) ); } -__forceinline const Vector3 Vector3::operator -( const Vector3 &vec ) const +VECTORMATH_FORCE_INLINE const Vector3 Vector3::operator -( const Vector3 &vec ) const { return Vector3( _mm_sub_ps( mVec128, vec.mVec128 ) ); } -__forceinline const Point3 Vector3::operator +( const Point3 &pnt ) const +VECTORMATH_FORCE_INLINE const Point3 Vector3::operator +( const Point3 &pnt ) const { return Point3( _mm_add_ps( mVec128, pnt.get128() ) ); } -__forceinline const Vector3 Vector3::operator *( float scalar ) const +VECTORMATH_FORCE_INLINE const Vector3 Vector3::operator *( float scalar ) const { return *this * floatInVec(scalar); } -__forceinline const Vector3 Vector3::operator *( const floatInVec &scalar ) const +VECTORMATH_FORCE_INLINE const Vector3 Vector3::operator *( const floatInVec &scalar ) const { return Vector3( _mm_mul_ps( mVec128, scalar.get128() ) ); } -__forceinline Vector3 & Vector3::operator +=( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::operator +=( const Vector3 &vec ) { *this = *this + vec; return *this; } -__forceinline Vector3 & Vector3::operator -=( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::operator -=( const Vector3 &vec ) { *this = *this - vec; return *this; } -__forceinline Vector3 & Vector3::operator *=( float scalar ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::operator *=( float scalar ) { *this = *this * scalar; return *this; } -__forceinline Vector3 & Vector3::operator *=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::operator *=( const floatInVec &scalar ) { *this = *this * scalar; return *this; } -__forceinline const Vector3 Vector3::operator /( float scalar ) const +VECTORMATH_FORCE_INLINE const Vector3 Vector3::operator /( float scalar ) const { return *this / floatInVec(scalar); } -__forceinline const Vector3 Vector3::operator /( const floatInVec &scalar ) const +VECTORMATH_FORCE_INLINE const Vector3 Vector3::operator /( const floatInVec &scalar ) const { return Vector3( _mm_div_ps( mVec128, scalar.get128() ) ); } -__forceinline Vector3 & Vector3::operator /=( float scalar ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::operator /=( float scalar ) { *this = *this / scalar; return *this; } -__forceinline Vector3 & Vector3::operator /=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Vector3 & Vector3::operator /=( const floatInVec &scalar ) { *this = *this / scalar; return *this; } -__forceinline const Vector3 Vector3::operator -( ) const +VECTORMATH_FORCE_INLINE const Vector3 Vector3::operator -( ) const { //return Vector3(_mm_sub_ps( _mm_setzero_ps(), mVec128 ) ); @@ -558,37 +558,37 @@ __forceinline const Vector3 Vector3::operator -( ) const return Vector3(_mm_xor_ps(get128(),NEG_MASK)); } -__forceinline const Vector3 operator *( float scalar, const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const Vector3 operator *( float scalar, const Vector3 &vec ) { return floatInVec(scalar) * vec; } -__forceinline const Vector3 operator *( const floatInVec &scalar, const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const Vector3 operator *( const floatInVec &scalar, const Vector3 &vec ) { return vec * scalar; } -__forceinline const Vector3 mulPerElem( const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector3 mulPerElem( const Vector3 &vec0, const Vector3 &vec1 ) { return Vector3( _mm_mul_ps( vec0.get128(), vec1.get128() ) ); } -__forceinline const Vector3 divPerElem( const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector3 divPerElem( const Vector3 &vec0, const Vector3 &vec1 ) { return Vector3( _mm_div_ps( vec0.get128(), vec1.get128() ) ); } -__forceinline const Vector3 recipPerElem( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const Vector3 recipPerElem( const Vector3 &vec ) { return Vector3( _mm_rcp_ps( vec.get128() ) ); } -__forceinline const Vector3 absPerElem( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const Vector3 absPerElem( const Vector3 &vec ) { return Vector3( fabsf4( vec.get128() ) ); } -__forceinline const Vector3 copySignPerElem( const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector3 copySignPerElem( const Vector3 &vec0, const Vector3 &vec1 ) { __m128 vmask = toM128(0x7fffffff); return Vector3( _mm_or_ps( @@ -596,83 +596,83 @@ __forceinline const Vector3 copySignPerElem( const Vector3 &vec0, const Vector3 _mm_andnot_ps( vmask, vec1.get128() ) ) ); // Signs } -__forceinline const Vector3 maxPerElem( const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector3 maxPerElem( const Vector3 &vec0, const Vector3 &vec1 ) { return Vector3( _mm_max_ps( vec0.get128(), vec1.get128() ) ); } -__forceinline const floatInVec maxElem( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec maxElem( const Vector3 &vec ) { return floatInVec( _mm_max_ps( _mm_max_ps( vec_splat( vec.get128(), 0 ), vec_splat( vec.get128(), 1 ) ), vec_splat( vec.get128(), 2 ) ) ); } -__forceinline const Vector3 minPerElem( const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector3 minPerElem( const Vector3 &vec0, const Vector3 &vec1 ) { return Vector3( _mm_min_ps( vec0.get128(), vec1.get128() ) ); } -__forceinline const floatInVec minElem( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec minElem( const Vector3 &vec ) { return floatInVec( _mm_min_ps( _mm_min_ps( vec_splat( vec.get128(), 0 ), vec_splat( vec.get128(), 1 ) ), vec_splat( vec.get128(), 2 ) ) ); } -__forceinline const floatInVec sum( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec sum( const Vector3 &vec ) { return floatInVec( _mm_add_ps( _mm_add_ps( vec_splat( vec.get128(), 0 ), vec_splat( vec.get128(), 1 ) ), vec_splat( vec.get128(), 2 ) ) ); } -__forceinline const floatInVec dot( const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const floatInVec dot( const Vector3 &vec0, const Vector3 &vec1 ) { return floatInVec( _vmathVfDot3( vec0.get128(), vec1.get128() ), 0 ); } -__forceinline const floatInVec lengthSqr( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec lengthSqr( const Vector3 &vec ) { return floatInVec( _vmathVfDot3( vec.get128(), vec.get128() ), 0 ); } -__forceinline const floatInVec length( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec length( const Vector3 &vec ) { return floatInVec( _mm_sqrt_ps(_vmathVfDot3( vec.get128(), vec.get128() )), 0 ); } -__forceinline const Vector3 normalizeApprox( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const Vector3 normalizeApprox( const Vector3 &vec ) { return Vector3( _mm_mul_ps( vec.get128(), _mm_rsqrt_ps( _vmathVfDot3( vec.get128(), vec.get128() ) ) ) ); } -__forceinline const Vector3 normalize( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE const Vector3 normalize( const Vector3 &vec ) { return Vector3( _mm_mul_ps( vec.get128(), newtonrapson_rsqrt4( _vmathVfDot3( vec.get128(), vec.get128() ) ) ) ); } -__forceinline const Vector3 cross( const Vector3 &vec0, const Vector3 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector3 cross( const Vector3 &vec0, const Vector3 &vec1 ) { return Vector3( _vmathVfCross( vec0.get128(), vec1.get128() ) ); } -__forceinline const Vector3 select( const Vector3 &vec0, const Vector3 &vec1, bool select1 ) +VECTORMATH_FORCE_INLINE const Vector3 select( const Vector3 &vec0, const Vector3 &vec1, bool select1 ) { return select( vec0, vec1, boolInVec(select1) ); } -__forceinline const Vector4 select(const Vector4& vec0, const Vector4& vec1, const boolInVec& select1) +VECTORMATH_FORCE_INLINE const Vector4 select(const Vector4& vec0, const Vector4& vec1, const boolInVec& select1) { return Vector4(vec_sel(vec0.get128(), vec1.get128(), select1.get128())); } #ifdef _VECTORMATH_DEBUG -__forceinline void print( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE void print( const Vector3 &vec ) { union { __m128 v; float s[4]; } tmp; tmp.v = vec.get128(); printf( "( %f %f %f )\n", tmp.s[0], tmp.s[1], tmp.s[2] ); } -__forceinline void print( const Vector3 &vec, const char * name ) +VECTORMATH_FORCE_INLINE void print( const Vector3 &vec, const char * name ) { union { __m128 v; float s[4]; } tmp; tmp.v = vec.get128(); @@ -681,98 +681,98 @@ __forceinline void print( const Vector3 &vec, const char * name ) #endif -__forceinline Vector4::Vector4( float _x, float _y, float _z, float _w ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( float _x, float _y, float _z, float _w ) { mVec128 = _mm_setr_ps(_x, _y, _z, _w); } -__forceinline Vector4::Vector4( const floatInVec &_x, const floatInVec &_y, const floatInVec &_z, const floatInVec &_w ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( const floatInVec &_x, const floatInVec &_y, const floatInVec &_z, const floatInVec &_w ) { mVec128 = _mm_unpacklo_ps( _mm_unpacklo_ps( _x.get128(), _z.get128() ), _mm_unpacklo_ps( _y.get128(), _w.get128() ) ); } -__forceinline Vector4::Vector4( const Vector3 &xyz, float _w ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( const Vector3 &xyz, float _w ) { mVec128 = xyz.get128(); _vmathVfSetElement(mVec128, _w, 3); } -__forceinline Vector4::Vector4( const Vector3 &xyz, const floatInVec &_w ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( const Vector3 &xyz, const floatInVec &_w ) { mVec128 = xyz.get128(); mVec128 = _vmathVfInsert(mVec128, _w.get128(), 3); } -__forceinline Vector4::Vector4( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( const Vector3 &vec ) { mVec128 = vec.get128(); mVec128 = _vmathVfInsert(mVec128, _mm_setzero_ps(), 3); } -__forceinline Vector4::Vector4( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( const Point3 &pnt ) { mVec128 = pnt.get128(); mVec128 = _vmathVfInsert(mVec128, _mm_set1_ps(1.0f), 3); } -__forceinline Vector4::Vector4( const Quat &quat ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( const Quat &quat ) { mVec128 = quat.get128(); } -__forceinline Vector4::Vector4( float scalar ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( float scalar ) { mVec128 = floatInVec(scalar).get128(); } -__forceinline Vector4::Vector4( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( const floatInVec &scalar ) { mVec128 = scalar.get128(); } -__forceinline Vector4::Vector4( __m128 vf4 ) +VECTORMATH_FORCE_INLINE Vector4::Vector4( __m128 vf4 ) { mVec128 = vf4; } -__forceinline const Vector4 Vector4::xAxis( ) +VECTORMATH_FORCE_INLINE const Vector4 Vector4::xAxis( ) { return Vector4( _VECTORMATH_UNIT_1000 ); } -__forceinline const Vector4 Vector4::yAxis( ) +VECTORMATH_FORCE_INLINE const Vector4 Vector4::yAxis( ) { return Vector4( _VECTORMATH_UNIT_0100 ); } -__forceinline const Vector4 Vector4::zAxis( ) +VECTORMATH_FORCE_INLINE const Vector4 Vector4::zAxis( ) { return Vector4( _VECTORMATH_UNIT_0010 ); } -__forceinline const Vector4 Vector4::wAxis( ) +VECTORMATH_FORCE_INLINE const Vector4 Vector4::wAxis( ) { return Vector4( _VECTORMATH_UNIT_0001 ); } -__forceinline const Vector4 lerp( float t, const Vector4 &vec0, const Vector4 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector4 lerp( float t, const Vector4 &vec0, const Vector4 &vec1 ) { return lerp( floatInVec(t), vec0, vec1 ); } -__forceinline const Vector4 lerp( const floatInVec &t, const Vector4 &vec0, const Vector4 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector4 lerp( const floatInVec &t, const Vector4 &vec0, const Vector4 &vec1 ) { return ( vec0 + ( ( vec1 - vec0 ) * t ) ); } -__forceinline const Vector4 slerp( float t, const Vector4 &unitVec0, const Vector4 &unitVec1 ) +VECTORMATH_FORCE_INLINE const Vector4 slerp( float t, const Vector4 &unitVec0, const Vector4 &unitVec1 ) { return slerp( floatInVec(t), unitVec0, unitVec1 ); } -__forceinline const Vector4 slerp( const floatInVec &t, const Vector4 &unitVec0, const Vector4 &unitVec1 ) +VECTORMATH_FORCE_INLINE const Vector4 slerp( const floatInVec &t, const Vector4 &unitVec0, const Vector4 &unitVec1 ) { __m128 scales, scale0, scale1, cosAngle, angle, tttt, oneMinusT, angles, sines; cosAngle = _vmathVfDot4( unitVec0.get128(), unitVec1.get128() ); @@ -790,232 +790,232 @@ __forceinline const Vector4 slerp( const floatInVec &t, const Vector4 &unitVec0, return Vector4( vec_madd( unitVec0.get128(), scale0, _mm_mul_ps( unitVec1.get128(), scale1 ) ) ); } -__forceinline __m128 Vector4::get128( ) const +VECTORMATH_FORCE_INLINE __m128 Vector4::get128( ) const { return mVec128; } /* -__forceinline void storeHalfFloats( const Vector4 &vec0, const Vector4 &vec1, const Vector4 &vec2, const Vector4 &vec3, vec_ushort8 * twoQuads ) +VECTORMATH_FORCE_INLINE void storeHalfFloats( const Vector4 &vec0, const Vector4 &vec1, const Vector4 &vec2, const Vector4 &vec3, vec_ushort8 * twoQuads ) { twoQuads[0] = _vmath2VfToHalfFloats(vec0.get128(), vec1.get128()); twoQuads[1] = _vmath2VfToHalfFloats(vec2.get128(), vec3.get128()); } */ -__forceinline Vector4 & Vector4::operator =( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::operator =( const Vector4 &vec ) { mVec128 = vec.mVec128; return *this; } -__forceinline Vector4 & Vector4::setXYZ( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setXYZ( const Vector3 &vec ) { __declspec(align(16)) unsigned int sw[4] = {0, 0, 0, 0xffffffff}; mVec128 = vec_sel( vec.get128(), mVec128, sw ); return *this; } -__forceinline const Vector3 Vector4::getXYZ( ) const +VECTORMATH_FORCE_INLINE const Vector3 Vector4::getXYZ( ) const { return Vector3( mVec128 ); } -__forceinline Vector4 & Vector4::setX( float _x ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setX( float _x ) { _vmathVfSetElement(mVec128, _x, 0); return *this; } -__forceinline Vector4 & Vector4::setX( const floatInVec &_x ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setX( const floatInVec &_x ) { mVec128 = _vmathVfInsert(mVec128, _x.get128(), 0); return *this; } -__forceinline const floatInVec Vector4::getX( ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector4::getX( ) const { return floatInVec( mVec128, 0 ); } -__forceinline Vector4 & Vector4::setY( float _y ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setY( float _y ) { _vmathVfSetElement(mVec128, _y, 1); return *this; } -__forceinline Vector4 & Vector4::setY( const floatInVec &_y ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setY( const floatInVec &_y ) { mVec128 = _vmathVfInsert(mVec128, _y.get128(), 1); return *this; } -__forceinline const floatInVec Vector4::getY( ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector4::getY( ) const { return floatInVec( mVec128, 1 ); } -__forceinline Vector4 & Vector4::setZ( float _z ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setZ( float _z ) { _vmathVfSetElement(mVec128, _z, 2); return *this; } -__forceinline Vector4 & Vector4::setZ( const floatInVec &_z ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setZ( const floatInVec &_z ) { mVec128 = _vmathVfInsert(mVec128, _z.get128(), 2); return *this; } -__forceinline const floatInVec Vector4::getZ( ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector4::getZ( ) const { return floatInVec( mVec128, 2 ); } -__forceinline Vector4 & Vector4::setW( float _w ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setW( float _w ) { _vmathVfSetElement(mVec128, _w, 3); return *this; } -__forceinline Vector4 & Vector4::setW( const floatInVec &_w ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setW( const floatInVec &_w ) { mVec128 = _vmathVfInsert(mVec128, _w.get128(), 3); return *this; } -__forceinline const floatInVec Vector4::getW( ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector4::getW( ) const { return floatInVec( mVec128, 3 ); } -__forceinline Vector4 & Vector4::setElem( int idx, float value ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setElem( int idx, float value ) { _vmathVfSetElement(mVec128, value, idx); return *this; } -__forceinline Vector4 & Vector4::setElem( int idx, const floatInVec &value ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::setElem( int idx, const floatInVec &value ) { mVec128 = _vmathVfInsert(mVec128, value.get128(), idx); return *this; } -__forceinline const floatInVec Vector4::getElem( int idx ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector4::getElem( int idx ) const { return floatInVec( mVec128, idx ); } -__forceinline VecIdx Vector4::operator []( int idx ) +VECTORMATH_FORCE_INLINE VecIdx Vector4::operator []( int idx ) { return VecIdx( mVec128, idx ); } -__forceinline const floatInVec Vector4::operator []( int idx ) const +VECTORMATH_FORCE_INLINE const floatInVec Vector4::operator []( int idx ) const { return floatInVec( mVec128, idx ); } -__forceinline const Vector4 Vector4::operator +( const Vector4 &vec ) const +VECTORMATH_FORCE_INLINE const Vector4 Vector4::operator +( const Vector4 &vec ) const { return Vector4( _mm_add_ps( mVec128, vec.mVec128 ) ); } -__forceinline const Vector4 Vector4::operator -( const Vector4 &vec ) const +VECTORMATH_FORCE_INLINE const Vector4 Vector4::operator -( const Vector4 &vec ) const { return Vector4( _mm_sub_ps( mVec128, vec.mVec128 ) ); } -__forceinline const Vector4 Vector4::operator *( float scalar ) const +VECTORMATH_FORCE_INLINE const Vector4 Vector4::operator *( float scalar ) const { return *this * floatInVec(scalar); } -__forceinline const Vector4 Vector4::operator *( const floatInVec &scalar ) const +VECTORMATH_FORCE_INLINE const Vector4 Vector4::operator *( const floatInVec &scalar ) const { return Vector4( _mm_mul_ps( mVec128, scalar.get128() ) ); } -__forceinline Vector4 & Vector4::operator +=( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::operator +=( const Vector4 &vec ) { *this = *this + vec; return *this; } -__forceinline Vector4 & Vector4::operator -=( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::operator -=( const Vector4 &vec ) { *this = *this - vec; return *this; } -__forceinline Vector4 & Vector4::operator *=( float scalar ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::operator *=( float scalar ) { *this = *this * scalar; return *this; } -__forceinline Vector4 & Vector4::operator *=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::operator *=( const floatInVec &scalar ) { *this = *this * scalar; return *this; } -__forceinline const Vector4 Vector4::operator /( float scalar ) const +VECTORMATH_FORCE_INLINE const Vector4 Vector4::operator /( float scalar ) const { return *this / floatInVec(scalar); } -__forceinline const Vector4 Vector4::operator /( const floatInVec &scalar ) const +VECTORMATH_FORCE_INLINE const Vector4 Vector4::operator /( const floatInVec &scalar ) const { return Vector4( _mm_div_ps( mVec128, scalar.get128() ) ); } -__forceinline Vector4 & Vector4::operator /=( float scalar ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::operator /=( float scalar ) { *this = *this / scalar; return *this; } -__forceinline Vector4 & Vector4::operator /=( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Vector4 & Vector4::operator /=( const floatInVec &scalar ) { *this = *this / scalar; return *this; } -__forceinline const Vector4 Vector4::operator -( ) const +VECTORMATH_FORCE_INLINE const Vector4 Vector4::operator -( ) const { return Vector4(_mm_sub_ps( _mm_setzero_ps(), mVec128 ) ); } -__forceinline const Vector4 operator *( float scalar, const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const Vector4 operator *( float scalar, const Vector4 &vec ) { return floatInVec(scalar) * vec; } -__forceinline const Vector4 operator *( const floatInVec &scalar, const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const Vector4 operator *( const floatInVec &scalar, const Vector4 &vec ) { return vec * scalar; } -__forceinline const Vector4 mulPerElem( const Vector4 &vec0, const Vector4 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector4 mulPerElem( const Vector4 &vec0, const Vector4 &vec1 ) { return Vector4( _mm_mul_ps( vec0.get128(), vec1.get128() ) ); } -__forceinline const Vector4 divPerElem( const Vector4 &vec0, const Vector4 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector4 divPerElem( const Vector4 &vec0, const Vector4 &vec1 ) { return Vector4( _mm_div_ps( vec0.get128(), vec1.get128() ) ); } -__forceinline const Vector4 recipPerElem( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const Vector4 recipPerElem( const Vector4 &vec ) { return Vector4( _mm_rcp_ps( vec.get128() ) ); } -__forceinline const Vector4 absPerElem( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const Vector4 absPerElem( const Vector4 &vec ) { return Vector4( fabsf4( vec.get128() ) ); } -__forceinline const Vector4 copySignPerElem( const Vector4 &vec0, const Vector4 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector4 copySignPerElem( const Vector4 &vec0, const Vector4 &vec1 ) { __m128 vmask = toM128(0x7fffffff); return Vector4( _mm_or_ps( @@ -1023,63 +1023,63 @@ __forceinline const Vector4 copySignPerElem( const Vector4 &vec0, const Vector4 _mm_andnot_ps( vmask, vec1.get128() ) ) ); // Signs } -__forceinline const Vector4 maxPerElem( const Vector4 &vec0, const Vector4 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector4 maxPerElem( const Vector4 &vec0, const Vector4 &vec1 ) { return Vector4( _mm_max_ps( vec0.get128(), vec1.get128() ) ); } -__forceinline const floatInVec maxElem( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec maxElem( const Vector4 &vec ) { return floatInVec( _mm_max_ps( _mm_max_ps( vec_splat( vec.get128(), 0 ), vec_splat( vec.get128(), 1 ) ), _mm_max_ps( vec_splat( vec.get128(), 2 ), vec_splat( vec.get128(), 3 ) ) ) ); } -__forceinline const Vector4 minPerElem( const Vector4 &vec0, const Vector4 &vec1 ) +VECTORMATH_FORCE_INLINE const Vector4 minPerElem( const Vector4 &vec0, const Vector4 &vec1 ) { return Vector4( _mm_min_ps( vec0.get128(), vec1.get128() ) ); } -__forceinline const floatInVec minElem( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec minElem( const Vector4 &vec ) { return floatInVec( _mm_min_ps( _mm_min_ps( vec_splat( vec.get128(), 0 ), vec_splat( vec.get128(), 1 ) ), _mm_min_ps( vec_splat( vec.get128(), 2 ), vec_splat( vec.get128(), 3 ) ) ) ); } -__forceinline const floatInVec sum( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec sum( const Vector4 &vec ) { return floatInVec( _mm_add_ps( _mm_add_ps( vec_splat( vec.get128(), 0 ), vec_splat( vec.get128(), 1 ) ), _mm_add_ps( vec_splat( vec.get128(), 2 ), vec_splat( vec.get128(), 3 ) ) ) ); } -__forceinline const floatInVec dot( const Vector4 &vec0, const Vector4 &vec1 ) +VECTORMATH_FORCE_INLINE const floatInVec dot( const Vector4 &vec0, const Vector4 &vec1 ) { return floatInVec( _vmathVfDot4( vec0.get128(), vec1.get128() ), 0 ); } -__forceinline const floatInVec lengthSqr( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec lengthSqr( const Vector4 &vec ) { return floatInVec( _vmathVfDot4( vec.get128(), vec.get128() ), 0 ); } -__forceinline const floatInVec length( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const floatInVec length( const Vector4 &vec ) { return floatInVec( _mm_sqrt_ps(_vmathVfDot4( vec.get128(), vec.get128() )), 0 ); } -__forceinline const Vector4 normalizeApprox( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const Vector4 normalizeApprox( const Vector4 &vec ) { return Vector4( _mm_mul_ps( vec.get128(), _mm_rsqrt_ps( _vmathVfDot4( vec.get128(), vec.get128() ) ) ) ); } -__forceinline const Vector4 normalize( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE const Vector4 normalize( const Vector4 &vec ) { return Vector4( _mm_mul_ps( vec.get128(), newtonrapson_rsqrt4( _vmathVfDot4( vec.get128(), vec.get128() ) ) ) ); } -__forceinline const Vector4 select( const Vector4 &vec0, const Vector4 &vec1, bool select1 ) +VECTORMATH_FORCE_INLINE const Vector4 select( const Vector4 &vec0, const Vector4 &vec1, bool select1 ) { return select( vec0, vec1, boolInVec(select1) ); } @@ -1087,14 +1087,14 @@ __forceinline const Vector4 select( const Vector4 &vec0, const Vector4 &vec1, bo #ifdef _VECTORMATH_DEBUG -__forceinline void print( const Vector4 &vec ) +VECTORMATH_FORCE_INLINE void print( const Vector4 &vec ) { union { __m128 v; float s[4]; } tmp; tmp.v = vec.get128(); printf( "( %f %f %f %f )\n", tmp.s[0], tmp.s[1], tmp.s[2], tmp.s[3] ); } -__forceinline void print( const Vector4 &vec, const char * name ) +VECTORMATH_FORCE_INLINE void print( const Vector4 &vec, const char * name ) { union { __m128 v; float s[4]; } tmp; tmp.v = vec.get128(); @@ -1103,52 +1103,52 @@ __forceinline void print( const Vector4 &vec, const char * name ) #endif -__forceinline Point3::Point3( float _x, float _y, float _z ) +VECTORMATH_FORCE_INLINE Point3::Point3( float _x, float _y, float _z ) { mVec128 = _mm_setr_ps(_x, _y, _z, 0.0f); } -__forceinline Point3::Point3( const floatInVec &_x, const floatInVec &_y, const floatInVec &_z ) +VECTORMATH_FORCE_INLINE Point3::Point3( const floatInVec &_x, const floatInVec &_y, const floatInVec &_z ) { mVec128 = _mm_unpacklo_ps( _mm_unpacklo_ps( _x.get128(), _z.get128() ), _y.get128() ); } -__forceinline Point3::Point3( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Point3::Point3( const Vector3 &vec ) { mVec128 = vec.get128(); } -__forceinline Point3::Point3( float scalar ) +VECTORMATH_FORCE_INLINE Point3::Point3( float scalar ) { mVec128 = floatInVec(scalar).get128(); } -__forceinline Point3::Point3( const floatInVec &scalar ) +VECTORMATH_FORCE_INLINE Point3::Point3( const floatInVec &scalar ) { mVec128 = scalar.get128(); } -__forceinline Point3::Point3( __m128 vf4 ) +VECTORMATH_FORCE_INLINE Point3::Point3( __m128 vf4 ) { mVec128 = vf4; } -__forceinline const Point3 lerp( float t, const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const Point3 lerp( float t, const Point3 &pnt0, const Point3 &pnt1 ) { return lerp( floatInVec(t), pnt0, pnt1 ); } -__forceinline const Point3 lerp( const floatInVec &t, const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const Point3 lerp( const floatInVec &t, const Point3 &pnt0, const Point3 &pnt1 ) { return ( pnt0 + ( ( pnt1 - pnt0 ) * t ) ); } -__forceinline __m128 Point3::get128( ) const +VECTORMATH_FORCE_INLINE __m128 Point3::get128( ) const { return mVec128; } -__forceinline void storeXYZ( const Point3 &pnt, __m128 * quad ) +VECTORMATH_FORCE_INLINE void storeXYZ( const Point3 &pnt, __m128 * quad ) { __m128 dstVec = *quad; __declspec(align(16)) unsigned int sw[4] = {0, 0, 0, 0xffffffff}; // TODO: Centralize @@ -1156,7 +1156,7 @@ __forceinline void storeXYZ( const Point3 &pnt, __m128 * quad ) *quad = dstVec; } -__forceinline void loadXYZArray( Point3 & pnt0, Point3 & pnt1, Point3 & pnt2, Point3 & pnt3, const __m128 * threeQuads ) +VECTORMATH_FORCE_INLINE void loadXYZArray( Point3 & pnt0, Point3 & pnt1, Point3 & pnt2, Point3 & pnt3, const __m128 * threeQuads ) { const float *quads = (float *)threeQuads; pnt0 = Point3( _mm_load_ps(quads) ); @@ -1165,7 +1165,7 @@ __forceinline void loadXYZArray( Point3 & pnt0, Point3 & pnt1, Point3 & pnt2, Po pnt3 = Point3( _mm_loadu_ps(quads + 9) ); } -__forceinline void storeXYZArray( const Point3 &pnt0, const Point3 &pnt1, const Point3 &pnt2, const Point3 &pnt3, __m128 * threeQuads ) +VECTORMATH_FORCE_INLINE void storeXYZArray( const Point3 &pnt0, const Point3 &pnt1, const Point3 &pnt2, const Point3 &pnt3, __m128 * threeQuads ) { __m128 xxxx = _mm_shuffle_ps( pnt1.get128(), pnt1.get128(), _MM_SHUFFLE(0, 0, 0, 0) ); __m128 zzzz = _mm_shuffle_ps( pnt2.get128(), pnt2.get128(), _MM_SHUFFLE(2, 2, 2, 2) ); @@ -1176,7 +1176,7 @@ __forceinline void storeXYZArray( const Point3 &pnt0, const Point3 &pnt1, const threeQuads[2] = vec_sel( _mm_shuffle_ps( pnt3.get128(), pnt3.get128(), _MM_SHUFFLE(2, 1, 0, 3) ), zzzz, zsw ); } /* -__forceinline void storeHalfFloats( const Point3 &pnt0, const Point3 &pnt1, const Point3 &pnt2, const Point3 &pnt3, const Point3 &pnt4, const Point3 &pnt5, const Point3 &pnt6, const Point3 &pnt7, vec_ushort8 * threeQuads ) +VECTORMATH_FORCE_INLINE void storeHalfFloats( const Point3 &pnt0, const Point3 &pnt1, const Point3 &pnt2, const Point3 &pnt3, const Point3 &pnt4, const Point3 &pnt5, const Point3 &pnt6, const Point3 &pnt7, vec_ushort8 * threeQuads ) { #if 0 __m128 xyz0[3]; @@ -1191,138 +1191,138 @@ __forceinline void storeHalfFloats( const Point3 &pnt0, const Point3 &pnt1, cons #endif } */ -__forceinline Point3 & Point3::operator =( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE Point3 & Point3::operator =( const Point3 &pnt ) { mVec128 = pnt.mVec128; return *this; } -__forceinline Point3 & Point3::setX( float _x ) +VECTORMATH_FORCE_INLINE Point3 & Point3::setX( float _x ) { _vmathVfSetElement(mVec128, _x, 0); return *this; } -__forceinline Point3 & Point3::setX( const floatInVec &_x ) +VECTORMATH_FORCE_INLINE Point3 & Point3::setX( const floatInVec &_x ) { mVec128 = _vmathVfInsert(mVec128, _x.get128(), 0); return *this; } -__forceinline const floatInVec Point3::getX( ) const +VECTORMATH_FORCE_INLINE const floatInVec Point3::getX( ) const { return floatInVec( mVec128, 0 ); } -__forceinline Point3 & Point3::setY( float _y ) +VECTORMATH_FORCE_INLINE Point3 & Point3::setY( float _y ) { _vmathVfSetElement(mVec128, _y, 1); return *this; } -__forceinline Point3 & Point3::setY( const floatInVec &_y ) +VECTORMATH_FORCE_INLINE Point3 & Point3::setY( const floatInVec &_y ) { mVec128 = _vmathVfInsert(mVec128, _y.get128(), 1); return *this; } -__forceinline const floatInVec Point3::getY( ) const +VECTORMATH_FORCE_INLINE const floatInVec Point3::getY( ) const { return floatInVec( mVec128, 1 ); } -__forceinline Point3 & Point3::setZ( float _z ) +VECTORMATH_FORCE_INLINE Point3 & Point3::setZ( float _z ) { _vmathVfSetElement(mVec128, _z, 2); return *this; } -__forceinline Point3 & Point3::setZ( const floatInVec &_z ) +VECTORMATH_FORCE_INLINE Point3 & Point3::setZ( const floatInVec &_z ) { mVec128 = _vmathVfInsert(mVec128, _z.get128(), 2); return *this; } -__forceinline const floatInVec Point3::getZ( ) const +VECTORMATH_FORCE_INLINE const floatInVec Point3::getZ( ) const { return floatInVec( mVec128, 2 ); } -__forceinline Point3 & Point3::setElem( int idx, float value ) +VECTORMATH_FORCE_INLINE Point3 & Point3::setElem( int idx, float value ) { _vmathVfSetElement(mVec128, value, idx); return *this; } -__forceinline Point3 & Point3::setElem( int idx, const floatInVec &value ) +VECTORMATH_FORCE_INLINE Point3 & Point3::setElem( int idx, const floatInVec &value ) { mVec128 = _vmathVfInsert(mVec128, value.get128(), idx); return *this; } -__forceinline const floatInVec Point3::getElem( int idx ) const +VECTORMATH_FORCE_INLINE const floatInVec Point3::getElem( int idx ) const { return floatInVec( mVec128, idx ); } -__forceinline VecIdx Point3::operator []( int idx ) +VECTORMATH_FORCE_INLINE VecIdx Point3::operator []( int idx ) { return VecIdx( mVec128, idx ); } -__forceinline const floatInVec Point3::operator []( int idx ) const +VECTORMATH_FORCE_INLINE const floatInVec Point3::operator []( int idx ) const { return floatInVec( mVec128, idx ); } -__forceinline const Vector3 Point3::operator -( const Point3 &pnt ) const +VECTORMATH_FORCE_INLINE const Vector3 Point3::operator -( const Point3 &pnt ) const { return Vector3( _mm_sub_ps( mVec128, pnt.mVec128 ) ); } -__forceinline const Point3 Point3::operator +( const Vector3 &vec ) const +VECTORMATH_FORCE_INLINE const Point3 Point3::operator +( const Vector3 &vec ) const { return Point3( _mm_add_ps( mVec128, vec.get128() ) ); } -__forceinline const Point3 Point3::operator -( const Vector3 &vec ) const +VECTORMATH_FORCE_INLINE const Point3 Point3::operator -( const Vector3 &vec ) const { return Point3( _mm_sub_ps( mVec128, vec.get128() ) ); } -__forceinline Point3 & Point3::operator +=( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Point3 & Point3::operator +=( const Vector3 &vec ) { *this = *this + vec; return *this; } -__forceinline Point3 & Point3::operator -=( const Vector3 &vec ) +VECTORMATH_FORCE_INLINE Point3 & Point3::operator -=( const Vector3 &vec ) { *this = *this - vec; return *this; } -__forceinline const Point3 mulPerElem( const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const Point3 mulPerElem( const Point3 &pnt0, const Point3 &pnt1 ) { return Point3( _mm_mul_ps( pnt0.get128(), pnt1.get128() ) ); } -__forceinline const Point3 divPerElem( const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const Point3 divPerElem( const Point3 &pnt0, const Point3 &pnt1 ) { return Point3( _mm_div_ps( pnt0.get128(), pnt1.get128() ) ); } -__forceinline const Point3 recipPerElem( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE const Point3 recipPerElem( const Point3 &pnt ) { return Point3( _mm_rcp_ps( pnt.get128() ) ); } -__forceinline const Point3 absPerElem( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE const Point3 absPerElem( const Point3 &pnt ) { return Point3( fabsf4( pnt.get128() ) ); } -__forceinline const Point3 copySignPerElem( const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const Point3 copySignPerElem( const Point3 &pnt0, const Point3 &pnt1 ) { __m128 vmask = toM128(0x7fffffff); return Point3( _mm_or_ps( @@ -1330,77 +1330,77 @@ __forceinline const Point3 copySignPerElem( const Point3 &pnt0, const Point3 &pn _mm_andnot_ps( vmask, pnt1.get128() ) ) ); // Signs } -__forceinline const Point3 maxPerElem( const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const Point3 maxPerElem( const Point3 &pnt0, const Point3 &pnt1 ) { return Point3( _mm_max_ps( pnt0.get128(), pnt1.get128() ) ); } -__forceinline const floatInVec maxElem( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE const floatInVec maxElem( const Point3 &pnt ) { return floatInVec( _mm_max_ps( _mm_max_ps( vec_splat( pnt.get128(), 0 ), vec_splat( pnt.get128(), 1 ) ), vec_splat( pnt.get128(), 2 ) ) ); } -__forceinline const Point3 minPerElem( const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const Point3 minPerElem( const Point3 &pnt0, const Point3 &pnt1 ) { return Point3( _mm_min_ps( pnt0.get128(), pnt1.get128() ) ); } -__forceinline const floatInVec minElem( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE const floatInVec minElem( const Point3 &pnt ) { return floatInVec( _mm_min_ps( _mm_min_ps( vec_splat( pnt.get128(), 0 ), vec_splat( pnt.get128(), 1 ) ), vec_splat( pnt.get128(), 2 ) ) ); } -__forceinline const floatInVec sum( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE const floatInVec sum( const Point3 &pnt ) { return floatInVec( _mm_add_ps( _mm_add_ps( vec_splat( pnt.get128(), 0 ), vec_splat( pnt.get128(), 1 ) ), vec_splat( pnt.get128(), 2 ) ) ); } -__forceinline const Point3 scale( const Point3 &pnt, float scaleVal ) +VECTORMATH_FORCE_INLINE const Point3 scale( const Point3 &pnt, float scaleVal ) { return scale( pnt, floatInVec( scaleVal ) ); } -__forceinline const Point3 scale( const Point3 &pnt, const floatInVec &scaleVal ) +VECTORMATH_FORCE_INLINE const Point3 scale( const Point3 &pnt, const floatInVec &scaleVal ) { return mulPerElem( pnt, Point3( scaleVal ) ); } -__forceinline const Point3 scale( const Point3 &pnt, const Vector3 &scaleVec ) +VECTORMATH_FORCE_INLINE const Point3 scale( const Point3 &pnt, const Vector3 &scaleVec ) { return mulPerElem( pnt, Point3( scaleVec ) ); } -__forceinline const floatInVec projection( const Point3 &pnt, const Vector3 &unitVec ) +VECTORMATH_FORCE_INLINE const floatInVec projection( const Point3 &pnt, const Vector3 &unitVec ) { return floatInVec( _vmathVfDot3( pnt.get128(), unitVec.get128() ), 0 ); } -__forceinline const floatInVec distSqrFromOrigin( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE const floatInVec distSqrFromOrigin( const Point3 &pnt ) { return lengthSqr( Vector3( pnt ) ); } -__forceinline const floatInVec distFromOrigin( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE const floatInVec distFromOrigin( const Point3 &pnt ) { return length( Vector3( pnt ) ); } -__forceinline const floatInVec distSqr( const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const floatInVec distSqr( const Point3 &pnt0, const Point3 &pnt1 ) { return lengthSqr( ( pnt1 - pnt0 ) ); } -__forceinline const floatInVec dist( const Point3 &pnt0, const Point3 &pnt1 ) +VECTORMATH_FORCE_INLINE const floatInVec dist( const Point3 &pnt0, const Point3 &pnt1 ) { return length( ( pnt1 - pnt0 ) ); } -__forceinline const Point3 select( const Point3 &pnt0, const Point3 &pnt1, bool select1 ) +VECTORMATH_FORCE_INLINE const Point3 select( const Point3 &pnt0, const Point3 &pnt1, bool select1 ) { return select( pnt0, pnt1, boolInVec(select1) ); } -__forceinline const Point3 select( const Point3 &pnt0, const Point3 &pnt1, const boolInVec &select1 ) +VECTORMATH_FORCE_INLINE const Point3 select( const Point3 &pnt0, const Point3 &pnt1, const boolInVec &select1 ) { return Point3( vec_sel( pnt0.get128(), pnt1.get128(), select1.get128() ) ); } @@ -1409,14 +1409,14 @@ __forceinline const Point3 select( const Point3 &pnt0, const Point3 &pnt1, const #ifdef _VECTORMATH_DEBUG -__forceinline void print( const Point3 &pnt ) +VECTORMATH_FORCE_INLINE void print( const Point3 &pnt ) { union { __m128 v; float s[4]; } tmp; tmp.v = pnt.get128(); printf( "( %f %f %f )\n", tmp.s[0], tmp.s[1], tmp.s[2] ); } -__forceinline void print( const Point3 &pnt, const char * name ) +VECTORMATH_FORCE_INLINE void print( const Point3 &pnt, const char * name ) { union { __m128 v; float s[4]; } tmp; tmp.v = pnt.get128(); diff --git a/src/vectormath/sse/vecidx_aos.h b/src/vectormath/sse/vecidx_aos.h index c5c6eb908..32e837a52 100644 --- a/src/vectormath/sse/vecidx_aos.h +++ b/src/vectormath/sse/vecidx_aos.h @@ -42,7 +42,7 @@ namespace Aos { // subscripting operator. // -__declspec(align(16)) class VecIdx +VM_ATTRIBUTE_ALIGNED_CLASS16 (class) VecIdx { private: __m128 &ref; diff --git a/src/vectormath/sse/vectormath_aos.h b/src/vectormath/sse/vectormath_aos.h index 0430ef7af..6fa7fc10d 100644 --- a/src/vectormath/sse/vectormath_aos.h +++ b/src/vectormath/sse/vectormath_aos.h @@ -39,11 +39,21 @@ #define Vector3Ref Vector3& #define QuatRef Quat& #define Matrix3Ref Matrix3& -#define VM_ATTRIBUTE_ALIGNED16(a) __declspec(align(16)) a + +#if (defined (_WIN32) && (_MSC_VER) && _MSC_VER >= 1400) + #define VM_ATTRIBUTE_ALIGNED_CLASS16(a) __declspec(align(16)) a + #define VM_ATTRIBUTE_ALIGN16 __declspec(align(16)) + #define VECTORMATH_FORCE_INLINE __forceinline +#else + #define VM_ATTRIBUTE_ALIGNED_CLASS16(a) a __attribute__ ((aligned (16))) + #define VM_ATTRIBUTE_ALIGN16 __attribute__ ((aligned (16))) + #define VECTORMATH_FORCE_INLINE inline +#endif//_WIN32 + #define USE_SSE2_LDDQU #ifdef USE_SSE2_LDDQU -#include //used for _mm_lddqu_si128 +#include //_mm_lddqu_si128 #endif //USE_SSE2_LDDQU // TODO: Tidy @@ -80,25 +90,25 @@ union SSEFloat SSEFloat() {}//uninitialized }; -static __forceinline __m128 vec_sel(__m128 a, __m128 b, __m128 mask) +static VECTORMATH_FORCE_INLINE __m128 vec_sel(__m128 a, __m128 b, __m128 mask) { return _mm_or_ps(_mm_and_ps(mask, b), _mm_andnot_ps(mask, a)); } -static __forceinline __m128 vec_sel(__m128 a, __m128 b, const unsigned int *_mask) +static VECTORMATH_FORCE_INLINE __m128 vec_sel(__m128 a, __m128 b, const unsigned int *_mask) { return vec_sel(a, b, _mm_load_ps((float *)_mask)); } -static __forceinline __m128 vec_sel(__m128 a, __m128 b, unsigned int _mask) +static VECTORMATH_FORCE_INLINE __m128 vec_sel(__m128 a, __m128 b, unsigned int _mask) { return vec_sel(a, b, _mm_set1_ps(*(float *)&_mask)); } -static __forceinline __m128 toM128(unsigned int x) +static VECTORMATH_FORCE_INLINE __m128 toM128(unsigned int x) { return _mm_set1_ps( *(float *)&x ); } -static __forceinline __m128 fabsf4(__m128 x) +static VECTORMATH_FORCE_INLINE __m128 fabsf4(__m128 x) { return _mm_and_ps( x, toM128( 0x7fffffff ) ); } @@ -113,7 +123,7 @@ union SSE64 } m64; }; -static __forceinline __m128 vec_cts(__m128 x, int a) +static VECTORMATH_FORCE_INLINE __m128 vec_cts(__m128 x, int a) { assert(a == 0); // Only 2^0 supported (void)a; @@ -124,7 +134,7 @@ static __forceinline __m128 vec_cts(__m128 x, int a) return sse64.m128; } -static __forceinline __m128 vec_ctf(__m128 x, int a) +static VECTORMATH_FORCE_INLINE __m128 vec_ctf(__m128 x, int a) { assert(a == 0); // Only 2^0 supported (void)a; @@ -137,7 +147,7 @@ static __forceinline __m128 vec_ctf(__m128 x, int a) return result; } */ -static __forceinline __m128 vec_cts(__m128 x, int a) +static VECTORMATH_FORCE_INLINE __m128 vec_cts(__m128 x, int a) { assert(a == 0); // Only 2^0 supported (void)a; @@ -145,7 +155,7 @@ static __forceinline __m128 vec_cts(__m128 x, int a) return (__m128 &)result; } -static __forceinline __m128 vec_ctf(__m128 x, int a) +static VECTORMATH_FORCE_INLINE __m128 vec_ctf(__m128 x, int a) { assert(a == 0); // Only 2^0 supported (void)a; @@ -171,7 +181,7 @@ static __forceinline __m128 vec_ctf(__m128 x, int a) #define recipf4(x) _mm_rcp_ps( x ) #define negatef4(x) _mm_sub_ps( _mm_setzero_ps(), x ) -static __forceinline __m128 newtonrapson_rsqrt4( const __m128 v ) +static VECTORMATH_FORCE_INLINE __m128 newtonrapson_rsqrt4( const __m128 v ) { #define _half4 _mm_setr_ps(.5f,.5f,.5f,.5f) #define _three _mm_setr_ps(3.f,3.f,3.f,3.f) @@ -180,7 +190,7 @@ const __m128 muls = _mm_mul_ps(_mm_mul_ps(v, approx), approx); return _mm_mul_ps(_mm_mul_ps(_half4, approx), _mm_sub_ps(_three, muls) ); } -static __forceinline __m128 acosf4(__m128 x) +static VECTORMATH_FORCE_INLINE __m128 acosf4(__m128 x) { __m128 xabs = fabsf4(x); __m128 select = _mm_cmplt_ps( x, _mm_setzero_ps() ); @@ -211,7 +221,7 @@ static __forceinline __m128 acosf4(__m128 x) select); } -static __forceinline __m128 sinf4(vec_float4 x) +static VECTORMATH_FORCE_INLINE __m128 sinf4(vec_float4 x) { // @@ -282,7 +292,7 @@ static __forceinline __m128 sinf4(vec_float4 x) vec_cmpeq(vec_and(offset,toM128(0x2)),_mm_setzero_ps())); } -static __forceinline void sincosf4(vec_float4 x, vec_float4* s, vec_float4* c) +static VECTORMATH_FORCE_INLINE void sincosf4(vec_float4 x, vec_float4* s, vec_float4* c) { vec_float4 xl,xl2,xl3; vec_int4 offsetSin, offsetCos; @@ -374,296 +384,296 @@ class Vector3 { __m128 mVec128; - __forceinline void set128(vec_float4 vec); + VECTORMATH_FORCE_INLINE void set128(vec_float4 vec); - __forceinline vec_float4& get128Ref(); + VECTORMATH_FORCE_INLINE vec_float4& get128Ref(); public: // Default constructor; does no initialization // - __forceinline Vector3( ) { }; + VECTORMATH_FORCE_INLINE Vector3( ) { }; // Default copy constructor // - __forceinline Vector3(const Vector3& vec); + VECTORMATH_FORCE_INLINE Vector3(const Vector3& vec); // Construct a 3-D vector from x, y, and z elements // - __forceinline Vector3( float x, float y, float z ); + VECTORMATH_FORCE_INLINE Vector3( float x, float y, float z ); // Construct a 3-D vector from x, y, and z elements (scalar data contained in vector data type) // - __forceinline Vector3( const floatInVec &x, const floatInVec &y, const floatInVec &z ); + VECTORMATH_FORCE_INLINE Vector3( const floatInVec &x, const floatInVec &y, const floatInVec &z ); // Copy elements from a 3-D point into a 3-D vector // - explicit __forceinline Vector3( const Point3 &pnt ); + explicit VECTORMATH_FORCE_INLINE Vector3( const Point3 &pnt ); // Set all elements of a 3-D vector to the same scalar value // - explicit __forceinline Vector3( float scalar ); + explicit VECTORMATH_FORCE_INLINE Vector3( float scalar ); // Set all elements of a 3-D vector to the same scalar value (scalar data contained in vector data type) // - explicit __forceinline Vector3( const floatInVec &scalar ); + explicit VECTORMATH_FORCE_INLINE Vector3( const floatInVec &scalar ); // Set vector float data in a 3-D vector // - explicit __forceinline Vector3( __m128 vf4 ); + explicit VECTORMATH_FORCE_INLINE Vector3( __m128 vf4 ); // Get vector float data from a 3-D vector // - __forceinline __m128 get128( ) const; + VECTORMATH_FORCE_INLINE __m128 get128( ) const; // Assign one 3-D vector to another // - __forceinline Vector3 & operator =( const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Vector3 & operator =( const Vector3 &vec ); // Set the x element of a 3-D vector // - __forceinline Vector3 & setX( float x ); + VECTORMATH_FORCE_INLINE Vector3 & setX( float x ); // Set the y element of a 3-D vector // - __forceinline Vector3 & setY( float y ); + VECTORMATH_FORCE_INLINE Vector3 & setY( float y ); // Set the z element of a 3-D vector // - __forceinline Vector3 & setZ( float z ); + VECTORMATH_FORCE_INLINE Vector3 & setZ( float z ); // Set the x element of a 3-D vector (scalar data contained in vector data type) // - __forceinline Vector3 & setX( const floatInVec &x ); + VECTORMATH_FORCE_INLINE Vector3 & setX( const floatInVec &x ); // Set the y element of a 3-D vector (scalar data contained in vector data type) // - __forceinline Vector3 & setY( const floatInVec &y ); + VECTORMATH_FORCE_INLINE Vector3 & setY( const floatInVec &y ); // Set the z element of a 3-D vector (scalar data contained in vector data type) // - __forceinline Vector3 & setZ( const floatInVec &z ); + VECTORMATH_FORCE_INLINE Vector3 & setZ( const floatInVec &z ); // Get the x element of a 3-D vector // - __forceinline const floatInVec getX( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getX( ) const; // Get the y element of a 3-D vector // - __forceinline const floatInVec getY( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getY( ) const; // Get the z element of a 3-D vector // - __forceinline const floatInVec getZ( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getZ( ) const; // Set an x, y, or z element of a 3-D vector by index // - __forceinline Vector3 & setElem( int idx, float value ); + VECTORMATH_FORCE_INLINE Vector3 & setElem( int idx, float value ); // Set an x, y, or z element of a 3-D vector by index (scalar data contained in vector data type) // - __forceinline Vector3 & setElem( int idx, const floatInVec &value ); + VECTORMATH_FORCE_INLINE Vector3 & setElem( int idx, const floatInVec &value ); // Get an x, y, or z element of a 3-D vector by index // - __forceinline const floatInVec getElem( int idx ) const; + VECTORMATH_FORCE_INLINE const floatInVec getElem( int idx ) const; // Subscripting operator to set or get an element // - __forceinline VecIdx operator []( int idx ); + VECTORMATH_FORCE_INLINE VecIdx operator []( int idx ); // Subscripting operator to get an element // - __forceinline const floatInVec operator []( int idx ) const; + VECTORMATH_FORCE_INLINE const floatInVec operator []( int idx ) const; // Add two 3-D vectors // - __forceinline const Vector3 operator +( const Vector3 &vec ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator +( const Vector3 &vec ) const; // Subtract a 3-D vector from another 3-D vector // - __forceinline const Vector3 operator -( const Vector3 &vec ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator -( const Vector3 &vec ) const; // Add a 3-D vector to a 3-D point // - __forceinline const Point3 operator +( const Point3 &pnt ) const; + VECTORMATH_FORCE_INLINE const Point3 operator +( const Point3 &pnt ) const; // Multiply a 3-D vector by a scalar // - __forceinline const Vector3 operator *( float scalar ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator *( float scalar ) const; // Divide a 3-D vector by a scalar // - __forceinline const Vector3 operator /( float scalar ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator /( float scalar ) const; // Multiply a 3-D vector by a scalar (scalar data contained in vector data type) // - __forceinline const Vector3 operator *( const floatInVec &scalar ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator *( const floatInVec &scalar ) const; // Divide a 3-D vector by a scalar (scalar data contained in vector data type) // - __forceinline const Vector3 operator /( const floatInVec &scalar ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator /( const floatInVec &scalar ) const; // Perform compound assignment and addition with a 3-D vector // - __forceinline Vector3 & operator +=( const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Vector3 & operator +=( const Vector3 &vec ); // Perform compound assignment and subtraction by a 3-D vector // - __forceinline Vector3 & operator -=( const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Vector3 & operator -=( const Vector3 &vec ); // Perform compound assignment and multiplication by a scalar // - __forceinline Vector3 & operator *=( float scalar ); + VECTORMATH_FORCE_INLINE Vector3 & operator *=( float scalar ); // Perform compound assignment and division by a scalar // - __forceinline Vector3 & operator /=( float scalar ); + VECTORMATH_FORCE_INLINE Vector3 & operator /=( float scalar ); // Perform compound assignment and multiplication by a scalar (scalar data contained in vector data type) // - __forceinline Vector3 & operator *=( const floatInVec &scalar ); + VECTORMATH_FORCE_INLINE Vector3 & operator *=( const floatInVec &scalar ); // Perform compound assignment and division by a scalar (scalar data contained in vector data type) // - __forceinline Vector3 & operator /=( const floatInVec &scalar ); + VECTORMATH_FORCE_INLINE Vector3 & operator /=( const floatInVec &scalar ); // Negate all elements of a 3-D vector // - __forceinline const Vector3 operator -( ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator -( ) const; // Construct x axis // - static __forceinline const Vector3 xAxis( ); + static VECTORMATH_FORCE_INLINE const Vector3 xAxis( ); // Construct y axis // - static __forceinline const Vector3 yAxis( ); + static VECTORMATH_FORCE_INLINE const Vector3 yAxis( ); // Construct z axis // - static __forceinline const Vector3 zAxis( ); + static VECTORMATH_FORCE_INLINE const Vector3 zAxis( ); }; // Multiply a 3-D vector by a scalar // -__forceinline const Vector3 operator *( float scalar, const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const Vector3 operator *( float scalar, const Vector3 &vec ); // Multiply a 3-D vector by a scalar (scalar data contained in vector data type) // -__forceinline const Vector3 operator *( const floatInVec &scalar, const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const Vector3 operator *( const floatInVec &scalar, const Vector3 &vec ); // Multiply two 3-D vectors per element // -__forceinline const Vector3 mulPerElem( const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector3 mulPerElem( const Vector3 &vec0, const Vector3 &vec1 ); // Divide two 3-D vectors per element // NOTE: // Floating-point behavior matches standard library function divf4. // -__forceinline const Vector3 divPerElem( const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector3 divPerElem( const Vector3 &vec0, const Vector3 &vec1 ); // Compute the reciprocal of a 3-D vector per element // NOTE: // Floating-point behavior matches standard library function recipf4. // -__forceinline const Vector3 recipPerElem( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const Vector3 recipPerElem( const Vector3 &vec ); // Compute the absolute value of a 3-D vector per element // -__forceinline const Vector3 absPerElem( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const Vector3 absPerElem( const Vector3 &vec ); // Copy sign from one 3-D vector to another, per element // -__forceinline const Vector3 copySignPerElem( const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector3 copySignPerElem( const Vector3 &vec0, const Vector3 &vec1 ); // Maximum of two 3-D vectors per element // -__forceinline const Vector3 maxPerElem( const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector3 maxPerElem( const Vector3 &vec0, const Vector3 &vec1 ); // Minimum of two 3-D vectors per element // -__forceinline const Vector3 minPerElem( const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector3 minPerElem( const Vector3 &vec0, const Vector3 &vec1 ); // Maximum element of a 3-D vector // -__forceinline const floatInVec maxElem( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec maxElem( const Vector3 &vec ); // Minimum element of a 3-D vector // -__forceinline const floatInVec minElem( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec minElem( const Vector3 &vec ); // Compute the sum of all elements of a 3-D vector // -__forceinline const floatInVec sum( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec sum( const Vector3 &vec ); // Compute the dot product of two 3-D vectors // -__forceinline const floatInVec dot( const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const floatInVec dot( const Vector3 &vec0, const Vector3 &vec1 ); // Compute the square of the length of a 3-D vector // -__forceinline const floatInVec lengthSqr( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec lengthSqr( const Vector3 &vec ); // Compute the length of a 3-D vector // -__forceinline const floatInVec length( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec length( const Vector3 &vec ); // Normalize a 3-D vector // NOTE: // The result is unpredictable when all elements of vec are at or near zero. // -__forceinline const Vector3 normalize( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const Vector3 normalize( const Vector3 &vec ); // Compute cross product of two 3-D vectors // -__forceinline const Vector3 cross( const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector3 cross( const Vector3 &vec0, const Vector3 &vec1 ); // Outer product of two 3-D vectors // -__forceinline const Matrix3 outer( const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Matrix3 outer( const Vector3 &vec0, const Vector3 &vec1 ); // Pre-multiply a row vector by a 3x3 matrix // NOTE: // Slower than column post-multiply. // -__forceinline const Vector3 rowMul( const Vector3 &vec, const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const Vector3 rowMul( const Vector3 &vec, const Matrix3 & mat ); // Cross-product matrix of a 3-D vector // -__forceinline const Matrix3 crossMatrix( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const Matrix3 crossMatrix( const Vector3 &vec ); // Create cross-product matrix and multiply // NOTE: // Faster than separately creating a cross-product matrix and multiplying. // -__forceinline const Matrix3 crossMatrixMul( const Vector3 &vec, const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const Matrix3 crossMatrixMul( const Vector3 &vec, const Matrix3 & mat ); // Linear interpolation between two 3-D vectors // NOTE: // Does not clamp t between 0 and 1. // -__forceinline const Vector3 lerp( float t, const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector3 lerp( float t, const Vector3 &vec0, const Vector3 &vec1 ); // Linear interpolation between two 3-D vectors (scalar data contained in vector data type) // NOTE: // Does not clamp t between 0 and 1. // -__forceinline const Vector3 lerp( const floatInVec &t, const Vector3 &vec0, const Vector3 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector3 lerp( const floatInVec &t, const Vector3 &vec0, const Vector3 &vec1 ); // Spherical linear interpolation between two 3-D vectors // NOTE: // The result is unpredictable if the vectors point in opposite directions. // Does not clamp t between 0 and 1. // -__forceinline const Vector3 slerp( float t, const Vector3 &unitVec0, const Vector3 &unitVec1 ); +VECTORMATH_FORCE_INLINE const Vector3 slerp( float t, const Vector3 &unitVec0, const Vector3 &unitVec1 ); // Spherical linear interpolation between two 3-D vectors (scalar data contained in vector data type) // NOTE: // The result is unpredictable if the vectors point in opposite directions. // Does not clamp t between 0 and 1. // -__forceinline const Vector3 slerp( const floatInVec &t, const Vector3 &unitVec0, const Vector3 &unitVec1 ); +VECTORMATH_FORCE_INLINE const Vector3 slerp( const floatInVec &t, const Vector3 &unitVec0, const Vector3 &unitVec1 ); // Conditionally select between two 3-D vectors // NOTE: @@ -671,29 +681,29 @@ __forceinline const Vector3 slerp( const floatInVec &t, const Vector3 &unitVec0, // However, the transfer of select1 to a VMX register may use more processing time than a branch. // Use the boolInVec version for better performance. // -__forceinline const Vector3 select( const Vector3 &vec0, const Vector3 &vec1, bool select1 ); +VECTORMATH_FORCE_INLINE const Vector3 select( const Vector3 &vec0, const Vector3 &vec1, bool select1 ); // Conditionally select between two 3-D vectors (scalar data contained in vector data type) // NOTE: // This function uses a conditional select instruction to avoid a branch. // -__forceinline const Vector3 select( const Vector3 &vec0, const Vector3 &vec1, const boolInVec &select1 ); +VECTORMATH_FORCE_INLINE const Vector3 select( const Vector3 &vec0, const Vector3 &vec1, const boolInVec &select1 ); // Store x, y, and z elements of 3-D vector in first three words of a quadword, preserving fourth word // -__forceinline void storeXYZ( const Vector3 &vec, __m128 * quad ); +VECTORMATH_FORCE_INLINE void storeXYZ( const Vector3 &vec, __m128 * quad ); // Load four three-float 3-D vectors, stored in three quadwords // -__forceinline void loadXYZArray( Vector3 & vec0, Vector3 & vec1, Vector3 & vec2, Vector3 & vec3, const __m128 * threeQuads ); +VECTORMATH_FORCE_INLINE void loadXYZArray( Vector3 & vec0, Vector3 & vec1, Vector3 & vec2, Vector3 & vec3, const __m128 * threeQuads ); // Store four 3-D vectors in three quadwords // -__forceinline void storeXYZArray( const Vector3 &vec0, const Vector3 &vec1, const Vector3 &vec2, const Vector3 &vec3, __m128 * threeQuads ); +VECTORMATH_FORCE_INLINE void storeXYZArray( const Vector3 &vec0, const Vector3 &vec1, const Vector3 &vec2, const Vector3 &vec3, __m128 * threeQuads ); // Store eight 3-D vectors as half-floats // -__forceinline void storeHalfFloats( const Vector3 &vec0, const Vector3 &vec1, const Vector3 &vec2, const Vector3 &vec3, const Vector3 &vec4, const Vector3 &vec5, const Vector3 &vec6, const Vector3 &vec7, vec_ushort8 * threeQuads ); +VECTORMATH_FORCE_INLINE void storeHalfFloats( const Vector3 &vec0, const Vector3 &vec1, const Vector3 &vec2, const Vector3 &vec3, const Vector3 &vec4, const Vector3 &vec5, const Vector3 &vec6, const Vector3 &vec7, vec_ushort8 * threeQuads ); #ifdef _VECTORMATH_DEBUG @@ -701,13 +711,13 @@ __forceinline void storeHalfFloats( const Vector3 &vec0, const Vector3 &vec1, co // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Vector3 &vec ); +VECTORMATH_FORCE_INLINE void print( const Vector3 &vec ); // Print a 3-D vector and an associated string identifier // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Vector3 &vec, const char * name ); +VECTORMATH_FORCE_INLINE void print( const Vector3 &vec, const char * name ); #endif @@ -720,303 +730,303 @@ class Vector4 public: // Default constructor; does no initialization // - __forceinline Vector4( ) { }; + VECTORMATH_FORCE_INLINE Vector4( ) { }; // Construct a 4-D vector from x, y, z, and w elements // - __forceinline Vector4( float x, float y, float z, float w ); + VECTORMATH_FORCE_INLINE Vector4( float x, float y, float z, float w ); // Construct a 4-D vector from x, y, z, and w elements (scalar data contained in vector data type) // - __forceinline Vector4( const floatInVec &x, const floatInVec &y, const floatInVec &z, const floatInVec &w ); + VECTORMATH_FORCE_INLINE Vector4( const floatInVec &x, const floatInVec &y, const floatInVec &z, const floatInVec &w ); // Construct a 4-D vector from a 3-D vector and a scalar // - __forceinline Vector4( const Vector3 &xyz, float w ); + VECTORMATH_FORCE_INLINE Vector4( const Vector3 &xyz, float w ); // Construct a 4-D vector from a 3-D vector and a scalar (scalar data contained in vector data type) // - __forceinline Vector4( const Vector3 &xyz, const floatInVec &w ); + VECTORMATH_FORCE_INLINE Vector4( const Vector3 &xyz, const floatInVec &w ); // Copy x, y, and z from a 3-D vector into a 4-D vector, and set w to 0 // - explicit __forceinline Vector4( const Vector3 &vec ); + explicit VECTORMATH_FORCE_INLINE Vector4( const Vector3 &vec ); // Copy x, y, and z from a 3-D point into a 4-D vector, and set w to 1 // - explicit __forceinline Vector4( const Point3 &pnt ); + explicit VECTORMATH_FORCE_INLINE Vector4( const Point3 &pnt ); // Copy elements from a quaternion into a 4-D vector // - explicit __forceinline Vector4( const Quat &quat ); + explicit VECTORMATH_FORCE_INLINE Vector4( const Quat &quat ); // Set all elements of a 4-D vector to the same scalar value // - explicit __forceinline Vector4( float scalar ); + explicit VECTORMATH_FORCE_INLINE Vector4( float scalar ); // Set all elements of a 4-D vector to the same scalar value (scalar data contained in vector data type) // - explicit __forceinline Vector4( const floatInVec &scalar ); + explicit VECTORMATH_FORCE_INLINE Vector4( const floatInVec &scalar ); // Set vector float data in a 4-D vector // - explicit __forceinline Vector4( __m128 vf4 ); + explicit VECTORMATH_FORCE_INLINE Vector4( __m128 vf4 ); // Get vector float data from a 4-D vector // - __forceinline __m128 get128( ) const; + VECTORMATH_FORCE_INLINE __m128 get128( ) const; // Assign one 4-D vector to another // - __forceinline Vector4 & operator =( const Vector4 &vec ); + VECTORMATH_FORCE_INLINE Vector4 & operator =( const Vector4 &vec ); // Set the x, y, and z elements of a 4-D vector // NOTE: // This function does not change the w element. // - __forceinline Vector4 & setXYZ( const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Vector4 & setXYZ( const Vector3 &vec ); // Get the x, y, and z elements of a 4-D vector // - __forceinline const Vector3 getXYZ( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getXYZ( ) const; // Set the x element of a 4-D vector // - __forceinline Vector4 & setX( float x ); + VECTORMATH_FORCE_INLINE Vector4 & setX( float x ); // Set the y element of a 4-D vector // - __forceinline Vector4 & setY( float y ); + VECTORMATH_FORCE_INLINE Vector4 & setY( float y ); // Set the z element of a 4-D vector // - __forceinline Vector4 & setZ( float z ); + VECTORMATH_FORCE_INLINE Vector4 & setZ( float z ); // Set the w element of a 4-D vector // - __forceinline Vector4 & setW( float w ); + VECTORMATH_FORCE_INLINE Vector4 & setW( float w ); // Set the x element of a 4-D vector (scalar data contained in vector data type) // - __forceinline Vector4 & setX( const floatInVec &x ); + VECTORMATH_FORCE_INLINE Vector4 & setX( const floatInVec &x ); // Set the y element of a 4-D vector (scalar data contained in vector data type) // - __forceinline Vector4 & setY( const floatInVec &y ); + VECTORMATH_FORCE_INLINE Vector4 & setY( const floatInVec &y ); // Set the z element of a 4-D vector (scalar data contained in vector data type) // - __forceinline Vector4 & setZ( const floatInVec &z ); + VECTORMATH_FORCE_INLINE Vector4 & setZ( const floatInVec &z ); // Set the w element of a 4-D vector (scalar data contained in vector data type) // - __forceinline Vector4 & setW( const floatInVec &w ); + VECTORMATH_FORCE_INLINE Vector4 & setW( const floatInVec &w ); // Get the x element of a 4-D vector // - __forceinline const floatInVec getX( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getX( ) const; // Get the y element of a 4-D vector // - __forceinline const floatInVec getY( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getY( ) const; // Get the z element of a 4-D vector // - __forceinline const floatInVec getZ( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getZ( ) const; // Get the w element of a 4-D vector // - __forceinline const floatInVec getW( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getW( ) const; // Set an x, y, z, or w element of a 4-D vector by index // - __forceinline Vector4 & setElem( int idx, float value ); + VECTORMATH_FORCE_INLINE Vector4 & setElem( int idx, float value ); // Set an x, y, z, or w element of a 4-D vector by index (scalar data contained in vector data type) // - __forceinline Vector4 & setElem( int idx, const floatInVec &value ); + VECTORMATH_FORCE_INLINE Vector4 & setElem( int idx, const floatInVec &value ); // Get an x, y, z, or w element of a 4-D vector by index // - __forceinline const floatInVec getElem( int idx ) const; + VECTORMATH_FORCE_INLINE const floatInVec getElem( int idx ) const; // Subscripting operator to set or get an element // - __forceinline VecIdx operator []( int idx ); + VECTORMATH_FORCE_INLINE VecIdx operator []( int idx ); // Subscripting operator to get an element // - __forceinline const floatInVec operator []( int idx ) const; + VECTORMATH_FORCE_INLINE const floatInVec operator []( int idx ) const; // Add two 4-D vectors // - __forceinline const Vector4 operator +( const Vector4 &vec ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator +( const Vector4 &vec ) const; // Subtract a 4-D vector from another 4-D vector // - __forceinline const Vector4 operator -( const Vector4 &vec ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator -( const Vector4 &vec ) const; // Multiply a 4-D vector by a scalar // - __forceinline const Vector4 operator *( float scalar ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator *( float scalar ) const; // Divide a 4-D vector by a scalar // - __forceinline const Vector4 operator /( float scalar ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator /( float scalar ) const; // Multiply a 4-D vector by a scalar (scalar data contained in vector data type) // - __forceinline const Vector4 operator *( const floatInVec &scalar ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator *( const floatInVec &scalar ) const; // Divide a 4-D vector by a scalar (scalar data contained in vector data type) // - __forceinline const Vector4 operator /( const floatInVec &scalar ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator /( const floatInVec &scalar ) const; // Perform compound assignment and addition with a 4-D vector // - __forceinline Vector4 & operator +=( const Vector4 &vec ); + VECTORMATH_FORCE_INLINE Vector4 & operator +=( const Vector4 &vec ); // Perform compound assignment and subtraction by a 4-D vector // - __forceinline Vector4 & operator -=( const Vector4 &vec ); + VECTORMATH_FORCE_INLINE Vector4 & operator -=( const Vector4 &vec ); // Perform compound assignment and multiplication by a scalar // - __forceinline Vector4 & operator *=( float scalar ); + VECTORMATH_FORCE_INLINE Vector4 & operator *=( float scalar ); // Perform compound assignment and division by a scalar // - __forceinline Vector4 & operator /=( float scalar ); + VECTORMATH_FORCE_INLINE Vector4 & operator /=( float scalar ); // Perform compound assignment and multiplication by a scalar (scalar data contained in vector data type) // - __forceinline Vector4 & operator *=( const floatInVec &scalar ); + VECTORMATH_FORCE_INLINE Vector4 & operator *=( const floatInVec &scalar ); // Perform compound assignment and division by a scalar (scalar data contained in vector data type) // - __forceinline Vector4 & operator /=( const floatInVec &scalar ); + VECTORMATH_FORCE_INLINE Vector4 & operator /=( const floatInVec &scalar ); // Negate all elements of a 4-D vector // - __forceinline const Vector4 operator -( ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator -( ) const; // Construct x axis // - static __forceinline const Vector4 xAxis( ); + static VECTORMATH_FORCE_INLINE const Vector4 xAxis( ); // Construct y axis // - static __forceinline const Vector4 yAxis( ); + static VECTORMATH_FORCE_INLINE const Vector4 yAxis( ); // Construct z axis // - static __forceinline const Vector4 zAxis( ); + static VECTORMATH_FORCE_INLINE const Vector4 zAxis( ); // Construct w axis // - static __forceinline const Vector4 wAxis( ); + static VECTORMATH_FORCE_INLINE const Vector4 wAxis( ); }; // Multiply a 4-D vector by a scalar // -__forceinline const Vector4 operator *( float scalar, const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const Vector4 operator *( float scalar, const Vector4 &vec ); // Multiply a 4-D vector by a scalar (scalar data contained in vector data type) // -__forceinline const Vector4 operator *( const floatInVec &scalar, const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const Vector4 operator *( const floatInVec &scalar, const Vector4 &vec ); // Multiply two 4-D vectors per element // -__forceinline const Vector4 mulPerElem( const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector4 mulPerElem( const Vector4 &vec0, const Vector4 &vec1 ); // Divide two 4-D vectors per element // NOTE: // Floating-point behavior matches standard library function divf4. // -__forceinline const Vector4 divPerElem( const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector4 divPerElem( const Vector4 &vec0, const Vector4 &vec1 ); // Compute the reciprocal of a 4-D vector per element // NOTE: // Floating-point behavior matches standard library function recipf4. // -__forceinline const Vector4 recipPerElem( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const Vector4 recipPerElem( const Vector4 &vec ); // Compute the absolute value of a 4-D vector per element // -__forceinline const Vector4 absPerElem( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const Vector4 absPerElem( const Vector4 &vec ); // Copy sign from one 4-D vector to another, per element // -__forceinline const Vector4 copySignPerElem( const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector4 copySignPerElem( const Vector4 &vec0, const Vector4 &vec1 ); // Maximum of two 4-D vectors per element // -__forceinline const Vector4 maxPerElem( const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector4 maxPerElem( const Vector4 &vec0, const Vector4 &vec1 ); // Minimum of two 4-D vectors per element // -__forceinline const Vector4 minPerElem( const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector4 minPerElem( const Vector4 &vec0, const Vector4 &vec1 ); // Maximum element of a 4-D vector // -__forceinline const floatInVec maxElem( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec maxElem( const Vector4 &vec ); // Minimum element of a 4-D vector // -__forceinline const floatInVec minElem( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec minElem( const Vector4 &vec ); // Compute the sum of all elements of a 4-D vector // -__forceinline const floatInVec sum( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec sum( const Vector4 &vec ); // Compute the dot product of two 4-D vectors // -__forceinline const floatInVec dot( const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const floatInVec dot( const Vector4 &vec0, const Vector4 &vec1 ); // Compute the square of the length of a 4-D vector // -__forceinline const floatInVec lengthSqr( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec lengthSqr( const Vector4 &vec ); // Compute the length of a 4-D vector // -__forceinline const floatInVec length( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const floatInVec length( const Vector4 &vec ); // Normalize a 4-D vector // NOTE: // The result is unpredictable when all elements of vec are at or near zero. // -__forceinline const Vector4 normalize( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE const Vector4 normalize( const Vector4 &vec ); // Outer product of two 4-D vectors // -__forceinline const Matrix4 outer( const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const Matrix4 outer( const Vector4 &vec0, const Vector4 &vec1 ); // Linear interpolation between two 4-D vectors // NOTE: // Does not clamp t between 0 and 1. // -__forceinline const Vector4 lerp( float t, const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector4 lerp( float t, const Vector4 &vec0, const Vector4 &vec1 ); // Linear interpolation between two 4-D vectors (scalar data contained in vector data type) // NOTE: // Does not clamp t between 0 and 1. // -__forceinline const Vector4 lerp( const floatInVec &t, const Vector4 &vec0, const Vector4 &vec1 ); +VECTORMATH_FORCE_INLINE const Vector4 lerp( const floatInVec &t, const Vector4 &vec0, const Vector4 &vec1 ); // Spherical linear interpolation between two 4-D vectors // NOTE: // The result is unpredictable if the vectors point in opposite directions. // Does not clamp t between 0 and 1. // -__forceinline const Vector4 slerp( float t, const Vector4 &unitVec0, const Vector4 &unitVec1 ); +VECTORMATH_FORCE_INLINE const Vector4 slerp( float t, const Vector4 &unitVec0, const Vector4 &unitVec1 ); // Spherical linear interpolation between two 4-D vectors (scalar data contained in vector data type) // NOTE: // The result is unpredictable if the vectors point in opposite directions. // Does not clamp t between 0 and 1. // -__forceinline const Vector4 slerp( const floatInVec &t, const Vector4 &unitVec0, const Vector4 &unitVec1 ); +VECTORMATH_FORCE_INLINE const Vector4 slerp( const floatInVec &t, const Vector4 &unitVec0, const Vector4 &unitVec1 ); // Conditionally select between two 4-D vectors // NOTE: @@ -1024,17 +1034,17 @@ __forceinline const Vector4 slerp( const floatInVec &t, const Vector4 &unitVec0, // However, the transfer of select1 to a VMX register may use more processing time than a branch. // Use the boolInVec version for better performance. // -__forceinline const Vector4 select( const Vector4 &vec0, const Vector4 &vec1, bool select1 ); +VECTORMATH_FORCE_INLINE const Vector4 select( const Vector4 &vec0, const Vector4 &vec1, bool select1 ); // Conditionally select between two 4-D vectors (scalar data contained in vector data type) // NOTE: // This function uses a conditional select instruction to avoid a branch. // -__forceinline const Vector4 select( const Vector4 &vec0, const Vector4 &vec1, const boolInVec &select1 ); +VECTORMATH_FORCE_INLINE const Vector4 select( const Vector4 &vec0, const Vector4 &vec1, const boolInVec &select1 ); // Store four 4-D vectors as half-floats // -__forceinline void storeHalfFloats( const Vector4 &vec0, const Vector4 &vec1, const Vector4 &vec2, const Vector4 &vec3, vec_ushort8 * twoQuads ); +VECTORMATH_FORCE_INLINE void storeHalfFloats( const Vector4 &vec0, const Vector4 &vec1, const Vector4 &vec2, const Vector4 &vec3, vec_ushort8 * twoQuads ); #ifdef _VECTORMATH_DEBUG @@ -1042,13 +1052,13 @@ __forceinline void storeHalfFloats( const Vector4 &vec0, const Vector4 &vec1, co // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Vector4 &vec ); +VECTORMATH_FORCE_INLINE void print( const Vector4 &vec ); // Print a 4-D vector and an associated string identifier // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Vector4 &vec, const char * name ); +VECTORMATH_FORCE_INLINE void print( const Vector4 &vec, const char * name ); #endif @@ -1061,205 +1071,205 @@ class Point3 public: // Default constructor; does no initialization // - __forceinline Point3( ) { }; + VECTORMATH_FORCE_INLINE Point3( ) { }; // Construct a 3-D point from x, y, and z elements // - __forceinline Point3( float x, float y, float z ); + VECTORMATH_FORCE_INLINE Point3( float x, float y, float z ); // Construct a 3-D point from x, y, and z elements (scalar data contained in vector data type) // - __forceinline Point3( const floatInVec &x, const floatInVec &y, const floatInVec &z ); + VECTORMATH_FORCE_INLINE Point3( const floatInVec &x, const floatInVec &y, const floatInVec &z ); // Copy elements from a 3-D vector into a 3-D point // - explicit __forceinline Point3( const Vector3 &vec ); + explicit VECTORMATH_FORCE_INLINE Point3( const Vector3 &vec ); // Set all elements of a 3-D point to the same scalar value // - explicit __forceinline Point3( float scalar ); + explicit VECTORMATH_FORCE_INLINE Point3( float scalar ); // Set all elements of a 3-D point to the same scalar value (scalar data contained in vector data type) // - explicit __forceinline Point3( const floatInVec &scalar ); + explicit VECTORMATH_FORCE_INLINE Point3( const floatInVec &scalar ); // Set vector float data in a 3-D point // - explicit __forceinline Point3( __m128 vf4 ); + explicit VECTORMATH_FORCE_INLINE Point3( __m128 vf4 ); // Get vector float data from a 3-D point // - __forceinline __m128 get128( ) const; + VECTORMATH_FORCE_INLINE __m128 get128( ) const; // Assign one 3-D point to another // - __forceinline Point3 & operator =( const Point3 &pnt ); + VECTORMATH_FORCE_INLINE Point3 & operator =( const Point3 &pnt ); // Set the x element of a 3-D point // - __forceinline Point3 & setX( float x ); + VECTORMATH_FORCE_INLINE Point3 & setX( float x ); // Set the y element of a 3-D point // - __forceinline Point3 & setY( float y ); + VECTORMATH_FORCE_INLINE Point3 & setY( float y ); // Set the z element of a 3-D point // - __forceinline Point3 & setZ( float z ); + VECTORMATH_FORCE_INLINE Point3 & setZ( float z ); // Set the x element of a 3-D point (scalar data contained in vector data type) // - __forceinline Point3 & setX( const floatInVec &x ); + VECTORMATH_FORCE_INLINE Point3 & setX( const floatInVec &x ); // Set the y element of a 3-D point (scalar data contained in vector data type) // - __forceinline Point3 & setY( const floatInVec &y ); + VECTORMATH_FORCE_INLINE Point3 & setY( const floatInVec &y ); // Set the z element of a 3-D point (scalar data contained in vector data type) // - __forceinline Point3 & setZ( const floatInVec &z ); + VECTORMATH_FORCE_INLINE Point3 & setZ( const floatInVec &z ); // Get the x element of a 3-D point // - __forceinline const floatInVec getX( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getX( ) const; // Get the y element of a 3-D point // - __forceinline const floatInVec getY( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getY( ) const; // Get the z element of a 3-D point // - __forceinline const floatInVec getZ( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getZ( ) const; // Set an x, y, or z element of a 3-D point by index // - __forceinline Point3 & setElem( int idx, float value ); + VECTORMATH_FORCE_INLINE Point3 & setElem( int idx, float value ); // Set an x, y, or z element of a 3-D point by index (scalar data contained in vector data type) // - __forceinline Point3 & setElem( int idx, const floatInVec &value ); + VECTORMATH_FORCE_INLINE Point3 & setElem( int idx, const floatInVec &value ); // Get an x, y, or z element of a 3-D point by index // - __forceinline const floatInVec getElem( int idx ) const; + VECTORMATH_FORCE_INLINE const floatInVec getElem( int idx ) const; // Subscripting operator to set or get an element // - __forceinline VecIdx operator []( int idx ); + VECTORMATH_FORCE_INLINE VecIdx operator []( int idx ); // Subscripting operator to get an element // - __forceinline const floatInVec operator []( int idx ) const; + VECTORMATH_FORCE_INLINE const floatInVec operator []( int idx ) const; // Subtract a 3-D point from another 3-D point // - __forceinline const Vector3 operator -( const Point3 &pnt ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator -( const Point3 &pnt ) const; // Add a 3-D point to a 3-D vector // - __forceinline const Point3 operator +( const Vector3 &vec ) const; + VECTORMATH_FORCE_INLINE const Point3 operator +( const Vector3 &vec ) const; // Subtract a 3-D vector from a 3-D point // - __forceinline const Point3 operator -( const Vector3 &vec ) const; + VECTORMATH_FORCE_INLINE const Point3 operator -( const Vector3 &vec ) const; // Perform compound assignment and addition with a 3-D vector // - __forceinline Point3 & operator +=( const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Point3 & operator +=( const Vector3 &vec ); // Perform compound assignment and subtraction by a 3-D vector // - __forceinline Point3 & operator -=( const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Point3 & operator -=( const Vector3 &vec ); }; // Multiply two 3-D points per element // -__forceinline const Point3 mulPerElem( const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const Point3 mulPerElem( const Point3 &pnt0, const Point3 &pnt1 ); // Divide two 3-D points per element // NOTE: // Floating-point behavior matches standard library function divf4. // -__forceinline const Point3 divPerElem( const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const Point3 divPerElem( const Point3 &pnt0, const Point3 &pnt1 ); // Compute the reciprocal of a 3-D point per element // NOTE: // Floating-point behavior matches standard library function recipf4. // -__forceinline const Point3 recipPerElem( const Point3 &pnt ); +VECTORMATH_FORCE_INLINE const Point3 recipPerElem( const Point3 &pnt ); // Compute the absolute value of a 3-D point per element // -__forceinline const Point3 absPerElem( const Point3 &pnt ); +VECTORMATH_FORCE_INLINE const Point3 absPerElem( const Point3 &pnt ); // Copy sign from one 3-D point to another, per element // -__forceinline const Point3 copySignPerElem( const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const Point3 copySignPerElem( const Point3 &pnt0, const Point3 &pnt1 ); // Maximum of two 3-D points per element // -__forceinline const Point3 maxPerElem( const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const Point3 maxPerElem( const Point3 &pnt0, const Point3 &pnt1 ); // Minimum of two 3-D points per element // -__forceinline const Point3 minPerElem( const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const Point3 minPerElem( const Point3 &pnt0, const Point3 &pnt1 ); // Maximum element of a 3-D point // -__forceinline const floatInVec maxElem( const Point3 &pnt ); +VECTORMATH_FORCE_INLINE const floatInVec maxElem( const Point3 &pnt ); // Minimum element of a 3-D point // -__forceinline const floatInVec minElem( const Point3 &pnt ); +VECTORMATH_FORCE_INLINE const floatInVec minElem( const Point3 &pnt ); // Compute the sum of all elements of a 3-D point // -__forceinline const floatInVec sum( const Point3 &pnt ); +VECTORMATH_FORCE_INLINE const floatInVec sum( const Point3 &pnt ); // Apply uniform scale to a 3-D point // -__forceinline const Point3 scale( const Point3 &pnt, float scaleVal ); +VECTORMATH_FORCE_INLINE const Point3 scale( const Point3 &pnt, float scaleVal ); // Apply uniform scale to a 3-D point (scalar data contained in vector data type) // -__forceinline const Point3 scale( const Point3 &pnt, const floatInVec &scaleVal ); +VECTORMATH_FORCE_INLINE const Point3 scale( const Point3 &pnt, const floatInVec &scaleVal ); // Apply non-uniform scale to a 3-D point // -__forceinline const Point3 scale( const Point3 &pnt, const Vector3 &scaleVec ); +VECTORMATH_FORCE_INLINE const Point3 scale( const Point3 &pnt, const Vector3 &scaleVec ); // Scalar projection of a 3-D point on a unit-length 3-D vector // -__forceinline const floatInVec projection( const Point3 &pnt, const Vector3 &unitVec ); +VECTORMATH_FORCE_INLINE const floatInVec projection( const Point3 &pnt, const Vector3 &unitVec ); // Compute the square of the distance of a 3-D point from the coordinate-system origin // -__forceinline const floatInVec distSqrFromOrigin( const Point3 &pnt ); +VECTORMATH_FORCE_INLINE const floatInVec distSqrFromOrigin( const Point3 &pnt ); // Compute the distance of a 3-D point from the coordinate-system origin // -__forceinline const floatInVec distFromOrigin( const Point3 &pnt ); +VECTORMATH_FORCE_INLINE const floatInVec distFromOrigin( const Point3 &pnt ); // Compute the square of the distance between two 3-D points // -__forceinline const floatInVec distSqr( const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const floatInVec distSqr( const Point3 &pnt0, const Point3 &pnt1 ); // Compute the distance between two 3-D points // -__forceinline const floatInVec dist( const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const floatInVec dist( const Point3 &pnt0, const Point3 &pnt1 ); // Linear interpolation between two 3-D points // NOTE: // Does not clamp t between 0 and 1. // -__forceinline const Point3 lerp( float t, const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const Point3 lerp( float t, const Point3 &pnt0, const Point3 &pnt1 ); // Linear interpolation between two 3-D points (scalar data contained in vector data type) // NOTE: // Does not clamp t between 0 and 1. // -__forceinline const Point3 lerp( const floatInVec &t, const Point3 &pnt0, const Point3 &pnt1 ); +VECTORMATH_FORCE_INLINE const Point3 lerp( const floatInVec &t, const Point3 &pnt0, const Point3 &pnt1 ); // Conditionally select between two 3-D points // NOTE: @@ -1267,29 +1277,29 @@ __forceinline const Point3 lerp( const floatInVec &t, const Point3 &pnt0, const // However, the transfer of select1 to a VMX register may use more processing time than a branch. // Use the boolInVec version for better performance. // -__forceinline const Point3 select( const Point3 &pnt0, const Point3 &pnt1, bool select1 ); +VECTORMATH_FORCE_INLINE const Point3 select( const Point3 &pnt0, const Point3 &pnt1, bool select1 ); // Conditionally select between two 3-D points (scalar data contained in vector data type) // NOTE: // This function uses a conditional select instruction to avoid a branch. // -__forceinline const Point3 select( const Point3 &pnt0, const Point3 &pnt1, const boolInVec &select1 ); +VECTORMATH_FORCE_INLINE const Point3 select( const Point3 &pnt0, const Point3 &pnt1, const boolInVec &select1 ); // Store x, y, and z elements of 3-D point in first three words of a quadword, preserving fourth word // -__forceinline void storeXYZ( const Point3 &pnt, __m128 * quad ); +VECTORMATH_FORCE_INLINE void storeXYZ( const Point3 &pnt, __m128 * quad ); // Load four three-float 3-D points, stored in three quadwords // -__forceinline void loadXYZArray( Point3 & pnt0, Point3 & pnt1, Point3 & pnt2, Point3 & pnt3, const __m128 * threeQuads ); +VECTORMATH_FORCE_INLINE void loadXYZArray( Point3 & pnt0, Point3 & pnt1, Point3 & pnt2, Point3 & pnt3, const __m128 * threeQuads ); // Store four 3-D points in three quadwords // -__forceinline void storeXYZArray( const Point3 &pnt0, const Point3 &pnt1, const Point3 &pnt2, const Point3 &pnt3, __m128 * threeQuads ); +VECTORMATH_FORCE_INLINE void storeXYZArray( const Point3 &pnt0, const Point3 &pnt1, const Point3 &pnt2, const Point3 &pnt3, __m128 * threeQuads ); // Store eight 3-D points as half-floats // -__forceinline void storeHalfFloats( const Point3 &pnt0, const Point3 &pnt1, const Point3 &pnt2, const Point3 &pnt3, const Point3 &pnt4, const Point3 &pnt5, const Point3 &pnt6, const Point3 &pnt7, vec_ushort8 * threeQuads ); +VECTORMATH_FORCE_INLINE void storeHalfFloats( const Point3 &pnt0, const Point3 &pnt1, const Point3 &pnt2, const Point3 &pnt3, const Point3 &pnt4, const Point3 &pnt5, const Point3 &pnt6, const Point3 &pnt7, vec_ushort8 * threeQuads ); #ifdef _VECTORMATH_DEBUG @@ -1297,13 +1307,13 @@ __forceinline void storeHalfFloats( const Point3 &pnt0, const Point3 &pnt1, cons // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Point3 &pnt ); +VECTORMATH_FORCE_INLINE void print( const Point3 &pnt ); // Print a 3-D point and an associated string identifier // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Point3 &pnt, const char * name ); +VECTORMATH_FORCE_INLINE void print( const Point3 &pnt, const char * name ); #endif @@ -1316,307 +1326,307 @@ class Quat public: // Default constructor; does no initialization // - __forceinline Quat( ) { }; + VECTORMATH_FORCE_INLINE Quat( ) { }; - __forceinline Quat::Quat(const Quat& quat); + VECTORMATH_FORCE_INLINE Quat::Quat(const Quat& quat); // Construct a quaternion from x, y, z, and w elements // - __forceinline Quat( float x, float y, float z, float w ); + VECTORMATH_FORCE_INLINE Quat( float x, float y, float z, float w ); // Construct a quaternion from x, y, z, and w elements (scalar data contained in vector data type) // - __forceinline Quat( const floatInVec &x, const floatInVec &y, const floatInVec &z, const floatInVec &w ); + VECTORMATH_FORCE_INLINE Quat( const floatInVec &x, const floatInVec &y, const floatInVec &z, const floatInVec &w ); // Construct a quaternion from a 3-D vector and a scalar // - __forceinline Quat( const Vector3 &xyz, float w ); + VECTORMATH_FORCE_INLINE Quat( const Vector3 &xyz, float w ); // Construct a quaternion from a 3-D vector and a scalar (scalar data contained in vector data type) // - __forceinline Quat( const Vector3 &xyz, const floatInVec &w ); + VECTORMATH_FORCE_INLINE Quat( const Vector3 &xyz, const floatInVec &w ); // Copy elements from a 4-D vector into a quaternion // - explicit __forceinline Quat( const Vector4 &vec ); + explicit VECTORMATH_FORCE_INLINE Quat( const Vector4 &vec ); // Convert a rotation matrix to a unit-length quaternion // - explicit __forceinline Quat( const Matrix3 & rotMat ); + explicit VECTORMATH_FORCE_INLINE Quat( const Matrix3 & rotMat ); // Set all elements of a quaternion to the same scalar value // - explicit __forceinline Quat( float scalar ); + explicit VECTORMATH_FORCE_INLINE Quat( float scalar ); // Set all elements of a quaternion to the same scalar value (scalar data contained in vector data type) // - explicit __forceinline Quat( const floatInVec &scalar ); + explicit VECTORMATH_FORCE_INLINE Quat( const floatInVec &scalar ); // Set vector float data in a quaternion // - explicit __forceinline Quat( __m128 vf4 ); + explicit VECTORMATH_FORCE_INLINE Quat( __m128 vf4 ); // Get vector float data from a quaternion // - __forceinline __m128 get128( ) const; + VECTORMATH_FORCE_INLINE __m128 get128( ) const; // Set a quaterion from vector float data // - __forceinline void set128(vec_float4 vec); + VECTORMATH_FORCE_INLINE void set128(vec_float4 vec); // Assign one quaternion to another // - __forceinline Quat & operator =( const Quat &quat ); + VECTORMATH_FORCE_INLINE Quat & operator =( const Quat &quat ); // Set the x, y, and z elements of a quaternion // NOTE: // This function does not change the w element. // - __forceinline Quat & setXYZ( const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Quat & setXYZ( const Vector3 &vec ); // Get the x, y, and z elements of a quaternion // - __forceinline const Vector3 getXYZ( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getXYZ( ) const; // Set the x element of a quaternion // - __forceinline Quat & setX( float x ); + VECTORMATH_FORCE_INLINE Quat & setX( float x ); // Set the y element of a quaternion // - __forceinline Quat & setY( float y ); + VECTORMATH_FORCE_INLINE Quat & setY( float y ); // Set the z element of a quaternion // - __forceinline Quat & setZ( float z ); + VECTORMATH_FORCE_INLINE Quat & setZ( float z ); // Set the w element of a quaternion // - __forceinline Quat & setW( float w ); + VECTORMATH_FORCE_INLINE Quat & setW( float w ); // Set the x element of a quaternion (scalar data contained in vector data type) // - __forceinline Quat & setX( const floatInVec &x ); + VECTORMATH_FORCE_INLINE Quat & setX( const floatInVec &x ); // Set the y element of a quaternion (scalar data contained in vector data type) // - __forceinline Quat & setY( const floatInVec &y ); + VECTORMATH_FORCE_INLINE Quat & setY( const floatInVec &y ); // Set the z element of a quaternion (scalar data contained in vector data type) // - __forceinline Quat & setZ( const floatInVec &z ); + VECTORMATH_FORCE_INLINE Quat & setZ( const floatInVec &z ); // Set the w element of a quaternion (scalar data contained in vector data type) // - __forceinline Quat & setW( const floatInVec &w ); + VECTORMATH_FORCE_INLINE Quat & setW( const floatInVec &w ); // Get the x element of a quaternion // - __forceinline const floatInVec getX( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getX( ) const; // Get the y element of a quaternion // - __forceinline const floatInVec getY( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getY( ) const; // Get the z element of a quaternion // - __forceinline const floatInVec getZ( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getZ( ) const; // Get the w element of a quaternion // - __forceinline const floatInVec getW( ) const; + VECTORMATH_FORCE_INLINE const floatInVec getW( ) const; // Set an x, y, z, or w element of a quaternion by index // - __forceinline Quat & setElem( int idx, float value ); + VECTORMATH_FORCE_INLINE Quat & setElem( int idx, float value ); // Set an x, y, z, or w element of a quaternion by index (scalar data contained in vector data type) // - __forceinline Quat & setElem( int idx, const floatInVec &value ); + VECTORMATH_FORCE_INLINE Quat & setElem( int idx, const floatInVec &value ); // Get an x, y, z, or w element of a quaternion by index // - __forceinline const floatInVec getElem( int idx ) const; + VECTORMATH_FORCE_INLINE const floatInVec getElem( int idx ) const; // Subscripting operator to set or get an element // - __forceinline VecIdx operator []( int idx ); + VECTORMATH_FORCE_INLINE VecIdx operator []( int idx ); // Subscripting operator to get an element // - __forceinline const floatInVec operator []( int idx ) const; + VECTORMATH_FORCE_INLINE const floatInVec operator []( int idx ) const; // Add two quaternions // - __forceinline const Quat operator +( const Quat &quat ) const; + VECTORMATH_FORCE_INLINE const Quat operator +( const Quat &quat ) const; // Subtract a quaternion from another quaternion // - __forceinline const Quat operator -( const Quat &quat ) const; + VECTORMATH_FORCE_INLINE const Quat operator -( const Quat &quat ) const; // Multiply two quaternions // - __forceinline const Quat operator *( const Quat &quat ) const; + VECTORMATH_FORCE_INLINE const Quat operator *( const Quat &quat ) const; // Multiply a quaternion by a scalar // - __forceinline const Quat operator *( float scalar ) const; + VECTORMATH_FORCE_INLINE const Quat operator *( float scalar ) const; // Divide a quaternion by a scalar // - __forceinline const Quat operator /( float scalar ) const; + VECTORMATH_FORCE_INLINE const Quat operator /( float scalar ) const; // Multiply a quaternion by a scalar (scalar data contained in vector data type) // - __forceinline const Quat operator *( const floatInVec &scalar ) const; + VECTORMATH_FORCE_INLINE const Quat operator *( const floatInVec &scalar ) const; // Divide a quaternion by a scalar (scalar data contained in vector data type) // - __forceinline const Quat operator /( const floatInVec &scalar ) const; + VECTORMATH_FORCE_INLINE const Quat operator /( const floatInVec &scalar ) const; // Perform compound assignment and addition with a quaternion // - __forceinline Quat & operator +=( const Quat &quat ); + VECTORMATH_FORCE_INLINE Quat & operator +=( const Quat &quat ); // Perform compound assignment and subtraction by a quaternion // - __forceinline Quat & operator -=( const Quat &quat ); + VECTORMATH_FORCE_INLINE Quat & operator -=( const Quat &quat ); // Perform compound assignment and multiplication by a quaternion // - __forceinline Quat & operator *=( const Quat &quat ); + VECTORMATH_FORCE_INLINE Quat & operator *=( const Quat &quat ); // Perform compound assignment and multiplication by a scalar // - __forceinline Quat & operator *=( float scalar ); + VECTORMATH_FORCE_INLINE Quat & operator *=( float scalar ); // Perform compound assignment and division by a scalar // - __forceinline Quat & operator /=( float scalar ); + VECTORMATH_FORCE_INLINE Quat & operator /=( float scalar ); // Perform compound assignment and multiplication by a scalar (scalar data contained in vector data type) // - __forceinline Quat & operator *=( const floatInVec &scalar ); + VECTORMATH_FORCE_INLINE Quat & operator *=( const floatInVec &scalar ); // Perform compound assignment and division by a scalar (scalar data contained in vector data type) // - __forceinline Quat & operator /=( const floatInVec &scalar ); + VECTORMATH_FORCE_INLINE Quat & operator /=( const floatInVec &scalar ); // Negate all elements of a quaternion // - __forceinline const Quat operator -( ) const; + VECTORMATH_FORCE_INLINE const Quat operator -( ) const; // Construct an identity quaternion // - static __forceinline const Quat identity( ); + static VECTORMATH_FORCE_INLINE const Quat identity( ); // Construct a quaternion to rotate between two unit-length 3-D vectors // NOTE: // The result is unpredictable if unitVec0 and unitVec1 point in opposite directions. // - static __forceinline const Quat rotation( const Vector3 &unitVec0, const Vector3 &unitVec1 ); + static VECTORMATH_FORCE_INLINE const Quat rotation( const Vector3 &unitVec0, const Vector3 &unitVec1 ); // Construct a quaternion to rotate around a unit-length 3-D vector // - static __forceinline const Quat rotation( float radians, const Vector3 &unitVec ); + static VECTORMATH_FORCE_INLINE const Quat rotation( float radians, const Vector3 &unitVec ); // Construct a quaternion to rotate around a unit-length 3-D vector (scalar data contained in vector data type) // - static __forceinline const Quat rotation( const floatInVec &radians, const Vector3 &unitVec ); + static VECTORMATH_FORCE_INLINE const Quat rotation( const floatInVec &radians, const Vector3 &unitVec ); // Construct a quaternion to rotate around the x axis // - static __forceinline const Quat rotationX( float radians ); + static VECTORMATH_FORCE_INLINE const Quat rotationX( float radians ); // Construct a quaternion to rotate around the y axis // - static __forceinline const Quat rotationY( float radians ); + static VECTORMATH_FORCE_INLINE const Quat rotationY( float radians ); // Construct a quaternion to rotate around the z axis // - static __forceinline const Quat rotationZ( float radians ); + static VECTORMATH_FORCE_INLINE const Quat rotationZ( float radians ); // Construct a quaternion to rotate around the x axis (scalar data contained in vector data type) // - static __forceinline const Quat rotationX( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Quat rotationX( const floatInVec &radians ); // Construct a quaternion to rotate around the y axis (scalar data contained in vector data type) // - static __forceinline const Quat rotationY( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Quat rotationY( const floatInVec &radians ); // Construct a quaternion to rotate around the z axis (scalar data contained in vector data type) // - static __forceinline const Quat rotationZ( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Quat rotationZ( const floatInVec &radians ); }; // Multiply a quaternion by a scalar // -__forceinline const Quat operator *( float scalar, const Quat &quat ); +VECTORMATH_FORCE_INLINE const Quat operator *( float scalar, const Quat &quat ); // Multiply a quaternion by a scalar (scalar data contained in vector data type) // -__forceinline const Quat operator *( const floatInVec &scalar, const Quat &quat ); +VECTORMATH_FORCE_INLINE const Quat operator *( const floatInVec &scalar, const Quat &quat ); // Compute the conjugate of a quaternion // -__forceinline const Quat conj( const Quat &quat ); +VECTORMATH_FORCE_INLINE const Quat conj( const Quat &quat ); // Use a unit-length quaternion to rotate a 3-D vector // -__forceinline const Vector3 rotate( const Quat &unitQuat, const Vector3 &vec ); +VECTORMATH_FORCE_INLINE const Vector3 rotate( const Quat &unitQuat, const Vector3 &vec ); // Compute the dot product of two quaternions // -__forceinline const floatInVec dot( const Quat &quat0, const Quat &quat1 ); +VECTORMATH_FORCE_INLINE const floatInVec dot( const Quat &quat0, const Quat &quat1 ); // Compute the norm of a quaternion // -__forceinline const floatInVec norm( const Quat &quat ); +VECTORMATH_FORCE_INLINE const floatInVec norm( const Quat &quat ); // Compute the length of a quaternion // -__forceinline const floatInVec length( const Quat &quat ); +VECTORMATH_FORCE_INLINE const floatInVec length( const Quat &quat ); // Normalize a quaternion // NOTE: // The result is unpredictable when all elements of quat are at or near zero. // -__forceinline const Quat normalize( const Quat &quat ); +VECTORMATH_FORCE_INLINE const Quat normalize( const Quat &quat ); // Linear interpolation between two quaternions // NOTE: // Does not clamp t between 0 and 1. // -__forceinline const Quat lerp( float t, const Quat &quat0, const Quat &quat1 ); +VECTORMATH_FORCE_INLINE const Quat lerp( float t, const Quat &quat0, const Quat &quat1 ); // Linear interpolation between two quaternions (scalar data contained in vector data type) // NOTE: // Does not clamp t between 0 and 1. // -__forceinline const Quat lerp( const floatInVec &t, const Quat &quat0, const Quat &quat1 ); +VECTORMATH_FORCE_INLINE const Quat lerp( const floatInVec &t, const Quat &quat0, const Quat &quat1 ); // Spherical linear interpolation between two quaternions // NOTE: // Interpolates along the shortest path between orientations. // Does not clamp t between 0 and 1. // -__forceinline const Quat slerp( float t, const Quat &unitQuat0, const Quat &unitQuat1 ); +VECTORMATH_FORCE_INLINE const Quat slerp( float t, const Quat &unitQuat0, const Quat &unitQuat1 ); // Spherical linear interpolation between two quaternions (scalar data contained in vector data type) // NOTE: // Interpolates along the shortest path between orientations. // Does not clamp t between 0 and 1. // -__forceinline const Quat slerp( const floatInVec &t, const Quat &unitQuat0, const Quat &unitQuat1 ); +VECTORMATH_FORCE_INLINE const Quat slerp( const floatInVec &t, const Quat &unitQuat0, const Quat &unitQuat1 ); // Spherical quadrangle interpolation // -__forceinline const Quat squad( float t, const Quat &unitQuat0, const Quat &unitQuat1, const Quat &unitQuat2, const Quat &unitQuat3 ); +VECTORMATH_FORCE_INLINE const Quat squad( float t, const Quat &unitQuat0, const Quat &unitQuat1, const Quat &unitQuat2, const Quat &unitQuat3 ); // Spherical quadrangle interpolation (scalar data contained in vector data type) // -__forceinline const Quat squad( const floatInVec &t, const Quat &unitQuat0, const Quat &unitQuat1, const Quat &unitQuat2, const Quat &unitQuat3 ); +VECTORMATH_FORCE_INLINE const Quat squad( const floatInVec &t, const Quat &unitQuat0, const Quat &unitQuat1, const Quat &unitQuat2, const Quat &unitQuat3 ); // Conditionally select between two quaternions // NOTE: @@ -1624,13 +1634,13 @@ __forceinline const Quat squad( const floatInVec &t, const Quat &unitQuat0, cons // However, the transfer of select1 to a VMX register may use more processing time than a branch. // Use the boolInVec version for better performance. // -__forceinline const Quat select( const Quat &quat0, const Quat &quat1, bool select1 ); +VECTORMATH_FORCE_INLINE const Quat select( const Quat &quat0, const Quat &quat1, bool select1 ); // Conditionally select between two quaternions (scalar data contained in vector data type) // NOTE: // This function uses a conditional select instruction to avoid a branch. // -__forceinline const Quat select( const Quat &quat0, const Quat &quat1, const boolInVec &select1 ); +VECTORMATH_FORCE_INLINE const Quat select( const Quat &quat0, const Quat &quat1, const boolInVec &select1 ); #ifdef _VECTORMATH_DEBUG @@ -1638,13 +1648,13 @@ __forceinline const Quat select( const Quat &quat0, const Quat &quat1, const boo // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Quat &quat ); +VECTORMATH_FORCE_INLINE void print( const Quat &quat ); // Print a quaternion and an associated string identifier // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Quat &quat, const char * name ); +VECTORMATH_FORCE_INLINE void print( const Quat &quat, const char * name ); #endif @@ -1659,230 +1669,230 @@ class Matrix3 public: // Default constructor; does no initialization // - __forceinline Matrix3( ) { }; + VECTORMATH_FORCE_INLINE Matrix3( ) { }; // Copy a 3x3 matrix // - __forceinline Matrix3( const Matrix3 & mat ); + VECTORMATH_FORCE_INLINE Matrix3( const Matrix3 & mat ); // Construct a 3x3 matrix containing the specified columns // - __forceinline Matrix3( const Vector3 &col0, const Vector3 &col1, const Vector3 &col2 ); + VECTORMATH_FORCE_INLINE Matrix3( const Vector3 &col0, const Vector3 &col1, const Vector3 &col2 ); // Construct a 3x3 rotation matrix from a unit-length quaternion // - explicit __forceinline Matrix3( const Quat &unitQuat ); + explicit VECTORMATH_FORCE_INLINE Matrix3( const Quat &unitQuat ); // Set all elements of a 3x3 matrix to the same scalar value // - explicit __forceinline Matrix3( float scalar ); + explicit VECTORMATH_FORCE_INLINE Matrix3( float scalar ); // Set all elements of a 3x3 matrix to the same scalar value (scalar data contained in vector data type) // - explicit __forceinline Matrix3( const floatInVec &scalar ); + explicit VECTORMATH_FORCE_INLINE Matrix3( const floatInVec &scalar ); // Assign one 3x3 matrix to another // - __forceinline Matrix3 & operator =( const Matrix3 & mat ); + VECTORMATH_FORCE_INLINE Matrix3 & operator =( const Matrix3 & mat ); // Set column 0 of a 3x3 matrix // - __forceinline Matrix3 & setCol0( const Vector3 &col0 ); + VECTORMATH_FORCE_INLINE Matrix3 & setCol0( const Vector3 &col0 ); // Set column 1 of a 3x3 matrix // - __forceinline Matrix3 & setCol1( const Vector3 &col1 ); + VECTORMATH_FORCE_INLINE Matrix3 & setCol1( const Vector3 &col1 ); // Set column 2 of a 3x3 matrix // - __forceinline Matrix3 & setCol2( const Vector3 &col2 ); + VECTORMATH_FORCE_INLINE Matrix3 & setCol2( const Vector3 &col2 ); // Get column 0 of a 3x3 matrix // - __forceinline const Vector3 getCol0( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol0( ) const; // Get column 1 of a 3x3 matrix // - __forceinline const Vector3 getCol1( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol1( ) const; // Get column 2 of a 3x3 matrix // - __forceinline const Vector3 getCol2( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol2( ) const; // Set the column of a 3x3 matrix referred to by the specified index // - __forceinline Matrix3 & setCol( int col, const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Matrix3 & setCol( int col, const Vector3 &vec ); // Set the row of a 3x3 matrix referred to by the specified index // - __forceinline Matrix3 & setRow( int row, const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Matrix3 & setRow( int row, const Vector3 &vec ); // Get the column of a 3x3 matrix referred to by the specified index // - __forceinline const Vector3 getCol( int col ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol( int col ) const; // Get the row of a 3x3 matrix referred to by the specified index // - __forceinline const Vector3 getRow( int row ) const; + VECTORMATH_FORCE_INLINE const Vector3 getRow( int row ) const; // Subscripting operator to set or get a column // - __forceinline Vector3 & operator []( int col ); + VECTORMATH_FORCE_INLINE Vector3 & operator []( int col ); // Subscripting operator to get a column // - __forceinline const Vector3 operator []( int col ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator []( int col ) const; // Set the element of a 3x3 matrix referred to by column and row indices // - __forceinline Matrix3 & setElem( int col, int row, float val ); + VECTORMATH_FORCE_INLINE Matrix3 & setElem( int col, int row, float val ); // Set the element of a 3x3 matrix referred to by column and row indices (scalar data contained in vector data type) // - __forceinline Matrix3 & setElem( int col, int row, const floatInVec &val ); + VECTORMATH_FORCE_INLINE Matrix3 & setElem( int col, int row, const floatInVec &val ); // Get the element of a 3x3 matrix referred to by column and row indices // - __forceinline const floatInVec getElem( int col, int row ) const; + VECTORMATH_FORCE_INLINE const floatInVec getElem( int col, int row ) const; // Add two 3x3 matrices // - __forceinline const Matrix3 operator +( const Matrix3 & mat ) const; + VECTORMATH_FORCE_INLINE const Matrix3 operator +( const Matrix3 & mat ) const; // Subtract a 3x3 matrix from another 3x3 matrix // - __forceinline const Matrix3 operator -( const Matrix3 & mat ) const; + VECTORMATH_FORCE_INLINE const Matrix3 operator -( const Matrix3 & mat ) const; // Negate all elements of a 3x3 matrix // - __forceinline const Matrix3 operator -( ) const; + VECTORMATH_FORCE_INLINE const Matrix3 operator -( ) const; // Multiply a 3x3 matrix by a scalar // - __forceinline const Matrix3 operator *( float scalar ) const; + VECTORMATH_FORCE_INLINE const Matrix3 operator *( float scalar ) const; // Multiply a 3x3 matrix by a scalar (scalar data contained in vector data type) // - __forceinline const Matrix3 operator *( const floatInVec &scalar ) const; + VECTORMATH_FORCE_INLINE const Matrix3 operator *( const floatInVec &scalar ) const; // Multiply a 3x3 matrix by a 3-D vector // - __forceinline const Vector3 operator *( const Vector3 &vec ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator *( const Vector3 &vec ) const; // Multiply two 3x3 matrices // - __forceinline const Matrix3 operator *( const Matrix3 & mat ) const; + VECTORMATH_FORCE_INLINE const Matrix3 operator *( const Matrix3 & mat ) const; // Perform compound assignment and addition with a 3x3 matrix // - __forceinline Matrix3 & operator +=( const Matrix3 & mat ); + VECTORMATH_FORCE_INLINE Matrix3 & operator +=( const Matrix3 & mat ); // Perform compound assignment and subtraction by a 3x3 matrix // - __forceinline Matrix3 & operator -=( const Matrix3 & mat ); + VECTORMATH_FORCE_INLINE Matrix3 & operator -=( const Matrix3 & mat ); // Perform compound assignment and multiplication by a scalar // - __forceinline Matrix3 & operator *=( float scalar ); + VECTORMATH_FORCE_INLINE Matrix3 & operator *=( float scalar ); // Perform compound assignment and multiplication by a scalar (scalar data contained in vector data type) // - __forceinline Matrix3 & operator *=( const floatInVec &scalar ); + VECTORMATH_FORCE_INLINE Matrix3 & operator *=( const floatInVec &scalar ); // Perform compound assignment and multiplication by a 3x3 matrix // - __forceinline Matrix3 & operator *=( const Matrix3 & mat ); + VECTORMATH_FORCE_INLINE Matrix3 & operator *=( const Matrix3 & mat ); // Construct an identity 3x3 matrix // - static __forceinline const Matrix3 identity( ); + static VECTORMATH_FORCE_INLINE const Matrix3 identity( ); // Construct a 3x3 matrix to rotate around the x axis // - static __forceinline const Matrix3 rotationX( float radians ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotationX( float radians ); // Construct a 3x3 matrix to rotate around the y axis // - static __forceinline const Matrix3 rotationY( float radians ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotationY( float radians ); // Construct a 3x3 matrix to rotate around the z axis // - static __forceinline const Matrix3 rotationZ( float radians ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotationZ( float radians ); // Construct a 3x3 matrix to rotate around the x axis (scalar data contained in vector data type) // - static __forceinline const Matrix3 rotationX( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotationX( const floatInVec &radians ); // Construct a 3x3 matrix to rotate around the y axis (scalar data contained in vector data type) // - static __forceinline const Matrix3 rotationY( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotationY( const floatInVec &radians ); // Construct a 3x3 matrix to rotate around the z axis (scalar data contained in vector data type) // - static __forceinline const Matrix3 rotationZ( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotationZ( const floatInVec &radians ); // Construct a 3x3 matrix to rotate around the x, y, and z axes // - static __forceinline const Matrix3 rotationZYX( const Vector3 &radiansXYZ ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotationZYX( const Vector3 &radiansXYZ ); // Construct a 3x3 matrix to rotate around a unit-length 3-D vector // - static __forceinline const Matrix3 rotation( float radians, const Vector3 &unitVec ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotation( float radians, const Vector3 &unitVec ); // Construct a 3x3 matrix to rotate around a unit-length 3-D vector (scalar data contained in vector data type) // - static __forceinline const Matrix3 rotation( const floatInVec &radians, const Vector3 &unitVec ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotation( const floatInVec &radians, const Vector3 &unitVec ); // Construct a rotation matrix from a unit-length quaternion // - static __forceinline const Matrix3 rotation( const Quat &unitQuat ); + static VECTORMATH_FORCE_INLINE const Matrix3 rotation( const Quat &unitQuat ); // Construct a 3x3 matrix to perform scaling // - static __forceinline const Matrix3 scale( const Vector3 &scaleVec ); + static VECTORMATH_FORCE_INLINE const Matrix3 scale( const Vector3 &scaleVec ); }; // Multiply a 3x3 matrix by a scalar // -__forceinline const Matrix3 operator *( float scalar, const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const Matrix3 operator *( float scalar, const Matrix3 & mat ); // Multiply a 3x3 matrix by a scalar (scalar data contained in vector data type) // -__forceinline const Matrix3 operator *( const floatInVec &scalar, const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const Matrix3 operator *( const floatInVec &scalar, const Matrix3 & mat ); // Append (post-multiply) a scale transformation to a 3x3 matrix // NOTE: // Faster than creating and multiplying a scale transformation matrix. // -__forceinline const Matrix3 appendScale( const Matrix3 & mat, const Vector3 &scaleVec ); +VECTORMATH_FORCE_INLINE const Matrix3 appendScale( const Matrix3 & mat, const Vector3 &scaleVec ); // Prepend (pre-multiply) a scale transformation to a 3x3 matrix // NOTE: // Faster than creating and multiplying a scale transformation matrix. // -__forceinline const Matrix3 prependScale( const Vector3 &scaleVec, const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const Matrix3 prependScale( const Vector3 &scaleVec, const Matrix3 & mat ); // Multiply two 3x3 matrices per element // -__forceinline const Matrix3 mulPerElem( const Matrix3 & mat0, const Matrix3 & mat1 ); +VECTORMATH_FORCE_INLINE const Matrix3 mulPerElem( const Matrix3 & mat0, const Matrix3 & mat1 ); // Compute the absolute value of a 3x3 matrix per element // -__forceinline const Matrix3 absPerElem( const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const Matrix3 absPerElem( const Matrix3 & mat ); // Transpose of a 3x3 matrix // -__forceinline const Matrix3 transpose( const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const Matrix3 transpose( const Matrix3 & mat ); // Compute the inverse of a 3x3 matrix // NOTE: // Result is unpredictable when the determinant of mat is equal to or near 0. // -__forceinline const Matrix3 inverse( const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const Matrix3 inverse( const Matrix3 & mat ); // Determinant of a 3x3 matrix // -__forceinline const floatInVec determinant( const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE const floatInVec determinant( const Matrix3 & mat ); // Conditionally select between two 3x3 matrices // NOTE: @@ -1890,13 +1900,13 @@ __forceinline const floatInVec determinant( const Matrix3 & mat ); // However, the transfer of select1 to a VMX register may use more processing time than a branch. // Use the boolInVec version for better performance. // -__forceinline const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, bool select1 ); +VECTORMATH_FORCE_INLINE const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, bool select1 ); // Conditionally select between two 3x3 matrices (scalar data contained in vector data type) // NOTE: // This function uses a conditional select instruction to avoid a branch. // -__forceinline const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, const boolInVec &select1 ); +VECTORMATH_FORCE_INLINE const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, const boolInVec &select1 ); #ifdef _VECTORMATH_DEBUG @@ -1904,13 +1914,13 @@ __forceinline const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Matrix3 & mat ); +VECTORMATH_FORCE_INLINE void print( const Matrix3 & mat ); // Print a 3x3 matrix and an associated string identifier // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Matrix3 & mat, const char * name ); +VECTORMATH_FORCE_INLINE void print( const Matrix3 & mat, const char * name ); #endif @@ -1926,314 +1936,314 @@ class Matrix4 public: // Default constructor; does no initialization // - __forceinline Matrix4( ) { }; + VECTORMATH_FORCE_INLINE Matrix4( ) { }; // Copy a 4x4 matrix // - __forceinline Matrix4( const Matrix4 & mat ); + VECTORMATH_FORCE_INLINE Matrix4( const Matrix4 & mat ); // Construct a 4x4 matrix containing the specified columns // - __forceinline Matrix4( const Vector4 &col0, const Vector4 &col1, const Vector4 &col2, const Vector4 &col3 ); + VECTORMATH_FORCE_INLINE Matrix4( const Vector4 &col0, const Vector4 &col1, const Vector4 &col2, const Vector4 &col3 ); // Construct a 4x4 matrix from a 3x4 transformation matrix // - explicit __forceinline Matrix4( const Transform3 & mat ); + explicit VECTORMATH_FORCE_INLINE Matrix4( const Transform3 & mat ); // Construct a 4x4 matrix from a 3x3 matrix and a 3-D vector // - __forceinline Matrix4( const Matrix3 & mat, const Vector3 &translateVec ); + VECTORMATH_FORCE_INLINE Matrix4( const Matrix3 & mat, const Vector3 &translateVec ); // Construct a 4x4 matrix from a unit-length quaternion and a 3-D vector // - __forceinline Matrix4( const Quat &unitQuat, const Vector3 &translateVec ); + VECTORMATH_FORCE_INLINE Matrix4( const Quat &unitQuat, const Vector3 &translateVec ); // Set all elements of a 4x4 matrix to the same scalar value // - explicit __forceinline Matrix4( float scalar ); + explicit VECTORMATH_FORCE_INLINE Matrix4( float scalar ); // Set all elements of a 4x4 matrix to the same scalar value (scalar data contained in vector data type) // - explicit __forceinline Matrix4( const floatInVec &scalar ); + explicit VECTORMATH_FORCE_INLINE Matrix4( const floatInVec &scalar ); // Assign one 4x4 matrix to another // - __forceinline Matrix4 & operator =( const Matrix4 & mat ); + VECTORMATH_FORCE_INLINE Matrix4 & operator =( const Matrix4 & mat ); // Set the upper-left 3x3 submatrix // NOTE: // This function does not change the bottom row elements. // - __forceinline Matrix4 & setUpper3x3( const Matrix3 & mat3 ); + VECTORMATH_FORCE_INLINE Matrix4 & setUpper3x3( const Matrix3 & mat3 ); // Get the upper-left 3x3 submatrix of a 4x4 matrix // - __forceinline const Matrix3 getUpper3x3( ) const; + VECTORMATH_FORCE_INLINE const Matrix3 getUpper3x3( ) const; // Set translation component // NOTE: // This function does not change the bottom row elements. // - __forceinline Matrix4 & setTranslation( const Vector3 &translateVec ); + VECTORMATH_FORCE_INLINE Matrix4 & setTranslation( const Vector3 &translateVec ); // Get the translation component of a 4x4 matrix // - __forceinline const Vector3 getTranslation( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getTranslation( ) const; // Set column 0 of a 4x4 matrix // - __forceinline Matrix4 & setCol0( const Vector4 &col0 ); + VECTORMATH_FORCE_INLINE Matrix4 & setCol0( const Vector4 &col0 ); // Set column 1 of a 4x4 matrix // - __forceinline Matrix4 & setCol1( const Vector4 &col1 ); + VECTORMATH_FORCE_INLINE Matrix4 & setCol1( const Vector4 &col1 ); // Set column 2 of a 4x4 matrix // - __forceinline Matrix4 & setCol2( const Vector4 &col2 ); + VECTORMATH_FORCE_INLINE Matrix4 & setCol2( const Vector4 &col2 ); // Set column 3 of a 4x4 matrix // - __forceinline Matrix4 & setCol3( const Vector4 &col3 ); + VECTORMATH_FORCE_INLINE Matrix4 & setCol3( const Vector4 &col3 ); // Get column 0 of a 4x4 matrix // - __forceinline const Vector4 getCol0( ) const; + VECTORMATH_FORCE_INLINE const Vector4 getCol0( ) const; // Get column 1 of a 4x4 matrix // - __forceinline const Vector4 getCol1( ) const; + VECTORMATH_FORCE_INLINE const Vector4 getCol1( ) const; // Get column 2 of a 4x4 matrix // - __forceinline const Vector4 getCol2( ) const; + VECTORMATH_FORCE_INLINE const Vector4 getCol2( ) const; // Get column 3 of a 4x4 matrix // - __forceinline const Vector4 getCol3( ) const; + VECTORMATH_FORCE_INLINE const Vector4 getCol3( ) const; // Set the column of a 4x4 matrix referred to by the specified index // - __forceinline Matrix4 & setCol( int col, const Vector4 &vec ); + VECTORMATH_FORCE_INLINE Matrix4 & setCol( int col, const Vector4 &vec ); // Set the row of a 4x4 matrix referred to by the specified index // - __forceinline Matrix4 & setRow( int row, const Vector4 &vec ); + VECTORMATH_FORCE_INLINE Matrix4 & setRow( int row, const Vector4 &vec ); // Get the column of a 4x4 matrix referred to by the specified index // - __forceinline const Vector4 getCol( int col ) const; + VECTORMATH_FORCE_INLINE const Vector4 getCol( int col ) const; // Get the row of a 4x4 matrix referred to by the specified index // - __forceinline const Vector4 getRow( int row ) const; + VECTORMATH_FORCE_INLINE const Vector4 getRow( int row ) const; // Subscripting operator to set or get a column // - __forceinline Vector4 & operator []( int col ); + VECTORMATH_FORCE_INLINE Vector4 & operator []( int col ); // Subscripting operator to get a column // - __forceinline const Vector4 operator []( int col ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator []( int col ) const; // Set the element of a 4x4 matrix referred to by column and row indices // - __forceinline Matrix4 & setElem( int col, int row, float val ); + VECTORMATH_FORCE_INLINE Matrix4 & setElem( int col, int row, float val ); // Set the element of a 4x4 matrix referred to by column and row indices (scalar data contained in vector data type) // - __forceinline Matrix4 & setElem( int col, int row, const floatInVec &val ); + VECTORMATH_FORCE_INLINE Matrix4 & setElem( int col, int row, const floatInVec &val ); // Get the element of a 4x4 matrix referred to by column and row indices // - __forceinline const floatInVec getElem( int col, int row ) const; + VECTORMATH_FORCE_INLINE const floatInVec getElem( int col, int row ) const; // Add two 4x4 matrices // - __forceinline const Matrix4 operator +( const Matrix4 & mat ) const; + VECTORMATH_FORCE_INLINE const Matrix4 operator +( const Matrix4 & mat ) const; // Subtract a 4x4 matrix from another 4x4 matrix // - __forceinline const Matrix4 operator -( const Matrix4 & mat ) const; + VECTORMATH_FORCE_INLINE const Matrix4 operator -( const Matrix4 & mat ) const; // Negate all elements of a 4x4 matrix // - __forceinline const Matrix4 operator -( ) const; + VECTORMATH_FORCE_INLINE const Matrix4 operator -( ) const; // Multiply a 4x4 matrix by a scalar // - __forceinline const Matrix4 operator *( float scalar ) const; + VECTORMATH_FORCE_INLINE const Matrix4 operator *( float scalar ) const; // Multiply a 4x4 matrix by a scalar (scalar data contained in vector data type) // - __forceinline const Matrix4 operator *( const floatInVec &scalar ) const; + VECTORMATH_FORCE_INLINE const Matrix4 operator *( const floatInVec &scalar ) const; // Multiply a 4x4 matrix by a 4-D vector // - __forceinline const Vector4 operator *( const Vector4 &vec ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator *( const Vector4 &vec ) const; // Multiply a 4x4 matrix by a 3-D vector // - __forceinline const Vector4 operator *( const Vector3 &vec ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator *( const Vector3 &vec ) const; // Multiply a 4x4 matrix by a 3-D point // - __forceinline const Vector4 operator *( const Point3 &pnt ) const; + VECTORMATH_FORCE_INLINE const Vector4 operator *( const Point3 &pnt ) const; // Multiply two 4x4 matrices // - __forceinline const Matrix4 operator *( const Matrix4 & mat ) const; + VECTORMATH_FORCE_INLINE const Matrix4 operator *( const Matrix4 & mat ) const; // Multiply a 4x4 matrix by a 3x4 transformation matrix // - __forceinline const Matrix4 operator *( const Transform3 & tfrm ) const; + VECTORMATH_FORCE_INLINE const Matrix4 operator *( const Transform3 & tfrm ) const; // Perform compound assignment and addition with a 4x4 matrix // - __forceinline Matrix4 & operator +=( const Matrix4 & mat ); + VECTORMATH_FORCE_INLINE Matrix4 & operator +=( const Matrix4 & mat ); // Perform compound assignment and subtraction by a 4x4 matrix // - __forceinline Matrix4 & operator -=( const Matrix4 & mat ); + VECTORMATH_FORCE_INLINE Matrix4 & operator -=( const Matrix4 & mat ); // Perform compound assignment and multiplication by a scalar // - __forceinline Matrix4 & operator *=( float scalar ); + VECTORMATH_FORCE_INLINE Matrix4 & operator *=( float scalar ); // Perform compound assignment and multiplication by a scalar (scalar data contained in vector data type) // - __forceinline Matrix4 & operator *=( const floatInVec &scalar ); + VECTORMATH_FORCE_INLINE Matrix4 & operator *=( const floatInVec &scalar ); // Perform compound assignment and multiplication by a 4x4 matrix // - __forceinline Matrix4 & operator *=( const Matrix4 & mat ); + VECTORMATH_FORCE_INLINE Matrix4 & operator *=( const Matrix4 & mat ); // Perform compound assignment and multiplication by a 3x4 transformation matrix // - __forceinline Matrix4 & operator *=( const Transform3 & tfrm ); + VECTORMATH_FORCE_INLINE Matrix4 & operator *=( const Transform3 & tfrm ); // Construct an identity 4x4 matrix // - static __forceinline const Matrix4 identity( ); + static VECTORMATH_FORCE_INLINE const Matrix4 identity( ); // Construct a 4x4 matrix to rotate around the x axis // - static __forceinline const Matrix4 rotationX( float radians ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotationX( float radians ); // Construct a 4x4 matrix to rotate around the y axis // - static __forceinline const Matrix4 rotationY( float radians ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotationY( float radians ); // Construct a 4x4 matrix to rotate around the z axis // - static __forceinline const Matrix4 rotationZ( float radians ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotationZ( float radians ); // Construct a 4x4 matrix to rotate around the x axis (scalar data contained in vector data type) // - static __forceinline const Matrix4 rotationX( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotationX( const floatInVec &radians ); // Construct a 4x4 matrix to rotate around the y axis (scalar data contained in vector data type) // - static __forceinline const Matrix4 rotationY( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotationY( const floatInVec &radians ); // Construct a 4x4 matrix to rotate around the z axis (scalar data contained in vector data type) // - static __forceinline const Matrix4 rotationZ( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotationZ( const floatInVec &radians ); // Construct a 4x4 matrix to rotate around the x, y, and z axes // - static __forceinline const Matrix4 rotationZYX( const Vector3 &radiansXYZ ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotationZYX( const Vector3 &radiansXYZ ); // Construct a 4x4 matrix to rotate around a unit-length 3-D vector // - static __forceinline const Matrix4 rotation( float radians, const Vector3 &unitVec ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotation( float radians, const Vector3 &unitVec ); // Construct a 4x4 matrix to rotate around a unit-length 3-D vector (scalar data contained in vector data type) // - static __forceinline const Matrix4 rotation( const floatInVec &radians, const Vector3 &unitVec ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotation( const floatInVec &radians, const Vector3 &unitVec ); // Construct a rotation matrix from a unit-length quaternion // - static __forceinline const Matrix4 rotation( const Quat &unitQuat ); + static VECTORMATH_FORCE_INLINE const Matrix4 rotation( const Quat &unitQuat ); // Construct a 4x4 matrix to perform scaling // - static __forceinline const Matrix4 scale( const Vector3 &scaleVec ); + static VECTORMATH_FORCE_INLINE const Matrix4 scale( const Vector3 &scaleVec ); // Construct a 4x4 matrix to perform translation // - static __forceinline const Matrix4 translation( const Vector3 &translateVec ); + static VECTORMATH_FORCE_INLINE const Matrix4 translation( const Vector3 &translateVec ); // Construct viewing matrix based on eye, position looked at, and up direction // - static __forceinline const Matrix4 lookAt( const Point3 &eyePos, const Point3 &lookAtPos, const Vector3 &upVec ); + static VECTORMATH_FORCE_INLINE const Matrix4 lookAt( const Point3 &eyePos, const Point3 &lookAtPos, const Vector3 &upVec ); // Construct a perspective projection matrix // - static __forceinline const Matrix4 perspective( float fovyRadians, float aspect, float zNear, float zFar ); + static VECTORMATH_FORCE_INLINE const Matrix4 perspective( float fovyRadians, float aspect, float zNear, float zFar ); // Construct a perspective projection matrix based on frustum // - static __forceinline const Matrix4 frustum( float left, float right, float bottom, float top, float zNear, float zFar ); + static VECTORMATH_FORCE_INLINE const Matrix4 frustum( float left, float right, float bottom, float top, float zNear, float zFar ); // Construct an orthographic projection matrix // - static __forceinline const Matrix4 orthographic( float left, float right, float bottom, float top, float zNear, float zFar ); + static VECTORMATH_FORCE_INLINE const Matrix4 orthographic( float left, float right, float bottom, float top, float zNear, float zFar ); }; // Multiply a 4x4 matrix by a scalar // -__forceinline const Matrix4 operator *( float scalar, const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const Matrix4 operator *( float scalar, const Matrix4 & mat ); // Multiply a 4x4 matrix by a scalar (scalar data contained in vector data type) // -__forceinline const Matrix4 operator *( const floatInVec &scalar, const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const Matrix4 operator *( const floatInVec &scalar, const Matrix4 & mat ); // Append (post-multiply) a scale transformation to a 4x4 matrix // NOTE: // Faster than creating and multiplying a scale transformation matrix. // -__forceinline const Matrix4 appendScale( const Matrix4 & mat, const Vector3 &scaleVec ); +VECTORMATH_FORCE_INLINE const Matrix4 appendScale( const Matrix4 & mat, const Vector3 &scaleVec ); // Prepend (pre-multiply) a scale transformation to a 4x4 matrix // NOTE: // Faster than creating and multiplying a scale transformation matrix. // -__forceinline const Matrix4 prependScale( const Vector3 &scaleVec, const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const Matrix4 prependScale( const Vector3 &scaleVec, const Matrix4 & mat ); // Multiply two 4x4 matrices per element // -__forceinline const Matrix4 mulPerElem( const Matrix4 & mat0, const Matrix4 & mat1 ); +VECTORMATH_FORCE_INLINE const Matrix4 mulPerElem( const Matrix4 & mat0, const Matrix4 & mat1 ); // Compute the absolute value of a 4x4 matrix per element // -__forceinline const Matrix4 absPerElem( const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const Matrix4 absPerElem( const Matrix4 & mat ); // Transpose of a 4x4 matrix // -__forceinline const Matrix4 transpose( const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const Matrix4 transpose( const Matrix4 & mat ); // Compute the inverse of a 4x4 matrix // NOTE: // Result is unpredictable when the determinant of mat is equal to or near 0. // -__forceinline const Matrix4 inverse( const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const Matrix4 inverse( const Matrix4 & mat ); // Compute the inverse of a 4x4 matrix, which is expected to be an affine matrix // NOTE: // This can be used to achieve better performance than a general inverse when the specified 4x4 matrix meets the given restrictions. The result is unpredictable when the determinant of mat is equal to or near 0. // -__forceinline const Matrix4 affineInverse( const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const Matrix4 affineInverse( const Matrix4 & mat ); // Compute the inverse of a 4x4 matrix, which is expected to be an affine matrix with an orthogonal upper-left 3x3 submatrix // NOTE: // This can be used to achieve better performance than a general inverse when the specified 4x4 matrix meets the given restrictions. // -__forceinline const Matrix4 orthoInverse( const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const Matrix4 orthoInverse( const Matrix4 & mat ); // Determinant of a 4x4 matrix // -__forceinline const floatInVec determinant( const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE const floatInVec determinant( const Matrix4 & mat ); // Conditionally select between two 4x4 matrices // NOTE: @@ -2241,13 +2251,13 @@ __forceinline const floatInVec determinant( const Matrix4 & mat ); // However, the transfer of select1 to a VMX register may use more processing time than a branch. // Use the boolInVec version for better performance. // -__forceinline const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, bool select1 ); +VECTORMATH_FORCE_INLINE const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, bool select1 ); // Conditionally select between two 4x4 matrices (scalar data contained in vector data type) // NOTE: // This function uses a conditional select instruction to avoid a branch. // -__forceinline const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, const boolInVec &select1 ); +VECTORMATH_FORCE_INLINE const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, const boolInVec &select1 ); #ifdef _VECTORMATH_DEBUG @@ -2255,13 +2265,13 @@ __forceinline const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Matrix4 & mat ); +VECTORMATH_FORCE_INLINE void print( const Matrix4 & mat ); // Print a 4x4 matrix and an associated string identifier // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Matrix4 & mat, const char * name ); +VECTORMATH_FORCE_INLINE void print( const Matrix4 & mat, const char * name ); #endif @@ -2277,220 +2287,220 @@ class Transform3 public: // Default constructor; does no initialization // - __forceinline Transform3( ) { }; + VECTORMATH_FORCE_INLINE Transform3( ) { }; // Copy a 3x4 transformation matrix // - __forceinline Transform3( const Transform3 & tfrm ); + VECTORMATH_FORCE_INLINE Transform3( const Transform3 & tfrm ); // Construct a 3x4 transformation matrix containing the specified columns // - __forceinline Transform3( const Vector3 &col0, const Vector3 &col1, const Vector3 &col2, const Vector3 &col3 ); + VECTORMATH_FORCE_INLINE Transform3( const Vector3 &col0, const Vector3 &col1, const Vector3 &col2, const Vector3 &col3 ); // Construct a 3x4 transformation matrix from a 3x3 matrix and a 3-D vector // - __forceinline Transform3( const Matrix3 & tfrm, const Vector3 &translateVec ); + VECTORMATH_FORCE_INLINE Transform3( const Matrix3 & tfrm, const Vector3 &translateVec ); // Construct a 3x4 transformation matrix from a unit-length quaternion and a 3-D vector // - __forceinline Transform3( const Quat &unitQuat, const Vector3 &translateVec ); + VECTORMATH_FORCE_INLINE Transform3( const Quat &unitQuat, const Vector3 &translateVec ); // Set all elements of a 3x4 transformation matrix to the same scalar value // - explicit __forceinline Transform3( float scalar ); + explicit VECTORMATH_FORCE_INLINE Transform3( float scalar ); // Set all elements of a 3x4 transformation matrix to the same scalar value (scalar data contained in vector data type) // - explicit __forceinline Transform3( const floatInVec &scalar ); + explicit VECTORMATH_FORCE_INLINE Transform3( const floatInVec &scalar ); // Assign one 3x4 transformation matrix to another // - __forceinline Transform3 & operator =( const Transform3 & tfrm ); + VECTORMATH_FORCE_INLINE Transform3 & operator =( const Transform3 & tfrm ); // Set the upper-left 3x3 submatrix // - __forceinline Transform3 & setUpper3x3( const Matrix3 & mat3 ); + VECTORMATH_FORCE_INLINE Transform3 & setUpper3x3( const Matrix3 & mat3 ); // Get the upper-left 3x3 submatrix of a 3x4 transformation matrix // - __forceinline const Matrix3 getUpper3x3( ) const; + VECTORMATH_FORCE_INLINE const Matrix3 getUpper3x3( ) const; // Set translation component // - __forceinline Transform3 & setTranslation( const Vector3 &translateVec ); + VECTORMATH_FORCE_INLINE Transform3 & setTranslation( const Vector3 &translateVec ); // Get the translation component of a 3x4 transformation matrix // - __forceinline const Vector3 getTranslation( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getTranslation( ) const; // Set column 0 of a 3x4 transformation matrix // - __forceinline Transform3 & setCol0( const Vector3 &col0 ); + VECTORMATH_FORCE_INLINE Transform3 & setCol0( const Vector3 &col0 ); // Set column 1 of a 3x4 transformation matrix // - __forceinline Transform3 & setCol1( const Vector3 &col1 ); + VECTORMATH_FORCE_INLINE Transform3 & setCol1( const Vector3 &col1 ); // Set column 2 of a 3x4 transformation matrix // - __forceinline Transform3 & setCol2( const Vector3 &col2 ); + VECTORMATH_FORCE_INLINE Transform3 & setCol2( const Vector3 &col2 ); // Set column 3 of a 3x4 transformation matrix // - __forceinline Transform3 & setCol3( const Vector3 &col3 ); + VECTORMATH_FORCE_INLINE Transform3 & setCol3( const Vector3 &col3 ); // Get column 0 of a 3x4 transformation matrix // - __forceinline const Vector3 getCol0( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol0( ) const; // Get column 1 of a 3x4 transformation matrix // - __forceinline const Vector3 getCol1( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol1( ) const; // Get column 2 of a 3x4 transformation matrix // - __forceinline const Vector3 getCol2( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol2( ) const; // Get column 3 of a 3x4 transformation matrix // - __forceinline const Vector3 getCol3( ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol3( ) const; // Set the column of a 3x4 transformation matrix referred to by the specified index // - __forceinline Transform3 & setCol( int col, const Vector3 &vec ); + VECTORMATH_FORCE_INLINE Transform3 & setCol( int col, const Vector3 &vec ); // Set the row of a 3x4 transformation matrix referred to by the specified index // - __forceinline Transform3 & setRow( int row, const Vector4 &vec ); + VECTORMATH_FORCE_INLINE Transform3 & setRow( int row, const Vector4 &vec ); // Get the column of a 3x4 transformation matrix referred to by the specified index // - __forceinline const Vector3 getCol( int col ) const; + VECTORMATH_FORCE_INLINE const Vector3 getCol( int col ) const; // Get the row of a 3x4 transformation matrix referred to by the specified index // - __forceinline const Vector4 getRow( int row ) const; + VECTORMATH_FORCE_INLINE const Vector4 getRow( int row ) const; // Subscripting operator to set or get a column // - __forceinline Vector3 & operator []( int col ); + VECTORMATH_FORCE_INLINE Vector3 & operator []( int col ); // Subscripting operator to get a column // - __forceinline const Vector3 operator []( int col ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator []( int col ) const; // Set the element of a 3x4 transformation matrix referred to by column and row indices // - __forceinline Transform3 & setElem( int col, int row, float val ); + VECTORMATH_FORCE_INLINE Transform3 & setElem( int col, int row, float val ); // Set the element of a 3x4 transformation matrix referred to by column and row indices (scalar data contained in vector data type) // - __forceinline Transform3 & setElem( int col, int row, const floatInVec &val ); + VECTORMATH_FORCE_INLINE Transform3 & setElem( int col, int row, const floatInVec &val ); // Get the element of a 3x4 transformation matrix referred to by column and row indices // - __forceinline const floatInVec getElem( int col, int row ) const; + VECTORMATH_FORCE_INLINE const floatInVec getElem( int col, int row ) const; // Multiply a 3x4 transformation matrix by a 3-D vector // - __forceinline const Vector3 operator *( const Vector3 &vec ) const; + VECTORMATH_FORCE_INLINE const Vector3 operator *( const Vector3 &vec ) const; // Multiply a 3x4 transformation matrix by a 3-D point // - __forceinline const Point3 operator *( const Point3 &pnt ) const; + VECTORMATH_FORCE_INLINE const Point3 operator *( const Point3 &pnt ) const; // Multiply two 3x4 transformation matrices // - __forceinline const Transform3 operator *( const Transform3 & tfrm ) const; + VECTORMATH_FORCE_INLINE const Transform3 operator *( const Transform3 & tfrm ) const; // Perform compound assignment and multiplication by a 3x4 transformation matrix // - __forceinline Transform3 & operator *=( const Transform3 & tfrm ); + VECTORMATH_FORCE_INLINE Transform3 & operator *=( const Transform3 & tfrm ); // Construct an identity 3x4 transformation matrix // - static __forceinline const Transform3 identity( ); + static VECTORMATH_FORCE_INLINE const Transform3 identity( ); // Construct a 3x4 transformation matrix to rotate around the x axis // - static __forceinline const Transform3 rotationX( float radians ); + static VECTORMATH_FORCE_INLINE const Transform3 rotationX( float radians ); // Construct a 3x4 transformation matrix to rotate around the y axis // - static __forceinline const Transform3 rotationY( float radians ); + static VECTORMATH_FORCE_INLINE const Transform3 rotationY( float radians ); // Construct a 3x4 transformation matrix to rotate around the z axis // - static __forceinline const Transform3 rotationZ( float radians ); + static VECTORMATH_FORCE_INLINE const Transform3 rotationZ( float radians ); // Construct a 3x4 transformation matrix to rotate around the x axis (scalar data contained in vector data type) // - static __forceinline const Transform3 rotationX( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Transform3 rotationX( const floatInVec &radians ); // Construct a 3x4 transformation matrix to rotate around the y axis (scalar data contained in vector data type) // - static __forceinline const Transform3 rotationY( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Transform3 rotationY( const floatInVec &radians ); // Construct a 3x4 transformation matrix to rotate around the z axis (scalar data contained in vector data type) // - static __forceinline const Transform3 rotationZ( const floatInVec &radians ); + static VECTORMATH_FORCE_INLINE const Transform3 rotationZ( const floatInVec &radians ); // Construct a 3x4 transformation matrix to rotate around the x, y, and z axes // - static __forceinline const Transform3 rotationZYX( const Vector3 &radiansXYZ ); + static VECTORMATH_FORCE_INLINE const Transform3 rotationZYX( const Vector3 &radiansXYZ ); // Construct a 3x4 transformation matrix to rotate around a unit-length 3-D vector // - static __forceinline const Transform3 rotation( float radians, const Vector3 &unitVec ); + static VECTORMATH_FORCE_INLINE const Transform3 rotation( float radians, const Vector3 &unitVec ); // Construct a 3x4 transformation matrix to rotate around a unit-length 3-D vector (scalar data contained in vector data type) // - static __forceinline const Transform3 rotation( const floatInVec &radians, const Vector3 &unitVec ); + static VECTORMATH_FORCE_INLINE const Transform3 rotation( const floatInVec &radians, const Vector3 &unitVec ); // Construct a rotation matrix from a unit-length quaternion // - static __forceinline const Transform3 rotation( const Quat &unitQuat ); + static VECTORMATH_FORCE_INLINE const Transform3 rotation( const Quat &unitQuat ); // Construct a 3x4 transformation matrix to perform scaling // - static __forceinline const Transform3 scale( const Vector3 &scaleVec ); + static VECTORMATH_FORCE_INLINE const Transform3 scale( const Vector3 &scaleVec ); // Construct a 3x4 transformation matrix to perform translation // - static __forceinline const Transform3 translation( const Vector3 &translateVec ); + static VECTORMATH_FORCE_INLINE const Transform3 translation( const Vector3 &translateVec ); }; // Append (post-multiply) a scale transformation to a 3x4 transformation matrix // NOTE: // Faster than creating and multiplying a scale transformation matrix. // -__forceinline const Transform3 appendScale( const Transform3 & tfrm, const Vector3 &scaleVec ); +VECTORMATH_FORCE_INLINE const Transform3 appendScale( const Transform3 & tfrm, const Vector3 &scaleVec ); // Prepend (pre-multiply) a scale transformation to a 3x4 transformation matrix // NOTE: // Faster than creating and multiplying a scale transformation matrix. // -__forceinline const Transform3 prependScale( const Vector3 &scaleVec, const Transform3 & tfrm ); +VECTORMATH_FORCE_INLINE const Transform3 prependScale( const Vector3 &scaleVec, const Transform3 & tfrm ); // Multiply two 3x4 transformation matrices per element // -__forceinline const Transform3 mulPerElem( const Transform3 & tfrm0, const Transform3 & tfrm1 ); +VECTORMATH_FORCE_INLINE const Transform3 mulPerElem( const Transform3 & tfrm0, const Transform3 & tfrm1 ); // Compute the absolute value of a 3x4 transformation matrix per element // -__forceinline const Transform3 absPerElem( const Transform3 & tfrm ); +VECTORMATH_FORCE_INLINE const Transform3 absPerElem( const Transform3 & tfrm ); // Inverse of a 3x4 transformation matrix // NOTE: // Result is unpredictable when the determinant of the left 3x3 submatrix is equal to or near 0. // -__forceinline const Transform3 inverse( const Transform3 & tfrm ); +VECTORMATH_FORCE_INLINE const Transform3 inverse( const Transform3 & tfrm ); // Compute the inverse of a 3x4 transformation matrix, expected to have an orthogonal upper-left 3x3 submatrix // NOTE: // This can be used to achieve better performance than a general inverse when the specified 3x4 transformation matrix meets the given restrictions. // -__forceinline const Transform3 orthoInverse( const Transform3 & tfrm ); +VECTORMATH_FORCE_INLINE const Transform3 orthoInverse( const Transform3 & tfrm ); // Conditionally select between two 3x4 transformation matrices // NOTE: @@ -2498,13 +2508,13 @@ __forceinline const Transform3 orthoInverse( const Transform3 & tfrm ); // However, the transfer of select1 to a VMX register may use more processing time than a branch. // Use the boolInVec version for better performance. // -__forceinline const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, bool select1 ); +VECTORMATH_FORCE_INLINE const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, bool select1 ); // Conditionally select between two 3x4 transformation matrices (scalar data contained in vector data type) // NOTE: // This function uses a conditional select instruction to avoid a branch. // -__forceinline const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, const boolInVec &select1 ); +VECTORMATH_FORCE_INLINE const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, const boolInVec &select1 ); #ifdef _VECTORMATH_DEBUG @@ -2512,13 +2522,13 @@ __forceinline const Transform3 select( const Transform3 & tfrm0, const Transform // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Transform3 & tfrm ); +VECTORMATH_FORCE_INLINE void print( const Transform3 & tfrm ); // Print a 3x4 transformation matrix and an associated string identifier // NOTE: // Function is only defined when _VECTORMATH_DEBUG is defined. // -__forceinline void print( const Transform3 & tfrm, const char * name ); +VECTORMATH_FORCE_INLINE void print( const Transform3 & tfrm, const char * name ); #endif