Création d'un compte pour un collaborateur extérieur au laboratoire depuis l'intranet ICube : https://intranet.icube.unistra.fr/fr/labs/member/profile

env_map.h 13.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
Arash HABIBI's avatar
Arash HABIBI 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
69
	void scale(float val);

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) ;
Thomas's avatar
Thomas committed
76

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

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

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

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

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

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

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

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

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

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

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

156

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

328
//	nbAgentsDecrease(d) ;
David Cazier's avatar
David Cazier committed
329
330

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

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

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

pitiot's avatar
maj    
pitiot committed
356
357
358

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

359

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

368
369
	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
370

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

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

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

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

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

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

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

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

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

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

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

#endif