
\part{Klientská část}

\section{Úvod}

\subsection{ Instalace }
Klient je napsaný v jazyce $C++$ ve vývojovém prostředí Visual Studio 2010. Nejaktuálnější verzi zdrojových kódů klienta je možné stáhnout z následující adresy.
 
 
\begin{center}
\begin{tabular}{|c|}
\hline
\textbf{Url}: http://xp-dev.com/svn/DivergentTerritory \\
\textbf{Login}: AnonimniUzivatel \\
\textbf{Heslo}: aa4Smn1N \\
\hline
\end{tabular}
\end{center}


Kromě standardních C++ knihoven využívá klient také dvě externí knihovny: Qt a Cg.Tyto knihovny je potřeba na začátku ručně  doinstalovat.

\subsubsection{ Qt knihovna}
Klient disponuje velkým množstvím widgetů jako například okna, panely, tabulky nebo tlačítka.
Proto jsme se rozhodli použít knihovnu usnadňující GUI programování. Knihovnu Qt jsme potom vybrali z několika hlavních důvodů.

\begin{enumerate}

\item Multiplatformnost: klient je v současné verzi kompatibilní pouze s PC vybaveným operačním systémem  Windows. Případná portace na jiný OS nebo platformu by však s ohledem na použité knihovny neměla představovat zásadnější problém.

\item Stylovatelnost: GUI prvky v Qt je možné jednoduše měnit pomocí tzv. Stylesheets. Ty umožňují kompletně předefinovat vzhled jednotlivých grafických komponent a tím dodat aplikaci originální grafický styl.

\end{enumerate}

V našem projektu používáme Qt ve verzi 4.7.1, nicméně problém by neměl nastat ani s vyššími verzemi knihovny. 
Knihovnu Qt je možné stáhnout z těchto stránek.

\url{ http://qt.nokia.com/products/ }

Staženou knihovnu je nakonec potřeba  nainstalovat a zkompilovat.
Podrobnější informace o kompilaci je možné najít například na níže uvedených stránkách.

\url{ http://thomasstockx.blogspot.com/2011/03/qt-472-in-visual-studio-2010.html }

\subsubsection{ Cg knihovna }
Cg je knihovna pro práci s shadery. Shadery jsou krátké programy běžící přímo na grafické kartě. To nám mimo jiné umožňuje programování pokročilých grafických efektů prosřednicvím  vertex a pixel shaderů.
Knihovnu Cg je možné stáhnout z uvedeného odkazu níže.

\url{ http://developer.nvidia.com/cg-toolkit }.


\subsection{Hardwarové požadavky klienta}

\begin{center}
\begin{tabular}{|c|}
\hline
512 MB RAM\\
1 GHz procesor\\
Grafická karta s alespoň 256 MB VRAM a podporou
OpenGL 2.0 \\
DVD mechanika\\
Windows 2000 nebo novější\\
disk 100 MB instalace\\
\hline
\end{tabular}
\end{center}

\paragraph{}
Poznámka: Uvedená sestava představuje minimální hardwarové požadavky pro úspěšné spuštění hry. Pro plynulé hraní za každé situace může být vyžadována konfigurace podstatně výkonější.

\subsection{Testovací sestavy}
Klient byl úspěšně otestován na následujících hardwarových konfiguracích.


\begin{center}
\begin{tabular}{ | l | l | l | p{4cm} |}
\hline
CPU & RAM & GPU & OS \\ \hline
Intel Core 2 Q6600 & 4GB & NVidia GTX470 & Windows7 64bit \\ \hline

Intel Core i3 330M  & 4GB & ATI Mobility Radeon HD5470 & Windows7 32bit \\ \hline

Intel Core 2 Q6600 & 4GB & NVidia 8800GTX & Windows Vista 32bit  \\ \hline 

AMD Athlon II X4 620 & 4GB & NVidia 8800GTS &  Windows XP SP3
\\ \hline


Intel Core 2 Q9550 & 4GB & NVidia 9800GT &  Windows XP SP3
\\ \hline

%TODO presny model CPU a GPU !!!
Intel Core 2 ??? & 2GB & ??? &  Windows XP SP3 \\ \hline

AMD Athlon 64 3000+ & 2GB & Ati Radeon HD 2600XT & Windows XP SP2  \\ \hline


\hline
\end{tabular}
\end{center}


\section{Matematematické knihovny}

\subsection{ Matice }

\dspFuncName{Matrix4x4<T>} je třída určená pro práci s 4x4 maticemi. Uspořádání prvků matice je sloupcově dominantní:

$
 Matrix4x4<T> =
 \begin{pmatrix}
 a_0 & a_4 & a_8 	 & a_{12} \\
 a_1 & a_5 & a_9 	 & a_{13}  \\
 a_2 & a_6 & a_{10} & a_{14}  \\
 a_3 & a_7 & a_{11} & a_{15}
 \end{pmatrix}
$.


Prvky $a_{12}$, $a_{13}$ a $a_{14}$ definuji posun na osách x,y,z. Rozložení prvků v matici tak můžeme napsat jako:

$
 Matrix4x4<T> =
 \begin{pmatrix}
  a_0 & a_4 & a_8 	 & posunX \\
  a_1 & a_5 & a_9 	 & posunY  \\
  a_2 & a_6 & a_{10} & posunZ  \\
  a_3 & a_7 & a_{11} & a_{15}
 \end{pmatrix}
$.  

Reprezentace matice je plně kompatibilní s OpenGL maticemi a třídami \dspFuncName{Point\_3<T>} a \dspFuncName{Vector\_3<T>}, které lze maticemi jednoduše transformovat.

Třída dále nabízí základní binarní maticove operace 
jako je sčítání, odečítání a násobení. Matici můžeme také vynásobit sloupcovým nebo řádkovým vektorem a získat tak vektor přetransformovaný danou maticí.
K dispozici jsou dále metody pro nahrání nulové, jednotkové, tranlační, rotační a měřítkové (scale) matice. Implementovány jsou i jejich zakladni operace: rotace, posun a zmena měřítka.

\begin{itemize}
\item 
$
 identita =
 \begin{pmatrix}
  1 & 0 & 0 & 0 \\
  0 & 1 & 0 & 0  \\
  0 & 0 & 1 & 0  \\
  0 & 0 & 0 & 1
 \end{pmatrix}
$

\item 
$
 posun =
 \begin{pmatrix}
  1 & 0 & 0 & posunX \\
  0 & 1 & 0 & posunY  \\
  0 & 0 & 1 & posunZ  \\
  0 & 0 & 0 & 1
 \end{pmatrix}
$

\item 
$
 rotace =
 \begin{pmatrix}
  rotaceXX & rotaceYX & rotaceZX & 0 \\
  rotaceXY & rotaceYY & rotaceZY & 0  \\
  rotaceXZ & rotaceYZ & rotaceZZ & 0  \\
  0 & 0 & 0 & 1
 \end{pmatrix}
$

\item 
$
 \text{měřítko} =
 \begin{pmatrix}
  \text{měřítkoX} & 0 & 0 & 0 \\
  0 & \text{měřítkoY} & 0 & 0  \\
  0 & 0 & \text{měřítkoZ} & 0  \\
  0 & 0 & 0 & 1
 \end{pmatrix}
$
\end{itemize}

\subsection{ Vektor }
\dspFuncName{Vector\_3 <T>} je třída obsahující metody pro práci s vektory ve 3-rozměrném euklidovském prostoru. 
Obsahuje pomocné metody pro operace typu vektor-vektor i typu vektor-skalár. 
Dva vektory tak lze sčítat a odečítat, počítat skalární i vektorový součin nebo úhel, který spolu 2 vektory svírají.
K vektoru je dále možné přičítat a odečítat skaláry, případně ho násobit nebo dělit skalárem.
Vektor je můžeme také rotovat, počítat jeho velikost nebo ho normalizovat na vektor jednotkové délky.


\subsection{ Bod }
\dspFuncName{Point\_3<T>} je třída obsahující metody pro práci s body v 3-rozměrném euklidovském prostoru.
Třída obsahuje metody pro operace typu bod-bod a bod-vektor. 
Mezi 2 body je tak možné například počítat euklidovskou vzdálenost, odečíst je od sebe a tim získat 
vektor rozdílu a další. K bodu můžeme přičítat nebo odečítat vektor a tím bod posouvat ve směru vektoru .

\subsection{ Vektor vs Bod }
Třídy \dspFuncName{Point\_3<T>} a \dspFuncName{Vector\_3<T>} jsou si poměrně podobné a mají společnou část implementace. Hlavní rozdíl
je v pojmenování metod a koncepci, ke které jsou určeny.
Mezi tím co například sčítání 2 vektorů je dobře definovaná operace, sčítat 2 body nelze. 
Podobně je například možné určit velikost vektoru nebo vektor normalizovat, kdežto s body tyto operace nemají rozumnou interpretaci a smysl.
Tento system rozdělení je výhodný zejména ze dvou důvodů: 

\begin{enumerate}
\item  Poskytuje zvýšenou typovou bezpečnost, vektory a body jsou odlišného typu.
\item Umožňuje intuitivnější náhled na problém. Uvedeným typovým odlišením je na první pohled zřejmé, zda na proměnou nahlížet jako na bod nebo vektor.
\end{enumerate}

 
Interně jsou body a vektory implementovány čtveřicí atributů ( x,y,z,w ). 
Složky x,y,z udávají pozici nebo směr na jednotlivých osách. Poslední atribut w je pro body roven 1, pro vektory roven 0 a slouží pro rozšířené maticové operace tak, jak jsou definovány v OpenGL.


$
 Point\_3<T> = ( x, y, z, 1 )
$


$
 Vector\_3<T> = ( x, y, z, 0 )
$



Násobení translační 4x4 matice vektorem zanechá vektor beze změny. 


$
\begin{pmatrix} 
 	1 & 0 & 0 & posunX \\
  	0 & 1 & 0 & posunY  \\
  	0 & 0 & 1 & posunZ  \\
  	0 & 0 & 0 & 1
\end{pmatrix} \cdot \begin{pmatrix}
  						x \\
  						y \\
  						z \\
  						0
 					\end{pmatrix} =  ( x, y, z, 0 )  
$


Násobení bodu stejnou tranformační maticí způsobí posun bodu v závislosti na použité translační matici.


$
\begin{pmatrix} 
 	1 & 0 & 0 & posunX \\
  	0 & 1 & 0 & posunY  \\
  	0 & 0 & 1 & posunZ  \\
  	0 & 0 & 0 & 1
\end{pmatrix}  \cdot \begin{pmatrix}
  						x \\
  						y \\
  						z \\
  						1
 					\end{pmatrix} = ( x + posunX, y + posunY, z + posunZ, 1)
$


Mezi vektory a body je samozřejmě možne provádět explicitní konverzi v případě, že je taková operace potřeba.



\section{ Podpora pro vykreslovaní }

\subsection{ Proces vykreslovaní }
Rendering je poměrně složitý a komplexní proces. Kompletní postup od inicializace, zobrazení až po uvolnění použitých prostrředků můžeme rozdělit na několik částí. 

\begin{enumerate}
\item inicializace OpenGL
\item nahrání textur na GPU
\item nahrání geometrie na GPU
\item nastavení kamery, světel a objektů scény
\item render scény (odkazuje se na data nahraná na GPU )
\item zobrazení vyrenderované scény v přednastaveném okně
\item smazání GPU dat
\item uvolnění ostatních OpenGL prostředků
\end{enumerate}


% TODO, tohle pripadne trochu zvelebit, rozepsat a zformatovat
%-model ma matici -> ta transformuje geometrii, rika kam %vykreslit
%-model ma MeshObject
%	1.	VBOid ( kterou geometrii ulozenou na GPU pouzit )
%	2.	Material ptr  ( vlastnosti materialu ktery na geometrii %aplikovat )
%	3.	TextureId array ( ktere textury ulozene na GPU na %geometrii aplikovat )


\subsection{ Render třídy }
\subsubsection{ AbstractRender }
\dspFuncName{AbstractRender} je abstraktní bázová třída zajišťující render. 
Primárně je třída navržena pro použití s GPU renderem.
Rozhraní je tak přednostně uzpůsobeno možnostem a logice grafických karet.
\dspFuncName{AbstractRender} definuje základ společného rozhraní, které musí všechny odvozené renderovací třídy implementovat.
Logiku a postup při vykreslování můžeme shrnout do následujícího seznamu. 

\begin{enumerate}
\item nastaveni parametrů třídy ( kam a jak renderovat )

\item zahájení renderu nového snímku zavoláním metody \dspFuncName{beginFrame()}
 
\item kreslení geometrie scény

\item ukončení renderu snímku a zobrazení výsledného obrázku zavoláním metody \dspFuncName{endFrame()}

  
\end{enumerate}

\subsubsection{ Render }
\dspFuncName{Render} třída je odvozena od \dspFuncName{AbstractRender}, je navržena pro perspektivní rendering a 
implementována prostřednictvím OpenGL.
Kromě základního rozhraní předepsaného třídou \dspFuncName{AbstractRender} poskytuje třída velké množství dalších funkcí. 
Můžeme tak renderovat základní geometrické tvary jako je čára, kružnice, koule nebo třeba polygon.
Dále je možné renderovat komplexnější geometrii jako například 
modely, částice, billboardy, obrázky nebo bitmapový text.
Před začatkem renderu každého nového snímku je navíc možné nastavovat parametry kamery, z jejíž pohledu se scéna bude renderovat.

\subsubsection{ GLPhongRender }
Rozšiřuje možnosti třídy \dspFuncName{Render} o osvětlování geometrie prostřednictvím Phongova světelného modelu.
Tento výpočet je prováděn per-pixel pomocí dodáváného shaderu.
Shader kompatibilní s touto třídou je uložen v adresáři \dspFuncName{kodiak/shaders/phongShaderSoftProj.cg}.

\subsubsection{ SoftProjRender }
Render třída odvozená od předešlého \dspFuncName{GLPhongRender}, obsahuje další pomocné kreslící funkce napsané na míru potřebám hry.

\subsection{ Vertex Buffer Object správce }
\dspFuncName{VBOmanager} je správce dat pro práci s grafickými primitivy 
uloženými přímo v paměti grafické karty. Prostřednictvím této třídy
může uživatel nahrávat na grafickou kartu geometrii: pole vertexů, 
normál a texturovacích koordinátů. K nim lze poté prostřednictvím
vrácených OpenGL identifikátorů přistupovat. 
Tyto identifikátory jsou ukládány společně s uživatelem 
definovaným názvem do databáze. Prostřednictvím zadaného názvu je možné získat data uložená v databázi a dále s nimi potom pracovat.

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=1.2]{./VBOmanager.pdf}
	\caption{Vertex Buffer Object: nahrání nové geometrie. }
\end{center}					
\end{figure}

\subsection{ Textury }
\dspFuncName{TextureManager} je singleton třída sloužící ke správě OpenGL textur. 
\dspFuncName{TextureManager} umožňuje nahrávat textury, mazat je a dále s nimi pracovat.
Po vložení textury dojde k jejímu nahrání do paměti grafické karty.
S nahranou texturou potom můžeme pracovat pouze nepřímo pomoci navráceného OpenGL identifikátoru.
Tento identifikátor se spolu s uživatelsky definovaným názvem textury ukláda v databazí. K texturovým OpenGL identifikátorům tak můžeme s pomocí databáze přistupovat i pod uživatelem zadaným názvem a s texturami tak pohodlně pracovat.

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=1.2]{./textureManager.pdf}
	\caption{Texture manager: práce s texturou. }
\end{center}					
\end{figure}


\subsection{ Materiály }
Třída \dspFuncName{Material} je abstraktní bázová třída každého materiálu. 
Od ní je odvozena třída \dspFuncName{PhongMaterial}. Ta obsahuje následující atributy materiálu.

\begin{itemize}
\item float ambient[3]
	\\ RGB trojice ambientní složky materiálu.
\item float diffuse[3]
	\\ RGB trojice difůzní složky materiálu.
	
\item float specular[3]
	\\ RGB trojice glossy složky materiálu.
\item float exponent
	\\ exponent určující chování lesklého materiálu.
\end{itemize}

Tyto parametry jsou potřebné pro výpočet osvětlení pomocí Phongova osvětlovacího modelu, který bude popsán v jedné z následujících částí.


\subsection{ Phongův světelný model }
Phongův světelný model aproximuje osvětlení ve scéně rozdělením na 3 části.

\begin{enumerate}
  	\item ambientní složka
	\item difůzní  složka
	\item lesklá (glossy) složka
\end{enumerate}


Ambientní osvětlení spočteme jako: $Final_{ambient} = C_{a} \cdot I_{a}$, kde
\begin{itemize}
\item $C_{a}$ je ambientní složka materiálu
\item $I_{a}$ je ambientní složka světla
\end{itemize}
.

Difůzní složku osvětlení spočteme jako: $Final_{diffuse} = C_{d} \cdot I_{d} \cdot (N \cdot L)$, kde
\begin{itemize}
\item $C_{d}$ je difůzní složka materiálu
\item $I_{d}$ je difůzni složka světla
\item $N$ je normála povrchu
\item $L$ je vektor světla
\end{itemize}
.

Glossy složka je určena vztahem: $Final_{glossy} = C_s \cdot I_s \cdot (V \cdot R)^n$, kde
\begin{itemize}
\item $C_s$ je lesklá složka materiálu
\item $I_s$ je lesklá složka světla
\item V je vektor pohledu
\item R je vektor idealního odrazu dopadajícího světla
\item n je exponent určující další nastavení lesklosti
\end{itemize}.

Výsledné osvětlení nakonec spočteme součtem všech tří uvedených komponent: 
$Final_{radiance} = Final_{ambient} + Final_{diffuse} + Final_{glossy}$.


\begin{figure}[H]
\begin{center}
	\includegraphics[scale=0.7]{./phongPicture.pdf}
	\caption{Phongův světelný model }
\end{center}					
\end{figure}


\subsection{Načítání geometrie z externích souborů}
Program podporuje načítání geometrie ze 2 externích formátů: výškové mapy a OBJ souboru.

\subsubsection{ Výšková mapa }
Výšková mapa je obvykle reprezentovaná ve formě textury. Pozice texelu společně s jeho hodnotou udává souřadnice vrcholu. Konverzi takového vstupu na vertexy, normály a texturové koordináty zajišťuje třída \dspFuncName{HeightMapImporter}. Vrácená a zpracovaná data je potom možné nahrát prostřednictvím třídy \dspFuncName{VBOmanager} do paměti grafické karty.

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=1.2]{./heightMap.pdf}
	\caption{Schéma: data zdrojové textury vlevo a vpravo výsledná geometrie }
\end{center}					
\end{figure}

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=0.6]{./example0Part0.png}
	\caption{Ukázka výškové textury... }
\end{center}					
\end{figure}


\begin{figure}[H]
\begin{center}	
		\includegraphics[scale=0.85]{./example0Part1.png}
	\caption{...a z ní vygerenované geometrie. }
	
\end{center}					
\end{figure}



\paragraph{Skriptování}
Hlavní výhodou výškových map je jejich jednoduchost. Práce s nimi je intuitivní a lze pomocí nich vytvářet rychle geometrii terénu. My jsme tento systém rozšířili ješte o systém operátorů, kdy lze výškové mapy dále upravovat. K dispozici jsou operace typu výšková mapa - výšková mapa i výšková mapa - skalár. Můžeme tak například sečíst 2 výškové mapy, výdělit jejich součet dvěma a tím získat zprůměrovanou výškovou mapu apd.
Systém operátorů je doplněn o jednoduchý matematický parser, prostřednictvím kterého lze skriptovat geometrii ( viz soubory \dspFuncName{MathParser.h} a \dspFuncName{MathTextureParser.h} \dspFuncName{TextureOperationParser.h}.

\pagebreak[4] 
Ukázka skriptu:
\begin{lstlisting}
geometryScript "tex1.tga"+( 0.5 * "tex2.tga" )
\end{lstlisting}

	\begin{figure}[H]
	\begin{center}	
		\includegraphics[scale=0.5]{./tex1.png}
		\caption{ tex1.tga }
	\end{center}					
	\end{figure}

	\begin{figure}[H]
	\begin{center}	
		\includegraphics[scale=0.5]{./tex2.png}
		\caption{ tex2.tga }
	\end{center}					
	\end{figure}

	\begin{figure}[H]
	\begin{center}	
		\includegraphics[scale=0.5]{./tex2_div2.png}
		\caption{  0.5 * tex2.tga }
	\end{center}					
	\end{figure}


	\begin{figure}[H]
	\begin{center}	
		\includegraphics[scale=0.5]{./tex3.png}
		\caption{ tex1.tga + ( 0.5 * tex2.tga ) }
	\end{center}					
	\end{figure}


\subsubsection{ OBJ a MTL formát }

\paragraph{OBJ}
OBJ je  poměrně oblíbený grafický formát, který je podporován většinou modelovacích nástrojů jako například 3D Studio Max nebo Maya. Formální spefikace formátu je k dispozici například na  \url{ http://paulbourke.net/dataformats/obj/ }.
K jeho načítání formátu slouží třída \dspFuncName{ModelOBJ<T>}. Ta přečte a naparsuje data ze souboru a vrátí zpracovaná data k dalšímu použití. Ty můžeme dále opět s pomoci třídy \dspFuncName{VBOmanager} uložit na grafickou kartu.

\paragraph{ MTL }
S OBJ formátem velmi úzce souvisí MTL formát. Ten definuje materiály a geometrie specifikovná v OBJ formátu se do tohoto souboru odkazuje. Parsování obstarává třída \dspFuncName{MTLreader} a správu materiálů potom třída \dspFuncName{MaterialManager<T>}
 Podrobnosti k formátu je možné získat zde  \url{ http://paulbourke.net/dataformats/mtl/ }.
Materiál kromě atributů popisující jeho vlastnosti ( viz třída \dspFuncName{Material} ) může obsahovat i názvy textur, které používá. Textury jsou podobně jako geometrie uložena ve VRAM paměti odkud je možné s nimi při kreslení rychleji pracovat ( viz výše popsaný \dspFuncName{TextureManager} ).


\begin{figure}[H]
\begin{center}
	\includegraphics[scale=1.5]{./OBJ_MTL_process.pdf}
	\caption{Proces zpracovaní *.obj a *.mtl souborů. }
\end{center}					
\end{figure}



\begin{figure}[H]
\begin{center}
	 %\setlength{\evensidemargin}{-.8in}
	\includegraphics[scale=1.9]{./ModelOBJ.pdf}
	\caption{ModelOBJ objekt }
\end{center}					
\end{figure}


\subsection{Model}
Třída \dspFuncName{Model} slouží k reprezentaci komplexních objektů v 3-rozměrném prostoru. 
Pozice, velikost a orientace objektu je definovana pomocí matice třídy \dspFuncName{Matrix4x4<T>}, 
kterou jsme popsali v jedné z předchozích částí dokumentace. 
Každý model se dále skládá z jedné nebo více homogenních částí, tak zvaných Meshů.
Mesh je skupina polygonů používající společnou sadu vertexů, 
texturovacích koordinátů, normál, materiálů a textur. 
Mesh reprezentujeme prostřednictvím třídy \dspFuncName{MeshObject}. 
\dspFuncName{MeshObject} obsahuje informace o použitých texturách, materiálu a geometrii objektu.

\pagebreak[4] 
\begin{lstlisting}
class Model
{
private:
	Matrix4X4<float> modelMatrix;
	vector<MeshObject> meshes;

public:
	...
};
\end{lstlisting}


\subsection{Kamera}
Třída \dspFuncName{Camera<T>} slouží k práci s kamerou v 3-rozměrném prostoru. Nastavovat můžeme pozici nebo směr pohledu kamery a tím měnit pohled na scénu. Pro pohodlnější práci s kamerou nabízí třída řadu pomocných metod jako například posun kamery ve směru pohledu, otáčení kamery a další. 
Konfigurace kamery je určena následujícími atributy.
\begin{itemize}
\item $Point\_3<T> pos$		
	\\Určuje umístění kamery.
\item $Vector\_3<T> look$		
	\\Určuje směr, kterým se kamera dívá.
\item $Vector\_3<T> right$		
	\\Určuje kde je z pohledu kamery pravá strana.
	
\item $Vector\_3<T> up$		
	\\Určuje kterým směrem je z pohledu kamery vzhůru. Dopočítává se automaticky jako kolmice na look a right vektor.
\end{itemize}


\begin{figure}[H]
\begin{center}
	\includegraphics[scale=0.8]{./camera.pdf}
	\caption{Kamera }
\end{center}					
\end{figure}

\subsection{ Proces zpracování a zobrazení geometrie}

\begin{enumerate}
\item Načtení geometrie. 
Nejprve je potřeba načíst a rozparsovat geometrii modelu ze souboru.
Načítat lze geometrii ve formě výškové mapy nebo z ve formátu OBJ.


\item Zpracování geometrie.
Načtenou geometrii v dálší části převádíme do podoby kompatibilní s OpenGL Vertex Array a tu pak ukládáme prostřednictvím OpenGL VBO do paměti grafické karty. Tím že máme geometrii uloženou přímo na GPU výrazně snižujeme objem dat která je potřeba během renderingu přenášet mezi CPU a GPU. Tím zásadním způsobem urychlujeme kreslení geometrie.

\item Načtení materiálů a textur.
V další části je potřeba načíst a zpracovat materiály a textury, které geometrie používá. Program podporuje načítání materiálů ve formátu MTL.

\item Tvorba modelu. V této chvíli máme načtenou a zpracovanou geometrii a materiály modelu. Odkazy na geometrii a materiály máme uloženy ve správci geometrie a materiálu. Můžeme tak jednoduše vytvořit model používající
uloženou geometrii a materiály ( viz dříve popsaná třída \dspFuncName{Model} ).

\item Kreslení modelu. Na závěr můžeme vytvořený model jednoduše vykreslit prostřednictvím dříve popsané třídy \dspFuncName{Render}.

\end{enumerate}

\subsection{ Částicový systém}
Grafický engine je vybaven také podporou částicový systémů. Částicový systém je rozdělen na 2 části: částice a správce částic.

\subsubsection{ Částice }
Částice je jednoduchý objekt s jehož pomocí se simulují různé objekty bez pevně dané struktury jako například kouř, sníh, tryskající voda a další.

\paragraph{ \dspFuncName{BasicParticle} }
Je základní třída reprezentující částici. Třída obsahuje následující atributy.

\begin{itemize}
\item \dspFuncName{Vector\_3<float>} velocity	\\
	Udává rychlost a směr pohybu částice.

\item float acceleration			\\
	Udává zrychlení částice ve směru pohybu.
	
\item 	float lifeTime		\\
	Životnost částice.

\item 	\dspFuncName{Point\_3<float>} position		\\
	Pozice částice.

\end{itemize}

Třída dále obsahuje metodu \dspFuncName{simulate()}, která pomocí nastavených atributů částice provádí simulaci. K simulaci používáme Eulerovskou diskrétní metodu prvního řádu.

\pagebreak[4]
\begin{lstlisting}
void BasicParticle::simulate( float dt )
{
   this->velocity += this->acceleration * dt;
   this->position += this->velocity * dt;
   this->lifeTime -= dt;
}
\end{lstlisting}

\paragraph{ \dspFuncName{GraphicParticle}}
Je pokročilá částicová třída odvozená od \dspFuncName{BasicParticle}.
Obsahuje navíc atributy popisující částici z grafického hlediska.

\begin{itemize}
\item float colorOffset[4]	\\
		Určuje jak se bude měnit barva částice během simulace.
		
\item	float sizeOffset	\\
		Určuje jak se bude měnit velikost částice během simulace.


\item	float color[4]		\\		
		Určuje aktuální barvu částice.
		
\item	float size			\\
		Určuje aktuální velikost částice. Částice je vždy čtvercová o délce strany size.
		
\item	unsigned int textureID	\\
		Identifikátor textury, která se má na částic namapovat.

\end{itemize}

\dspFuncName{GraphicParticle} rozšiřuje metodu \dspFuncName{simulate()} o simulaci nově přidaných atributů. Dále potom přidává metodu \dspFuncName{render()}. Ta zajišťuje vykreslení částice podle jejích parametrů do aktuálního OpenGL kontextu.


\subsubsection{ Správce částic }
Emitor je objekt, který spravuje existující částice. Základ tvoří třída \dspFuncName{BasicEmittor}.
Ta obsahuje metody \dspFuncName{simulate()} a \dspFuncName{garbageRequest()}.

Metoda \dspFuncName{simulate()} iteruje polem částic a na každou částici volá její metodu \dspFuncName{simulate()}, kterou každá částice obsahuje.
Metoda \dspFuncName{garbageRequest()} odstraní staré, neaktivní částice.

Další metody jako například \dspFuncName{emitNewParticles()} a jiné je nutné dodefinovat v odvozené třídě v závislosti na konkrétních potřebách emitoru.

     
\section{Vlastní hra}     
\subsection{Hvězdná mapa} 
Hvězdná mapa zobrazuje vesmír v okolí aktivní lodě. Hvězdná mapy je rozdělena do dvou logických částí, režim makro a mikro mapy.

\subsubsection{Mikro mapa} 
Zobrazuje detailní náhled na nejbližší okolí hráčovi lodě. V tomto režimu jsou vidět jednotlivé lodě a planety. Mikro mapa je spravována prostřednictvým třídy 
\dspFuncName{ MapFunctionality }. Ta ve spolupráci s třídou \dspFuncName{ SoftProjRender } zajišťuje renderování okolního vesmíru, jehož komponenty si v krátkosti popíšeme.

\begin{itemize}

\item Lodě \\
Reprezentujeme je třídou \dspFuncName{SpaceShip}. Ta obsahuje atributy potřebné pro zobrazování a simulaci lodi. Grafiku lodi je zajišťuje objekt \dspFuncName{Model}, jenž je součástí třídy.

\item Planety \\
Jsou reprezentovány třídou \dspFuncName{BasicPlanet}. Třída obsahuje parametry potřebné pro zobrazování a simulaci. Geometrií planety je vždy koule a můžeme proto jednoduše generovat geometrii procedurálně. To nám umožňuje používat tzv. 
Progressive Level of Detail: V závislosti na vzdálenosti planety od pozorovatele měníme kvalitu geometrie \footnote{Použité obrázky viz \url{http://www.search.com/reference/Level_of_detail}}.
Tím efektivně snižujeme počet renderovaných polygonů a tím šetříme čas GPU.

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=0.2]{./sphereLow.png}
	\caption{ Hrubá aproximace koule ~140 vrcholů }
\end{center}					
\end{figure}

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=0.2]{./sphereMedium.png}
	\caption{Normální koule ~670 vrcholů }
\end{center}					
\end{figure}

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=0.2]{./sphereHigh.png}
	\caption{Detailní koule ~5500 vrcholů }
\end{center}					
\end{figure}


\item Rakety \\
Rakety jsou střely lítající mezi nepřátelskými loděmi během souboje.
Reprezentuje je třída \dspFuncName{SpaceMissile}. Podobně jako v případě lodí obsahuje třídu \dspFuncName{Model}, která spravuje modely střel + atributy potřebné pro jejich fyzikální simulaci.

\item Částice \\
Lodě a rakety generují částice, ty byly obecně popsány v sekci Částicové systém. Pro účely aplikace bylo implementováno několik emitorů částic ( pro každý typ lodi jiný ), viz soubor \dspFuncName{ShipEmittor.h}.

\item Exploze \\
Exploze jsou tvořeny sekvencí obrázků utvářející plynulou animaci výbuchu.
Tyto animace realizuje třída \dspFuncName{AnimationEffect}.

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=1.0]{./explosion.png}
	\caption{Série sřídajících se obrázků tvořící animaci }
\end{center}					
\end{figure}

\end{itemize}

\subsubsection{Makro mapa} 
Zobrazuje prozkoumané části vesmíru. Objevené sluneční soustavy jsou symbolizovány 2D obrázkem, podobně jako lodě v okolí.
Funkce makro mapy zajišťuje třída \dspFuncName{RadarMapGame}.



\subsection{Architektura} 


\subsubsection{ \dspFuncName{ClientSynchronizer}} 
Dostává rozparsovaná data lodí a planet od třídy \dspFuncName{CommandClient}.
\dspFuncName{ClientSynchronizer} při každé synchronizaci porovnává informace od serveru s lokálními daty na klientu a provádí jejich synchronizaci.
Pokud přijdou od serveru informace o nové lodi nebo planetě, která na klientu dosud není uložena, tak objekt vytvoří a vloží do lokálních datových struktur. Data přimo související s Makro mapou se ukládájí do \dspFuncName{RadarData}.
Data Mikro mapy jsou potom uchovávány v  \dspFuncName{GalaxyPart} objektu.

\begin{figure}[H]
\begin{center}
	\includegraphics[scale=1.6]{./ClientSynchronizer.pdf}
	\caption{Proces synchronizace lodí a planet }
\end{center}					
\end{figure}

\subsection{GUI} 

             
