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

其他游戏

开发平台:

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_PLANEEQUATION_UTIL
  9. #define HK_PLANEEQUATION_UTIL
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Algorithm/Sort/hkSort.h>
  12. ///
  13. /// The function getConvexVerticesFromPlaneEquations calculates the set of vertices at the
  14. /// intersection of a set of plane equations.
  15. ///
  16. class hkPlaneEquationUtil
  17. {
  18. public:
  19. struct IntersectionPoint
  20. {
  21. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_GEOMETRY, hkPlaneEquationUtil::IntersectionPoint );
  22. void sort()
  23. {
  24. if ( m_planeA > m_planeB ) hkAlgorithm::swap( m_planeA, m_planeB );
  25. //if ( m_planeB > m_planeC ) hkAlgorithm::swap( m_planeB, m_planeC );
  26. //if ( m_planeA > m_planeB ) hkAlgorithm::swap( m_planeA, m_planeB );
  27. }
  28. hkVector4 m_location;
  29. int m_planeA;
  30. int m_planeB;
  31. int m_planeC;
  32. };
  33. struct VisitedEdge
  34. {
  35. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_GEOMETRY, hkPlaneEquationUtil::VisitedEdge );
  36. hkBool operator==( const VisitedEdge& other )
  37. {
  38. return ( (( m_planeA == other.m_planeA ) &&
  39.  ( m_planeB == other.m_planeB ) ) ||
  40.  (( m_planeB == other.m_planeA  ) &&
  41.  ( m_planeA == other.m_planeB )) );
  42. }
  43. int m_planeA;
  44. int m_planeB;
  45. IntersectionPoint* m_fromPoint;
  46. hkVector4 m_intersectionLineDir;
  47. };
  48. struct hkpPlaneEqnIndexPair
  49. {
  50. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_GEOMETRY, hkPlaneEquationUtil::hkpPlaneEqnIndexPair );
  51. hkBool operator==( const hkpPlaneEqnIndexPair& other)
  52. {
  53. return ( (m_first == other.m_first &&
  54. m_second == other.m_second ) );
  55. }
  56. int m_first;
  57. int m_second;
  58. };
  59. public:
  60. /// The entry function to the algorithm.
  61. /// If the planeEquations wrap a convex object, then this function finds the vertices of that convex object, and
  62. /// returns success.  The algorithm used is one that walks around the intersection lines of the plane equations.
  63. static hkResult HK_CALL getConvexVerticesFromPlaneEquations( const hkArray<hkVector4>& planeEquations, hkArray<hkVector4>& vertexCloudOut );
  64. public:
  65. /// Finds a point on the inner space (on the actual convex hull)
  66. /// to start the walk through the planar intersections.
  67. static hkResult HK_CALL getStartingPoint( const hkArray<hkVector4>& planeEquations, 
  68. int& nearlyParallelPlaneLower,
  69. int& nearlyParallelPlaneUpper,
  70. IntersectionPoint& lowerPoint, 
  71. IntersectionPoint& upperPoint );
  72. /// Given three plane equations, this function calculates the point at their intersection.
  73. static hkResult HK_CALL findTriPlaneIntersectionPoint( const hkArray<hkVector4>& planeEquations, int m_planeAIndex, int planeBIndex, int planeCIndex, IntersectionPoint& intersectionPointOut);
  74. /// Returns two points on the convex hull that are on the line of intersection between the two input planes.
  75. static hkResult HK_CALL findPlanarIntersections( const hkVector4& intersectionLineDir, const hkArray<hkVector4>& planeEquations, int m_planeAIndex, int planeBIndex, IntersectionPoint& upperPointOut, IntersectionPoint& lowerPointOut );
  76. /// Determines if there is another plane that can be intersected with, when travelling along the intersectionLineDirection (which is the intersection of the two input planes).
  77. /// There may be several planes that intersect at the same point - these are filled into the array.
  78. static hkBool HK_CALL isNextIntersectionPoint( const hkVector4& intersectionLineDir, const hkArray<hkVector4>& planeEquations, int planeAIndex, int planeBIndex, hkVector4& vertex, hkArray< IntersectionPoint >& pointsOut );
  79. /// Calculates the intersection line between plane A and plane B, pointing in the direction away from plane C.
  80. static void HK_CALL calculateIntersectionLine(const hkArray<hkVector4>& planeEquations, int m_planeAIndex, int planeBIndex, int planeCIndex, hkVector4& intersectionLineDir);
  81. /// The guts of the algorithm - this performs a flood-fill over the intersection lines of the planeEquations.
  82. /// This function is called recursively and finishes when it cannot find any more new visitedEdges.
  83. static void HK_CALL walkAlongEdge( VisitedEdge& v, const hkArray<hkVector4>& planeEquations, hkArray<VisitedEdge>& visitedEdges, hkArray<hkVector4>& vertexCloudOut );
  84. };
  85. #endif // HK_PLANEEQUATION_UTIL
  86. /*
  87. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  88. * Confidential Information of Havok.  (C) Copyright 1999-2009
  89. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  90. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  91. * rights, and intellectual property rights in the Havok software remain in
  92. * Havok and/or its suppliers.
  93. * Use of this software for evaluation purposes is subject to and indicates
  94. * acceptance of the End User licence Agreement for this product. A copy of
  95. * the license is included with this software and is also available at www.havok.com/tryhavok.
  96. */