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

view.cpp 8.1 KB
Newer Older
1
2
#include "view.h"

Pierre Kraemer's avatar
Pierre Kraemer committed
3
#include "plugin.h"
4
#include "camera.h"
5
6
#include "viewButtonArea.h"

Pierre Kraemer's avatar
Pierre Kraemer committed
7
#include "cameraViewDialog.h"
8
9
10
11
#include "pluginsViewDialog.h"
#include "mapsViewDialog.h"

#include "Utils/GLSLShader.h"
12
#include "Algo/Geometry/boundingbox.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
13
14
15
16

#include <QKeyEvent>
#include <QMouseEvent>
#include <QWheelEvent>
17

18
19
unsigned int View::viewCount = 0;

20
21
View::View(const QString& name, Window* w, QWidget* parent, const QGLWidget* shareWidget) :
	QGLViewer(parent, shareWidget),
22
	m_name(name),
Pierre Kraemer's avatar
Pierre Kraemer committed
23
	m_window(w),
Pierre Kraemer's avatar
Pierre Kraemer committed
24
25
26
27
	m_cameraButton(NULL),
	m_pluginsButton(NULL),
	m_mapsButton(NULL),
	m_closeButton(NULL)
Pierre Kraemer's avatar
Pierre Kraemer committed
28
{
29
30
	++viewCount;

31
	m_currentCamera = m_window->addCamera();
32

33
34
35
	m_cameraViewDialog = new CameraViewDialog(m_window, this);
	m_pluginsViewDialog = new PluginsViewDialog(m_window, this);
	m_mapsViewDialog = new MapsViewDialog(m_window, this);
36
37
38
39
}

View::~View()
{
Pierre Kraemer's avatar
Pierre Kraemer committed
40
41
	m_currentCamera->unlinkView(this);

42
43
44
	qglviewer::Camera* c = new qglviewer::Camera();
	this->setCamera(c);

Pierre Kraemer's avatar
Pierre Kraemer committed
45
	foreach(Plugin* plugin, l_plugins)
46
47
	{
		plugin->unlinkView(this);
48
//		unlinkPlugin(plugin);
49
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
50

51
	foreach(MapHandlerGen* map, l_maps)
52
53
	{
		map->unlinkView(this);
54
//		unlinkMap(map);
55
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
56
57

	delete m_buttonArea;
Pierre Kraemer's avatar
Pierre Kraemer committed
58
59
}

60
void View::init()
Pierre Kraemer's avatar
Pierre Kraemer committed
61
{
62
63
64
	m_buttonArea = new ViewButtonArea(this);
	m_buttonArea->setTopRightPosition(this->width(), 0);

65
	m_cameraButton = new ViewButton(":icons/icons/button_cameras.png", this);
66
	m_buttonArea->addButton(m_cameraButton);
67
	connect(m_cameraButton, SIGNAL(clicked(int, int, int, int)), this, SLOT(cb_cameraView(int, int, int, int)));
Pierre Kraemer's avatar
Pierre Kraemer committed
68

69
	m_pluginsButton = new ViewButton(":icons/icons/button_plugins.png", this);
70
	m_buttonArea->addButton(m_pluginsButton);
71
	connect(m_pluginsButton, SIGNAL(clicked(int, int, int, int)), this, SLOT(cb_pluginsView(int, int, int, int)));
Pierre Kraemer's avatar
Pierre Kraemer committed
72

73
	m_mapsButton = new ViewButton(":icons/icons/button_maps.png", this);
74
	m_buttonArea->addButton(m_mapsButton);
75
	connect(m_mapsButton, SIGNAL(clicked(int, int, int, int)), this, SLOT(cb_mapsView(int, int, int, int)));
Pierre Kraemer's avatar
Pierre Kraemer committed
76

77
	m_closeButton = new ViewButton(":icons/icons/button_close.png", this);
78
	m_buttonArea->addButton(m_closeButton);
79
	connect(m_closeButton, SIGNAL(clicked(int, int, int, int)), this, SLOT(cb_closeView(int, int, int, int)));
80
81
82
83
84
85
86
87

	qglviewer::Camera* c = this->camera();
	this->setCamera(m_currentCamera);
	delete c;

	this->setBackgroundColor(QColor(0,0,0));

	updateTextInfo();
88
89
}

90
void View::preDraw()
91
{
92
93
94
95
96
97
	glm::mat4 mm = getCurrentModelViewMatrix();
	glm::mat4 pm = getCurrentProjectionMatrix();
	for(std::set< std::pair<void*, CGoGN::Utils::GLSLShader*> >::iterator it = CGoGN::Utils::GLSLShader::m_registeredShaders.begin();
		it != CGoGN::Utils::GLSLShader::m_registeredShaders.end();
		++it)
	{
98
99
		if(it->first == this || it->first == NULL)
			it->second->updateMatrices(pm, mm);
100
	}
101
102

	QGLViewer::preDraw();
103
104
105
106
}

void View::draw()
{
107
108
109
	foreach(Plugin* plugin, l_plugins)
		plugin->redraw(this);
}
110

111
112
void View::postDraw()
{
113
	glPushAttrib(GL_ALL_ATTRIB_BITS);
114
	drawButtons();
Pierre Kraemer's avatar
Pierre Kraemer committed
115
	drawText();
116
117
	if(isCurrentView())
		drawFrame();
118
	glPopAttrib();
119
120
121
122
123
124
125
126
127

	QGLViewer::postDraw();
}

void View::resizeGL(int width, int height)
{
	QGLViewer::resizeGL(width, height);
	if(m_buttonArea)
		m_buttonArea->setTopRightPosition(width, 0);
128
129
130
131
132
}

void View::drawText()
{
	glColor3f(1.0f, 1.0f, 1.0f);
Pierre Kraemer's avatar
Pierre Kraemer committed
133
134
135
	QGLViewer::drawText(10, 20, m_textInfo);
}

Pierre Kraemer's avatar
Pierre Kraemer committed
136
137
138
139
140
141
142
143
void View::drawButtons()
{
	glEnable(GL_TEXTURE_2D);
	startScreenCoordinatesSystem();
	m_buttonArea->draw();
	stopScreenCoordinatesSystem();
	glDisable(GL_TEXTURE_2D);
}
144

145
146
147
148
149
150
151
152
153
154
155
156
157
158
void View::drawFrame()
{
	startScreenCoordinatesSystem();
	glColor3f(0.0f, 1.0f, 0.0f);
	glLineWidth(2.0);
	glBegin(GL_LINE_LOOP);
		glVertex2i(1, 1);
		glVertex2i(1, height()-1);
		glVertex2i(width()-1, height()-1);
		glVertex2i(width()-1, 1);
	glEnd();
	stopScreenCoordinatesSystem();
}

159
160
void View::keyPressEvent(QKeyEvent* event)
{
Pierre Kraemer's avatar
Pierre Kraemer committed
161
	foreach(Plugin* plugin, l_plugins)
162
		plugin->keyPress(this, event->key());
Pierre Kraemer's avatar
Pierre Kraemer committed
163
	QGLViewer::keyPressEvent(event);
164
165
}

Pierre Kraemer's avatar
Pierre Kraemer committed
166
void View::keyReleaseEvent(QKeyEvent *event)
167
{
Pierre Kraemer's avatar
Pierre Kraemer committed
168
	foreach(Plugin* plugin, l_plugins)
169
		plugin->keyRelease(this, event->key());
Pierre Kraemer's avatar
Pierre Kraemer committed
170
	QGLViewer::keyReleaseEvent(event);
171
172
173
174
}

void View::mousePressEvent(QMouseEvent* event)
{
175
176
177
	if(!isCurrentView())
		m_window->setCurrentView(this);

Pierre Kraemer's avatar
Pierre Kraemer committed
178
	if(m_buttonArea->isClicked(event->x(), event->y()))
179
		m_buttonArea->clickButton(event->x(), event->y(), event->globalX(), event->globalY());
Pierre Kraemer's avatar
Pierre Kraemer committed
180
181
182
	else
	{
		foreach(Plugin* plugin, l_plugins)
183
			plugin->mousePress(this, event->button(), event->pos().x(), event->pos().y());
184
		QGLViewer::mousePressEvent(event);
Pierre Kraemer's avatar
Pierre Kraemer committed
185
	}
186
187
188
189
}

void View::mouseReleaseEvent(QMouseEvent* event)
{
Pierre Kraemer's avatar
Pierre Kraemer committed
190
	foreach(Plugin* plugin, l_plugins)
191
		plugin->mouseRelease(this, event->button(), event->pos().x(), event->pos().y());
Pierre Kraemer's avatar
Pierre Kraemer committed
192
	QGLViewer::mouseReleaseEvent(event);
193
194
195
196
}

void View::mouseMoveEvent(QMouseEvent* event)
{
Pierre Kraemer's avatar
Pierre Kraemer committed
197
	foreach(Plugin* plugin, l_plugins)
198
		plugin->mouseMove(this, event->button(), event->pos().x(), event->pos().y());
Pierre Kraemer's avatar
Pierre Kraemer committed
199
	QGLViewer::mouseMoveEvent(event);
200
201
202
203
}

void View::wheelEvent(QWheelEvent* event)
{
Pierre Kraemer's avatar
Pierre Kraemer committed
204
	foreach(Plugin* plugin, l_plugins)
205
		plugin->wheelEvent(this, event->delta(), event->pos().x(), event->pos().y());
Pierre Kraemer's avatar
Pierre Kraemer committed
206
	QGLViewer::wheelEvent(event);
207
208
}

209
210
211
212
/*********************************************************
 * MANAGE LINKED CAMERA
 *********************************************************/

Pierre Kraemer's avatar
Pierre Kraemer committed
213
214
void View::setCurrentCamera(Camera* c)
{
215
	if(c != m_currentCamera && c != NULL)
Pierre Kraemer's avatar
Pierre Kraemer committed
216
217
218
219
220
221
222
223
	{
		m_currentCamera = c;
		this->setCamera(m_currentCamera);
		updateTextInfo();
		updateGL();
	}
}

224
225
226
227
/*********************************************************
 * MANAGE LINKED PLUGINS
 *********************************************************/

Pierre Kraemer's avatar
Pierre Kraemer committed
228
229
230
void View::linkPlugin(Plugin* plugin)
{
	if(plugin && !l_plugins.contains(plugin))
231
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
232
		l_plugins.push_back(plugin);
233
234
235
		if(isCurrentView())
			m_window->enablePluginTabWidgets(plugin);
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
236
237
238
239
240
}

void View::unlinkPlugin(Plugin* plugin)
{
	l_plugins.removeOne(plugin);
241
242
	if(isCurrentView())
		m_window->disablePluginTabWidgets(plugin);
Pierre Kraemer's avatar
Pierre Kraemer committed
243
244
}

245
246
247
248
/*********************************************************
 * MANAGE LINKED MAPS
 *********************************************************/

249
void View::linkMap(MapHandlerGen* map)
Pierre Kraemer's avatar
Pierre Kraemer committed
250
251
{
	if(map && !l_maps.contains(map))
252
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
253
		l_maps.push_back(map);
254
255
256

		// TODO : update view global BB
		setSceneBoundingBox(map->getBBmin(), map->getBBmax());
257
		showEntireScene();
258
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
259
260
}

261
void View::unlinkMap(MapHandlerGen* map)
Pierre Kraemer's avatar
Pierre Kraemer committed
262
263
{
	l_maps.removeOne(map);
264
265

	// TODO : update view global BB
Pierre Kraemer's avatar
Pierre Kraemer committed
266
267
}

268
269
270



271
272
void View::updateTextInfo()
{
Pierre Kraemer's avatar
Pierre Kraemer committed
273
	m_textInfo =
274
275
		QString("view: ") + m_name +
		QString(" / camera: ") + m_currentCamera->getName();
276
277
}

278
glm::mat4 View::getCurrentModelViewMatrix() const
279
280
{
	GLdouble gl_mvm[16];
281
	camera()->getModelViewMatrix(gl_mvm);
282
283
284
285
286
287
288
289
290
	glm::mat4 mvm;
	for(unsigned int i = 0; i < 4; ++i)
	{
		for(unsigned int j = 0; j < 4; ++j)
			mvm[i][j] = (float)gl_mvm[i*4+j];
	}
	return mvm;
}

291
glm::mat4 View::getCurrentProjectionMatrix() const
292
293
{
	GLdouble gl_pm[16];
294
	camera()->getProjectionMatrix(gl_pm);
295
296
297
298
299
300
301
302
303
	glm::mat4 pm;
	for(unsigned int i = 0; i < 4; ++i)
	{
		for(unsigned int j = 0; j < 4; ++j)
			pm[i][j] = (float)gl_pm[i*4+j];
	}
	return pm;
}

304
glm::mat4 View::getCurrentModelViewProjectionMatrix() const
305
306
{
	GLdouble gl_mvpm[16];
307
	camera()->getModelViewProjectionMatrix(gl_mvpm);
308
309
310
311
312
313
314
315
316
	glm::mat4 mvpm;
	for(unsigned int i = 0; i < 4; ++i)
	{
		for(unsigned int j = 0; j < 4; ++j)
			mvpm[i][j] = (float)gl_mvpm[i*4+j];
	}
	return mvpm;
}

Pierre Kraemer's avatar
Pierre Kraemer committed
317
void View::setCurrentModelViewMatrix(const glm::mat4& mvm)
318
319
320
321
322
323
324
{
	GLdouble gl_mvm[16];
	for(unsigned int i = 0; i < 4; ++i)
	{
		for(unsigned int j = 0; j < 4; ++j)
			gl_mvm[i*4+j] = mvm[i][j];
	}
325
	camera()->setFromModelViewMatrix(gl_mvm);
326
327
}

Pierre Kraemer's avatar
Pierre Kraemer committed
328
void View::setCurrentProjectionMatrix(const glm::mat4& pm)
329
330
331
332
333
334
335
{
	float gl_pm[12];
	for(unsigned int i = 0; i < 3; ++i)
	{
		for(unsigned int j = 0; j < 4; ++j)
			gl_pm[i*3+j] = pm[i][j];
	}
336
	camera()->setFromProjectionMatrix(gl_pm);
337
338
}

339
void View::cb_cameraView(int x, int y, int globalX, int globalY)
340
{
341
	m_cameraViewDialog->move(globalX, globalY);
342
343
344
	m_cameraViewDialog->show();
}

345
void View::cb_pluginsView(int x, int y, int globalX, int globalY)
346
{
347
	m_pluginsViewDialog->move(globalX, globalY);
348
349
350
	m_pluginsViewDialog->show();
}

351
void View::cb_mapsView(int x, int y, int globalX, int globalY)
352
{
353
	m_mapsViewDialog->move(globalX, globalY);
354
355
356
	m_mapsViewDialog->show();
}

357
void View::cb_closeView(int x, int y, int globalX, int globalY)
Pierre Kraemer's avatar
Pierre Kraemer committed
358
{
359
	m_window->removeView(m_name);
Pierre Kraemer's avatar
Pierre Kraemer committed
360
}