hkpBvTreeShape.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. #ifndef HK_COLLIDE2_BV_TREE_SHAPE_H
  9. #define HK_COLLIDE2_BV_TREE_SHAPE_H
  10. #include <Physics/Collide/Shape/hkpShape.h>
  11. #include <Physics/Collide/Shape/hkpShapeContainer.h>
  12. #include <Physics/Collide/Shape/Compound/Collection/hkpShapeCollection.h>
  13. #include <Common/Base/Types/Geometry/Sphere/hkSphere.h>
  14. class hkpShapeCollection;
  15. extern const hkClass hkpBvTreeShapeClass;
  16. // The maximum number of keys returned by a single queryAabb query. Must be a power of 2
  17. enum { HK_MAX_NUM_HITS_PER_AABB_QUERY = 4096 };
  18. /// An hkpBvTreeShape adds bounding volume tree information to an hkpShapeCollection, such as an hkpMeshShape.
  19. /// This is an abstract base class. See hkpMoppBvTreeShape for an implementation.
  20. ///
  21. /// <b>What does the bounding volume tree do?</b><br>
  22. ///
  23. /// A bounding volume tree is useful in situations where you need to check for collisions between a moving object
  24. /// and a large static geometry, such as a landscape. <br> n
  25. /// The shapes that make up the landscape are hierarchically grouped in
  26. /// a binary bounding volume tree.
  27. /// At every node in the tree there exists a bounding polytope, which encapsulates all 
  28. /// of its children. The top-level bounding volume contains the entire landscape, while
  29. /// the nodes on the leaf levels encapsulate one geometric primitive, normally a
  30. /// triangle. The fit of this bounding volume can be perfect (as in some AABB trees), or can 
  31. /// have an extra margin/tolerance built in (e.g. MOPP):nnn
  32. /// <center><img src="pix/twoTriangles.gif"></center>n
  33. ///
  34. /// Instead of checking whether the moving object is colliding with each of the triangles in the landscape in turn,
  35. /// which would be extremely time-consuming, the bounding box of the moving object
  36. /// is checked against the bounding volume tree - first, whether it is intersecting with the top-level bounding volume, then with
  37. /// any of its child bounding volumes, and so on until the check reaches the leaf nodes. A list of any potentially colliding triangles
  38. /// is then passed to the narrowphase collision detection. You can think of
  39. /// the bounding volume tree as a filter to the narrowphase collision
  40. /// detection system.<br>
  41. class hkpBvTreeShape: public hkpShape
  42. {
  43. public:
  44. HK_DECLARE_REFLECTION();
  45. enum BvTreeType
  46. {
  47. BVTREE_MOPP,
  48. BVTREE_TRISAMPLED_HEIGHTFIELD,
  49. BVTREE_USER,
  50. BVTREE_MAX
  51. };
  52. /// Creates an hkpBvTreeShape with the specified hkpShapeCollection.
  53. inline hkpBvTreeShape( hkpShapeType type, BvTreeType bvType);
  54. /// Returns the hkpShapeKey for all shapes in the hkpShapeCollection that intersect with the obb (defined by obbTransform and obbExtent).
  55. virtual void queryObb( const hkTransform& obbTransform, const hkVector4& obbExtent, hkReal tolerance, hkArray< hkpShapeKey >& hits ) const = 0;
  56. /// Returns the hkpShapeKey for all shapes in the hkpShapeCollection that intersect with the AABB
  57. virtual void queryAabb( const hkAabb& aabb, hkArray<hkpShapeKey>& hits ) const = 0;
  58. /// Populates the preallocated hits buffer with shape keys, returns the number of actual hits which may be greater than maxNumKeys
  59. /// The hits array should be able to hold maxNumKeys keys. On SPU this is no more than HK_MAX_NUM_HITS_PER_AABB_QUERY
  60. HK_FORCE_INLINE hkUint32 queryAabb( const hkAabb& aabb, hkpShapeKey* hits, int maxNumKeys ) const;
  61. virtual const hkpShapeContainer* getContainer() const = 0;
  62. static void HK_CALL registerSimulationFunctions( ShapeFuncs& sf );
  63. static void HK_CALL registerCollideQueryFunctions( ShapeFuncs& sf );
  64. static void HK_CALL registerRayCastFunctions( ShapeFuncs& sf );
  65. // Set up the bv-tree specific tables on the SPU
  66. static void HK_CALL registerBvTreeSimulationFunctions();
  67. static void HK_CALL registerBvTreeCollideQueryFunctions();
  68. static void HK_CALL registerBvTreeRaycastFunctions();
  69. HKP_SHAPE_VIRTUAL hkUint32 queryAabbImpl(HKP_SHAPE_VIRTUAL_THIS const hkAabb& aabb, hkpShapeKey* hits, int maxNumKeys ) HKP_SHAPE_VIRTUAL_CONST = 0;
  70. public:
  71. hkEnum<BvTreeType, hkUint8> m_bvTreeType; //+default(hkpBvTreeShape::BVTREE_USER)
  72. hkpBvTreeShape( hkFinishLoadedObjectFlag flag ) : hkpShape(flag)
  73. if( flag.m_finishing )
  74. {
  75. m_type = HK_SHAPE_BV_TREE;
  76. m_bvTreeType = BVTREE_USER;
  77. }
  78. }
  79. };
  80. #include <Physics/Collide/Shape/Compound/Tree/hkpBvTreeShape.inl>
  81. #endif // HK_COLLIDE2_BV_TREE_SHAPE_H
  82. /*
  83. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  84. * Confidential Information of Havok.  (C) Copyright 1999-2009
  85. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  86. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  87. * rights, and intellectual property rights in the Havok software remain in
  88. * Havok and/or its suppliers.
  89. * Use of this software for evaluation purposes is subject to and indicates
  90. * acceptance of the End User licence Agreement for this product. A copy of
  91. * the license is included with this software and is also available at www.havok.com/tryhavok.
  92. */