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

其他游戏

开发平台:

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_DETECT_RAGDOLL_PENETRATION_H
  9. #define HK_DETECT_RAGDOLL_PENETRATION_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Container/Array/hkObjectArray.h>
  12. /// This interface class defines a single method, castRay(), and it's used by the hkaDetectRagdollPenetration object to cast rays
  13. /// into the application's world. 
  14. class hkaRagdollRaycastInterface
  15. {
  16. public:
  17. virtual ~hkaRagdollRaycastInterface() { }
  18. /// Abstract method, should be implemented by the user in a derived class. Given two points, "from" and "to", specified in
  19. /// world space, and Aabb phantom (encapsulates ragdoll), it should return whether a ray between those two points intersects the scene or not. If it does (if it returns true), 
  20. /// the hitPoint and the hitNormal are returned. 
  21. virtual hkBool castRay (const class hkpAabbPhantom* phantomIn,  const hkVector4& fromWS, const hkVector4& toWS, hkVector4& hitPointWS, hkVector4& hitNormalWS ) = 0;
  22. };
  23. /// hkaDetectRagdollPenetration class detects penetration of ragdoll with landscape. The method takes as input actual hkaPose and performs
  24. /// raycasting of all bones with landscape. Output is the array of the penetrated bones. Each output for penetrated bone contains the begin and
  25. /// end indexes of the bone, penetration point in world coordinates and the normal of penetrated landscape.
  26. /// Raycasting is defined in hkaRagdollRaycastInterface (mainly correct landscape layer); 
  27. /// The class also contains very important static utility method isBonePenetratedOrDescendant for checking particular bone status in input 
  28. /// ragdoll according to results of penetration detection. The method returns three states for the bone: no penetrated, penetrated or descendant 
  29. /// of penetrated bone. 
  30. class hkaDetectRagdollPenetration : public hkReferencedObject
  31. {
  32. public:
  33. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME );
  34. /// This structure is passed on construction of an hkaDetectRagdollPenetration, and contains information about
  35. /// the ragdoll skeleton, the interface to raycast and the AAbb phantom
  36. struct Setup
  37. {
  38. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaDetectRagdollPenetration::Setup );
  39. /// Ragdoll skeleton
  40. const class hkaSkeleton* m_ragdollSkeleton;
  41. /// An interface to ray cast functionality. The implementation should only hit objects that the user wants to
  42. /// check for collisions (ussually landscape). For example, it may ignore debris objects.
  43. class hkaRagdollRaycastInterface* m_raycastInterface;
  44. /// pointer to hkpAabbPhantom which encapsulates ragdoll 
  45. class hkpAabbPhantom* m_ragdollPhantom;
  46. /// Constructor. Sets some defaults.
  47. Setup(){}
  48. };
  49. /// This structure is filled by the detection routine, and contains information about the start 
  50. /// and end point of penetrated bone and about hit point and hit normal
  51. struct BonePenetration
  52. {
  53. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_DEMO, BonePenetration);
  54. /// Index of the bone (from)
  55. hkInt16 m_boneBeginIndex;
  56. /// Index of the next bone (to)
  57. hkInt16 m_boneEndIndex;
  58. /// Penetration point in world space
  59. hkVector4 m_penetrationPoint;
  60. /// Penetration normal in world space
  61. hkVector4 m_penetrationNormal;
  62. /// Constructor. Sets some defaults.
  63. BonePenetration();
  64. /// Destructor. Requested for hkObjectArray
  65. ~BonePenetration();
  66. };
  67. /// Penetration Status for particular bone return by static method isInPenetrationOrDescendant(bone, boneArray)
  68. enum BonePenetrationStatus
  69. {
  70. HK_NOP = 0, // No penetration
  71. HK_YESP = 1, // Yes, bone penetrates (penetration point lies on this bone)
  72. HK_YESP_DESCENDANT = 2 // Yes, bone is descendant of penetrated bones
  73. };
  74. /// Output structure holds array of BonePenetration objects
  75. struct Output
  76. {
  77. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIMATION, hkaDetectRagdollPenetration::Output );
  78. hkObjectArray<BonePenetration> m_penetrations;
  79. };
  80. /// Constructor input is setup structure. 
  81. hkaDetectRagdollPenetration ( const Setup& setup );
  82. /// Function detects penetrated bones stored in output array stucture, 
  83. hkBool detectPenetration( const class hkaPose& ragdollPoseIn, Output& output );
  84. /// Set m_poseReset to ensure reset of bonesStates after ragdoll keyframed state  
  85. void resetBoneStates();
  86. /// Get array of bones states (not penetrated, penetrated or descendant)
  87. const hkArray<BonePenetrationStatus>& getBoneStatusArray() {return m_boneStates;}
  88. private:
  89.         Setup m_setup;
  90. hkInt32 m_numBones;
  91. /// array with bone states (not penetrated, penetrated or descendant)
  92. hkArray<BonePenetrationStatus> m_boneStates;
  93. /// No penetration on all bones?
  94. hkBool m_ragdollIsOut;
  95.         
  96. };
  97. #endif // HK_DETECT_RAGDOLL_PENETRATION_H
  98. /*
  99. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  100. * Confidential Information of Havok.  (C) Copyright 1999-2009
  101. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  102. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  103. * rights, and intellectual property rights in the Havok software remain in
  104. * Havok and/or its suppliers.
  105. * Use of this software for evaluation purposes is subject to and indicates
  106. * acceptance of the End User licence Agreement for this product. A copy of
  107. * the license is included with this software and is also available at www.havok.com/tryhavok.
  108. */