En reprenant l'exemple avec les textures, nous allons modifier les fichier apptest.h et apptest.cpp pour utiliser les glLists.
Tout d'abord, on rajoute un index de glList dans apptest.h :
Ensuite on rajoute une fonction privée pour initialiser la glList :
1
|
void initialisationGlListsAppTest();
|
Voici à quoi ressemble le fichier apptest.h maintenant :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#ifndef APPTEST_H
#define APPTEST_H
#include "sdlopengl_app.h"
class AppTest : public SDLOpenGl_app {
public:
AppTest(double width = 640, double height = 480, double near = 1, double far = 1000, double angle = 70, const std::string & titre = "SDL_Application", const std::string & icon = "");
virtual ~AppTest();
protected:
virtual void draw();
virtual void update(float dt);
private:
void init();
void initialisationGlListsAppTest();
GLUquadric* p_params;
GLuint p_textureTerre;
GLuint p_textureSol;
GLuint p_index;
};
#endif
|
Puis, on implémente la fonction initialisationGlListsAppTest :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
void AppTest::initialisationGlListsAppTest(){
p_index = glGenLists(1);
glNewList(p_index, GL_COMPILE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, p_textureSol);
glBegin(GL_QUADS);
glColor3ub(255, 255, 255);
glTexCoord2d(10,10); glVertex3d(10.0, 10.0, 0.0);
glTexCoord2d(10,0); glVertex3d(10.0, -10.0, 0.0);
glTexCoord2d(0,0); glVertex3d(-10.0, -10.0, 0.0);
glTexCoord2d(0,10);glVertex3d(-10.0, 10.0, 0.0);
glEnd();
glTranslated(0.0, 0.0, 2.0);
glBindTexture(GL_TEXTURE_2D, p_textureTerre);
gluQuadricDrawStyle(p_params, GLU_FILL);
gluQuadricTexture(p_params, GL_TRUE);
glColor3ub(255, 255, 255);
gluSphere(p_params, 1.0, 20, 20);
glDisable(GL_TEXTURE_2D);
glTranslated(5.0, 5.0, 5.0);
glColor3ub(0, 0, 255);
gluSphere(p_params, 1.0, 20, 20);
glEndList();
}
|
Sur ce point, on ne s'est pas beaucoup foulé, on à juste recopier ce qu'il y avait dans la fonction draw dans l'initialisation de la glList.
Si vous êtes amenés à initialiser plusieurs glLists je vous conseil de mettre un compteur pour savoir comment initialiser l'index avec glGenLists pour être sûre qu'il n'y en ait pas deux identiques.
Il faut penser à appeler la fonction initialisationGlListsAppTest dans la fonction init :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void AppTest::init(){
this->addKeyEvent("forward", SDLK_z, false);
this->addKeyEvent("backward", SDLK_s, false);
this->addKeyEvent("right", SDLK_d, false);
this->addKeyEvent("left", SDLK_q, false);
this->addKeyEvent("turnUp", SDLK_UP, false);
this->addKeyEvent("turnDown", SDLK_DOWN, false);
this->addKeyEvent("turnRight", SDLK_RIGHT, false);
this->addKeyEvent("turnLeft", SDLK_LEFT, false);
glEnable(GL_TEXTURE_2D);
p_textureTerre = loadTexture(TERRE.c_str());
p_textureSol = loadTexture(SOL.c_str());
p_params = gluNewQuadric();
initialisationGlListsAppTest();
}
|
Il ne faut appeler cette fonction qu'une fois que l'on a initialisé les textures et le Quadrique.
Il ne faut pas oublier de modifier la fonction draw :
1
2
3
|
void AppTest::draw(){
glCallList(p_index);
}
|
Et on oublie pas de détruire la glList quand l'application se termine :
1
2
3
4
5
|
AppTest::~AppTest(){
gluDeleteQuadric(p_params);
glDeleteLists(p_index, 1);
}
|
Et voilà, maintenant on peut passer à la compilation.
|