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

其他游戏

开发平台:

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_PHANTOM_H
  9. #define HK_DYNAMICS2_PHANTOM_H
  10. #include <Physics/Dynamics/World/hkpWorldObject.h>
  11. #include <Physics/Dynamics/Phantom/hkpPhantomOverlapListener.h>
  12. #include <Physics/Dynamics/Phantom/hkpPhantomType.h>
  13. class hkAabb;
  14. class hkpCollidable;
  15. class hkPhantomCinfo;
  16. class hkpPhantomListener;
  17. extern const hkClass hkpPhantomClass;
  18. /// Helper function that returns a hkpPhantom if the collidable's broadphase handle is of type hkpWorldObject::BROAD_PHASE_PHANTOM
  19. inline hkpPhantom* HK_CALL hkGetPhantom(const hkpCollidable* collidable);
  20. /// A phantom is simply an aabb entry in the world's broadphase. It can be moved around,
  21. /// and receives events when a new aabb overlap occurs with another phantom or entity,
  22. /// or an existing overlap ends. These events can occur either when you move the phantom around, or another
  23. /// object moves into or out of the phantom's aabb. <br>
  24. /// One major reason for using phantoms is to exploit frame coherency the broadphase. Moving objects
  25. /// around within the broadphase can be 5-100 times faster than querying the broadphase from scratch.<br>
  26. /// Therefore phantoms should be is used for collision queries where you wish to make several queries for
  27. /// an object that is relatively persistent in location:
  28. /// <ul>
  29. ///     <li>use hkpShapePhantom if your query involves a shape (e.g find all objects penetrating a sphere)
  30. ///     <li>use hkpAabbPhantom if your query does not use a shape (e.g. ray casts or simple AABB checks)
  31. ///      You can also an hkpAabbPhantom to create areas where events occur if the area is entered.
  32. /// </ul>
  33. /// <br>
  34. /// Phantoms can raise a number of events:
  35. /// <ul>
  36. ///     <li>phantom added/removed from the world ( received by hkpPhantomListener)
  37. ///     <li>broadphase overlaps created/destroyed (received by hkpPhantomOverlapListener)
  38. ///      Note: the hkpPhantomOverlapListener can actually reject a new overlap, thereby acting as 
  39. ///      a user collision filter.
  40. /// </ul>
  41. /// <br>
  42. /// Notes:
  43. /// <ul>
  44. ///   <li>All broadphase objects in the havok world are actually members of hkpCollidable objects.
  45. ///   <li>The addition and removal callback functions are addOverlappingCollidable and removeOverlappingCollidable (with the cast done for you).
  46. ///   <li>All hkpPhantom objects use the hkpWorld::getCollisionFilter as the filter for broadphase updates, and shape queries. The one notable
  47. ///       exception is that removeOverlappingCollidable() callbacks are fired independent of the current filter. See the UserGuide for more details.
  48. /// </ul>
  49. /// Attention: You only get good broadphase CPU, if the aabb is not jumping randomly around in your world. If it is,
  50. /// the hkpPhantom can only do a poor job of caching the broadphase and can result in a slower performance than calling the 
  51. /// same functions in hkpWorld.<br>
  52. class hkpPhantom : public hkpWorldObject
  53. {
  54. public:
  55. HK_DECLARE_REFLECTION();
  56. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_PHANTOM );
  57. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  58. ~hkpPhantom();
  59. /// Gets the hkpPhantom type.
  60. virtual hkpPhantomType getType() const = 0;
  61. /// Get the current aabb
  62. virtual void calcAabb( hkAabb& aabb ) = 0;
  63. /// Called by the broadphase for every new overlapping collidable
  64. virtual void addOverlappingCollidable( hkpCollidable* collidable ) = 0;
  65. /// Tests whether a collidable is known in the phantom
  66. virtual hkBool isOverlappingCollidableAdded( const hkpCollidable* collidable ) = 0;
  67. /// Called by the broadphase for every removed collidable - This may get called even if there was
  68. /// no corresponding addOverlappingCollidable() if the bodies are filtered not to collide.
  69. /// See the UserGuide for more details.
  70. virtual void removeOverlappingCollidable( hkpCollidable* collidable ) = 0;
  71. /// Ensures that the collidables or penetrations obtained from this phantom
  72. /// are in deterministic order.
  73. virtual void ensureDeterministicOrder() = 0;
  74. /// Given a phantom (this), return a new phantom that shares all static data
  75. /// such as the shape, but clones any dynamic runtime data.
  76. virtual hkpPhantom* clone() const = 0; 
  77. //
  78. // Listeners
  79. //
  80. /// Adds a phantom listener to the phantom
  81. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  82. void addPhantomListener( hkpPhantomListener* el);
  83. /// Removes an phantom listener from the phantom
  84. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  85. void removePhantomListener( hkpPhantomListener* el);
  86. /// Adds a phantom listener to the phantom
  87. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  88. void addPhantomOverlapListener( hkpPhantomOverlapListener* el);
  89. /// Removes an phantom listener from the phantom
  90. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  91. void removePhantomOverlapListener( hkpPhantomOverlapListener* el);
  92. /// Get const access to the array of phantom listeners
  93. inline const hkArray<hkpPhantomListener*>& getPhantomListeners() const;
  94. /// Get const access to the array of phantom overlap listeners
  95. inline const hkArray<hkpPhantomOverlapListener*>& getPhantomOverlapListeners() const;
  96. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RO] );
  97. void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls ) const;
  98. public:
  99. // Called internally by hkpWorld, this function updates all cached agents (if there are any)
  100. // to make sure they correspond correctly with the world's shape collection filter
  101. virtual void updateShapeCollectionFilter() {}
  102. // Fires phantom-added callbacks through all attached hkPhantomListeners
  103. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  104. void firePhantomAdded( );
  105. // Fires phantom-removed callbacks through all attached hkPhantomListeners
  106. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  107. void firePhantomRemoved( );
  108. // Fires phantom's shape set callbacks through all attached hkPhantomListeners
  109. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  110. void firePhantomShapeSet( );
  111. protected:
  112. inline hkpPhantom( const hkpShape* shape );
  113. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  114. void firePhantomDeleted( );
  115. protected:
  116. /// fires the callbacks and returns hkpCollidableAccept
  117. inline hkpCollidableAccept fireCollidableAdded( const hkpCollidable* collidable );
  118. /// fires the callbacks and returns hkpCollidableAccept
  119. inline void fireCollidableRemoved( const hkpCollidable* collidable, hkBool collidableWasAdded );
  120. public:
  121. // used by hkpWorldOperationUtil
  122. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RW] );
  123. void updateBroadPhase( const hkAabb& aabb );
  124. //  Sets cached aabbs in the m_boundingVolumeData member.
  125. void setBoundingVolumeData(const hkAabb& aabb);
  126. protected:
  127. hkArray<hkpPhantomOverlapListener*> m_overlapListeners; //+nosave
  128. hkArray<hkpPhantomListener*>        m_phantomListeners; //+nosave
  129. public:
  130. hkpPhantom( class hkFinishLoadedObjectFlag flag ) : hkpWorldObject( flag ) {}
  131. //
  132. // INTERNAL USE ONLY
  133. //
  134. // Called when a phantom is removed from the world.
  135. // In the case of an object being loaded from a packfile
  136. // This method ensures that any arrays that have grown dynamically 
  137. // After loading are correctly deallocated.
  138. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RW] );
  139. virtual void deallocateInternalArrays();
  140. };
  141. #include <Physics/Dynamics/Phantom/hkpPhantom.inl>
  142. #endif //HK_DYNAMICS2_PHANTOM_H
  143. /*
  144. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  145. * Confidential Information of Havok.  (C) Copyright 1999-2009
  146. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  147. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  148. * rights, and intellectual property rights in the Havok software remain in
  149. * Havok and/or its suppliers.
  150. * Use of this software for evaluation purposes is subject to and indicates
  151. * acceptance of the End User licence Agreement for this product. A copy of
  152. * the license is included with this software and is also available at www.havok.com/tryhavok.
  153. */