1
|
#ifndef _WALL_HPP
|
2
|
#define _WALL_HPP
|
3
|
|
4
|
#include "element.hpp"
|
5
|
|
6
|
/// Instance třídy Wall představují vykreslované stěny. Jednotlivé typy stěn mohou
|
7
|
/// mít jiné textury (viz výčtovy typ TYPE). Stěny se odsadí od křivky podle
|
8
|
/// poloměru koule a nastaveného atributu ENLARGE. Zvětšení (zmenšení) přední a
|
9
|
/// zadní stěny mají na starosti atributy SCALING_*. Ke každému typu stěny je
|
10
|
/// přidělen atribut představující, na kolik částí se má daná stěna rozdělit, resp.
|
11
|
/// kolikrát se do ní má vykreslit textura, viz atributy *_SPLIT. Kvůli posílení
|
12
|
/// dojmu hloubky stěn dochází k deformaci i při rozdělovani stěn. Sloupce na
|
13
|
/// stěnách dále od pozorovatele se zužují. Atribut DEFORM definuje, kolikrát má
|
14
|
/// být sloupec nejblíže k pozorovateli širší a kolikrát má být sloupec nejdále
|
15
|
/// od pozorovatele užší. Zužování sloupců pak probíhá lineárně. DEFORMACE PROBÍHÁ
|
16
|
/// SMĚREM DOPRAVA PRO KAŽDOU STĚNU, JE TEDY NUTNÉ SPRAVNĚ ZADAT VRCHOLY DEFINUJÍCÍ
|
17
|
/// DANOU STĚNU.
|
18
|
class Wall: public Element
|
19
|
{
|
20
|
public:
|
21
|
/// Pro každý typ jiná textura.
|
22
|
enum TYPE
|
23
|
{
|
24
|
/// Identifikátor podlahy.
|
25
|
FLOOR = 0,
|
26
|
/// Identifikátor stropu.
|
27
|
CEILING,
|
28
|
/// Identifikátor stěn.
|
29
|
SIDE
|
30
|
};
|
31
|
|
32
|
/// Pouze nastavuje typ stěny.
|
33
|
/// @param const TYPE type - typ stěny.
|
34
|
Wall(const TYPE type);
|
35
|
|
36
|
/// Funkce pro vytvoření "místnosti".
|
37
|
/// @param QVector3D minimum - minimální bod (nejmenší možné souřadnice)
|
38
|
/// kvádru, ve kterém se nachází křivka.
|
39
|
/// @param QVector3D maximum - maximální bod kvádru pro křivku.
|
40
|
/// @param float sphereRadius - poloměr koule kvůli odsazení zdi od křivky.
|
41
|
void setData(QVector3D minimum, QVector3D maximum, float sphereRadius);
|
42
|
|
43
|
protected:
|
44
|
/// Překrytá funkce. Před každým uložením bodu se musí změnit typ prvku v
|
45
|
/// rodiči. Sice se jedná o stěnu, ale k tomuto identifikátoru se musí
|
46
|
/// pridat hodnota představující UV souřadnici rohu textury, abychom pak
|
47
|
/// v shaderu mohli napojit texturu na body.
|
48
|
/// @param const QVector3D &a - souřadnice prvního vrcholu.
|
49
|
/// @param const QVector3D &b - souřadnice druhého vrcholu.
|
50
|
/// @param const QVector3D &c - souřadnice třetího vrcholu.
|
51
|
/// @param const QVector3D &d - souřadnice ctvrtého vrcholu.
|
52
|
void addTetragon(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &d);
|
53
|
|
54
|
private:
|
55
|
/// Kolikrát se ma rozšířit sloupec nejblíže k pozorovateli a kolikrát
|
56
|
/// se má zúžit sloupec nejdále od pozorovatele. Deformace je lineární.
|
57
|
/// Nastavujte reálnou hodnotu od 0 do 1.
|
58
|
static const float DEFORM;
|
59
|
|
60
|
/// Jak moc se ma zvětšit stěna blíže k uživateli (přední stěna se sice
|
61
|
/// nevykresluje z důvodu zoomování, ale hrany, blíže k uživateli,
|
62
|
/// ostatních stěn tvoří jakýsi ctyřúhelník, který představuje neviditelnou
|
63
|
/// stěnu). Doporučené hodnoty od 0 do 1.
|
64
|
static const float SCALING_FRONT;
|
65
|
|
66
|
/// Jak moc má být zmenšena zadní stěna (stěna za křivkou, tj. nejdále od
|
67
|
/// pozorovatele). Opět doporučené hodnoty od 0 do 1.
|
68
|
static const float SCALING_BACK;
|
69
|
|
70
|
/// Na kolik horizontálních a vertikálních částí se má rozdělit podlaha.
|
71
|
static const int FLOOR_SPLIT;
|
72
|
|
73
|
/// Na kolik horizontálních a vertikálních částí se má rozdělit strop.
|
74
|
static const int CEILING_SPLIT;
|
75
|
|
76
|
/// Na kolik horizontálních a vertikálních částí se mají rozdělit bočni
|
77
|
/// stěny.
|
78
|
static const int SIDE_SPLIT;
|
79
|
|
80
|
/// Podle poloměru koule k-krát navýšit odsazení stěn od křivky.
|
81
|
static const int ENLARGE;
|
82
|
|
83
|
/// O jaký typ stěny se jedná.
|
84
|
TYPE type;
|
85
|
|
86
|
/// Rozděluje stěnu podle toho, kolikrát se do ní má vejít textura.
|
87
|
/// Stěna se kromě jednoduchého rozdělení deformuje, aby byla zdůrazněna
|
88
|
/// perspektiva. Deformace se vždy provádí do pravé strany čtyřúhelníka!
|
89
|
/// Je tedy nutné zadat čtyřúhelník tak, aby se deformace správne provedla.
|
90
|
/// @param const QVector3D &a - souřadnice prvního vrcholu čtyřúhelníka.
|
91
|
/// @param const QVector3D &b - souřadnice druhého vrcholu čtyřúhelníka.
|
92
|
/// @param const QVector3D &c - souřadnice třetího vrcholu čtyřúhelníka.
|
93
|
/// @param const QVector3D &d - souřadnice čtvrtého vrcholu čtyřúhelnika.
|
94
|
/// @param const int parts - na kolik horizontálních a vertikálních částí
|
95
|
/// se má stěna rozdelit.
|
96
|
/// @param const bool deform - jestli má dojít k deformaci stěny. U zadní
|
97
|
/// stěny se totiž deformace nesmí provádet.
|
98
|
void split(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &d, const int parts, const bool deform = true);
|
99
|
};
|
100
|
|
101
|
#endif
|