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

其他游戏

开发平台:

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. void hkQsTransform::setIdentity()
  9. {
  10. m_translation.setZero4();
  11. m_rotation.setIdentity();
  12. m_scale.setAll(1.0f);
  13. }
  14. void hkQsTransform::setZero()
  15. {
  16. m_translation.setZero4();
  17. m_rotation.m_vec.setZero4();
  18. m_scale.setZero4();
  19. }
  20. const hkVector4& hkQsTransform::getTranslation() const
  21. {
  22. return m_translation;
  23. }
  24. void hkQsTransform::setTranslation(const hkVector4& t)
  25. {
  26. m_translation = t;
  27. }
  28. const hkQuaternion& hkQsTransform::getRotation() const
  29. {
  30. return m_rotation;
  31. }
  32. void hkQsTransform::setRotation(const hkRotation& rotation)
  33. {
  34. m_rotation.set(rotation);
  35. }
  36. void hkQsTransform::setRotation(const hkQuaternion& rotation)
  37. {
  38. m_rotation = rotation;
  39. }
  40. const hkVector4& hkQsTransform::getScale() const
  41. {
  42. return m_scale;
  43. }
  44. void hkQsTransform::setScale(const hkVector4& s)
  45. {
  46. m_scale = s;
  47. }
  48. hkQsTransform::hkQsTransform(const hkQsTransform& t)
  49. {
  50. m_translation = t.m_translation;
  51. m_rotation = t.m_rotation;
  52. m_scale = t.m_scale;
  53. }
  54. hkQsTransform::hkQsTransform( IdentityInitializer /*init*/ )
  55. {
  56. setIdentity();
  57. }
  58. hkQsTransform::hkQsTransform( ZeroInitializer /*init*/ )
  59. {
  60. setZero();
  61. }
  62. hkQsTransform::hkQsTransform(const hkVector4& translation, const hkQuaternion& rotation, const hkVector4& scale)
  63. : m_translation(translation), m_rotation(rotation), m_scale(scale)
  64. {
  65. }
  66. hkQsTransform::hkQsTransform(const hkVector4& translation, const hkQuaternion& rotation)
  67. : m_translation(translation), m_rotation(rotation)
  68. {
  69. m_scale.setAll(1.0f);
  70. }
  71. void hkQsTransform::set(const hkVector4& translation, const hkQuaternion& rotation, const hkVector4& scale)
  72. {
  73. m_translation = translation;
  74. m_rotation = rotation;
  75. m_scale = scale;
  76. }
  77. const hkQsTransform& HK_CALL hkQsTransform::getIdentity()
  78. {
  79. extern hkQsTransform hkQsTransformIdentity;
  80. return hkQsTransformIdentity;
  81. }
  82. void hkQsTransform::setInverse( const hkQsTransform& t )
  83. {
  84. // We are not "reference-safe" because quaternion inversion is not reference-safe
  85. HK_ASSERT2(0x1acceb8d, (&t != this) , "Using unsafe references in math operation");
  86. m_translation.setRotatedInverseDir(t.m_rotation, t.m_translation);
  87. m_translation.setNeg4(m_translation);
  88. m_rotation.setInverse(t.m_rotation);
  89. hkVector4 invScale; invScale.setReciprocal3( t.m_scale );
  90. m_scale.setXYZ0( invScale );
  91. }
  92. void hkQsTransform::setInterpolate4( const hkQsTransform& a, const hkQsTransform& b, hkSimdRealParameter t)
  93. {
  94. m_scale.setInterpolate4(a.m_scale, b.m_scale, t);
  95. m_translation.setInterpolate4(a.m_translation, b.m_translation, t);
  96. const hkReal oneMinusT = 1.0f - hkReal(t);
  97. // Check quaternion polarity
  98. const hkReal signedT = ( a.m_rotation.m_vec.dot4(b.m_rotation.m_vec) < 0.0f ) ? -t : t;
  99. hkQuaternion out;
  100. out.m_vec.setMul4( HK_SIMD_REAL(signedT), b.m_rotation.m_vec);
  101. out.m_vec.addMul4( HK_SIMD_REAL(oneMinusT), a.m_rotation.m_vec);
  102. out.normalize();
  103. m_rotation = out;
  104. }
  105. /*
  106. ** Blending stuff
  107. */
  108. void hkQsTransform::blendAddMul(const hkQsTransform& other, hkSimdRealParameter weight)
  109. {
  110. m_translation.addMul4(weight, other.m_translation);
  111. m_scale.addMul4(weight, other.m_scale);
  112. // Check quaternion polarity
  113. #if defined(HK_PLATFORM_XBOX360) || ( defined(HK_PLATFORM_PS3_PPU) && !defined(HK_PLATFORM_SPU) )
  114. hkVector4 negRotation; negRotation.setNeg4(other.m_rotation.m_vec);
  115. hkVector4 dotVec; dotVec.getQuad() = m_rotation.m_vec.dot4(other.m_rotation.m_vec).getQuad();
  116. hkVector4Comparison mask = dotVec.compareLessThanZero4();
  117. hkVector4 polarityRotation; polarityRotation.select32( other.m_rotation.m_vec, negRotation, mask );
  118. m_rotation.m_vec.addMul4(weight, polarityRotation);
  119. #else
  120. const hkSimdReal signedWeight = ( m_rotation.m_vec.dot4(other.m_rotation.m_vec) < 0.0f )? -weight : weight;
  121. m_rotation.m_vec.addMul4( signedWeight, other.m_rotation.m_vec );
  122. #endif
  123. }
  124. void hkQsTransform::blendNormalize( hkSimdRealParameter totalWeight )
  125. {
  126. // If weight is almost zero, blend is identity
  127. if (hkMath::fabs(totalWeight) < HK_REAL_EPSILON )
  128. {
  129. setIdentity();
  130. return;
  131. }
  132. // Weight all accumulators by inverse 
  133. {
  134. const hkSimdReal invWeight = HK_SIMD_REAL(1.0f) / totalWeight;
  135. m_translation.mul4(invWeight);
  136.     
  137. m_scale.mul4(invWeight);
  138. }
  139. // Now, check for the special cases
  140. // Rotation
  141. {
  142. const hkReal quatNorm = m_rotation.m_vec.lengthSquared4();
  143. if (quatNorm < HK_REAL_EPSILON)
  144. {
  145. // no rotations blended (or cancelled each other) -> set to identity
  146. m_rotation.setIdentity();
  147. }
  148. else
  149. {
  150. // normalize
  151. m_rotation.normalize();
  152. }
  153. }
  154. // Scale
  155. {
  156. const hkReal scaleNorm = m_scale.lengthSquared3();
  157. if (scaleNorm < HK_REAL_EPSILON)
  158. {
  159. // no scale blended (or scale cancelled each other) -> set to identity
  160. m_scale.setAll(1.0f);
  161. }
  162. }
  163. }
  164. void hkQsTransform::fastRenormalize( hkSimdRealParameter totalWeight )
  165. {
  166. const hkSimdReal invWeight = HK_SIMD_REAL(1.0f) / totalWeight;
  167. m_translation.mul4(invWeight);
  168. m_scale.mul4(invWeight);
  169. m_rotation.normalize();
  170. }
  171. // aTc = aTb * bTc
  172. void hkQsTransform::setMul( const hkQsTransform& aTb, const hkQsTransform& bTc )
  173. {
  174. // Rotation and position go together
  175. hkVector4 extraTrans;
  176. extraTrans.setRotatedDir(aTb.m_rotation, bTc.m_translation);
  177. m_translation.setAdd4(aTb.m_translation, extraTrans);
  178. m_rotation.setMul(aTb.m_rotation, bTc.m_rotation);
  179. // Scale goes apart
  180. m_scale.setMul4(aTb.m_scale, bTc.m_scale);
  181. }
  182. void hkQsTransform::setMulInverseMul( const hkQsTransform& a, const hkQsTransform &b )
  183. {
  184. hkQsTransform h;
  185. h.setInverse( a );
  186. setMul(h, b);
  187. }
  188. void hkQsTransform::setMulMulInverse( const hkQsTransform &a, const hkQsTransform &b )
  189. {
  190. hkQsTransform h;
  191. h.setInverse( b );
  192. setMul( a, h);
  193. }
  194. void hkQsTransform::setMulEq( const hkQsTransform& b )
  195. {
  196. // We are not "reference-safe" because quaternion multiplication is not reference-safe
  197. HK_ASSERT2(0x1acceb8d, (&b!=this) , "Using unsafe references in math operation");
  198. // Rotation and position go together
  199. hkVector4 extraTrans;
  200. extraTrans.setRotatedDir(m_rotation, b.m_translation);
  201. m_translation.add4(extraTrans);
  202. m_rotation.mul(b.m_rotation);
  203. // Scale goes apart
  204. m_scale.mul4(b.m_scale);
  205. }
  206. /*
  207. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  208. * Confidential Information of Havok.  (C) Copyright 1999-2009
  209. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  210. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  211. * rights, and intellectual property rights in the Havok software remain in
  212. * Havok and/or its suppliers.
  213. * Use of this software for evaluation purposes is subject to and indicates
  214. * acceptance of the End User licence Agreement for this product. A copy of
  215. * the license is included with this software and is also available at www.havok.com/tryhavok.
  216. */