1 |
c137512e
|
Oto Šťáva
|
#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
|