Voila,
J'ai un probleme avec opengl. J'explique rapidement : apres un appel de glGenTextures, il m'est impossible d'allouer de la mémoire dynamiquement : le moindre appel à new provoque l'arret du programme. Les tutoriaux que j'ai pu trouver sur le net n'utilisent pas le new apres un glGenTextures.
Il m'est impossible de contourner cette situation car je compte me'écrire un petit gestionnaire de textures (simple , sans singleton) dont voici l'ébauche :
tm.h :
<code>
#include <SDL/SDL.h>
#include <GL/GL.h>
#include <SDL/SDL_image.h>
#ifndef _TM_VERSION_
#define _TM_VERSION_ 0.1
class texturemanager
{
private :
int nombre; // nombre maximum de textures
GLuint textures; // contenant les textures
bool *occupees; // tableau pour savoir si elles sont occupees
public :
texturemanager(int nombre); // nombre total de textures voulu
~texturemanager(); // detruire
int ajouter(char* fichier); // retourne le numero qui a été assigné sinon : -1 si tout est occupé
bool supprimer(int nombre); // supprimer la texture voulue : le nom sera libre
bool appeler(int numero); // selectionner la texture courante
};
#endif
</code>
et tm.cpp :
<code>
#include "tm.h"
texturemanager::texturemanager(int nombre)
{
this->nombre = nombre;
glGenTextures(this->nombre, &this->textures); // appel ici
this->occupees = new bool[nombre];
for(int a = 0; a <nombre; a++)
occupees[a] = false; // pas de plantage si ces lignes sont en commentaires
}
texturemanager::~texturemanager()
{
for(int a = 0; a < this->nombre; a++)
{
if(this->occupees[a])
{
glDeleteTextures(1, &this->textures);
}
}
delete(this->occupees);
}
int texturemanager::ajouter(char* fichier)
{
SDL_Surface* dessin = NULL;
for(int a = 0; a < this->nombre; a++)
{
if(!this->occupees[a]) // si c'est libre
{
dessin = IMG_Load(fichier);
if(!dessin)
{
printf("erreur : le fichier n\' a pas pu etre charge : %s.\n", SDL_GetError());
}
glBindTexture(GL_TEXTURE_2D, a);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3, dessin->w, dessin->h, 0, GL_RGB, GL_UNSIGNED_BYTE, dessin->pixels);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
SDL_FreeSurface(dessin);
this->occupees[a] = true;
return a;
}
}
return -1; // tout est pris (desole)
}
/*bool texturemanager::supprimer(int numero)
{
if(numero < this->nombre)
{
if(this->occupees[numero])
{
glDeleteTextures(1, );
return true;
}
return true;
}
//throw new exception("index hors des valeurs"); // pas bon
return false;
}*/
bool texturemanager::appeler(int numero)
{
if(numero < this->nombre)
{
if(this->occupees[numero])
{
glBindTexture(GL_TEXTURE_2D, numero);
return true;
}
//throw new
return false;
}
//throw new
return false;
}
</code>
Je sous ouvert à tous commentaires ou à toutes suggestions...
::supprimer est en commentaire car elle me pose des soucis que je règlerais plus tard
Merci d'avance