9.3.1 Modification du programme avec les textures

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 :

1
GLuint p_index;

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 = "");
		//destructeur
		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(){
	//le 1 est là car c'est la première glList à être initialisée
	p_index = glGenLists(1);
	//on dit tout ce que l'on veut afficher avec cette liste
	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);
	//on oublie pas de détruire la liste (1 étant le nombre de listes à détruire)
	glDeleteLists(p_index, 1);
}

Et voilà, maintenant on peut passer à la compilation.