hkMatrix6.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_MATRIX6_H
  9. #define HK_MATH_MATRIX6_H
  10. #ifndef HK_MATH_MATH_H
  11. # error Please include Common/Base/hkBase.h instead of this file.
  12. #endif
  13. #define FOR_BOTH_SUB_VECTORS(code) m_lin.code; m_ang.code;
  14. class hkMatrix6;
  15. class hkVector8
  16. {
  17. public:
  18. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_MATH, hkVector8 );
  19. hkVector4 m_lin;
  20. hkVector4 m_ang;
  21. public:
  22. /// Sets all the hkVector4's components to the same value x.
  23. HK_FORCE_INLINE void setAll(hkReal x) { FOR_BOTH_SUB_VECTORS( setAll(x) ); } 
  24. /// Sets the xyz hkVector4's components to the same value x. The w component will be destroyed.
  25. HK_FORCE_INLINE void setAll6(hkReal x) { FOR_BOTH_SUB_VECTORS( setAll3(x) ); }
  26. /// Sets all values to zero.
  27. HK_FORCE_INLINE void setZero8() { FOR_BOTH_SUB_VECTORS( setZero4() ); }
  28. /// Modifies this hkVector4 by adding the value of a to it.  All four components are modified.
  29. HK_FORCE_INLINE void add8(const hkVector8& a) 
  30. {
  31. m_lin.add4( a.m_lin );
  32. m_ang.add4( a.m_ang );
  33. }
  34. /// Modifies this hkVector4 by adding the value of a to it.  Three components are modified, the w component is unspecified.
  35. HK_FORCE_INLINE void add6clobberW(const hkVector8& a)
  36. {
  37. m_lin.add3clobberW( a.m_lin );
  38. m_ang.add3clobberW( a.m_ang );
  39. }
  40. /// Sets this hkVector4 to be the difference of a and b. All four components are modified.
  41. HK_FORCE_INLINE void setSub8(const hkVector8& a, const hkVector8& b)
  42. {
  43. m_lin.setSub4( a.m_lin, b.m_lin );
  44. m_ang.setSub4( a.m_ang, b.m_ang );
  45. }
  46. /// Modifies this hkVector4 by setting it to be the product of itself with the real value a.  All four components are multiplied by a.
  47. HK_FORCE_INLINE void mul8(hkSimdRealParameter a) { FOR_BOTH_SUB_VECTORS( mul4(a) ); }
  48. /// Modifies this hkVector4 by setting x,y,z to -x,-y,-z and leaving w untouched
  49. HK_FORCE_INLINE void setNeg8() { m_lin.setNeg4(m_lin); m_ang.setNeg4(m_ang); }
  50. /// Modifies this hkVector4 by adding the product of real r and vector a to it.  All four components are modified.
  51. HK_FORCE_INLINE void addMul8(hkSimdRealParameter r, const hkVector8& a)
  52. {
  53. m_lin.addMul4( r, a.m_lin );
  54. m_ang.addMul4( r, a.m_ang );
  55. }
  56. /// Sets this object to be the product of the matrix a and the vector b.
  57. /// The w component of the result is undefined.  (this = a * b)
  58. HK_FORCE_INLINE void _setMul6(const hkMatrix6& a, const hkVector8& b );
  59. };
  60. class hkMatrix6
  61. {
  62. public:
  63. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_MATH, hkMatrix6);
  64. /// Empty constructor.  The elements of the matrix are not initialized.
  65. HK_FORCE_INLINE hkMatrix6() { }
  66. /// Copies all elements from a into this matrix.
  67. HK_FORCE_INLINE void operator= ( const hkMatrix6& a )
  68. {
  69. m_m[0][0] = a.m_m[0][0];
  70. m_m[0][1] = a.m_m[0][1];
  71. m_m[1][0] = a.m_m[1][0];
  72. m_m[1][1] = a.m_m[1][1];
  73. }
  74. // /// Gets read-write access to the specified element.
  75. //HK_FORCE_INLINE hkReal& operator() (int row, int col)
  76. //{
  77. // HK_ASSERT2(0xad67899d, row >= 0 && row < 6 && col >= 0 && col < 6, "Row and col of hkMatrix6 must be in the [0,5] range.");
  78. // return m_m[row/3][col/3](row%3,col%3);
  79. //}
  80. // /// Gets read-only access to the specified elements.
  81. //HK_FORCE_INLINE const hkReal& operator() (int row, int col) const
  82. //{
  83. // HK_ASSERT2(0xad67899d, row >= 0 && row < 6 && col >= 0 && col < 6, "Row and col of hkMatrix6 must be in the [0,5] range.");
  84. // return m_m[row/3][col/3](row%3,col%3);
  85. //}
  86. /// Zeroes all values in this matrix.
  87. HK_FORCE_INLINE void setZero()
  88. {
  89. m_m[0][0].setZero();
  90. m_m[0][1].setZero();
  91. m_m[1][0].setZero();
  92. m_m[1][1].setZero();
  93. }
  94. /// Sets the diagonal values to 1, zeroes the non-diagonal values.
  95. HK_FORCE_INLINE void setIdentity()
  96. {
  97. m_m[0][0].setIdentity();
  98. m_m[0][1].setZero();
  99. m_m[1][0].setZero();
  100. m_m[1][1].setIdentity();
  101. }
  102. /// set to the transpose of another matrix
  103. HK_FORCE_INLINE void setTranspose( const hkMatrix6& s )
  104. {
  105. m_m[0][0].setTranspose( s.m_m[0][0] );
  106. m_m[0][1].setTranspose( s.m_m[1][0] );
  107. m_m[1][0].setTranspose( s.m_m[0][1] );
  108. m_m[1][1].setTranspose( s.m_m[1][1] );
  109. }
  110. /// Set this matrix to be the product of a and b.  (this = a * b)
  111. HK_FORCE_INLINE void setMul( const hkMatrix6& a, const hkMatrix6& b )
  112. {
  113. hkMatrix3 tmp;
  114. // optimize ?
  115. for (int i = 0; i < 2; i++)
  116. {
  117. for (int j = 0; j < 2; j++)
  118. {
  119. tmp      ._setMul( a.m_m[i][0], b.m_m[0][j] );
  120. m_m[i][j]._setMul( a.m_m[i][1], b.m_m[1][j] );
  121. m_m[i][j]._add( tmp );
  122. }
  123. }
  124. }
  125. /// Modifies this matrix by adding the matrix a to it.  (this += a)
  126. HK_FORCE_INLINE void add( const hkMatrix6& a )
  127. {
  128. m_m[0][0]._add( a.m_m[0][0] );
  129. m_m[0][1]._add( a.m_m[0][1] );
  130. m_m[1][0]._add( a.m_m[1][0] );
  131. m_m[1][1]._add( a.m_m[1][1] );
  132. }
  133. /// Modifies this matrix by subtracting the matrix a from it.  (this += a)
  134. HK_FORCE_INLINE void sub( const hkMatrix6& a )
  135. {
  136. m_m[0][0]._sub( a.m_m[0][0] );
  137. m_m[0][1]._sub( a.m_m[0][1] );
  138. m_m[1][0]._sub( a.m_m[1][0] );
  139. m_m[1][1]._sub( a.m_m[1][1] );
  140. }
  141. /// Modifies this matrix by post multiplying it by the matrix a. (this = this*a)
  142. HK_FORCE_INLINE void mul( const hkMatrix6& a)
  143. {
  144. hkMatrix6 temp;
  145. temp.setMul( *this, a );
  146. *this = temp;
  147. }
  148. /// Modifies this matrix by multiplying by scale (this *= scale)
  149. HK_FORCE_INLINE void mul( hkSimdRealParameter scale )
  150. {
  151. m_m[0][0]._setMul(scale, m_m[0][0]);
  152. m_m[0][1]._setMul(scale, m_m[0][1]);
  153. m_m[1][0]._setMul(scale, m_m[1][0]);
  154. m_m[1][1]._setMul(scale, m_m[1][1]);
  155. }
  156. /// Inverts any invertible matrix; asserts upon failure; currently only works for symmetric matrices
  157. void setInvert( const hkMatrix6& in );
  158. public:
  159. HK_ALIGN16( hkMatrix3 m_m[2][2] ); // [row][column]
  160. };
  161. void hkVector8::_setMul6(const hkMatrix6& a, const hkVector8& b )
  162. {
  163. hkVector4 tmp[2];
  164. tmp[0] ._setMul3( a.m_m[0][0], b.m_lin );
  165. m_lin._setMul3( a.m_m[0][1], b.m_ang );
  166. tmp[1] ._setMul3( a.m_m[1][0], b.m_lin );
  167. m_ang._setMul3( a.m_m[1][1], b.m_ang );
  168. m_lin.add4(tmp[0]);
  169. m_ang.add4(tmp[1]);
  170. }
  171. extern "C"
  172. {
  173. void HK_CALL hkMatrix6Add(hkMatrix6& aOut, const hkMatrix6& b);
  174. void HK_CALL hkMatrix6Sub(hkMatrix6& aOut, const hkMatrix6& b);
  175. void HK_CALL hkMatrix6SetMul(hkMatrix6& out, const hkMatrix6&a, const hkMatrix6&b );
  176. void HK_CALL hkMatrix6SetMulV(hkVector8& out, const hkMatrix6&a, const hkVector8& b);
  177. void HK_CALL hkMatrix6SetTranspose(hkMatrix6& out, const hkMatrix6&in );
  178. void HK_CALL hkMatrix6SetInvert(hkMatrix6& out, const hkMatrix6& in );
  179. }
  180. #endif // HK_MATH_MATRIX6_H
  181. /*
  182. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  183. * Confidential Information of Havok.  (C) Copyright 1999-2009
  184. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  185. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  186. * rights, and intellectual property rights in the Havok software remain in
  187. * Havok and/or its suppliers.
  188. * Use of this software for evaluation purposes is subject to and indicates
  189. * acceptance of the End User licence Agreement for this product. A copy of
  190. * the license is included with this software and is also available at www.havok.com/tryhavok.
  191. */