Projekt

Obecné

Profil

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