hkContactPoint.h
上传用户: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. #ifndef HK_MATH_CONTACT_POINT_H
  9. #define HK_MATH_CONTACT_POINT_H
  10. #include <Common/Base/hkBase.h>
  11. /// A type used to store contact point ids
  12. typedef hkUint16 hkContactPointId;
  13. /// Define an invalid contact point. Typically this is one which is not yet allocated by the hkpContactMgr
  14. #define HK_INVALID_CONTACT_POINT (0xffff)
  15. /// Contact point position, normal and distance. NOTE: All data is in World Space.
  16. ///
  17. /// The class uses two hkVector4 variables, and stores the distance for the contact point
  18. /// in the .w component of the m_separating variable.
  19. ///
  20. /// m_normal always points such that moving object A in the direction of the normal 'separates'
  21. /// the bodies. In other words, moving object A by -distance units in the direction of the normal
  22. /// will bring the bodies into exact (surface) contact. The direction of the normal does not change
  23. /// if the bodies become penetrating, but the distance will become negative. Thus the normal always points
  24. /// "into" A, and "out of" B.
  25. ///
  26. /// m_position is the contact point. It may be anywhere between the two "closest" points, depending on
  27. /// the agent which created it, but usually it's on object B surface. In the penetrating case the "closest points"
  28. /// is the pair which determines the direction of minimum separation.
  29. ///
  30. /// The distance (returned by getDistance()) is the distance between "closest points" on A and B.
  31. /// If this distance is negative, the bodies are penetrating.
  32. ///
  33. /// NOTE: To be totally precise, moving object A in the positive direction of the normal 'separates' the 
  34. /// "closest points", but is not (in the case of concave or compound bodies) guaranteed to separate
  35. /// the bodies themselves. 
  36. ///
  37. /// NOTE: When this structure is used in the hkpCdPointCollector callback from the hkpCollisionAgent::linearCast function,
  38. /// the "distance" value is actually the parameter between 0 and 1 along the linear cast that the hit occurred
  39. class hkContactPoint
  40. {
  41. public:
  42. HK_DECLARE_REFLECTION();
  43. /// Get the position of the contact point.
  44. inline const hkVector4& getPosition() const;
  45. /// Get the position of the contact point.
  46. inline hkVector4& getPosition();
  47. /// Set the position
  48. inline void setPosition(const hkVector4& position);
  49. /// Get the normal of the contact point
  50. inline const hkVector4& getNormal() const;
  51.  
  52. /// Get a reference to the normal and distance
  53. inline const hkVector4& getSeparatingNormal() const;
  54. /// Get a non-const reference to the normal and distance
  55. inline hkVector4& getSeparatingNormal();
  56. /// sets the separating plane component
  57. inline void setSeparatingNormal( const hkVector4& normal, hkReal dist );
  58. /// sets the separating plane component
  59. inline void setSeparatingNormal( const hkVector4& separatingNormal );
  60. /// Set the normal
  61. inline void setNormal( const hkVector4& normal );
  62. /// Get the distance as float
  63. inline hkReal getDistance() const;
  64. /// Get the distance as SimdReal
  65. inline hkSimdReal getDistanceSimdReal() const;
  66. /// Set the distance
  67. inline void setDistance( hkReal d );
  68. /// Set the position, normal and distance
  69. inline void set( const hkVector4& position, const hkVector4& normal, float dist );
  70. /// Invert the direction of this contact.
  71. /// The normal is flipped and the contact position adjusted.
  72. inline void setFlipped( const hkContactPoint& point );
  73. /// Invert the direction of this contact.
  74. /// The normal is flipped and the contact position adjusted.
  75. inline void flip();
  76. protected:
  77. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkContactPoint );
  78. hkVector4 m_position;
  79. hkVector4 m_separatingNormal; // .w is the the distance
  80. };
  81. #include <Common/Base/Types/Physics/ContactPoint/hkContactPoint.inl>
  82. #endif // HK_MATH_CONTACT_POINT_H
  83. /*
  84. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  85. * Confidential Information of Havok.  (C) Copyright 1999-2009
  86. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  87. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  88. * rights, and intellectual property rights in the Havok software remain in
  89. * Havok and/or its suppliers.
  90. * Use of this software for evaluation purposes is subject to and indicates
  91. * acceptance of the End User licence Agreement for this product. A copy of
  92. * the license is included with this software and is also available at www.havok.com/tryhavok.
  93. */