DetourTileCache.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #ifndef DETOURTILECACHE_H
  2. #define DETOURTILECACHE_H
  3. #include "recast/Detour/DetourStatus.h"
  4. typedef unsigned int dtObstacleRef;
  5. typedef unsigned int dtCompressedTileRef;
  6. /// Flags for addTile
  7. enum dtCompressedTileFlags
  8. {
  9. DT_COMPRESSEDTILE_FREE_DATA = 0x01, ///< Navmesh owns the tile memory and should free it.
  10. };
  11. struct dtCompressedTile
  12. {
  13. unsigned int salt; ///< Counter describing modifications to the tile.
  14. struct dtTileCacheLayerHeader* header;
  15. unsigned char* compressed;
  16. int compressedSize;
  17. unsigned char* data;
  18. int dataSize;
  19. unsigned int flags;
  20. dtCompressedTile* next;
  21. };
  22. enum ObstacleState
  23. {
  24. DT_OBSTACLE_EMPTY,
  25. DT_OBSTACLE_PROCESSING,
  26. DT_OBSTACLE_PROCESSED,
  27. DT_OBSTACLE_REMOVING,
  28. };
  29. static const int DT_MAX_TOUCHED_TILES = 8;
  30. struct dtTileCacheObstacle
  31. {
  32. float pos[3], radius, height;
  33. dtCompressedTileRef touched[DT_MAX_TOUCHED_TILES];
  34. dtCompressedTileRef pending[DT_MAX_TOUCHED_TILES];
  35. unsigned short salt;
  36. unsigned char state;
  37. unsigned char ntouched;
  38. unsigned char npending;
  39. dtTileCacheObstacle* next;
  40. };
  41. struct dtTileCacheParams
  42. {
  43. float orig[3];
  44. float cs, ch;
  45. int width, height;
  46. float walkableHeight;
  47. float walkableRadius;
  48. float walkableClimb;
  49. float maxSimplificationError;
  50. int maxTiles;
  51. int maxObstacles;
  52. };
  53. struct dtTileCacheMeshProcess
  54. {
  55. virtual ~dtTileCacheMeshProcess() { }
  56. virtual void process(struct dtNavMeshCreateParams* params,
  57. unsigned char* polyAreas, unsigned short* polyFlags) = 0;
  58. };
  59. class dtTileCache
  60. {
  61. public:
  62. dtTileCache();
  63. ~dtTileCache();
  64. struct dtTileCacheAlloc* getAlloc() { return m_talloc; }
  65. struct dtTileCacheCompressor* getCompressor() { return m_tcomp; }
  66. const dtTileCacheParams* getParams() const { return &m_params; }
  67. inline int getTileCount() const { return m_params.maxTiles; }
  68. inline const dtCompressedTile* getTile(const int i) const { return &m_tiles[i]; }
  69. inline int getObstacleCount() const { return m_params.maxObstacles; }
  70. inline const dtTileCacheObstacle* getObstacle(const int i) const { return &m_obstacles[i]; }
  71. const dtTileCacheObstacle* getObstacleByRef(dtObstacleRef ref);
  72. dtObstacleRef getObstacleRef(const dtTileCacheObstacle* obmin) const;
  73. dtStatus init(const dtTileCacheParams* params,
  74. struct dtTileCacheAlloc* talloc,
  75. struct dtTileCacheCompressor* tcomp,
  76. struct dtTileCacheMeshProcess* tmproc);
  77. int getTilesAt(const int tx, const int ty, dtCompressedTileRef* tiles, const int maxTiles) const ;
  78. dtCompressedTile* getTileAt(const int tx, const int ty, const int tlayer);
  79. dtCompressedTileRef getTileRef(const dtCompressedTile* tile) const;
  80. const dtCompressedTile* getTileByRef(dtCompressedTileRef ref) const;
  81. dtStatus addTile(unsigned char* data, const int dataSize, unsigned char flags, dtCompressedTileRef* result);
  82. dtStatus removeTile(dtCompressedTileRef ref, unsigned char** data, int* dataSize);
  83. dtStatus addObstacle(const float* pos, const float radius, const float height, dtObstacleRef* result);
  84. dtStatus removeObstacle(const dtObstacleRef ref);
  85. dtStatus queryTiles(const float* bmin, const float* bmax,
  86. dtCompressedTileRef* results, int* resultCount, const int maxResults) const;
  87. dtStatus update(const float /*dt*/, class dtNavMesh* navmesh);
  88. dtStatus buildNavMeshTilesAt(const int tx, const int ty, class dtNavMesh* navmesh);
  89. dtStatus buildNavMeshTile(const dtCompressedTileRef ref, class dtNavMesh* navmesh);
  90. void calcTightTileBounds(const struct dtTileCacheLayerHeader* header, float* bmin, float* bmax) const;
  91. void getObstacleBounds(const struct dtTileCacheObstacle* ob, float* bmin, float* bmax) const;
  92. /// Encodes a tile id.
  93. inline dtCompressedTileRef encodeTileId(unsigned int salt, unsigned int it) const
  94. {
  95. return ((dtCompressedTileRef)salt << m_tileBits) | (dtCompressedTileRef)it;
  96. }
  97. /// Decodes a tile salt.
  98. inline unsigned int decodeTileIdSalt(dtCompressedTileRef ref) const
  99. {
  100. const dtCompressedTileRef saltMask = ((dtCompressedTileRef)1<<m_saltBits)-1;
  101. return (unsigned int)((ref >> m_tileBits) & saltMask);
  102. }
  103. /// Decodes a tile id.
  104. inline unsigned int decodeTileIdTile(dtCompressedTileRef ref) const
  105. {
  106. const dtCompressedTileRef tileMask = ((dtCompressedTileRef)1<<m_tileBits)-1;
  107. return (unsigned int)(ref & tileMask);
  108. }
  109. /// Encodes an obstacle id.
  110. inline dtObstacleRef encodeObstacleId(unsigned int salt, unsigned int it) const
  111. {
  112. return ((dtObstacleRef)salt << 16) | (dtObstacleRef)it;
  113. }
  114. /// Decodes an obstacle salt.
  115. inline unsigned int decodeObstacleIdSalt(dtObstacleRef ref) const
  116. {
  117. const dtObstacleRef saltMask = ((dtObstacleRef)1<<16)-1;
  118. return (unsigned int)((ref >> 16) & saltMask);
  119. }
  120. /// Decodes an obstacle id.
  121. inline unsigned int decodeObstacleIdObstacle(dtObstacleRef ref) const
  122. {
  123. const dtObstacleRef tileMask = ((dtObstacleRef)1<<16)-1;
  124. return (unsigned int)(ref & tileMask);
  125. }
  126. private:
  127. enum ObstacleRequestAction
  128. {
  129. REQUEST_ADD,
  130. REQUEST_REMOVE,
  131. };
  132. struct ObstacleRequest
  133. {
  134. int action;
  135. dtObstacleRef ref;
  136. };
  137. int m_tileLutSize; ///< Tile hash lookup size (must be pot).
  138. int m_tileLutMask; ///< Tile hash lookup mask.
  139. dtCompressedTile** m_posLookup; ///< Tile hash lookup.
  140. dtCompressedTile* m_nextFreeTile; ///< Freelist of tiles.
  141. dtCompressedTile* m_tiles; ///< List of tiles.
  142. unsigned int m_saltBits; ///< Number of salt bits in the tile ID.
  143. unsigned int m_tileBits; ///< Number of tile bits in the tile ID.
  144. dtTileCacheParams m_params;
  145. dtTileCacheAlloc* m_talloc;
  146. dtTileCacheCompressor* m_tcomp;
  147. dtTileCacheMeshProcess* m_tmproc;
  148. dtTileCacheObstacle* m_obstacles;
  149. dtTileCacheObstacle* m_nextFreeObstacle;
  150. static const int MAX_REQUESTS = 64;
  151. ObstacleRequest m_reqs[MAX_REQUESTS];
  152. int m_nreqs;
  153. static const int MAX_UPDATE = 64;
  154. dtCompressedTileRef m_update[MAX_UPDATE];
  155. int m_nupdate;
  156. };
  157. dtTileCache* dtAllocTileCache();
  158. void dtFreeTileCache(dtTileCache* tc);
  159. #endif