env_map.h 13.5 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

pitiot's avatar
merging  
pitiot committed
35
#define EXPORTING3
pitiot's avatar
pitiot committed
36
#define TWO_AND_HALF_DIM
37 38 39 40 41 42 43 44

#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
45 46
class EnvMap
{
47 48
public:
	PFP::MAP map ;
49

50 51 52 53 54 55 56 57 58 59 60 61
	/* 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
62
	EnvMap() ;
63
	void init(unsigned int config, REAL width, REAL height, REAL minSize, REAL maxSize) ;
64

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

68
	void scale(float val);
pitiot's avatar
up  
pitiot committed
69
	bool is_insideConvexCell2D(VEC3 p, Dart d);
pitiot's avatar
up  
pitiot committed
70
	bool isInsideFace3D(VEC3 p, Dart d);
David Cazier's avatar
David Cazier committed
71
	void markPedWay() ;
Thomas's avatar
Thomas committed
72

David Cazier's avatar
David Cazier committed
73
	unsigned int mapMemoryCost() ;
Thomas's avatar
Thomas committed
74

Pierre Kraemer's avatar
Pierre Kraemer committed
75
#ifndef SPATIAL_HASHING
76
	Dart getBelongingCell(const VEC3& pos) ;
77
	Dart getBelongingCellOnSurface(const VEC3& pos) ;
Thomas's avatar
Thomas committed
78

79 80
	void subdivideAllToMaxLevel() ;
	void subdivideToProperLevel() ;
Thomas's avatar
Thomas committed
81

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

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

88
	void setAgentNeighborsAndObstacles(Agent* agent) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
89

90 91 92 93 94 95
	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
96

Thomas Jund's avatar
Thomas Jund committed
97
	Dart popAndPushObstacleInCells(Obstacle* o, int n);
98 99 100 101 102
	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);

103
	void popObstacleInCells(Obstacle* o, Dart d) ;
104 105
	void refine() ;
	void coarse() ;
106
	void updateMap() ;
pitiot's avatar
pitiot committed
107
	int testOrientation(VEC3 p, VEC3 p1, VEC3 p2, Dart d);
108

109
	void resetAgentInFace(Agent* agent) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
110 111
#endif

David Cazier's avatar
David Cazier committed
112 113
	PFP::TVEC3 position ;
	PFP::TVEC3 normal ;
Pierre Kraemer's avatar
Pierre Kraemer committed
114

115 116
	Geom::BoundingBox<PFP::VEC3> bb;

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

133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
#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

159

David Cazier's avatar
David Cazier committed
160
	std::vector<Dart> newBuildings ;
161

Pierre Kraemer's avatar
Pierre Kraemer committed
162
#ifndef SPATIAL_HASHING
pitiot's avatar
maj  
pitiot committed
163 164 165 166 167
	FaceAttribute<PFP::BOOLATTRIB> subdivisableFace ;

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

David Cazier's avatar
David Cazier committed
170
	PFP::TAB_OBSTACLEVECT obstvect ;
Pierre Kraemer's avatar
Pierre Kraemer committed
171 172


Pierre Kraemer's avatar
Pierre Kraemer committed
173
#ifndef SPATIAL_HASHING
174
	static const unsigned int nbAgentsToSubdivide = 5 ;
Jund Thomas's avatar
Jund Thomas committed
175
	static const unsigned int nbAgentsToSimplify = 4 ;
David Cazier's avatar
David Cazier committed
176

pitiot's avatar
maj  
pitiot committed
177 178
	CellMarker<FACE> refineMark ;
	CellMarker<FACE> coarsenMark ;
179 180
	std::vector<Dart> refineCandidate ;
	std::vector<Dart> coarsenCandidate ;
Pierre Kraemer's avatar
Pierre Kraemer committed
181

182
	void clearUpdateCandidates() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
183 184 185
#endif

#ifdef SPATIAL_HASHING
David Cazier's avatar
David Cazier committed
186 187 188 189 190 191 192 193 194
	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
195

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

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

pitiot's avatar
maj  
pitiot committed
205 206 207 208 209
	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
210
	const std::vector<Agent*>& getNeighborAgents(Agent* a) ;
pitiot's avatar
maj  
pitiot committed
211 212 213 214 215 216 217

	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
218
	HashTable2D< std::vector<Agent*> > ht_agents ;
David Cazier's avatar
David Cazier committed
219
	HashTable2D< std::vector<Agent*> > ht_neighbor_agents ;
Pierre Kraemer's avatar
Pierre Kraemer committed
220 221
	HashTable2D< std::vector<Obstacle*> > ht_obstacles ;
#endif
222
} ;
Pierre Kraemer's avatar
Pierre Kraemer committed
223

pitiot's avatar
maj  
pitiot committed
224 225
void update_registration(Obstacle * o);
void register_pop(Obstacle* o, int n);
226
void resetPartSubdiv(Obstacle* o);
pitiot's avatar
up  
pitiot committed
227
//void resetObstPartInFace(Obstacle* o, Dart d, unsigned int fLevel);// empeche de viser une dart ayant disparu
228
void resetObstPartInFace(Obstacle* o, Dart d);// empeche de viser une dart ayant disparu
pitiot's avatar
pitiot committed
229
void resetPart(Obstacle * mo, Dart d); // empeche de viser une dart ayant disparu pour les voisins
pitiot's avatar
maj  
pitiot committed
230 231
void displayMO(Obstacle * o);

Pierre Kraemer's avatar
Pierre Kraemer committed
232
/**************************************
David Cazier's avatar
David Cazier committed
233 234
 *           INLINE FUNCTIONS          *
 **************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
235

236 237 238 239 240 241 242
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
243
template <typename T>
pitiot's avatar
maj  
pitiot committed
244
inline bool removeElementFromVector(std::vector<T>& a, T ag)
Pierre Kraemer's avatar
Pierre Kraemer committed
245
{
246 247
	assert(std::find(a.begin(), a.end(), ag) != a.end());

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

#ifndef SPATIAL_HASHING
David Cazier's avatar
David Cazier committed
262 263
inline unsigned int EnvMap::totalNeighborSize(Dart d)
{
264 265 266 267
	return agentvect[d].size() + neighborAgentvect[d].size() ;
}

inline void EnvMap::nbAgentsIncrease(Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
268
{
269 270
	if (refineMark.isMarked(d)) return ;
	if (totalNeighborSize(d) < nbAgentsToSubdivide) return ;
Pierre Kraemer's avatar
Pierre Kraemer committed
271

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

280
inline void EnvMap::nbAgentsDecrease(Dart d)
Thomas's avatar
Thomas committed
281
{
282 283
	if (coarsenMark.isMarked(d) || refineMark.isMarked(d)) return ;
	if (totalNeighborSize(d) > nbAgentsToSimplify) return ;
Thomas's avatar
Thomas committed
284

285 286 287
	coarsenMark.mark(d) ;
	coarsenCandidate.push_back(map.faceOldestDart(d)) ;
}
Pierre Kraemer's avatar
Pierre Kraemer committed
288 289

inline void EnvMap::pushAgentInCells(Agent* agent, Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
290
{
David Cazier's avatar
David Cazier committed
291
	assert(map.getCurrentLevel() == map.getMaxLevel()) ;
pitiot's avatar
maj  
pitiot committed
292
//	assert(std::find(agentvect[d].begin(), agentvect[d].end(), agent) == agentvect[d].end());
pitiot's avatar
pitiot committed
293
//	map.check();
David Cazier's avatar
David Cazier committed
294

pitiot's avatar
pitiot committed
295 296 297 298 299 300 301 302 303
//	TraversorF<PFP::MAP> tF(map);
//		for(Dart ddd = tF.begin() ; ddd != tF.end() ; ddd = tF.next())
//		{
//			if(std::find(agentvect[ddd].begin(), agentvect[ddd].end(), agent) != agentvect[ddd].end())
//				std::cout <<agent << "   SO WRONG ADD" <<ddd.index<< std::endl;
//
//			if(std::find(neighborAgentvect[ddd].begin(), neighborAgentvect[ddd].end(), agent) != neighborAgentvect[ddd].end())
//				std::cout <<agent<< "   SO SO WRONG  ADD" <<ddd.index<< std::endl;
//		}
David Cazier's avatar
David Cazier committed
304

305 306
	addElementToVector<Agent*>(agentvect[d],agent);
//	agentvect[d].push_back(agent) ;
307
//	nbAgentsIncrease(d);
David Cazier's avatar
David Cazier committed
308 309

	Dart dd = d ;
David Cazier's avatar
David Cazier committed
310 311
	do
	{
David Cazier's avatar
David Cazier committed
312
		Dart ddd = map.alpha1(map.alpha1(dd)) ;
David Cazier's avatar
David Cazier committed
313 314
		while (ddd != dd)
		{
pitiot's avatar
pitiot committed
315 316 317
			if (!map.isBoundaryMarked2(ddd))
				addElementToVector<Agent*>(neighborAgentvect[ddd],agent);

318
//			neighborAgentvect[ddd].push_back(agent) ;
319
//			nbAgentsIncrease(ddd);
David Cazier's avatar
David Cazier committed
320
			ddd = map.alpha1(ddd) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
321
		}
David Cazier's avatar
David Cazier committed
322 323
		dd = map.phi1(dd) ;
	} while (dd != d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
324 325
}

Thomas's avatar
Thomas committed
326 327
inline void EnvMap::popAgentInCells(Agent* agent, Dart d)
{
David Cazier's avatar
David Cazier committed
328 329 330
	assert(map.getCurrentLevel() == map.getMaxLevel()) ;

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

332
//	nbAgentsDecrease(d) ;
David Cazier's avatar
David Cazier committed
333 334

	Dart dd = d ;
David Cazier's avatar
David Cazier committed
335 336
	do
	{
David Cazier's avatar
David Cazier committed
337
		Dart ddd = map.alpha1(map.alpha1(dd)) ;
David Cazier's avatar
David Cazier committed
338 339
		while (ddd != dd)
		{
pitiot's avatar
pitiot committed
340 341
			if (!map.isBoundaryMarked2(ddd))
				removeElementFromVector<Agent*>(neighborAgentvect[ddd], agent) ;
Thomas Jund's avatar
Thomas Jund committed
342

343
//			nbAgentsDecrease(ddd) ;
David Cazier's avatar
David Cazier committed
344
			ddd = map.alpha1(ddd) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
345
		}
David Cazier's avatar
David Cazier committed
346 347
		dd = map.phi1(dd) ;
	} while (dd != d) ;
pitiot's avatar
pitiot committed
348

pitiot's avatar
pitiot committed
349 350 351 352 353 354 355 356 357
//	TraversorF<PFP::MAP> tF(map);
//		for(Dart ddd = tF.begin() ; ddd != tF.end() ; ddd = tF.next())
//		{
//			if(std::find(agentvect[ddd].begin(), agentvect[ddd].end(), agent) != agentvect[ddd].end())
//				std::cout <<agent << "   SO WRONG" <<ddd.index<< std::endl;
//
//			if(std::find(neighborAgentvect[ddd].begin(), neighborAgentvect[ddd].end(), agent) != neighborAgentvect[ddd].end())
//				std::cout <<agent<< "   SO SO WRONG " <<ddd.index<< std::endl;
//		}
Pierre Kraemer's avatar
Pierre Kraemer committed
358 359
}

pitiot's avatar
maj  
pitiot committed
360 361 362

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

363

364
inline void EnvMap::addObstAsNeighbor (Obstacle *  o, const std::vector<Dart>& belonging_cells, std::vector<Dart> *neighbor_cells)
pitiot's avatar
maj  
pitiot committed
365 366
{
	assert(map.getCurrentLevel() == map.getMaxLevel());
367
	assert(!belonging_cells.empty());
pitiot's avatar
maj  
pitiot committed
368
	neighbor_cells->clear();
369 370
	CellMarkerMemo<FACE> memo_mark(map);
	CellMarkerMemo<FACE> OneRingMark(map);
Thomas Jund's avatar
Thomas Jund committed
371

372 373
	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
374

375
	std::vector<Dart>::const_iterator it=belonging_cells.begin();
pitiot's avatar
maj  
pitiot committed
376 377 378 379
	Dart beg = NIL;
	Dart first =NIL;
	Dart d=NIL;
	Dart dd=NIL;
pitiot's avatar
pitiot committed
380 381 382 383 384 385 386

	/////////////////////////////////////////////boucle pour trouver une face du voisinage de l'obstacle ne contenant pas l'obstacle
//	CGoGNout<<"debut neighbors cellules : ";
//	for (std::vector<Dart>::const_iterator it =belonging_cells.begin();it<belonging_cells.end();++it)
//		CGoGNout<<(*it).index<<" ; ";
//	CGoGNout<<CGoGNendl;

pitiot's avatar
maj  
pitiot committed
387 388 389 390 391 392 393 394
	do
	{
		beg = *it;
		first = NIL;
		d=beg;
		do {
			dd=map.alpha1(map.alpha1(d));
			do {
395
				if (!memo_mark.isMarked(dd))
pitiot's avatar
maj  
pitiot committed
396 397 398 399 400 401 402 403 404 405 406
				{
					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());
407
//	assert(!buildingMark.isMarked(d)) ;
408 409
	assert(first!=NIL) ;
//	CGoGNout<<"first : "<<first<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
410 411 412 413 414 415 416 417 418
	d=first;
	do
	{
		if (!OneRingMark.isMarked(d))
		{
			OneRingMark.mark(d);
			(*neighbor_cells).push_back(d);
		}

419
		find_next(o,&d, memo_mark);
420
//		CGoGNout<<"d : "<<d<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
421 422 423 424 425
	}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 )

426
inline void EnvMap::find_next(Obstacle* o,Dart * ddd, CellMarkerMemo<FACE>& cms)
pitiot's avatar
maj  
pitiot committed
427 428 429 430 431 432 433 434 435 436 437 438 439 440
{
	Dart d=*ddd;
	Dart first = NIL;
	Dart dd;
	int rd =0;
	do{
		rd++;
		dd=map.alpha1((d));

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

441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462

		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
463
		}
464
		d=map.phi_1(d);
pitiot's avatar
maj  
pitiot committed
465 466 467 468 469 470 471
	}while(first==NIL);
	*ddd=first;
}

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

474
	addElementToVector<Obstacle*>(neighborObstvect[d],o);
pitiot's avatar
maj  
pitiot committed
475 476
}

477 478 479 480
//inline void EnvMap::pushObstacleInCell(Obstacle* o, Dart d)
//{
//	assert(map.getCurrentLevel() == map.getMaxLevel()) ;
//	assert(!buildingMark.isMarked(d)) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
481
//
482 483
//	addElementToVector<Obstacle*>(obstvect[d],o);
//}
484

Pierre Kraemer's avatar
Pierre Kraemer committed
485 486
inline void EnvMap::clearUpdateCandidates()
{
David Cazier's avatar
David Cazier committed
487 488
	refineCandidate.clear() ;
	coarsenCandidate.clear() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
489
}
pitiot's avatar
maj  
pitiot committed
490 491
///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
492
#endif
Pierre Kraemer's avatar
Pierre Kraemer committed
493 494

#endif