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

其他游戏

开发平台:

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. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  9. #define HK_INT_VECTOR_COMPILE_TIME_ASSERT(X) HK_COMPILE_TIME_ASSERT(X)
  10. #else
  11. #define HK_INT_VECTOR_COMPILE_TIME_ASSERT(X)
  12. #endif
  13. //
  14. // Clearing, loading, and storing
  15. //
  16. inline void hkIntVector::setZero()
  17. {
  18. hkQuadUintUnion qu;
  19. qu.u[0] = 0;
  20. qu.u[1] = 0;
  21. qu.u[2] = 0;
  22. qu.u[3] = 0;
  23. m_quad = qu.q;
  24. }
  25. inline void hkIntVector::loadUnaligned4(const hkUint32* p)
  26. {
  27. HK_ASSERT2(0x612f84c7, ((hkUlong)p & 3) == 0, "pointer for hkIntVector::loadUnaligned4 must be 4-byte aligned");
  28. hkQuadUintUnion qu;
  29. qu.u[0] = p[0];
  30. qu.u[1] = p[1];
  31. qu.u[2] = p[2];
  32. qu.u[3] = p[3];
  33. this->m_quad = qu.q;
  34. }
  35. //
  36. // Logical operations
  37. //
  38. inline void hkIntVector::setNot(hkIntVectorParameter a)
  39. {
  40. hkQuadUintUnion qu, qa;
  41. qa.q = a;
  42. qu.u[0] = ~qa.u[0];
  43. qu.u[1] = ~qa.u[1];
  44. qu.u[2] = ~qa.u[2];
  45. qu.u[3] = ~qa.u[3];
  46. this->m_quad = qu.q;
  47. }
  48. inline void hkIntVector::setOr(hkIntVectorParameter a, hkIntVectorParameter b)
  49. {
  50. hkQuadUintUnion qu, qa, qb;
  51. qa.q = a;
  52. qb.q = b;
  53. qu.u[0] = qa.u[0] | qb.u[0];
  54. qu.u[1] = qa.u[1] | qb.u[1];
  55. qu.u[2] = qa.u[2] | qb.u[2];
  56. qu.u[3] = qa.u[3] | qb.u[3];
  57. this->m_quad = qu.q;
  58. }
  59. inline void hkIntVector::setAnd(hkIntVectorParameter a, hkIntVectorParameter b)
  60. {
  61. hkQuadUintUnion qu, qa, qb;
  62. qa.q = a;
  63. qb.q = b;
  64. qu.u[0] = qa.u[0] & qb.u[0];
  65. qu.u[1] = qa.u[1] & qb.u[1];
  66. qu.u[2] = qa.u[2] & qb.u[2];
  67. qu.u[3] = qa.u[3] & qb.u[3];
  68. this->m_quad = qu.q;
  69. }
  70. inline void hkIntVector::setXor(hkIntVectorParameter a, hkIntVectorParameter b)
  71. {
  72. hkQuadUintUnion qu, qa, qb;
  73. qa.q = a;
  74. qb.q = b;
  75. qu.u[0] = qa.u[0] ^ qb.u[0];
  76. qu.u[1] = qa.u[1] ^ qb.u[1];
  77. qu.u[2] = qa.u[2] ^ qb.u[2];
  78. qu.u[3] = qa.u[3] ^ qb.u[3];
  79. this->m_quad = qu.q;
  80. }
  81. inline void hkIntVector::setAndC(hkIntVectorParameter a, hkIntVectorParameter b)
  82. {
  83. hkQuadUintUnion qu, qa, qb;
  84. qa.q = a;
  85. qb.q = b;
  86. qu.u[0] = qa.u[0] & ~qb.u[0];
  87. qu.u[1] = qa.u[1] & ~qb.u[1];
  88. qu.u[2] = qa.u[2] & ~qb.u[2];
  89. qu.u[3] = qa.u[3] & ~qb.u[3];
  90. this->m_quad = qu.q;
  91. }
  92. //
  93. // Arithmetic operations
  94. //
  95. inline void hkIntVector::setAddSaturateU32( hkIntVectorParameter a, hkIntVectorParameter b )
  96. {
  97. hkQuadUintUnion qu, qa, qb;
  98. qa.q = a; qb.q = b;
  99. const hkUint32 max = hkUint32(-1);
  100. qu.u[0] = (qa.u[0] < max - qb.u[0]) ? (qa.u[0] + qb.u[0]) : max; 
  101. qu.u[1] = (qa.u[1] < max - qb.u[1]) ? (qa.u[1] + qb.u[1]) : max; 
  102. qu.u[2] = (qa.u[2] < max - qb.u[2]) ? (qa.u[2] + qb.u[2]) : max; 
  103. qu.u[3] = (qa.u[3] < max - qb.u[3]) ? (qa.u[3] + qb.u[3]) : max; 
  104. m_quad = qu.q;
  105. }
  106. inline void hkIntVector::setAddSaturateU16( hkIntVectorParameter a, hkIntVectorParameter b )
  107. {
  108. hkQuadShortUnion qu, qa, qb;
  109. qa.q = a; qb.q = b; qu.q = a;
  110. const hkUint16 max = hkUint16(-1);
  111. for (int i=0; i<8; i++)
  112. {
  113. qu.u[i] = (qa.u[i] < max - qb.u[i]) ? (qa.u[i] + qb.u[i]) : max; 
  114. }
  115. m_quad = qu.q;
  116. }
  117. inline void hkIntVector::setSubSaturateU32( hkIntVectorParameter a, hkIntVectorParameter b )
  118. {
  119. hkQuadUintUnion qu, qa, qb;
  120. qa.q = a; qb.q = b;
  121. qu.u[0] = (qa.u[0] > qb.u[0]) ? (qa.u[0] - qb.u[0]) : 0; 
  122. qu.u[1] = (qa.u[1] > qb.u[1]) ? (qa.u[1] - qb.u[1]) : 0; 
  123. qu.u[2] = (qa.u[2] > qb.u[2]) ? (qa.u[2] - qb.u[2]) : 0; 
  124. qu.u[3] = (qa.u[3] > qb.u[3]) ? (qa.u[3] - qb.u[3]) : 0; 
  125. m_quad = qu.q;
  126. }
  127. inline void hkIntVector::setSubSaturateU16( hkIntVectorParameter a, hkIntVectorParameter b )
  128. {
  129. hkQuadShortUnion qu, qa, qb;
  130. qa.q = a; qb.q = b; qu.q = a;
  131. for (int i=0; i<8; i++)
  132. {
  133. qu.u[i] = (qa.u[i] > qb.u[i]) ? (qa.u[i] - qb.u[i]) : 0; 
  134. }
  135. m_quad = qu.q;
  136. }
  137. //
  138. // Shift operations
  139. //
  140. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  141. template<int shift> inline void hkIntVector::setShiftLeft32( hkIntVectorParameter a)
  142. #else
  143. inline void hkIntVector::setShiftLeft32( hkIntVectorParameter a, int shift )
  144. #endif
  145. {
  146. hkQuadUintUnion qu, qa;
  147. qa.q = a;
  148. qu.u[0] = qa.u[0] << shift;
  149. qu.u[1] = qa.u[1] << shift;
  150. qu.u[2] = qa.u[2] << shift;
  151. qu.u[3] = qa.u[3] << shift;
  152. m_quad = qu.q;
  153. }
  154. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  155. template<int shift> inline void hkIntVector::setShiftRight32( hkIntVectorParameter a)
  156. #else
  157. inline void hkIntVector::setShiftRight32( hkIntVectorParameter a, int shift )
  158. #endif
  159. {
  160. hkQuadUintUnion qu, qa;
  161. qa.q = a;
  162. qu.u[0] = qa.u[0] >> shift;
  163. qu.u[1] = qa.u[1] >> shift;
  164. qu.u[2] = qa.u[2] >> shift;
  165. qu.u[3] = qa.u[3] >> shift;
  166. m_quad = qu.q;
  167. }
  168. inline void hkIntVector::setShiftLeft32( hkIntVectorParameter a, hkIntVectorParameter shift )
  169. {
  170. hkQuadUintUnion qu, qa, qshift;
  171. qa.q = a;
  172. qshift.q = shift;
  173. qu.u[0] = qa.u[0] << qshift.u[0];
  174. qu.u[1] = qa.u[1] << qshift.u[1];
  175. qu.u[2] = qa.u[2] << qshift.u[2];
  176. qu.u[3] = qa.u[3] << qshift.u[3];
  177. m_quad = qu.q;
  178. }
  179. inline void hkIntVector::setShiftRight32( hkIntVectorParameter a, hkIntVectorParameter shift )
  180. {
  181. hkQuadUintUnion qu, qa, qshift;
  182. qa.q = a;
  183. qshift.q = shift;
  184. qu.u[0] = qa.u[0] >> qshift.u[0];
  185. qu.u[1] = qa.u[1] >> qshift.u[1];
  186. qu.u[2] = qa.u[2] >> qshift.u[2];
  187. qu.u[3] = qa.u[3] >> qshift.u[3];
  188. m_quad = qu.q;
  189. }
  190. //
  191. // Merge operations
  192. //
  193. inline void hkIntVector::setMergeHigh32(hkIntVectorParameter a, hkIntVectorParameter b)
  194. {
  195. hkQuadUintUnion qu, qa, qb;
  196. qa.q = a; qb.q = b;
  197. qu.u[0] = qa.u[0]; 
  198. qu.u[1] = qb.u[0];
  199. qu.u[2] = qa.u[1];
  200. qu.u[3] = qb.u[1];
  201. m_quad = qu.q;
  202. }
  203. inline void hkIntVector::setMergeLow32(hkIntVectorParameter a, hkIntVectorParameter b)
  204. {
  205. hkQuadUintUnion qu, qa, qb;
  206. qa.q = a; qb.q = b;
  207. qu.u[0] = qa.u[2];
  208. qu.u[1] = qb.u[2];
  209. qu.u[2] = qa.u[3];
  210. qu.u[3] = qb.u[3];
  211. m_quad = qu.q;
  212. }
  213. inline void hkIntVector::setMergeHigh16(hkIntVectorParameter a, hkIntVectorParameter b)
  214. {
  215. hkQuadShortUnion qu, qa, qb;
  216. qa.q = a; qb.q = b; qu.q = a;
  217. for (int i=0, j=0; i<8; i+=2, j++)
  218. {
  219. qu.u[ i ] = qa.u[j];
  220. qu.u[i+1] = qb.u[j];
  221. }
  222. m_quad = qu.q;
  223. }
  224. inline void hkIntVector::setMergeLow16(hkIntVectorParameter a, hkIntVectorParameter b)
  225. {
  226. hkQuadShortUnion qu, qa, qb;
  227. qa.q = a; qb.q = b; qu.q = a;
  228. for (int i=0, j=4; i<8; i+=2, j++)
  229. {
  230. qu.u[ i ] = qa.u[j];
  231. qu.u[i+1] = qb.u[j];
  232. }
  233. m_quad = qu.q;
  234. }
  235. inline void hkIntVector::setMergeHigh8(hkIntVectorParameter a, hkIntVectorParameter b)
  236. {
  237. hkQuadCharUnion qu, qa, qb;
  238. qa.q = a; qb.q = b; qu.q = a;
  239. for (int i=0, j=0; i<16; i+=2, j++)
  240. {
  241. qu.u[ i ] = qa.u[j];
  242. qu.u[i+1] = qb.u[j];
  243. }
  244. m_quad = qu.q;
  245. }
  246. inline void hkIntVector::setMergeLow8(hkIntVectorParameter a, hkIntVectorParameter b)
  247. {
  248. hkQuadCharUnion qu, qa, qb;
  249. qa.q = a; qb.q = b; qu.q = a;
  250. for (int i=0, j=8; i<16; i+=2, j++)
  251. {
  252. qu.u[ i ] = qa.u[j];
  253. qu.u[i+1] = qb.u[j];
  254. }
  255. m_quad = qu.q;
  256. }
  257. //
  258. // Pack operations
  259. //
  260. inline void hkIntVector::setPackModuloU32( hkIntVectorParameter a, hkIntVectorParameter b )
  261. {
  262. hkQuadShortUnion qu, qa, qb;
  263. qa.q = a; qb.q = b;
  264. qu.u[0] = qa.u[1];
  265. qu.u[1] = qa.u[3];
  266. qu.u[2] = qa.u[5];
  267. qu.u[3] = qa.u[7];
  268. qu.u[4] = qb.u[1];
  269. qu.u[5] = qb.u[3];
  270. qu.u[6] = qb.u[5];
  271. qu.u[7] = qb.u[7];
  272. m_quad = qu.q;
  273. }
  274. //
  275. // Shuffle
  276. //
  277. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  278. template<int A, int B, int C, int D> HK_FORCE_INLINE void hkIntVector::setShuffle( hkIntVectorParameter a )
  279. #else
  280. inline void hkIntVector::setShuffle( hkIntVectorParameter a, int A, int B, int C, int D )
  281. #endif
  282. {
  283. hkQuadUintUnion qu, qa;
  284. qa.q = a;
  285. qu.u[0] = qa.u[A];
  286. qu.u[1] = qa.u[B];
  287. qu.u[2] = qa.u[C];
  288. qu.u[3] = qa.u[D];
  289. m_quad = qu.q;
  290. }
  291. //
  292. // Splat
  293. //
  294. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  295. template<int val> inline void hkIntVector::splatImmediate32()
  296. #else
  297. inline void hkIntVector::splatImmediate32(int val)
  298. #endif
  299. {
  300. HK_INT_VECTOR_COMPILE_TIME_ASSERT( val <=  15 );
  301. HK_INT_VECTOR_COMPILE_TIME_ASSERT( val >= -16 );
  302. hkQuadIntUnion qu;
  303. qu.u[0] = val;
  304. qu.u[1] = val;
  305. qu.u[2] = val;
  306. qu.u[3] = val;
  307. m_quad = qu.q;
  308. }
  309. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  310. template<int val> inline void hkIntVector::splatImmediate16()
  311. #else
  312. inline void hkIntVector::splatImmediate16(int val)
  313. #endif
  314. {
  315. HK_INT_VECTOR_COMPILE_TIME_ASSERT( val <=  15 );
  316. HK_INT_VECTOR_COMPILE_TIME_ASSERT( val >= -16 );
  317. hkQuadShortUnion qu; 
  318. qu.q = m_quad; // avoid uninitialized variable warning
  319. for (int i=0; i<8; i++)
  320. {
  321. qu.u[i] = (hkUint16) val;
  322. }
  323. m_quad = qu.q;
  324. }
  325. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  326. template<int val> inline void hkIntVector::splatImmediate8()
  327. #else
  328. inline void hkIntVector::splatImmediate8(int val)
  329. #endif
  330. {
  331. HK_INT_VECTOR_COMPILE_TIME_ASSERT( val <=  15 );
  332. HK_INT_VECTOR_COMPILE_TIME_ASSERT( val >= -16 );
  333. hkQuadCharUnion qu; 
  334. qu.q = m_quad; // avoid uninitialized variable warning
  335. for (int i=0; i<16; i++)
  336. {
  337. qu.u[i] = (hkUint8) val;
  338. }
  339. m_quad = qu.q;
  340. }
  341. #ifdef HK_INT_VECTOR_USE_TEMPLATE
  342. template<int idx> inline void hkIntVector::setBroadcast(hkIntVectorParameter a)
  343. #else
  344. inline void hkIntVector::setBroadcast(hkIntVectorParameter a, int idx)
  345. #endif
  346. {
  347. hkQuadUintUnion qu, qa;
  348. qa.q = a; 
  349. qu.u[0] = qa.u[idx];
  350. qu.u[1] = qa.u[idx];
  351. qu.u[2] = qa.u[idx];
  352. qu.u[3] = qa.u[idx];
  353. m_quad = qu.q;
  354. }
  355. //
  356. // int <-> float conversion
  357. //
  358. inline void hkIntVector::convertToF32fromU32(hkVector4& vOut) const
  359. {
  360. hkQuadUintUnion qu;
  361. qu.q = m_quad;
  362. vOut(0) = (hkReal) qu.u[0];
  363. vOut(1) = (hkReal) qu.u[1];
  364. vOut(2) = (hkReal) qu.u[2];
  365. vOut(3) = (hkReal) qu.u[3];
  366. }
  367. inline void hkIntVector::convertToF32fromS32(hkVector4& vOut) const
  368. {
  369. hkQuadIntUnion qu;
  370. qu.q = m_quad;
  371. vOut(0) = (hkReal) qu.u[0];
  372. vOut(1) = (hkReal) qu.u[1];
  373. vOut(2) = (hkReal) qu.u[2];
  374. vOut(3) = (hkReal) qu.u[3];
  375. }
  376. inline void hkIntVector::convertFromF32toU32(hkVector4Parameter vIn)
  377. {
  378. hkQuadUintUnion qu;
  379. qu.u[0] = (hkUint32) vIn(0);
  380. qu.u[1] = (hkUint32) vIn(1);
  381. qu.u[2] = (hkUint32) vIn(2);
  382. qu.u[3] = (hkUint32) vIn(3);
  383. m_quad = qu.q;
  384. }
  385. // The following functions are valid for all platforms (there wont' be many of these)
  386. inline void hkIntVector::loadAligned(const hkUint32* p)
  387. {
  388. HK_ASSERT2(0x3a8619dc, ((hkUlong)p & 0xf) == 0, "pointer for hkIntVector::loadAligned must be 16-byte aligned");
  389. m_quad = *reinterpret_cast<const hkQuadUint*>(p);
  390. }
  391. inline hkQuadUint& hkIntVector::getQuad()
  392. {
  393. return m_quad;
  394. }
  395. inline const hkQuadUint& hkIntVector::getQuad() const
  396. {
  397. return m_quad;
  398. }
  399. inline void hkIntVector::select32(hkIntVectorParameter a, hkIntVectorParameter b, hkVector4ComparisonParameter selectMask)
  400. {
  401. ((hkVector4*)(this))->select32( *(hkVector4*)(&a), *(hkVector4*)(&b), selectMask );
  402. }
  403. //
  404. /*
  405. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  406. * Confidential Information of Havok.  (C) Copyright 1999-2009
  407. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  408. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  409. * rights, and intellectual property rights in the Havok software remain in
  410. * Havok and/or its suppliers.
  411. * Use of this software for evaluation purposes is subject to and indicates
  412. * acceptance of the End User licence Agreement for this product. A copy of
  413. * the license is included with this software and is also available at www.havok.com/tryhavok.
  414. */