GTK et OpenGL
Par
défaut, GTK ne propose pas de widget OpenGL. Mais pour palier ce manque, un
généreux développeur nommé Janne
Löf a créé GTKGLArea, qui propose un nouveau widget dérivé de GtkDrawingArea
permettant d’insérer des fenêtres OpenGL dans vos interfaces GTK. Vous trouverez
GTKGLArea à l’adresse indiquée en référence [9]. Notez que vous aurez besoin
de GTK en version 1.2 minimum.
A l'attaque
Pour
illustrer ce didacticiel, je vous propose de créer une application GTK toute
simple affichant un cube en 3D (figure 1). Je sais, je vous avais promis il
y a quelques temps de ne plus vous reparler de cube. Si je reviens sur ma promesse,
c’est tout simplement pour garder un code source concis et ne pas avoir à utiliser
les primitives géométriques standard de Glut. Comme d’habitude, vous pourrez
faire tourner le cube avec la souris (bouton gauche) et zoomer (bouton droit).
Pour le changement du mode d’affichage, nous utiliserons des boutons GTK en
lieu et place de nos habituels raccourcis clavier.
Si
vous jetez un coup d’œil au code source de
notre programme, vous vous rendrez compte
que l’architecture globale est finalement peu différente de ce que nous
avions avec glut. On se retrouve avec un système événementiel où un certain
nombre de fonctions de rappel sont associées aux différents événements pouvant
survenir (création de la fenêtre, clic de souris, appui sur un bouton…).
Initialisation
La
phase d’initialisation d’OpenGL permet, je vous le rappelle, de définir les
paramètres de base nécessaires au bon fonctionnement de l’application OpenGL :
paramètres de perspective, d’éclairage, de couleur… Lorsque nous utilisions
Glut, nous avions l’habitude d’appeler depuis la fonction main() une procédure
InitOpenGL(). Avec GTKGLArea, il va falloir agir différemment. La raison est
simple : pour initialiser OpenGL, il est nécessaire de disposer d’une fenêtre
(au sens X-Window du terme) à laquelle sera attaché le contexte OpenGL. Dans
le cas de Glut, cette fenêtre est créée avant l’appel à InitOpenGL par la fonction
glutCreateWindow(). Mais avec GTK, la fenêtre n’est effectivement créée que
lors de l’appel à gtk_widget_show().
La
solution pour remédier à ce problème est simple : il suffit d’attacher
la fonction d’initialisation d’OpenGL au signal ‘realize’ qui sera émis lors
de la création de la fenêtre.