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

其他游戏

开发平台:

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. inline void HK_CALL hkpTriangleUtil::calcNormal( hkVector4& normal, const hkVector4& a, const hkVector4& b, const hkVector4& c ) 
  9. {
  10. hkVector4 cb;
  11. hkVector4 ab;
  12. cb.setSub4(c,b);
  13. ab.setSub4(a,b);
  14. normal.setCross( cb , ab);
  15. }
  16. inline void HK_CALL hkpTriangleUtil::calcCentroid( hkVector4& centroid, const hkVector4& a, const hkVector4& b, const hkVector4& c ) 
  17. {
  18. centroid.setAdd4(a,b);
  19. centroid.add4(c);
  20. centroid.mul4(1.0f/3.0f);
  21. }
  22. inline hkBool HK_CALL hkpTriangleUtil::inFront( const hkVector4& point, const hkVector4& a, const hkVector4& b, const hkVector4& c ) 
  23. {
  24. hkVector4 triangleNormal;
  25. calcNormal ( triangleNormal, a, b, c );
  26. hkVector4 d; d.setSub4(point, a);
  27. return  hkReal(d.dot3(triangleNormal)) > 0;
  28. }
  29. //
  30. // Checks that a point is inside a triangle
  31. // Assumes the point already lies in the plane of the triangle
  32. //
  33. inline hkBool HK_CALL hkpTriangleUtil::containsPoint( const hkVector4 &pt, const hkVector4& a, const hkVector4& b, const hkVector4& c ) 
  34. {
  35. // Get the normal of the triangle
  36. hkVector4 triangleNormal;
  37. calcNormal ( triangleNormal, a, b, c );
  38. // Check that the point is on the 'correct'
  39. // side of each triangle edge
  40. hkVector4 pta;
  41. pta.setSub4(pt,a);
  42. hkVector4 ba;
  43. ba.setSub4(b,a);
  44. pta.setCross(pta,ba);
  45. hkVector4 ptb;
  46. ptb.setSub4(pt,b);
  47. hkVector4 cb;
  48. cb.setSub4(c,b);
  49. ptb.setCross(ptb,cb);
  50. hkVector4 ptc;
  51. ptc.setSub4(pt,c);
  52. hkVector4 ac;
  53. ac.setSub4(a,c);
  54. ptc.setCross(ptc,ac);
  55. hkRotation simultaneousDots;
  56. //set column and then inverse mul
  57. //is actually faster than set row
  58. //and then mul
  59. simultaneousDots.setCols(pta,ptb,ptc);
  60. //pta now holds the dot products
  61. pta._setRotatedInverseDir(simultaneousDots,triangleNormal);
  62. // all dots less than zero means we are inside
  63. hkVector4 zero; zero.setZero4();
  64. return pta.allLessThan3(zero) != 0;
  65. }
  66. // The Triangle lies in the plane defined by x.N+d, where x is any point in the 
  67. // plane,  N is the normal to the plane and d is the distance from the plane to the 
  68. // origin (the planar distance)
  69. //inline hkReal HK_CALL hkpTriangleUtil::calcPlaneConstant( const hkVector4& a, const hkVector4& b, const hkVector4& c ) 
  70. //{
  71. // hkVector4 n;
  72. // calcNormal( n, a, b, c );
  73. // n.normalize3();
  74. //
  75. // return n.dot3(a);
  76. //}
  77. /*
  78. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  79. * Confidential Information of Havok.  (C) Copyright 1999-2009
  80. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  81. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  82. * rights, and intellectual property rights in the Havok software remain in
  83. * Havok and/or its suppliers.
  84. * Use of this software for evaluation purposes is subject to and indicates
  85. * acceptance of the End User licence Agreement for this product. A copy of
  86. * the license is included with this software and is also available at www.havok.com/tryhavok.
  87. */