Coupure prévue mardi 3 Août au matin pour maintenance du serveur. Nous faisons au mieux pour que celle-ci soit la plus brève possible.

mapHandler.h 6.78 KB
Newer Older
Pierre Kraemer's avatar
Pierre Kraemer committed
1
2
3
4
5
6
7
8
#ifndef _MAPHANDLER_H_
#define _MAPHANDLER_H_

#include <QString>

#include "types.h"
#include "view.h"
#include "plugin.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
9
#include "cellSelector.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
10
11
12
13

#include "Topology/generic/genericmap.h"
#include "Topology/generic/functor.h"
#include "Topology/generic/attributeHandler.h"
14

15
#include "Utils/drawer.h"
16

Pierre Kraemer's avatar
Pierre Kraemer committed
17
18
19
#include "Algo/Render/GL2/mapRender.h"
#include "Algo/Geometry/boundingbox.h"

20
21
#include "Algo/Topo/basic.h"

22
23
#include "Utils/vbo.h"

Pierre Kraemer's avatar
Pierre Kraemer committed
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
namespace CGoGN
{

namespace SCHNApps
{

class MapHandlerGen : public QObject
{
	Q_OBJECT

	friend class View;

public:
	MapHandlerGen(const QString& name, SCHNApps* s, GenericMap* map);
	virtual ~MapHandlerGen();

	const QString& getName() const { return m_name; }

public slots:
	QString getName() { return m_name; }
	SCHNApps* getSCHNApps() const { return m_schnapps; }

	bool isSelectedMap() const { return m_schnapps->getSelectedMap() == this; }

	GenericMap* getGenericMap() const { return m_map; }

Pierre Kraemer's avatar
Pierre Kraemer committed
50
51
52
	const QList<View*>& getLinkedViews() const { return l_views; }
	bool isLinkedToView(View* view) const { return l_views.contains(view); }

Pierre Kraemer's avatar
Pierre Kraemer committed
53
54
55
	const qglviewer::Vec& getBBmin() const { return m_bbMin; }
	const qglviewer::Vec& getBBmax() const { return m_bbMax; }
	float getBBdiagSize() const { return m_bbDiagSize; }
56

Pierre Kraemer's avatar
Pierre Kraemer committed
57
58
	Utils::GLSLShader* getBBDrawerShader() const
	{
59
60
61
		if(m_bbDrawer)
			return m_bbDrawer->getShader();
		else
Pierre Kraemer's avatar
Pierre Kraemer committed
62
63
64
			return NULL;
	}

65
66
67
68
69
70
71
72
73
74
75
76
77
78
	qglviewer::ManipulatedFrame* getFrame() const { return m_frame; }
	glm::mat4 getFrameMatrix() const
	{
		GLdouble m[16];
		m_frame->getMatrix(m);
		glm::mat4 matrix;
		for(unsigned int i = 0; i < 4; ++i)
		{
			for(unsigned int j = 0; j < 4; ++j)
				matrix[i][j] = (float)m[i*4+j];
		}
		return matrix;
	}

Pierre Kraemer's avatar
Pierre Kraemer committed
79
80
81
82
83
84
public:
	virtual void draw(Utils::GLSLShader* shader, int primitive) = 0;
	virtual void drawBB() = 0;

	void setPrimitiveDirty(int primitive) {	m_render->setPrimitiveDirty(primitive);	}

85
86
87
88
89
90
91
	/*********************************************************
	 * MANAGE TOPOLOGICAL QUERIES
	 *********************************************************/

	virtual unsigned int getNbDarts() = 0;
	virtual unsigned int getNbOrbits(unsigned int orbit) = 0;

Pierre Kraemer's avatar
Pierre Kraemer committed
92
93
94
95
96
97
98
99
100
101
	/*********************************************************
	 * MANAGE ATTRIBUTES
	 *********************************************************/

	inline void registerAttribute(const AttributeHandlerGen& ah);

	inline QString getAttributeTypeName(unsigned int orbit, const QString& nameAttr) const;

	const AttributeSet& getAttributeSet(unsigned int orbit) const { return m_attribs[orbit]; }

102
	void notifyAttributeModification(const AttributeHandlerGen& attr);
103

104
	void notifyConnectivityModification();
Pierre Kraemer's avatar
Pierre Kraemer committed
105

106
	void clear(bool removeAttrib);
Pierre Kraemer's avatar
Pierre Kraemer committed
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125

	/*********************************************************
	 * MANAGE VBOs
	 *********************************************************/

public slots:
	Utils::VBO* createVBO(const AttributeMultiVectorGen* attr);
	Utils::VBO* createVBO(const AttributeHandlerGen& attr);
	Utils::VBO* createVBO(const QString& name);

	void updateVBO(const AttributeMultiVectorGen* attr);
	void updateVBO(const AttributeHandlerGen& attr);
	void updateVBO(const QString& name);

	Utils::VBO* getVBO(const QString& name) const;
	const VBOSet& getVBOSet() const { return m_vbo; }

	void deleteVBO(const QString& name);

Pierre Kraemer's avatar
Pierre Kraemer committed
126
127
128
129
	/*********************************************************
	 * MANAGE CELL SELECTORS
	 *********************************************************/

Pierre Kraemer's avatar
Pierre Kraemer committed
130
	virtual CellSelectorGen* addCellSelector(unsigned int orbit, const QString& name) = 0;
Pierre Kraemer's avatar
Pierre Kraemer committed
131
132
133
	void removeCellSelector(unsigned int orbit, const QString& name);

	CellSelectorGen* getCellSelector(unsigned int orbit, const QString& name) const;
134
135
	const CellSelectorSet& getCellSelectorSet(unsigned int orbit) const { return m_cellSelectors[orbit]; }

Pierre Kraemer's avatar
Pierre Kraemer committed
136
private slots:
137
138
	void selectedCellsChanged();

139
public:
140
141
	void updateMutuallyExclusiveSelectors(unsigned int orbit);

Pierre Kraemer's avatar
Pierre Kraemer committed
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
	/*********************************************************
	 * MANAGE LINKED VIEWS
	 *********************************************************/

private:
	void linkView(View* view);
	void unlinkView(View* view);

	/*********************************************************
	 * SIGNALS
	 *********************************************************/

signals:
	void connectivityModified();

	void attributeAdded(unsigned int orbit, const QString& nameAttr);
	void attributeModified(unsigned int orbit, QString nameAttr);
159
	void attributeRemoved(unsigned int orbit, const QString& nameAttr);
Pierre Kraemer's avatar
Pierre Kraemer committed
160
161
162
163

	void vboAdded(Utils::VBO* vbo);
	void vboRemoved(Utils::VBO* vbo);

Pierre Kraemer's avatar
Pierre Kraemer committed
164
165
	void cellSelectorAdded(unsigned int orbit, const QString& name);
	void cellSelectorRemoved(unsigned int orbit, const QString& name);
166
	void selectedCellsChanged(CellSelectorGen* cs);
Pierre Kraemer's avatar
Pierre Kraemer committed
167

Pierre Kraemer's avatar
Pierre Kraemer committed
168
169
170
protected:
	QString m_name;
	SCHNApps* m_schnapps;
171

Pierre Kraemer's avatar
Pierre Kraemer committed
172
173
	GenericMap* m_map;

Pierre Kraemer's avatar
Pierre Kraemer committed
174
175
	qglviewer::ManipulatedFrame* m_frame;

Pierre Kraemer's avatar
Pierre Kraemer committed
176
177
178
	qglviewer::Vec m_bbMin;
	qglviewer::Vec m_bbMax;
	float m_bbDiagSize;
179
	Utils::Drawer* m_bbDrawer;
180

Pierre Kraemer's avatar
Pierre Kraemer committed
181
182
183
184
185
186
	Algo::Render::GL2::MapRender* m_render;

	QList<View*> l_views;

	VBOSet m_vbo;
	AttributeSet m_attribs[NB_ORBITS];
187

188
	CellSelectorSet m_cellSelectors[NB_ORBITS];
Pierre Kraemer's avatar
Pierre Kraemer committed
189
190
191
192
193
194
};


template <typename PFP>
class MapHandler : public MapHandlerGen
{
Pierre Kraemer's avatar
Pierre Kraemer committed
195
196
197
198
	typedef typename PFP::MAP MAP;
	typedef typename PFP::MAP::IMPL MAP_IMPL;
	typedef typename PFP::VEC3 VEC3;

Pierre Kraemer's avatar
Pierre Kraemer committed
199
200
201
202
203
204
205
206
207
208
209
public:
	MapHandler(const QString& name, SCHNApps* s, typename PFP::MAP* map) :
		MapHandlerGen(name, s, map)
	{}

	~MapHandler()
	{
		if (m_map)
			delete m_map;
	}

Pierre Kraemer's avatar
Pierre Kraemer committed
210
211
	inline MAP* getMap() { return static_cast<MAP*>(m_map); }

212
213
214
215
216
217
218
	/*********************************************************
	 * MANAGE TOPOLOGICAL QUERIES
	 *********************************************************/

	unsigned int getNbDarts();
	unsigned int getNbOrbits(unsigned int orbit);

Pierre Kraemer's avatar
Pierre Kraemer committed
219
220
221
222
223
224
225
226
227
228
229
230
231
	/*********************************************************
	 * MANAGE ATTRIBUTES
	 *********************************************************/

	template <typename T, unsigned int ORBIT>
	AttributeHandler<T, ORBIT, MAP_IMPL> getAttribute(const QString& nameAttr, bool onlyRegistered = true) const;

	template <typename T, unsigned int ORBIT>
	AttributeHandler<T, ORBIT, MAP_IMPL> addAttribute(const QString& nameAttr, bool registerAttr = true);

	/*********************************************************
	 * MANAGE DRAWING
	 *********************************************************/
232

Pierre Kraemer's avatar
Pierre Kraemer committed
233
234
235
	void draw(Utils::GLSLShader* shader, int primitive);
	void drawBB();

Pierre Kraemer's avatar
Pierre Kraemer committed
236
	void updateBB(const VertexAttribute<VEC3, MAP_IMPL>& position);
Pierre Kraemer's avatar
Pierre Kraemer committed
237
238
	void updateBBDrawer();

Pierre Kraemer's avatar
Pierre Kraemer committed
239
240
241
242
243
244
245
246
	/*********************************************************
	 * MANAGE CELL SELECTORS
	 *********************************************************/

	virtual CellSelectorGen* addCellSelector(unsigned int orbit, const QString& name);

	template <unsigned int ORBIT>
	CellSelector<MAP, ORBIT>* getCellSelector(const QString& name) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
247

Pierre Kraemer's avatar
Pierre Kraemer committed
248
protected:
Pierre Kraemer's avatar
Pierre Kraemer committed
249
	Geom::BoundingBox<VEC3> m_bb;
Pierre Kraemer's avatar
Pierre Kraemer committed
250
251
252
253
254
255
256
257
258
};

} // namespace SCHNApps

} // namespace CGoGN

#include "mapHandler.hpp"

#endif