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

其他游戏

开发平台:

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_DYNAMICS2_SHAPE_PHANTOM_H
  9. #define HK_DYNAMICS2_SHAPE_PHANTOM_H
  10. #include <Physics/Dynamics/Phantom/hkpPhantom.h>
  11. #include <Common/Base/Types/Physics/MotionState/hkMotionState.h>
  12. class hkCollisionEnvironment;
  13. class hkpCollisionDispatcher;
  14. class hkpCollidable;
  15. class hkpShape;
  16. class hkpCollisionAgent;
  17. struct hkpLinearCastInput;
  18. struct hkpCollisionInput;
  19. class hkpCdPointCollector;
  20. class hkpCdBodyPairCollector;
  21. extern const hkClass hkpShapePhantomClass;
  22. /// This class represents a phantom with an arbitrary shape and transform for query purposes.<br>
  23. /// Please read the hkpPhantom documentation first.<br>
  24. /// It can be used to:
  25. ///   - get the closest points between the shape and all other nearby objects
  26. ///   - linear cast the shape against all other objects
  27. ///   - get the penetrations between the shape and its neighbours.
  28. /// - For each of the three functions, all the shapes in the world whose broadphase aabbs overlap
  29. /// with the hkpShapePhantom's broadphase aabb will be tested.
  30. /// This phantom has no physical presence in the simulation.<br>
  31. /// There are two implementations of this class:
  32. ///  - the hkpSimpleShapePhantom  which does not do any narrowphase caching
  33. ///  - the hkpCachingShapePhantom which caches the narrowphase by creating a
  34. ///    hkpCollisionAgent for every overlapping pair.
  35. /// <br>
  36. /// - In order to decide which version to use, you should first read the hkpGskBaseAgent documentation.
  37. /// Some rules when to use hkpCachingShapePhantom:
  38. ///   - Your shape is not a sphere and not a capsule (e.g. box, convexVertices...)
  39. ///   - CPU is more important than memory
  40. ///   - The position of your phantom moves with a reasonable velocity
  41. ///   - The length of the path in a linearcast is short
  42. class hkpShapePhantom : public hkpPhantom 
  43. {
  44. public:
  45. HK_DECLARE_REFLECTION();
  46. /// Constructor
  47. hkpShapePhantom( const hkpShape* shape, const hkTransform& transform );
  48. /// This function sets the position of the shape phantom and performs a linear cast from the new position of the shape
  49. /// phantom to the target position specified in hkpLinearCastInput.
  50. /// - Note: this will update the broadphase aabb
  51. /// - Note: this will assume that the rotation is already set
  52. /// The reason that these two operations are performed together is for performance reasons 
  53. /// (so that only one call to update the broadphase aabb is needed)
  54. /// This version of setPositionAndLinearCast creates an aabb big enough to hold the entire cast of the shape, and
  55. /// calls the broadphase, then calls linearCast on all the overlapping objects the broadphase returns. 
  56. /// If you are performing a long linear cast you should NOT use this method. Use hkpWorld::linearCast() instead.
  57. /// See comments for hkpWorld::linearCast() for more details.
  58. /// The [optional] startPointCollector returns all the closest points
  59. /// at the start point of the linear cast. If you do not want this functionality, pass HK_NULL as the
  60. /// "startCollector".
  61. virtual void setPositionAndLinearCast( const hkVector4& position, const hkpLinearCastInput& input, hkpCdPointCollector& castCollector, hkpCdPointCollector* startCollector ) = 0;
  62. /// This is analogical to setPositionAndLinearCast(), but it allows you to set the full initial transform.
  63. virtual void setTransformAndLinearCast( const hkTransform& transform, const hkpLinearCastInput& input, hkpCdPointCollector& castCollector, hkpCdPointCollector* startCollector ) = 0;
  64. /// You can call this in order to collect the closest points between the collidable and the objects
  65. /// at the phantoms current position. For each shape within collision tolerance of the shape in the phantom, the "collector"
  66. /// will receive a callback. See hkpCdPointCollector for more details.
  67. virtual void getClosestPoints( hkpCdPointCollector& collector, const hkpCollisionInput* input = HK_NULL ) = 0;
  68. /// This can be called in order to collect all penetrating shapes
  69. /// at the phantoms current position. For each shape which overlaps with the phantom's shape, the "collector" receives a callback.
  70. /// See hkpCdBodyPairCollector for more details.
  71. /// Although unlikely, it is possible that callbacks are issued in a nondeterministic order. To guarantee that
  72. /// the order is deterministic, proceed this call by a call to ensureDeterministicOrder().
  73. virtual void getPenetrations( hkpCdBodyPairCollector& collector, const hkpCollisionInput* input = HK_NULL ) = 0;
  74. /// Read access to the transform
  75. inline const hkTransform& getTransform() const;
  76. /// Sets the transform and updates the aabb
  77. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RW] [this,HK_ACCESS_RW] );
  78. void setTransform( const hkTransform& transform);
  79. /// A faster way to move the phantom, setting the translation only
  80. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RW] [this,HK_ACCESS_RW] );
  81. void setPosition( const hkVector4& position, hkReal extraTolerance = 0.0f );
  82. // Interface implementation
  83. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  84. hkWorldOperation::Result setShape( const hkpShape* shape );
  85. public:
  86. //
  87. // hkpPhantom interface
  88. //
  89. /// Get the current aabb
  90. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RO] );
  91. virtual void calcAabb( hkAabb& aabb );
  92. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RO] );
  93. virtual hkMotionState* getMotionState();
  94. class hkMotionState m_motionState;
  95. hkpShapePhantom( class hkFinishLoadedObjectFlag flag ) : hkpPhantom( flag ) {}
  96. //
  97. // INTERNAL USE ONLY
  98. //
  99. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  100. virtual void deallocateInternalArrays();
  101. };
  102. #include <Physics/Dynamics/Phantom/hkpShapePhantom.inl>
  103. #endif //HK_DYNAMICS2_SHAPE_PHANTOM_H
  104. /*
  105. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  106. * Confidential Information of Havok.  (C) Copyright 1999-2009
  107. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  108. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  109. * rights, and intellectual property rights in the Havok software remain in
  110. * Havok and/or its suppliers.
  111. * Use of this software for evaluation purposes is subject to and indicates
  112. * acceptance of the End User licence Agreement for this product. A copy of
  113. * the license is included with this software and is also available at www.havok.com/tryhavok.
  114. */