hkMatrix3.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:8k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_MATH_MATRIX3_H
  9. #define HK_MATH_MATRIX3_H
  10. #ifndef HK_MATH_MATH_H
  11. # error Please include Common/Base/hkBase.h instead of this file.
  12. #endif
  13. /// A 3x3 matrix of hkReals.
  14. /// Due to alignment issues internal storage is 12 hkReals in a 4x3 matrix.
  15. /// Elements are stored in column major format.<br>
  16. /// i.e. contiguous memory locations are (x00, x10, x20, pad), (x01, x11,...) 
  17. /// where x10 means row 1, column 0 for example.
  18. class hkMatrix3
  19. {
  20. public:
  21. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_MATH, hkMatrix3);
  22. /// Empty constructor.  The elements of the matrix are not initialized.
  23. HK_FORCE_INLINE hkMatrix3() {}
  24. /// Copy matrix from 'other'.
  25. HK_FORCE_INLINE hkMatrix3( const hkMatrix3& other );
  26. /// Gets a read-write reference to the i'th column.
  27. HK_FORCE_INLINE hkVector4& getColumn(int i);
  28. /// Gets a read-only reference to the i'th column.
  29. HK_FORCE_INLINE const hkVector4& getColumn(int i) const;
  30. /// Returns a copy of the i'th row.
  31. HK_FORCE_INLINE void getRow( int row, hkVector4& r) const;
  32. /// Gets read-write access to the specified element.
  33. HK_FORCE_INLINE hkReal& operator() (int row, int col);
  34. /// Gets read-only access to the specified elements.
  35. HK_FORCE_INLINE const hkReal& operator() (int row, int col) const;
  36. /// Sets all rows at once.
  37. HK_FORCE_INLINE void setRows( const hkVector4& r0, const hkVector4& r1, const hkVector4& r2);
  38. /// Writes the rows 0 to 2 in to the parameters r0, r1 and r2 respectively.
  39. HK_FORCE_INLINE void getRows( hkVector4& r0, hkVector4& r1, hkVector4& r2) const;
  40. /// Sets all columns of the current matrix.  Where column is set to r0 and so on.
  41. HK_FORCE_INLINE void setCols( const hkVector4& r0, const hkVector4& r1, const hkVector4& r2);
  42. /// Writes the columns 0 to 2 into the parameters c0, c1 and c2 respectively.
  43. HK_FORCE_INLINE void getCols( hkVector4& r0, hkVector4& r1, hkVector4& r2) const;
  44. /// Zeroes all values in this matrix.
  45. HK_FORCE_INLINE void setZero();
  46. /// Sets the specified diagonal values, zeroes the non-diagonal values.
  47. HK_FORCE_INLINE void setDiagonal( hkReal m00, hkReal m11, hkReal m22 );
  48. /// Sets the diagonal values to 1, zeroes the non-diagonal values.
  49. HK_FORCE_INLINE void setIdentity();
  50. /// Returns a global identity matrix3.
  51. static const hkMatrix3& HK_CALL getIdentity();
  52. /// Checks if this matrix is equal to m within an optional epsilon.
  53. hkBool isApproximatelyEqual( const hkMatrix3& m, hkReal epsilon=1e-3f ) const;
  54. /// Checks if this matrix is symmetric to within an optional epsilon.
  55. bool isSymmetric( hkReal epsilon=1e-3f ) const;
  56. /// Sets this to be r star (cross skew symmetric of vector r).
  57. void setCrossSkewSymmetric( const hkVector4& r );
  58. /// Inverts the matrix. This function returns HK_SUCCESS if the determinant is greater than epsilon^3. Otherwise it returns HK_FAILURE and the matrix values are undefined.
  59. hkResult invert(hkReal epsilon);
  60. /// Inverts a symmetric matrix. This function assumes an invertible matrix
  61. void invertSymmetric();
  62. /// Inverts a symmetric matrix. This function assumes an invertible matrix
  63. HK_FORCE_INLINE void _invertSymmetric();
  64. // ///
  65. //void setRotatedDiagonalMatrix( const hkRotation &r, const hkVector4 &diagonalMatrix3 );
  66. /// Transposes this matrix in place.
  67. void transpose();
  68. /// set to the transpose of another matrix
  69. void setTranspose( const hkMatrix3& s );
  70. /// set to the transpose of another matrix
  71. HK_FORCE_INLINE void _setTranspose( const hkMatrix3& s );
  72. /// Set this matrix to be the product of a and b.  (this = a * b)
  73. void setMul( const hkMatrix3& a, const hkMatrix3& b );
  74. /// Set this matrix to be the product of a and b.  (this = a * b)
  75. HK_FORCE_INLINE void _setMul( const hkMatrix3& a, const hkMatrix3& b );
  76. /// Sets this matrix to be the product of a and the inverse of b.  (this = a * b^-1)
  77. void setMulInverse( const hkMatrix3& a, const hkRotation& b );
  78. /// Sets this matrix to be the product of the inverse of a and b.  (this = a^-1 * b)
  79. void setMulInverseMul( const hkRotation& a, const hkMatrix3& b );
  80. /// Sets this matrix to be the product of a and scale (this = a * scale)
  81. void setMul( hkSimdRealParameter scale, const hkMatrix3& a );
  82. /// Sets this matrix to be the product of a and scale (this = a * scale)
  83. HK_FORCE_INLINE void _setMul( hkSimdRealParameter scale, const hkMatrix3& a );
  84. /// Add the product of a and scale (this += a * scale)
  85. void addMul( hkSimdRealParameter scale, const hkMatrix3& a );
  86. /// Rotates this matrix by the rotation matrix t.  (this = t * this * t^-1)
  87. void changeBasis(const hkRotation& t);
  88. /// Modifies this matrix by adding the matrix a to it.  (this += a)
  89. void add( const hkMatrix3& a );
  90. /// Modifies this matrix by adding the matrix a to it.  (this += a)
  91. HK_FORCE_INLINE void _add( const hkMatrix3& a );
  92. /// Modifies this matrix by subtracting the matrix a from it.  (this += a)
  93. void sub( const hkMatrix3& a );
  94. /// Modifies this matrix by subtracting the matrix a from it.  (this += a)
  95. HK_FORCE_INLINE void _sub( const hkMatrix3& a );
  96. /// Modifies this matrix by post multiplying it by the matrix a. (this = this*a)
  97. void mul( const hkMatrix3& a);
  98. /// Modifies this matrix by multiplying by scale (this *= scale)
  99. void mul( hkSimdRealParameter scale );
  100. /// Copies all elements from a into this matrix.
  101. inline void operator= ( const hkMatrix3& a );
  102. /// Checks for bad values (denormals or infinities)
  103. hkBool isOk() const;
  104. /// Multiplies a 3-element vector by this 3x3 matrix. 
  105. HK_FORCE_INLINE void multiplyVector (const hkVector4& vectorIn, hkVector4& resultOut) const;
  106. /// Returns the determinant of this 3x3 matrix.
  107. hkSimdReal getDeterminant();
  108. /// Diagonalizes a symmetric matrix, returning the eigenvectors in the columns of eigenVec and the eigenvalues in eigenVal,
  109. /// with a specified tolerance epsilon and maximum number of iterations maxIter.
  110. /// Returns HK_SUCCESS if the fractional off-diagonal norm was reduced below the specified epsilon, otherwise HK_FAILURE. 
  111. hkResult diagonalizeSymmetric( hkMatrix3& eigenVec, hkVector4& eigenVal, int maxIter=5, hkReal epsilon=1e-4f ) const;
  112. protected:
  113. hkVector4 m_col0;
  114. hkVector4 m_col1;
  115. hkVector4 m_col2;
  116. };
  117. extern "C"
  118. {
  119. // implementation of _setMul as out of line function with C-binding
  120. void hkMatrix3_setMulMat3Mat3( hkMatrix3* thisMatrix, const hkMatrix3& aTb, const hkMatrix3& bTc );
  121. void hkMatrix3_invertSymmetric( hkMatrix3& thisMatrix );
  122. }
  123. #endif //HK_MATH_MATRIX3_H
  124. /*
  125. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  126. * Confidential Information of Havok.  (C) Copyright 1999-2009
  127. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  128. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  129. * rights, and intellectual property rights in the Havok software remain in
  130. * Havok and/or its suppliers.
  131. * Use of this software for evaluation purposes is subject to and indicates
  132. * acceptance of the End User licence Agreement for this product. A copy of
  133. * the license is included with this software and is also available at www.havok.com/tryhavok.
  134. */