#ifndef _WALL_HPP #define _WALL_HPP #include "element.hpp" /// Instance třídy Wall představují vykreslované stěny. Jednotlivé typy stěn mohou /// mít jiné textury (viz výčtovy typ TYPE). Stěny se odsadí od křivky podle /// poloměru koule a nastaveného atributu ENLARGE. Zvětšení (zmenšení) přední a /// zadní stěny mají na starosti atributy SCALING_*. Ke každému typu stěny je /// přidělen atribut představující, na kolik částí se má daná stěna rozdělit, resp. /// kolikrát se do ní má vykreslit textura, viz atributy *_SPLIT. Kvůli posílení /// dojmu hloubky stěn dochází k deformaci i při rozdělovani stěn. Sloupce na /// stěnách dále od pozorovatele se zužují. Atribut DEFORM definuje, kolikrát má /// být sloupec nejblíže k pozorovateli širší a kolikrát má být sloupec nejdále /// od pozorovatele užší. Zužování sloupců pak probíhá lineárně. DEFORMACE PROBÍHÁ /// SMĚREM DOPRAVA PRO KAŽDOU STĚNU, JE TEDY NUTNÉ SPRAVNĚ ZADAT VRCHOLY DEFINUJÍCÍ /// DANOU STĚNU. class Wall: public Element { public: /// Pro každý typ jiná textura. enum TYPE { /// Identifikátor podlahy. FLOOR = 0, /// Identifikátor stropu. CEILING, /// Identifikátor stěn. SIDE }; /// Pouze nastavuje typ stěny. /// @param const TYPE type - typ stěny. Wall(const TYPE type); /// Funkce pro vytvoření "místnosti". /// @param QVector3D minimum - minimální bod (nejmenší možné souřadnice) /// kvádru, ve kterém se nachází křivka. /// @param QVector3D maximum - maximální bod kvádru pro křivku. /// @param float sphereRadius - poloměr koule kvůli odsazení zdi od křivky. void setData(QVector3D minimum, QVector3D maximum, float sphereRadius); protected: /// Překrytá funkce. Před každým uložením bodu se musí změnit typ prvku v /// rodiči. Sice se jedná o stěnu, ale k tomuto identifikátoru se musí /// pridat hodnota představující UV souřadnici rohu textury, abychom pak /// v shaderu mohli napojit texturu na body. /// @param const QVector3D &a - souřadnice prvního vrcholu. /// @param const QVector3D &b - souřadnice druhého vrcholu. /// @param const QVector3D &c - souřadnice třetího vrcholu. /// @param const QVector3D &d - souřadnice ctvrtého vrcholu. void addTetragon(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &d); private: /// Kolikrát se ma rozšířit sloupec nejblíže k pozorovateli a kolikrát /// se má zúžit sloupec nejdále od pozorovatele. Deformace je lineární. /// Nastavujte reálnou hodnotu od 0 do 1. static const float DEFORM; /// Jak moc se ma zvětšit stěna blíže k uživateli (přední stěna se sice /// nevykresluje z důvodu zoomování, ale hrany, blíže k uživateli, /// ostatních stěn tvoří jakýsi ctyřúhelník, který představuje neviditelnou /// stěnu). Doporučené hodnoty od 0 do 1. static const float SCALING_FRONT; /// Jak moc má být zmenšena zadní stěna (stěna za křivkou, tj. nejdále od /// pozorovatele). Opět doporučené hodnoty od 0 do 1. static const float SCALING_BACK; /// Na kolik horizontálních a vertikálních částí se má rozdělit podlaha. static const int FLOOR_SPLIT; /// Na kolik horizontálních a vertikálních částí se má rozdělit strop. static const int CEILING_SPLIT; /// Na kolik horizontálních a vertikálních částí se mají rozdělit bočni /// stěny. static const int SIDE_SPLIT; /// Podle poloměru koule k-krát navýšit odsazení stěn od křivky. static const int ENLARGE; /// O jaký typ stěny se jedná. TYPE type; /// Rozděluje stěnu podle toho, kolikrát se do ní má vejít textura. /// Stěna se kromě jednoduchého rozdělení deformuje, aby byla zdůrazněna /// perspektiva. Deformace se vždy provádí do pravé strany čtyřúhelníka! /// Je tedy nutné zadat čtyřúhelník tak, aby se deformace správne provedla. /// @param const QVector3D &a - souřadnice prvního vrcholu čtyřúhelníka. /// @param const QVector3D &b - souřadnice druhého vrcholu čtyřúhelníka. /// @param const QVector3D &c - souřadnice třetího vrcholu čtyřúhelníka. /// @param const QVector3D &d - souřadnice čtvrtého vrcholu čtyřúhelnika. /// @param const int parts - na kolik horizontálních a vertikálních částí /// se má stěna rozdelit. /// @param const bool deform - jestli má dojít k deformaci stěny. U zadní /// stěny se totiž deformace nesmí provádet. void split(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &d, const int parts, const bool deform = true); }; #endif