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

其他游戏

开发平台:

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_SHAPE_CUTTER_UTIL_H
  9. #define HK_SHAPE_CUTTER_UTIL_H
  10. #include <Physics/Collide/Shape/Convex/hkpConvexShape.h>
  11. #include <Physics/Collide/Shape/Convex/ConvexVertices/hkpConvexVerticesConnectivity.h>
  12. #include <Common/Base/Types/Geometry/hkGeometry.h>
  13. class hkpConvexShape;
  14. class hkpConvexVerticesShape;
  15. /// This small utility class allows for testing whether two given shapes are 'connected', i.e. whether
  16. /// or not the smallest distance between them is below a given threshold or not.
  17. class hkpShapeConnectedCalculator : public hkReferencedObject
  18. {
  19.     public:
  20.         HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE);
  21. /// Constructor.
  22.         hkpShapeConnectedCalculator(hkpCollisionDispatcher* collisionDispatcher, hkReal maxDistanceForConnection);
  23.             /// Returns true if the two shapes are 'connected'. The two transforms are local to world transforms for
  24.             /// each of the respective shapes.
  25.         virtual hkBool isConnected( const hkpShape* a, const hkTransform& transA, const hkpShape* b, const hkTransform& transB );
  26. protected:
  27.             // Works out the closest distance between two transformed shapes.
  28.         static hkBool HK_CALL calculateClosestDistance( hkpCollisionDispatcher* dispatcher, const hkpShape* a, const hkTransform& transA, const hkpShape* b, const hkTransform& transB, hkReal maxDistance, hkReal& distanceOut);
  29. protected:
  30.         hkpCollisionDispatcher* m_dispatcher;
  31.             /// The distance between must be less than m_distance to be 'connected'
  32.         hkReal m_maxDistanceForConnection;
  33. };
  34. /// Utility class that can be used to cut shapes with a plane.
  35. class hkpShapeCutterUtil
  36. {
  37. public:
  38.         HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_COLLIDE, hkpShapeCutterUtil );
  39.             /// Will convert input shape into convex vertices shape if it can. If shape is a convex vertices shape,
  40.             /// will return it with a ref on it. If it is not possible to convert, will return HK_NULL.
  41. /// If the shape was a sphere, capsule or a cylinder, it will get a extraConvexRadius as its extra convex radius.
  42.             /// Note this method only converts 'terminal' convex shapes such as hkpBoxShape etc, not hkpTransformShape or containers
  43.         static const hkpConvexVerticesShape* HK_CALL ensureConvexVerticesShape(const hkpConvexShape* shape, hkReal extraConvexRadius = 0.001f);
  44.             /// Create a hkpConvexVerticesShape from an aabb
  45.         static hkpConvexVerticesShape* HK_CALL createAabbConvexVerticesShape(const hkAabb& aabb);
  46.             /// Create a sphere as a hkpConvexVerticesShape - can then be cut
  47.         static hkpConvexVerticesShape* HK_CALL createSphereConvexVerticesShape(hkReal radius, int numRows = 10);
  48. /// Create a cylinder sitting on the z = 0 plane, with height specified and the number of segments making up the surface.
  49. static hkpConvexVerticesShape* HK_CALL createCylinderConvexVerticesShape(hkReal radius, hkReal height, int numSegs, const hkTransform& trans);
  50. /// Create a cylinder with start and end points, and radius with numSegs dividing it up.
  51. static hkpConvexVerticesShape* HK_CALL createCylinderConvexVerticesShape(hkReal radius, const hkVector4& v0, const hkVector4& v1, int numSegs);
  52. /// Create a capsule with the given bottom and top vertices and radius using the specified segmenting.
  53. static hkpConvexVerticesShape* HK_CALL createCapsuleConvexVerticesShape(const hkVector4& top, const hkVector4& bottom, hkReal radius, int numSides = 6, int numHeightSegments = 1);
  54.             /// Creates a new shape, which is shape cut by the plane 'plane'. The cut shape returned is the shape
  55.             /// on the 'inside' of the plane (ie the opposite side to the normal)
  56.             /// If the resulting shape is empty, HK_NULL will be returned
  57. /// If the shape was a sphere, capsule or a cylinder, it will get a extraConvexRadius as its extra convex radius.
  58.             /// If the shape isn't cut at all it will be returned (with reference count incremented)
  59.         static const hkpShape* HK_CALL cut(const hkpShape* shape, const hkVector4& plane, hkReal extraConvexRadiusForImplicitShapes = 0.001f );
  60.             /// Creates potentially two new shapes, one on either side of the plane.
  61.             /// ShapeAOut will be the shape on the inside of the plane (opposite side to the normal), shapeBOut will be on the outside of the plane
  62.             /// If the resulting shape is empty, HK_NULL will be returned
  63. /// If the shape was a sphere, capsule or a cylinder, it will get a extraConvexRadius as its extra convex radius.
  64.             /// If the shape isn't cut at all it will be returned (with reference count incremented)
  65.         static void HK_CALL cut(const hkpShape* shapeIn, const hkVector4& planeIn, hkReal extraConvexRadius, const hkpShape** shapeAOut, const hkpShape** shapeBOut);
  66. /// For a given sphere radius will return the appropriate amount of rows based on
  67. /// a desired edge length for the faces, and a maxRadius.
  68. /// If the sphere is smaller than the edge size, will return the appropriate number of
  69. /// rows for a minimal sphere.
  70. static int HK_CALL approxSphereRows(hkReal edgeSize, int maxFaces, hkReal radius);
  71.             /// Create a compound shape from the sub shapes with transforms
  72.         static const hkpShape* HK_CALL createCompound(const hkpConvexShape*const* shapes, const hkTransform* transforms, int numShapes);
  73. /// Returns a convex shape which has the new transform. Will try and use the fastest transform shape,
  74. /// or no transform at all depending on the transform. <js.todo move this function to hkpTransformCollapseUtil, also try to convert shapes in place without using an extra transform shape (hkCapsuleShapes can easily be transformed)
  75.         static const hkpShape* HK_CALL transformConvexShape(const hkpConvexShape* shape, const hkTransform& transform);
  76.             /// Returns the shape transformed by transform. Use 'transformShape' to find a reasonably optimal transform.
  77.             /// This function does not try and combine transforms - but will normally append a hkpTransformShape in front of shape unless
  78.             /// the transform is the identity <js.todo move this function to hkpTransformCollapseUtil, rename hkpTransformCollapseUtil to hkpTransformShapeUtil
  79.         static const hkpShape* HK_CALL transformNonConvexShape(const hkpShape* shape,const hkTransform& transform);
  80.             /// Returns a shape that has been transformed by shape. Will try and use the fastest setup, depending on the shape and the transform <js.todo move this function to hkpTransformCollapseUtil, rename hkpTransformCollapseUtil to hkpTransformShapeUtil
  81.         static const hkpShape* HK_CALL transformShape(const hkpShape* shape, const hkTransform& transform);
  82.             /// Find all of the convex shapes in a shape hierarchy.
  83.             /// The transforms are the local to world transforms for each of the shapes.
  84.             /// NOTE! This method will not work properly with shape hierarchies that have shape collections which do not
  85.             /// return actual shape pointers (as opposed to storage being in the ShapeBuffer) - as the buffers will go
  86.             /// out of scope before the method returns.
  87.         static hkResult HK_CALL flattenIntoConvexShapes(const hkpShape* shape, const hkTransform& parentToWorld, hkArray<hkTransform>& transforms, hkArray<const hkpConvexShape*>& shapesOut);
  88.             /// Partitions the shapes, based on which shapes are connected
  89.         static void HK_CALL findConnectedIslands(hkpShapeConnectedCalculator* connected, const hkArray<const hkpConvexShape*>& shapes, const hkArray<hkTransform>& transforms, hkArray<int>& partitionSizes, hkArray<int>& partitions);
  90.             /// Returns -1 if shape is inside, 0 on and +1 if outside plane
  91.         static int HK_CALL findShapeSideOfPlane(const hkpShape* shape, const hkVector4& plane);
  92. /// Returns -1 if shape is inside, 0 if on and +1 if outside plane
  93. static int HK_CALL findShapeSideOfPlane(const hkpConvexShape* shapeIn, const hkVector4& plane);
  94.     protected:
  95.         enum { INSIDE = 1, OUTSIDE = 2 };
  96. protected:
  97. static hkBool HK_CALL _hasEdge(int* indices, int start, int end);
  98. static hkBool HK_CALL _hasEitherEdge(int* indices, int start, int end);
  99.         static void HK_CALL _addTriangle(int* indices, hkpConvexVerticesConnectivity* conn, const hkArray<hkVector4>& vertices, hkArray<hkVector4>& planes);
  100. static void HK_CALL _addQuad(int* indices, hkpConvexVerticesConnectivity* conn, const hkArray<hkVector4>& vertices, hkArray<hkVector4>& planes);
  101. // Works out the plane specified by the indices 0,1,2 in vertices
  102. static void HK_CALL _calculatePlane(int* indices, const hkArray<hkVector4>& vertices, hkVector4& plane);
  103. };
  104. #endif // HK_SHAPE_PLANE_CUT_UTIL_H
  105. /*
  106. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  107. * Confidential Information of Havok.  (C) Copyright 1999-2009
  108. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  109. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  110. * rights, and intellectual property rights in the Havok software remain in
  111. * Havok and/or its suppliers.
  112. * Use of this software for evaluation purposes is subject to and indicates
  113. * acceptance of the End User licence Agreement for this product. A copy of
  114. * the license is included with this software and is also available at www.havok.com/tryhavok.
  115. */