Texture.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include "Texture.h"
  2. // Constructeurs et Destructeur
  3. Texture::Texture() : m_id(0), m_fichierImage("")
  4. {
  5. }
  6. Texture::Texture(Texture const &textureACopier)
  7. {
  8. // Copie de la texture
  9. m_fichierImage = textureACopier.m_fichierImage;
  10. charger();
  11. }
  12. Texture::Texture(std::string fichierImage) : m_id(0), m_fichierImage(fichierImage)
  13. {
  14. }
  15. Texture::~Texture()
  16. {
  17. // Destruction de la texture
  18. glDeleteTextures(1, &m_id);
  19. }
  20. // Méthodes
  21. Texture& Texture::operator=(Texture const &textureACopier)
  22. {
  23. // Copie de la texture
  24. m_fichierImage = textureACopier.m_fichierImage;
  25. charger();
  26. // Retour du pointeur *this
  27. return *this;
  28. }
  29. bool Texture::charger()
  30. {
  31. // Chargement de l'image dans une surface SDL
  32. SDL_Surface *imageSDL = IMG_Load(m_fichierImage.c_str());
  33. if(imageSDL == 0)
  34. {
  35. std::cout << "Erreur : " << SDL_GetError() << std::endl;
  36. return false;
  37. }
  38. // Inversion de l'image
  39. SDL_Surface *imageInversee = inverserPixels(imageSDL);
  40. SDL_FreeSurface(imageSDL);
  41. // Destruction d'une éventuelle ancienne texture
  42. if(glIsTexture(m_id) == GL_TRUE)
  43. glDeleteTextures(1, &m_id);
  44. // Génération de l'ID
  45. glGenTextures(1, &m_id);
  46. // Verrouillage
  47. glBindTexture(GL_TEXTURE_2D, m_id);
  48. // Format de l'image
  49. GLenum formatInterne(0);
  50. GLenum format(0);
  51. // Détermination du format et du format interne pour les images à 3 composantes
  52. if(imageInversee->format->BytesPerPixel == 3)
  53. {
  54. // Format interne
  55. formatInterne = GL_RGB;
  56. // Format
  57. format = GL_RGB;
  58. }
  59. // Détermination du format et du format interne pour les images à 4 composantes
  60. else if(imageInversee->format->BytesPerPixel == 4)
  61. {
  62. // Format interne
  63. formatInterne = GL_RGBA;
  64. // Format
  65. format = GL_RGBA;
  66. }
  67. // Dans les autres cas, on arrête le chargement
  68. else
  69. {
  70. std::cout << "Erreur, format interne de l'image inconnu" << std::endl;
  71. SDL_FreeSurface(imageInversee);
  72. return false;
  73. }
  74. // Copie des pixels
  75. glTexImage2D(GL_TEXTURE_2D, 0, formatInterne, imageInversee->w, imageInversee->h, 0, format, GL_UNSIGNED_BYTE, imageInversee->pixels);
  76. // Application des filtres
  77. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  78. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  79. // Déverrouillage
  80. glBindTexture(GL_TEXTURE_2D, 0);
  81. // Fin de la méthode
  82. SDL_FreeSurface(imageInversee);
  83. return true;
  84. }
  85. SDL_Surface* Texture::inverserPixels(SDL_Surface *imageSource) const
  86. {
  87. // Copie conforme de l'image source sans les pixels
  88. SDL_Surface *imageInversee = SDL_CreateRGBSurface(0, imageSource->w, imageSource->h, imageSource->format->BitsPerPixel, imageSource->format->Rmask,
  89. imageSource->format->Gmask, imageSource->format->Bmask, imageSource->format->Amask);
  90. // Tableau intermédiaires permettant de manipuler les pixels
  91. unsigned char* pixelsSources = (unsigned char*) imageSource->pixels;
  92. unsigned char* pixelsInverses = (unsigned char*) imageInversee->pixels;
  93. // Inversion des pixels
  94. for(int i = 0; i < imageSource->h; i++)
  95. {
  96. for(int j = 0; j < imageSource->w * imageSource->format->BytesPerPixel; j++)
  97. pixelsInverses[(imageSource->w * imageSource->format->BytesPerPixel * (imageSource->h - 1 - i)) + j] = pixelsSources[(imageSource->w * imageSource->format->BytesPerPixel * i) + j];
  98. }
  99. // Retour de l'image inversée
  100. return imageInversee;
  101. }
  102. GLuint Texture::getID() const
  103. {
  104. return m_id;
  105. }
  106. void Texture::setFichierImage(const std::string &fichierImage)
  107. {
  108. m_fichierImage = fichierImage;
  109. }