3.1.8 Le chargement

Le chargement d'une texture copiée est ce qu'il y a de plus délicat à gérer, surtout dans notre situation car nous avons deux méthodes de chargement : l'une pour les images présentes sur le disque dur et l'autre pour les textures vides.

Le problème avec la copie ici c'est que la classe Texture est incapable de savoir laquelle des deux elle doit appeler. Pour le moment, elle appelle toujours la méthode charger() quelque soit le type de texture (vide ou image), ce qui va nous poser des problèmes quand on utilisera les Color Buffer car eux ont besoin de l'autre méthode.

Pour éviter cela, nous devons définir manuellement les cas de chargement pour appeler la bonne méthode. Pour nous aider, nous allons nous servir du seul attribut que nous n'avons pas encore utilisé : le booléen m_textureVide. Nous lui avions donné une valeur dans tous les constructeurs un peu plus haut.

Si sa valeur est égale à true (c'est-à-dire si la texture est vide) alors nous devons appeler la méthode chargerTextureVide(). Si elle est égale à false (image SDL), alors nous devons appeler la méthode charger(). Un petit bloc if sera nécessaire pour faire cette vérification :

1
2
if(m_textureVide) chargerTextureVide();  //Si la texture est vide, alors on appelle la méthode chargerTextureVide()
else charger();                          //Sinon, on appelle la méthode charger() par défaut

Le constructeur complet :

1
2
3
4
5
6
7
8
9
10
11
12
13
Texture::Texture(Texture const &textureACopier){
	// Copie des attributs
	m_fichierImage = textureACopier.m_fichierImage;

	m_largeur = textureACopier.m_largeur;
	m_hauteur = textureACopier.m_hauteur;
	m_format = textureACopier.m_format;
	m_formatInterne = textureACopier.m_formatInterne;
	m_textureVide = textureACopier.m_textureVide;

	if(m_textureVide) chargerTextureVide();   // Si la texture est vide, alors on appelle la méthode chargerTextureVide()
	else charger();                           // Sinon, on appelle la méthode charger() par défaut
}

Cette fois, la classe appellera la bonne méthode pour charger la texture. Problème de copie des textures non chargées

Il ne manque plus qu'une condition à gérer et toute cette partie embêtante sera terminée.

Celle-ci concerne les textures qui n'ont pas encore été chargées au moment de la copie, c'est-à-dire celles dont nous n'avons appelé ni la méthode charger(), ni la méthode chargerTextureVide(). Que se passerait-il à votre avis si on essayait d'en copier une dans cette situation ? Et bien la copie serait automatiquement chargée même si l'originale ne l'était pas. Cet automatisme peut causer des problèmes et engendrer des bugs dans certains cas.

Pour éviter cela encore une fois, nous devons rajouter une condition qui vérifiera si la copie doit être chargée ou pas. Nous utiliserons la fonction glIsTexture() qui nous permet justement de savoir ceci :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Texture::Texture(Texture const &textureACopier){
	// Copie des attributs
	m_fichierImage = textureACopier.m_fichierImage;
	m_largeur = textureACopier.m_largeur;
	m_hauteur = textureACopier.m_hauteur;
	m_format = textureACopier.m_format;
	m_formatInterne = textureACopier.m_formatInterne;
	m_textureVide = textureACopier.m_textureVide;

	// Si la texture est vide, alors on appelle la méthode chargerTextureVide()
	if(m_textureVide && glIsTexture(textureACopier.m_id) == GL_TRUE) chargerTextureVide();

	// Sinon, on appelle la méthode charger() par défaut
	else if(glIsTexture(textureACopier.m_id) == GL_TRUE) charger();
}

Désormais, pour déclencher un des deux chargements, il faudra que la texture originale ait un identifiant valide.