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
pitiot committed
35
//#define EXPORTING3
pitiot's avatar
merging    
pitiot committed
36

Thomas Jund's avatar
Thomas Jund committed
37
#define TWO_AND_HALF_DIM
38
39
40
41
42
43
44
45
46


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

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

67
68
69
	void initGL();
	void draw();

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

David Cazier's avatar
David Cazier committed
75
	unsigned int mapMemoryCost() ;
Thomas's avatar
Thomas committed
76

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

81
82
	void subdivideAllToMaxLevel() ;
	void subdivideToProperLevel() ;
Thomas's avatar
Thomas committed
83

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

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

90
	void setAgentNeighborsAndObstacles(Agent* agent) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
91

92
93
94
95
96
97
	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
98

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

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

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

David Cazier's avatar
David Cazier committed
114
115
	PFP::TVEC3 position ;
	PFP::TVEC3 normal ;
Pierre Kraemer's avatar
Pierre Kraemer committed
116

117
118
	Geom::BoundingBox<PFP::VEC3> bb;

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

161

David Cazier's avatar
David Cazier committed
162
	std::vector<Dart> newBuildings ;
163

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

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

David Cazier's avatar
David Cazier committed
172
	PFP::TAB_OBSTACLEVECT obstvect ;
Pierre Kraemer's avatar
Pierre Kraemer committed
173
174


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

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

184
	void clearUpdateCandidates() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
185
186
187
#endif

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

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

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

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

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

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

Pierre Kraemer's avatar
Pierre Kraemer committed
234
/**************************************
David Cazier's avatar
David Cazier committed
235
236
 *           INLINE FUNCTIONS          *
 **************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
237

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

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

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

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

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

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

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

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

pitiot's avatar
pitiot committed
297
298
299
300
301
302
303
304
305
//	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
306

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

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

320
//			neighborAgentvect[ddd].push_back(agent) ;
321
//			nbAgentsIncrease(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
}

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

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

334
//	nbAgentsDecrease(d) ;
David Cazier's avatar
David Cazier committed
335
336

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

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

pitiot's avatar
pitiot committed
351
352
353
354
355
356
357
358
359
//	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
360
361
}

pitiot's avatar
maj    
pitiot committed
362
363
364

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

365

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

374
375
	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
376

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

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

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

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

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

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

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

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

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

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

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

#endif