hkMatrix4.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_MATRIX4_H
  9. #define HK_MATH_MATRIX4_H
  10. #ifndef HK_MATH_MATH_H
  11. # error Please include Common/Base/hkBase.h instead of this file.
  12. #endif
  13. /// A 4x4 matrix of hkReals, representing a transformation.
  14. /// This transform representation is used by tools, cloth and display libraries, as
  15. /// it can represent scale and skew.
  16. /// Elements are stored in column major format,
  17. /// i.e. contiguous memory locations are (x00, x10, x20, x30), (x01, x11,...) 
  18. /// where x10 means row 1, column 0 for example.
  19. /// For orthonormal transforms, use hkTransform instead (storage is equivalent).
  20. /// Some operations in hkMatrix4 are optimized for affine matrices (those where
  21. /// the last row is 0,0,0,1).
  22. class hkMatrix4
  23. {
  24. public:
  25. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_MATH, hkMatrix4);
  26. /// Empty constructor.  The elements of the matrix are not initialized.
  27. HK_FORCE_INLINE hkMatrix4() { }
  28. /// Gets a read-write reference to the i'th column.
  29. HK_FORCE_INLINE hkVector4& getColumn(int i);
  30. /// Gets a read-only reference to the i'th column.
  31. HK_FORCE_INLINE const hkVector4& getColumn(int i) const;
  32. /// Returns a copy of the i'th row.
  33. HK_FORCE_INLINE void getRow( int row, hkVector4& r) const;
  34. /// Gets read-write access to the specified element.
  35. HK_FORCE_INLINE hkReal& operator() (int row, int col);
  36. /// Gets read-only access to the specified elements.
  37. HK_FORCE_INLINE const hkReal& operator() (int row, int col) const;
  38. /// Sets all rows at once.
  39. HK_FORCE_INLINE void setRows( const hkVector4& r0, const hkVector4& r1, const hkVector4& r2, const hkVector4& r3);
  40. /// Writes the rows 0 to 3 in to the parameters r0, r1, r2, r3 respectively.
  41. HK_FORCE_INLINE void getRows( hkVector4& r0, hkVector4& r1, hkVector4& r2, hkVector4& r3) const;
  42. /// Sets all columns of the current matrix.  Where column is set to r0 and so on.
  43. HK_FORCE_INLINE void setCols( const hkVector4& c0, const hkVector4& c1, const hkVector4& c2, const hkVector4& c3);
  44. /// Writes the columns 0 to 3 into the parameters c0, c1, c2 and c3 respectively.
  45. HK_FORCE_INLINE void getCols( hkVector4& c0, hkVector4& c1, hkVector4& c2, hkVector4& c3) const;
  46. /// Zeroes all values in this matrix.
  47. HK_FORCE_INLINE void setZero();
  48. /// Sets the specified diagonal values, zeroes the non-diagonal values.
  49. HK_FORCE_INLINE void setDiagonal( hkReal m00, hkReal m11, hkReal m22, hkReal m33 = 1.0f );
  50. /// Sets the diagonal values to 1, zeroes the non-diagonal values.
  51. HK_FORCE_INLINE void setIdentity();
  52. /// Returns a global identity transform.
  53. HK_FORCE_INLINE static const hkMatrix4& HK_CALL getIdentity();
  54. /// Set the contents based on the given hkTransform. Will set the bottom row to (0,0,0,1) in this hkMatrix4 as 
  55. /// it is undefined in a hkTransform (not used)
  56. void set (const hkTransform& t);
  57. /// Configure the given transform with the content of self. As the transform is missing the bottom matrix row,
  58. /// it is simply discarded. Converting back and forth will thus not give the same matrix.
  59. void get (hkTransform& t) const;
  60. /// Writes a 4x4 matrix suitable for rendering into p.
  61. void get4x4ColumnMajor(hkReal* p) const;
  62. /// Reads a 4x4 matrix from p. 
  63. void set4x4ColumnMajor(const hkReal* p);
  64. /// Writes a 4x4 matrix suitable for rendering into p.
  65. void get4x4RowMajor(hkReal* p) const;
  66. /// Reads a 4x4 matrix from p. 
  67. void set4x4RowMajor(const hkReal* p);
  68. /// Checks if this matrix is equal to m within an optional epsilon.
  69. hkBool isApproximatelyEqual ( const hkMatrix4& m, hkReal epsilon=1e-3f ) const;
  70. /// Inverts the matrix. This function returns HK_SUCCESS if the determinant is greater than epsilon. Otherwise it returns HK_FAILURE and the matrix values are undefined.
  71. hkResult invert (hkReal epsilon);
  72. /// Sets the matrix to be the inverse of the given matrix. It returns HK_SUCCESS if the determinant is greater than epsilon. Otherwise it returns HK_FAILURE and the matrix values are undefined.
  73. hkResult setInverse (const hkMatrix4& m, hkReal epsilon);
  74. /// Transposes this matrix in place.
  75. void transpose();
  76. /// set to the transpose of another matrix
  77. void setTranspose( const hkMatrix4& s );
  78. /// (Assumes transforms are affine) Set this matrix to be the product of a and b.  (this = a * b)
  79. HK_FORCE_INLINE void setMulAffine ( const hkMatrix4& a, const hkMatrix4& b );
  80. /// (Non-affine version - slower) Set this matrix to be the product of a and b.  (this = a * b)
  81. void setMul ( const hkMatrix4& a, const hkMatrix4& b );
  82. /// (Assumes transforms are affine) Sets this matrix to be the product of a and the inverse of b.  (this = a * b^-1)
  83. void setMulInverseAffine (  const hkMatrix4& a, const hkMatrix4& b );
  84. /// (Non-affine version - slower) Sets this matrix to be the product of a and the inverse of b.  (this = a * b^-1)
  85. void setMulInverse (  const hkMatrix4& a, const hkMatrix4& b );
  86. /// Sets this matrix to be the product of a and scale (this = a * scale)
  87. void setMul( hkSimdRealParameter scale, const hkMatrix4& a );
  88. /// Modifies this matrix by adding the matrix a to it.  (this += a)
  89. void add ( const hkMatrix4& a );
  90. /// Modifies this matrix by subtracting the matrix a from it.  (this += a)
  91. void sub ( const hkMatrix4& a );
  92. /// (Assumes transforms are affine) Modifies this matrix by post multiplying it by the matrix a. (this = this*a)
  93. HK_FORCE_INLINE void mulAffine ( const hkMatrix4& a);
  94. /// (Non-affine version - slower) modifies this matrix by post multiplying it by the matrix a. (this = this*a)
  95. void mul ( const hkMatrix4& a);
  96. /// Modifies this matrix by multiplying by scale (this *= scale)
  97. void mul ( hkSimdRealParameter scale );
  98. /// Copies all elements from a into this matrix.
  99. inline void operator= ( const hkMatrix4& a );
  100. /// Checks for bad values (denormals or infinities)
  101. hkBool isOk() const;
  102. /// Checks whether the matrix represents an affine transformation (the 4th row is 0,0,0,1)
  103. hkBool32 isAffineTransformation() const;
  104. /// Forces the matrix to represent an affine transformation (resets the 4th row to 0,0,0,1)
  105. void resetFourthRow ();
  106. /// Transforms a position - assumes the the matrix represents an affine transform.
  107. HK_FORCE_INLINE void transformPosition (const hkVector4& positionIn, hkVector4& positionOut) const;
  108. /// Transforms a direction - assumes the matrix represents an affine transform.
  109. HK_FORCE_INLINE void transformDirection (const hkVector4& directionIn, hkVector4& directionOut) const;
  110. /// Multiplies a 4-element vector by this matrix4. Notice that the 4th component of the vector (w) is very relevant here.
  111. /// Use "transformPosition" or "transformDirection" to transform vectors representing positions or directions by matrices
  112. /// representing transformations.
  113. HK_FORCE_INLINE void multiplyVector (const hkVector4& vectorIn, hkVector4& resultOut) const;
  114. protected:
  115. hkVector4 m_col0;
  116. hkVector4 m_col1;
  117. hkVector4 m_col2;
  118. hkVector4 m_col3;
  119. };
  120. #endif // HK_MATH_MATRIX4_H
  121. /*
  122. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  123. * Confidential Information of Havok.  (C) Copyright 1999-2009
  124. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  125. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  126. * rights, and intellectual property rights in the Havok software remain in
  127. * Havok and/or its suppliers.
  128. * Use of this software for evaluation purposes is subject to and indicates
  129. * acceptance of the End User licence Agreement for this product. A copy of
  130. * the license is included with this software and is also available at www.havok.com/tryhavok.
  131. */