\documentclass[a4,compress]{beamer}

\AtBeginSection[]{
  \begin{frame}{Sommaire}
    \tableofcontents[currentsection, hideothersubsections]
  \end{frame}
}

\usepackage{multimedia}
\usepackage{color} 
\usepackage[absolute,overlay]{textpos}
\setlength{\TPHorizModule}{\paperwidth}
\setlength{\TPVertModule}{\paperheight}


\setlength{\fboxrule}{0pt}

\newcommand{\overpict}[2]{
  \begin{textblock}{0.7}[0.5,0.5](0.5,0.5)%
    \fbox{%
      \begin{minipage}[c]{1.0\linewidth}
        \begin{center}
          \colorbox{black}{%
            \textcolor{orange}{#2}%
          }\vfill%
          \colorbox{black}{%
            \includegraphics[width=1.0\linewidth,height=6cm,keepaspectratio]{#1}%
          }
        \end{center}
      \end{minipage}
    }
  \end{textblock}
}

\usepackage{xspace}
\usepackage{slashbox}
\usepackage{graphicx}

\usepackage[utf8]{inputenc}
\usepackage[cyr]{aeguill}
\usepackage[english,francais]{babel}
\setcounter{tocdepth}{2}

\usetheme{CS}

\title{Une chaîne de production pour applications ludiques}
\author{Guillaume Libersat <glibersat@sigill.org>}
\institute{Kyanite Studios}

\begin{document}

\maketitle

\section{Introduction}

\frame
{
  \frametitle{Introduction}

  \begin{itemize}
  \item Buts
    \begin{itemize}
    \item Présenter une suite d'outils
    \item Focus sur l'aspect informatique
    \item État des lieux
    \end{itemize}
  \end{itemize}

  \begin{itemize}
  \item CrystalSpace, CEL, ...
    \begin{itemize}
    \item Présentation ``conceptuelle''
    \end{itemize}
  \end{itemize}

  \begin{itemize}
  \item Outils utilisés pour Apricot\footnote{http://apricot.blender.org}
  \end{itemize}

  \only<2>{\overpict{figures/apricot.png}{Les personnages d'Apricot}}

}

\section{Conception et données}

\frame
{
  \frametitle{Conception}

  \begin{itemize}
  \item Idées
  \end{itemize}

  \begin{itemize}
  \item Background
  \end{itemize}

  \begin{itemize}
  \item Scénario, Level design
  \end{itemize}

  \begin{itemize}
  \item<1-12> Concept Art
  \end{itemize}

  \only<2>{\overpict{figures/ideas.png}{Des idées}}
  \only<4>{\overpict{figures/background.png}{Background}}
  \only<6>{\overpict{figures/scenario.png}{Scénario}}
  \only<8>{\overpict{figures/kerin1.png}{Concept Art \#1}}
  \only<9>{\overpict{figures/kerin2.png}{Concept Art \#2}}
  \only<10>{\overpict{figures/kerin3.jpg}{Concept Art \#3}}
  \only<11>{\overpict{figures/kerin.png}{Concept Art \#4}}

}

\frame
{
  \frametitle{Des données !}

  \begin{itemize}
  \item Modélisation
    \begin{itemize}
    \item Blender, Makehuman, ...
    \end{itemize}
  \end{itemize}

  \begin{itemize}
  \item<3-> Textures
    \begin{itemize}
    \item The Gimp, Krita, ...
    \end{itemize}
  \end{itemize}

\pause
  \begin{itemize}
  \item<5-> Son
    \begin{itemize}
    \item Audacity, Puredata, ...
    \end{itemize}
  \end{itemize}

\pause
  \begin{itemize}
  \item<7-9> Musique
    \begin{itemize}
    \item Ardour, Freewheeling, ...
    \end{itemize}
  \end{itemize}

  \only<2>{\overpict{figures/crane.jpg}{Une grue sans texture}}
  \only<4>{\overpict{figures/grenade.png}{Une grenade avec texture}}
  \only<6>{\overpict{figures/sons.png}{Bruits, sons, ...}}
  \only<8>{\overpict{figures/lymbago.png}{Musique !}}

}

\section{Support d'exécution}

\subsection{CrystalSpace3D}

\subsubsection{Introduction}

\frame
{
  \frametitle{CrystalSpace3d\footnote{http://www.crystalspace3d.org/}}

  \includegraphics[width=3cm]{figures/crystal.png}

  \begin{itemize}
  \item Framework d'applications 3D
    \begin{itemize}
    \item Non spécifique aux jeux
    \item Libre (LGPLv2.1, GPLv2, -- GPLv3, MPLv1.0)
    \item Portable, modulaire, extensible
    \item Support des différentes générations de matériels
    \end{itemize}
  \end{itemize}

\pause
  \begin{itemize}
  \item Quelques stats (\textit{ohloh.net})
    \begin{itemize}
    \item Démarré en 1997
    \item Plus de 180 contributeurs (Fév. 08)
    \item 987000 LOC (Juin 08)
    \end{itemize}
  \end{itemize}
}

\subsubsection{Généralités}

\frame
{
  \frametitle{Portabilité}

  \begin{quote}
    \textit{\og Un développeur utilisant CrystalSpace [...] ne devrait
      ABSOLUMENT pas se soucier des questions de portabilité.
      CrystalSpace 'se doit' de tout gérer. \fg} -- Jorrit
  \end{quote}

\pause

  \begin{itemize}
  \item Processeur : XML (+binaire)
  \item Système d'exploitation
    \begin{itemize}
    \item Système de fichiers : VFS
    \item Périphériques d'entrée
    \end{itemize}
  \item Système de fenêtrage
  \item Matériel 3D
  \item Son
  \item ...
  \end{itemize}

}

\frame
{
  \frametitle{Modularité}

  \begin{itemize}
  \item Très modulaire
    \begin{itemize}
    \item Noyau minimal (maths, SCF, ...)
    \item Maintenance, extensibilité
    \item Tout est greffon
    \end{itemize}
  \end{itemize}

\pause

  \begin{itemize}
  \item Greffons
    \begin{itemize}
    \item Interfaces (ex: iPhysics, iGraphics3D)
    \item Implante une ou plusieurs interfaces
    \item Interchangeable (ex: OpenAL, DirectSound)
    \end{itemize}
  \end{itemize}
}

\frame
{
  \frametitle{Vue d'ensemble}

\begin{columns}
  \begin{column}[l]{6cm}
    \includegraphics[width=6cm]{figures/cs_overview_t.png}
  \end{column}
  \begin{column}[2]{6cm}
    ~\\
    ~\\
    ~\\
    ~\\
    ~\\
    ~\\
    ~\\
    \includegraphics[width=6cm]{figures/cs_overview_b.png}
  \end{column}
\end{columns}
}

\subsubsection{Le moteur}

\frame
{
  \frametitle{Un monde CrystalSpace}

  \begin{itemize}
  \item Monde minimal
    \begin{itemize}
    \item Secteurs (4ème dimension)
      \begin{itemize}
      \item Lumières (Directionnelle, Soleil, ...)
      \item Objets 3D (Meshes) et leurs usines
      \end{itemize}
    \end{itemize}
  \end{itemize}
  
}

\frame
{
  \frametitle{Un exemple de monde}

  \begin{center}
    \includegraphics[width=9cm]{figures/world_elements.png}
  \end{center}

}

\frame
{
  \frametitle{Meshs}

  Mesh $\simeq$ Assemblage de géométrie 3d + Propriétés
 
  \begin{itemize}
  \item Différents types
    \begin{itemize}
    \item<alert@1> Simple
    \item<alert@3-6> Animé
      \begin{itemize}
      \item Keyframe
      \item Squelette/Hiérarchique
      \end{itemize}
    \item<alert@7> Particules
    \item<alert@9> Terrain
    \item ...
    \end{itemize}
  \item<alert@11> Usines de Meshes
  \end{itemize}

  \only<2>{\overpict{figures/mesh_simple.png}{Simple Mesh}}
  \only<4>{\overpict{figures/mesh_keyframe.png}{Keyframe}}
  \only<6>{\overpict{figures/mesh_bones.png}{Squelette}}
  \only<8>{\overpict{figures/mesh_particles.png}{Particules}}
  \only<10>{\overpict{figures/mesh_terrain.jpg}{Terrain}}

}

\frame
{
  \frametitle{Matériaux et Shaders}

  \begin{itemize}
  \item Matériaux
    \begin{itemize}
    \item Couleur (diffuse, ambiante, spéculaire)
    \item Texture (statique, procédurale)
    \end{itemize}
  \end{itemize}

  \begin{itemize}[<2-4>]
  \item Shaders
    \begin{itemize}
    \item Programmes exécutés sur la carte graphique
    \item Agissent sur les propriétés du mesh
    \item Exemples
      \begin{itemize}
      \item Normal/Parallax mapping
      \item Eau (réfraction, ...)
      \end{itemize}
    \end{itemize}
  \end{itemize}

  \only<3>{\overpict{figures/parallax.jpg}{Parallax mapping (CS)}}

}

\frame
{
  \frametitle{Portails}

  Portail $\simeq$ une porte qui connecte un secteur vers un autre
  \begin{itemize}
  \item Effets (distortions, miroir, ...)
  \end{itemize}

  \begin{itemize}[<4->]
  \item Améliore les performances
  \item Taille de niveaux \og infinie\fg
  \item Plus facile pour développer
  \end{itemize}

  \only<2>{\overpict{figures/portal_sectors.png}{Secteurs connectés via un portail}}
  \only<3>{\overpict{figures/portals.jpg}{Résultat de connexion}}


}

\frame
{
  \frametitle{Cullers}

\begin{columns}
\begin{column}[l]{9cm}

  \begin{itemize}
  \item<1-> Culler ?
    \begin{itemize}
    \item Supprime le rendu des objets non visibles
    \item Un culler par secteur
    \end{itemize}

  \end{itemize}

  \begin{itemize}
  \item<2-> Frustvis
    \begin{itemize}
    \item Objets hors de la vue
    \item Secteurs simples ou vides
    \end{itemize}
  \item<4-> Dynavis
    \begin{itemize}
    \item Détermine l'ensemble des objets occultés
    \item Scènes intérieures, remplies
    \end{itemize}
  \item<5-> PVSvis (Potential Visible Set)
    \begin{itemize}
    \item Précalcul, rapide à l'exécution
    \item Ne fonctionne pas actuellement :-(
    \end{itemize}
  \end{itemize}

  \only<3>{\overpict{figures/frustvis.png}{Frustvis}}

\end{column}
\begin{column}[r]{4cm}
  \includegraphics<2>[width=4cm]{figures/frustrum.png}
\end{column}
\end{columns}

}

\frame
{
  \frametitle{LOD}

  LOD = Level of Detail

  \begin{itemize}
  \item Réduction du niveau de détails
    \begin{itemize}
    \item Distance, qualité, matériel, ...
    \end{itemize}
  \item<2-> Différents types
    \begin{itemize}
    \item Progressif : fusion des faces
    \item Imposteur : rendu sur texture
    \item Statique : défini à la modélisation
    \item Terrain : algorithmes particuliers
    \end{itemize}
  \end{itemize}

  \only<3>{\overpict{figures/lod_mesh.png}{LOD sur Mesh}}
  \only<5>{\overpict{figures/lod_imposter.jpg}{LOD avec imposteurs}}
  \only<7>{\overpict{figures/lod_terrain.png}{LOD sur Terrain}}
}

%\frame
%{
%  \frametitle{Boucles de rendu}
%
%  TODO
%}

\frame
{
  \frametitle{Eclairage et Ombres}
  \begin{itemize}
  \item Lightmap
    \begin{itemize}
    \item Très bon rendu (radiosité, photon mapping, ...)
    \item Précalculées (long)
    \item Rapide (pas de coût à l'exécution)
    \item Statiques
    \end{itemize}
  \end{itemize}

  \begin{itemize}[<3->]
  \item Stencil Shadows
    \begin{itemize}
    \item Dynamique
    \item Bon rendu
    \item Lent, dépendant du matériel
    \end{itemize}
  \end{itemize}

  \begin{itemize}[<5-7>]
  \item PSSM (Shadow Mapping)
    \begin{itemize}
    \item Dynamique
    \item Performant
    \item Se mélange bien avec les lightmaps
    \end{itemize}
  \end{itemize}

  \only<2>{\overpict{figures/radiosity.png}{Lightmap (Raydium)}}
  \only<4>{\overpict{figures/stencil.jpg}{Stencil Shadows}}
  \only<6>{\overpict{figures/pssm.jpg}{Parallel-Split Shadow Mapping}}
}

\frame
{
  \frametitle{Collision et Physique}

  \begin{itemize}
  \item OPCODE
    \begin{itemize}
    \item Simple, fonctionnel
    \item Léger
    \item Pas de physique
    \end{itemize}
  \end{itemize}
  \begin{itemize}
  \item Ode, Bullet
    \begin{itemize}
    \item Physique \og réaliste\fg (masse, élasticité, ...)
    \item Support des joints (+ destruction)
    \item Relativement lourd
    \item Support multithread en cours (Bullet)
    \end{itemize}
  \end{itemize}
}

\frame
{
  \frametitle{Son et Musique}
  \begin{itemize}
  \item Son 3D, OpenAL
    \begin{itemize}
    \item Des sources
    \item Un récepteur
    \item Effets (Doppler, ...)
    \end{itemize}
  \end{itemize}

  \begin{itemize}
  \item Musique d'ambiance
    \begin{itemize}
    \item Wav, Ogg, ...
    \end{itemize}
  \end{itemize}
}

\frame
{
  \frametitle{HUD/Menus}

  Afficher des plans 2D au dessus de l'affichage

\medskip

  Deux supports
  \begin{itemize}
  \item<1-> Billboards
    \begin{itemize}
    \item Légers, Simple
    \item Mixe 2D/3D
    \end{itemize}
  \item<3-5> CEGUI
    \begin{itemize}
    \item Complet (pensez GTK-like)
    \item Outillé (éditeur)
    \item Plus lourd
    \end{itemize}
  \end{itemize}

  \only<2>{\overpict{figures/billboard.png}{Radar avec billboards}}
  \only<4>{\overpict{figures/cegui.jpg}{CEGUI}}



}

\frame
{
  \frametitle{Scripting}

  \begin{itemize}
  \item Langages
    \begin{itemize}
    \item Python
    \item Perl
    \item Java
    \item (C\#)
    \item (Lua)
    \item (XML)
    \end{itemize}
  \end{itemize}
\pause
  \begin{itemize}
  \item Accès à (presque) toute l'API
  \item Tire profit des spécificités
  \item Très bonnes performances
  \end{itemize}
}

\frame
{
  \frametitle{Débogage}

  \begin{itemize}
  \item Bugplug
    \begin{itemize}
    \item Débogueur visuel
    \item Ex: Colorier secteurs, Désactiver éclairage, ...
    \end{itemize}
  \item<3-5> Console
    \begin{itemize}
    \item Interaction avec le moteur
    \end{itemize}
  \end{itemize}

  \only<2>{\overpict{figures/bugplug.png}{Bugplug}}
  \only<4>{\overpict{figures/console.png}{Console}}
}

\frame
{
  \frametitle{Google summer of code '08}


  Projets en cours
  \begin{itemize}
  \item Parallélisation
  \item Nuages volumétriques
  \item Océans, rivières, ...
  \item Amélioration de l'IA
  \item<1-5> Amélioration de l'éclairage
  \end{itemize}

  \only<2>{\overpict{figures/clouds.png}{Nuages volumétriques
      (Harris)}}
  \only<4>{\overpict{figures/water.jpg}{Shader d'océan (Johanson)}}
}

\subsection{CEL}

\frame
{
  \frametitle{Introduction}

  \begin{columns}
    \begin{column}[1]{7cm}

      CEL : Crystal Entity Layer\footnote{http://www.crystalspace3d.org/main/CEL}

      \begin{itemize}
      \item Au dessus de CS
      \item Notion d'\og entité\fg
      \end{itemize}
      
      \begin{itemize}
      \item Entités
        \begin{itemize}
        \item À la base : un point dans l'espace
        \item Greffe de fonctionnalités \og préfabriquées\fg
        \item Un comportement
        \end{itemize}
      \end{itemize}
    \end{column}

    \begin{column}[2]{3cm}
      \includegraphics[width=3cm]{figures/cel.png}
    \end{column}
  \end{columns}
}

\frame
{
  \frametitle{Vue d'ensemble}

  \begin{center}
    \includegraphics[width=9cm]{figures/cel_overview.png}
  \end{center}


}

\frame
{
  \frametitle{Couche physique}

  \begin{itemize}
  \item Gestionnaire d'entités
  \end{itemize}

  \begin{itemize}
  \item Système de messages
  \end{itemize}

  \begin{itemize}
  \item Système de persistance
    \begin{itemize}
    \item XML, Binaire
    \end{itemize}
  \end{itemize}

  \begin{itemize}
  \item Fonctionnalités générales
    \begin{itemize}
    \item Réseau, Système de règles, ...
    \end{itemize}
  \end{itemize}
  
  \begin{itemize}
  \item Property classes
  \end{itemize}
  
}

\frame
{
  \frametitle{Property classes}

  \begin{itemize}  
  \item Property class ?
  \begin{itemize}
    \item 1 \textit{PC} $\simeq$ 1 Fonctionnalité
    \item Se greffe à une entité
    \item $n$ \textit{PC} par entité
    \end{itemize}
  \end{itemize}

\pause
  \begin{itemize}
  \item Des property classes
    \begin{itemize}
    \item Mesh
    \item Récepteur sonore
    \item Soumis à la gravité
    \item Camera
    \item ...
    \end{itemize}
  \end{itemize}

\pause
  \begin{itemize}
  \item Exemple : un coffre
    \begin{itemize}
    \item PcMesh + PcInventory + PcSolid + ...
    \end{itemize}
  \end{itemize}

}


\frame
{
  \frametitle{Couche comportementale}

  \begin{itemize}
  \item 1 comportement par entité
  \item C++, Python, XML, ...
  \end{itemize}

\pause
  \begin{itemize}
  \item Réponse à des messages
    \begin{itemize}
    \item Venant des Propclasses
      \begin{itemize}
      \item ex: pcdamage\_hit
      \end{itemize}
    \item Venant d'autres entités
    \end{itemize}
  \end{itemize}

\pause
  \begin{itemize}
  \item Envoie de messages
    \begin{itemize}
    \item Vers d'autres entités
    \end{itemize}
  \end{itemize}

}

\frame
{
  \frametitle{Résumé de CEL}

  \begin{center}
    \huge{Entités + Property classes + Comportements = Logique de jeu}
  \end{center}
}

\frame
{
  \frametitle{CELstart}

  \begin{columns}
    \begin{column}[l]{7cm}
  
      CELstart\footnote{http://www.crystalspace3d.org/main/CELstart}
      \begin{itemize}
      \item 1 unique binaire (statique)
      \item Démarre une application CEL
      \end{itemize}

      \begin{itemize}[<2->]
      \item Données CELstart
        \begin{itemize}
        \item Pas d'obligation de code natif
          \begin{itemize}
          \item Portabilité
          \item Rapidité
          \end{itemize}
        \item Regroupé sous forme d'un ZIP
        \end{itemize}
      \end{itemize}
    \end{column}
    \begin{column}[2]{3cm}
      \includegraphics[width=3cm]{figures/celstart.png}
    \end{column}
  \end{columns}   
}

\section{Co-réalisation}

\subsection{Verse}

\frame
{
  \frametitle{Verse}

  \begin{columns}
    \begin{column}[l]{6cm}

      Verse\footnote{http://verse.blender.org}
      \begin{itemize}
      \item Connecteur d'applications 3d
      \end{itemize}

      \begin{itemize}[<2->]
      \item Chaque application peut
        \begin{itemize}
        \item Partager des ressources
        \item Utiliser des ressources
        \item Modifier des ressources
        \end{itemize}
      \end{itemize}
      
      \begin{itemize}[<3->]
      \item Dans notre cas
        \begin{itemize}
        \item Intéressant pour les artistes
        \item Visualisation du rendu final
        \end{itemize}
      \end{itemize}

      \onslide<4->{Vidéo !}
    \end{column}

     \begin{column}[2]{4cm}
       \includegraphics[width=4cm]{figures/verse.png}
    \end{column}
  \end{columns}
}

\frame
{
  \frametitle{Démonstration de Verse}

  \begin{center}
    \href{run:mplayer -fs
      movies/verse.mpg}{\includegraphics[width=0.8\textwidth]{figures/verse.png}}
  \end{center}

}

\subsection{Blender2Crystal}

\frame
{
  \frametitle{Blender2Crystal}

  \begin{columns}
    \begin{column}[1]{7cm}

      Blender2Crystal\footnote{http://b2cs.delcorp.org}

      \begin{itemize}
      \item Éditeur de niveau pour CS/CEL
      \item Script blender (Overlay + Exportateur)
      \end{itemize}


      \begin{itemize}[<3->]
      \item Création de scènes CS
      \item Gestion des entités CEL
      \item Création d'applications Celstart
      \end{itemize}


      \onslide<4->{Vidéo !}

    \end{column}

    \begin{column}[2]{3cm}
      \includegraphics[width=3cm]{figures/b2cs.png}
    \end{column}
  \end{columns}

  \only<2>{\overpict{figures/b2cs-overlay.png}{Overlay de B2CS}}
}

\frame
{
  \frametitle{Démonstration de B2CS}

  \begin{center}
    \href{run:mplayer -fs
      movies/b2cs-1.mpeg}{\includegraphics[width=0.38\textwidth]{figures/b2cs-1.jpg}}
  \end{center}

  \begin{center}
    \href{run:mplayer -fs
      movies/b2cs-2.mpeg}{\includegraphics[width=0.38\textwidth]{figures/b2cs-2.jpg}}
  \end{center}


}

\section{Conclusion}

\frame
{
  \frametitle{Conclusion}

  \begin{itemize}
  \item Chaîne d'outils (quasi) complète
    \begin{itemize}
    \item Beaucoup d'outils complets et efficaces
    \item Couvre la plupart des besoins
    \end{itemize}
  \end{itemize}
  
\pause
  \begin{itemize}
  \item Peu intégrée
    \begin{itemize}
    \item Peu de connexions entre les logiciels
    \item Formats d'échanges ?
    \item Travail collaboratif
    \end{itemize}
  \end{itemize}

\pause
  \begin{itemize}
  \item Reste très centrée \og informaticiens\fg
    \begin{itemize}
    \item Outils pour scénaristes ?
    \item Facilité des éditeurs
    \end{itemize}
  \end{itemize}

}

\frame
{
  \frametitle{Questions ?}

  \begin{center}
    Merci pour votre attention,
  \end{center}

  \begin{center}
    \huge{des questions ?}
  \end{center}

}

\end{document}