Bien, c'est maintenant qu'on rentre dans le vif du sujet. Sans plus attendre la première ligne de code :
Code : C++ | irr::IrrlichtDevice *device = irr::createDevice (
irr::video::EDT_OPENGL,
irr::core::dimension2d<irr::u32>(800,600),
32,
false,
true,
false,
0);
|
Ouch ! Oui je sais ça fait peur, mais pas de panique on va tout reprendre point par point. La première des choses est encore de savoir à quoi sert cette ligne. En fait elle va créer un périphérique de sortie, aussi appelé contexte d'affichage, ou plus communément... fenêtre. Qui sera un pointeur de type
irr::IrrlichtDevice, et que nous appellerons simplement
device. Cette ligne permet donc de créer la fenêtre dans laquelle votre application va se dérouler (et bien plus encore mais on verra ça plus tard

).
Cela a dû vous sauter aux yeux, le namespace irr:: revient sans arrêt. La raison en est simple : dans Irrlicht tout est contenu dans le namespace irr. Personnellement je préfère le retaper à chaque fois mais si cela vous est vraiment insupportable vous pouvez toujours ajouter la ligne suivante au début de votre code :
Code : C++
Ce qui est impressionnant dans cette fonction c'est le nombre de paramètres qu'elle prend, 7 en tout. Examinons sa
déclaration plus en détail :
Code : C++ | irr::createDevice (deviceType, windowSize, bits, fullscreen, stencilbuffer, vsync, receiver)
|
- deviceType : désigne l'API graphique avec laquelle va s'interfacer Irrlicht. Nous utiliserons OpenGL tout au long du tutoriel, mais on peut aussi choisir Direct3D par exemple en mettant la valeur EDT_DIRECT3D9.
- windowSize : la taille de la fenêtre. Tout est dit ! Avec le code indiqué plus haut, on crée une fenêtre de 800 par 600 pixels.
- bits : détermine le nombre de bits par pixels. En mettant 32, on aura 232 valeurs différentes possibles par pixel.
- fullscreen : un booléen qui indique si on veut faire du plein écran ou pas. Pour la valeur true l'application sera en plein écran, et pour false la fenêtre sera de la taille définie plus haut.
- stencilbuffer : un autre booléen qui indique lui si on active le stencil buffer [32-2] ou pas. Il est actif pour true.
- vsync : toujours un booléen. Celui-ci sert à activer la synchronisation verticale [31-3]. Pas de mystère, elle est active pour true.
- receiver : permet d'associer un capteur d'événements au device (0 signifie qu'on n'associe rien). Nous verrons de quoi il s'agit dans un prochain chapitre.
Reprenons notre première ligne, on s'aperçoit qu'on a créé une fenêtre utilisant OpenGL de 800 x 600 pixels avec 32 bits par pixel ayant un stencil buffer. Il est intéressant de noter que tous les paramètres de cette fonction possèdent des valeurs par défaut (comme indiqué dans la documentation
[21-2]).
Les éléments de base
Maintenant que nous avons le device (qui est le véritable nom de la "fenêtre"), nous allons instancier la classe qui communique avec les API 3D bas niveau (OpenGL dans notre cas), j'ai nommé le video driver. C'est lui qui va gérer le rendu par exemple :
Code : C++ | irr::video::IVideoDriver* driver = device->getVideoDriver();
|
Continuons en créant le graphe de scène, aussi appelé scene manager, que nous aborderons plus en détails dans le prochain chapitre. C'est lui qui va nous permettre de gérer tout ce qui est contenu dans la scène :
Code : C++ | irr::scene::ISceneManager *sceneManager = device->getSceneManager ();
|
Pour finir mettons une caméra fixe. Je passe sur les paramètres mais nous reviendrons dessus dans le chapitre suivant le prochain :
Code : C++ | sceneManager->addCameraSceneNode (0,
irr::core::vector3df (0,0,0),
irr::core::vector3df (5,0,0));
|
Le rendu
Il ne reste plus maintenant qu'à afficher le rendu. Pour ce faire nous utilisons une boucle qui sera parcourue de manière infinie tant qu'on décide de ne pas fermer l'application :
Code : C++ | while(device->run()) {
driver->beginScene (true, true,
irr::video::SColor(255,255,255,255));
sceneManager->drawAll ();
driver->endScene ();
}
|
Quelques explications s'imposent. La condition utilisée pour la boucle est le résultat de la méthode run du device. Celle-ci renvoie false quand Irrlicht détecte un signal d’arrêt et true dans tous les autres cas. Ce qui veut dire que cette boucle tournera indéfiniment jusqu'à ce qu'on mette fin au programme.
Il est aussi intéressant de noter que cette boucle ne gère absolument pas le temps. Ce qui signifie qu'une fois lancée, l'application utilisera toute la puissance disponible de votre processeur. En soi ça n'a rien de gênant mais ça peut surprendre.
Décortiquons maintenant cette ligne :
Code : C++ | driver->beginScene (true, true, irr::video::SColor(255,255,255,255));
|
Cette fonction permet d'effectuer un rendu. Elle ne le fait pas elle-même mais est indispensable. En gros elle prépare le terrain pour le nouveau rendu. Voyons un peu son prototype :
Code : C++ | IVideoDriver::beginScene (backBuffer, zBuffer, color, videoData, sourceRect)
|
- backBuffer : il s'agit d'un booléen qui permet d'indiquer si on veut effacer le back buffer [32-3] ou pas. Pour faire court disons que si on ne l'efface pas des réminiscences se créeront là où il n'y a rien à afficher.
- zBuffer : encore un booléen. Celui-ci indique si on désire effacer le contenu du Z-Buffer [32-1].
- color : ce paramètre indique la couleur que va avoir le fond de l'écran. C'est une notation RGB classique, mais méfiance toutefois, ici le premier nombre indique la composante alpha. Cet exemple donne donc un fond blanc et opaque. Nous aurons l'occasion de revenir sur les couleurs par la suite.
- videoData : permet de faire du multi-fenêtrage. Nous n'y toucherons pas, donc on laisse la valeur par défaut.
- sourceRect : permet de n'afficher qu'une partie du rendu. Là encore nous n'y toucherons pas.
Maintenant les deux dernières lignes :
Code : C++ | sceneManager->drawAll ();
driver->endScene ();
|
La méthode drawAll du sceneManager va s'occuper du rendu de tout ce qui est géré par le scene manager. Donc de tout ce qui se trouve dans la scène. Et enfin la méthode endScene du driver va afficher ledit rendu à l'écran. Sans elle rien ne s'afficherait.
Pour terminer l'application proprement il nous reste à mettre une dernière ligne, hors de la boucle. Elle permet de détruire le
device et donc de libérer la mémoire :
Code : C++
Voici un récapitulatif du code que vous devriez avoir:
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | #include <irr/irrlicht.h>
int main(void) {
irr::IrrlichtDevice *device = irr::createDevice( // creation device
irr::video::EDT_OPENGL, // l'API est OpenGL
irr::core::dimension2d<irr::u32>(800,600), // taille de la fenetre 800x600
32, false, true, false, 0);
irr::video::IVideoDriver* driver =
device->getVideoDriver(); // creation driver
irr::scene::ISceneManager *sceneManager =
device->getSceneManager (); // creation scene manager
sceneManager->addCameraSceneNode (0, // ajout camera fixe
irr::core::vector3df (0,0,0),
irr::core::vector3df (5,0,0));
while (device->run()) { // la boucle de rendu
driver->beginScene( // demarre le rendu
true, // clear back-buffer
true, // clear z-buffer
irr::video::SColor(255,255,255,255)); // fond blanc
sceneManager->drawAll (); // calcule le rendu
driver->endScene (); // affiche le rendu
}
device->drop (); // liberation de la memoire
return 0;
}
|
Un coup de compilateur et que voyez-vous apparaître sous vos yeux ébahis ? Une fenêtre de 800 par 600 toute blanche. Rassurez-vous c'est normal.. Ce code peut être considéré comme le code minimal d'une application Irrlicht, il ne fait rien de particulier et sert de base pour le reste.
Dans le chapitre suivant le prochain nous ajouterons quelques lignes pour ajouter un cube et commencer à faire des choses un peu plus palpitantes.