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 36 37 38 39 40 41 42 43
//#define EXPORTING3

#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

David Cazier's avatar
David Cazier committed
111 112 113
	PFP::MAP mapScenary ;
	PFP::TVEC3 positionScenary ;
	PFP::TVEC3 normalScenary ;
pitiot's avatar
maj  
pitiot committed
114 115 116 117 118
	CellMarker<EDGE> obstacleMarkS ;
	CellMarker<FACE> buildingMarkS ;
	CellMarker<EDGE> obstacleMark ;
	CellMarker<FACE> buildingMark ;
	CellMarker<FACE> pedWayMark ;
119
//	CellMarkerMemo<FACE> memo_mark;
pitiot's avatar
maj  
pitiot committed
120
	// ajout moving obst
121 122
	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
123 124
	void pushObstNeighborInCells(Obstacle* o, Dart d);
	void popObstNeighborInCells(Obstacle* o, Dart d);
125
	void find_next(Obstacle* o,Dart * d, CellMarkerMemo<FACE>& cms);
pitiot's avatar
maj  
pitiot committed
126

127 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
#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

153

David Cazier's avatar
David Cazier committed
154
	std::vector<Dart> newBuildings ;
155

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

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

David Cazier's avatar
David Cazier committed
164
	PFP::TAB_OBSTACLEVECT obstvect ;
Pierre Kraemer's avatar
Pierre Kraemer committed
165 166


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

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

176
	void clearUpdateCandidates() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
177 178 179
#endif

#ifdef SPATIAL_HASHING
David Cazier's avatar
David Cazier committed
180 181 182 183 184 185 186 187 188
	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
189

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

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

pitiot's avatar
maj  
pitiot committed
199 200 201 202 203
	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
204
	const std::vector<Agent*>& getNeighborAgents(Agent* a) ;
pitiot's avatar
maj  
pitiot committed
205 206 207 208 209 210 211

	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
212
	HashTable2D< std::vector<Agent*> > ht_agents ;
David Cazier's avatar
David Cazier committed
213
	HashTable2D< std::vector<Agent*> > ht_neighbor_agents ;
Pierre Kraemer's avatar
Pierre Kraemer committed
214 215
	HashTable2D< std::vector<Obstacle*> > ht_obstacles ;
#endif
216
} ;
Pierre Kraemer's avatar
Pierre Kraemer committed
217

pitiot's avatar
maj  
pitiot committed
218 219
void update_registration(Obstacle * o);
void register_pop(Obstacle* o, int n);
220 221 222
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
223 224
void displayMO(Obstacle * o);

Pierre Kraemer's avatar
Pierre Kraemer committed
225
/**************************************
David Cazier's avatar
David Cazier committed
226 227
 *           INLINE FUNCTIONS          *
 **************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
228

229 230 231 232 233 234 235
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
236
template <typename T>
pitiot's avatar
maj  
pitiot committed
237
inline bool removeElementFromVector(std::vector<T>& a, T ag)
Pierre Kraemer's avatar
Pierre Kraemer committed
238
{
239 240
	assert(std::find(a.begin(), a.end(), ag) != a.end());

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

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

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

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

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

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

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

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

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

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

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

312
//	nbAgentsDecrease(d) ;
David Cazier's avatar
David Cazier committed
313 314

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

pitiot's avatar
maj  
pitiot committed
328 329 330

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

331

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

340 341
	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
342

343
	std::vector<Dart>::const_iterator it=belonging_cells.begin();
pitiot's avatar
maj  
pitiot committed
344 345 346 347
	Dart beg = NIL;
	Dart first =NIL;
	Dart d=NIL;
	Dart dd=NIL;
348
//	CGoGNout<<"beg : "<<(*it)<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
349 350 351 352 353 354 355 356 357
	//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 {
358
				if (!memo_mark.isMarked(dd))
pitiot's avatar
maj  
pitiot committed
359 360 361 362 363 364 365 366 367 368 369
				{
					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());
370
//	assert(!buildingMark.isMarked(d)) ;
371 372
	assert(first!=NIL) ;
//	CGoGNout<<"first : "<<first<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
373 374 375 376 377 378 379 380 381
	d=first;
	do
	{
		if (!OneRingMark.isMarked(d))
		{
			OneRingMark.mark(d);
			(*neighbor_cells).push_back(d);
		}

382
		find_next(o,&d, memo_mark);
383 384 385 386 387 388 389 390 391 392
		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;
			}
		}
393
//		CGoGNout<<"d : "<<d<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
394 395 396 397 398
	}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 )

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

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

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

		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
436
		}
437
		d=map.phi_1(d);
pitiot's avatar
maj  
pitiot committed
438 439 440 441 442 443 444
	}while(first==NIL);
	*ddd=first;
}

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

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

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

Pierre Kraemer's avatar
Pierre Kraemer committed
458 459
inline void EnvMap::clearUpdateCandidates()
{
David Cazier's avatar
David Cazier committed
460 461
	refineCandidate.clear() ;
	coarsenCandidate.clear() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
462
}
pitiot's avatar
maj  
pitiot committed
463 464
///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
465
#endif
Pierre Kraemer's avatar
Pierre Kraemer committed
466 467

#endif