-
Notifications
You must be signed in to change notification settings - Fork 11
/
renderingwidget.h
345 lines (277 loc) · 8.35 KB
/
renderingwidget.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
// (c) 2015 David Vyvlečka, AGPLv3
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QOpenGLWidget>
#include <QGLFunctions>
#include <QMatrix4x4>
#include <QVector2D>
#include <QGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLFramebufferObject>
#include <QBasicTimer>
#include <QBrush>
#include <QFont>
#include <QImage>
#include <QPen>
#include "data.h"
#include "admeshcontroller.h"
/*!
* \brief Main rendering class
*
* Reimplements QOpenGLWidget (Qt version >= 5.4).
* Handles drawing and direct user input.
*/
class RenderingWidget : public QOpenGLWidget, protected QGLFunctions
{
Q_OBJECT
public:
/*!
* \brief Constructor. Sets default values.
*/
explicit RenderingWidget(QWidget *parent = 0);
/*!
* \brief Sets controller used.
*
* Necessary for calling drawAll method.
*
* \param cnt Controller to be set.
*/
void setController(admeshController* cnt);
/*!
* \brief Destructor.
*/
~ RenderingWidget();
/*!
* \brief Write settings to config.
*/
void writeSettings();
/*!
* \brief Set background color.
*
* \param background Background color to set.
*/
void setBackground(QColor background);
/*!
* \brief Set text color.
*
* \param text Text color to set.
*/
void setTextCol(QColor text);
/*!
* \brief Invert mouse.
*/
void invertMouse();
protected:
/*!
* \brief Initializes OpenGL. Makes all default calls.
*/
void initializeGL();
/*!
* \brief Initializes Shaders from source files.
*/
void initShaders();
/*!
* \brief Reimplemented main drawing method.
*
* Makes all drawing calls each time widget is updated.
* Draws 3D first: main content + corner axes.
* Than draws 2D text over 3D content using QPainter.
* Calculates and sets PVM matrix uniform.
*/
void paintGL();
/*!
* \brief Reimplemented resize method.
*
* Calles upon resize of window.
*/
void resizeGL(int width, int height);
/*!
* \brief Reimplemented timer. Send update(); signal.
*
* Used only when mouse is moving otherwise update() is called only upon actions performed (lower CPU usage).
*
* \param e Timer event sent.
*/
void timerEvent(QTimerEvent *e);
/*!
* \brief Reimplemented method. Gives minimal size of widget.
*/
QSize minimumSizeHint() const;
/*!
* \brief Reimplemented method. Gives default size of widget.
*/
QSize sizeHint() const;
/*!
* \brief Reimplemented method. Handles mouse wheel to zoom.
* \param event Wheel event sent.
*/
void wheelEvent(QWheelEvent* event);
/*!
* \brief Reimplemented method. Handles mouse button pressed.
* \param event Press event sent.
*/
void mousePressEvent(QMouseEvent *event);
/*!
* \brief Reimplemented method. Handles mouse button released.
* \param event Released event sent.
*/
void mouseReleaseEvent(QMouseEvent *event);
/*!
* \brief Reimplemented method. Handles mouse move.
* \param event Mouse move event sent.
*/
void mouseMoveEvent(QMouseEvent *event);
public slots:
/*!
* \brief Set front view angles.
*/
void setFrontView();
/*!
* \brief Set back view angles.
*/
void setBackView();
/*!
* \brief Set left view angles.
*/
void setLeftView();
/*!
* \brief Set right view angles.
*/
void setRightView();
/*!
* \brief Set top view angles.
*/
void setTopView();
/*!
* \brief Set bottom view angles.
*/
void setBottomView();
/*!
* \brief Changes axes mode. ON/OFF
*/
void toggleAxes();
/*!
* \brief Changes grid mode. ON/OFF
*/
void toggleGrid();
/*!
* \brief View or hide mesh info.
*/
void toggleInfo();
/*!
* \brief Updates scene when necessary.
*/
void reDraw();
/*!
* \brief Update scene zoom according to size of open file.
*/
void reCalculatePosition();
/*!
* \brief Reset camera translation to zero.
*/
void centerPosition();
/*!
* \brief Toggle Shift key pressed information.
*/
void toggleShift();
signals:
private:
/*!
* \brief Initialize axes vertex buffer object and fill it.
*/
void initAxes();
/*!
* \brief Initialize grid vertex buffer object and fill it.
*/
void initGrid();
/*!
* \brief Convert point in 3D scene to screen coordinates.
* \param worldCoords Coordinates of 3D point.
* \return Coordinates of point in screen space.
*/
QVector2D getScreenCoords(QVector3D worldCoords);
/*!
* \brief Draw actual info.
* \param painter Painter used for drawing.
*/
void drawInfo(QPainter *painter);
/*!
* \brief Draw labels for corner axes.
* \param painter Painter used for drawing.
*/
void drawLabels(QPainter *painter);
/*!
* \brief Render x,y and z axes.
*/
void drawAxes();
/*!
* \brief Render small corner x,y and z axes.
*/
void drawSmallAxes();
/*!
* \brief Render x,y grid.
*/
void drawGrid();
/*!
* \brief Normalizes camera rotation angles.
*/
void normalizeAngles();
/*!
* \brief Calculate view matrix based on Euler angles.
*/
void getCamPos();
/*!
* \brief Recalculate grid step according to current zoom factor.
*
* Calculated in range of {1,2,3,4,5,10,15,..} and further in multiples of 5.
*/
void recalculateGridStep();
/*!
* \brief Determine projection near plane based on distance from objects.
*/
void recalculateProjectionNear();
/*!
* \brief Do color based object picking.
*
* Uses offscreen color + depth framebuffer for drawing. Based on color of pixel clicked.
*/
void doPicking();
QBasicTimer timer; ///< Timer used to regular redrawing.
int w; ///< Widget width.
int h; ///< Widget height.
QGLShaderProgram program; ///< Common shader program.
QGLShaderProgram pick_program; ///< Picking shader program.
QMatrix4x4 projection; ///< Projection matrix.
QMatrix4x4 orthographic; ///< Orthographic projection matrix.
QMatrix4x4 view; ///< View matrix.
QMatrix4x4 smallView; ///< No zoom view.
QMatrix4x4 model; ///< Model matrix.
QOpenGLFramebufferObjectFormat pickFboFormat; ///< Framebuffer used offscreen for object picking.
GLuint axes_vbo; ///< Vertex buffer object for axes.
GLuint grid_vbo; ///< Vertex buffer object for grid.
QColor background_col; ///< Background color.
QColor text_col; ///< Text color.
GLfloat minDiam; ///< Maximum axes diameter of objects in scene.
GLfloat angleX; ///< X axis angle.
GLfloat angleY; ///< Y axis angle.
GLfloat xPos; ///< Camera X position.
GLfloat yPos; ///< Camera Y position.
GLfloat zPos; ///< Camera Z position.
GLfloat zoom; ///< Camera zoom factor.
QVector4D smallAxesBox; ///< Dimension and position of small axes box in screen coordinates.
bool Axes; ///< Axes mode on/off.
bool Grid; ///< Grid mode on/off.
bool Info; ///< Info on/off.
bool selection; ///< Object picking action.
bool shiftPressed; ///< Shift key pressed.
bool mouseInverted; ///< Mouse inverted yes/no.
QPoint lastPos; ///< Last clicked position (LMB).
QPoint lastTransPos; ///< Last clicked position (MMB).
QPoint lastSelectionPos; ///< Last clicked position (RMB).
GLfloat xTrans; ///< X direction translation factor.
GLfloat yTrans; ///< Y direction translation factor.
int gridStep; ///< Step between grid lines.
admeshController *controller; ///< Pointer to main controller.
QOpenGLVertexArrayObject vao; ///< Vertex array object.
};
#endif // MYGLWIDGET_H