hkGeometryMatchingUtils.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_GEOMETRY_MATCHING_UTILS_H
  9. #define HK_GEOMETRY_MATCHING_UTILS_H
  10. #include <Common/Base/Types/Geometry/hkGeometry.h>
  11. /// Utility class, contains methods that operate with hkGeometry objects.
  12. class hkGeometryMatchingUtils
  13. {
  14. public:
  15. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_UTILITIES, hkGeometryMatchingUtils);
  16. /// A simple geometry made of triangles
  17. struct Geometry
  18. {
  19. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_UTILITIES, hkGeometryMatchingUtils::Geometry);
  20. HK_FORCE_INLINE Geometry();
  21. HK_FORCE_INLINE Geometry( const hkGeometry* geometry );
  22. /// The vertices
  23. const hkVector4* m_vertices;
  24. /// The number of vertices
  25. int m_numVertices;
  26. /// All vertex indices of the triangles (3 per triangle)
  27. const int* m_triangleIndices;
  28. /// The number of triangles
  29. int m_numTriangles;
  30. };
  31. //
  32. // Triangle Matching
  33. //
  34. /// structure holding the results of matchTriangles()
  35. /// Map between Search -> Reference
  36. struct TriangleMap
  37. {
  38. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_UTILITIES, hkGeometryMatchingUtils::TriangleMap);
  39. /// The best matched triangle identifier
  40. struct Hit
  41. {
  42. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_UTILITIES, hkGeometryMatchingUtils::TriangleMap::Hit);
  43. hkUint16 m_geometryIndex; 
  44. hkUint8 m_indexOffset;
  45. int     m_triangleIndex;
  46. bool m_flippedWinding;
  47. };
  48. /// Returns the best matched triangle for each search triangle
  49. HK_FORCE_INLINE const Hit& getBestMatchingTriangle( int searchGeometryIndex, int searchTriangleIndex) const;
  50. /// A start index into the m_foundReferenceTriangle array per geometry
  51. hkInplaceArray<hkUint32,16>   m_startIndexPerGeometry;
  52. /// An array of hits, one for each input triangle references the closest match
  53. hkInplaceArray<Hit,128> m_foundReferenceTriangle;
  54. };
  55. /// Try to match two set of triangles:
  56. /// for every search triangle you get an (m_geometryIndex,m_triangleIndex) pointing to the closest matched reference triangle
  57. /// (only if if the vertex distance squared sum is <maxDistance^2, else m_triangleIndex = -1 is returned).
  58. static void HK_CALL matchTriangles( const hkArray<Geometry>& referenceTriangles, const hkArray<Geometry>& searchTriangles,  hkReal maxDistance, TriangleMap& triangleMapOut );
  59. //
  60. // Vertex Matching
  61. //
  62. /// Structure holding the results of matchVertices()
  63. struct FullMap
  64. {
  65. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_UTILITIES, hkGeometryMatchingUtils::FullMap);
  66. TriangleMap m_triangleMap;
  67. /// The information returned by getBestMatchignVertex
  68. struct VertexHit
  69. {
  70. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_UTILITIES, hkGeometryMatchingUtils::FullMap::VertexHit);
  71. /// The index of the output (reference) geometry containing the associated vertex
  72. hkUint16 m_geometryIndex;
  73. /// The index of the output (reference) triangle containing the associated vertex
  74. hkUint32 m_triangleIndex;
  75. /// Either 0, 1 or 2 - the position in the triangle containing the associated vertex.
  76. hkUint8 m_trianglePos; 
  77. };
  78. HK_FORCE_INLINE void getBestMatchingVertex (int searchGeometryIndex, int searchVertexIndex, VertexHit& hitOut) const;
  79. // 
  80. // Internal use
  81. //
  82. struct VertexTriangleEntry
  83. {
  84. hkUint32 m_triangleIndex;
  85. hkUint8 m_trianglePos; // either 0,1 or 2
  86. };
  87. HK_FORCE_INLINE const VertexTriangleEntry& _getSearchTriangleForSearchVertex (int searchGeometryIndex, int searchVertexIndex) const;
  88. hkInplaceArray<hkUint32,16> m_startEntryPerGeometry;
  89. hkArray<VertexTriangleEntry> m_searchTrianglePerSearchVertex;
  90. };
  91. static void HK_CALL matchGeometries ( const hkArray<Geometry>& referenceGeometries, const hkArray<Geometry>& searchGeometries, hkReal maxDistance, FullMap& fullMapOut);
  92. };
  93. #include <Common/GeometryUtilities/Matching/hkGeometryMatchingUtils.inl>
  94. #endif //HK_GEOMETRY_MATCHING_UTILS_H
  95. /*
  96. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  97. * Confidential Information of Havok.  (C) Copyright 1999-2009
  98. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  99. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  100. * rights, and intellectual property rights in the Havok software remain in
  101. * Havok and/or its suppliers.
  102. * Use of this software for evaluation purposes is subject to and indicates
  103. * acceptance of the End User licence Agreement for this product. A copy of
  104. * the license is included with this software and is also available at www.havok.com/tryhavok.
  105. */