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

其他游戏

开发平台:

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_TRI_SAMPLED_HEIGHTFIELD_COLLECTION
  9. #define HK_TRI_SAMPLED_HEIGHTFIELD_COLLECTION
  10. #include <Common/Base/hkBase.h>
  11. #include <Physics/Collide/Shape/Compound/Collection/hkpShapeCollection.h>
  12. #include <Physics/Collide/Shape/HeightField/SampledHeightField/hkpSampledHeightFieldShape.h>
  13. extern const hkClass hkpTriSampledHeightFieldCollectionClass;
  14. class hkpSampledHeightFieldShape;
  15. class hkpTriSampledHeightFieldBvTreeShape;
  16. extern hkReal hkConvexShapeDefaultRadius;
  17. /// You can use this shape to wrap a hkSampledHeightFieldBase shape. To use this, you must also combine this shape
  18. /// with the hkpTriSampledHeightFieldBvTreeShape, i.e. create a hkpTriSampledHeightFieldBvTreeShape, passing
  19. /// this shape into its constructor. This shape provides an alternative implementation to the sampled heightfield,
  20. /// where a different collision algorithm is used, while maintaining the memory usage of the heightfield.
  21. /// Instead of the approximate collision detection algorithm used by the heightfield shape (where colliding objects
  22. /// are represented by sets of spheres), this shape converts the heightfield into triangles on the fly.
  23. /// Collision detection may be slower, but will be fully exact.
  24. /// Because the shapes pulled out during collision detection are actual hkTriangleShapes, they may need a radius
  25. /// (which would not be necessary if using the approximate collision detection algorithm).
  26. /// Ray casting is performed using the standard heightfield raycast implementation.
  27. /// N.B. Per-triangle filtering can be done by inheriting and implementing the method hkpShapeCollection::getCollisionFilterInfo( hkpShapeKey key )
  28. /// as required. The current implementation does not implement this method because the user can best decide where to store the filter info.
  29. /// NOTE: Linear casting is performed using a simple implementation where the aabb of the linear cast is queried against
  30. /// the heightfield, and all overlapping triangles are checked with a linear cast. WARNING: for long linear casts,
  31. /// (particularly those parallel to the heightfield surface) this can be very slow.
  32. class hkpTriSampledHeightFieldCollection : public hkpShapeCollection
  33. {
  34. public:
  35. HK_DECLARE_REFLECTION();
  36. /// The constructor takes a hkSampledHeightFieldBase, and a radius. Note that the heightfield
  37. /// does not have a radius by default, but when converting the heightfield into triangles for collision detection
  38. /// it is advisable to give the triangles a non-zero radius for best performance.
  39. /// This adds a reference to the hkSampledHeightFieldBase passed in.
  40. hkpTriSampledHeightFieldCollection( const hkpSampledHeightFieldShape* shape, hkReal radius = hkConvexShapeDefaultRadius );
  41. hkpTriSampledHeightFieldCollection( hkFinishLoadedObjectFlag flag ) : hkpShapeCollection( flag ), m_weldingInfo(flag)
  42. {
  43. if( flag.m_finishing )
  44. {
  45. m_type = HK_SHAPE_COLLECTION; 
  46. m_collectionType = COLLECTION_TRISAMPLED_HEIGHTFIELD;
  47. }
  48. }
  49. /// Removes a reference from the referenced heightfield.
  50. ~hkpTriSampledHeightFieldCollection();
  51. //
  52. // hkpShapeCollection interface
  53. //
  54. /// Gets the first key for the collection.
  55. /// The key returned by this function can be used to create a triangle shape corresponding to the key.  
  56. /// The mapping is as follows: 
  57. /// The lowest bit is used for the triangle "flag" determining which triangle of the quad is being referenced.
  58. /// The next lowest 15 bits of the key are used for the x coordinate of the quad.
  59. /// The upper 16 bits of the key are used for the z coordinate of the quad.
  60. /// So you can extract subpart/triangle indices like this:<br>
  61. /// int xCoord = (key & 0x0000ffff) >> 1;
  62. /// int zCoord = key >> 16;
  63. /// int whichTriangle = (key & 1); // will be 0 or 1<br>
  64. /// For this reason only heightfields of resolution less than 65535 are allowed to be used with this shape.
  65. /// For more detail please refer to the heightfield section of the user guide.
  66. virtual hkpShapeKey getFirstKey() const;
  67. /// Get the next key. This iterates over the heightfield's x-z grid. See getFirstKey() for a description of the
  68. /// key returned.
  69. virtual hkpShapeKey getNextKey( hkpShapeKey oldKey ) const;
  70. // hkpShapeCollection interface implementation.
  71. HKP_SHAPE_VIRTUAL const hkpShape* getChildShapeImpl( HKP_SHAPE_VIRTUAL_THIS hkpShapeKey key, ShapeBuffer& buffer ) HKP_SHAPE_VIRTUAL_CONST;
  72. HKP_SHAPE_VIRTUAL hkUint32 getCollisionFilterInfoImpl( HKP_SHAPE_VIRTUAL_THIS hkpShapeKey key ) HKP_SHAPE_VIRTUAL_CONST;
  73. //
  74. // hkpShape interface
  75. //
  76. // hkpShape interface implementation.
  77. HKP_SHAPE_VIRTUAL void getAabbImpl( HKP_SHAPE_VIRTUAL_THIS const hkTransform& localToWorld, hkReal tolerance, hkAabb& out ) HKP_SHAPE_VIRTUAL_CONST;
  78. // hkpShape interface implementation.
  79. virtual int calcSizeForSpu(const CalcSizeForSpuInput& input, int spuBufferSizeLeft) const;
  80. /// Get the heightfield referenced by the shape, DMAing from PPU if necessary
  81. const hkpSampledHeightFieldShape* getHeightFieldShape() const;
  82. /// Get the radius of this shape. This will be the radius of all triangles created by the shape.
  83. inline hkReal getRadius() const;
  84. /// Sets the radius of this shape.
  85. inline void setRadius(hkReal newRadius);
  86. // Gets the extrusion used by triangles returned from getChildShape.
  87. inline const hkVector4& getTriangleExtrusion() const;
  88. /// Sets the extrusion used by triangles returned from getChildShape.
  89. inline void setTriangleExtrusion(hkVector4Parameter e);
  90. void computeWeldingInfo(const hkpTriSampledHeightFieldBvTreeShape* bvtree);
  91. protected:
  92. /// Utility method
  93. inline int getXFromShapeKey(hkpShapeKey key) const;
  94. /// Utility method
  95. inline int getZFromShapeKey(hkpShapeKey key) const;
  96. /// Gets the index into m_weldingInfo for a given shape key
  97. inline int getIndexFromShapeKey(hkpShapeKey key) const;
  98. const hkpSampledHeightFieldShape* m_heightfield;
  99. mutable int m_childSize; //+nosave
  100. /// Convex radius applied to all child triangles.
  101. hkReal m_radius;
  102. /// Stored information for welding triangles. These are computed by computeWeldingInfo();
  103. /// The welding type is always hkpWeldingUtility::WELDING_TYPE_ANTICLOCKWISE
  104. hkArray<hkUint16> m_weldingInfo;
  105. HK_FORCE_INLINE hkUint16 getWeldingInfo(hkpShapeKey key) const;
  106. /// Extrusion applied to all child triangles. See hkpTriangleShape::m_extrusion for more information.
  107. hkVector4 m_triangleExtrusion;
  108. };
  109. #include <Physics/Collide/Shape/HeightField/TriSampledHeightField/hkpTriSampledHeightFieldCollection.inl>
  110. #endif // #ifndef HK_TRI_SAMPLED_HEIGHTFIELD_COLLECTION
  111. /*
  112. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  113. * Confidential Information of Havok.  (C) Copyright 1999-2009
  114. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  115. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  116. * rights, and intellectual property rights in the Havok software remain in
  117. * Havok and/or its suppliers.
  118. * Use of this software for evaluation purposes is subject to and indicates
  119. * acceptance of the End User licence Agreement for this product. A copy of
  120. * the license is included with this software and is also available at www.havok.com/tryhavok.
  121. */