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

pitiot's avatar
pitiot 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
	/* 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 ;
Thomas Jund's avatar
Thomas Jund committed
63 64
	
	unsigned int config;
65

David Cazier's avatar
David Cazier committed
66
	EnvMap() ;
67
	void init(unsigned int config, REAL width, REAL height, REAL minSize, REAL maxSize) ;
68

69 70 71
	void initGL();
	void draw();

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

David Cazier's avatar
David Cazier committed
77
	unsigned int mapMemoryCost() ;
Thomas's avatar
Thomas committed
78

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

83 84
	void subdivideAllToMaxLevel() ;
	void subdivideToProperLevel() ;
Thomas's avatar
Thomas committed
85

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

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

92
	void setAgentNeighborsAndObstacles(Agent* agent) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
93

94 95 96 97 98 99
	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
100

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

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

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

David Cazier's avatar
David Cazier committed
116 117
	PFP::TVEC3 position ;
	PFP::TVEC3 normal ;
Pierre Kraemer's avatar
Pierre Kraemer committed
118

119 120
	Geom::BoundingBox<PFP::VEC3> bb;

David Cazier's avatar
David Cazier committed
121 122 123
	PFP::MAP mapScenary ;
	PFP::TVEC3 positionScenary ;
	PFP::TVEC3 normalScenary ;
pitiot's avatar
maj  
pitiot committed
124 125 126 127 128
	CellMarker<EDGE> obstacleMarkS ;
	CellMarker<FACE> buildingMarkS ;
	CellMarker<EDGE> obstacleMark ;
	CellMarker<FACE> buildingMark ;
	CellMarker<FACE> pedWayMark ;
129
//	CellMarkerMemo<FACE> memo_mark;
pitiot's avatar
maj  
pitiot committed
130
	// ajout moving obst
131 132
	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
133 134
	void pushObstNeighborInCells(Obstacle* o, Dart d);
	void popObstNeighborInCells(Obstacle* o, Dart d);
135
	void find_next(Obstacle* o,Dart * d, CellMarkerMemo<FACE>& cms);
pitiot's avatar
up  
pitiot committed
136
	bool movingObstacleFree(Dart d);
pitiot's avatar
ok  
pitiot committed
137
	bool movingObstacleNeighborFree(Dart d);
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
#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

164

David Cazier's avatar
David Cazier committed
165
	std::vector<Dart> newBuildings ;
166

Pierre Kraemer's avatar
Pierre Kraemer committed
167
#ifndef SPATIAL_HASHING
pitiot's avatar
maj  
pitiot committed
168 169 170 171 172
	FaceAttribute<PFP::BOOLATTRIB> subdivisableFace ;

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

David Cazier's avatar
David Cazier committed
175
	PFP::TAB_OBSTACLEVECT obstvect ;
Pierre Kraemer's avatar
Pierre Kraemer committed
176 177


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

pitiot's avatar
maj  
pitiot committed
182 183
	CellMarker<FACE> refineMark ;
	CellMarker<FACE> coarsenMark ;
184 185
	std::vector<Dart> refineCandidate ;
	std::vector<Dart> coarsenCandidate ;
Pierre Kraemer's avatar
Pierre Kraemer committed
186

187
	void clearUpdateCandidates() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
188 189 190
#endif

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

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

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

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

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

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

Pierre Kraemer's avatar
Pierre Kraemer committed
237
/**************************************
David Cazier's avatar
David Cazier committed
238 239
 *           INLINE FUNCTIONS          *
 **************************************/
Pierre Kraemer's avatar
Pierre Kraemer committed
240

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

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

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

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

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

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

290 291 292
	coarsenMark.mark(d) ;
	coarsenCandidate.push_back(map.faceOldestDart(d)) ;
}
Pierre Kraemer's avatar
Pierre Kraemer committed
293 294

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

pitiot's avatar
pitiot committed
300 301 302 303 304 305 306 307 308
//	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
309

310 311
	addElementToVector<Agent*>(agentvect[d],agent);
//	agentvect[d].push_back(agent) ;
312
//	nbAgentsIncrease(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)
		{
pitiot's avatar
pitiot committed
320 321 322
			if (!map.isBoundaryMarked2(ddd))
				addElementToVector<Agent*>(neighborAgentvect[ddd],agent);

323
//			neighborAgentvect[ddd].push_back(agent) ;
324
//			nbAgentsIncrease(ddd);
David Cazier's avatar
David Cazier committed
325
			ddd = map.alpha1(ddd) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
326
		}
David Cazier's avatar
David Cazier committed
327 328
		dd = map.phi1(dd) ;
	} while (dd != d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
329 330
}

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

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

337
//	nbAgentsDecrease(d) ;
David Cazier's avatar
David Cazier committed
338 339

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

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

pitiot's avatar
pitiot committed
354 355 356 357 358 359 360 361 362
//	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
363 364
}

pitiot's avatar
maj  
pitiot committed
365 366 367

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

368

369
inline void EnvMap::addObstAsNeighbor (Obstacle *  o, const std::vector<Dart>& belonging_cells, std::vector<Dart> *neighbor_cells)
pitiot's avatar
maj  
pitiot committed
370 371
{
	assert(map.getCurrentLevel() == map.getMaxLevel());
372
	assert(!belonging_cells.empty());
pitiot's avatar
maj  
pitiot committed
373
	neighbor_cells->clear();
pitiot's avatar
pitiot committed
374 375 376
//	CellMarkerMemo<FACE> memo_mark_speed(map);//marqueur additionnel (vitesse)
	CellMarkerMemo<FACE> memo_mark(map); //marqueur des cellules "présentes"
	CellMarkerMemo<FACE> OneRingMark(map); // marquer des cellules voisines
Thomas Jund's avatar
Thomas Jund committed
377

378
	for (std::vector<Dart>::const_iterator it =belonging_cells.begin();it<belonging_cells.end();++it)
pitiot's avatar
pitiot committed
379
			memo_mark.mark(*it);
pitiot's avatar
pitiot committed
380

pitiot's avatar
pitiot committed
381 382 383 384




pitiot's avatar
maj  
pitiot committed
385

386
	std::vector<Dart>::const_iterator it=belonging_cells.begin();
pitiot's avatar
maj  
pitiot committed
387 388 389 390
	Dart beg = NIL;
	Dart first =NIL;
	Dart d=NIL;
	Dart dd=NIL;
pitiot's avatar
pitiot committed
391 392 393 394 395 396 397

	/////////////////////////////////////////////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
398 399 400 401 402 403 404 405
	do
	{
		beg = *it;
		first = NIL;
		d=beg;
		do {
			dd=map.alpha1(map.alpha1(d));
			do {
406
				if (!memo_mark.isMarked(dd))
pitiot's avatar
maj  
pitiot committed
407 408 409 410 411 412 413 414 415 416 417
				{
					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());
418
//	assert(!buildingMark.isMarked(d)) ;
419 420
	assert(first!=NIL) ;
//	CGoGNout<<"first : "<<first<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
421 422 423 424 425 426 427 428 429
	d=first;
	do
	{
		if (!OneRingMark.isMarked(d))
		{
			OneRingMark.mark(d);
			(*neighbor_cells).push_back(d);
		}

430
		find_next(o,&d, memo_mark);
431
//		CGoGNout<<"d : "<<d<<CGoGNendl;
pitiot's avatar
maj  
pitiot committed
432 433 434 435 436
	}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 )

437
inline void EnvMap::find_next(Obstacle* o,Dart * ddd, CellMarkerMemo<FACE>& cms)
pitiot's avatar
maj  
pitiot committed
438 439 440 441 442 443 444 445 446 447 448 449 450 451
{
	Dart d=*ddd;
	Dart first = NIL;
	Dart dd;
	int rd =0;
	do{
		rd++;
		dd=map.alpha1((d));

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

452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473

		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
474
		}
475
		d=map.phi_1(d);
pitiot's avatar
maj  
pitiot committed
476 477 478 479 480 481 482
	}while(first==NIL);
	*ddd=first;
}

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

485
	addElementToVector<Obstacle*>(neighborObstvect[d],o);
pitiot's avatar
maj  
pitiot committed
486 487
}

488 489 490 491
//inline void EnvMap::pushObstacleInCell(Obstacle* o, Dart d)
//{
//	assert(map.getCurrentLevel() == map.getMaxLevel()) ;
//	assert(!buildingMark.isMarked(d)) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
492
//
493 494
//	addElementToVector<Obstacle*>(obstvect[d],o);
//}
495

Pierre Kraemer's avatar
Pierre Kraemer committed
496 497
inline void EnvMap::clearUpdateCandidates()
{
David Cazier's avatar
David Cazier committed
498 499
	refineCandidate.clear() ;
	coarsenCandidate.clear() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
500
}
pitiot's avatar
maj  
pitiot committed
501 502
///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
503
#endif
Pierre Kraemer's avatar
Pierre Kraemer committed
504 505

#endif