hkFpuVector4.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. /* quad, here for inlining */
  9. inline hkQuadReal& hkVector4::getQuad()
  10. {
  11. return reinterpret_cast<hkQuadReal&>(x);
  12. }
  13. inline const hkQuadReal& hkVector4::getQuad() const
  14. {
  15. return reinterpret_cast<const hkQuadReal&>(x);
  16. }
  17. /* operator (),[] here for inlining */
  18. inline hkReal& hkVector4::operator() (int i)
  19. {
  20. HK_ASSERT(0x3d62369d, i>=0 && i<4);
  21. return (&x)[i];
  22. }
  23. inline const hkReal& hkVector4::operator() (int i) const
  24. {
  25. HK_ASSERT(0x269e424a, i>=0 && i<4);
  26. return (&x)[i];
  27. }
  28. HK_FORCE_INLINE void hkVector4::setW(const hkVector4& v)
  29. {
  30. w = v.w;
  31. }
  32. HK_FORCE_INLINE void hkVector4::setXYZ(const hkVector4& v)
  33. {
  34. x = v.x;
  35. y = v.y;
  36. z = v.z;
  37. }
  38. HK_FORCE_INLINE void hkVector4::setXYZ0(const hkVector4& xyz)
  39. {
  40. x = xyz.x;
  41. y = xyz.y;
  42. z = xyz.z;
  43. w = 0;
  44. }
  45. HK_FORCE_INLINE void hkVector4::setXYZW(const hkVector4& xyz, const hkVector4& vw)
  46. {
  47. x = xyz.x;
  48. y = xyz.y;
  49. z = xyz.z;
  50. w = vw.w;
  51. }
  52. HK_FORCE_INLINE void hkVector4::setReciprocal4(const hkVector4& v)
  53. {
  54. x = 1.0f / v.x;
  55. y = 1.0f / v.y;
  56. z = 1.0f / v.z;
  57. w = 1.0f / v.w;
  58. }
  59. #define HK_VECTOR4_setReciprocal3
  60. inline void hkVector4::setReciprocal3(const hkVector4& v)
  61. {
  62. x = 1.0f / v.x;
  63. y = 1.0f / v.y;
  64. z = 1.0f / v.z;
  65. w = 1.0f;
  66. }
  67. HK_FORCE_INLINE void hkVector4::setSqrtInverse4(const hkVector4& v)
  68. {
  69. x = hkMath::sqrtInverse(v.x);
  70. y = hkMath::sqrtInverse(v.y);
  71. z = hkMath::sqrtInverse(v.z);
  72. w = hkMath::sqrtInverse(v.w);
  73. }
  74. inline hkSimdReal hkVector4::getSimdAt(int i) const
  75. {
  76. HK_ASSERT(0x5e605c8e, i>=0 && i<4);
  77. return (&x)[i];
  78. }
  79. inline void hkVector4::operator= (const hkVector4& v)
  80. {
  81. x = v.x;
  82. y = v.y;
  83. z = v.z;
  84. w = v.w;
  85. }
  86. #ifndef HK_DISABLE_VECTOR4_CONSTRUCTORS
  87. /* construct, assign, zero */
  88. inline hkVector4::hkVector4(hkReal a, hkReal b, hkReal c, hkReal d)
  89. : x(a), y(b), z(c), w(d)
  90. {
  91. }
  92. inline hkVector4::hkVector4(const hkQuadReal& q)
  93. : x(q.x), y(q.y), z(q.z), w(q.w)
  94. {
  95. }
  96. inline hkVector4::hkVector4( const hkVector4& v)
  97. {
  98. *this = v;
  99. }
  100. #endif
  101. inline void hkVector4::set(hkReal a, hkReal b, hkReal c, hkReal d)
  102. {
  103. x = a;
  104. y = b;
  105. z = c;
  106. w = d;
  107. }
  108. inline void hkVector4::setAll(hkReal a)
  109. {
  110. x = a;
  111. y = a;
  112. z = a;
  113. w = a;
  114. }
  115. inline void hkVector4::setAll3(hkReal a)
  116. {
  117. x = a;
  118. y = a;
  119. z = a;
  120. w = a;
  121. }
  122. inline void hkVector4::setZero4()
  123. {
  124. x = y = z = w = 0;
  125. }
  126. inline void hkVector4::zeroElement( int i )
  127. {
  128. (*this)(i) = 0.0f;
  129. }
  130. inline void hkVector4::setInt24W( int value )
  131. {
  132. (reinterpret_cast<int*>(this))[3] = (value | 0x3f000000);
  133. }
  134. // Gets the .w component as an integer with 24 bit resolution (for real experts only)
  135. inline int hkVector4::getInt24W( ) const 
  136. {
  137. return (reinterpret_cast<const int*>(this))[3] & ~0x3f000000;
  138. }
  139. inline void hkVector4::storeUncached( void* dest) const
  140. {
  141. *static_cast<hkVector4*>(dest) = *this;
  142. }
  143. /* vector methods */
  144. inline void hkVector4::add4(const hkVector4& v)
  145. {
  146. x += v.x;
  147. y += v.y;
  148. z += v.z;
  149. w += v.w;
  150. }
  151. inline void hkVector4::add3clobberW(const hkVector4& v)
  152. {
  153. x += v.x;
  154. y += v.y;
  155. z += v.z;
  156. }
  157. inline void hkVector4::setAdd4(const hkVector4& v0, const hkVector4& v1)
  158. {
  159. x = v0.x + v1.x;
  160. y = v0.y + v1.y;
  161. z = v0.z + v1.z;
  162. w = v0.w + v1.w;
  163. }
  164. inline void hkVector4::sub4(const hkVector4& v)
  165. {
  166. x -= v.x;
  167. y -= v.y;
  168. z -= v.z;
  169. w -= v.w;
  170. }
  171. inline void hkVector4::sub3clobberW(const hkVector4& v)
  172. {
  173. x -= v.x;
  174. y -= v.y;
  175. z -= v.z;
  176. }
  177. inline void hkVector4::setSub4(const hkVector4& v0, const hkVector4& v1)
  178. {
  179. x = v0.x - v1.x;
  180. y = v0.y - v1.y;
  181. z = v0.z - v1.z;
  182. w = v0.w - v1.w;
  183. }
  184. inline void hkVector4::mul4(const hkVector4& a)
  185. {
  186. x *= a.x;
  187. y *= a.y;
  188. z *= a.z;
  189. w *= a.w;
  190. }
  191. inline void hkVector4::setMul4(const hkVector4& a, const hkVector4& b)
  192. {
  193. x = a.x * b.x;
  194. y = a.y * b.y;
  195. z = a.z * b.z;
  196. w = a.w * b.w;
  197. }
  198. inline void hkVector4::mul4(hkSimdRealParameter rs)
  199. {  
  200. hkReal s = hkReal(rs);
  201. x *= s;
  202. y *= s;
  203. z *= s;
  204. w *= s;
  205. }
  206. inline void hkVector4::setMul4(hkSimdRealParameter rs, const hkVector4& a)
  207. {
  208. hkReal r = hkReal(rs);
  209. x = r * a.x;
  210. y = r * a.y;
  211. z = r * a.z;
  212. w = r * a.w;
  213. }
  214. inline void hkVector4::addMul4(hkSimdRealParameter rs, const hkVector4& a)
  215. {
  216. hkReal r = hkReal(rs);
  217. x += r * a.x;
  218. y += r * a.y;
  219. z += r * a.z;
  220. w += r * a.w;
  221. }
  222. inline void hkVector4::addMul4(const hkVector4& a, const hkVector4& b)
  223. {
  224. x += a.x * b.x;
  225. y += a.y * b.y;
  226. z += a.z * b.z;
  227. w += a.w * b.w;
  228. }
  229. inline void hkVector4::subMul4(hkSimdRealParameter rs, const hkVector4& a)
  230. {
  231. hkReal r = hkReal(rs);
  232. x -= r * a.x;
  233. y -= r * a.y;
  234. z -= r * a.z;
  235. w -= r * a.w;
  236. }
  237. inline void hkVector4::subMul4(const hkVector4& a, const hkVector4& b)
  238. {
  239. x -= a.x * b.x;
  240. y -= a.y * b.y;
  241. z -= a.z * b.z;
  242. w -= a.w * b.w;
  243. }
  244. inline void hkVector4::setAddMul4(const hkVector4& a, const hkVector4& b, hkSimdRealParameter r)
  245. {
  246. x = a.x + r * b.x;
  247. y = a.y + r * b.y;
  248. z = a.z + r * b.z;
  249. w = a.w + r * b.w;
  250. }
  251. inline void hkVector4::setAddMul4(const hkVector4& a, const hkVector4& m0, const hkVector4& m1)
  252. {
  253. x = a.x + m0.x * m1.x;
  254. y = a.y + m0.y * m1.y;
  255. z = a.z + m0.z * m1.z;
  256. w = a.w + m0.w * m1.w;
  257. }
  258. #if !defined( HK_VECTOR4_setCross)
  259. inline void hkVector4::setCross(const hkVector4& v1, const hkVector4& v2)
  260. {
  261. const hkReal nx = v1(1)*v2(2) - v1(2)*v2(1);
  262. const hkReal ny = v1(2)*v2(0) - v1(0)*v2(2);
  263. const hkReal nz = v1(0)*v2(1) - v1(1)*v2(0);
  264. this->set( nx, ny, nz , 0.0f );
  265. }
  266. #endif // HK_VECTOR4_SET_CROSS
  267. inline void hkVector4::setInterpolate4(const hkVector4& v0, const hkVector4& v1, hkSimdRealParameter rt)
  268. {
  269. hkReal t = hkReal(rt);
  270. hkReal s = 1.0f - t;
  271. hkVector4& d = *this;
  272. d(0) = s * v0(0) + t * v1(0);
  273. d(1) = s * v0(1) + t * v1(1);
  274. d(2) = s * v0(2) + t * v1(2);
  275. d(3) = s * v0(3) + t * v1(3);
  276. }
  277. inline hkVector4Comparison hkVector4::compareLessThan4(const hkVector4& a) const
  278. {
  279. hkVector4Comparison ret;
  280. ret.m_mask =
  281. ((x<a.x) ? hkVector4Comparison::MASK_X : 0) |
  282. ((y<a.y) ? hkVector4Comparison::MASK_Y : 0) |
  283. ((z<a.z) ? hkVector4Comparison::MASK_Z : 0) |
  284. ((w<a.w) ? hkVector4Comparison::MASK_W : 0);
  285. return ret;
  286. }
  287. inline hkVector4Comparison hkVector4::compareEqual4(const hkVector4& a) const
  288. {
  289. hkVector4Comparison ret;
  290. ret.m_mask =
  291. ((x==a.x) ? hkVector4Comparison::MASK_X : 0) |
  292. ((y==a.y) ? hkVector4Comparison::MASK_Y : 0) |
  293. ((z==a.z) ? hkVector4Comparison::MASK_Z : 0) |
  294. ((w==a.w) ? hkVector4Comparison::MASK_W : 0);
  295. return ret;
  296. }
  297. inline hkVector4Comparison hkVector4::compareLessThanEqual4(const hkVector4& a) const
  298. {
  299. hkVector4Comparison ret;
  300. ret.m_mask =
  301. ((x<=a.x) ? hkVector4Comparison::MASK_X : 0) |
  302. ((y<=a.y) ? hkVector4Comparison::MASK_Y : 0) |
  303. ((z<=a.z) ? hkVector4Comparison::MASK_Z : 0) |
  304. ((w<=a.w) ? hkVector4Comparison::MASK_W : 0);
  305. return ret;
  306. }
  307. inline hkVector4Comparison hkVector4::compareLessThanZero4() const
  308. {
  309. hkVector4Comparison ret;
  310. ret.m_mask =
  311. ((x<0) ? hkVector4Comparison::MASK_X : 0) |
  312. ((y<0) ? hkVector4Comparison::MASK_Y : 0) |
  313. ((z<0) ? hkVector4Comparison::MASK_Z : 0) |
  314. ((w<0) ? hkVector4Comparison::MASK_W : 0);
  315. return ret;
  316. }
  317. inline hkBool32 hkVector4::allLessThan3(hkVector4Parameter a) const
  318. {
  319. return x<a.x && y<a.y && z<a.z;
  320. }
  321. inline hkBool32 hkVector4::allLessThan4(hkVector4Parameter a) const
  322. {
  323. return x<a.x && y<a.y && z<a.z && w<a.w;
  324. }
  325. inline void hkVector4::select32( hkVector4Parameter a, hkVector4Parameter b, const hkVector4Comparison& comp)
  326. {
  327. int m = comp.getMask();
  328. x = (m & hkVector4Comparison::MASK_X) ? b.x : a.x;
  329. y = (m & hkVector4Comparison::MASK_Y) ? b.y : a.y;
  330. z = (m & hkVector4Comparison::MASK_Z) ? b.z : a.z;
  331. w = (m & hkVector4Comparison::MASK_W) ? b.w : a.w;
  332. }
  333. inline void hkVector4::setNeg4(const hkVector4& v)
  334. {
  335. x = -v.x;
  336. y = -v.y;
  337. z = -v.z;
  338. w = -v.w;
  339. }
  340. inline void hkVector4::setNeg3(const hkVector4& v)
  341. {
  342. x = -v.x;
  343. y = -v.y;
  344. z = -v.z;
  345. w =  v.w;
  346. }
  347. inline void hkVector4::setAbs4(const hkVector4& v)
  348. {
  349. x = hkMath::fabs(v.x);
  350. y = hkMath::fabs(v.y);
  351. z = hkMath::fabs(v.z);
  352. w = hkMath::fabs(v.w);
  353. }
  354. #if !defined(HK_VECTOR4_setMin4)
  355. inline void hkVector4::setMin4(const hkVector4& a, const hkVector4& b)
  356. {
  357. x = a.x < b.x ? a.x : b.x;
  358. y = a.y < b.y ? a.y : b.y;
  359. z = a.z < b.z ? a.z : b.z;
  360. w = a.w < b.w ? a.w : b.w;
  361. }
  362. #endif
  363. #if !defined( HK_VECTOR4_setMax4)
  364. inline void hkVector4::setMax4(const hkVector4& a, const hkVector4& b)
  365. {
  366. x = a.x > b.x ? a.x : b.x;
  367. y = a.y > b.y ? a.y : b.y;
  368. z = a.z > b.z ? a.z : b.z;
  369. w = a.w > b.w ? a.w : b.w;
  370. }
  371. #endif
  372. #if !defined( HK_VECTOR4__setMul3)
  373. inline void hkVector4::_setMul3( const hkMatrix3& r, const hkVector4& v )
  374. {
  375. //HK_ASSERT(0x28487ddd, hkMath::isAliased(r,this) == false );
  376. hkReal v0 = v(0);
  377. hkReal v1 = v(1);
  378. hkReal v2 = v(2);
  379. hkVector4& t = *this;
  380. t(0) = r(0,0)*v0 + r(0,1)*v1 + r(0,2)*v2;
  381. t(1) = r(1,0)*v0 + r(1,1)*v1 + r(1,2)*v2;
  382. t(2) = r(2,0)*v0 + r(2,1)*v1 + r(2,2)*v2;
  383. t(3) = 0;
  384. }
  385. #endif
  386. #if !defined( HK_VECTOR4__setMul4)
  387. inline void hkVector4::_setMul4( const hkMatrix3& t, const hkVector4& v )
  388. {
  389. //HK_ASSERT(0x28487ddd, hkMath::isAliased(t,this) == false );
  390. hkReal v0 = v(0);
  391. hkReal v1 = v(1);
  392. hkReal v2 = v(2);
  393. hkVector4& d = *this;
  394. d(0) = t(0,0)*v0 + t(0,1)*v1 + t(0,2)*v2;
  395. d(1) = t(1,0)*v0 + t(1,1)*v1 + t(1,2)*v2;
  396. d(2) = t(2,0)*v0 + t(2,1)*v1 + t(2,2)*v2;
  397. d(3) = t(3,0)*v0 + t(3,1)*v1 + t(3,2)*v2;
  398. }
  399. #endif
  400. #if !defined( HK_VECTOR4__setMul4xyz1)
  401. inline void hkVector4::_setMul4xyz1( const hkTransform& t, const hkVector4& v )
  402. {
  403. //HK_ASSERT(0x28487ddd, hkMath::isAliased(t,this) == false );
  404. hkReal v0 = v(0);
  405. hkReal v1 = v(1);
  406. hkReal v2 = v(2);
  407. hkVector4& d = *this;
  408. d(0) = t(0,0)*v0 + t(0,1)*v1 + t(0,2)*v2 + t(0,3);
  409. d(1) = t(1,0)*v0 + t(1,1)*v1 + t(1,2)*v2 + t(1,3);
  410. d(2) = t(2,0)*v0 + t(2,1)*v1 + t(2,2)*v2 + t(2,3);
  411. d(3) = t(3,0)*v0 + t(3,1)*v1 + t(3,2)*v2 + t(3,3);
  412. }
  413. #endif
  414. #if !defined( HK_VECTOR4__setRotatedDir)
  415. inline void hkVector4::_setRotatedDir(const hkRotation& r, const hkVector4& v)
  416. {
  417. _setMul3(r,v);
  418. }
  419. #endif
  420. #if !defined( HK_VECTOR4__setRotatedInverseDir)
  421. inline void hkVector4::_setRotatedInverseDir(const hkRotation& r, const hkVector4& v)
  422. {
  423. //HK_ASSERT(0x28487ddd, hkMath::isAliased(r,this) == false );
  424. hkReal v0 = v(0);
  425. hkReal v1 = v(1);
  426. hkReal v2 = v(2);
  427. hkVector4& t = *this;
  428. t(0) = r(0,0)*v0 + r(1,0)*v1 + r(2,0)*v2;
  429. t(1) = r(0,1)*v0 + r(1,1)*v1 + r(2,1)*v2;
  430. t(2) = r(0,2)*v0 + r(1,2)*v1 + r(2,2)*v2;
  431. t(3) = 0;
  432. }
  433. #endif
  434. #if !defined( HK_VECTOR4__setTransformedPos)
  435. inline void hkVector4::_setTransformedPos(const hkTransform& t, const hkVector4& v)
  436. {
  437. //HK_ASSERT(0x28487ddd, hkMath::isAliased(t,this) == false );
  438. hkReal v0 = v(0);
  439. hkReal v1 = v(1);
  440. hkReal v2 = v(2);
  441. hkVector4& d = *this;
  442. d(0) = t(0,0)*v0 + t(0,1)*v1 + t(0,2)*v2 + t(0,3);
  443. d(1) = t(1,0)*v0 + t(1,1)*v1 + t(1,2)*v2 + t(1,3);
  444. d(2) = t(2,0)*v0 + t(2,1)*v1 + t(2,2)*v2 + t(2,3);
  445. d(3) = 0;
  446. }
  447. #endif
  448. #if !defined( HK_VECTOR4__setTransformedInversePos)
  449. inline void hkVector4::_setTransformedInversePos(const hkTransform& t, const hkVector4& v)
  450. {
  451. //HK_ASSERT(0x28487ddd, hkMath::isAliased(t,this) == false );
  452. hkReal v0 = v(0) - t(0,3);
  453. hkReal v1 = v(1) - t(1,3);
  454. hkReal v2 = v(2) - t(2,3);
  455. hkVector4& d = *this;
  456. d(0) = t(0,0)*v0 + t(1,0)*v1 + t(2,0)*v2;
  457. d(1) = t(0,1)*v0 + t(1,1)*v1 + t(2,1)*v2;
  458. d(2) = t(0,2)*v0 + t(1,2)*v1 + t(2,2)*v2;
  459. d(3) = 0.0f;
  460. }
  461. #endif
  462. /* length and distance */
  463. inline hkSimdReal hkVector4::dot3(const hkVector4& a) const
  464. {
  465. return (x * a.x) + ( y * a.y ) + ( z * a.z );
  466. }
  467. inline void hkVector4::setDot3(hkVector4Parameter a, hkVector4Parameter b)
  468. {
  469. x = ( a.x * b.x ) + ( a.y * b.y ) + ( a.z * b.z );
  470. }
  471. inline hkReal hkVector4::dot3fpu(const hkVector4& a) const
  472. {
  473. return (x * a.x) + ( y * a.y ) + ( z * a.z );
  474. }
  475. inline hkSimdReal hkVector4::dot4(const hkVector4& a) const
  476. {
  477. return (x * a.x) + ( y * a.y ) + ( z * a.z ) + ( w * a.w );
  478. }
  479. inline void hkVector4::setDot4(hkVector4Parameter a, hkVector4Parameter b)
  480. {
  481. x = y = z = w = ( a.x * b.x ) + ( a.y * b.y ) + ( a.z * b.z) + ( a.w * b.w );
  482. }
  483. inline hkSimdReal hkVector4::dot4xyz1(const hkVector4& a) const
  484. {
  485. return (x * a.x) + ( y * a.y ) + ( z * a.z ) + ( w  );
  486. }
  487. inline hkSimdReal hkVector4::horizontalAdd3() const
  488. {
  489. return x+y+z;
  490. }
  491. inline hkSimdReal hkVector4::horizontalAdd4() const
  492. {
  493. return x+y+z+w;
  494. }
  495. #if !defined( HK_VECTOR4_length3)
  496. inline hkSimdReal hkVector4::length3() const
  497. {
  498. return hkMath::sqrt((x * x) + ( y * y ) + ( z * z ));
  499. }
  500. #endif
  501. inline hkSimdReal hkVector4::lengthSquared3() const
  502. {
  503. return this->dot3(*this);
  504. }
  505. #if !defined( HK_VECTOR4_lengthInverse3)
  506. inline hkSimdReal hkVector4::lengthInverse3() const
  507. {
  508. hkReal l2 = (x*x) + (y*y) + (z*z);
  509. return l2 ? hkMath::sqrtInverse(l2) : 0;
  510. }
  511. #endif
  512. #if !defined( HK_VECTOR4_length4)
  513. inline hkSimdReal hkVector4::length4() const
  514. {
  515. return hkMath::sqrt( (x * x) + (y * y) + (z * z) + (w * w) );
  516. }
  517. #endif
  518. inline hkSimdReal hkVector4::lengthSquared4() const
  519. {
  520. return this->dot4(*this);
  521. }
  522. #if !defined( HK_VECTOR4_lengthInverse4)
  523. inline hkSimdReal hkVector4::lengthInverse4() const
  524. {
  525. hkReal l2 = (x*x) + (y*y) + (z*z) + (w*w);
  526. return l2 ? hkMath::sqrtInverse(l2) : 0;
  527. }
  528. #endif
  529. #if !defined( HK_VECTOR4_normalize3 )
  530. inline void hkVector4::normalize3()
  531. {
  532. this->mul4( this->lengthInverse3() );
  533. HK_ASSERT2(0x475d86b1, isNormalized3(), "hkVector4 too small for normalize3");
  534. }
  535. #endif
  536. #if !defined( HK_VECTOR4_normalizeWithLength3)
  537. inline hkSimdReal hkVector4::normalizeWithLength3()
  538. {
  539. hkReal len = this->length3();
  540. this->mul4( (1.0f)/len );
  541. HK_ASSERT2(0x6fe84a9b, isNormalized3(), "hkVector4 too small for normalize3");
  542. return len;
  543. }
  544. #endif
  545. #if !defined( HK_VECTOR4_normalize4)
  546. inline void hkVector4::normalize4()
  547. {
  548. this->mul4( this->lengthInverse4() );
  549. HK_ASSERT2(0x21c8ab2a,  isNormalized4(), "hkVector4 too small for normalize4");
  550. }
  551. #endif
  552. #if !defined( HK_VECTOR4_normalizeWithLength4)
  553. inline hkSimdReal hkVector4::normalizeWithLength4()
  554. {
  555. hkReal len = this->length4();
  556. this->mul4( (1.0f)/len );
  557. HK_ASSERT2(0x309314d9,  isNormalized4(), "hkVector4 too small for normalize4");
  558. return len;
  559. }
  560. #endif
  561. inline void hkVector4::fastNormalize3()
  562. {
  563. normalize3();
  564. }
  565. inline void hkVector4::fastNormalize3NonZero()
  566. {
  567. hkReal l2 = (x*x) + (y*y) + (z*z);
  568. l2 = hkMath::sqrtInverse(l2);
  569. this->mul4( l2 );
  570. }
  571. inline hkSimdReal hkVector4::fastNormalizeWithLength3()
  572. {
  573. return normalizeWithLength3();
  574. }
  575. inline void hkVector4::broadcast(int i)
  576. {
  577. HK_ASSERT2(0x4a4d61ec, i>=0 && i<4, "index error in broadcast");
  578. hkReal r = (&x)[i];
  579. x = r;
  580. y = r;
  581. z = r;
  582. w = r;
  583. }
  584. inline void hkVector4::setBroadcast(const hkVector4& v, int i)
  585. {
  586. HK_ASSERT2(0x294fb42b, i>=0 && i<4, "index error in broadcast");
  587. hkReal r = (&v.x)[i];
  588. x = r;
  589. y = r;
  590. z = r;
  591. w = r;
  592. }
  593. inline void hkVector4::setBroadcast3clobberW(const hkVector4& v, int i)
  594. {
  595. HK_ASSERT2(0x294fb42b, i>=0 && i<4, "index error in broadcast");
  596. hkReal r = (&v.x)[i];
  597. x = r;
  598. y = r;
  599. z = r;
  600. w = r;
  601. }
  602. inline void hkVector4::_setTransformedPos(const hkQsTransform& a, const hkVector4& b)
  603. {
  604. hkVector4 scaled; scaled.setMul4(b, a.m_scale);
  605. hkVector4 rotated; rotated.setRotatedDir( a.m_rotation, scaled );
  606. setAdd4( rotated, a.m_translation );
  607. }
  608. inline void hkVector4::_setTransformedInversePos(const hkQsTransform& a, const hkVector4& b)
  609. {
  610. //HK_ASSERT(0x28487ddd, hkMath::isAliased(a,this) == false );
  611. hkVector4 temp(b);
  612. temp.sub4(a.m_translation);
  613. setRotatedInverseDir(a.m_rotation, temp);
  614. hkVector4 invScale; invScale.set(1.0f/a.m_scale(0), 1.0f/a.m_scale(1), 1.0f/a.m_scale(2));
  615. mul4(invScale);
  616. }
  617. /*
  618. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  619. * Confidential Information of Havok.  (C) Copyright 1999-2009
  620. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  621. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  622. * rights, and intellectual property rights in the Havok software remain in
  623. * Havok and/or its suppliers.
  624. * Use of this software for evaluation purposes is subject to and indicates
  625. * acceptance of the End User licence Agreement for this product. A copy of
  626. * the license is included with this software and is also available at www.havok.com/tryhavok.
  627. */