Texture.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "Texture.h"
  2. // Constructeur
  3. Texture::Texture() : m_id(0)
  4. {
  5. }
  6. // Constructeur de copie
  7. Texture::Texture(Texture const &textureACopier)
  8. {
  9. //Rechargement de la même texture
  10. charger(textureACopier.m_chemin);
  11. }
  12. // Destructeur
  13. Texture::~Texture()
  14. {
  15. glDeleteTextures(1, &m_id);
  16. }
  17. //Opérateur =
  18. Texture& Texture::operator=(Texture const &textureACopier)
  19. {
  20. //Rechargement de la même texture
  21. charger(textureACopier.m_chemin);
  22. // Retour du pointeur *this
  23. return *this;
  24. }
  25. // Méthodes
  26. bool Texture::charger(std::string fichierImage)
  27. {
  28. //Attribution fichier image
  29. m_chemin = fichierImage;
  30. //Chargement
  31. SDL_Surface* imageInversee = SDL_LoadBMP(fichierImage.c_str());
  32. if(imageInversee == 0)
  33. {
  34. std::cout << "Erreur chargement texture : " << SDL_GetError() << std::endl;
  35. return false;
  36. }
  37. //Mettre l'image à l'endroit
  38. SDL_Surface* imageSDL = inverserPixels(imageInversee);
  39. SDL_FreeSurface(imageInversee);
  40. imageInversee = 0;
  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. std::cout << "Texture format interne|ordre de l'image "<<fichierImage<<" : ";
  53. if(imageSDL->format->BytesPerPixel == 3)
  54. {
  55. // Format interne
  56. formatInterne = GL_RGB;
  57. std::cout << "GL_RGB|";
  58. // Format
  59. if(imageSDL->format->Rmask == 0xff){
  60. format = GL_RGB;
  61. std::cout << "GL_RGB";
  62. }
  63. else{
  64. format = GL_BGR;
  65. std::cout << "GL_BGR";
  66. }
  67. }
  68. // Détermination du format et du format interne pour les images à 4 composantes
  69. else if(imageSDL->format->BytesPerPixel == 4)
  70. {
  71. // Format interne
  72. formatInterne = GL_RGBA;
  73. std::cout << "GL_RGBA|";
  74. // Format
  75. if(imageSDL->format->Rmask == 0xff){
  76. format = GL_RGBA;
  77. std::cout << "GL_RGBA";
  78. }
  79. else{
  80. format = GL_BGRA;
  81. std::cout << "GL_BGRA";
  82. }
  83. }
  84. // Dans les autres cas, on arrête le chargement
  85. else
  86. {
  87. std::cout << "Erreur, format interne de l'image inconnu" ;//<< std::endl;
  88. SDL_FreeSurface(imageSDL);
  89. return false;
  90. }
  91. std::cout << std::endl;
  92. // Copie des pixels
  93. glTexImage2D(GL_TEXTURE_2D, 0, formatInterne, imageSDL->w, imageSDL->h, 0, format, GL_UNSIGNED_BYTE, imageSDL->pixels);
  94. // Application des filtres
  95. //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  96. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  97. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  98. // Déverrouillage
  99. glBindTexture(GL_TEXTURE_2D, 0);
  100. // Fin de la méthode
  101. SDL_FreeSurface(imageSDL);
  102. return true;
  103. }
  104. GLuint Texture::getID() const
  105. {
  106. return m_id;
  107. }
  108. SDL_Surface* Texture::inverserPixels(SDL_Surface *imageSource) const
  109. {
  110. // Copie conforme de l'image source sans les pixels
  111. SDL_Surface *imageInversee = SDL_CreateRGBSurface(0, imageSource->w, imageSource->h, imageSource->format->BitsPerPixel, imageSource->format->Rmask,
  112. imageSource->format->Gmask, imageSource->format->Bmask, imageSource->format->Amask);
  113. // Tableau intermédiaires permettant de manipuler les pixels
  114. unsigned char* pixelsSources = (unsigned char*) imageSource->pixels;
  115. unsigned char* pixelsInverses = (unsigned char*) imageInversee->pixels;
  116. // Inversion des pixels
  117. for(int i = 0; i < imageSource->h; i++)
  118. {
  119. for(int j = 0; j < imageSource->w * imageSource->format->BytesPerPixel; j++)
  120. pixelsInverses[(imageSource->w * imageSource->format->BytesPerPixel * (imageSource->h - 1 - i)) + j] = pixelsSources[(imageSource->w * imageSource->format->BytesPerPixel * i) + j];
  121. }
  122. // Retour de l'image inversée
  123. return imageInversee;
  124. }