DetourTileCache.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #ifndef DETOURTILECACHE_H
  2. #define DETOURTILECACHE_H
  3. #include "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 void process(struct dtNavMeshCreateParams* params,
  56. unsigned char* polyAreas, unsigned short* polyFlags) = 0;
  57. };
  58. class dtTileCache
  59. {
  60. public:
  61. dtTileCache();
  62. ~dtTileCache();
  63. struct dtTileCacheAlloc* getAlloc() { return m_talloc; }
  64. struct dtTileCacheCompressor* getCompressor() { return m_tcomp; }
  65. const dtTileCacheParams* getParams() const { return &m_params; }
  66. inline int getTileCount() const { return m_params.maxTiles; }
  67. inline const dtCompressedTile* getTile(const int i) const { return &m_tiles[i]; }
  68. inline int getObstacleCount() const { return m_params.maxObstacles; }
  69. inline const dtTileCacheObstacle* getObstacle(const int i) const { return &m_obstacles[i]; }
  70. const dtTileCacheObstacle* getObstacleByRef(dtObstacleRef ref);
  71. dtObstacleRef getObstacleRef(const dtTileCacheObstacle* obmin) const;
  72. dtStatus init(const dtTileCacheParams* params,
  73. struct dtTileCacheAlloc* talloc,
  74. struct dtTileCacheCompressor* tcomp,
  75. struct dtTileCacheMeshProcess* tmproc);
  76. int getTilesAt(const int tx, const int ty, dtCompressedTileRef* tiles, const int maxTiles) const ;
  77. dtCompressedTile* getTileAt(const int tx, const int ty, const int tlayer);
  78. dtCompressedTileRef getTileRef(const dtCompressedTile* tile) const;
  79. const dtCompressedTile* getTileByRef(dtCompressedTileRef ref) const;
  80. dtStatus addTile(unsigned char* data, const int dataSize, unsigned char flags, dtCompressedTileRef* result);
  81. dtStatus removeTile(dtCompressedTileRef ref, unsigned char** data, int* dataSize);
  82. dtStatus addObstacle(const float* pos, const float radius, const float height, dtObstacleRef* result);
  83. dtStatus removeObstacle(const dtObstacleRef ref);
  84. dtStatus queryTiles(const float* bmin, const float* bmax,
  85. dtCompressedTileRef* results, int* resultCount, const int maxResults) const;
  86. dtStatus update(const float /*dt*/, class dtNavMesh* navmesh);
  87. dtStatus buildNavMeshTilesAt(const int tx, const int ty, class dtNavMesh* navmesh);
  88. dtStatus buildNavMeshTile(const dtCompressedTileRef ref, class dtNavMesh* navmesh);
  89. void calcTightTileBounds(const struct dtTileCacheLayerHeader* header, float* bmin, float* bmax) const;
  90. void getObstacleBounds(const struct dtTileCacheObstacle* ob, float* bmin, float* bmax) const;
  91. /// Encodes a tile id.
  92. inline dtCompressedTileRef encodeTileId(unsigned int salt, unsigned int it) const
  93. {
  94. return ((dtCompressedTileRef)salt << m_tileBits) | (dtCompressedTileRef)it;
  95. }
  96. /// Decodes a tile salt.
  97. inline unsigned int decodeTileIdSalt(dtCompressedTileRef ref) const
  98. {
  99. const dtCompressedTileRef saltMask = ((dtCompressedTileRef)1<<m_saltBits)-1;
  100. return (unsigned int)((ref >> m_tileBits) & saltMask);
  101. }
  102. /// Decodes a tile id.
  103. inline unsigned int decodeTileIdTile(dtCompressedTileRef ref) const
  104. {
  105. const dtCompressedTileRef tileMask = ((dtCompressedTileRef)1<<m_tileBits)-1;
  106. return (unsigned int)(ref & tileMask);
  107. }
  108. /// Encodes an obstacle id.
  109. inline dtObstacleRef encodeObstacleId(unsigned int salt, unsigned int it) const
  110. {
  111. return ((dtObstacleRef)salt << 16) | (dtObstacleRef)it;
  112. }
  113. /// Decodes an obstacle salt.
  114. inline unsigned int decodeObstacleIdSalt(dtObstacleRef ref) const
  115. {
  116. const dtObstacleRef saltMask = ((dtObstacleRef)1<<16)-1;
  117. return (unsigned int)((ref >> 16) & saltMask);
  118. }
  119. /// Decodes an obstacle id.
  120. inline unsigned int decodeObstacleIdObstacle(dtObstacleRef ref) const
  121. {
  122. const dtObstacleRef tileMask = ((dtObstacleRef)1<<16)-1;
  123. return (unsigned int)(ref & tileMask);
  124. }
  125. private:
  126. enum ObstacleRequestAction
  127. {
  128. REQUEST_ADD,
  129. REQUEST_REMOVE,
  130. };
  131. struct ObstacleRequest
  132. {
  133. int action;
  134. dtObstacleRef ref;
  135. };
  136. int m_tileLutSize; ///< Tile hash lookup size (must be pot).
  137. int m_tileLutMask; ///< Tile hash lookup mask.
  138. dtCompressedTile** m_posLookup; ///< Tile hash lookup.
  139. dtCompressedTile* m_nextFreeTile; ///< Freelist of tiles.
  140. dtCompressedTile* m_tiles; ///< List of tiles.
  141. unsigned int m_saltBits; ///< Number of salt bits in the tile ID.
  142. unsigned int m_tileBits; ///< Number of tile bits in the tile ID.
  143. dtTileCacheParams m_params;
  144. dtTileCacheAlloc* m_talloc;
  145. dtTileCacheCompressor* m_tcomp;
  146. dtTileCacheMeshProcess* m_tmproc;
  147. dtTileCacheObstacle* m_obstacles;
  148. dtTileCacheObstacle* m_nextFreeObstacle;
  149. static const int MAX_REQUESTS = 64;
  150. ObstacleRequest m_reqs[MAX_REQUESTS];
  151. int m_nreqs;
  152. static const int MAX_UPDATE = 64;
  153. dtCompressedTileRef m_update[MAX_UPDATE];
  154. int m_nupdate;
  155. };
  156. dtTileCache* dtAllocTileCache();
  157. void dtFreeTileCache(dtTileCache* tc);
  158. #endif