1 |
c137512e
|
Oto Šťáva
|
#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 |
f06d5ae1
|
Jakub Hejman
|
|
22 |
|
|
#include "../curvedataserver.h"
|
23 |
|
|
|
24 |
|
|
|
25 |
c137512e
|
Oto Šťáva
|
/// 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 |
f06d5ae1
|
Jakub Hejman
|
void setCurve(QList<QVector4D> curve, CurveDataServer * cdServer);
|
47 |
c137512e
|
Oto Šťáva
|
|
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
|