env_map.h 13.4 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
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);
David Cazier's avatar
David Cazier committed
70
	void markPedWay() ;
Thomas's avatar
Thomas committed
71

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

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

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

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

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

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

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

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

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

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

David Cazier's avatar
David Cazier committed
110
111
	PFP::TVEC3 position ;
	PFP::TVEC3 normal ;
Pierre Kraemer's avatar
Pierre Kraemer committed
112

113
114
	Geom::BoundingBox<PFP::VEC3> bb;

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

157

David Cazier's avatar
David Cazier committed
158
	std::vector<Dart> newBuildings ;
159

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

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

David Cazier's avatar
David Cazier committed
168
	PFP::TAB_OBSTACLEVECT obstvect ;
Pierre Kraemer's avatar
Pierre Kraemer committed
169
170


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

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

180
	void clearUpdateCandidates() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
181
182
183
#endif

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

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

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

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

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

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

Pierre Kraemer's avatar
Pierre Kraemer committed
230
/**************************************
David Cazier's avatar
David Cazier committed
231
232
 *           INLINE FUNCTIONS          *
 **************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
233

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

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

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

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

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

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

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

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

pitiot's avatar
pitiot committed
293
294
295
296
297
298
299
300
301
//	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
302

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

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

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

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

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

330
//	nbAgentsDecrease(d) ;
David Cazier's avatar
David Cazier committed
331
332

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

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

pitiot's avatar
pitiot committed
347
348
349
350
351
352
353
354
355
//	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
356
357
}

pitiot's avatar
maj    
pitiot committed
358
359
360

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

361

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

370
371
	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
372

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

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

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

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

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

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

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

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

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

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

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

#endif