Tutorial 1 : les lumières

Nous allons voir dans cette partie du tutorial comment ajouter des lumières à notre scènes.

Ajout des lumières
La couleur!!

Ajout des lumières

Il faut rajouter 2 variables globales dans le fichier main.c.

RtCharset *Charset = NULL;

//les 2 lumières
RpLight *Ambient = NULL;
RpLight *Direct = NULL;

Ces 2 variables sont les lumières ambiante et directionnelle. Il faut ensuite une fonction qui crée les lumières et les ajoutes au monde. Par défaut les lumières sont blanches.

static void
CreateLights(void)
{
   Ambient = RpLightCreate(rpLIGHTAMBIENT);
   if (Ambient)
   {
      RpWorldAddLight(World, Ambient);
   }

   Direct = RpLightCreate(rpLIGHTDIRECTIONAL);
   if (Direct)
   {
      RwFrame *f = RwFrameCreate();
      RpLightSetFrame(Direct, f);
      RpWorldAddLight(World, Direct);
   }

}

On voit qu'on crée d'abord la lumière ambiante puis la lumière directionnelle. La lumière directionnelle est attachée à une Frame. Une Frame contient en fait les matrices permettant de déplacer un objet attaché à cette Frame.

Comme le monde et la caméra, qui sont créés dans Initialize3D(), il faut créer les lumières, là aussi dans Initialize3D().

// création des lumières
CreateLights();

/* Create a camera using the democom way... */
Camera = CreateCamera(World);

Et comme le clump dans le chapitre précédent, il faut détruire les lumières:

/**
Destruction des lumières
*/

static void
DestroyLights()
{
   //si la lumière directionnelle a été créée
   if (Direct)
   {
      RwFrame *f;
      RpWorldRemoveLight(World, Direct);
      //on récupère la frame
      f = RpLightGetFrame(Direct);
      RpLightSetFrame(Direct, NULL);
      //on détruit d'abord la frame
      RwFrameDestroy(f);
      //puis la lumière
      RpLightDestroy(Direct);
      Direct = NULL;
   }

   //si la lumière ambiante a été créée
   if (Ambient)
   {
      RpWorldRemoveLight(World, Ambient);
      RpLightDestroy(Ambient);
      Ambient = NULL;
   }
}

Et voici l'appel de la fonction crée ci-dessus:

//Destruction de tous les clump du World
RpWorldForAllClumps(World, _destroyClumpCB, NULL);

//destruction des lumières
DestroyLights();

Maintenat on recompile, on exécute et on appuie sur F1:

Fiat Lux!

Maintenant, on va essayer de mettre de la couleur dans le monde...

La couleur!!

Nous avons vu comment gérer l'appui sur F1. Nous allons voir comment changer la couleur des lumières en appuyant des touches F2 à F8. Il faut donc aller dans le gestionnaire du clavier. Et ajouter le code suivant :

case rsF2:
{
   if(Ambient)
   {
      RwRGBAReal Red = {1.0, 0, 0, 1.0};
      RpLightSetColor(Ambient,&Red);
   }
   return rsEVENTPROCESSED;
}

case rsF3:
{
   if(Direct)
   {
      RwRGBAReal Red = {1.0, 0, 0, 1.0};
      RpLightSetColor(Direct,&Red);
   }
   return rsEVENTPROCESSED;
}

Le bout de code ci-dessus permet de changer la couleur de la lumière ambiante et directionnelle et de les mettre en rouge.

Ce premier tutorial nous a permis de réaliser (le squelette nous a servi quand même...) une première application RenderWare, de lire un objet RenderWare, d'ajouter des lumières et de colorer ces lumières.

Dans le tutorial suivant nous allons voir comment réaliser l'interaction entre l'utilisateur et l'application : Tutorial 2