DetourPathCorridor.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. //
  2. // Copyright (c) 2009-2010 Mikko Mononen [email protected]
  3. //
  4. // This software is provided 'as-is', without any express or implied
  5. // warranty. In no event will the authors be held liable for any damages
  6. // arising from the use of this software.
  7. // Permission is granted to anyone to use this software for any purpose,
  8. // including commercial applications, and to alter it and redistribute it
  9. // freely, subject to the following restrictions:
  10. // 1. The origin of this software must not be misrepresented; you must not
  11. // claim that you wrote the original software. If you use this software
  12. // in a product, an acknowledgment in the product documentation would be
  13. // appreciated but is not required.
  14. // 2. Altered source versions must be plainly marked as such, and must not be
  15. // misrepresented as being the original software.
  16. // 3. This notice may not be removed or altered from any source distribution.
  17. //
  18. #ifndef DETOUTPATHCORRIDOR_H
  19. #define DETOUTPATHCORRIDOR_H
  20. // ATOMIC BEGIN
  21. #include "../../Detour/include/DetourNavMeshQuery.h"
  22. // ATOMIC END
  23. /// Represents a dynamic polygon corridor used to plan agent movement.
  24. /// @ingroup crowd, detour
  25. class dtPathCorridor
  26. {
  27. float m_pos[3];
  28. float m_target[3];
  29. dtPolyRef* m_path;
  30. int m_npath;
  31. int m_maxPath;
  32. public:
  33. dtPathCorridor();
  34. ~dtPathCorridor();
  35. /// Allocates the corridor's path buffer.
  36. /// @param[in] maxPath The maximum path size the corridor can handle.
  37. /// @return True if the initialization succeeded.
  38. bool init(const int maxPath);
  39. /// Resets the path corridor to the specified position.
  40. /// @param[in] ref The polygon reference containing the position.
  41. /// @param[in] pos The new position in the corridor. [(x, y, z)]
  42. void reset(dtPolyRef ref, const float* pos);
  43. /// Finds the corners in the corridor from the position toward the target. (The straightened path.)
  44. /// @param[out] cornerVerts The corner vertices. [(x, y, z) * cornerCount] [Size: <= maxCorners]
  45. /// @param[out] cornerFlags The flag for each corner. [(flag) * cornerCount] [Size: <= maxCorners]
  46. /// @param[out] cornerPolys The polygon reference for each corner. [(polyRef) * cornerCount]
  47. /// [Size: <= @p maxCorners]
  48. /// @param[in] maxCorners The maximum number of corners the buffers can hold.
  49. /// @param[in] navquery The query object used to build the corridor.
  50. /// @param[in] filter The filter to apply to the operation.
  51. /// @return The number of corners returned in the corner buffers. [0 <= value <= @p maxCorners]
  52. int findCorners(float* cornerVerts, unsigned char* cornerFlags,
  53. dtPolyRef* cornerPolys, const int maxCorners,
  54. dtNavMeshQuery* navquery, const dtQueryFilter* filter);
  55. /// Attempts to optimize the path if the specified point is visible from the current position.
  56. /// @param[in] next The point to search toward. [(x, y, z])
  57. /// @param[in] pathOptimizationRange The maximum range to search. [Limit: > 0]
  58. /// @param[in] navquery The query object used to build the corridor.
  59. /// @param[in] filter The filter to apply to the operation.
  60. void optimizePathVisibility(const float* next, const float pathOptimizationRange,
  61. dtNavMeshQuery* navquery, const dtQueryFilter* filter);
  62. /// Attempts to optimize the path using a local area search. (Partial replanning.)
  63. /// @param[in] navquery The query object used to build the corridor.
  64. /// @param[in] filter The filter to apply to the operation.
  65. bool optimizePathTopology(dtNavMeshQuery* navquery, const dtQueryFilter* filter);
  66. bool moveOverOffmeshConnection(dtPolyRef offMeshConRef, dtPolyRef* refs,
  67. float* startPos, float* endPos,
  68. dtNavMeshQuery* navquery);
  69. bool fixPathStart(dtPolyRef safeRef, const float* safePos);
  70. bool trimInvalidPath(dtPolyRef safeRef, const float* safePos,
  71. dtNavMeshQuery* navquery, const dtQueryFilter* filter);
  72. /// Checks the current corridor path to see if its polygon references remain valid.
  73. /// @param[in] maxLookAhead The number of polygons from the beginning of the corridor to search.
  74. /// @param[in] navquery The query object used to build the corridor.
  75. /// @param[in] filter The filter to apply to the operation.
  76. bool isValid(const int maxLookAhead, dtNavMeshQuery* navquery, const dtQueryFilter* filter);
  77. /// Moves the position from the current location to the desired location, adjusting the corridor
  78. /// as needed to reflect the change.
  79. /// @param[in] npos The desired new position. [(x, y, z)]
  80. /// @param[in] navquery The query object used to build the corridor.
  81. /// @param[in] filter The filter to apply to the operation.
  82. /// @return Returns true if move succeeded.
  83. bool movePosition(const float* npos, dtNavMeshQuery* navquery, const dtQueryFilter* filter);
  84. /// Moves the target from the curent location to the desired location, adjusting the corridor
  85. /// as needed to reflect the change.
  86. /// @param[in] npos The desired new target position. [(x, y, z)]
  87. /// @param[in] navquery The query object used to build the corridor.
  88. /// @param[in] filter The filter to apply to the operation.
  89. /// @return Returns true if move succeeded.
  90. bool moveTargetPosition(const float* npos, dtNavMeshQuery* navquery, const dtQueryFilter* filter);
  91. /// Loads a new path and target into the corridor.
  92. /// @param[in] target The target location within the last polygon of the path. [(x, y, z)]
  93. /// @param[in] path The path corridor. [(polyRef) * @p npolys]
  94. /// @param[in] npath The number of polygons in the path.
  95. void setCorridor(const float* target, const dtPolyRef* polys, const int npath);
  96. /// Gets the current position within the corridor. (In the first polygon.)
  97. /// @return The current position within the corridor.
  98. inline const float* getPos() const { return m_pos; }
  99. /// Gets the current target within the corridor. (In the last polygon.)
  100. /// @return The current target within the corridor.
  101. inline const float* getTarget() const { return m_target; }
  102. /// The polygon reference id of the first polygon in the corridor, the polygon containing the position.
  103. /// @return The polygon reference id of the first polygon in the corridor. (Or zero if there is no path.)
  104. inline dtPolyRef getFirstPoly() const { return m_npath ? m_path[0] : 0; }
  105. /// The polygon reference id of the last polygon in the corridor, the polygon containing the target.
  106. /// @return The polygon reference id of the last polygon in the corridor. (Or zero if there is no path.)
  107. inline dtPolyRef getLastPoly() const { return m_npath ? m_path[m_npath-1] : 0; }
  108. /// The corridor's path.
  109. /// @return The corridor's path. [(polyRef) * #getPathCount()]
  110. inline const dtPolyRef* getPath() const { return m_path; }
  111. /// The number of polygons in the current corridor path.
  112. /// @return The number of polygons in the current corridor path.
  113. inline int getPathCount() const { return m_npath; }
  114. };
  115. int dtMergeCorridorStartMoved(dtPolyRef* path, const int npath, const int maxPath,
  116. const dtPolyRef* visited, const int nvisited);
  117. int dtMergeCorridorEndMoved(dtPolyRef* path, const int npath, const int maxPath,
  118. const dtPolyRef* visited, const int nvisited);
  119. int dtMergeCorridorStartShortcut(dtPolyRef* path, const int npath, const int maxPath,
  120. const dtPolyRef* visited, const int nvisited);
  121. #endif // DETOUTPATHCORRIDOR_H