1. Commandes OpenGL
Certains objets sont toujours les
mêmes. Comme OpenGL traduit toutes les séquences entrées, il est intéressant
de créer des listes pour regrouper les instructions. Cela accélère
légèrement l’affichage et réduit le code. Une liste est alors codée
par un entier (un seul entier est alors envoyé pour un objet quelconque).
En pratique, il faut :
d’abord réserver des numéros de listes avec : GLuint glGenLists( GLsizei range ), où "range" est le nombre de numéros de listes à réserver. Les numéros réservés vont de la valeur renvoyée à (cette valeur + range - 1).
ensuite appeler : void glNewList( GLuint list, GLenum mode ) avec pour list le numéro de la liste à créer, et mode = GL_COMPILE ou GL_COMPILE_AND_EXECUTE. Les deux modes créés la liste, mais le second en plus l’éxécute (l’affiche).
mettre toutes les routines souhaitées (glBegin, glColor, glVertex…), elles sont enregistrées dans la liste. Certaines commandes ne peuvent pas être enregistrées dans une liste, mais il y en a peu et c’est plutôt logique (par exemple glGenList, glFlush, glNewlist…).
terminer par : void glEndList( void )
Pour afficher une liste, il faut appeler : void glCallList( GLuint list ) ou void glCallLists( GLsizei n, GLenum type, const GLvoid *lists). Pour afficher plusieurs listes d’un coup (type indique le type du tableau passé en paramètre : GL_BYTE, GL_INT…).
Reste à effacer une liste lorsqu’elle n’est plus utile : void glDeleteLists( GLuint list, GLsizei range ), dont les paramètres sont les même que glGenList.
Il s'agit du même exemple qu'à la page précédente, mais cette fois un peu plus ordonnée avec des CallListes :
#define POINT 1
#define TRIANGLE 2
#define DROITE 3
void Make_CallListes()
{
glNewList(POINT,GL_COMPILE);
glBegin(GL_POINTS);
glVertex2f(-10.0f,-10.0f);
glEnd();
glEndList();
glNewList(TRIANGLE,GL_COMPILE);
glBegin(GL_TRIANGLES);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(0.0f,130.0f,0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(130.0f,0.0f,0.0f);
glEnd();
glEndList();
glNewList(DROITE,GL_COMPILE);
glColor3f(1.0f,0.0f,1.0f);
glBegin(GL_LINES);
glVertex3f(-10.0f,-10.0f,-50.0f);
glVertex3f(100.0f,100.0f,50.0f);
glEnd();
glEndList();
}
void CALLBACK Main_part(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glCallList(POINT);
glCallList(TRIANGLE);
glCallList(DROITE);
glFlush();
}
3. Remarque à propos d' AUX
Comme je l'ai déjà dit à lors de la présentation de GLUT et d'AUX, cette dernière bugue méchamment lorsqu'on utilise les CallListes et les fonctions de dessin prédéfinies tel que auxSolidSphere, auxSolidBox, auxSolidCone etc... En fait, dés que l'OpenGl rencontre une de ces fonctions dans la déclaration d'une liste, il sort de cette liste et la considère finie. Vous aurez certes votre sphère ou votre cône, mais ce qui se trouvait après n'aura même pas été lu !!! Evitez donc de les utiliser (elles ne sont là qu'a titre d'exemple, comme le dit si bien la documentation, et ne devrai pas servir dans des programmes plus consistants).