hkpSampledHeightFieldShape.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_COLLIDE2_SAMPLED_HEIGHT_FIELD_SHAPE_H
  9. #define HK_COLLIDE2_SAMPLED_HEIGHT_FIELD_SHAPE_H
  10. #include <Physics/Collide/Shape/HeightField/hkpHeightFieldShape.h>
  11. #include <Physics/Collide/Shape/HeightField/SampledHeightField/hkpSampledHeightFieldBaseCinfo.h>
  12. #include <Common/Base/Types/Geometry/Sphere/hkSphere.h>
  13. #include <Common/Base/Math/Vector/hkVector4Util.h>
  14. extern const hkClass hkpSampledHeightFieldShapeClass;
  15. /// This class implements some default behaviour for the hkpSampledHeightFieldShape.
  16. /// It uses the y coordinate for the up axis
  17. /// This is a template class for 2d sampled heightfields.
  18. /// The x and z coordinates are used to lookup a height information
  19. /// If you want to use this class, you need to subclass it and 
  20. /// implement the following functions:
  21. ///  -  HK_FORCE_INLINE hkReal getHeightAtImpl( int x, int z ) const
  22. ///     which returns the height at a given x,z
  23. ///  -  HK_FORCE_INLINE hkBool getTriangleFlipImpl()
  24. /// this should return true  if two triangles share the edge p(x,z) - p(x+1,z+1)
  25. ///     this should return false if the triangles sphere the edge p(x,z+1) - p(x+1,z);
  26. ///  -  collideSpheres
  27. ///     This should forward to collideSpheresImplementation. This inlines your
  28. ///     getHeightAtImpl and getTriangleFlipImpl.
  29. /// <br>
  30. /// Example:<br>
  31. /// class MySampledHeightFieldShape : public hkpSampledHeightFieldShape<br>
  32. /// {
  33. ///    HK_FORCE_INLINE hkReal getHeightAtImpl( int x, int z ) const{ return x + y; }<br>
  34. ///    HK_FORCE_INLINE hkBool getTriangleFlipImpl(){ return false; }<br>
  35. ///    virtual void collideSpheres( const CollideSpheresInput& input, SphereCollisionOutput* outputArray) const
  36. ///    {
  37. ///        return collideSpheresImplementation(*this, input, outputArray);
  38. ///    }
  39. /// };<br>
  40. /// <br>
  41. class hkpSampledHeightFieldShape : public hkpHeightFieldShape
  42. {
  43. public:
  44. HK_DECLARE_REFLECTION();
  45. enum HeightFieldType
  46. {
  47. /// hkpStorageSampledHeightFieldShape, stores values as hkReals
  48. HEIGHTFIELD_STORAGE = 0,
  49. /// hkpCompressedSampledHeightFieldShape, stores values as hkUint16s
  50. HEIGHTFIELD_COMPRESSED,
  51. /// All other heightfields use this type
  52. // It's possible to run a custom heightfield on the SPU by setting  s_heightFieldFunctions[HEIGHTFIELD_USER_SPU] 
  53. // to point to the appropriate functions in registerHeightFieldFunctions.
  54. // This is recommended for experts only.
  55. HEIGHTFIELD_USER, 
  56. HEIGHTFIELD_MAX_ID
  57. };
  58. hkpSampledHeightFieldShape( const hkpSampledHeightFieldBaseCinfo& ci, HeightFieldType type = HEIGHTFIELD_USER);
  59. virtual ~hkpSampledHeightFieldShape();
  60. /// Get the construction you used to create the heightfield
  61. void getCinfo( hkpSampledHeightFieldBaseCinfo& cinfo ) const;
  62. /// hkpShape Interface 
  63. HKP_SHAPE_VIRTUAL void getAabbImpl( HKP_SHAPE_VIRTUAL_THIS const hkTransform& localToWorld, hkReal tolerance, hkAabb& out ) HKP_SHAPE_VIRTUAL_CONST;
  64. /// hkpHeightFieldShape interface implementation
  65. virtual void collideSpheres( const CollideSpheresInput& input, SphereCollisionOutput* outputArray) const = 0;
  66. /// hkpHeightFieldShape interface implementation
  67. virtual void castSphere( const hkpSphereCastInput& input, const hkpCdBody& cdBody, hkpRayHitCollector& collector ) const;
  68. /// get the height at x,z. Note x,z are already clipped
  69. /// On CPU/PPU, forwards to the virtual getHeightAtImpl method
  70. /// On SPU, calls the static s_getHeightAtImplPtr function
  71. HK_FORCE_INLINE hkReal getHeightAt( int x, int z ) const;
  72. /// Return true if two triangles share the edge p(x,z) - p(x+1,z+1)
  73. /// Return false if the triangles sphere the edge p(x,z+1) - p(x+1,z);
  74. /// On CPU/PPU, forwards to the virtual getTriangleFlipImpl method
  75. /// On SPU, calls the static s_getTriangleFlipImplPtr method
  76. HK_FORCE_INLINE hkBool getTriangleFlip() const;
  77. virtual hkReal getHeightAtImpl( int x, int z ) const = 0;
  78. virtual hkBool getTriangleFlipImpl() const = 0;
  79. /// Returns a struct of function pointers needed by the SPU for 
  80. static void HK_CALL registerSimulationFunctions( ShapeFuncs& sf );
  81. static void HK_CALL registerCollideQueryFunctions( ShapeFuncs& sf );
  82. static void HK_CALL registerRayCastFunctions( ShapeFuncs& sf );
  83. /// Set up the static table for heightfield functions
  84. static void HK_CALL registerHeightFieldFunctions();
  85. /// hkpShape interface implementation
  86. ///  -  output.m_extraInfo = hitX << 1 + (hitZ<<16). Lowest bit is used for triangle index.
  87. /// Notes on the implementation:
  88. ///  -  The ray can never tunnel through two neighbouring triangles.
  89. ///  -  The ray is not epsilon proof when it just touches the landscape.
  90. ///  -  The ray algorithm uses a fast walking algorithm over the landscape, 
  91. ///     that means very long rays over very big height fields cost quite some CPU
  92. ///  -  The code is somehow fast, however quite big. Try to combine many ray queries together to minimize instruction cache hits
  93. ///  -  Rays that are nearly vertical to the heightfield get a different optimized treatment.
  94. ///  -  There are no restrictions on the scale, it can be anything, even negative
  95. ///  -  If the ray starts or ends outside the heightfield, no problem, it gets clipped correctly
  96. ///  -  the size of the heightfield is limited to 16k * 16k
  97. HKP_SHAPE_VIRTUAL hkBool castRayImpl( HKP_SHAPE_VIRTUAL_THIS const hkpShapeRayCastInput& input, hkpShapeRayCastOutput& output ) HKP_SHAPE_VIRTUAL_CONST ;
  98. /// hkpShape interface implementation
  99. HKP_SHAPE_VIRTUAL void castRayWithCollectorImpl( HKP_SHAPE_VIRTUAL_THIS const hkpShapeRayCastInput& input, const hkpCdBody& cdBody, hkpRayHitCollector& collector ) HKP_SHAPE_VIRTUAL_CONST;
  100. private:
  101. void castRayInternal( const hkpShapeRayCastInput& input, const hkpCdBody& cdBody, hkBool reportPenetratingStartPosition, hkReal maxExtraPenetration, hkpRayHitCollector& collector ) const;
  102. // implementation in .cpp - inlined several times
  103. HK_FORCE_INLINE void _getHeightAndNormalAt( int xPos, int zPos, hkReal subX, hkReal subZ, hkVector4& normalOut, hkReal& heightOut, int& triangleIndexOut ) const;
  104. public:
  105. void getHeightAndNormalAt( int xPos, int zPos, hkReal subX, hkReal subZ, hkVector4& normalOut, hkReal& heightOut, int& triangleIndexOut ) const;
  106. public:
  107. int m_xRes;
  108. int m_zRes;
  109. hkReal m_heightCenter;
  110. /// The method used to calculated the height. See hkpSampledHeightFieldBaseCinfo::m_useProjectionBasedHeight for details.
  111. hkBool m_useProjectionBasedHeight;
  112. /// Heightfield type. This is used to determine which getHeightAt method to call on the SPU.
  113. hkEnum<HeightFieldType, hkUint8> m_heightfieldType; //+default(hkpSampledHeightFieldShape::HEIGHTFIELD_USER)
  114. hkVector4 m_intToFloatScale;
  115. hkVector4 m_floatToIntScale;
  116. hkVector4 m_floatToIntOffsetFloorCorrected;
  117. hkVector4 m_extents;
  118. public:
  119. hkpSampledHeightFieldShape( ) : hkpHeightFieldShape( HK_SHAPE_SAMPLED_HEIGHT_FIELD ) {}
  120. hkpSampledHeightFieldShape( hkFinishLoadedObjectFlag flag ) : hkpHeightFieldShape(flag)
  121. {
  122. if (flag.m_finishing)
  123. {
  124. m_type = HK_SHAPE_SAMPLED_HEIGHT_FIELD;
  125. }
  126. }
  127. };
  128. // Work around vc6 member templates bug. Should be hkpSampledHeightFieldShape::collideSpheres.
  129. template<typename IMPL>
  130. HK_FORCE_INLINE void HK_CALL hkSampledHeightFieldShape_collideSpheres(
  131. const IMPL& shape,
  132. const hkpHeightFieldShape::CollideSpheresInput& input,
  133. hkpHeightFieldShape::SphereCollisionOutput* outputArray);
  134. #include <Physics/Collide/Shape/HeightField/SampledHeightField/hkpSampledHeightFieldShape.inl>
  135. #endif // HK_COLLIDE2_SAMPLED_HEIGHT_FIELD_SHAPE_H
  136. /*
  137. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  138. * Confidential Information of Havok.  (C) Copyright 1999-2009
  139. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  140. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  141. * rights, and intellectual property rights in the Havok software remain in
  142. * Havok and/or its suppliers.
  143. * Use of this software for evaluation purposes is subject to and indicates
  144. * acceptance of the End User licence Agreement for this product. A copy of
  145. * the license is included with this software and is also available at www.havok.com/tryhavok.
  146. */