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

其他游戏

开发平台:

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_CHARACTER_PROXY_H
  9. #define HK_CHARACTER_PROXY_H
  10. #include <Common/Base/Types/Physics/hkStepInfo.h>
  11. #include <Physics/Dynamics/Entity/hkpEntityListener.h>
  12. #include <Physics/Dynamics/Phantom/hkpPhantomListener.h>
  13. #include <Physics/Utilities/CharacterControl/hkpCharacterControl.h>
  14. #include <Physics/Utilities/CharacterControl/CharacterProxy/hkpCharacterProxyCinfo.h>
  15. #include <Physics/Utilities/CharacterControl/CharacterProxy/hkpCharacterProxyListener.h>
  16. class hkpShapePhantom;
  17. class hkpAllCdPointCollector;
  18. class hkpClosestCdPointCollector;
  19. struct hkpRootCdPoint;
  20. struct hkpSurfaceConstraintInfo;
  21. struct hkpSurfaceConstraintInteraction;
  22. struct hkpSimplexSolverOutput;
  23. struct hkpLinearCastInput;
  24. /// The character proxy class is used to represent a non penetrating shape that can move dynamically around
  25. /// the scene. It is called character proxy because it is usually used to represent game characters. It could
  26. /// just as easily be used to represent any dynamic game object.
  27. class hkpCharacterProxy : public hkReferencedObject,
  28. public hkpEntityListener,
  29. public hkpPhantomListener
  30. {
  31. public:
  32. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CHARACTER);
  33. /// Initialize members from the construction info.
  34. /// Add references to each of the shapes.
  35. hkpCharacterProxy(const hkpCharacterProxyCinfo& info);
  36. /// Remove references to the phantom
  37. /// Remove the phantom if it has been added to the world
  38. virtual ~hkpCharacterProxy();
  39. /// Get construction info from this character proxy.
  40. void getCinfo(hkpCharacterProxyCinfo& info) const;
  41. /// Update from a given construction info.
  42. void updateFromCinfo( const hkpCharacterProxyCinfo& cinfo );
  43. /// Update and move the character. To override the logic defining which bodies the character can collide
  44. /// with or capture this information for your own use (e.g. to deal with 'trigger' volumes), use ::integrateWithCollectors() instead.
  45. /// By default ::integrate() uses hkAllCdPointCollectors for the character's collision queries.
  46. /// The worldGravity parameter is only used when the character's mass is greater than 0, to apply downward impulses to dynamic objects.
  47. void integrate(const hkStepInfo& stepInfo, const hkVector4& worldGravity);
  48. /// Update and move the character. You must pass the two collectors used internally in the hkpShapePhantom::setPositionAndLinearCast()
  49. /// calls. Implementing your own hkpAllCdPointCollector will allow you to customize the character's movement behavior
  50. /// or extract information about objects it overlaps with or objects it linear casts through.
  51. /// The gravity parameter is only used when the character's mass is greater than 0, to apply downward impulses to dynamic objects.
  52. void integrateWithCollectors(const hkStepInfo& stepInfo, const hkVector4& gravity, hkpAllCdPointCollector& castCollector, hkpAllCdPointCollector& startPointCollector);
  53. /// Check and see if the character is supported in the given direction (and by what).
  54. /// This call checks the geometry immediately around the character, and does not take velocity into account.
  55. /// i.e. if the character is moving away from the ground, but is still touching the ground, this function
  56. /// will return SUPPORTED as the supported state.
  57. void checkSupport(const hkVector4& direction, hkpSurfaceInfo& ground);
  58. /// This function is the same as the checkSupportFunction, except it allows you to pass your own collectors to filter
  59. /// collisions. You only need to call this if you are using the integrateWithCollectors call.
  60. void checkSupportWithCollector(const hkVector4& direction, hkpSurfaceInfo& ground, hkpAllCdPointCollector& startPointCollector);
  61. /// When hkpCharacterProxy::integrate() is called, or hkpWorld::stepDeltaTime() is called, the manifold
  62. /// information will become out of date.  If you use the manifold in your state machine, and need it to be
  63. /// up to date, you should call this function first. Note that this function is called by checkSupport automatically,
  64. /// so if you call checkSupport just before your state machine, you do not need to call this function.
  65. void refreshManifold( hkpAllCdPointCollector& startPointCollector );
  66. /// Read access to the current manifold for the character
  67. const hkArray<hkpRootCdPoint>& getManifold() const;
  68. /// Get current position
  69. const hkVector4& getPosition() const;
  70. /// Warp the character (through walls etc.)
  71. void setPosition(const hkVector4& position);
  72. /// Gets the linear velocity
  73. const hkVector4& getLinearVelocity() const;
  74. /// Sets the velocity
  75. void setLinearVelocity( const hkVector4& vel );
  76. /// Get the character phantom
  77. hkpShapePhantom* getShapePhantom();
  78. /// Get the character phantom const version
  79. const hkpShapePhantom* getShapePhantom() const;
  80. /// The 3.0.0 version of check support
  81. void checkSupportDeprecated(const hkVector4& direction, hkpSurfaceInfoDeprecated& ground) const;
  82. /// Add a hkpCharacterProxyListener
  83. void addCharacterProxyListener(hkpCharacterProxyListener* listener);
  84. /// Remove a hkpCharacterProxyListener
  85. void removeCharacterProxyListener(hkpCharacterProxyListener* listener);
  86. protected:
  87. /// Update the manifold of contact points without calling collision detection
  88. virtual void updateManifold(const hkpAllCdPointCollector& startPointCollector, const hkpAllCdPointCollector& castCollector);
  89. /// Apply impulses to the object.
  90. void applySurfaceInteractions( const hkStepInfo& info, const hkVector4& gravity );
  91. /// Build surface constraint information from the point returned by a cast.
  92. /// Extract the information from a contact point returned by the linear caster.
  93. /// This information is translated into surface constraint information.
  94. /// This is the bridge between the collision detector and the character controller.
  95. virtual void extractSurfaceConstraintInfo(const hkpRootCdPoint& hit, hkpSurfaceConstraintInfo& surfaceOut, hkReal timeTravelled) const;
  96. // Search the current manifold for this surface
  97. // returns -1 if the surface has not been found
  98. int findSurface(const hkpRootCdPoint& info) const;
  99. // Defines a distance metric for keeping and discarding planes
  100. // Used to update the mnaifold
  101. inline hkReal surfaceDistance(const hkpRootCdPoint& p1, const hkpRootCdPoint& p2) const;
  102. // Extract the surface velocity at a point returned by a cast
  103. inline void extractSurfaceVelocity(const hkpRootCdPoint& hit, hkVector4& velocityOut) const;
  104. /// Converts the distance stored as a fraction in the cast collector to a proper euclidean distance.
  105. /// The cast collector returns distances as a fraction of the cast.
  106. /// We need to convert these to Euclidian distances, and project them onto the
  107. /// normal of the collision plane. This replaces the fraction by the
  108. /// correct distance and moves the fraction to the normal.w component.
  109. inline void convertFractionToDistance( const hkpRootCdPoint* hits , int numHits, const hkVector4& displacement) const;
  110. // utility methods
  111. void fireContactAdded(const hkpRootCdPoint& point) const;
  112. void fireContactRemoved(const hkpRootCdPoint& point) const;
  113. void fireConstraintsProcessed( const hkArray<hkpRootCdPoint>& manifold, hkpSimplexSolverInput& input ) const;
  114. // Set position and return time travelled.
  115. hkReal moveToLinearCastHitPosition(const hkpSimplexSolverOutput& output,
  116. const hkpAllCdPointCollector& castCollector,
  117. const hkpLinearCastInput& castInput,
  118. hkVector4& position);
  119. public:
  120. // used internally to update the manifold if a body is deleted
  121. void entityRemovedCallback( hkpEntity* entity );
  122. // used internally to update the manifold if a phantom is deleted
  123. void phantomRemovedCallback( hkpPhantom* entity );
  124.         void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls) const;
  125. public:
  126. hkVector4 m_velocity;
  127. hkVector4 m_oldDisplacement;
  128. hkpShapePhantom* m_shapePhantom;
  129. hkReal m_dynamicFriction;
  130. hkReal m_staticFriction;
  131. hkVector4 m_up;
  132. hkReal m_extraUpStaticFriction;
  133. hkReal m_extraDownStaticFriction;
  134. hkReal m_keepDistance;
  135. hkReal m_keepContactTolerance;
  136. hkReal m_contactAngleSensitivity;
  137. int m_userPlanes;
  138. hkReal m_maxCharacterSpeedForSolver;
  139. hkReal m_characterStrength;
  140. hkReal m_characterMass;
  141. hkArray<hkpRootCdPoint> m_manifold;
  142. hkArray<hkpCharacterProxyListener*> m_listeners;
  143. hkArray<hkpRigidBody*> m_bodies;
  144. hkArray<hkpPhantom*> m_phantoms;
  145. hkReal m_maxSlopeCosine;
  146. hkReal m_penetrationRecoverySpeed;
  147. int m_maxCastIterations;
  148. bool m_refreshManifoldInCheckSupport;
  149. };
  150. #endif //HK_CHARACTER_PROXY_H
  151. /*
  152. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  153. * Confidential Information of Havok.  (C) Copyright 1999-2009
  154. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  155. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  156. * rights, and intellectual property rights in the Havok software remain in
  157. * Havok and/or its suppliers.
  158. * Use of this software for evaluation purposes is subject to and indicates
  159. * acceptance of the End User licence Agreement for this product. A copy of
  160. * the license is included with this software and is also available at www.havok.com/tryhavok.
  161. */