hkpAabbPhantom.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_AABB_PHANTOM_H
  9. #define HK_DYNAMICS2_AABB_PHANTOM_H
  10. #include <Physics/Dynamics/Phantom/hkpPhantom.h>
  11. #include <Common/Base/Types/Geometry/Aabb/hkAabb.h>
  12. struct hkpWorldRayCastInput;
  13. struct hkpWorldRayCastOutput;
  14. class hkpRayHitCollector;
  15. struct hkpLinearCastInput;
  16. class hkpCdPointCollector;
  17. class hkpCdPointCollector;
  18. class hkpCollidable;
  19. extern const hkClass hkpAabbPhantomClass;
  20. /// This phantom simply maintains a list of hkpCollidable objects that overlap with the phantom's aabb
  21. /// hkAabbPhantoms are very fast as they use only broadphase collision detection. They are recommended
  22. ///  - for any triggers / regions you need for game logic for which a detailed shape is not necessary (i.e you can
  23. ///    use an aabb). This phantom has no hkpShape associated with it. If you call getShape() on the hkpCollidable
  24. ///    stored in this phantom, it will return HK_NULL.<br>
  25. ///  - to speed up short-ray casts, which are repeated every frame at roughly the same position
  26. ///    (e.g the wheels of the car in the Havok vehicle SDK).
  27. ///    See hkpAabbPhantom::castRay() for details.<br>
  28. ///    Note: This is highly not recommended if you have long or non frame coherent raycasts.
  29. class hkpAabbPhantom : public hkpPhantom
  30. {
  31. public:
  32. HK_DECLARE_REFLECTION();
  33. /// To add a phantom to the world, you use hkpWorld::addEntity( myPhantom ).
  34. hkpAabbPhantom( const hkAabb& aabb, hkUint32 collisionFilterInfo = 0 );
  35. ~hkpAabbPhantom();
  36. /// Gets the hkpPhantom type. For this class the type is HK_PHANTOM_AABB
  37. virtual hkpPhantomType getType() const;
  38. /// Gets the list of collidables that are currently overlapping with the phantom.
  39. /// Although unlikely, it is possible that the order of elements in the array is
  40. /// nondeterministic. To ensure determinism, proceed the call by a call to 
  41. /// ensureDeterministicOrder().
  42. inline hkArray<hkpCollidable*>& getOverlappingCollidables();
  43. /// Casts a ray specified by "input". For each hit found the "collector" object receives
  44. /// a callback. See the hkpRayHitCollector for details.
  45. /// Note: You must make sure that the hkAabb for the phantom contains the ray being cast.
  46. /// call setAabb() with an aabb of the correct size in the correct place if this is not the case.
  47. /// The phantom castRay collects up all the collidables overlapping with the aabb of the ray, and
  48. /// calls castRay against these collidables. This is usually much fast than calling hkpWorld::castRay().
  49. /// If you are calling a long ray cast, you should use
  50. /// hkpWorld::castRay instead.
  51. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  52. void castRay( const hkpWorldRayCastInput& input, hkpRayHitCollector& collector ) const;
  53. /// Casts a ray specified by "input". This fills out the output structure with the closest
  54. /// ray hit.
  55. /// Note: You must make sure that the hkAabb for the phantom contains the ray being cast.
  56. /// call setAabb() with an aabb of the correct size in the correct place if this is not the case.
  57. /// The phantom castRay collects up all the collidables overlapping with the aabb of the ray, and
  58. /// calls castRay against these collidables. If you are calling a long ray cast, you should use
  59. /// hkpWorld::castRay instead.
  60. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  61. void castRay( const hkpWorldRayCastInput& input, hkpWorldRayCastOutput& output ) const;
  62. /// Casts the collidable "toBeCast" against each of this phantoms's overlapping
  63. /// collidables.
  64. /// The collision filter of the given collidable is tested against the
  65. /// collision filter of any collidables overlapping with the phantom, using the
  66. /// world's collision filter.
  67. /// This is a convenience function for performing asynchronous queries like
  68. /// hkpAabbPhantom::castRay, and does not modify the phantom or the collidable
  69. /// which is cast.
  70. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  71. void linearCast(const hkpCollidable* const toBeCast, const hkpLinearCastInput& input, hkpCdPointCollector& castCollector, hkpCdPointCollector* startCollector ) const;
  72. //
  73. // hkpPhantom interface
  74. //
  75. // hkpPhantom interface implementation
  76. virtual void calcAabb( hkAabb& aabb );
  77. // hkpPhantom interface implementation
  78. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  79. virtual void addOverlappingCollidable( hkpCollidable* collidable );
  80. // hkpPhantom interface implementation
  81. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_IGNORE] [this,HK_ACCESS_RO] );
  82. virtual hkBool isOverlappingCollidableAdded( const hkpCollidable* collidable );
  83. // hkpPhantom interface implementation
  84. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  85. virtual void removeOverlappingCollidable( hkpCollidable* collidable );
  86. /// hkpPhantom clone interface
  87. virtual hkpPhantom* clone() const; 
  88. /// Sets the aabb. 
  89. /// This will also update the the broadphase, which may trigger the callbacks addOverlappingCollidable and removeOverlappingCollidable
  90. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  91. void setAabb(const hkAabb& newAabb);
  92. /// Get the aabb of the phantom
  93. inline const hkAabb& getAabb( ) const;
  94. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RO] );
  95. void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls ) const;
  96. protected:
  97. virtual hkMotionState* getMotionState(){ return HK_NULL; }
  98. class hkAabb m_aabb;
  99. hkArray<hkpCollidable*> m_overlappingCollidables; //+nosave
  100. public:
  101. hkpAabbPhantom( class hkFinishLoadedObjectFlag flag );
  102. //
  103. // INTERNAL USE ONLY
  104. //
  105. /// ###ACCESS_CHECKS###( [m_world,HK_ACCESS_RO] [this,HK_ACCESS_RW] );
  106. virtual void deallocateInternalArrays();
  107. private:
  108. inline void ensureSpuAlignment();
  109. public:
  110. /// Ensures that collidables returned by getOverlappingCollidables are in deterministic 
  111. /// order.
  112. virtual void ensureDeterministicOrder();
  113. public:
  114. /// False if the array of collidables has changed since we last sorted it.
  115. hkBool m_orderDirty; //+nosave
  116. /// Order relation on m_overlappingCollidables.
  117. class OrderByUid;
  118. };
  119. #include <Physics/Dynamics/Phantom/hkpAabbPhantom.inl>
  120. #endif // HK_DYNAMICS2_AABB_PHANTOM_H
  121. /*
  122. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  123. * Confidential Information of Havok.  (C) Copyright 1999-2009
  124. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  125. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  126. * rights, and intellectual property rights in the Havok software remain in
  127. * Havok and/or its suppliers.
  128. * Use of this software for evaluation purposes is subject to and indicates
  129. * acceptance of the End User licence Agreement for this product. A copy of
  130. * the license is included with this software and is also available at www.havok.com/tryhavok.
  131. */