DetourTileCache.h 6.0 KB

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