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

其他游戏

开发平台:

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. #include <Physics/Dynamics/Entity/hkpEntityListener.h>
  9. #include <Physics/Dynamics/World/Listener/hkpIslandActivationListener.h>
  10. #include <Physics/Dynamics/Phantom/hkpPhantomListener.h>
  11. #include <Common/Base/Thread/JobQueue/hkJobQueue.h>
  12. #ifndef HK_KdTreeWorldManager_H
  13. #define HK_KdTreeWorldManager_H
  14. class hkJobThreadPool;
  15. class hkJobQueue;
  16. class hkpEntity;
  17. class hkKdTree;
  18. struct hkpWorldRayCastInput;
  19. struct hkpWorldRayCastOutput;
  20. class hkpRayHitCollector;
  21. struct hkpLinearCastInput;
  22. class hkpCdPointCollector;
  23. class hkpCollisionFilter;
  24. class hkpKdTreeWorldManager :  public hkReferencedObject, 
  25. public hkpEntityListener, 
  26. public hkpPhantomListener
  27. {
  28. public:
  29. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CDINFO);
  30. // When an object (either hkpEntity or hkpPhantom) is removed from the world, there are two options for what to do to the tree:
  31. // 1) Mark the tree is dirty, so that it must be rebuilt before any new raycasting is done.
  32. // This doesn't take any time, but means that you may need to rebuild the tree later
  33. // 2) Scan the tree for the entry corresponding to the object, and invalidate that entry
  34. // This can take a bit of time ( it requires linear search through an array), but means the tree doesn't need to be rebuilt.
  35. enum ObjectRemovedBehavior
  36. {
  37. MARK_TREE_AS_DIRTY,
  38. REMOVE_OBJECT_FROM_TREE
  39. };
  40. hkpKdTreeWorldManager(hkpWorld* world, ObjectRemovedBehavior behav = MARK_TREE_AS_DIRTY);
  41. virtual ~hkpKdTreeWorldManager();
  42. //
  43. // We need to receive callbacks to know when the world is dirty
  44. //
  45. //hkpEntityListener Interface
  46. virtual void entityAddedCallback( hkpEntity* entity );
  47. virtual void entityRemovedCallback( hkpEntity* entity );
  48. virtual void entitySetMotionTypeCallback( hkpEntity* entity );
  49. // hkpPhantomListener Interface
  50. virtual void phantomAddedCallback( hkpPhantom* phantom );
  51. virtual void phantomRemovedCallback( hkpPhantom* phantom );
  52. //
  53. // Maintenance
  54. //
  55. virtual void updateFromWorld(hkJobQueue* jobQueue = HK_NULL, hkJobThreadPool* jobThreadPool = HK_NULL);
  56. bool isUpToDate() const { return !m_mustUpdateFromWorld; }
  57. void setUpToDate(bool upToDate) { m_mustUpdateFromWorld = !upToDate; }
  58. void buildTree(hkKdTree*& tree, hkArray<const hkpCollidable*>& collidables, hkJobQueue* jobQueue = HK_NULL, hkJobThreadPool* jobThreadPool = HK_NULL);
  59. void buildTreeSingleThreaded(hkKdTree*& tree, hkArray<const hkpCollidable*>& collidables);
  60. void buildTreeDistributed(hkKdTree*& tree, hkArray<const hkpCollidable*>& collidables, hkJobQueue* jobQueue, hkJobThreadPool* jobThreadPool);
  61. void gatherCollidablesFromWorld(hkArray<const hkpCollidable*>& collidables);
  62. hkKdTree* getTree() { return m_tree; }
  63. const hkKdTree* getTree() const { return m_tree; }
  64. void removeObjectFromTree(const hkpWorldObject* object);
  65. //
  66. // Raycasting and linearcasting interface.
  67. // The methods are analogical to those in hkpWorld.
  68. //
  69. /// Cast a ray into the world and get the closest hit.
  70. void castRay(const hkpWorldRayCastInput& input, const hkpCollisionFilter* filter, hkpWorldRayCastOutput& output ) const;
  71. /// Cast a ray into the world and do a callback for every hit.
  72. void castRay(const hkpWorldRayCastInput& input, const hkpCollisionFilter* filter, hkpRayHitCollector& collector ) const;
  73. /// Cast a shape within the world.
  74. /// The castCollector collects all potential hits.
  75. void linearCast(const hkpCollidable* collA, 
  76. const struct hkpLinearCastInput& input, const class hkpCollidableCollidableFilter* filter,
  77. const struct hkpCollisionInput& collInput, struct hkpCollisionAgentConfig* config,
  78. class hkpCdPointCollector& castCollector, class hkpCdPointCollector* startPointCollector );
  79. protected:
  80. hkpWorld* m_world;
  81. hkKdTree* m_tree;
  82. hkBool m_mustUpdateFromWorld;
  83. hkEnum<ObjectRemovedBehavior, hkUint8> m_objectRemovedBehavior;
  84. };
  85. #endif // HK_KdTreeWorldManager_H
  86. /*
  87. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  88. * Confidential Information of Havok.  (C) Copyright 1999-2009
  89. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  90. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  91. * rights, and intellectual property rights in the Havok software remain in
  92. * Havok and/or its suppliers.
  93. * Use of this software for evaluation purposes is subject to and indicates
  94. * acceptance of the End User licence Agreement for this product. A copy of
  95. * the license is included with this software and is also available at www.havok.com/tryhavok.
  96. */