|
|
Tutoriel #4 - Partitionner l'espace
Pour ce programme de démonstration, on va utiliser un objet représentant une tête de singe, créé directement sous Blender. L'objet a été un peu modifié afin de bien montrer comment fonctionne le partitionnement de l'espace.
On souhaite pouvoir repartitionner dynamiquement l'espace autour de l'objet afin de voir comment il est découpé en fonction de la profondeur de découpage choisie.
Présentons le code:
#include "scenegraph.h"
static gint s_octree_depth = 0;
static gboolean s_display_octree = TRUE;
On commence par inclure le fichier scenegraph.h qui donne accès aux types et aux prototypes de fonctions.
Ensuite, on définit deux variables statiques, la première contenant la profondeur en cours d'utilisation, et la deuxième indiquant si on affiche l'octree ou si on le cache.
Etant donné que l'on souhaite également modifier la valeur de la profondeur, on ajoute une fonction qui sera appelée par le moteur à chaque fois que l'on appuie sur une touche. En voici le code:
void keydown_callback(SDLKey key, void *data)
{
switch(key)
{
case SDLK_KP_PLUS:
sg_OctreeDestroy();
s_octree_depth++;
sg_OctreeCreate(s_octree_depth);
break;
case SDLK_KP_MINUS:
sg_OctreeDestroy();
s_octree_depth--;
if (s_octree_depth < 0) s_octree_depth = 0;
sg_OctreeCreate(s_octree_depth);
break;
case SDLK_SPACE:
s_display_octree = s_display_octree==TRUE?FALSE:TRUE;
sg_OctreeDraw(s_display_octree);
break;
default:
break;
}
}
On ne gère que l'appui sur les touches '+' et '-' du pavé numérique ainsi que l'appui sur la barre d'espace.
Si on modifie la profondeur, la première chose à faire est de détruire l'octree en cours et d'en recréer un nouveau. En cas de diminution de la profondeur, on teste si celle-ci ne devient pas négative. Elle ne doit pas descendre en dessous de 0.
On veut aussi afficher du texte à l'écran pour afficher, entre autre, la profondeur. Pour celà, on ajoute une fonction qui sera appelée à chaque rendu de l'objet.
void loop_callback(void *param)
{
sg_Printf(NULL, 10, 54, "Pave numerique '+' => augmente la profondeur");
sg_Printf(NULL, 10, 42, "Pave numerique '-' => diminue la profondeur");
sg_Printf(NULL, 10, 30, "Barre d'espace => affiche/cache l'octree");
sg_Printf(NULL, 10, 460, "Profondeur: %d", s_octree_depth);
}
On affiche aussi les touches à utiliser, pour mémoire.
Vient ensuite le coeur même du programme dans lequel on va initialiser le moteur, charger l'objet, enregistrer les fonctions de rappel, etc.
void run_test(int argc, char* argv[], char* envp[])
{
TObject *l_object;
sg_Init(argc, argv, envp, "Octree demonstration program");
sg_SetUserKeydownCallback(keydown_callback, NULL);
sg_SetUserCallback(loop_callback, NULL);
l_object = sg_CreateObject("modeles/monkey2.3dm", "monkey");
sg_OctreeInsertObject(l_object);
sg_OctreeCreate(s_octree_depth);
sg_OctreeDraw(TRUE);
sg_SetCamera(-22.0f, -31.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
sg_CreateLight ();
sg_EnableLight (0, TRUE);
sg_SetLightPosition (0, 10.0, 0.0, 20.0);
sg_SetMotionMode(MOTION_MODE_FPS);
sg_MainLoop();
}
On commence par initialiser le moteur, puis on enregistre les deux fonctions de rappel que l'on a défini plus haut.
Une fois que l'objet est chargé par appel à la fonction sg_CreateObject, on demande au moteur de gérer cet objet par l'octree grâce à l'appel à la fonction sg_OctreeInsertObject. Il n'y a que ça à faire.
Une fois que l'objet a été inséré, on peut créer l'octree avec la profondeur par défaut qui vaut 0 initialement.
On demande également au moteur de représenter l'octree dans la fenêtre de rendu via l'appel à la fonction sg_OctreeDraw en lui passant TRUE comme paramètre.
Viennent ensuite des appels plus classiques, en particulier le positionnement de la caméra, la création d'une source de lumière, l'activation du mode de déplacement de type FPS (First Person Shooter), et enfin la boucle principale de gestion des événements.
Enfin, on trouve la fonction main nécessaire à tout programme écrit en C:
int main(int argc, char* argv[], char* envp[])
{
run_test(argc, argv, envp);
return (0);
}
Voilà, c'est tout ! Et vous obtenez le résultat que vous pouvez voir dans les photos d'écran.
N'hésitez pas à me faire vos retours ou à poser des questions pour tout éclaircissement.
Article écrit par Zedraken le 10/11/2007 (lu 1633 - catégorie : Articles) - 
Commentaires
Cet article n'a pas encore été commenté.
Tu peux poster un commentaire en remplissant le formulaire plus bas. Commenter cet article
|  |