Projekt

Obecné

Profil

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