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

其他游戏

开发平台:

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_INTVECTOR_H
  9. #define HK_MATH_INTVECTOR_H
  10. #ifndef HK_MATH_MATH_H
  11. # error Please include Common/Base/hkBase.h instead of this file.
  12. #endif
  13. class hkIntVector;
  14. // Not all platforms support method declarations like
  15. // template<int idx> HK_FORCE_INLINE void foo();
  16. // But we need certain methods to use this because the parameters need to be known at compile to.
  17. // To get around this, we declare methods with both versions, but only one is allowed per platform
  18. # define HK_INT_VECTOR_USE_TEMPLATE
  19. // <ce.todo> Move to hkXxxMathTypes.inl
  20. #if defined (HK_PLATFORM_PS3_PPU) || defined (HK_PLATFORM_PS3_SPU)
  21. //typedef vector unsigned int hkQuadUint; // already taken care of in MathTypes
  22. typedef const hkIntVector hkIntVectorParameter;
  23. typedef vector unsigned char hkPermuteMask;
  24. #elif HK_CONFIG_SIMD == HK_CONFIG_SIMD_ENABLED && defined(HK_COMPILER_HAS_INTRINSICS_IA32)
  25. // SSE2 header
  26. # include <emmintrin.h>
  27. typedef __m128i hkQuadUint;
  28. typedef const hkIntVector& hkIntVectorParameter;
  29. typedef int hkPermuteMask;
  30. #else
  31. struct hkQuadUint { HK_ALIGN16(hkUint32 u32[4]); };
  32. typedef const hkIntVector& hkIntVectorParameter;
  33. typedef int hkPermuteMask;
  34. #endif
  35. // handy for fallback implementations
  36. union hkQuadUintUnion
  37. {
  38. hkUint32 u[4];
  39. hkQuadUint q;
  40. };
  41. union hkQuadIntUnion
  42. {
  43. hkInt32 u[4];
  44. hkQuadUint q;
  45. };
  46. union hkQuadShortUnion
  47. {
  48. hkUint16 u[8];
  49. hkQuadUint q;
  50. };
  51. union hkQuadCharUnion
  52. {
  53. hkUint8 u[16];
  54. hkQuadUint q;
  55. };
  56. /// Stores four hkUint32 in a SIMD friendly format.
  57. class hkIntVector
  58. {
  59. public:
  60. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_MATH, hkIntVector);
  61. /// Clear
  62. HK_FORCE_INLINE void setZero();
  63. /// Load from 16 byte aligned address.
  64. HK_FORCE_INLINE void loadAligned(const hkUint32* p);
  65. /// Load from 4 byte aligned address.
  66. HK_FORCE_INLINE void loadUnaligned4(const hkUint32* p);
  67. /// Store to an aligned address
  68. HK_FORCE_INLINE void store(void* p) const; // not yet implemented
  69. /// Store to an unaligned address
  70. HK_FORCE_INLINE void storeUnaligned(void* p) const; // not yet implemented
  71. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  72. template<int idx> HK_FORCE_INLINE void setBroadcast(hkIntVectorParameter v);
  73. #else
  74. HK_FORCE_INLINE void setBroadcast(hkIntVectorParameter v, int idx);
  75. #endif
  76. const hkQuadUint& getQuad() const;
  77. hkQuadUint& getQuad();
  78. /// Logical Ops
  79. HK_FORCE_INLINE void setNot( hkIntVectorParameter a );
  80. HK_FORCE_INLINE void setOr( hkIntVectorParameter a, hkIntVectorParameter b );
  81. HK_FORCE_INLINE void setAnd( hkIntVectorParameter a, hkIntVectorParameter b ); 
  82. HK_FORCE_INLINE void setXor( hkIntVectorParameter a, hkIntVectorParameter b );
  83. HK_FORCE_INLINE void setAndC( hkIntVectorParameter a, hkIntVectorParameter b );
  84. /// Comparison 
  85. // Will implement these as needed. There are potentially a LOT of functions to implement here
  86. //HK_FORCE_INLINE void setCompareEqual(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b );
  87. //HK_FORCE_INLINE void setCompareLessThan(S/U)(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b );
  88. //HK_FORCE_INLINE void setCompareLessThanEqual(S/U)(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b );
  89. //HK_FORCE_INLINE void setCompareGreaterThan(S/U)(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b );
  90. //HK_FORCE_INLINE void setCompareGreaterThanEqual(S/U)(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b );
  91. // Need to convert between comparison results and hkVector4Comparison masks easily
  92. /// Integer arithmetic
  93. // Will implement these as needed. 
  94. //HK_FORCE_INLINE void setAddSaturate(S/U)(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b ) 
  95. //HK_FORCE_INLINE void setSubSaturate(S/U)(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b ) 
  96. HK_FORCE_INLINE void setAddSaturateU32( hkIntVectorParameter a, hkIntVectorParameter b );
  97. HK_FORCE_INLINE void setAddSaturateU16( hkIntVectorParameter a, hkIntVectorParameter b );
  98. HK_FORCE_INLINE void setSubSaturateU32( hkIntVectorParameter a, hkIntVectorParameter b );
  99. HK_FORCE_INLINE void setSubSaturateU16( hkIntVectorParameter a, hkIntVectorParameter b );
  100. //HK_FORCE_INLINE void setAddS32( hkIntVectorParameter a, hkIntVectorParameter b );
  101. //HK_FORCE_INLINE void setSubS32( hkIntVectorParameter a, hkIntVectorParameter b );
  102. /// Min / Max
  103. //HK_FORCE_INLINE void setMin(S/U)(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b ) 
  104. //HK_FORCE_INLINE void setMax(S/U)(32/16/8)( hkIntVectorParameter a, hkIntVectorParameter b ) 
  105. /// Logical Rotate / Shift
  106. //HK_FORCE_INLINE void setShiftLeft(32/16/8)( hkIntVectorParameter a, int shift );
  107. //HK_FORCE_INLINE void setShiftRight(32/16/8)( hkIntVectorParameter a, int shift );
  108. //HK_FORCE_INLINE void setRotateLeft(32/16/8)( hkIntVectorParameter a, int shift );
  109. //HK_FORCE_INLINE void setRotateRight(32/16/8)( hkIntVectorParameter a, int shift );
  110. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  111. template<int shitf> HK_FORCE_INLINE void setShiftLeft32( hkIntVectorParameter a );
  112. template<int shitf> HK_FORCE_INLINE void setShiftRight32( hkIntVectorParameter a );
  113. #else
  114. HK_FORCE_INLINE void setShiftLeft32( hkIntVectorParameter a, int shift);
  115. HK_FORCE_INLINE void setShiftRight32( hkIntVectorParameter a, int shift );
  116. #endif
  117. HK_FORCE_INLINE void setShiftLeft32( hkIntVectorParameter a, hkIntVectorParameter shift );
  118. HK_FORCE_INLINE void setShiftRight32( hkIntVectorParameter a, hkIntVectorParameter shift );
  119. // Merge 
  120. HK_FORCE_INLINE void setMergeHigh32( hkIntVectorParameter a, hkIntVectorParameter b );
  121. HK_FORCE_INLINE void setMergeLow32( hkIntVectorParameter a, hkIntVectorParameter b );
  122. HK_FORCE_INLINE void setMergeHigh16( hkIntVectorParameter a, hkIntVectorParameter b );
  123. HK_FORCE_INLINE void setMergeLow16( hkIntVectorParameter a, hkIntVectorParameter b );
  124. HK_FORCE_INLINE void setMergeHigh8( hkIntVectorParameter a, hkIntVectorParameter b ); 
  125. HK_FORCE_INLINE void setMergeLow8( hkIntVectorParameter a, hkIntVectorParameter b ); 
  126. // Pack (unmerge)
  127. HK_FORCE_INLINE void setPackModuloU32( hkIntVectorParameter a, hkIntVectorParameter b );
  128. /// Select, Shuffle
  129. HK_FORCE_INLINE void setShuffle( hkPermuteMask perm, hkIntVectorParameter b ); // not yet implemented
  130. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  131. template<int A, int B, int C, int D> HK_FORCE_INLINE void setShuffle( hkIntVectorParameter a );
  132. #else
  133. HK_FORCE_INLINE void setShuffle( hkIntVectorParameter a, int A, int B, int C, int D );
  134. #endif
  135. ///  (~select & a) | (select & b)
  136. HK_FORCE_INLINE void setSelect( hkIntVectorParameter select, hkIntVectorParameter a, hkIntVectorParameter b ); // not yet implemented
  137. HK_FORCE_INLINE void select32(hkIntVectorParameter a, hkIntVectorParameter b, hkVector4ComparisonParameter selectMask);
  138. /// Splat Immediate
  139. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  140. template<int val> HK_FORCE_INLINE void splatImmediate32();
  141. template<int val> HK_FORCE_INLINE void splatImmediate16();
  142. template<int val> HK_FORCE_INLINE void splatImmediate8(); 
  143. #else
  144. HK_FORCE_INLINE void splatImmediate32( int val );
  145. HK_FORCE_INLINE void splatImmediate16( int val );
  146. HK_FORCE_INLINE void splatImmediate8 ( int val ); 
  147. #endif
  148. /// Convert to from fixed point
  149. HK_FORCE_INLINE void convertToF32fromS32( hkVector4& vOut ) const; 
  150. HK_FORCE_INLINE void convertToF32fromU32( hkVector4& vOut ) const;
  151. HK_FORCE_INLINE void convertFromF32toU32( hkVector4Parameter vIn );
  152. HK_FORCE_INLINE void convertFromF32toS32( hkVector4Parameter vIn ); // not yet implemented
  153. // Add versions with scaling if needed?
  154. private:
  155. hkQuadUint m_quad;
  156. public:
  157. operator hkQuadUint() const
  158. {
  159. return m_quad;
  160. }
  161. };
  162. #if HK_CONFIG_SIMD == HK_CONFIG_SIMD_ENABLED
  163. # if defined(HK_COMPILER_HAS_INTRINSICS_IA32)
  164. # include <Common/Base/Math/Vector/Sse/hkSseIntVector.inl>
  165. # elif defined(HK_PLATFORM_PS3_PPU) || defined(HK_PLATFORM_PS3_SPU)
  166. # include <Common/Base/Math/Vector/Ps3/hkPs3IntVector.inl>
  167. # elif defined(HK_PLATFORM_XBOX360)
  168. # include <Common/Base/Math/Vector/Xbox360/hkXbox360IntVector.inl>
  169. # else
  170. # include <Common/Base/Math/Vector/hkIntVector.inl>
  171. # endif
  172. #else
  173. # include <Common/Base/Math/Vector/hkIntVector.inl>
  174. #endif
  175. #endif //HK_MATH_INTVECTOR_H
  176. /*
  177. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  178. * Confidential Information of Havok.  (C) Copyright 1999-2009
  179. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  180. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  181. * rights, and intellectual property rights in the Havok software remain in
  182. * Havok and/or its suppliers.
  183. * Use of this software for evaluation purposes is subject to and indicates
  184. * acceptance of the End User licence Agreement for this product. A copy of
  185. * the license is included with this software and is also available at www.havok.com/tryhavok.
  186. */