env_map.h 3.85 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
8
9
10
11
12
13
14
15
16
17
18

#include <iostream>
#include <algorithm>

#include "Topology/generic/parameters.h"
#include "Topology/map/map2.h"
#include "Topology/generic/embeddedMap2.h"

#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
19
#include "Geometry/bounding_box.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
20
21
22
23
24
25
26
27
28
29

#include "Container/fakeAttribute.h"

#include "env_generator.h"

#include "Algo/Parallel/parallel_foreach.h"

using namespace CGoGN;

class Agent;
Pierre Kraemer's avatar
Pierre Kraemer committed
30
class Obstacle;
Pierre Kraemer's avatar
Pierre Kraemer committed
31
32
33
34
35
36
37
38
39

struct PFP: public PFP_STANDARD
{
	// definition de la carte
// 	typedef EmbeddedMap2<Map2> MAP;
 	typedef Algo::IHM::ImplicitHierarchicalMap MAP;

	// definition des listes d'agent
	typedef std::vector<Agent*> AGENTS;
Pierre Kraemer's avatar
Pierre Kraemer committed
40
	typedef std::vector<Obstacle*> OBSTACLES;
Pierre Kraemer's avatar
Pierre Kraemer committed
41
42
43
44
	typedef NoMathIONameAttribute<AGENTS> AGENTVECT;
	typedef NoMathIONameAttribute<OBSTACLES> OBSTACLEVECT;
	typedef AttributeHandler<AGENTVECT> TAB_AGENTVECT;
	typedef AttributeHandler<OBSTACLEVECT> TAB_OBSTACLEVECT;
45
46

	typedef NoMathIONameAttribute<std::pair<bool,bool> > BOOLATTRIB;
Pierre Kraemer's avatar
Pierre Kraemer committed
47
48
49
50
51
52
53
54
55
56
};

typedef PFP::VEC3 VEC3;

class EnvMap
{
public :
	EnvMap();
	
	unsigned int mapMemoryCost();
Thomas's avatar
Thomas committed
57
58
	void scale(float scaleVal);

Pierre Kraemer's avatar
Pierre Kraemer committed
59
	Dart getBelongingCell(const PFP::VEC3& pos);
Thomas's avatar
Thomas committed
60

Thomas's avatar
Thomas committed
61
62
63
	void subdivideAllToMaxLevel();
	void subdivideToProperLevel();

Pierre Kraemer's avatar
Pierre Kraemer committed
64
65
	void init();
	
Pierre Kraemer's avatar
Pierre Kraemer committed
66
67
	void foreach_neighborFace(Dart d, FunctorType& f);

Pierre Kraemer's avatar
Pierre Kraemer committed
68
69
70
71
72
	void registerObstaclesInFaces();
	void addNeighborObstacles(PFP::OBSTACLES& obst, Dart d, bool edgeNeighbor);
	
	void setAgentNeighborsAndObstacles(Agent* agent);
	
73
//	void agentChangeFaceThroughEdge(Agent* agent);
Pierre Kraemer's avatar
Pierre Kraemer committed
74
75
	void agentChangeFace(Agent* agent, Dart oldFace);

Pierre Kraemer's avatar
Pierre Kraemer committed
76
77
	void pushAgentInCells(Agent* agent, Dart d);
	void popAgentInCells(Agent* agent, Dart d);
78
	void removeAgentFromVector(PFP::AGENTS& a, Agent * ag);
Pierre Kraemer's avatar
Pierre Kraemer committed
79
80
81
82
83
84
85
86
87
88
89
	
	void clearUpdateCandidates();
	void updateMap();

	void resetAgentInFace(Agent* agent);
	
	PFP::MAP map;

	PFP::TVEC3 position;
	PFP::TVEC3 normal;

90
91
	AttributeHandler<PFP::BOOLATTRIB> subdivisableFace;

Pierre Kraemer's avatar
Pierre Kraemer committed
92
	PFP::TAB_AGENTVECT agentvect;
Pierre Kraemer's avatar
Pierre Kraemer committed
93
94
	PFP::TAB_AGENTVECT neighborAgentvect;
	
Pierre Kraemer's avatar
Pierre Kraemer committed
95
96
97
98
99
	PFP::TAB_OBSTACLEVECT obstvect;

	CellMarker obstacleMark;
	CellMarker buildingMark;

Pierre Kraemer's avatar
Pierre Kraemer committed
100
101
	static const unsigned int nbAgentsToSubdivide = 5;
	static const unsigned int nbAgentsToSimplify = 4;
Pierre Kraemer's avatar
Pierre Kraemer committed
102

103
104
	CellMarker refineMark;
	std::vector<Dart> refineCandidate;
Pierre Kraemer's avatar
Pierre Kraemer committed
105
106
	CellMarker coarsenMark;
	std::vector<Dart> coarsenCandidate;
Pierre Kraemer's avatar
Pierre Kraemer committed
107
108
109
110
111
112
};

/**************************************
*           INLINE FUNCTIONS          *
**************************************/

Pierre Kraemer's avatar
Pierre Kraemer committed
113
inline void EnvMap::pushAgentInCells(Agent* agent, Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
114
115
116
117
118
{
	assert(map.getCurrentLevel() == map.getMaxLevel());
	assert(std::find(agentvect[d].begin(), agentvect[d].end(), agent) == agentvect[d].end());
	
	agentvect[d].push_back(agent);
Pierre Kraemer's avatar
Pierre Kraemer committed
119
120
121
122
123
124
125
126
127
128
129
130

	Dart dd = d;
	do
	{
		Dart ddd = map.alpha1(map.alpha1(dd));
		while(ddd != dd)
		{
			neighborAgentvect[ddd].push_back(agent);
			ddd = map.alpha1(ddd);
		}
		dd = map.phi1(dd);
	} while(dd != d);
Pierre Kraemer's avatar
Pierre Kraemer committed
131
132
}

Thomas's avatar
Thomas committed
133
134
135
136
137
inline void EnvMap::popAgentInCells(Agent* agent, Dart d)
{
	assert(map.getCurrentLevel() == map.getMaxLevel());
	assert(std::find(agentvect[d].begin(), agentvect[d].end(), agent) != agentvect[d].end());

138
	removeAgentFromVector(agentvect[d], agent);
Pierre Kraemer's avatar
Pierre Kraemer committed
139
140
141
142
143
144
145

	Dart dd = d;
	do
	{
		Dart ddd = map.alpha1(map.alpha1(dd));
		while(ddd != dd)
		{
146
			removeAgentFromVector(neighborAgentvect[ddd], agent);
Pierre Kraemer's avatar
Pierre Kraemer committed
147
148
149
150
			ddd = map.alpha1(ddd);
		}
		dd = map.phi1(dd);
	} while(dd != d);
Pierre Kraemer's avatar
Pierre Kraemer committed
151
152
}

153
154
155
156
157
158
159
160
161
162
163
164
165
166
inline void EnvMap::removeAgentFromVector(PFP::AGENTS& a, Agent* ag)
{
	PFP::AGENTS::iterator end = a.end();
	for(PFP::AGENTS::iterator it = a.begin(); it != end; ++it)
	{
		if(*it == ag)
		{
			*it = a.back();
			a.pop_back();
			return;
		}
	}
}

Pierre Kraemer's avatar
Pierre Kraemer committed
167
168
169
inline void EnvMap::clearUpdateCandidates()
{
	refineCandidate.clear();
Pierre Kraemer's avatar
Pierre Kraemer committed
170
	coarsenCandidate.clear();
Pierre Kraemer's avatar
Pierre Kraemer committed
171
172
173
}

#endif