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

其他游戏

开发平台:

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_SHAPE_H
  9. #define HK_COLLIDE2_SHAPE_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Types/Physics/ContactPoint/hkContactPoint.h>
  12. #include <Physics/Collide/Shape/hkpShapeType.h>
  13. #include <Physics/Collide/Shape/Convex/hkpCdVertex.h>
  14. class hkAabb;
  15. struct hkpShapeRayCastInput;
  16. struct hkpShapeRayCastOutput;
  17. struct hkpShapeRayBundleCastInput;
  18. struct hkpShapeRayBundleCastOutput;
  19. class hkpRayHitCollector;
  20. class hkpCdBody;
  21. class hkpShapeContainer;
  22. class hkSphere;
  23. enum {  HK_SHAPE_BUFFER_ALIGNMENT = 16, HK_SHAPE_BUFFER_SIZE = 256 };
  24. typedef HK_ALIGN16( char ShapeBuffer[HK_SHAPE_BUFFER_SIZE] ); // <ng.todo.aa duplicating typedef in hkpShapeContainer
  25. typedef hkUint16 hkpVertexId;
  26. typedef hkUint32 hkpShapeKey;
  27. class hkShapeKeyPair
  28. {
  29. public:
  30. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_CDINFO, hkShapeKeyPair );
  31. hkpShapeKey m_shapeKeyA; // only used by nm machine
  32. hkpShapeKey m_shapeKeyB; // used by 1n & nm machines
  33. HK_FORCE_INLINE bool operator==(const hkShapeKeyPair& p1) const { return m_shapeKeyB == p1.m_shapeKeyB && m_shapeKeyA == p1.m_shapeKeyA; }
  34. HK_FORCE_INLINE bool operator< (const hkShapeKeyPair& p1) const { return (m_shapeKeyA < p1.m_shapeKeyA) || (m_shapeKeyA == p1.m_shapeKeyA && m_shapeKeyB < p1.m_shapeKeyB); }
  35. };
  36. #define HK_INVALID_SHAPE_KEY 0xffffffff
  37. #define HK_INVALID_VERTEX_ID 0xffff
  38. # define HKP_SHAPE_VIRTUAL virtual
  39. # define HKP_SHAPE_VIRTUAL_CONST const
  40. # define HKP_SHAPE_VIRTUAL_THIS 
  41. # define HKP_SHAPE_VIRTUAL_THIS2 
  42. # define HK_GET_THIS_PTR this
  43. # define getChildShapeImpl getChildShape
  44. # define getCollisionFilterInfoImpl getCollisionFilterInfo
  45. #define HK_DECLARE_GET_SIZE_FOR_SPU(CLASS) int calcSizeForSpu(const CalcSizeForSpuInput& input, int spuBufferSizeLeft) const { return sizeof(*this); }
  46. # define HK_SHAPE_CONTAINER hkpShapeContainer
  47. extern const hkClass hkpShapeClass;
  48. class hkpConvexShape;
  49. /// The base class for narrowphase collision detection objects.
  50. /// All narrowphase collision detection is performed between pairs of hkpShape objects by creating appropriate hkpCollisionAgent objects.
  51. /// An hkpShape can be a simple shape such as a box or sphere, a shape with additional transform information,
  52. /// or a compound shape made up of simpler hkShapes. hkpShape instances can be shared within or even between 
  53. /// rigid bodies. See the hkpShape subclasses for more details.
  54. class hkpShape : public hkReferencedObject
  55. {
  56. public:
  57. HK_DECLARE_REFLECTION();
  58. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CDINFO);
  59. /// Sets the user data to 0
  60. /// Sets the type to the specified type
  61. HK_FORCE_INLINE hkpShape( hkpShapeType type );
  62. /// Gets the hkpShape type. This is used by the collision dispatcher to dispatch between pairs of shapes
  63. HK_FORCE_INLINE hkpShapeType getType() const;
  64. /// Gets the AABB for the hkpShape given a local to world transform and an extra tolerance.
  65. /// 
  66. /// Forwards to getAabbImpl()
  67. HK_FORCE_INLINE void getAabb( const hkTransform& localToWorld, hkReal tolerance, hkAabb& out ) const;
  68. /// Support for creating bounding volume hierarchies of shapes.
  69. /// This function returns the maximal extent of a shape along a given direction. 
  70. /// It is not the same as hkpConvexShape::getSupportingVertex, because the extent does not have to be exact, it just has to at least
  71. /// contain the shape. It is for the purposes of creating bounding volumes around the shape ( mid-phase ) rather than exact collision
  72. /// detection (narrow-phase).
  73. /// The default implementation of this function uses the aabb of the shape. For custom shapes, you can get a better fit.
  74. virtual hkReal getMaximumProjection( const hkVector4& direction ) const;
  75. /// Get the user data for the shape (initialized to 0)
  76. inline hkUlong getUserData() const;
  77. /// Set the user data of the shape: This is a real user data and not used by the engine otherwise.
  78. /// If you are interested in triangle indices, you can retrieve this information from the hkpCdBody
  79. /// during most callbacks.
  80. inline void setUserData( hkUlong data );
  81. /// Finds the closest intersection between the shape and a ray defined in the shape's local space, starting at fromLocal, ending at toLocal.
  82. /// This is data driven, and places the results in hkpShapeRayCastOutput
  83. /// Implementation notes: For all convex shapes except hkSphere and hkCapsule the radius of the shape will be ignored.
  84. HK_FORCE_INLINE hkBool castRay( const hkpShapeRayCastInput& input, hkpShapeRayCastOutput& output ) const;
  85. /// Casts a bundle of rays against the shape
  86. HK_FORCE_INLINE hkVector4Comparison castRayBundle( const hkpShapeRayBundleCastInput& input, hkpShapeRayBundleCastOutput& output) const;
  87. HK_FORCE_INLINE hkVector4Comparison castRayBundle( const hkpShapeRayBundleCastInput& input, hkpShapeRayBundleCastOutput& output,  hkVector4ComparisonParameter mask ) const;
  88. /// Finds the closest intersection between the shape and a ray defined in the shape's local space, starting at fromLocal, ending at toLocal.
  89. /// This is a callback driven raycast. For each hit found, the hkpRayHitCollector receives a callback with the hit info.
  90. /// Implementation notes: For all convex shapes except hkSphere and hkCapsule the radius of the shape will be ignored.
  91. HK_FORCE_INLINE void castRayWithCollector( const hkpShapeRayCastInput& input, const hkpCdBody& cdBody, hkpRayHitCollector& collector ) const;
  92. /// Query if the shape supports the container interface.
  93. /// Returns a pointer to the interface if the shape has one or more child shapes.
  94. /// Otherwise returns null.
  95. virtual const hkpShapeContainer* getContainer() const { return HK_NULL; }
  96. /// Returns true if the shape is a convex shape
  97. virtual bool isConvex() const { return false; }
  98. // Returns the size of the shape class. The default implementation returns -1 which will force the shape onto the PPU.
  99. struct CalcSizeForSpuInput
  100. {
  101. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpShape::CalcSizeForSpuInput );
  102. bool m_midphaseAgent3Registered;
  103. bool m_isFixedOrKeyframed;
  104. };
  105. virtual int calcSizeForSpu(const CalcSizeForSpuInput& input, int spuBufferSizeLeft) const;
  106. protected:
  107. /// Gets the AABB for the hkpShape given a local to world transform and an extra tolerance.
  108. HKP_SHAPE_VIRTUAL void getAabbImpl( HKP_SHAPE_VIRTUAL_THIS const hkTransform& localToWorld, hkReal tolerance, hkAabb& out ) HKP_SHAPE_VIRTUAL_CONST = 0;
  109. /// hkpShape::castRay() interface implementation.
  110. HKP_SHAPE_VIRTUAL hkBool castRayImpl( HKP_SHAPE_VIRTUAL_THIS const hkpShapeRayCastInput& input, hkpShapeRayCastOutput& output ) HKP_SHAPE_VIRTUAL_CONST = 0;
  111. /// hkpShape::castRayWithCollector() interface implementation.
  112. HKP_SHAPE_VIRTUAL void castRayWithCollectorImpl( HKP_SHAPE_VIRTUAL_THIS const hkpShapeRayCastInput& input, const hkpCdBody& cdBody, hkpRayHitCollector& collector ) HKP_SHAPE_VIRTUAL_CONST = 0;
  113. HKP_SHAPE_VIRTUAL hkVector4Comparison castRayBundleImpl( HKP_SHAPE_VIRTUAL_THIS const hkpShapeRayBundleCastInput& input, hkpShapeRayBundleCastOutput& output, hkVector4ComparisonParameter mask  ) HKP_SHAPE_VIRTUAL_CONST;
  114. public:
  115. // These only need to be called in debug; the table is always fully written.
  116. static void HK_CALL resetShapeFunctions();
  117. static void HK_CALL verifyShapeFunctions();
  118. //
  119. // A hand coded vtable replacement, needed to run code on the spu
  120. //
  121. typedef void (HK_CALL *GetSupportingVertexFunc)        (const void* thisObj, hkVector4Parameter direction, hkpCdVertex &supportVertex );
  122. typedef void (HK_CALL *ConvertVertexIdsToVerticesFunc) (const void* thisObj, const hkpVertexId* ids, int numIds, class hkpCdVertex* verticesOut );
  123. typedef int (HK_CALL *WeldContactPointFunc) (const void* thisObj, hkpVertexId* featurePoints, hkUint8& numFeaturePoints, hkVector4& contactPointWs, const hkTransform* thisObjTransform, const hkpConvexShape* collidingShape, const hkTransform* collidingTransform, hkVector4& separatingNormalInOut );
  124. typedef void (HK_CALL *GetCentreFunc) (const void* thisObj, hkVector4& centreOut );
  125. typedef int  (HK_CALL *GetNumCollisionSpheresFunc) (const void* thisObj );
  126. typedef const hkSphere* (HK_CALL *GetCollisionSpheresFunc)(const void* thisObj, hkSphere* sphereBuffer );
  127. typedef void (HK_CALL *GetAabbFunc) (const void* thisObj, const hkTransform& localToWorld, hkReal tolerance, hkAabb& out );
  128. typedef hkBool (HK_CALL *CastRayFunc) (const void* thisObj, const hkpShapeRayCastInput& input, hkpShapeRayCastOutput& output );
  129. typedef void (HK_CALL *CastRayWithCollectorFunc) (const void* thisObj, const hkpShapeRayCastInput& input, const hkpCdBody& cdBody, hkpRayHitCollector& collector );
  130. typedef hkVector4Comparison (HK_CALL *CastRayBundleFunc) (const void* thisObj, const hkpShapeRayBundleCastInput& input, hkpShapeRayBundleCastOutput& output, hkVector4ComparisonParameter mask );
  131. typedef const hkpShape* (HK_CALL *GetChildShapeFunc) (const void* thisObj, hkpShapeKey key, ShapeBuffer& buffer );
  132. typedef hkUint32 (HK_CALL *GetCollisionFilterInfoFunc) (const void* thisObj, hkpShapeKey key );
  133. // Structure to store shape functions.  Effectively a shape's v-table.  Each function is padded to a 16 byte address.
  134. struct ShapeFuncs
  135. {
  136. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpShape::ShapeFuncs );
  137. hkPadSpu<GetSupportingVertexFunc> m_getSupportingVertexFunc;
  138. hkPadSpu<ConvertVertexIdsToVerticesFunc> m_convertVertexIdsToVertices;
  139. hkPadSpu<WeldContactPointFunc> m_weldContactPointFunc;
  140. hkPadSpu<GetCentreFunc> m_getCentreFunc;
  141. hkPadSpu<GetNumCollisionSpheresFunc> m_getNumCollisionSpheresFunc;
  142. hkPadSpu<GetCollisionSpheresFunc> m_getCollisionSpheresFunc;
  143. hkPadSpu<GetAabbFunc> m_getAabbFunc;
  144. hkPadSpu<CastRayFunc> m_castRay;
  145. hkPadSpu<CastRayWithCollectorFunc> m_castRayWithCollector;
  146. hkPadSpu<CastRayBundleFunc> m_castRayBundle;
  147. hkPadSpu<GetChildShapeFunc> m_getChildShapeFunc;
  148. hkPadSpu<GetCollisionFilterInfoFunc> m_getCollisionFilterInfoFunc;
  149. void reset();
  150. };
  151. // helper functions to be used with the hkpCollisionDispatcher
  152. struct ShapeFuncs2
  153. {
  154. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpShape::ShapeFuncs2 );
  155. HK_ALIGN( GetSupportingVertexFunc m_getSupportingVertexFunc, 64);
  156. ConvertVertexIdsToVerticesFunc m_convertVertexIdsToVertices;
  157. WeldContactPointFunc m_weldContactPointFunc;
  158. GetCentreFunc m_getCentreFunc;
  159. GetNumCollisionSpheresFunc m_getNumCollisionSpheresFunc;
  160. GetCollisionSpheresFunc m_getCollisionSpheresFunc;
  161. GetAabbFunc m_getAabbFunc;
  162. CastRayFunc m_castRay;
  163. CastRayWithCollectorFunc m_castRayWithCollector;
  164. CastRayBundleFunc m_castRayBundle;
  165. GetChildShapeFunc m_getChildShapeFunc;
  166. GetCollisionFilterInfoFunc m_getCollisionFilterInfoFunc;
  167. };
  168. typedef void (HK_CALL *RegisterFunc)(ShapeFuncs& sf);
  169. public:
  170. public:
  171. hkUlong m_userData;
  172. public:
  173. hkEnum< ::hkpShapeType, hkUint32> m_type; //+nosave
  174. public:
  175. hkpShape( class hkFinishLoadedObjectFlag flag ) : hkReferencedObject(flag)
  176. {
  177. if( flag.m_finishing )
  178. {
  179. m_type = HK_SHAPE_INVALID;
  180. }
  181. }
  182. };
  183. #include <Physics/Collide/Shape/hkpShape.inl>
  184. #endif // HK_COLLIDE2_SHAPE_H
  185. /*
  186. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  187. * Confidential Information of Havok.  (C) Copyright 1999-2009
  188. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  189. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  190. * rights, and intellectual property rights in the Havok software remain in
  191. * Havok and/or its suppliers.
  192. * Use of this software for evaluation purposes is subject to and indicates
  193. * acceptance of the End User licence Agreement for this product. A copy of
  194. * the license is included with this software and is also available at www.havok.com/tryhavok.
  195. */