env_map.h 12.2 KB
Newer Older
1 2
#ifndef ENV_MAP_H
#define ENV_MAP_H
Pierre Kraemer's avatar
Pierre Kraemer committed
3 4 5 6 7

#include <iostream>
#include <algorithm>

#include "Topology/generic/parameters.h"
Pierre Kraemer's avatar
update  
Pierre Kraemer committed
8
#include "Topology/map/embeddedMap2.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
9 10 11 12 13 14 15 16 17

#include "Algo/ImplicitHierarchicalMesh/ihm.h"
#include "Algo/ImplicitHierarchicalMesh/subdivision.h"

#include "Algo/Modelisation/polyhedron.h"
#include "Algo/Modelisation/extrusion.h"
#include "Algo/Modelisation/subdivision.h"
#include "Algo/Geometry/centroid.h"
#include "Algo/Geometry/area.h"
Thomas's avatar
Thomas committed
18
#include "Geometry/bounding_box.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
19 20 21 22 23

#include "Container/fakeAttribute.h"

#include "Algo/Parallel/parallel_foreach.h"

Pierre Kraemer's avatar
Pierre Kraemer committed
24 25
#include "spatialHashing.h"

26
using namespace CGoGN ;
Pierre Kraemer's avatar
Pierre Kraemer committed
27

pitiot's avatar
maj  
pitiot committed
28 29 30
class Agent;
class Obstacle;
class MovingObstacle;
pitiot's avatar
merging  
pitiot committed
31
class ArticulatedObstacle;
Pierre Kraemer's avatar
Pierre Kraemer committed
32

David Cazier's avatar
David Cazier committed
33
#include "pfp.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
34

35
#define EXPORTING3
36 37 38 39 40 41 42 43

#ifdef EXPORTING3
	#include "Utils/Shaders/shaderPhongTexture.h"
	#include "Utils/Shaders/shaderSimpleTexture.h"
	#include "shaderCustomTex.h"
	#include "Algo/Import/importObjTex.h"
#endif

Pierre Kraemer's avatar
Pierre Kraemer committed
44 45
class EnvMap
{
46 47
public:
	PFP::MAP map ;
48

49 50 51 52 53 54 55 56 57 58 59 60
	/* Geometry of the EnvMap : the bounding box of the scene
	 * The density of cells in the EnvMap is given by two parameters :
	 *  - minCellSize : the size under which no subdivision occurs
	 *  - maxCellSize : the size of the initial cells (before subdivisions occur)
	 *  - obstacleDistance : the minimal goal distance between agents and obstacles
	 * The number of cells in the initial EnvMap is about (width*height)/(size*size)
	 */
	Geom::BoundingBox<VEC3> geometry ;
	REAL maxCellSize ;
	REAL minCellSize ;
	REAL obstacleDistance ;

David Cazier's avatar
David Cazier committed
61
	EnvMap() ;
62
	void init(unsigned int config, REAL width, REAL height, REAL minSize, REAL maxSize) ;
63

64 65 66
	void initGL();
	void draw();

67 68
	void scale(float val);

David Cazier's avatar
David Cazier committed
69
	void markPedWay() ;
Thomas's avatar
Thomas committed
70

David Cazier's avatar
David Cazier committed
71
	unsigned int mapMemoryCost() ;
Thomas's avatar
Thomas committed
72

Pierre Kraemer's avatar
Pierre Kraemer committed
73
#ifndef SPATIAL_HASHING
74
	Dart getBelongingCell(const VEC3& pos) ;
Thomas's avatar
Thomas committed
75

76 77
	void subdivideAllToMaxLevel() ;
	void subdivideToProperLevel() ;
Thomas's avatar
Thomas committed
78

79
	void foreach_neighborFace(Dart d, FunctorType& f) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
80

81
	void registerObstaclesInFaces() ;
pitiot's avatar
maj  
pitiot committed
82
	void registerWallInFaces();
83
	void addNeighborObstacles(PFP::OBSTACLES& obst, Dart d, bool edgeNeighbor) ;
84

85
	void setAgentNeighborsAndObstacles(Agent* agent) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
86

87 88 89 90 91 92
	unsigned int totalNeighborSize(Dart d) ;
	void nbAgentsIncrease(Dart d) ;
	void nbAgentsDecrease(Dart d) ;
	void pushAgentInCells(Agent* agent, Dart d) ;
	void popAgentInCells(Agent* agent, Dart d) ;
	void agentChangeFace(Agent* agent, Dart oldFace) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
93

Thomas Jund's avatar
Thomas Jund committed
94
	Dart popAndPushObstacleInCells(Obstacle* o, int n);
95 96 97 98 99
	void pushObstacleInCells(Obstacle * mo);
	void pushObstacleInOneRingCells(Obstacle * o, Dart d, int n);
	void pushObstacleInCells(Obstacle* o, int n, const std::vector<Dart>& memo_cross);
	void popObstacleInCells(Obstacle* o, int n);

100
	void popObstacleInCells(Obstacle* o, Dart d) ;
101 102
	void refine() ;
	void coarse() ;
103
	void updateMap() ;
104

105
	void resetAgentInFace(Agent* agent) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
106 107
#endif

David Cazier's avatar
David Cazier committed
108 109
	PFP::TVEC3 position ;
	PFP::TVEC3 normal ;
Pierre Kraemer's avatar
Pierre Kraemer committed
110

111 112
	Geom::BoundingBox<PFP::VEC3> bb;

David Cazier's avatar
David Cazier committed
113 114 115
	PFP::MAP mapScenary ;
	PFP::TVEC3 positionScenary ;
	PFP::TVEC3 normalScenary ;
pitiot's avatar
maj  
pitiot committed
116 117 118 119 120
	CellMarker<EDGE> obstacleMarkS ;
	CellMarker<FACE> buildingMarkS ;
	CellMarker<EDGE> obstacleMark ;
	CellMarker<FACE> buildingMark ;
	CellMarker<FACE> pedWayMark ;
121
//	CellMarkerMemo<FACE> memo_mark;
pitiot's avatar
maj  
pitiot committed
122
	// ajout moving obst
123 124
	void addObstAsNeighbor (Obstacle *  o, const std::vector<Dart>& belonging_cells, std::vector<Dart> * nieghbor_cells);
	// void addMovingObstAsNeighbor (MovingObstacle *  mo,std::vector<Dart> belonging_cells, std::vector<Dart> *neighbor_cells);
pitiot's avatar
maj  
pitiot committed
125 126
	void pushObstNeighborInCells(Obstacle* o, Dart d);
	void popObstNeighborInCells(Obstacle* o, Dart d);
127
	void find_next(Obstacle* o,Dart * d, CellMarkerMemo<FACE>& cms);
pitiot's avatar
maj  
pitiot committed
128

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
#ifdef EXPORTING3
	std::vector<PFP::MAP *> m_map_Export;
	std::vector<Algo::Surface::Import::OBJModel<PFP2> *> m_obj_Export;

	std::vector<Utils::Texture<2,Geom::Vec3uc>*> m_texture_Export;
	std::vector<Utils::VBO*> m_positionVBO_Export;
	std::vector<Utils::VBO*> m_normalVBO_Export;
	std::vector<Utils::VBO*> m_texcoordVBO_Export;
	std::vector<ShaderCustomTex*> m_shaderTex_Export;

	std::vector<unsigned int> m_nbIndice_Export;

//	PFP2::MAP m_map_Export;
//	VertexAttribute<VEC3> position_Export ;
//	VertexAttribute<VEC3> normal_Export ;
//	Algo::Surface::Import::OBJModel<PFP2> * m_obj_Export;
//
//	Utils::Texture<2,Geom::Vec3uc>* m_texture_Export;
//	Utils::VBO* m_positionVBO_Export;
//	Utils::VBO* m_normalVBO_Export;
//	Utils::VBO* m_texcoordVBO_Export;
//	ShaderCustomTex* m_shaderTex_Export;
//
//	unsigned int m_nbIndice_Export;
#endif

155

David Cazier's avatar
David Cazier committed
156
	std::vector<Dart> newBuildings ;
157

Pierre Kraemer's avatar
Pierre Kraemer committed
158
#ifndef SPATIAL_HASHING
pitiot's avatar
maj  
pitiot committed
159 160 161 162 163
	FaceAttribute<PFP::BOOLATTRIB> subdivisableFace ;

	PFP::TAB_AGENTVECT agentvect ;
	PFP::TAB_AGENTVECT neighborAgentvect ;
	PFP::TAB_OBSTACLEVECT neighborObstvect;
Pierre Kraemer's avatar
Pierre Kraemer committed
164
#endif
Pierre Kraemer's avatar
Pierre Kraemer committed
165

David Cazier's avatar
David Cazier committed
166
	PFP::TAB_OBSTACLEVECT obstvect ;
Pierre Kraemer's avatar
Pierre Kraemer committed
167 168


Pierre Kraemer's avatar
Pierre Kraemer committed
169
#ifndef SPATIAL_HASHING
170
	static const unsigned int nbAgentsToSubdivide = 5 ;
Jund Thomas's avatar
Jund Thomas committed
171
	static const unsigned int nbAgentsToSimplify = 4 ;
David Cazier's avatar
David Cazier committed
172

pitiot's avatar
maj  
pitiot committed
173 174
	CellMarker<FACE> refineMark ;
	CellMarker<FACE> coarsenMark ;
175 176
	std::vector<Dart> refineCandidate ;
	std::vector<Dart> coarsenCandidate ;
Pierre Kraemer's avatar
Pierre Kraemer committed
177

178
	void clearUpdateCandidates() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
179 180 181
#endif

#ifdef SPATIAL_HASHING
David Cazier's avatar
David Cazier committed
182 183 184 185 186 187 188 189 190
	unsigned int agentGridSize(unsigned int i)
	{
		return geometry.size(i) / minCellSize ;
	}

	unsigned int obstacleGridSize(unsigned int i)
	{
		return geometry.size(i) / obstacleDistance ;
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
191

pitiot's avatar
maj  
pitiot committed
192
	Geom::Vec2ui agentPositionCell(Agent* a) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
193

pitiot's avatar
maj  
pitiot committed
194
	Geom::Vec2ui obstaclePositionCell(VEC3 pos)
Pierre Kraemer's avatar
Pierre Kraemer committed
195
	{
David Cazier's avatar
David Cazier committed
196 197
		VEC3 relativePos = pos - geometry.min() ;
		relativePos /= obstacleDistance ;
198
		return Geom::Vec2ui(relativePos[0], relativePos[1]) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
199 200
	}

pitiot's avatar
maj  
pitiot committed
201 202 203 204 205
	const std::vector<Agent*>& getNeighbors(Geom::Vec2ui c) {
		assert(ht_agents.hasData(c)) ;
		return ht_agents[c];
	}
	const std::vector<Agent*>& getNeighbors(Agent* a) ;
David Cazier's avatar
David Cazier committed
206
	const std::vector<Agent*>& getNeighborAgents(Agent* a) ;
pitiot's avatar
maj  
pitiot committed
207 208 209 210 211 212 213

	void addAgentInGrid(Agent* a) ;
	void addAgentInGrid(Agent* a, Geom::Vec2ui c) ;

	void removeAgentFromGrid(Agent* a) ;
	void removeAgentFromGrid(Agent* a, Geom::Vec2ui c) ;

Pierre Kraemer's avatar
Pierre Kraemer committed
214
	HashTable2D< std::vector<Agent*> > ht_agents ;
David Cazier's avatar
David Cazier committed
215
	HashTable2D< std::vector<Agent*> > ht_neighbor_agents ;
Pierre Kraemer's avatar
Pierre Kraemer committed
216 217
	HashTable2D< std::vector<Obstacle*> > ht_obstacles ;
#endif
218
} ;
Pierre Kraemer's avatar
Pierre Kraemer committed
219

pitiot's avatar
maj  
pitiot committed
220 221
void update_registration(Obstacle * o);
void register_pop(Obstacle* o, int n);
222 223 224
void resetPartSubdiv(Obstacle* o);
void resetObstPartInFace(Obstacle* o, Dart d);// empeche de viser une dart ayant disparu
void resetPart(MovingObstacle * mo, Dart d); // empeche de viser une dart ayant disparu pour les voisins
pitiot's avatar
maj  
pitiot committed
225 226
void displayMO(Obstacle * o);

Pierre Kraemer's avatar
Pierre Kraemer committed
227
/**************************************
David Cazier's avatar
David Cazier committed
228 229
 *           INLINE FUNCTIONS          *
 **************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
230

231 232 233 234 235 236 237
template <typename T>
inline void addElementToVector(std::vector<T>& a, T ag)
{
	assert(std::find(a.begin(), a.end(), ag) == a.end());
	a.push_back(ag) ;
}

David Cazier's avatar
David Cazier committed
238
template <typename T>
pitiot's avatar
maj  
pitiot committed
239
inline bool removeElementFromVector(std::vector<T>& a, T ag)
Pierre Kraemer's avatar
Pierre Kraemer committed
240
{
241 242
	assert(std::find(a.begin(), a.end(), ag) != a.end());

243
	typename std::vector<T>::iterator end = a.template end() ;
David Cazier's avatar
David Cazier committed
244 245 246 247
	for (typename std::vector<T>::iterator it = a.begin(); it != end; ++it)
	{
		if (*it == ag)
		{
248 249
			*it = a.back() ;
			a.pop_back() ;
pitiot's avatar
maj  
pitiot committed
250
			return true ;
Pierre Kraemer's avatar
Pierre Kraemer committed
251 252
		}
	}
pitiot's avatar
maj  
pitiot committed
253
	return false ;
Pierre Kraemer's avatar
Pierre Kraemer committed
254 255 256
}

#ifndef SPATIAL_HASHING
David Cazier's avatar
David Cazier committed
257 258
inline unsigned int EnvMap::totalNeighborSize(Dart d)
{
259 260 261 262
	return agentvect[d].size() + neighborAgentvect[d].size() ;
}

inline void EnvMap::nbAgentsIncrease(Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
263
{
264 265
	if (refineMark.isMarked(d)) return ;
	if (totalNeighborSize(d) < nbAgentsToSubdivide) return ;
Pierre Kraemer's avatar
Pierre Kraemer committed
266

267
	std::pair<bool, bool>& sf = subdivisableFace[d] ;
David Cazier's avatar
David Cazier committed
268 269
	if (sf.first == false || (sf.first == true && sf.second))
	{
270 271 272
		refineMark.mark(d) ;
		refineCandidate.push_back(d) ;
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
273 274
}

275
inline void EnvMap::nbAgentsDecrease(Dart d)
Thomas's avatar
Thomas committed
276
{
277 278
	if (coarsenMark.isMarked(d) || refineMark.isMarked(d)) return ;
	if (totalNeighborSize(d) > nbAgentsToSimplify) return ;
Thomas's avatar
Thomas committed
279

280 281 282
	coarsenMark.mark(d) ;
	coarsenCandidate.push_back(map.faceOldestDart(d)) ;
}
Pierre Kraemer's avatar
Pierre Kraemer committed
283 284

inline void EnvMap::pushAgentInCells(Agent* agent, Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
285
{
David Cazier's avatar
David Cazier committed
286
	assert(map.getCurrentLevel() == map.getMaxLevel()) ;
pitiot's avatar
maj  
pitiot committed
287
//	assert(std::find(agentvect[d].begin(), agentvect[d].end(), agent) == agentvect[d].end());
David Cazier's avatar
David Cazier committed
288

289 290
	addElementToVector<Agent*>(agentvect[d],agent);
//	agentvect[d].push_back(agent) ;
291
//	nbAgentsIncrease(d);
David Cazier's avatar
David Cazier committed
292 293

	Dart dd = d ;
David Cazier's avatar
David Cazier committed
294 295
	do
	{
David Cazier's avatar
David Cazier committed
296
		Dart ddd = map.alpha1(map.alpha1(dd)) ;
David Cazier's avatar
David Cazier committed
297 298
		while (ddd != dd)
		{
299 300
			addElementToVector<Agent*>(neighborAgentvect[ddd],agent);
//			neighborAgentvect[ddd].push_back(agent) ;
301
//			nbAgentsIncrease(ddd);
David Cazier's avatar
David Cazier committed
302
			ddd = map.alpha1(ddd) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
303
		}
David Cazier's avatar
David Cazier committed
304 305
		dd = map.phi1(dd) ;
	} while (dd != d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
306 307
}

Thomas's avatar
Thomas committed
308 309
inline void EnvMap::popAgentInCells(Agent* agent, Dart d)
{
David Cazier's avatar
David Cazier committed
310 311 312
	assert(map.getCurrentLevel() == map.getMaxLevel()) ;

	removeElementFromVector<Agent*>(agentvect[d], agent) ;
Thomas Jund's avatar
Thomas Jund committed
313

314
//	nbAgentsDecrease(d) ;
David Cazier's avatar
David Cazier committed
315 316

	Dart dd = d ;
David Cazier's avatar
David Cazier committed
317 318
	do
	{
David Cazier's avatar
David Cazier committed
319
		Dart ddd = map.alpha1(map.alpha1(dd)) ;
David Cazier's avatar
David Cazier committed
320 321
		while (ddd != dd)
		{
David Cazier's avatar
David Cazier committed
322
			removeElementFromVector<Agent*>(neighborAgentvect[ddd], agent) ;
323
//			nbAgentsDecrease(ddd) ;
David Cazier's avatar
David Cazier committed
324
			ddd = map.alpha1(ddd) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
325
		}
David Cazier's avatar
David Cazier committed
326 327
		dd = map.phi1(dd) ;
	} while (dd != d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
328 329
}

pitiot's avatar
maj  
pitiot committed
330 331 332

//ajout moving obst///////////////////////////////////////////////////////////////////////////////////////////////////////

333

334
inline void EnvMap::addObstAsNeighbor (Obstacle *  o, const std::vector<Dart>& belonging_cells, std::vector<Dart> *neighbor_cells)
pitiot's avatar
maj  
pitiot committed
335 336
{
	assert(map.getCurrentLevel() == map.getMaxLevel());
337
	assert(!belonging_cells.empty());
pitiot's avatar
maj  
pitiot committed
338
	neighbor_cells->clear();
339 340
	CellMarkerMemo<FACE> memo_mark(map);
	CellMarkerMemo<FACE> OneRingMark(map);
pitiot's avatar
maj  
pitiot committed
341

342 343
	for (std::vector<Dart>::const_iterator it =belonging_cells.begin();it<belonging_cells.end();++it)
		memo_mark.mark(*it);
pitiot's avatar
maj  
pitiot committed
344

345
	std::vector<Dart>::const_iterator it=belonging_cells.begin();
pitiot's avatar
maj  
pitiot committed
346 347 348 349
	Dart beg = NIL;
	Dart first =NIL;
	Dart d=NIL;
	Dart dd=NIL;
350
//	CGoGNout<<"beg : "<<(*it)<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
351 352 353 354 355 356 357 358 359
	//boucle pour trouver une face du voisinage de l'obstacle ne contenant pas l'obstacle
	do
	{
		beg = *it;
		first = NIL;
		d=beg;
		do {
			dd=map.alpha1(map.alpha1(d));
			do {
360
				if (!memo_mark.isMarked(dd))
pitiot's avatar
maj  
pitiot committed
361 362 363 364 365 366 367 368 369 370 371
				{
					first = dd;
				}
				dd=map.alpha1(dd);
			}while (first==NIL && dd!=d);

			d=map.phi1(d);

		} while(first==NIL && d!=beg);
		++it;
	}while(first==NIL && it!=belonging_cells.end());
372
//	assert(!buildingMark.isMarked(d)) ;
373 374
	assert(first!=NIL) ;
//	CGoGNout<<"first : "<<first<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
375 376 377 378 379 380 381 382 383
	d=first;
	do
	{
		if (!OneRingMark.isMarked(d))
		{
			OneRingMark.mark(d);
			(*neighbor_cells).push_back(d);
		}

384
		find_next(o,&d, memo_mark);
385 386 387 388 389 390 391 392 393 394
		if(d==NIL)
		{
			CGoGNout<<"cellule de début : "<<first<<CGoGNendl;
			CGoGNout<<"cellules markées OneRing : "<<CGoGNendl;
			std::vector<Dart> v=OneRingMark.get_markedCells();
			for(std::vector<Dart>::iterator it=v.begin();it<v.end();++it)
			{
				CGoGNout<<(*it).index<<CGoGNendl;
			}
		}
395
//		CGoGNout<<"d : "<<d<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
396 397 398 399 400
	}while(!map.sameFace(d,first));
}

// find_next cherche la prochaine case "voisine" d'un obstacle faisant parti d'un movingobstacle (algo de parcours du one-ring )

401
inline void EnvMap::find_next(Obstacle* o,Dart * ddd, CellMarkerMemo<FACE>& cms)
pitiot's avatar
maj  
pitiot committed
402 403 404 405 406 407 408 409 410 411 412 413 414 415
{
	Dart d=*ddd;
	Dart first = NIL;
	Dart dd;
	int rd =0;
	do{
		rd++;
		dd=map.alpha1((d));

		if (!(cms.isMarked(dd)))
		{
			first = dd;
		}

416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437

		if(rd>100)
		{
			if (rd>10000)
			{
				displayMO(o);
				CGoGNout <<(first==NIL)<< " infini find next d : "<< d<<"phi 2 markée ? : "<<cms.isMarked(map.phi2(d))<<CGoGNendl;
				CGoGNout<<"cellules markées : "<<CGoGNendl;
				std::vector<Dart> v=cms.get_markedCells();
				for(std::vector<Dart>::iterator it=v.begin();it<v.end();++it)
				{
					CGoGNout<<(*it).index<<CGoGNendl;
				}
				break;
			}
			CGoGNout <<(first==NIL)<< " infini find next d : "<< d<<"phi 2 markée ? : "<<cms.isMarked(map.phi2(d))<<CGoGNendl;
			CGoGNout<<"cellules markées : "<<CGoGNendl;
							std::vector<Dart> v=cms.get_markedCells();
							for(std::vector<Dart>::iterator it=v.begin();it<v.end();++it)
							{
								CGoGNout<<(*it).index<<CGoGNendl;
							}
pitiot's avatar
maj  
pitiot committed
438
		}
439
		d=map.phi_1(d);
pitiot's avatar
maj  
pitiot committed
440 441 442 443 444 445 446
	}while(first==NIL);
	*ddd=first;
}

inline void EnvMap::pushObstNeighborInCells(Obstacle* o, Dart d)
{
	assert(map.getCurrentLevel() == map.getMaxLevel());
pitiot's avatar
merging  
pitiot committed
447
	assert(std::find(neighborObstvect[d].begin(), neighborObstvect[d].end(), o) == neighborObstvect[d].end());
pitiot's avatar
maj  
pitiot committed
448

449
	addElementToVector<Obstacle*>(neighborObstvect[d],o);
pitiot's avatar
maj  
pitiot committed
450 451
}

452 453 454 455
//inline void EnvMap::pushObstacleInCell(Obstacle* o, Dart d)
//{
//	assert(map.getCurrentLevel() == map.getMaxLevel()) ;
//	assert(!buildingMark.isMarked(d)) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
456
//
457 458
//	addElementToVector<Obstacle*>(obstvect[d],o);
//}
459

Pierre Kraemer's avatar
Pierre Kraemer committed
460 461
inline void EnvMap::clearUpdateCandidates()
{
David Cazier's avatar
David Cazier committed
462 463
	refineCandidate.clear() ;
	coarsenCandidate.clear() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
464
}
pitiot's avatar
maj  
pitiot committed
465 466
///addMovingObstAsNeighbor est pour détecter les voisins du movingobstacle global afin de le considerer comme un super agent

Pierre Kraemer's avatar
Pierre Kraemer committed
467
#endif
Pierre Kraemer's avatar
Pierre Kraemer committed
468 469

#endif