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