\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[frenchb]{babel}
\usepackage{hyperref}
% \hypersetup{%
%   colorlinks,%
%   citecolor=black,%
%   filecolor=black,%
%   linkcolor=black,%
%   urlcolor=black%
% }
\usepackage{tikz}
%\makeatletter\def\@makecaption{}\makeatother
%\usepackage[scriptsize]{caption}
%\captionsetup[figure]{labelformat=empty, labelsep=none}
%\renewcommand*{\figurename}{}
\usetikzlibrary{shapes,positioning,snakes,calc,chains}
\usetheme{Frankfurt}
\usepackage{graphicx}

\title{FMIN313 Moteurs de jeux\\ Génération de terrains}
\author{DUPÉRON Georges \and\\ BONAVERO Yoann}
\institute{Université Montpellier II,\\Département informatique\\Master 2 IFPRU\\Encadrants~: F. Koriche et M. Moulis}
\date{Lundi 14 novembre 2011}

\defbeamertemplate*{footline}{shadow theme}
{%
  \leavevmode%
  \hbox{\begin{beamercolorbox}[wd=.5\paperwidth,ht=2.5ex,dp=1.125ex,leftskip=.3cm plus1fil,rightskip=.3cm]{author in head/foot}%
    \usebeamerfont{author in head/foot}\insertframenumber\,/\,\inserttotalframenumber%\hfill\url{http://www.pticlic.fr/}
  \end{beamercolorbox}%
  \begin{beamercolorbox}[wd=.5\paperwidth,ht=2.5ex,dp=1.125ex,leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}%
    \usebeamerfont{title in head/foot}\insertshorttitle%
  \end{beamercolorbox}}%
  \vskip0pt%
}

%\defbeamertemplate*{caption}{numbered}
%{%
%  \raggedright
%  {%
%    \usebeamercolor[fg]{caption name}%
%    \usebeamerfont*{caption name}%
%    \insertcaptionname~\insertcaptionnumber:____%
%  }
%  \insertcaption\par
%}

\AtBeginSection[] {
  \begin{frame}
    \frametitle{Plan}
    \tableofcontents[currentsection]
  \end{frame}
  \addtocounter{framenumber}{-1}
}

\begin{document}
\makeatletter\renewcommand*{\figurename}{\@gobble}\makeatother

\begin{frame}
  \titlepage
\end{frame}

% \section{Introduction}

\section{Génération}

\subsection{Perlin noise}
\begin{frame}
  \frametitle{Perlin noise}
  \begin{itemize}
  \item Superposition d'octaves de bruit
  \begin{figure}[h]
    \centering
    \begin{tikzpicture}
      \draw[draw=blue] (0,0) -- (1,1) -- (2,0);
    \end{tikzpicture}
    \caption{Perlin noise}
  \end{figure}
  \item Interpolation linéaire, cubique ou cosinusoidale.
  \item Amplitude, octaves, fréquence, persistance.
  \item Hash de coordonnées% TODO
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Perlin noise (Variations)}
  \begin{itemize}
  \item Cevernes, nuages, textures, terrains : bruit $n$D et voxels.
  \item Ridged Perlin Noise.
  \item Midpoint displacement.
  \item Simplex noise : généralisation des triangles équilatéraux à $n$ dimensions, interpolation par rapport aux coins. $d^2$ au lieu de $2^d$.
  \item Bruit répétable 1D : points sur un cercle dans un espace 2D. Généralisation à $n$ dimensions : hypercercle $n$D dans un espace $2n$D.
	%TODO : référence
  \end{itemize}
\end{frame}

\subsection{Craters et Hills Algorithm}
\begin{frame}
  \frametitle{Craters et Hills Algorithm}
  \begin{itemize}
  \item Craters
    \begin{itemize}
    \item Soustraire des cercles au terrain (z = z - f(distance au centre))
    \item Sur un terrain nu
	% TODO : image
    \item Sur un terrain existant
	% TODO : image
    \end{itemize}
  \item Hills Algorithm
    \begin{itemize}
    \item Inverse de craters : on ajoute plein de cercles
    \end{itemize}
  \item Stockage des cercles dans un arbre (BSP, Quadtree, arbre du LOD, \dots{}).
  \end{itemize}
\end{frame}

\subsection{Érosion}

\begin{frame}
  \frametitle{Érosion}
  \begin{itemize}
  \item Déplacement de sédiments.
  \item Taux en fonction de la pente, dureté de la roche, végétation.
  \item Carte de circulation des eaux.
  \item Pas temps-réel.
  \item Approximation : modification de la distribution des hauteurs. % TODO : schéma
  \end{itemize}
\end{frame}

\subsection{Autres}
\begin{frame}
  \frametitle{Autres méthodes}
  \begin{itemize}
  \item Chaînage d'algorithmes de bruit
    \begin{itemize}
    \item Ajout de couleurs, climats, végétation, relief\dots{}
    \item Altération du comportement d'un algo.
    \item {\tiny\url{http://www.gamedev.net/blog/33/entry-2249260-procedural-islands-redux/}}
    \end{itemize}
  \item Cartes polygonales. {\tiny\url{http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/}}
	% TODO : voronoi etc.
  \item Intégration de formes dans le terrain.
  \end{itemize}
\end{frame}

\subsection{Rivières}

\begin{frame}
  \frametitle{Rivières}
  \begin{itemize}
  \item Pathfinding {\tiny\url{http://www.umbrarumregnum.net/articles/creating-rivers}}
	% Image
  \item Affinage du tracé en fonction du LOD.
	% Schéma sur un ou deux niveaux d'affinage.
  \item Tracé arbitraire.
  \item Intégration dans le terrain.
  \end{itemize}
\end{frame}
% Si on utilise une méthode de coût qui favorise de passer par un petit
% bout de bruit plutôt que de le contourner, mais favorise le
% contournement pour une grosse accumulation de bruit, on pourra même
% simuler l'érosion qui efface les méandres trop petits.

\subsection{Démonstration}
\begin{frame}
  \frametitle{Démonstration}
  \begin{center}
  {\Huge World machine}
  
  \vspace{1em}
  \url{http://www.world-machine.com/}
  \end{center}
\end{frame}

\section{Rendu}

\subsection{Isosurfaces}
\begin{frame}
  \frametitle{Isosurfaces}
  \begin{itemize}
    \item Metaballs % TODO : écran de veille / screenshot.
    \item Surface 2D d'un bruit 3D.
    \item Simplification de nuages.
    \item Surface de l'eau.
  \end{itemize}
\end{frame}

\subsection{Ray casting}

\begin{frame}
  \frametitle{Ray casting}
  \begin{itemize}
  \item Très simple, très petit code.
	% TODO : Schéma d'explication
  \item Sampling
  \item Très lent
  \item Démonstration
  \item Monte Carlo
  \end{itemize}
\end{frame}

\section[LOD]{Niveau de détail}

\subsection{ROAM}
\begin{frame}
  \frametitle{ROAM}
  \begin{itemize}
  \item Triangle bintree.
	% TODO : Figure : triangle avec 2 fils.
  \item Split et merge. CLOD.
	% TODO : Figure : split forcé, merge d'un losange.
  \item Défaut maximal visible à l'écran.
	% TODO : Figure : Dessin projection pavé triangle erreur à l'écran.
  \item Split queue et Merge queue.
	% TODO : queues l'une au-dessus de l'autre, montrer qu'on va +- les priorités pour éviter le chevauchement.
  \item Frustum culling : utilisation de drapaux.
  \item Améliorations~:
    \begin{itemize}
    \item Triangle stripping.
    \item Geomorphing.
    \item Calcul différé des priorités dans les queues.
    \item Temps réel.
    \end{itemize}
  \item $O(\text{Nb triangles mis à jour})$
  \end{itemize}
\end{frame}

\subsection{Geometry clipmaps}
\begin{frame}
  \frametitle{Geometry clipmaps}
  \begin{itemize}
  \item Carrés concentriques avec des LOD différents.
  \item Comme le mipmapping de textures.
  \item Utilisation forte du GPU.
  \item Displacement shader.
  \item Remplissage à la jointure des LOD.
  \end{itemize}
\end{frame}

\subsection{Notre algo}
\begin{frame}
  \frametitle{Notre algorithme}
  \begin{itemize}
  \item Quadtree de carrés.
	% TODO : figure
	% TODO : figure trous dans le mesh
  \item Triangle fans.
  \item LOD en fonction de la distance.
  \item Mise à jour de quelques branches seulement.
  \item Temps réel.
  \item $O(\text{Nb triangles mis à jour})$
  \end{itemize}
\end{frame}

\subsection{Streaming de scène}
\begin{frame}
  \frametitle{Streaming de scène}
  \begin{itemize}
  \item Modèle client/serveur.
  \item Tiles avec LOD maximal.
  \item Qualité progressive des tiles.
  \item Geometry clipmaps.
  \item \texttt{/usr/lib/xscreensaver/crackberg}
  \end{itemize}
\end{frame}

% \section{Conclusion}

% \begin{frame}
%   \frametitle{Conclusion}
% \end{frame}

\begin{frame}
  \frametitle{Sources}
% Génération
% * [Différents algos]() : Ridged Perlin Noise, Hills Algorithm, Craters, Erosion.
% * [Plein d'algos](http://planetgenesis.sourceforge.net/docs15/noise/noise.html#tileworley) dont plusieurs basés sur une sorte de voronoi donc à priori trop lents.
% * Affichage avec Ogre : [forum](http://www.ogre3d.org/forums/viewtopic.php?f=5&t=67177&p=442222), [doc](http://www.ogre3d.org/docs/api/html/classOgre_1_1BillboardSet.html)
  \begin{itemize}
  \item http://www.gamasutra.com
  \item http://vterrain.org
  % \item Mojoworld generator (mojoworld.org)
  \item http://world-machine.com
  \item Algorithmes de bruit {\tiny http://www.sluniverse.com/php/vb/project-development/34994-automatically-generated-terrain-map.html}
  \item Composition d'algorithmes de bruit {\tiny http://www.gamedev.net/blog/33/entry-2249260-procedural-islands-redux/}
  \item Création de cartes polygonales {\tiny http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/}
  \item Pathfinding pour créer des rivières {\tiny http://www.umbrarumregnum.net/articles/creating-rivers}
  \end{itemize}
\end{frame}

\end{document}
