#ifndef _ELEMENT_HPP #define _ELEMENT_HPP #include #include using namespace std; /// Třída Element je rodičem pro všechny prvky, které se objevují ve vykreslované /// scéně (dráha, koule, ... ). class Element { public: /// Určuje, kolik hodnot za sebou ve vektoru DATA odpovídá jednomu vrcholu. static const int DATA_COUNT_FOR_VERTEX; /// Konstruktro. Konstruktor nastavuje typ prvku, tj. jestli se jedná o dráhu, kouli, /// apod. Typ prvku pak jde do OpenGL shader programu, kde se určuje, /// jaké natočení, posunutí, barva, atd. se má použít pro daný prvek. /// @param const int category - typ prvku. Element(const int category); /// @return konstantní ukazatel na hodnoty uložené ve vektoru DATA. const float *getData() const; /// @return počet hodnot uložených ve vektoru DATA. int dataCount() const; /// @return počet vrcholu, pro které jsou uloženy informace ve vektoru DATA. int vertexCount() const; protected: /// Identifikátor dráhy. /// Identifikátor dráhy. static const int TRAJECTORY; /// Identifikátor koule. static const int SPHERE; /// Identifikátor statické koule. static const int SPHERE_FIXED; /// Identifikátor šipky. static const int ARROW; /// Identifikátor speciální šipky (šipka, která je pouze informativní). static const int ARROW_SPECIAL; /// Identifikátor stěny. static const int WALL; // Nastavený typ prvku, tj. jestli se jedná o drahu, kouli, apod. int category; /// Uloží do vektoru DATA hodnoty týkající se daného vrcholu v. /// @param const QVector3D &v - souřadnice daného vrcholu. /// @param const QVector3D &n - normála pro vrchol v. void addVertex(const QVector3D &v, const QVector3D &n); /// Ze vstupních bodů vytvoří ctyřúhelník, který rozdělí na dva trojúhelníky. /// Poté, pro oba trojúhelníky, vypočte normály a zavolá funkci /// addTriangleWithNormal(). /// @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 čtvrtého vrcholu. void addTetragon(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &d); /// Ze vstupních bodů vytvoří trojúhelník, vypočte normálu a zavolá /// funkci addTriangleWithNormal(). /// @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. void addTriangle(const QVector3D &a, const QVector3D &b, const QVector3D &c); /// Funkce pro vypočtení normály daného trojuhelníka. /// @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. /// @return vypoctenou normálu pro dany trojúhelník. QVector3D normal(const QVector3D &a, const QVector3D &b, const QVector3D &c); /// Vyčistí vektor DATA (využíváno, když se přepínají dráhy). void clear(); private: /// Datová struktura pro uložení informací (reálnych hodnot) pro každý vrchol. vector data; /// Pouze volá, pro každý vrchol, funkci addVertex(). /// @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 &n - normála pro trojúhelník ABC. void addTriangleWithNormal(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &n); }; #endif