DetourTileCache.h 6.0 KB

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