hkSseMathTypes.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. #include <xmmintrin.h>
  9. #define HK_TRANSPOSE4(A,B,C,D) _MM_TRANSPOSE4_PS(A,B,C,D)
  10. #define HK_TRANSPOSE3(_a,_b,_c) { 
  11. hkQuadReal _tmp, _ctmp;
  12. _tmp = _mm_unpacklo_ps(_a,_b);
  13. HK_VECTOR4_SHUF(_ctmp,_mm_unpackhi_ps(_a,_b),_c,HK_VECTOR4_SHUFFLE(0,1,2,3));
  14. _a = _mm_movelh_ps(_tmp,_c);
  15. HK_VECTOR4_SHUF(_b,_mm_movehl_ps(_a,_tmp),_c,HK_VECTOR4_SHUFFLE(0,1,1,3));
  16. _c = _ctmp; }
  17. #define HK_VECTOR4_SHUFFLE(_a,_b,_c,_d) _MM_SHUFFLE(_d,_c,_b,_a)
  18. #define HK_VECTOR4_SHUF( tgt, src0, src1, shuf ) tgt = _mm_shuffle_ps(src0, src1, shuf)
  19. #define HK_VECTOR4_PERM1ARG(_a,_b,_c,_d) _MM_SHUFFLE(_d,_c,_b,_a)
  20. #define HK_VECTOR4_PERM1( tgt, src, shuf ) tgt = _mm_shuffle_ps(src, src, shuf)
  21. typedef __m128 hkQuadReal;
  22. class hkVector4;
  23. typedef const hkVector4& hkVector4Parameter;
  24. union hkQuadRealUnion
  25. {
  26. hkReal r[4];
  27. hkQuadReal q;
  28. };
  29. #define HK_QUADREAL_CONSTANT(a,b,c,d) {a,b,c,d}
  30. #define HK_SIMD_REAL(a) hkSimdReal(a)
  31. class hkSimdReal
  32. {
  33. public:
  34. hkSimdReal(const hkQuadReal& x)
  35. : m_real(x)
  36. {
  37. }
  38. hkSimdReal(hkReal x)
  39. {
  40. m_real = _mm_load_ss(&x);
  41. }
  42. hkSimdReal(){}
  43. operator hkReal() const
  44. {
  45. hkReal s;
  46. _mm_store_ss(&s, m_real);
  47. return s;
  48. }
  49. HK_FORCE_INLINE hkQuadReal broadcast() const
  50. {
  51. return _mm_shuffle_ps(m_real, m_real, 0);
  52. }
  53. HK_FORCE_INLINE const hkQuadReal& getQuad() const
  54. {
  55. return m_real;
  56. }
  57. private:
  58. hkQuadReal m_real;
  59. };
  60. typedef const hkSimdReal& hkSimdRealParameter;
  61. HK_FORCE_INLINE void hkSimdReal_setMax(  hkSimdRealParameter a, hkSimdRealParameter b, hkSimdReal& result ) 
  62. {
  63. result = hkSimdReal(_mm_max_ps( a.getQuad(), b.getQuad() ));
  64. }
  65. HK_FORCE_INLINE void hkSimdReal_setMin(  hkSimdRealParameter a, hkSimdRealParameter b, hkSimdReal& result ) 
  66. {
  67. result = hkSimdReal(_mm_min_ps( a.getQuad(), b.getQuad() ));
  68. }
  69. HK_FORCE_INLINE void hkSimdReal_store(  hkSimdRealParameter a, float *f) 
  70. {
  71. _mm_store_ss( f, a.getQuad() );
  72. }
  73. inline hkSimdReal HK_CALL operator* (hkSimdRealParameter r, hkSimdRealParameter s)
  74. {
  75. return _mm_mul_ss(r.getQuad(),s.getQuad());
  76. }
  77. inline hkSimdReal HK_CALL operator- (hkSimdRealParameter r, hkSimdRealParameter s)
  78. {
  79. return _mm_sub_ss(r.getQuad(),s.getQuad());
  80. }
  81. inline hkSimdReal HK_CALL operator+ (hkSimdRealParameter r, hkSimdRealParameter s)
  82. {
  83. return _mm_add_ss(r.getQuad(),s.getQuad());
  84. }
  85. inline hkSimdReal HK_CALL operator/ (hkSimdRealParameter r, hkSimdRealParameter s)
  86. {
  87. return _mm_div_ss(r.getQuad(),s.getQuad());
  88. }
  89. inline hkSimdReal HK_CALL operator- (hkSimdRealParameter r)
  90. {
  91.     extern const hkQuadReal hkQuadReal0000;
  92. return _mm_sub_ss(hkQuadReal0000,r.getQuad());
  93. }
  94. class hkVector4Comparison;
  95. typedef const hkVector4Comparison& hkVector4ComparisonParameter;
  96. /// Result of a hkVector4 comparison.
  97. class hkVector4Comparison;
  98. typedef const hkVector4Comparison& hkVector4ComparisonParameter;
  99. class hkVector4Comparison
  100. {
  101. public:
  102. enum Mask
  103. {
  104. MASK_NONE = 0,
  105. MASK_X = 1,
  106. MASK_Y = 2,
  107. MASK_XY = 3,
  108. MASK_Z = 4,
  109. MASK_XZ = 5,
  110. MASK_YZ = 6,
  111. MASK_XYZ = 7,
  112. MASK_W = 8,
  113. MASK_XW = 9,
  114. MASK_YW = 10,
  115. MASK_XYW = 11,
  116. MASK_ZW = 12,
  117. MASK_XZW = 13,
  118. MASK_YZW = 14,
  119. MASK_XYZW = 15
  120. };
  121. static const Mask s_components[4];
  122. HK_FORCE_INLINE void setAnd( hkVector4ComparisonParameter a, hkVector4ComparisonParameter b ) { m_mask = _mm_and_ps( a.m_mask,b.m_mask ); }
  123. HK_FORCE_INLINE void setOr( hkVector4ComparisonParameter a, hkVector4ComparisonParameter b ) { m_mask = _mm_or_ps( a.m_mask,b.m_mask ); }
  124. HK_FORCE_INLINE void setNot( hkVector4ComparisonParameter a )
  125. static HK_ALIGN16( const hkUint32 allBits[4] ) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
  126. m_mask = _mm_andnot_ps( a.m_mask, *(const hkQuadReal*)&allBits); 
  127. }
  128. HK_FORCE_INLINE void setSelect( hkVector4ComparisonParameter a, hkVector4ComparisonParameter b, hkVector4ComparisonParameter comp) 
  129. {
  130. m_mask = _mm_or_ps( _mm_and_ps(comp.m_mask, b.m_mask), _mm_andnot_ps(comp.m_mask, a.m_mask) );
  131. }
  132. static const hkQuadReal s_maskFromBits[MASK_XYZW+1];
  133. static const hkQuadReal s_invMaskFromBits[MASK_XYZW+1];
  134. HK_FORCE_INLINE void set( Mask m) { m_mask = s_maskFromBits[m]; }
  135. HK_FORCE_INLINE hkBool32 allAreSet( Mask m ) const { return (_mm_movemask_ps(m_mask) & m) == m; }
  136. HK_FORCE_INLINE hkBool32 anyIsSet( Mask m ) const { return _mm_movemask_ps(m_mask) & m; }
  137. HK_FORCE_INLINE hkBool32 allAreSet() const { return _mm_movemask_ps(m_mask) == MASK_XYZW; }
  138. HK_FORCE_INLINE hkBool32 anyIsSet() const { return _mm_movemask_ps(m_mask); }
  139. HK_FORCE_INLINE int getMask() const { return _mm_movemask_ps(m_mask); }
  140. HK_FORCE_INLINE int getMask(Mask m) const { return _mm_movemask_ps(m_mask) & m; }
  141. private:
  142. hkQuadReal m_mask;
  143. friend class hkVector4;
  144. };
  145. #define HK_SIMD_COMPARE_MASK_X 1
  146. extern const hkQuadReal hkQuadRealHalf;
  147. extern const hkQuadReal hkQuadReal3333;
  148. namespace hkMath
  149. {
  150. inline int HK_CALL isNegative(const hkSimdReal& r0)
  151. {
  152. return _mm_movemask_ps(r0.getQuad()) & hkVector4Comparison::MASK_X;
  153. }
  154. inline hkSimdReal HK_CALL sqrt(hkSimdRealParameter r)
  155. {
  156. return _mm_sqrt_ss(r.getQuad());
  157. }
  158. # define HK_MATH_hkToIntFast
  159. // Fast rounding, however last bit might be wrong
  160. inline int HK_CALL hkToIntFast( hkReal r ){
  161. int i;
  162. _asm {
  163. fld r
  164. fistp i
  165. }
  166. return i;
  167. }
  168. # define HK_MATH_prefetch128
  169. inline void prefetch128( const void* p)
  170. {
  171. _mm_prefetch( (const char*)p, _MM_HINT_NTA );
  172. }
  173. # define HK_MATH_forcePrefetch
  174. template<int SIZE>
  175. inline void forcePrefetch( const void* p )
  176. {
  177. const char* q = (const char*)p;
  178. _mm_prefetch( q, _MM_HINT_NTA );
  179. if ( SIZE > 64){  _mm_prefetch( q + 64, _MM_HINT_NTA ); }
  180. if ( SIZE > 128){ _mm_prefetch( q + 128, _MM_HINT_NTA ); }
  181. if ( SIZE > 192){ _mm_prefetch( q + 192, _MM_HINT_NTA ); }
  182. }
  183.     inline hkQuadReal quadReciprocal( hkQuadReal r )
  184.     {
  185. hkQuadReal e = _mm_rcp_ps( r );
  186. //One round of Newton-Raphson refinement
  187.         return _mm_sub_ps(_mm_add_ps(e,e), _mm_mul_ps(_mm_mul_ps(e, r), e));
  188.     }
  189.     inline hkQuadReal quadReciprocalSquareRoot( hkQuadReal r )
  190.     {
  191. hkQuadReal e = _mm_rsqrt_ps(r);
  192. hkQuadReal he = _mm_mul_ps(hkQuadRealHalf,e);
  193. hkQuadReal ree = _mm_mul_ps(_mm_mul_ps(r,e),e);
  194. return _mm_mul_ps(he, _mm_sub_ps(hkQuadReal3333, ree) );
  195.     }
  196. }
  197. /*
  198. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  199. * Confidential Information of Havok.  (C) Copyright 1999-2009
  200. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  201. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  202. * rights, and intellectual property rights in the Havok software remain in
  203. * Havok and/or its suppliers.
  204. * Use of this software for evaluation purposes is subject to and indicates
  205. * acceptance of the End User licence Agreement for this product. A copy of
  206. * the license is included with this software and is also available at www.havok.com/tryhavok.
  207. */