Mosaic.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "Mosaic.h"
  2. Mosaic::Mosaic() : m_text( 0x0 )
  3. {
  4. //ctor
  5. }
  6. Mosaic::~Mosaic()
  7. {
  8. if ( m_text ) delete m_text;
  9. }
  10. int Mosaic::charger( std::string const src, float vertMulti )
  11. {
  12. /// Création des attributs
  13. // Chargement du sprite
  14. SDL_Surface* image = SDL_LoadBMP( src.c_str() );
  15. if ( !image ) {
  16. std::cout << "Erreur lors du chargement de " << src << std::endl;
  17. }
  18. unsigned char* pixels = (unsigned char*) image->pixels;
  19. SDL_LockSurface(image);
  20. // Création de la texture
  21. m_text = new Texture(src);
  22. m_textID = m_text->getID();
  23. // Tableaux
  24. std::vector<float> v_coord(0); // Coordonnées des vertices
  25. std::vector<float> v_norm(0); // Normales
  26. std::vector<float> v_text(0); // Coordonnées de texture des vertices
  27. /// Attributions
  28. // Tableaux
  29. v_coord.push_back(-0.5f);//1
  30. v_coord.push_back(0.5f);
  31. v_coord.push_back(0.0f);
  32. v_coord.push_back(-0.5f);//2
  33. v_coord.push_back(-0.5f);
  34. v_coord.push_back(0.0f);
  35. v_coord.push_back(0.5f);//3
  36. v_coord.push_back(0.5f);
  37. v_coord.push_back(0.0f);
  38. v_coord.push_back(0.5f);//4
  39. v_coord.push_back(0.5f);
  40. v_coord.push_back(0.0f);
  41. v_coord.push_back(-0.5f);//5
  42. v_coord.push_back(-0.5f);
  43. v_coord.push_back(0.0f);
  44. v_coord.push_back(0.5f);//6
  45. v_coord.push_back(-0.5f);
  46. v_coord.push_back(0.0f);
  47. v_norm.push_back(0.0f);//1
  48. v_norm.push_back(0.0f);
  49. v_norm.push_back(1.0f);
  50. v_norm.push_back(0.0f);//2
  51. v_norm.push_back(0.0f);
  52. v_norm.push_back(1.0f);
  53. v_norm.push_back(0.0f);//3
  54. v_norm.push_back(0.0f);
  55. v_norm.push_back(1.0f);
  56. v_norm.push_back(0.0f);//4
  57. v_norm.push_back(0.0f);
  58. v_norm.push_back(1.0f);
  59. v_norm.push_back(0.0f);//5
  60. v_norm.push_back(0.0f);
  61. v_norm.push_back(1.0f);
  62. v_norm.push_back(0.0f);//6
  63. v_norm.push_back(0.0f);
  64. v_norm.push_back(1.0f);
  65. v_text.push_back(0.0f);//1
  66. v_text.push_back(1.0f);
  67. v_text.push_back(0.0f);//2
  68. v_text.push_back(0.0f);
  69. v_text.push_back(1.0f);//3
  70. v_text.push_back(1.0f);
  71. v_text.push_back(1.0f);//4
  72. v_text.push_back(1.0f);
  73. v_text.push_back(0.0f);//5
  74. v_text.push_back(0.0f);
  75. v_text.push_back(1.0f);//6
  76. v_text.push_back(0.0f);
  77. // Création des tableaux openGL
  78. m_nbVec = v_coord.size() / 3;
  79. m_tailleVerticesBytes = v_coord.size() * sizeof(float);
  80. m_vertices = new float[v_coord.size()];
  81. m_tailleNormalesBytes = v_norm.size() * sizeof(float);
  82. m_normales = new float[v_norm.size()];
  83. m_tailleCoordTextureBytes = v_text.size() * sizeof(float);
  84. m_coordTexture = new float[v_text.size()];
  85. // Remplissage des tableaux openGL
  86. for ( uint32_t i; i < v_coord.size(); i++ )
  87. m_vertices[i] = v_coord[i];
  88. for ( uint32_t i; i < v_norm.size(); i++ )
  89. m_vertices[i] = v_norm[i];
  90. for ( uint32_t i; i < v_text.size(); i++ )
  91. m_vertices[i] = v_text[i];
  92. /// Destruction de l'image
  93. SDL_FreeSurface( image );
  94. /// Chargement Vertex Buffer Object
  95. // Destruction d'un éventuel ancien VBO
  96. if(glIsBuffer(m_vboID) == GL_TRUE)
  97. glDeleteBuffers(1, &m_vboID);
  98. // Génération de l'ID
  99. glGenBuffers(1, &m_vboID);
  100. // Verrouillage du VBO
  101. glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
  102. // Allocation de la mémoire vidéo
  103. glBufferData(GL_ARRAY_BUFFER, m_tailleVerticesBytes + m_tailleNormalesBytes + m_tailleCoordTextureBytes, 0, GL_STATIC_DRAW);
  104. // Transfert des données
  105. glBufferSubData(GL_ARRAY_BUFFER, 0, m_tailleVerticesBytes, m_vertices);
  106. glBufferSubData(GL_ARRAY_BUFFER, m_tailleVerticesBytes, m_tailleNormalesBytes, m_normales);
  107. glBufferSubData(GL_ARRAY_BUFFER, m_tailleVerticesBytes+m_tailleNormalesBytes, m_tailleCoordTextureBytes, m_coordTexture);
  108. // Déverrouillage de l'objet
  109. glBindBuffer(GL_ARRAY_BUFFER, 0);
  110. /// Chargement Vertex Array Object
  111. // Destruction d'un éventuel ancien VAO
  112. if(glIsVertexArray(m_vaoID) == GL_TRUE)
  113. glDeleteVertexArrays(1, &m_vaoID);
  114. // Génération de l'ID du VAO
  115. glGenVertexArrays(1, &m_vaoID);
  116. // Verrouillage du VAO
  117. glBindVertexArray(m_vaoID);
  118. // Verrouillage du VBO
  119. glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
  120. // Accès aux vertices dans la mémoire vidéo
  121. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
  122. glEnableVertexAttribArray(0);
  123. // Accès aux normales dans la mémoire vidéo
  124. glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(m_tailleVerticesBytes));
  125. glEnableVertexAttribArray(1);
  126. // Accès aux coordonnées de texture dans la mémoire vidéo
  127. glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(m_tailleVerticesBytes+m_tailleNormalesBytes));
  128. glEnableVertexAttribArray(2);
  129. // Déverrouillage du VBO
  130. glBindBuffer(GL_ARRAY_BUFFER, 0);
  131. // Déverrouillage du VAO
  132. glBindVertexArray(0);
  133. /// Fin
  134. return 0;
  135. }