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

其他游戏

开发平台:

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_VECTOR4UTIL_setNormalOfTriangle
  9. HK_FORCE_INLINE void HK_CALL hkVector4Util::setNormalOfTriangle(hkVector4 &result, const hkVector4 &a, const hkVector4& b,const hkVector4& c)
  10. {
  11. hkVector4 ba,ca;
  12. ba.setSub4( b, a );
  13. ca.setSub4( c, a );
  14. result.setCross( ba , ca);
  15. }
  16. #endif
  17. #ifndef HK_VECTOR4UTIL_mulSigns4
  18. inline void HK_CALL hkVector4Util::mulSigns4( hkVector4& inout, const hkVector4& signv)
  19. {
  20. hkUint32* intp = reinterpret_cast<hkUint32*>(&inout);
  21. const hkUint32* sign = reinterpret_cast<const hkUint32*>(&signv);
  22. intp[0] ^= (sign[0] & 0x80000000);
  23. intp[1] ^= (sign[1] & 0x80000000);
  24. intp[2] ^= (sign[2] & 0x80000000);
  25. intp[3] ^= (sign[3] & 0x80000000);
  26. }
  27. #endif
  28. #ifndef HK_VECTOR4UTIL_convertToUint16
  29. inline void HK_CALL hkVector4Util::convertToUint16( const hkVector4& in, const hkVector4& offset, const hkVector4& scale, hkIntUnion64& out)
  30. {
  31. static hkQuadReal magicQuad = HK_QUADREAL_CONSTANT(hkReal(0x30000), hkReal(0x30000), hkReal(0x30000), hkReal(0x30000) );
  32. hkVector4 x, magic;
  33. x.setAdd4(in,offset);
  34. x.mul4(scale);
  35. magic.getQuad() = magicQuad;
  36. x.add4( magic );
  37. union 
  38. {
  39. hkQuadReal q;
  40. hkUint32 i[4];
  41. } u;
  42. u.q = x.getQuad();
  43. // Note: throw away top 16 bits
  44. out.i16[0] = static_cast<hkInt16>(u.i[0] >> 6);
  45. out.i16[1] = static_cast<hkInt16>(u.i[1] >> 6);
  46. out.i16[2] = static_cast<hkInt16>(u.i[2] >> 6);
  47. out.i16[3] = static_cast<hkInt16>(u.i[3] >> 6);
  48. }
  49. #endif
  50. #ifndef HK_VECTOR4UTIL_convertToUint16WithClip
  51. // can't be inside convert to clip as gcc will not inline funcs with statics in them
  52. static hkQuadReal convertToUint16WithClipMagicQuad = HK_QUADREAL_CONSTANT( 65536.0f, 65536.0f, 65536.0f, 65536.0f );
  53. inline void HK_CALL hkVector4Util::convertToUint16WithClip( const hkVector4& in, const hkVector4& offset, const hkVector4& scale, const hkVector4& min, const hkVector4& max, hkIntUnion64& out)
  54. {
  55. hkVector4 x;
  56. x.setAdd4(in,offset);
  57. x.mul4(scale);
  58. x.setMin4(x,max);
  59. x.setMax4(x,min);
  60. hkVector4 convertToUint16WithClipMagic; 
  61. convertToUint16WithClipMagic.getQuad() = convertToUint16WithClipMagicQuad;
  62. x.add4( convertToUint16WithClipMagic );
  63. union 
  64. {
  65. hkQuadReal q;
  66. hkUint32 i[4];
  67. } u;
  68. u.q = x.getQuad();
  69. // note implicitly throw away top 16 bits
  70. out.i16[0] = hkInt16(u.i[0] >> 7);
  71. out.i16[1] = hkInt16(u.i[1] >> 7);
  72. out.i16[2] = hkInt16(u.i[2] >> 7);
  73. out.i16[3] = hkInt16(u.i[3] >> 7);
  74. }
  75. #endif
  76. #ifndef HK_VECTOR4UTIL_convertToUint32
  77. inline void HK_CALL hkVector4Util::convertToUint32( const hkVector4& in, const hkVector4& offset, const hkVector4& scale, hkUint32* out)
  78. {
  79. hkVector4 x;
  80. x.setAdd4(in,offset);
  81. x.mul4(scale);
  82. out[0] = static_cast<hkUint32>(hkMath::hkToIntFast(x(0)));
  83. out[1] = static_cast<hkUint32>(hkMath::hkToIntFast(x(1)));
  84. out[2] = static_cast<hkUint32>(hkMath::hkToIntFast(x(2)));
  85. out[3] = static_cast<hkUint32>(hkMath::hkToIntFast(x(3)));
  86. }
  87. #endif
  88. #ifndef HK_VECTOR4UTIL_convertToUint32WithClip
  89. inline void HK_CALL hkVector4Util::convertToUint32WithClip( const hkVector4& in, const hkVector4& offset, const hkVector4& scale, const hkVector4& min, const hkVector4& max, hkUint32* out)
  90. {
  91. hkVector4 x;
  92. x.setAdd4(in,offset);
  93. x.mul4(scale);
  94. x.setMin4(x,max);
  95. x.setMax4(x,min);
  96. out[0] = static_cast<hkUint32>(hkMath::hkToIntFast(x(0)));
  97. out[1] = static_cast<hkUint32>(hkMath::hkToIntFast(x(1)));
  98. out[2] = static_cast<hkUint32>(hkMath::hkToIntFast(x(2)));
  99. out[3] = static_cast<hkUint32>(hkMath::hkToIntFast(x(3)));
  100. }
  101. #endif
  102. #if !defined(HK_VECTOR4UTIL_convertAabbToUint32)
  103. inline void HK_CALL hkVector4Util::convertAabbToUint32( const hkAabb& aabb, const hkVector4& offsetLow, const hkVector4& offsetHigh, const hkVector4& scale, hkAabbUint32& aabbOut )
  104. {
  105. HK_ASSERT2(0x4868f301,  aabb.isValid(), "Aabb at " << &aabb << " was invalid. (Contains a NaN or min > max)");
  106. hkVector4 maxVal; maxVal.getQuad() = hkVector4Util::hkAabbUint32MaxVal;
  107. hkVector4Util::convertToUint32WithClip( aabb.m_min, offsetLow,  scale, hkVector4::getZero(), maxVal, aabbOut.m_min );
  108. hkVector4Util::convertToUint32WithClip( aabb.m_max, offsetHigh, scale, hkVector4::getZero(), maxVal, aabbOut.m_max );
  109. }
  110. #endif
  111. #ifndef HK_VECTOR4UTIL_convertAabbFromUint32
  112. //Based on void hkp3AxisSweep::getAabbFromNode(const hkpBpNode& node, hkAabb & aabb) const
  113. inline void HK_CALL hkVector4Util::convertAabbFromUint32( const hkAabbUint32& aabbIn, const hkVector4& offsetLow, const hkVector4& scale, hkAabb& aabbOut)
  114. {
  115. aabbOut.m_min.set( hkReal(aabbIn.m_min[0]), hkReal(aabbIn.m_min[1]), hkReal(aabbIn.m_min[2]) );
  116. aabbOut.m_max.set( hkReal(aabbIn.m_max[0]), hkReal(aabbIn.m_max[1]), hkReal(aabbIn.m_max[2]) );
  117. hkVector4 invScale; invScale.setReciprocal3(scale);
  118. aabbOut.m_min.mul4(invScale);
  119. aabbOut.m_max.mul4(invScale);
  120. aabbOut.m_min.sub4(offsetLow);
  121. aabbOut.m_max.sub4(offsetLow);
  122. }
  123. #endif
  124. #ifndef HK_VECTOR4UTIL_calculatePerpendicularVector
  125. inline void HK_CALL hkVector4Util::calculatePerpendicularVector(const hkVector4& vectorIn, hkVector4& biVectorOut)
  126. {
  127. // find the indices of (one of) the smallest component(s) and the indices of
  128. // the remaining two components in the vector
  129. int min = 0;
  130. int ok1 = 1;
  131. int ok2 = 2;
  132. hkReal a0 = hkMath::fabs(vectorIn(0));
  133. hkReal a1 = hkMath::fabs(vectorIn(1));
  134. hkReal a2 = hkMath::fabs(vectorIn(2));
  135. // sort the indices to make min index point to the smallest
  136. if( a1 < a0 )
  137. {
  138. ok1 = 0;
  139. min = 1;
  140. a0 = a1;
  141. }
  142. if(a2 < a0)
  143. {
  144. ok2 = min;
  145. min = 2;
  146. }
  147. biVectorOut.setZero4();
  148. biVectorOut(ok1) =  vectorIn(ok2);
  149. biVectorOut(ok2) = -vectorIn(ok1);
  150. }
  151. #endif
  152. #ifndef HK_VECTOR4UTIL_transformPoints
  153. inline void HK_CALL hkVector4Util::transformPoints( const hkTransform& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut )
  154. {
  155. HK_ASSERT2( 0xf0237abd, numVectors > 0, "At least one element required");
  156. checkRegisters( 0xf0000000 );
  157. hkTransform unaliased = t;
  158. int i = numVectors - 1;
  159. do
  160. {
  161. vectorsOut[i]._setTransformedPos( unaliased, vectorsIn[i] );
  162. } while( --i >= 0 );
  163. }
  164. #endif
  165. #ifndef HK_VECTOR4UTIL_transformPlaneEquations
  166. HK_FORCE_INLINE void HK_CALL hkVector4Util::transformPlaneEquations( const hkTransform& t, const hkVector4* HK_RESTRICT planes, int numPlanes, hkVector4* HK_RESTRICT planesOut )
  167. {
  168. const hkRotation rotation = t.getRotation(); // we are making a copy here to allow for better compiler support
  169. hkVector4 tr; tr.setNeg4(t.getTranslation()); 
  170. hkVector4 pivotShift; pivotShift._setRotatedInverseDir( rotation, tr );
  171. int p = numPlanes - 1;
  172. do
  173. {
  174. hkSimdReal newDist = planes->dot4xyz1(pivotShift);
  175. planesOut->setRotatedDir(rotation, planes[0] );
  176. planes++;
  177. hkVector4 w; w.setAll( newDist );
  178. planesOut->setW( w );
  179. planesOut++;
  180. }
  181. while ( --p >=0 );
  182. }
  183. #endif
  184. #ifndef HK_VECTOR4UTIL_mul4xyz1Points
  185. inline void HK_CALL hkVector4Util::mul4xyz1Points( const hkTransform& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut )
  186. {
  187. HK_ASSERT2( 0xf0237abe, numVectors > 0, "At least one element required");
  188. checkRegisters( 0xf0000000 );
  189. hkTransform unaliased = t;
  190. int i = numVectors - 1;
  191. do
  192. {
  193. vectorsOut[i]._setMul4xyz1( unaliased, vectorsIn[i] );
  194. } while( --i >= 0 );
  195. }
  196. #endif
  197. #ifndef HK_VECTOR4UTIL_transformSpheres
  198. inline void HK_CALL hkVector4Util::transformSpheres( const hkTransform& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut )
  199. {
  200. HK_ASSERT2( 0xf0237abf, numVectors > 0, "At least one element required");
  201. checkRegisters( 0xf0000000 );
  202. hkTransform unaliased = t;
  203. int i = numVectors - 1;
  204. do
  205. {
  206. hkVector4 v;
  207. v._setTransformedPos( unaliased, vectorsIn[i] ); // position
  208. v.setW(vectorsIn[i]); // radius
  209. vectorsOut[i] = v;
  210. } while( --i >= 0 );
  211. }
  212. #endif
  213. #ifndef HK_VECTOR4UTIL_rotatePoints
  214. inline void HK_CALL hkVector4Util::rotatePoints( const hkMatrix3& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut )
  215. {
  216. HK_ASSERT2( 0xf0237ac0, numVectors > 0, "At least one element required");
  217. checkRegisters( 0x70000000 );
  218. hkMatrix3 unaliased = t;
  219. int i = numVectors - 1;
  220. do
  221. {
  222. vectorsOut[i]._setMul3( unaliased, vectorsIn[i] );
  223. } while( --i >= 0 );
  224. }
  225. #endif
  226. #ifndef HK_VECTOR4UTIL_rotateInversePoints
  227. inline void HK_CALL hkVector4Util::rotateInversePoints( const hkRotation& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut )
  228. {
  229. HK_ASSERT2( 0xf0237ac1, numVectors > 0, "At least one element required");
  230. hkRotation unaliased = t;
  231. int i = numVectors - 1;
  232. do
  233. {
  234. vectorsOut[i]._setRotatedInverseDir( unaliased, vectorsIn[i] );
  235. } while( --i >= 0 );
  236. }
  237. #endif
  238. #ifndef HK_VECTOR4UTIL_setMul
  239. inline void HK_CALL hkVector4Util::setMul( const hkMatrix3& aTb, const hkMatrix3& bTc, hkMatrix3& aTcOut )
  240. {
  241. HK_ASSERT(0x6d9d1d43,  &aTcOut != &aTb );
  242. HK_ASSERT(0x64a8df81,  &aTcOut != &bTc );
  243. hkVector4Util::rotatePoints( aTb, &bTc.getColumn(0), 3, &aTcOut.getColumn(0) );
  244. }
  245. #endif
  246. #ifndef HK_VECTOR4UTIL_setInverseMul
  247. inline void HK_CALL hkVector4Util::setInverseMul( const hkRotation& bTa, const hkMatrix3& bTc, hkMatrix3& aTcOut )
  248. {
  249. hkVector4Util::rotateInversePoints( bTa, &bTc.getColumn(0), 3, &aTcOut.getColumn(0) );
  250. }
  251. #endif
  252. #ifndef HK_VECTOR4UTIL_transpose
  253. inline void HK_CALL hkVector4Util::transpose( hkMatrix3& m )
  254. {
  255. hkReal h1 = m(0,1); m(0,1) = m(1,0), m(1,0) = h1;
  256. hkReal h2 = m(0,2); m(0,2) = m(2,0), m(2,0) = h2;
  257. hkReal h3 = m(1,2); m(1,2) = m(2,1), m(2,1) = h3;
  258. }
  259. #endif
  260. #ifndef HK_VECTOR4UTIL_add
  261. inline void HK_CALL hkVector4Util::add( hkMatrix3& m, const hkMatrix3& a )
  262. {
  263. m.getColumn(0).add4( a.getColumn(0) );
  264. m.getColumn(1).add4( a.getColumn(1) );
  265. m.getColumn(2).add4( a.getColumn(2) );
  266. }
  267. #endif
  268. #ifndef HK_VECTOR4UTIL_buildOrthonormal
  269. inline void HK_CALL hkVector4Util::buildOrthonormal( const hkVector4& dir, hkMatrix3& out )
  270. {
  271. out.getColumn(0) = dir;
  272. calculatePerpendicularVector( dir, out.getColumn(1));
  273. out.getColumn(1).normalize3();
  274. out.getColumn(2).setCross( dir, out.getColumn(1));
  275. }
  276. #endif
  277. #ifndef HK_VECTOR4UTIL_buildOrthonormal
  278. void HK_CALL hkVector4Util::buildOrthonormal( const hkVector4& dir, const hkVector4& dir2, hkMatrix3& out )
  279. {
  280. out.getColumn(0) = dir;
  281. out.getColumn(2).setCross( dir, dir2 );
  282. if ( out.getColumn(2).length3() < HK_REAL_EPSILON )
  283. {
  284. buildOrthonormal( dir, out );
  285. return;
  286. }
  287. out.getColumn(2).normalize3();
  288. out.getColumn(1).setCross( out.getColumn(2), dir );
  289. }
  290. #endif
  291. #ifndef HK_VECTOR4UTIL_dot3_3vs3
  292. inline void HK_CALL hkVector4Util::dot3_3vs3(const hkVector4& a0, const hkVector4& b0, const hkVector4& a1, const hkVector4& b1, const hkVector4& a2, const hkVector4& b2, hkVector4& dotsOut)
  293. {
  294. dotsOut(0) = a0.dot3( b0 );
  295. dotsOut(1) = a1.dot3( b1 );
  296. dotsOut(2) = a2.dot3( b2 );
  297. dotsOut(3) = 0;
  298. }
  299. #endif
  300. #ifndef HK_VECTOR4UTIL_dot3_4vs4
  301. inline void HK_CALL hkVector4Util::dot3_4vs4( const hkVector4& a0, const hkVector4& b0, const hkVector4& a1, const hkVector4& b1, const hkVector4& a2, const hkVector4& b2, const hkVector4& a3, const hkVector4& b3, hkVector4& dotsOut)
  302. {
  303. dotsOut(0) = a0.dot3( b0 );
  304. dotsOut(1) = a1.dot3( b1 );
  305. dotsOut(2) = a2.dot3( b2 );
  306. dotsOut(3) = a3.dot3( b3 );
  307. }
  308. #endif
  309. #ifndef HK_VECTOR4UTIL_dot4_4vs4
  310. inline void HK_CALL hkVector4Util::dot4_4vs4( const hkVector4& a0, const hkVector4& b0, const hkVector4& a1, const hkVector4& b1, const hkVector4& a2, const hkVector4& b2, const hkVector4& a3, const hkVector4& b3, hkVector4& dotsOut)
  311. {
  312. dotsOut(0) = a0.dot4( b0 );
  313. dotsOut(1) = a1.dot4( b1 );
  314. dotsOut(2) = a2.dot4( b2 );
  315. dotsOut(3) = a3.dot4( b3 );
  316. }
  317. #endif
  318. #ifndef HK_VECTOR4UTIL_dot3_1vs4
  319. inline void HK_CALL hkVector4Util::dot3_1vs4( const hkVector4& vectorIn, const hkVector4& a0, const hkVector4& a1, const hkVector4& a2, const hkVector4& a3, hkVector4& dotsOut)
  320. {
  321. dotsOut(0) = a0.dot3( vectorIn );
  322. dotsOut(1) = a1.dot3( vectorIn );
  323. dotsOut(2) = a2.dot3( vectorIn );
  324. dotsOut(3) = a3.dot3( vectorIn );
  325. }
  326. #endif
  327. #ifndef HK_VECTOR4UTIL_dot3_2vs2
  328. inline void HK_CALL hkVector4Util::dot3_2vs2( const hkVector4& a0, const hkVector4& a2, const hkVector4& b0, const hkVector4& b1, hkVector4& dotsOut)
  329. {
  330. dotsOut(0) = a0.dot3( b0 );
  331. dotsOut(1) = a0.dot3( b1 );
  332. dotsOut(2) = a2.dot3( b0 );
  333. dotsOut(3) = a2.dot3( b1 );
  334. }
  335. #endif
  336. #ifndef HK_VECTOR4UTIL_invertSymmetric
  337. inline void HK_CALL hkVector4Util::invertSymmetric( const hkMatrix3& in, hkReal eps, hkMatrix3& out )
  338. {
  339. hkVector4 r0; r0.setCross( in.getColumn(1), in.getColumn(2) );
  340.     hkVector4 r1; r1.setCross( in.getColumn(2), in.getColumn(0) );
  341.     hkVector4 r2; r2.setCross( in.getColumn(0), in.getColumn(1) );
  342.     hkSimdReal determinant = HK_SIMD_REAL(eps*eps*eps) + in.getColumn(0).dot3(r0);
  343. hkSimdReal dinv = HK_SIMD_REAL(1.0f) / determinant;
  344. out.getColumn(0).setMul4(dinv, r0);
  345. out.getColumn(1).setMul4(dinv, r1);
  346. out.getColumn(2).setMul4(dinv, r2);
  347. }
  348. #endif
  349. #ifndef HK_VECTOR4UTIL_exitMmx
  350. inline void HK_CALL hkVector4Util::exitMmx()
  351. {
  352. }
  353. #endif
  354. #ifndef HK_VECTOR4UTIL_distToLineSquared
  355. inline hkSimdReal HK_CALL hkVector4Util::distToLineSquared( const hkVector4& a, const hkVector4& b, const hkVector4& p )
  356. {
  357. hkVector4 ab, ap;
  358. ab.setSub4( b, a );
  359. ap.setSub4( p, a );
  360. const hkSimdReal ab_ = ab.lengthSquared3();
  361. const hkSimdReal projectionAsPercentOfSegment = ap.dot3(ab)/ab_;
  362. ap.subMul4( projectionAsPercentOfSegment, ab );
  363. return ap.lengthSquared3();
  364. }
  365. #endif
  366. #ifndef HK_VECTOR4UTIL_unPackInt32IntoQuaternion
  367. inline void HK_CALL hkVector4Util::unPackInt32IntoQuaternion( hkUint32 ivalue, hkVector4& qout )
  368. {
  369. int a = ivalue;
  370. int b = ivalue >> 8;
  371. int c = ivalue >> 16;
  372. int d = ivalue >> 24;
  373. a &= 0xff;
  374. b &= 0xff;
  375. c &= 0xff;
  376. a -= 0x80;
  377. b -= 0x80;
  378. c -= 0x80;
  379. d -= 0x80;
  380. const hkReal f = 1.1f/128.0f;
  381. qout(0) = f * a;
  382. qout(1) = f * b;
  383. qout(2) = f * c;
  384. qout(3) = f * d;
  385. }
  386. #endif
  387. #ifndef HK_VECTOR4UTIL_compressExpandedAabbUint32
  388. inline void HK_CALL hkVector4Util::compressExpandedAabbUint32(const hkAabbUint32& expandedAabbInt, hkAabbUint32& unexpandedAabbInt_InOut)
  389. {
  390. hkInt32 mix = unexpandedAabbInt_InOut.m_min[0] - expandedAabbInt.m_min[0];
  391. hkInt32 miy = unexpandedAabbInt_InOut.m_min[1] - expandedAabbInt.m_min[1];
  392. hkInt32 miz = unexpandedAabbInt_InOut.m_min[2] - expandedAabbInt.m_min[2];
  393. hkInt32 maxx= expandedAabbInt.m_max[0] - unexpandedAabbInt_InOut.m_max[0];
  394. hkInt32 may = expandedAabbInt.m_max[1] - unexpandedAabbInt_InOut.m_max[1];
  395. hkInt32 maz = expandedAabbInt.m_max[2] - unexpandedAabbInt_InOut.m_max[2];
  396. hkInt32 m = (mix | miy) | (miz | maxx) | (may | maz);
  397. HK_ASSERT2( 0xf0ed3454, m >= 0, "Your expanded Aabb is smaller than the unexpanded AABB" );
  398. int shift = 0;
  399. while ( m >=  0x800){ shift += 4; m = unsigned(m) >> 4; };
  400. while ( m >=  0x100){ shift += 1; m = unsigned(m) >> 1; };
  401. unexpandedAabbInt_InOut.m_expansionShift = hkUchar(shift);
  402. unexpandedAabbInt_InOut.m_expansionMin[0] = hkUchar(mix >> shift);
  403. unexpandedAabbInt_InOut.m_expansionMin[1] = hkUchar(miy >> shift);
  404. unexpandedAabbInt_InOut.m_expansionMin[2] = hkUchar(miz >> shift);
  405. unexpandedAabbInt_InOut.m_expansionMax[0] = hkUchar(maxx >> shift);
  406. unexpandedAabbInt_InOut.m_expansionMax[1] = hkUchar(may >> shift);
  407. unexpandedAabbInt_InOut.m_expansionMax[2] = hkUchar(maz >> shift);
  408. }
  409. #endif
  410. #ifndef HK_VECTOR4UTIL_uncompressExpandedAabbUint32
  411. inline void HK_CALL hkVector4Util::uncompressExpandedAabbUint32(const hkAabbUint32& unexpandedAabbInt, hkAabbUint32& expandedAabbOut)
  412. {
  413. int shift = unexpandedAabbInt.m_expansionShift;
  414. hkUint32 mix = unexpandedAabbInt.m_min[0] - (unexpandedAabbInt.m_expansionMin[0] << shift);
  415. hkUint32 miy = unexpandedAabbInt.m_min[1] - (unexpandedAabbInt.m_expansionMin[1] << shift);
  416. hkUint32 miz = unexpandedAabbInt.m_min[2] - (unexpandedAabbInt.m_expansionMin[2] << shift);
  417. expandedAabbOut.m_min[0]= mix;
  418. expandedAabbOut.m_min[1]= miy;
  419. expandedAabbOut.m_min[2]= miz;
  420. hkUint32 maxx = unexpandedAabbInt.m_max[0] + (unexpandedAabbInt.m_expansionMax[0] << shift);
  421. hkUint32 may  = unexpandedAabbInt.m_max[1] + (unexpandedAabbInt.m_expansionMax[1] << shift);
  422. hkUint32 maz  = unexpandedAabbInt.m_max[2] + (unexpandedAabbInt.m_expansionMax[2] << shift);
  423. expandedAabbOut.m_max[0]= maxx;
  424. expandedAabbOut.m_max[1]= may;
  425. expandedAabbOut.m_max[2]= maz;
  426. }
  427. #endif
  428. #ifndef HK_VECTOR4UTIL_memclear16
  429. void hkVector4Util::memClear16( void *dest, int numQuads )
  430. {
  431. hkVector4 val; val.setZero4();
  432. hkVector4 *d = (hkVector4 *)dest;
  433. while ( --numQuads >=0 )
  434. {
  435. *(d++) = val;
  436. }
  437. }
  438. #endif
  439. /*
  440. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  441. * Confidential Information of Havok.  (C) Copyright 1999-2009
  442. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  443. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  444. * rights, and intellectual property rights in the Havok software remain in
  445. * Havok and/or its suppliers.
  446. * Use of this software for evaluation purposes is subject to and indicates
  447. * acceptance of the End User licence Agreement for this product. A copy of
  448. * the license is included with this software and is also available at www.havok.com/tryhavok.
  449. */