/** ******************************************************************************* @file /gui/model/mapnet.h @brief Mapa @author Pavel @version 0.1 ******************************************************************************/ #ifndef MAPNET_H #define MAPNET_H #include "gui/engine/Scene.h" #include "world/plan/plan.h" namespace gui{ /// delka strany hexu #define HEX_EDGE_LENGTH 150.0f struct INDEX2D{ int x,y; void operator=(INDEX2D i) {x=i.x; y=i.y;} }; enum TNeighbour { tn_up, tn_rightup, tn_rightdown, tn_down, tn_leftdown, tn_leftup }; #define OWNER_NOONE -1 #define OWNER_MORE -2 class TguiMap; class NET //## { friend class TguiMap; private: World::MAP map; ///< struktura ze ktere se buduje teren TVertex *vert; ///< pole bodu bool *terrained; ///< indikator, jestli na dany bod jiz byl pouzit teren int *owner; ///< index hexu do ktereho bod patri int maxX; ///< pocet hexu ve smeru x int maxY; ///< pocet hexu ve smeru y int bodX; ///< pocet bodu ve smeru x (3*2^n*maxX+1) int bodY; ///< pocet bodu ve smeru y (2^n*(maxY+1)+1) float dx,dy,ddx,ddy; ///< rozmery hexu pocita init (mozna zmenim na konstanty) MX4 RidiciBod; ///< ridici body pro spline-plochu Ridicibod[u+v*4] MX4 MXQ; ///< matice Koef*Q*KoefT void splineBuild(); ///< spocita spline plochu podle ridichich bodu INDEX2D middle(int i, int j); ///< pomocna funkce pro applyLevel: vrati stred daneho hexu [i,j] -> [x,y] float splineAltitude(float u, float v); ///< vrati vysku prislusneho bodu v predem spocitane spline-plose INDEX2D korekt(int i, int j); ///< pomocna funkce: upravi indexy tak aby nezasahovaly mimo plan void bod2vertex(TVertex *v, int ibod); ///< prekopiruje hodnoty z bod[ibod] do *v void compOwners(int i, int j); ///< u vrcholu hexu [j,i] nastavi jako vlastnika hex [j,i] /// do geometrie modelu hexu prida prislusne vrcholy void modelCompVertices(P3DObject obj, int i, int j, TNeighbour part, int firsttriangle); // do [nj,ni] ulozi souradnic souseda [j,i] ve smeru dir void neighbour(int *ni, int *nj, int i, int j, TNeighbour dir); /// vrati texturu pro prechod od me k neighbour int chooseTextureBitmap(World::TERRAIN_TYPE me, World::TERRAIN_TYPE neighbour); /** vstup jsou souradnice [x,z] a vystup jsou indexy bodu, ktere tvori trojuhelnik ve kterem se [x,z] nachazi. Pokud funkce vrati 0, lezi bod mimo plan, jinak vraci jednicku*/ int triangle(float x, float y, int *A, int *B, int *C); int dvenan; ///< urcuje detajlnost modelu float pitchDepth(int i, int j); //< hloubka prohlubne na souradnicich [j,i] (tyka se rek, mori, brodu) void pitch(int i, int j); //< k terenu hexu [i, j] pricte teren koryta reky,... HWTID hwidGrass; ///< textura travy HWTID hwidRock; ///< textura skaly HWTID hwidRockGrass; ///< textura prechodu od skaly ke trave HWTID hwidGrassRock; ///< textura prechodu od skaly ke trave HWTID hwidWater; ///< textura pro vodu HWTID hwidSwamp; ///< textura pro bazinu HWTID hwidRockSwamp; ///< prechod od skaly k bazine HWTID hwidSwampRock; ///< prechod od baziny ke skale HWTID hwidGrassSwamp; ///< prechod od travy k bazina HWTID hwidSwampGrass; ///< prechod od baziny k trave public: void init(World::MAP _map); ///< alokuje prostor pro hexy a body a nastavy konstanty void done(); ///< uvonli pamet void applyLevel(); ///< vymodeluje sit podle dat ve word/map/map void applyTeren(); ///< upravi sit podle modelu hexu pro teren void compNormals(); ///< spocita normaly ve vsech bodech site TModel *model(int i, int j); ///< vytvori model hexu o souradnicich [j,i] TModel *waterModel(int i, int j); ///< vytvori model vodni hladiny pokud je na [j, i] voda // void drawhex(INDEX2D *h); }; } #endif