Projekt

Obecné

Profil

Stáhnout (8.36 KB) Statistiky
| Větev: | Tag: | Revize:
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
/// 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