OpenGL avec GtkGLArea
Par Xavier Michelon


 
   
Mise en place de la fenetre OpenGL dans l'interface GTK

La création de l’interface graphique de notre programme est faite par creeInterface(). Nous ne nous intéresserons qu’à la partie concernant le widget GTKGLArea :

if(gdk_gl_query() == FALSE) {
  fprintf(stderr,"Impossible d'utiliser OpenGL\n");
e
xit(1);
}
glarea = gtk_gl_area_new(listeAttributs);
gtk_widget_set_events(GTK_WIDGET(glarea),
                      GDK_EXPOSURE_MASK|
                      GDK_BUTTON_PRESS_MASK|
                     GDK_BUTTON_RELEASE_MASK|
                      GDK_POINTER_MOTION_MASK|
                      GDK_POINTER_MOTION_HINT_MASK);
gtk_widget_set_usize(GTK_WIDGET(glarea),300,300);
g
tk_box_pack_start(GTK_BOX(boiteh),glarea,TRUE,TRUE,0);
gtk_signal_connect (GTK_OBJECT(glarea), "realize",
                    GTK_SIGNAL_FUNC(initGlarea), NULL);
g
tk_signal_connect (GTK_OBJECT(glarea), "expose_event",
                    GTK_SIGNAL_FUNC(affichage), NULL);
gtk_signal_connect (GTK_OBJECT(glarea), "configure_event",
                    GTK_SIGNAL_FUNC(redimGlarea), NULL);
gtk_signal_connect (GTK_OBJECT(glarea), "motion_notify_event",
                    GTK_SIGNAL_FUNC(mouvementSouris), NULL);
gtk_signal_connect (GTK_OBJECT(glarea), "map_event",
                      GTK_SIGNAL_FUNC(rappelMap), NULL);

Le premier appel, gdk_gl-query(), permet de tester la possibilité d’utiliser OpenGL. Ensuite, le widget GTKGLArea se crée par un simple appel à :

gtk_gl_area_new(int ListeAttrib);

Le paramètre ListeAttrib est un tableau d’entiers terminé par zéro (où la constante GDK_GL_NONE) qui détermine le type de fenêtre que l’on souhaite créer, à la manière de ce que nous faisions avec glutInitDisplayMode(). Chaque appel à gtk_gl_area_new() entraîne la création d’un nouveau contexte, ce qui signifie que si vous créez plusieurs fenêtres, il vous faudra redéfinir les paramètres OpenGL pour chacune d’entre elles, notamment, les listes d’affichage. Bien sûr, ce système est coûteux en mémoire, aussi il existe une variante de gtk_gl_area qui permet de partager un même contexte entre plusieurs widgets : gtk_gl_area_share_new(). Nous n’aborderons pas cette fonction ici. Les personnes intéressées se réfèrerons au fichier de documentation gtkglarea.txt fourni avec le code source de l’application.

Avec gtk_gl_area_set_events(), on définit les signaux auxquels doit réagir notre widget, à savoir l’exposition (nécessité de redessiner le widget), l’appui et le relâchement d’un bouton de souris, les mouvements du pointeur. On définit ensuite la taille désirée pour notre widget avec gtk_widget_set_usize(), on insère judicieusement le widget dans l’interface avec gtk_box_pack_start, et enfin, on connecte les différents événements aux fonctions de rappel adéquates par des appels successifs à gtk_signal_connect().