hkVector4.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 void hkVector4::operator=(const hkQuadReal& r)
  9. {
  10. getQuad() = r;
  11. }
  12. #ifndef HK_VECTOR4_setRotatedDir
  13. HK_FORCE_INLINE void hkVector4::setRotatedDir(const hkQuaternion& quat, const hkVector4& direction)
  14. {
  15. #if HK_CONFIG_SIMD == HK_CONFIG_SIMD_ENABLED
  16. hkVector4 minusHalf; minusHalf.getQuad() = hkQuadRealMinusHalf;
  17. hkVector4 qreal;
  18. qreal.setBroadcast(quat.m_vec, 3);
  19. hkVector4 q2minus1;
  20. q2minus1.setAddMul4( minusHalf, qreal, qreal );
  21. hkVector4 ret;
  22. ret.setMul4( direction, q2minus1 );
  23. hkVector4 imagDotDir; 
  24. imagDotDir.getQuad() = quat.getImag().dot3( direction ).getQuad();
  25. imagDotDir.broadcast(0);
  26. #else
  27. hkReal qreal = quat.m_vec(3);
  28. hkReal q2minus1 = qreal*qreal - 0.5f;
  29. hkVector4 ret;
  30. ret.setMul4( q2minus1, direction );
  31. hkReal imagDotDir = quat.getImag().dot3( direction );
  32. #endif
  33. ret.addMul4( imagDotDir, quat.getImag() ); 
  34. hkVector4 imagCrossDir;
  35. imagCrossDir.setCross( quat.getImag(), direction );
  36. ret.addMul4( qreal, imagCrossDir );
  37. this->setAdd4( ret, ret );
  38. }
  39. #endif
  40. inline void hkVector4::setRotatedInverseDir(const hkRotation& t, const hkVector4& v)
  41. {
  42. _setRotatedInverseDir(t,v);
  43. }
  44. #ifndef HK_VECTOR4_setRotatedInverseDir
  45. HK_FORCE_INLINE void hkVector4::setRotatedInverseDir(const hkQuaternion& quat, const hkVector4& direction)
  46. {
  47. #if HK_CONFIG_SIMD == HK_CONFIG_SIMD_ENABLED
  48. hkVector4 minusHalf; minusHalf.getQuad() = hkQuadRealMinusHalf;
  49. hkVector4 qreal;
  50. qreal.setBroadcast(quat.m_vec, 3);
  51. hkVector4 q2minus1;
  52. q2minus1.setAddMul4( minusHalf, qreal, qreal );
  53. hkVector4 ret;
  54. ret.setMul4( direction, q2minus1 );
  55. hkVector4 imagDotDir; 
  56. imagDotDir.getQuad() = quat.getImag().dot3( direction ).getQuad();
  57. imagDotDir.broadcast(0);
  58. #else
  59. hkReal qreal = quat.m_vec(3);
  60. hkReal q2minus1 = qreal*qreal - 0.5f;
  61. hkVector4 ret;
  62. ret.setMul4( q2minus1, direction );
  63. hkReal imagDotDir = quat.getImag().dot3( direction );
  64. #endif
  65. ret.addMul4( imagDotDir, quat.getImag() ); 
  66. hkVector4 imagCrossDir;
  67. imagCrossDir.setCross( direction, quat.getImag() );
  68. ret.addMul4( qreal, imagCrossDir );
  69. this->setAdd4( ret, ret );
  70. }
  71. #endif
  72. inline hkVector4Comparison hkVector4::compareGreaterThan4(hkVector4Parameter a) const
  73. {
  74. return a.compareLessThan4(*this);
  75. }
  76. inline hkVector4Comparison hkVector4::compareGreaterThanEqual4(hkVector4Parameter a) const
  77. {
  78. return a.compareLessThanEqual4(*this);
  79. }
  80. #ifndef HK_VECTOR4_setReciprocal3
  81. inline void hkVector4::setReciprocal3(const hkVector4& v)
  82. {
  83. hkVector4 v1111; v1111.getQuad() = hkQuadReal1111;
  84. hkVector4 tmp; tmp.setXYZW( v, v1111 );
  85. setReciprocal4(tmp);
  86. }
  87. #endif
  88. inline hkBool32 hkVector4::equals3(const hkVector4 &v, hkReal epsilon) const
  89. {
  90. //non_euclidean, manhattan based
  91. hkVector4 t;
  92. t.setSub4(*this, v);
  93. t.setAbs4( t );
  94. hkVector4 epsilon_v;
  95. epsilon_v.setAll3( epsilon );
  96. return t.compareLessThanEqual4( epsilon_v ).allAreSet( hkVector4Comparison::MASK_XYZ );
  97. }
  98. inline hkBool32 hkVector4::equals4(const hkVector4 &v, hkReal epsilon) const
  99. {
  100. //non_euclidean, manhattan based
  101. hkVector4 t;
  102. t.setSub4(*this, v);
  103. t.setAbs4( t );
  104. hkVector4 epsilon_v;
  105. epsilon_v.setAll(epsilon);
  106. return t.compareLessThanEqual4( epsilon_v ).allAreSet( hkVector4Comparison::MASK_XYZW );
  107. }
  108. inline int hkVector4::getMajorAxis() const
  109. {
  110. hkVector4 tmp;
  111. tmp.setAbs4(*this);
  112. return tmp(0) < tmp(1) ? (tmp(1) < tmp(2) ? 2 : 1) : (tmp(0) < tmp(2) ? 2 : 0);
  113. }
  114. inline const hkVector4& HK_CALL hkVector4::getZero()
  115. {
  116. extern hkVector4 hkVector4Zero;
  117. return hkVector4Zero;
  118. }
  119. #ifndef HK_VECTOR4_distanceTo3
  120. inline hkSimdReal hkVector4::distanceTo3(hkVector4Parameter p) const
  121. {
  122. hkVector4 d; d.setSub4(*this, p);
  123. return d.length3();
  124. }
  125. #endif
  126. inline hkResult hkVector4::normalize3IfNotZero ()
  127. {
  128. const hkReal lengthSqrd3 = this->lengthSquared3();
  129. if (lengthSqrd3 != 0.0f)
  130. {
  131. this->mul4( hkMath::sqrtInverse( lengthSqrd3 ) );
  132. return HK_SUCCESS;
  133. }
  134. return HK_FAILURE;
  135. }
  136. inline void hkVector4::load3(const hkReal* p)
  137. {
  138. hkVector4& v = *this;
  139. v(0) = p[0];
  140. v(1) = p[1];
  141. v(2) = p[2];
  142. }
  143. #ifndef HK_VECTOR4_load4
  144. inline void hkVector4::load4(const hkReal* p)
  145. {
  146. hkVector4& v = *this;
  147. v(0) = p[0];
  148. v(1) = p[1];
  149. v(2) = p[2];
  150. v(3) = p[3];
  151. }
  152. #endif
  153. inline void hkVector4::store3(hkReal* p) const
  154. {
  155. const hkVector4& v = *this;
  156. p[0] = v(0);
  157. p[1] = v(1);
  158. p[2] = v(2);
  159. }
  160. inline void hkVector4::store4(hkReal* p) const
  161. {
  162. const hkVector4& v = *this;
  163. p[0] = v(0);
  164. p[1] = v(1);
  165. p[2] = v(2);
  166. p[3] = v(3);
  167. }
  168. #ifndef HK_VECTOR4_load4a
  169. inline void hkVector4::load4a(const hkReal* p)
  170. {
  171. hkVector4& v = *this;
  172. v(0) = p[0];
  173. v(1) = p[1];
  174. v(2) = p[2];
  175. v(3) = p[3];
  176. }
  177. #endif
  178. #ifndef HK_VECTOR4_store4a
  179. inline void hkVector4::store4a(hkReal* p) const
  180. {
  181. const hkVector4& v = *this;
  182. p[0] = v(0);
  183. p[1] = v(1);
  184. p[2] = v(2);
  185. p[3] = v(3);
  186. }
  187. #endif
  188. /*
  189. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  190. * Confidential Information of Havok.  (C) Copyright 1999-2009
  191. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  192. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  193. * rights, and intellectual property rights in the Havok software remain in
  194. * Havok and/or its suppliers.
  195. * Use of this software for evaluation purposes is subject to and indicates
  196. * acceptance of the End User licence Agreement for this product. A copy of
  197. * the license is included with this software and is also available at www.havok.com/tryhavok.
  198. */