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

其他游戏

开发平台:

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_EXTENDED_MESH2_SHAPE_H
  9. #define HK_COLLIDE2_EXTENDED_MESH2_SHAPE_H
  10. #include <Physics/Collide/Shape/Compound/Collection/hkpShapeCollection.h>
  11. #include <Physics/Collide/Shape/Convex/Triangle/hkpTriangleShape.h>
  12. extern hkReal hkConvexShapeDefaultRadius;
  13. extern const hkClass hkpExtendedMeshShapeClass;
  14. class hkpMeshMaterial;
  15. class hkpSimpleMeshShape;
  16. class hkpMoppBvTreeShape;
  17. /// A class for wrapping geometric collision detection information.  It can directly reference
  18. /// sets of triangle strips with vertex striding, and either 8, 16 or 32 bit indices to vertices.
  19. /// It can also directly reference triangle soups, using three indices per triangle rather than one.
  20. /// It also handles degenerate triangles internally, so no extra checking is required by the user.
  21. /// The mesh shape creates hkTriangleShapes in the ShapeBuffer passed in to the getChildShape function.
  22. /// It gives these shapes a radius (see hkpConvexShape::getRadius()) as specified by the hkpExtendedMeshShape::getRadius() function.
  23. /// This class can also store lists of convex shapes.
  24. class hkpExtendedMeshShape: public hkpShapeCollection
  25. {
  26. public:
  27. // +version(1)
  28. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_CDINFO);
  29. HK_DECLARE_REFLECTION();
  30. public:
  31. /// The striding of mesh indices
  32. enum IndexStridingType
  33. {
  34. INDICES_INVALID, // default, will raise assert.
  35. /// 8 bit "single byte" striding
  36. INDICES_INT8,
  37. /// 16 bit "short" striding
  38. INDICES_INT16,
  39. /// 32 bit "int" striding
  40. INDICES_INT32,
  41. INDICES_MAX_ID
  42. };
  43. enum MaterialIndexStridingType
  44. {
  45. MATERIAL_INDICES_INVALID,
  46. MATERIAL_INDICES_INT8,
  47. MATERIAL_INDICES_INT16,
  48. MATERIAL_INDICES_MAX_ID
  49. };
  50. enum SubpartType
  51. {
  52. SUBPART_TRIANGLES,
  53. SUBPART_SHAPE
  54. };
  55. struct Subpart
  56. {
  57. public:
  58. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpExtendedMeshShape::Subpart );
  59. HK_DECLARE_REFLECTION();
  60. public:
  61. inline Subpart(SubpartType type);
  62. Subpart(hkFinishLoadedObjectFlag flag) { }
  63. public:
  64. /// Subpart type
  65. hkEnum<SubpartType,hkInt8> m_type;
  66. /// A type defining whether 8 or 16 bits are used to index material.
  67. hkEnum<MaterialIndexStridingType,hkInt8> m_materialIndexStridingType;
  68. /// The byte offset between two hkMeshMaterials
  69. hkInt16 m_materialStriding;
  70. /// a pointer, pointing to a strided array of material index (hkUint8), one index for each triangle.
  71. ///  - You are limited to a maximum of 256 materials per subpart.
  72. ///  - You are not forced to store those indices in a hkUint8 array, with the striding m_materialIndexStriding
  73. ///    parameter you can extract this
  74. ///  - If you do not want to use materials, simply set this element to HK_NULL
  75. const void* m_materialIndexBase; //+nosave
  76. /// The byte offset between two material indices (Usually sizeof(hkUint8) or...)
  77. hkUint16 m_materialIndexStriding;
  78. /// The number of materials
  79. hkUint16 m_numMaterials;
  80. /// The base for the material table, the byte offset between two hkMeshMaterials is defined by
  81. /// m_materialStriding
  82. /// Note: On PLAYSTATION(R)3 this must be aligned to a m_materialStriding boundary if you wish to access materials in your own code on SPU.
  83. const hkpMeshMaterial* m_materialBase; //+nosave
  84. /// Material class
  85. const hkClass* m_materialClass; //+nosave +default(0)
  86. };
  87. /// A vertices subpart defines a triangle, a triangle list or a triangle strip.
  88. struct TrianglesSubpart : public hkpExtendedMeshShape::Subpart
  89. {
  90. public:
  91. // +version(2)
  92. HK_DECLARE_REFLECTION();
  93. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpExtendedMeshShape::TrianglesSubpart );
  94. public:
  95. /// A partial initializing constructor. It will only set values in Debug
  96. /// apart from a default material that gets set in Release too.
  97. inline TrianglesSubpart();
  98. TrianglesSubpart(hkFinishLoadedObjectFlag flag) : Subpart(flag) { }
  99. /// the number of triangles
  100. int m_numTriangleShapes;
  101. //
  102. // Vertex information
  103. //
  104. /// A pointer to the first vertex, defined by three floats.
  105. /// Must be aligned on a 16 byte boundary
  106. const float*  m_vertexBase; //+nosave
  107. /// The byte offset between two consecutive vertices (usually 12, 16 or more).
  108. int m_vertexStriding;
  109. /// The number of vertices.
  110. int m_numVertices;
  111. /// Triangle extrusion.  This setting can help the bullet through paper issue in certain situations,
  112. /// without using continuous simulation, however it does not guarantee robust results. All triangles
  113. /// in this subpart are extruded in the direction specified (which defaults to 0, i.e is disabled). If you have a ground
  114. /// made of triangles, with nothing beneath it, you can extrude the triangles a few meters in the downwards direction.
  115. /// When high speed non-continuous debris hits the landscape it will be more likely to bounce off rather than
  116. /// tunnel through.  The effects of this extrusion is improved when also using one sided welding, as contact
  117. /// points will be correctly rotated to point up, even when objects are deeply penetrating.
  118. hkVector4 m_extrusion;
  119. //
  120. // Triangle Index Information
  121. //
  122. /// A pointer to triples of vertex indices.
  123. /// Used to be a union type, but to make
  124. /// auto serialization possible, we leave it as 
  125. /// a void* here.
  126. const void* m_indexBase; //+nosave
  127. /// The byte offset between two indices triples.
  128. ///  - Eg. (Usually sizeof(hkUint16) if you use triangle strips
  129. ///  - or 3 * sizeof(hkUint16) if you use independent triangles
  130. int m_indexStriding;
  131. /// A type defining whether 8, 16, or 32 bits are used to index vertices.
  132. hkEnum<IndexStridingType,hkInt8> m_stridingType;
  133. /// A flag used to specify whether triangles should be returned wound the same way
  134. /// or alternate ways.  It must be set to 0 or 1, and defaults to 0.
  135. /// If Triangle strips are used, each subsequent triangle in a list
  136. /// will be wound the alternate way. However for one sided welding, we require that
  137. /// all triangles have a consistent winding. This flag should be set to 1 in this case.  This
  138. /// means the first triangle will be returned with vertices set to (0, 1, 2) and the second
  139. /// triangle will be returned with vertices set to (1, 3, 2). If this flag is set to 0 the
  140. /// second triangle will be returned with vertices set to (1, 2, 3). If independent triangles
  141. /// are used this flag should be set to 0 to maintain winding.
  142. hkInt8 m_flipAlternateTriangles;
  143. /// This information is set automatically when a subpart is added to a mesh and should be left at -1.
  144. /// It is the offset in a global array for all triangles in the mesh of the first triangle of this sub piece
  145. /// This info is used for "welding" collisions between triangles.
  146. int m_triangleOffset; //+default(-1)
  147. /// User data associated with each triangle subpart
  148. hkUlong m_userData; //+default(0)
  149. };
  150. /// A shapes subpart defines a list of one or more convex shapes of type hkpConvexShape.
  151. struct ShapesSubpart : public hkpExtendedMeshShape::Subpart
  152. {
  153. public:
  154. HK_DECLARE_REFLECTION();
  155. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpExtendedMeshShape::ShapesSubpart );
  156. public:
  157.  ShapesSubpart( const hkpConvexShape*const* childShapes, int numChildShapes, const hkVector4& offset = hkVector4::getZero() );
  158.  ShapesSubpart( const hkpConvexShape*const* childShapes, int numChildShapes, const hkTransform& transform );
  159.  ShapesSubpart(hkFinishLoadedObjectFlag flag) : Subpart(flag) { }
  160. ~ShapesSubpart();
  161. private:
  162. /// This variable holds the number of child shapes
  163. /// and whether the offset is set and the rotation is set in the two top most bits
  164. public:
  165. const hkpConvexShape*const* m_childShapes;
  166. int  m_numChildShapes;
  167. hkBool m_offsetSet;
  168. hkBool m_rotationSet;
  169. hkBool m_childShapesAllocatedInternally; //+default(false) +nosave
  170. hkQuaternion m_rotation;
  171. hkVector4 m_translation;
  172. };
  173. public:
  174. /// Constructs a new hkpExtendedMeshShape.
  175. /// This mesh supports triangle soups as well as shape soups.
  176. ///    - The triangles are grouped in subparts and can be scaled and get a radius applied
  177. ///    - The shapes can be grouped in subparts and can be translated on a per subpart basis.
  178. /// "numBitsForSubpart" is the number of bits used (in the 32 bit shape key) for the subpart index.
  179. /// Note that the highest bit is used as the type identifier, discerning whether this subpart consists
  180. /// of triangles or convex shapes.
  181. /// The remaining bits from the 32 bit shape key are used for the terminal index. By
  182. /// default numBitsForSubpartIndex is 12, which means the mesh shape can have 2^11 - 1
  183. /// subparts (0xffffffff is the "invalid" shape key) = 2047, and each subpart can have 2^20 triangles = 1048576.
  184. /// The subpart is stored in the high bits, so you can extract subpart/terminal indices like this:<br>
  185. /// int subpartIndex = key >> ( 32 - mymesh->getNumBitsForSubpartIndex() );<br>
  186. /// int terminalIndex = key & ( ~0U >> mymesh->getNumBitsForSubpartIndex() );
  187. hkpExtendedMeshShape( hkReal radius = hkConvexShapeDefaultRadius, int numBitsForSubpartIndex = 12 );
  188. /// A utility constructor that creates and extended mesh shape from a mesh shape.
  189. hkpExtendedMeshShape( const class hkpMeshShape* meshShape );
  190. /// Destructor. Simply removes the references to all childShapes
  191. ~hkpExtendedMeshShape();
  192. /// Compute welding info. In order to weld collisions between triangles in this mesh, welding info must be created.
  193. /// Note that this function only creates welding information between triangles, not between convex pieces.
  194. /// You must call this after all subparts have been added to the mesh.
  195. /// The hkpMoppBvTreeShape you pass in must be built referencing this hkpMeshShape.
  196. /// This adds an additional 2 bytes per triangle storage overhead.
  197. /// This is an expensive call, and should be done off line, and the resultant hkpMeshShape
  198. /// serialized, to save the runtime overhead of computing the welding info.
  199. hkResult computeWeldingInfo( const hkpMoppBvTreeShape* mopp, hkpWeldingUtility::WeldingType weldingType );
  200. //
  201. // Subpart access
  202. //
  203. /// Adds a triangle subpart. To modify member xxxx of this triangle subpart later on, call getTrianglesSubpartAt(int ).xxxx = yyyy.
  204. virtual void addTrianglesSubpart( const TrianglesSubpart& part );
  205. /// Adds a shape subpart. To modify member xxxx of this shape subpart later on, call getShapesSubpartAt(int ).xxxx = yyyy.
  206. /// returns the subpart index
  207. virtual int addShapesSubpart( const ShapesSubpart& part );
  208. /// Returns the number of all triangle subparts.
  209. inline int getNumTrianglesSubparts() const;
  210. /// Returns the number of all shape subparts.
  211. inline int getNumShapesSubparts() const;
  212. /// Gets read/write access to a triangle subpart.
  213. inline TrianglesSubpart& getTrianglesSubpartAt( int i );
  214. /// Gets const access to a triangle subpart.
  215. inline const TrianglesSubpart& getTrianglesSubpartAt( int i ) const;
  216. /// Gets read/write access to a shape subpart.
  217. inline ShapesSubpart& getShapesSubpartAt( int i );
  218. /// Gets const access to a shape subpart.
  219. inline const ShapesSubpart& getShapesSubpartAt( int i ) const;
  220. /// Gets the subpart that a shape key belongs to.
  221. inline const Subpart& getSubPart( hkpShapeKey shapeKey ) const;
  222. /// Gets the index of a subpart that a shape key belongs to.
  223. /// Note that this will only return the index within the subpart's specific type list, i.e. either the index in the triangles list or in the shapes list.
  224. /// You can get the subpart's type by calling getSubpartType().
  225. HK_FORCE_INLINE hkInt32 getSubPartIndex( hkpShapeKey shapeKey ) const;
  226. /// Get the terminal shape's index within the subpart.
  227. HK_FORCE_INLINE hkInt32 getTerminalIndexInSubPart( hkpShapeKey key ) const;
  228. /// Gets the number of bits of a shape key used to encode the subpart.
  229. HK_FORCE_INLINE hkInt32 getNumBitsForSubpartIndex() const;
  230. /// Returns the first shape key of a subpart
  231. HK_FORCE_INLINE hkInt32 getSubpartShapeKeyBase( int subpartIndex) const;
  232. /// Get the type of the shape referenced by the supplied shape key.
  233. HK_FORCE_INLINE SubpartType getSubpartType( hkpShapeKey key ) const;
  234. //
  235. // Scaling and radius access
  236. //
  237. /// Set the scaling of all triangle subparts of the shape
  238. inline const hkVector4& getScaling() const;
  239. void setScaling( const hkVector4& scaling ) ;
  240. /// Gets the extra radius for every triangle.
  241. inline hkReal getRadius() const;
  242. /// Sets the extra radius for every triangle.
  243. inline void setRadius(hkReal r );
  244. //
  245. // hkpShape Collection interface 
  246. //
  247. /// Get the first child shape key.
  248. virtual hkpShapeKey getFirstKey() const;
  249. /// This function implements hkpShapeCollection::getNextKey
  250. /// NOTE: This function calls hkpTriangleUtil::isDegenerate to make sure no keys for degenerate triangles are returned
  251. /// If you are implementing your own mesh shape, your getNextKey function must make sure that it similarly does
  252. /// not return keys for degenerate triangles. You can use the hkpTriangleUtil::isDegenerate utility function to check whether
  253. /// triangles are valid.
  254. virtual hkpShapeKey getNextKey( hkpShapeKey oldKey ) const;
  255. // Gets the mesh material by shape key, or returns HK_NULL if m_materialIndexBase isn't defined
  256. const hkpMeshMaterial* getMeshMaterial( hkpShapeKey key ) const;
  257. // hkpShapeContainer::getChildShape() interface implementation.
  258. HKP_SHAPE_VIRTUAL const hkpShape* getChildShapeImpl( HKP_SHAPE_VIRTUAL_THIS hkpShapeKey key, ShapeBuffer& buffer ) HKP_SHAPE_VIRTUAL_CONST;
  259. // hkpShapeContainer::getCollisionFilterInfo() interface implementation.
  260. HKP_SHAPE_VIRTUAL hkUint32 getCollisionFilterInfoImpl( HKP_SHAPE_VIRTUAL_THIS hkpShapeKey key ) HKP_SHAPE_VIRTUAL_CONST;
  261. //
  262. // hkpShape interface
  263. //
  264. // hkpShape interface implementation.
  265. HKP_SHAPE_VIRTUAL void getAabbImpl( HKP_SHAPE_VIRTUAL_THIS const hkTransform& localToWorld, hkReal tolerance, hkAabb& out ) HKP_SHAPE_VIRTUAL_CONST;
  266. void recalcAabbExtents();
  267. virtual void calcContentStatistics( hkStatisticsCollector* collector, const hkClass* cls) const;
  268. virtual int calcSizeForSpu(const CalcSizeForSpuInput& input, int spuBufferSizeLeft) const;
  269. protected:
  270. void assertTrianglesSubpartValidity( const TrianglesSubpart& part );
  271. void assertShapesSubpartValidity   ( const ShapesSubpart&    part );
  272. /// If this shape only contains a single triangle subpart and/or single shapes subpart then these
  273. /// Can be embedded directly into the shape. This saves significantly on DMA transfers
  274. struct TrianglesSubpart m_embeddedTrianglesSubpart;  
  275. public:
  276. hkVector4 m_scaling;
  277. // Cached AABB
  278. hkVector4 m_aabbHalfExtents;
  279. hkVector4 m_aabbCenter;
  280. /// This member variable to determine the maximum triangle size allowed.
  281. /// This defaults to 1e-7 (and is used to check against the triangle area squared). If you have algorithms
  282. /// that fail with triangles passed by this value, you can increase it to make the culling more aggressive.
  283. static hkReal m_triangleDengeneracyTolerance;
  284. hkInt32 m_numBitsForSubpartIndex;
  285. protected:
  286. // On PLAYSTATION(R)3 these must be aligned according to their size.
  287. struct TrianglesSubpart* m_trianglesSubparts;
  288. int m_numTrianglesSubparts;
  289. hkBool m_trianglesSubpartsAllocatedInternally; // +default(false) +nosave
  290. hkBool m_shapesSubpartsAllocatedInternally; //  +default(false) +nosave
  291. struct ShapesSubpart* m_shapesSubparts;
  292. int m_numShapesSubparts;
  293. public:
  294. hkArray<hkUint16> m_weldingInfo;
  295. hkEnum<hkpWeldingUtility::WeldingType, hkUint8> m_weldingType; // +default(hkpWeldingUtility::WELDING_TYPE_NONE)
  296. /// Collision filter info used if there is no material set. 
  297. /// Note if you set this value to hkpGroupFilter::USE_COLLIDABLE_FILTER_INFO, and no material info
  298. /// is set, than the hkpGroupFilter collision filter info will be taken from the rootCollidable
  299. hkUint32 m_defaultCollisionFilterInfo;
  300. public:
  301. hkpExtendedMeshShape( hkFinishLoadedObjectFlag flag );
  302. protected:
  303. /// Internal methods to help simplify the memory mgt involved when the subparts are embedded
  304. struct TrianglesSubpart* expandOneTriangleSubparts();
  305. struct ShapesSubpart*  expandOneShapesSubparts();
  306. void freeTriangleSubparts();
  307. void freeShapesSubparts();
  308. /// The radius can only be set on construction.
  309. hkReal m_triangleRadius;
  310. };
  311. #include <Physics/Collide/Shape/Compound/Collection/ExtendedMeshShape/hkpExtendedMeshShape.inl>
  312. #endif // HK_COLLIDE2_EXTENDED_MESH2_SHAPE_H
  313. /*
  314. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  315. * Confidential Information of Havok.  (C) Copyright 1999-2009
  316. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  317. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  318. * rights, and intellectual property rights in the Havok software remain in
  319. * Havok and/or its suppliers.
  320. * Use of this software for evaluation purposes is subject to and indicates
  321. * acceptance of the End User licence Agreement for this product. A copy of
  322. * the license is included with this software and is also available at www.havok.com/tryhavok.
  323. */