hkQsTransform.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_QSTRANSFORM_H
  9. #define HK_MATH_QSTRANSFORM_H
  10. #ifndef HK_MATH_MATH_H
  11. # error Please include Common/Base/hkBase.h instead of this file.
  12. #endif
  13. /// An hkQsTransform represents a T*R*S transformation where translation is
  14. /// represented with a vector4, rotation is represented with a quaternion and scale
  15. /// is represented with a vector4.
  16. /// When applied to a point (hkVector4::setTransformedPos()), the point is first scaled, then rotated and
  17. /// finally translated. 
  18. /// Direct read/write access to the three components of the hkQsTransform is available through he public
  19. /// members m_translation, m_rotation, m_scale. Const access can be done through get() methods.
  20. /// It is important to notice that, due to the nature of the TRS representation, and since not all affine
  21. /// transformations can be represented with an hkQsTransform, operations like multiplications have specific definitions 
  22. /// in order to keep the result inside the space of hkQsTransforms. 
  23. /// For more information about this, please check the Havok User Manual.
  24. class hkQsTransform
  25. {
  26. public:
  27. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_MATH, hkQsTransform);
  28. // This enum is used to specify a constructor that initializes to identity
  29. enum IdentityInitializer
  30. {
  31. IDENTITY,
  32. };
  33. // This enum is used to specify a constructor that initializes to zero
  34. enum ZeroInitializer
  35. {
  36. ZERO,
  37. };
  38. /// Default constructor - all elements are uninitialized.
  39. HK_FORCE_INLINE hkQsTransform() { }
  40. /// Constructor - hkQsTransform(hkQsTransform::IDENTITY) initializes to identity
  41. HK_FORCE_INLINE hkQsTransform(IdentityInitializer init);
  42. /// Constructor - hkQsTransform(hkQsTransform::ZERO) initializes to zero
  43. HK_FORCE_INLINE hkQsTransform(ZeroInitializer init);
  44. /// Creates a new hkQsTransform using the rotation r, translation t and scale s
  45. HK_FORCE_INLINE hkQsTransform(const hkVector4& translation, const hkQuaternion& rotation, const hkVector4& scale);
  46. /// Creates a new hkQsTransform using the rotation r, translation t. Sets scale to identity (1,1,1)
  47. HK_FORCE_INLINE hkQsTransform(const hkVector4& translation, const hkQuaternion& rotation);
  48. /// Copy constructor
  49. HK_FORCE_INLINE hkQsTransform(const hkQsTransform& other);
  50. /// Sets the hkQsTransform's values using the rotation quaternion q, translation t and scale s
  51. HK_FORCE_INLINE void set(const hkVector4& translation, const hkQuaternion& rotation, const hkVector4& scale);
  52. /// Sets this hkQsTransform to be the identity transform.
  53. HK_FORCE_INLINE void setIdentity();
  54. /// Returns a global identity transform.
  55. HK_FORCE_INLINE static const hkQsTransform& HK_CALL getIdentity();
  56. /// Gets the translation component.
  57. HK_FORCE_INLINE const hkVector4& getTranslation() const;
  58. /// Sets the translation component.
  59. HK_FORCE_INLINE void setTranslation(const hkVector4& t);
  60. /// Gets the scale component.
  61. HK_FORCE_INLINE const hkVector4& getScale() const;
  62. /// Sets the scale component.
  63. HK_FORCE_INLINE void setScale(const hkVector4& s);
  64. /// Gets the rotation component.
  65. HK_FORCE_INLINE const hkQuaternion& getRotation() const;
  66. /// Sets the rotation component (using a hkQuaternion).
  67. HK_FORCE_INLINE void setRotation(const hkQuaternion& rotation);
  68. /// Sets the rotation component (using a hkRotation).
  69. HK_FORCE_INLINE void setRotation(const hkRotation& rotation);
  70. /// Sets this transform  to a linear interpolation of the transforms a and b. 
  71. /// Quaternions are checked for polarity and the resulting rotation is normalized
  72. HK_FORCE_INLINE void setInterpolate4( const hkQsTransform& a, const hkQsTransform& b, hkSimdRealParameter t);
  73. /// Conversion from hkTransform. Assume no scale
  74. void setFromTransformNoScale (const hkTransform& transform);
  75. /// Conversion to hkTransform. Assume no scale
  76. void copyToTransformNoScale (hkTransform& transformOut) const;
  77. /// Conversion from hkTransform - scale.
  78. void setFromTransform (const hkTransform& transform);
  79. /// Conversion to hkTransform - scale.
  80. void copyToTransform (hkTransform& transformOut) const;
  81. /// Sets this transform to be the inverse of the given transform t.
  82. HK_FORCE_INLINE void setInverse( const hkQsTransform &t );
  83. /// Sets this transform to be the product of t1 and t2.  (this = t1 * t2)
  84. HK_FORCE_INLINE void setMul( const hkQsTransform &t1, const hkQsTransform &t2 );
  85. /// Sets this transform to be the product of the inverse of t1 by t2.  (this = t1^-1 * t2)
  86. HK_FORCE_INLINE void setMulInverseMul( const hkQsTransform& t1, const hkQsTransform &t2 );
  87. /// Sets this transform to be the product of t1 and the inverse of t2. (this = t1 * t2^-1)
  88. HK_FORCE_INLINE void setMulMulInverse( const hkQsTransform &t1, const hkQsTransform &t2 );
  89. /// Sets this transform to be the product of itself and the transform b.  (this *= b)
  90. HK_FORCE_INLINE void setMulEq( const hkQsTransform& b );
  91. /// Writes a 4x4 matrix suitable for rendering into p.
  92. void get4x4ColumnMajor(hkReal* p) const;
  93. /// Sets the components from a 4x4 matrix. Returns false if the matrix cannot be
  94. /// decomposed to form a proper hkQsTransform. 
  95. hkBool set4x4ColumnMajor(const hkReal* p);
  96. /// Checks for bad values (denormals or infinities).
  97. hkBool isOk() const;
  98. /// Checks if this transform is equal to the other within an optional epsilon.
  99. hkBool isApproximatelyEqual( const hkQsTransform& other, hkReal epsilon=1e-3f ) const;
  100. /*
  101. ** Blending operations
  102. */
  103. /// Prepares the qs transform for blending (sets all to zero)
  104. HK_FORCE_INLINE void setZero();
  105. /// Blends a weighted qs transform into this one.
  106. /// Quaternions are checked for polarity but the resulting rotation is NOT normalized.
  107. /// Start with a hkQsTransform with all zeros (including the quaternion).
  108. /// Call blendAddMul for each transform.
  109. /// Call blendNormalize or fastRenormalize when finished blending.
  110. HK_FORCE_INLINE void blendAddMul(const hkQsTransform& other,  hkSimdRealParameter weight = 1.0f );
  111. /// Renormalizes after blending. If a total weight is given,
  112. /// the whole transformation is weighted by 1.0f / total weight.
  113. /// Takes the "zero" cases into account.
  114. HK_FORCE_INLINE void blendNormalize( hkSimdRealParameter totalWeight = 1.0f);
  115. /// Renormalizes without error checking
  116. HK_FORCE_INLINE void fastRenormalize( hkSimdRealParameter totalWeight = 1.0f);
  117. /// Renormalizes a group of quaternions at once. This allows for some
  118. /// vector optimizations on different platforms.
  119. static void HK_CALL fastRenormalizeBatch( hkQsTransform* poseOut, hkReal* weight, hkUint32 numTransforms);
  120. public:
  121. /// Direct access to the translation component (vector4) of this hkQsTransform.
  122. /// Fourth component is not used.
  123. hkVector4 m_translation;
  124. /// Direct access to the rotation component (quaternion) of this hkQsTransform
  125. hkQuaternion m_rotation;
  126. /// Direct access to the scale component (vector4) of this hkQsTransform.
  127. /// The fourth component is not used.
  128. hkVector4 m_scale;
  129. };
  130. #endif //HK_MATH_QSTRANSFORM_H
  131. /*
  132. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  133. * Confidential Information of Havok.  (C) Copyright 1999-2009
  134. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  135. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  136. * rights, and intellectual property rights in the Havok software remain in
  137. * Havok and/or its suppliers.
  138. * Use of this software for evaluation purposes is subject to and indicates
  139. * acceptance of the End User licence Agreement for this product. A copy of
  140. * the license is included with this software and is also available at www.havok.com/tryhavok.
  141. */