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

其他游戏

开发平台:

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. hkpWeldingUtility::SectorType hkpWeldingUtility::getSector(const hkVector4& triangleNormal, const hkVector4& collisionNormal, int edgeBitcode )
  9. {
  10. // Calculate the cosine for the angle between the triangle's normal and the collision normal
  11. // Note: this is the projection of the collision normal onto the triangle's normal and will be compared against
  12. //       the current edge's cosine values.
  13. hkReal cosAngle = triangleNormal.dot3(collisionNormal);
  14. if      ( cosAngle >= m_sinCosTable[edgeBitcode].m_cosAccept0 )
  15. {
  16. return hkpWeldingUtility::ACCEPT_0;
  17. }
  18. else if ( cosAngle >= m_sinCosTable[edgeBitcode].m_cosSnap0 )
  19. {
  20. return hkpWeldingUtility::SNAP_0;
  21. }
  22. else if ( cosAngle >= m_sinCosTable[edgeBitcode].m_cosSnap1 )
  23. {
  24. return hkpWeldingUtility::REJECT;
  25. }
  26. else if ( cosAngle >= m_sinCosTable[edgeBitcode].m_cosAccept1 )
  27. {
  28. return hkpWeldingUtility::SNAP_1;
  29. }
  30. return hkpWeldingUtility::ACCEPT_1;
  31. }
  32. hkBool hkpWeldingUtility::shouldSnapOneSided(hkpWeldingUtility::WeldingType weldingType, const hkVector4& triangleNormal, const hkVector4& collisionNormal, int edgeBitcode )
  33. {
  34. hkReal cosAngle = triangleNormal.dot3(collisionNormal);
  35. hkReal* sinCosTableEntry = &m_sinCosTable[edgeBitcode].m_cosAccept0;
  36. return (weldingType == hkpWeldingUtility::WELDING_TYPE_ANTICLOCKWISE) ? cosAngle < sinCosTableEntry[weldingType] : cosAngle > sinCosTableEntry[weldingType];
  37. }
  38. void hkpWeldingUtility::calcSnapVector( const hkVector4& triangleNormal, const hkVector4& edge, int edgeBitcode, SectorType sector, hkVector4& snapVectorOut )
  39. {
  40. hkVector4 orthNormalEdge; orthNormalEdge.setCross(edge, triangleNormal);
  41. // rebuild the 'to-be-snapped-to' accept vector by accessing the float values directly via the sector id (either SNAP_0 or SNAP_1)
  42. hkReal* sinCosTableEntry = &m_sinCosTable[edgeBitcode].m_cosAccept0;
  43. hkVector4 hVec0; hVec0.setMul4( sinCosTableEntry[sector+0], triangleNormal );
  44. hkVector4 hVec1; hVec1.setMul4( sinCosTableEntry[sector+1], orthNormalEdge );
  45. snapVectorOut.setAdd4(hVec0, hVec1);
  46. snapVectorOut.normalize3();
  47. }
  48. void hkpWeldingUtility::calcSnapVectorOneSided( const hkVector4& triangleNormal, const hkVector4& edge, int edgeBitcode, hkpWeldingUtility::WeldingType weldingType, hkVector4& snapVectorOut )
  49. {
  50. calcSnapVector(triangleNormal, edge, edgeBitcode, (SectorType) weldingType, snapVectorOut );
  51. }
  52. void hkpWeldingUtility::snapCollisionNormal(const hkVector4& triangleNormal, const hkVector4& edge, int edgeBitcode, SectorType sector, hkVector4& collisionNormalInOut )
  53. {
  54. HK_ASSERT( 0xf02345ef, sector == SNAP_0 || sector == SNAP_1 );
  55. //
  56. // rebuild the original snap vector from the triangle normal and the sector information
  57. //
  58. hkVector4 snapVector; calcSnapVector( triangleNormal, edge, edgeBitcode, sector, snapVector );
  59. //
  60. // get the projection values of the collision normal onto the snap vector and the edge vector
  61. //
  62. hkSimdReal dot0 = snapVector.dot3(collisionNormalInOut);
  63. hkSimdReal dot1 = edge.dot3(collisionNormalInOut);
  64. //
  65. // build a new 'snapped' collision normal from the above reconstructed snap vector and the edge vector by using the above
  66. // calculated projection values
  67. //
  68. {
  69. hkVector4 hVec0; hVec0.setMul4(dot0, snapVector);
  70. hkVector4 hVec1; hVec1.setMul4(dot1, edge);
  71. collisionNormalInOut.setAdd4(hVec0, hVec1);
  72. collisionNormalInOut.normalize3();
  73. }
  74. HK_ASSERT2( 0xf0f3eaad, hkMath::equal( collisionNormalInOut.lengthSquared3(), 1.0f, 0.01f), "CollisionNormal is not normalized" );
  75. return;
  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. */