1
|
#ifndef _SCENE_HPP
|
2
|
#define _SCENE_HPP
|
3
|
|
4
|
#include <QOpenGLWidget>
|
5
|
#include <QOpenGLFunctions>
|
6
|
#include <QOpenGLVertexArrayObject>
|
7
|
#include <QOpenGLBuffer>
|
8
|
#include <QOpenGLShaderProgram>
|
9
|
#include <QOpenGLTexture>
|
10
|
#include <QVector4D>
|
11
|
#include <QMatrix4x4>
|
12
|
#include <QMouseEvent>
|
13
|
#include <QWheelEvent>
|
14
|
|
15
|
#include "camera.hpp"
|
16
|
#include "../element/trajectory.hpp"
|
17
|
#include "../element/sphere.hpp"
|
18
|
#include "../element/arrow.hpp"
|
19
|
#include "../element/wall.hpp"
|
20
|
|
21
|
|
22
|
#include "../curvedataserver.h"
|
23
|
|
24
|
|
25
|
/// Instance třídy představuje vykreslovanou 3D scénu.
|
26
|
class Scene: public QOpenGLWidget
|
27
|
{
|
28
|
Q_OBJECT
|
29
|
|
30
|
public:
|
31
|
/// Konstruktor.
|
32
|
/// Vytvoření instancí vykreslovaných prvků, nastavení cest k texturám,
|
33
|
/// nastavení barev a inicializace dalších instančních atributů.
|
34
|
/// @param QWidget *parent - reference na rodiče.
|
35
|
Scene(QWidget *parent = 0);
|
36
|
|
37
|
/// Destruktor.
|
38
|
/// Uvolení alokované paměti.
|
39
|
~Scene();
|
40
|
|
41
|
/// Nastavení křivky. Zjištění rozsahu souřadnic a jejich středu. Podle
|
42
|
/// středu pak provedeno posunutí do počátku soustavy souřadnic. Nastavení
|
43
|
/// hodnot pro dráhu, kouli a zdi. Změna kamery, pozice světla. Vynulování
|
44
|
/// rotace.
|
45
|
/// @param QList<QVector4D> curve - seznam bodů definující křivku.
|
46
|
void setCurve(QList<QVector4D> curve, CurveDataServer * cdServer);
|
47
|
|
48
|
/// Nastaveni pozice koule a vektoru pro obě šipky.
|
49
|
/// @param const QVector3D &position - pozice koule.
|
50
|
/// @param const QVector3D &fArrow - vektor pro první (důležitějši) šipku.
|
51
|
/// @param const QVector3D &sArrow - vektor pro druhou šipku.
|
52
|
void setSphereData(const QVector3D &position, const QVector3D &fArrow, const QVector3D &sArrow);
|
53
|
|
54
|
void setTestSphereData(const QVector3D &position);
|
55
|
|
56
|
/// @return vektor definující danou šipku.
|
57
|
/// @param bool first - jestli se má vrátit vektor první nebo druhé šipky.
|
58
|
QVector3D getArrow(bool first);
|
59
|
|
60
|
/// Nastavi dane šipce její vektor.
|
61
|
/// @param bool first - jestli se má vektor nastavit první šipce.
|
62
|
/// @param QVector3D vector - vektor šipky.
|
63
|
void setArrow(bool first, QVector3D vector);
|
64
|
|
65
|
/// Nastavení barvy křivky.
|
66
|
void setTubusColor(QVector4D color);
|
67
|
|
68
|
/// Nastavení dalšího bodu křivky.
|
69
|
/// Přidá další bod do křivky.
|
70
|
/// @param position QVector3D position - pozice dalšího bodu
|
71
|
/// @param bool start - příznak prvního bodu křivky
|
72
|
/// @param bool finish - příznak posledního bodu křivky
|
73
|
void addSphereData(QVector3D position, const bool start, const bool finish);
|
74
|
|
75
|
protected:
|
76
|
// Protected funkce jsou vsechny prekryte, detailni komentare naleznete
|
77
|
// v QT dokumentaci.
|
78
|
|
79
|
// Minimální velikost okna 100x100.
|
80
|
QSize minimumSizeHint() const override;
|
81
|
|
82
|
// Defaultní velikost okna 500x500.
|
83
|
QSize sizeHint() const override;
|
84
|
|
85
|
// Inicializace OpenGL scény.
|
86
|
void initializeGL() override;
|
87
|
|
88
|
// Vykresleni (prekresleni) sceny.
|
89
|
void paintGL() override;
|
90
|
|
91
|
// Zmena velikost OpenGL sceny.
|
92
|
void resizeGL(int width, int height) override;
|
93
|
|
94
|
// Pri stisknuti tlacitka zapamatovat jeho souradnici kvuli globalni rotaci.
|
95
|
void mousePressEvent(QMouseEvent *event) override;
|
96
|
|
97
|
// Pri pohybu mysi provest rotaci podle osy X a Y.
|
98
|
void mouseMoveEvent(QMouseEvent *event) override;
|
99
|
|
100
|
// Pri pohybu koleckem mysi provest problizeni/oddaleni sceny (kamery).
|
101
|
void wheelEvent(QWheelEvent *e) override;
|
102
|
|
103
|
private:
|
104
|
/// Index v poli ELEMENTS, kde se nachází dráha.
|
105
|
static const int TRAJECTORY_I;
|
106
|
|
107
|
/// Index v poli ELEMENTS, kde se nachází koule.
|
108
|
static const int SPHERE_I;
|
109
|
static const int SPHERE_II;
|
110
|
|
111
|
/// Index v poli ELEMENTS, kde se nachází první šipka.
|
112
|
static const int FIRST_ARROW_I;
|
113
|
|
114
|
/// Jak široká má být první šipka (resp. jak moc se má změnit měřítko pro
|
115
|
/// tloušťku šipky).
|
116
|
static const float FIRST_ARROW_WIDTH_SCALING;
|
117
|
|
118
|
/// Jak široká má být druhá šipka (resp. jak moc se má změnit měřítko pro
|
119
|
/// tloušťku šipky).
|
120
|
static const float SECOND_ARROW_WIDTH_SCALING;
|
121
|
|
122
|
/// Světlo se defaultně umistujě na pozici kamery, tento atribut umožňuje
|
123
|
/// jeho posunutí v závislosti na pozici kamery (čím blíže k počátku
|
124
|
/// soustavy souřadnic, tím menší osvětlení).
|
125
|
static const QVector3D MODIFY_LIGHT_POSITION;
|
126
|
|
127
|
/// Atribut sloužící pro zmenšení nastavených úhlů pro rotaci kolem X a Y.
|
128
|
static const int ROTATE_REDUCTION;
|
129
|
|
130
|
/// Kamera pohledu představující matici pohledu.
|
131
|
Camera camera;
|
132
|
|
133
|
/// O kolik stupňů se ma provést rotace podle osy X a Y.
|
134
|
int xAngle, yAngle;
|
135
|
|
136
|
/// Poslední pozice kurzoru (když uživatel stiskne tlačítko myši).
|
137
|
QPoint lastPosition;
|
138
|
|
139
|
/// Kolik prvků bude vykreslováno a vytvořeni pole referencí pro tyto prvky.
|
140
|
static const int ELEMENT_COUNT = 8;
|
141
|
/// Kolik prvků bude vykreslováno a vytvořeni pole referencí pro tyto prvky.
|
142
|
Element *elements[ELEMENT_COUNT];
|
143
|
|
144
|
/// Kolik bude využíváno textur, vytvoření pole referencí pro tyto textury
|
145
|
/// a vytvoření pole pro cesty k texturám.
|
146
|
static const int TEXTURE_COUNT = 3;
|
147
|
/// Kolik bude využíváno textur, vytvoření pole referencí pro tyto textury
|
148
|
/// a vytvoření pole pro cesty k texturám.
|
149
|
QOpenGLTexture *textures[TEXTURE_COUNT];
|
150
|
/// Kolik bude využíváno textur, vytvoření pole referencí pro tyto textury
|
151
|
/// a vytvoření pole pro cesty k texturám.
|
152
|
QString texturePath[TEXTURE_COUNT];
|
153
|
|
154
|
/// Pole pro vrcholy grafických prvků.
|
155
|
QOpenGLVertexArrayObject vao;
|
156
|
/// Pameť pro hodnoty týkajících se vrcholů grafických prvků.
|
157
|
QOpenGLBuffer buffer;
|
158
|
/// GLSL podprogram.
|
159
|
QOpenGLShaderProgram *shaderProgram;
|
160
|
|
161
|
/// Atributy pro lokaci uniform (globálních) proměnných v shader programu.
|
162
|
/// Kromě klasických atributů se vytváří i pole, protože pro každý grafický
|
163
|
/// prvek (az na zdi) potřebujeme znát lokaci atributu představující jeho
|
164
|
/// vlastní normálovou a model-view matici.
|
165
|
/**@{*/
|
166
|
static const int FIRST_TYPE_WALL_I = 5; // Index prvni zdi (v seznamu prvku jsou nakonci).
|
167
|
int projectionLocation; // Lokace uniform atributu matice projekce.
|
168
|
int lightLocation; // Lokace uniform atributu svetla.
|
169
|
int normalLocations[FIRST_TYPE_WALL_I]; // Pro pro normalove matice.
|
170
|
int mvLocations[FIRST_TYPE_WALL_I]; // Pole pro model-view matice.
|
171
|
/**@}*/
|
172
|
|
173
|
/// Barvy využívané při vykreslování.
|
174
|
/**@{*/
|
175
|
QVector3D backgroundColor; // Barva pozadi cele sceny.
|
176
|
QVector4D colorValues[FIRST_TYPE_WALL_I]; // Barvy pro vsechny graficke prvky.
|
177
|
/**@}*/
|
178
|
|
179
|
/// Zorný ůhel na grafickou scénu.
|
180
|
float eyeAngle;
|
181
|
|
182
|
/// Matice projekce.
|
183
|
QMatrix4x4 projection;
|
184
|
|
185
|
/// Matice pro celou scénu, kterými nastavuje rotaci, posunutí, apod.
|
186
|
QMatrix4x4 worlds[FIRST_TYPE_WALL_I];
|
187
|
|
188
|
/// Vektory šipek.
|
189
|
QVector3D firstArrow, secondArrow;
|
190
|
|
191
|
/// Vektor středu původní křivky (než se posunula do počátku soustavy souřadnic).
|
192
|
QVector3D center;
|
193
|
|
194
|
/// Přenastaví data v bufferu. Využíváno, když se změní data grafických
|
195
|
/// prvků.
|
196
|
void updateBufferData();
|
197
|
|
198
|
/// Nastaví daný počet stupňů atributu XANGLE.
|
199
|
/// @param int angle - o kolik má být provedena rotace podle osy X.
|
200
|
void setXAngle(int angle);
|
201
|
|
202
|
/// Nastaví daný počet stupňů atributu YANGLE.
|
203
|
/// @param int angle - o kolik má být provedena rotace podle osy Y.
|
204
|
void setYAngle(int angle);
|
205
|
|
206
|
private slots:
|
207
|
/// Vyčištění paměti od bufferu s hodnotami pro vrcholy a uvolnění
|
208
|
/// paměti od vytvořeného GLSL podprogramu.
|
209
|
void clear();
|
210
|
};
|
211
|
|
212
|
#endif
|