% lite inställningar
\documentclass[10pt, titlepage, oneside, a4paper]{article}
%\usepackage[T1]{fontenc}
\usepackage[swedish]{babel}
\usepackage{amssymb, graphicx, fancyheadings, isolatin1}
\addtolength{\textheight}{20mm}
\addtolength{\voffset}{-5mm}
\renewcommand{\sectionmark}[1]{\markleft{#1}}

% \Section ger mindre spillutrymme, använd dem om du vill
\newcommand{\Section}[1]{\section{#1}\vspace{-8pt}}
\newcommand{\Subsection}[1]{\vspace{-4pt}\subsection{#1}\vspace{-8pt}}
\newcommand{\Subsubsection}[1]{\vspace{-4pt}\subsubsection{#1}\vspace{-8pt}}
	
% appendices, \appitem och \appsubitem är för bilagor
\newcounter{appendixpage}

\newenvironment{appendices}{
	\setcounter{appendixpage}{\arabic{page}}
	\stepcounter{appendixpage}
}{
}

\newcommand{\appitem}[2]{
	\stepcounter{section}
	\addtocontents{toc}{\protect\contentsline{section}{\numberline{\Alph{section}}#1}{\arabic{appendixpage}}}
	\addtocounter{appendixpage}{#2}
}

\newcommand{\appsubitem}[2]{
	\stepcounter{subsection}
	\addtocontents{toc}{\protect\contentsline{subsection}{\numberline{\Alph{section}.\arabic{subsection}}#1}{\arabic{appendixpage}}}
	\addtocounter{appendixpage}{#2}
}



% Ändra de rader som behöver ändras
\def\inst{Datavetenskap}
\def\typeofdoc{Laborationsrapport}
\def\course{Virtuell Verklighet D}
\def\pretitle{Laboration 1}
\def\title{Scengraf}
\def\handin{''Första inlämningen''}
\def\name{Patrik Axelsson}
\def\username{c00pan}
\def\email{\username{}@cs.umu.se}
\def\path{edu/vr1/lab1}
%\def\url{http://www.cs.umu.se/$\sim$c00pan/java/index.html}
\def\graders{Daniel Sjölie, Andreas Burman}


% om du vill referera till katalogen där dina filer ligger kan du 
% använda \fullpath som kommer att vara "~username/edu..." o.s.v.
\def\fullpath{\raisebox{1pt}{$\scriptstyle \sim$}/\path}


% Här börjar själva dokumentet
\begin{document}

	% skapar framsidan (om den inte duger: gör helt enkelt en egen)
	\begin{titlepage}
		\thispagestyle{empty}
		\begin{large}
			\begin{tabular}{@{}p{\textwidth}@{}}
				\textbf{UMEÅ UNIVERSITET \hfill \today} \\
				\textbf{Institutionen för \inst} \\
				\textbf{\typeofdoc} \\
			\end{tabular}
		\end{large}
		\vspace{10mm}
		\begin{center}
			\huge{\textbf{\course}}\\
			\vspace{5mm}
			\LARGE{\pretitle} \\
			%\LARGE{\title} \\
			\vspace{10mm}
			\small{\handin} \\
			\vspace{15mm}
			\begin{large}
				\begin{tabular}{ll}
					\textbf{Namn} & \name \\
					\textbf{E-mail} & \texttt{\email} \\
					\textbf{Sökväg} & \texttt{\fullpath} \\
					%\textbf{URL} & \texttt{\url}
				\end{tabular}
			\end{large}
			\vfill
			\large{\textbf{Handledare}}\\
			\mbox{\large{\graders}}
		\end{center}
	\end{titlepage}

	% fixar sidfot
	\lfoot{\footnotesize{\name}}
	%\rfoot{\footnotesize{\title}}
	\rfoot{\footnotesize{\pretitle}}
	\lhead{\nouppercase{\sc\footnotesize\leftmark}}
	\rhead{}
	\pagestyle{fancy}
	\renewcommand{\headrulewidth}{0.2pt}
	\renewcommand{\footrulewidth}{0.2pt}

	% skapar innehållsförteckning.
	% Tänk på att köra latex 2ggr för att uppdatera allt
	\pagenumbering{roman}
	\tableofcontents
	
	% och lägger in en sidbrytning
	\newpage

	\pagenumbering{arabic}

	% i Sverige har vi normalt inget indrag vid nytt stycke
	\setlength{\parindent}{0pt}
	% men däremot lite mellanrum
	\setlength{\parskip}{10pt}

	% lägger in rubrik (finns \section, men då får man mycket spillutrymme)
	\Section{Problemspecifikation}
		Denna laboration gick ut på att skapa en scengraf med en objektorienterad uppbyggnad. Den skulle skulle sedan användas för att rendera en egenhändigt skapad scen. Se originalspecikationen för mer ingående detaljer: \\
		http://www.cs.umu.se/kurser/TDBD12/VT05/lab/lab1.html
	
	\Section{Åtkomst och användarhandledning}
		I katalogen för detta projekt finns en makefil som möjliggör kompilering genom att där exekvera kommandot \texttt{make}. Värt att nämna är att vid länkningen, länkas en statisk version av vrlib med, vilken finns i katalogen {$\scriptstyle \sim$}/edu/vr1/vrlib.\\
		\\
		När scengrafen är kompilerad har den exekverbara filen \texttt{SceneGraph} skapats i samma katalog, exekvering av den startar scengrafen. \\
		\\
		Efter scengrafen startats kommer den att rotera runt scenen om och om igen, vilket ej går att styra manuellt. Man kan byta mellan fönster och fullskärmsläge med f-tangenten och avsluta med q eller escape-tangenten.\\
		\\
		För bästa resultat - både sett till jämna rörelser och visuell kvalit\'e,  rekommenderas det att aktivera synkronisering av bufferbyten i OpenGL till skärmens vertikala uppdateringsfrekvens. Tyvärr verkar det inte finnas något standardiserat sätt att åstakomma detta. Körs scengrafen lokalt på en Linux-dator med nVidia-grafikkort och deras drivrutiner aktiverar man detta genom att sätta miljövariabeln \_\_GL\_SYNC\_TO\_VBLANK till 1. I annat fall får manualen för grafikkortets drivrutin konsulteras.

	\Section{Systembeskrivning}
		Hur den här lösningen skulle vara uppbyggd var relativt hårt specat i labspecifikationen. De tillägg som är gjorda är en UpdateVisitor-klass som ärver av NodeVisitor-klassen och en NodeCallback-klass.\\
		\\
		Varje nod i scengrafen kan ha ett NodeCallback-objekt. När sedan UpdateVisitorn traverserar scengrafen anropar den de NodeCallback-objekt som noderna möjligen har. Dessa traverseringar av scengrafen sker med relativt konstant mellanrum, ej knutet direkt till frekvensen av renderingen. Det är på detta sätt som de olika animeringar i scenen åstakoms, men möjligheterna för vad NodeCallbacksen kan användas till är i stort sett obegränsade.\\
		\\
		NodeCallback-klassen är egentligen bara en tom basklass som man ärver ifrån och skapar sen klasser som bestämmer vad som ska ske när NodeCallback-objekten anropas.
		
	%\Section{Algoritmbeskrivning}
						
	\Section{Lösningens begränsningar}
		Som det är nu är det lite bökigt att skapa en scen. Det vore fördelaktigt om man hade skapat ett filformat för att beskriva hela scenens uppbyggnad. Nu laddas istället scenens objekt in från en fil i AC3D-format och sen krävs handpåläggning i koden för att strukturera upp scenen.

	\Section{Problem och reflektioner}
		Största problemet har varit dålig planering. Började för sent med laborationerna och var inte färdig med dom när projektet drog igång. Sen under projekt-tiden blev det inte något mer gjort då vi la ner i princip alla vakna timmar på det. \\
		\\
		Annars måste jag säga att det har varit en väldigt rolig och lärorik laboration. Måste även ge en eloge till den objektorienterade uppbyggnaden av scengrafen i labspecifikationen - logisk och effektivt, som det ska vara.
		
	\Section{Testkörningar}
		\begin{figure}[htb]
			\includegraphics{scengraf.eps}
			\caption{scenen}
			\label{scengraf-bild}
		\end{figure}
		
		På den här bilden syns den scen som skapats med scengrafen. Sex objekt är synliga, men egentligen består scenen endast av fyra objekt. De två blå bollarna är samma objekt, men med olika states och transformationer ovanför sig. Samma sak gäller för de två kuberna - de är samma objekt med olika states och transformationer ovanför sig. \\
		\\
		Den röda bollen, den större blåa bollen och den undre kuben har material och texturer. Den mindre blåa bollen och den gröna cylindern har enbart ett material, men den senare visas som en wireframe. Den gula kuben har varken material eller textur utan enbart en färg. 

	% här börjar alla bilagor. Denna måste finnas med även om bara
	% bilagor anges i \begin{appendices} ... \end{appendices}
	\appendix

	% bilagor, t.ex. källkod. En tom extrasida kommer att skrivas ut för
	% att få alla sidnummer att stämma	
	\begin{appendices}
		\appitem{Källkod}{0}
		\appsubitem{\texttt{Geometry.cpp}}{1}
		\appsubitem{\texttt{Geometry.h}}{1}
		\appsubitem{\texttt{Group.cpp}}{1}
		\appsubitem{\texttt{Group.h}}{1}
		\appsubitem{\texttt{Light.cpp}}{1}
		\appsubitem{\texttt{Light.h}}{1}
		\appsubitem{\texttt{Material.cpp}}{1}
		\appsubitem{\texttt{Material.h}}{1}
		\appsubitem{\texttt{Node.cpp}}{1}
		\appsubitem{\texttt{Node.h}}{1}
		\appsubitem{\texttt{NodeCallback.h}}{1}
		\appsubitem{\texttt{NodeVisitor.cpp}}{1}
		\appsubitem{\texttt{NodeVisitor.h}}{1}
		\appsubitem{\texttt{RenderVisitor.cpp}}{1}
		\appsubitem{\texttt{RenderVisitor.h}}{1}
		\appsubitem{\texttt{Scene.cpp}}{1}
		\appsubitem{\texttt{Scene.h}}{1}
		\appsubitem{\texttt{SceneGraph.cpp}}{1}
		\appsubitem{\texttt{State.cpp}}{1}
		\appsubitem{\texttt{State.h}}{1}
		\appsubitem{\texttt{Texture.cpp}}{1}
		\appsubitem{\texttt{Texture.h}}{1}
		\appsubitem{\texttt{Transform.cpp}}{1}
		\appsubitem{\texttt{Transform.h}}{1}
		\appsubitem{\texttt{UpdateVisitor.cpp}}{1}
		\appsubitem{\texttt{UpdateVisitor.h}}{1}

	\end{appendices}
	
\end{document}
