RavEngine
Loading...
Searching...
No Matches
DetourTileCache.h
1#ifndef DETOURTILECACHE_H
2#define DETOURTILECACHE_H
3
4#include "DetourStatus.h"
5
6
7
8typedef unsigned int dtObstacleRef;
9
10typedef unsigned int dtCompressedTileRef;
11
13enum dtCompressedTileFlags
14{
15 DT_COMPRESSEDTILE_FREE_DATA = 0x01,
16};
17
19{
20 unsigned int salt;
21 struct dtTileCacheLayerHeader* header;
22 unsigned char* compressed;
23 int compressedSize;
24 unsigned char* data;
25 int dataSize;
26 unsigned int flags;
27 dtCompressedTile* next;
28};
29
30enum ObstacleState
31{
32 DT_OBSTACLE_EMPTY,
33 DT_OBSTACLE_PROCESSING,
34 DT_OBSTACLE_PROCESSED,
35 DT_OBSTACLE_REMOVING,
36};
37
38enum ObstacleType
39{
40 DT_OBSTACLE_CYLINDER,
41 DT_OBSTACLE_BOX, // AABB
42 DT_OBSTACLE_ORIENTED_BOX, // OBB
43};
44
46{
47 float pos[ 3 ];
48 float radius;
49 float height;
50};
51
53{
54 float bmin[ 3 ];
55 float bmax[ 3 ];
56};
57
59{
60 float center[ 3 ];
61 float halfExtents[ 3 ];
62 float rotAux[ 2 ]; //{ cos(0.5f*angle)*sin(-0.5f*angle); cos(0.5f*angle)*cos(0.5f*angle) - 0.5 }
63};
64
65static const int DT_MAX_TOUCHED_TILES = 8;
67{
68 union
69 {
70 dtObstacleCylinder cylinder;
71 dtObstacleBox box;
72 dtObstacleOrientedBox orientedBox;
73 };
74
75 dtCompressedTileRef touched[DT_MAX_TOUCHED_TILES];
76 dtCompressedTileRef pending[DT_MAX_TOUCHED_TILES];
77 unsigned short salt;
78 unsigned char type;
79 unsigned char state;
80 unsigned char ntouched;
81 unsigned char npending;
83};
84
86{
87 float orig[3];
88 float cs, ch;
89 int width, height;
90 float walkableHeight;
91 float walkableRadius;
92 float walkableClimb;
93 float maxSimplificationError;
94 int maxTiles;
95 int maxObstacles;
96};
97
99{
100 virtual ~dtTileCacheMeshProcess() { }
101
102 virtual void process(struct dtNavMeshCreateParams* params,
103 unsigned char* polyAreas, unsigned short* polyFlags) = 0;
104};
105
106
108{
109public:
110 dtTileCache();
111 ~dtTileCache();
112
113 struct dtTileCacheAlloc* getAlloc() { return m_talloc; }
114 struct dtTileCacheCompressor* getCompressor() { return m_tcomp; }
115 const dtTileCacheParams* getParams() const { return &m_params; }
116
117 inline int getTileCount() const { return m_params.maxTiles; }
118 inline const dtCompressedTile* getTile(const int i) const { return &m_tiles[i]; }
119
120 inline int getObstacleCount() const { return m_params.maxObstacles; }
121 inline const dtTileCacheObstacle* getObstacle(const int i) const { return &m_obstacles[i]; }
122
123 const dtTileCacheObstacle* getObstacleByRef(dtObstacleRef ref);
124
125 dtObstacleRef getObstacleRef(const dtTileCacheObstacle* obmin) const;
126
127 dtStatus init(const dtTileCacheParams* params,
128 struct dtTileCacheAlloc* talloc,
129 struct dtTileCacheCompressor* tcomp,
130 struct dtTileCacheMeshProcess* tmproc);
131
132 int getTilesAt(const int tx, const int ty, dtCompressedTileRef* tiles, const int maxTiles) const ;
133
134 dtCompressedTile* getTileAt(const int tx, const int ty, const int tlayer);
135 dtCompressedTileRef getTileRef(const dtCompressedTile* tile) const;
136 const dtCompressedTile* getTileByRef(dtCompressedTileRef ref) const;
137
138 dtStatus addTile(unsigned char* data, const int dataSize, unsigned char flags, dtCompressedTileRef* result);
139
140 dtStatus removeTile(dtCompressedTileRef ref, unsigned char** data, int* dataSize);
141
142 // Cylinder obstacle.
143 dtStatus addObstacle(const float* pos, const float radius, const float height, dtObstacleRef* result);
144
145 // Aabb obstacle.
146 dtStatus addBoxObstacle(const float* bmin, const float* bmax, dtObstacleRef* result);
147
148 // Box obstacle: can be rotated in Y.
149 dtStatus addBoxObstacle(const float* center, const float* halfExtents, const float yRadians, dtObstacleRef* result);
150
151 dtStatus removeObstacle(const dtObstacleRef ref);
152
153 dtStatus queryTiles(const float* bmin, const float* bmax,
154 dtCompressedTileRef* results, int* resultCount, const int maxResults) const;
155
162 dtStatus update(const float dt, class dtNavMesh* navmesh, bool* upToDate = 0);
163
164 dtStatus buildNavMeshTilesAt(const int tx, const int ty, class dtNavMesh* navmesh);
165
166 dtStatus buildNavMeshTile(const dtCompressedTileRef ref, class dtNavMesh* navmesh);
167
168 void calcTightTileBounds(const struct dtTileCacheLayerHeader* header, float* bmin, float* bmax) const;
169
170 void getObstacleBounds(const struct dtTileCacheObstacle* ob, float* bmin, float* bmax) const;
171
172
174 inline dtCompressedTileRef encodeTileId(unsigned int salt, unsigned int it) const
175 {
176 return ((dtCompressedTileRef)salt << m_tileBits) | (dtCompressedTileRef)it;
177 }
178
180 inline unsigned int decodeTileIdSalt(dtCompressedTileRef ref) const
181 {
182 const dtCompressedTileRef saltMask = ((dtCompressedTileRef)1<<m_saltBits)-1;
183 return (unsigned int)((ref >> m_tileBits) & saltMask);
184 }
185
187 inline unsigned int decodeTileIdTile(dtCompressedTileRef ref) const
188 {
189 const dtCompressedTileRef tileMask = ((dtCompressedTileRef)1<<m_tileBits)-1;
190 return (unsigned int)(ref & tileMask);
191 }
192
194 inline dtObstacleRef encodeObstacleId(unsigned int salt, unsigned int it) const
195 {
196 return ((dtObstacleRef)salt << 16) | (dtObstacleRef)it;
197 }
198
200 inline unsigned int decodeObstacleIdSalt(dtObstacleRef ref) const
201 {
202 const dtObstacleRef saltMask = ((dtObstacleRef)1<<16)-1;
203 return (unsigned int)((ref >> 16) & saltMask);
204 }
205
207 inline unsigned int decodeObstacleIdObstacle(dtObstacleRef ref) const
208 {
209 const dtObstacleRef tileMask = ((dtObstacleRef)1<<16)-1;
210 return (unsigned int)(ref & tileMask);
211 }
212
213
214private:
215 // Explicitly disabled copy constructor and copy assignment operator.
216 dtTileCache(const dtTileCache&);
217 dtTileCache& operator=(const dtTileCache&);
218
219 enum ObstacleRequestAction
220 {
221 REQUEST_ADD,
222 REQUEST_REMOVE,
223 };
224
225 struct ObstacleRequest
226 {
227 int action;
228 dtObstacleRef ref;
229 };
230
231 int m_tileLutSize;
232 int m_tileLutMask;
233
234 dtCompressedTile** m_posLookup;
235 dtCompressedTile* m_nextFreeTile;
236 dtCompressedTile* m_tiles;
237
238 unsigned int m_saltBits;
239 unsigned int m_tileBits;
240
241 dtTileCacheParams m_params;
242
243 dtTileCacheAlloc* m_talloc;
244 dtTileCacheCompressor* m_tcomp;
245 dtTileCacheMeshProcess* m_tmproc;
246
247 dtTileCacheObstacle* m_obstacles;
248 dtTileCacheObstacle* m_nextFreeObstacle;
249
250 static const int MAX_REQUESTS = 64;
251 ObstacleRequest m_reqs[MAX_REQUESTS];
252 int m_nreqs;
253
254 static const int MAX_UPDATE = 64;
255 dtCompressedTileRef m_update[MAX_UPDATE];
256 int m_nupdate;
257};
258
259dtTileCache* dtAllocTileCache();
260void dtFreeTileCache(dtTileCache* tc);
261
262#endif
Definition DetourNavMesh.h:339
Definition DetourTileCache.h:108
dtObstacleRef encodeObstacleId(unsigned int salt, unsigned int it) const
Encodes an obstacle id.
Definition DetourTileCache.h:194
unsigned int decodeTileIdSalt(dtCompressedTileRef ref) const
Decodes a tile salt.
Definition DetourTileCache.h:180
unsigned int decodeObstacleIdObstacle(dtObstacleRef ref) const
Decodes an obstacle id.
Definition DetourTileCache.h:207
dtCompressedTileRef encodeTileId(unsigned int salt, unsigned int it) const
Encodes a tile id.
Definition DetourTileCache.h:174
dtStatus update(const float dt, class dtNavMesh *navmesh, bool *upToDate=0)
Definition DetourTileCache.cpp:518
unsigned int decodeTileIdTile(dtCompressedTileRef ref) const
Decodes a tile id.
Definition DetourTileCache.h:187
unsigned int decodeObstacleIdSalt(dtObstacleRef ref) const
Decodes an obstacle salt.
Definition DetourTileCache.h:200
Definition DetourTileCache.h:19
unsigned int salt
Counter describing modifications to the tile.
Definition DetourTileCache.h:20
Definition DetourNavMeshBuilder.h:27
Definition DetourTileCache.h:53
Definition DetourTileCache.h:46
Definition DetourTileCache.h:59
Definition DetourTileCacheBuilder.h:80
Definition DetourTileCacheBuilder.h:97
Definition DetourTileCacheBuilder.h:33
Definition DetourTileCache.h:99
Definition DetourTileCache.h:67
Definition DetourTileCache.h:86