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

其他游戏

开发平台:

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. inline hkVector4& hkMatrix4::getColumn(int x)
  9. {
  10. return (&m_col0)[x];
  11. }
  12. inline const hkVector4& hkMatrix4::getColumn(int x) const
  13. {
  14. return (&m_col0)[x];
  15. }
  16. inline hkReal& hkMatrix4::operator() (int r, int c)
  17. {
  18. return getColumn(c)(r);
  19. }
  20. inline const hkReal& hkMatrix4::operator() (int r, int c) const
  21. {
  22. return getColumn(c)(r);
  23. }
  24. inline void hkMatrix4::setRows( const hkVector4& r0,
  25. const hkVector4& r1,
  26. const hkVector4& r2,
  27. const hkVector4& r3)
  28. {
  29. getColumn(0).set( r0(0), r1(0), r2(0), r3(0) );
  30. getColumn(1).set( r0(1), r1(1), r2(1), r3(1) );
  31. getColumn(2).set( r0(2), r1(2), r2(2), r3(2) );
  32. getColumn(3).set( r0(3), r1(3), r2(3), r3(3) );
  33. }
  34. inline void hkMatrix4::getRows( hkVector4& r0,
  35. hkVector4& r1,
  36. hkVector4& r2,
  37. hkVector4& r3) const
  38. {
  39. r0.set( getColumn(0)(0), getColumn(1)(0), getColumn(2)(0), getColumn(3)(0) );
  40. r1.set( getColumn(0)(1), getColumn(1)(1), getColumn(2)(1), getColumn(3)(1) );
  41. r2.set( getColumn(0)(2), getColumn(1)(2), getColumn(2)(2), getColumn(3)(2) );
  42. r3.set( getColumn(0)(3), getColumn(1)(3), getColumn(2)(3), getColumn(3)(3) );
  43. }
  44. inline void hkMatrix4::setCols( const hkVector4& r0,
  45. const hkVector4& r1,
  46. const hkVector4& r2,
  47. const hkVector4& r3)
  48. {
  49. m_col0 = r0;
  50. m_col1 = r1;
  51. m_col2 = r2;
  52. m_col3 = r3;
  53. }
  54. inline void hkMatrix4::operator= ( const hkMatrix4& a )
  55. {
  56. m_col0 = a.getColumn(0);
  57. m_col1 = a.getColumn(1);
  58. m_col2 = a.getColumn(2);
  59. m_col3 = a.getColumn(3);
  60. }
  61. inline void hkMatrix4::getCols( hkVector4& r0,
  62. hkVector4& r1,
  63. hkVector4& r2,
  64. hkVector4& r3) const
  65. {
  66. r0 = getColumn(0);
  67. r1 = getColumn(1);
  68. r2 = getColumn(2);
  69. r3 = getColumn(3);
  70. }
  71. inline void hkMatrix4::getRow( int row, hkVector4& r) const
  72. {
  73. r.set( getColumn(0)(row), getColumn(1)(row), getColumn(2)(row), getColumn(3)(row) );
  74. }
  75. inline void hkMatrix4::setZero()
  76. {
  77. getColumn(0).setZero4();
  78. getColumn(1).setZero4();
  79. getColumn(2).setZero4();
  80. getColumn(3).setZero4();
  81. }
  82. inline void hkMatrix4::setDiagonal( hkReal m00, hkReal m11, hkReal m22, hkReal m33 )
  83. {
  84. setZero();
  85. (*this)(0,0) = m00;
  86. (*this)(1,1) = m11;
  87. (*this)(2,2) = m22;
  88. (*this)(3,3) = m33;
  89. }
  90. inline void hkMatrix4::setIdentity()
  91. {
  92. setZero();
  93. hkReal one = 1.0f;
  94. (*this)(0,0) = one;
  95. (*this)(1,1) = one;
  96. (*this)(2,2) = one;
  97. (*this)(3,3) = one;
  98. }
  99. inline void hkMatrix4::transformPosition (const hkVector4& positionIn, hkVector4& positionOut) const
  100. {
  101. HK_WARN_IF(!isAffineTransformation(),0x872bbf1a, "Trying to transform a position by a 4x4 matrix not representing an affine transformation");
  102. hkVector4 xb; xb.setBroadcast(positionIn, 0);
  103. hkVector4 yb; yb.setBroadcast(positionIn, 1);
  104. hkVector4 zb; zb.setBroadcast(positionIn, 2);
  105. hkVector4 t0;
  106. t0.setMul4( xb, m_col0 );
  107. t0.addMul4( yb, m_col1 );
  108. t0.addMul4( zb, m_col2 );
  109. t0.add4(m_col3);
  110. positionOut = t0;
  111. }
  112. inline void hkMatrix4::multiplyVector (const hkVector4& v, hkVector4& resultOut) const
  113. {
  114. hkVector4 xb; xb.setBroadcast(v, 0);
  115. hkVector4 yb; yb.setBroadcast(v, 1);
  116. hkVector4 zb; zb.setBroadcast(v, 2);
  117. hkVector4 wb; wb.setBroadcast(v, 3);
  118. hkVector4 t0;
  119. t0.setMul4( xb, m_col0 );
  120. t0.addMul4( yb, m_col1 );
  121. t0.addMul4( zb, m_col2 );
  122. t0.addMul4( wb, m_col3 );
  123. resultOut = t0;
  124. }
  125. inline void hkMatrix4::transformDirection (const hkVector4& directionIn, hkVector4& directionOut) const
  126. {
  127. HK_WARN_IF(!isAffineTransformation(),0x872bbf1c, "Trying to transform a direction by a 4x4 matrix not representing an affine transformation");
  128. hkVector4 xb; xb.setBroadcast(directionIn, 0);
  129. hkVector4 yb; yb.setBroadcast(directionIn, 1);
  130. hkVector4 zb; zb.setBroadcast(directionIn, 2);
  131. hkVector4 t0;
  132. t0.setMul4( xb, m_col0 );
  133. t0.addMul4( yb, m_col1 );
  134. t0.addMul4( zb, m_col2 );
  135. directionOut = t0;
  136. }
  137. inline void hkMatrix4::setMulAffine ( const hkMatrix4& a, const hkMatrix4& b )
  138. {
  139. HK_WARN_IF(!a.isAffineTransformation(),0x872bbf1d, "Matrix A in setMulAffine() is not an affine transformation");
  140. HK_WARN_IF(!b.isAffineTransformation(),0x872bbf1e, "Matrix B in setMulAffine() is not an affine transformation");
  141. // We need to make it alias save
  142. hkVector4 col0; a.transformDirection(b.m_col0, col0);
  143. hkVector4 col1; a.transformDirection(b.m_col1, col1);
  144. hkVector4 col2; a.transformDirection(b.m_col2, col2);
  145. hkVector4 col3; a.transformPosition(b.m_col3, col3);
  146. m_col0 = col0; m_col1 = col1; m_col2 = col2; m_col3 = col3;
  147. }
  148. inline void hkMatrix4::mulAffine ( const hkMatrix4& a )
  149. {
  150. // SetMul is alias safe
  151. setMulAffine(*this, a);
  152. }
  153. inline const hkMatrix4& HK_CALL hkMatrix4::getIdentity()
  154. {
  155. extern hkMatrix4 hkMatrix4Identity;
  156. return hkMatrix4Identity;
  157. }
  158. /*
  159. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  160. * Confidential Information of Havok.  (C) Copyright 1999-2009
  161. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  162. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  163. * rights, and intellectual property rights in the Havok software remain in
  164. * Havok and/or its suppliers.
  165. * Use of this software for evaluation purposes is subject to and indicates
  166. * acceptance of the End User licence Agreement for this product. A copy of
  167. * the license is included with this software and is also available at www.havok.com/tryhavok.
  168. */