Cube.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "Cube.h"
  2. // Permet d'éviter la ré-écriture du namespace glm::
  3. using namespace glm;
  4. // Constructeur et Destructeur
  5. Cube::Cube(float taille, std::string const vertexShader, std::string const fragmentShader)
  6. : m_shader(vertexShader, fragmentShader), m_vboID(0), m_tailleVerticesBytes(108 * sizeof(float)), m_tailleCouleursBytes(108 * sizeof(float)), m_vaoID(0)
  7. {
  8. // Chargement du shader
  9. m_shader.charger();
  10. // Division de la taille
  11. taille /= 2;
  12. // Vertices temporaires
  13. float verticesTmp[] = {-taille, -taille, -taille, taille, -taille, -taille, taille, taille, -taille, // Face 1
  14. -taille, -taille, -taille, -taille, taille, -taille, taille, taille, -taille, // Face 1
  15. taille, -taille, taille, taille, -taille, -taille, taille, taille, -taille, // Face 2
  16. taille, -taille, taille, taille, taille, taille, taille, taille, -taille, // Face 2
  17. -taille, -taille, taille, taille, -taille, taille, taille, -taille, -taille, // Face 3
  18. -taille, -taille, taille, -taille, -taille, -taille, taille, -taille, -taille, // Face 3
  19. taille, -taille, taille, -taille, -taille, taille, -taille, taille, taille, // Face 4
  20. taille, -taille, taille, taille, taille, taille, -taille, taille, taille, // Face 4
  21. -taille, -taille, -taille, -taille, -taille, taille, -taille, taille, taille, // Face 5
  22. -taille, -taille, -taille, -taille, taille, -taille, -taille, taille, taille, // Face 5
  23. -taille, taille, taille, taille, taille, taille, taille, taille, -taille, // Face 6
  24. -taille, taille, taille, -taille, taille, -taille, taille, taille, -taille}; // Face 6
  25. // Couleurs temporaires
  26. float couleursTmp[] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Face 1
  27. 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Face 1
  28. 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Face 2
  29. 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Face 2
  30. 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, // Face 3
  31. 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, // Face 3
  32. 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Face 4
  33. 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Face 4
  34. 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Face 5
  35. 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Face 5
  36. 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, // Face 6
  37. 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0}; // Face 6
  38. // Copie des valeurs dans les tableaux finaux
  39. for(int i(0); i < 108; i++)
  40. {
  41. m_vertices[i] = verticesTmp[i];
  42. m_couleurs[i] = couleursTmp[i];
  43. }
  44. }
  45. Cube::~Cube()
  46. {
  47. // Destruction du VBO
  48. glDeleteBuffers(1, &m_vboID);
  49. // Destruction du VAO
  50. glDeleteVertexArrays(1, &m_vaoID);
  51. }
  52. // Méthodes
  53. void Cube::charger()
  54. {
  55. /// Chargement Vertex Buffer Object
  56. // Destruction d'un éventuel ancien VBO
  57. if(glIsBuffer(m_vboID) == GL_TRUE)
  58. glDeleteBuffers(1, &m_vboID);
  59. // Génération de l'ID
  60. glGenBuffers(1, &m_vboID);
  61. // Verrouillage du VBO
  62. glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
  63. // Allocation de la mémoire vidéo
  64. glBufferData(GL_ARRAY_BUFFER, m_tailleVerticesBytes + m_tailleCouleursBytes, 0, GL_STATIC_DRAW);//GL_DYNAMIC_DRAW, GL_STREAM_DRAW
  65. // Transfert des données
  66. glBufferSubData(GL_ARRAY_BUFFER, 0, m_tailleVerticesBytes, m_vertices);
  67. glBufferSubData(GL_ARRAY_BUFFER, m_tailleVerticesBytes, m_tailleCouleursBytes, m_couleurs);
  68. // Déverrouillage de l'objet
  69. glBindBuffer(GL_ARRAY_BUFFER, 0);
  70. /// Chargement Vertex Array Object
  71. // Destruction d'un éventuel ancien VAO
  72. if(glIsVertexArray(m_vaoID) == GL_TRUE)
  73. glDeleteVertexArrays(1, &m_vaoID);
  74. // Génération de l'identifiant du VAO
  75. glGenVertexArrays(1, &m_vaoID);
  76. // Verrouillage du VAO
  77. glBindVertexArray(m_vaoID);
  78. // Verrouillage du VBO
  79. glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
  80. // Accès aux vertices dans la mémoire vidéo
  81. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
  82. glEnableVertexAttribArray(0);
  83. // Accès aux couleurs dans la mémoire vidéo
  84. glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(m_tailleVerticesBytes));
  85. glEnableVertexAttribArray(1);
  86. // Déverrouillage du VBO
  87. glBindBuffer(GL_ARRAY_BUFFER, 0);
  88. // Déverrouillage du VAO
  89. glBindVertexArray(0);
  90. }
  91. void Cube::afficher(glm::mat4 &projection, glm::mat4 &modelview)
  92. {
  93. // Activation du shader
  94. glUseProgram(m_shader.getProgramID());
  95. // Verrouillage du VAO
  96. glBindVertexArray(m_vaoID);
  97. // Envoi des matrices
  98. glUniformMatrix4fv(glGetUniformLocation(m_shader.getProgramID(), "projection"), 1, GL_FALSE, value_ptr(projection));
  99. glUniformMatrix4fv(glGetUniformLocation(m_shader.getProgramID(), "modelview"), 1, GL_FALSE, value_ptr(modelview));
  100. // Rendu
  101. glDrawArrays(GL_TRIANGLES, 0, 36);
  102. // Déverrouillage du VAO
  103. glBindVertexArray(0);
  104. // Désactivation du shader
  105. glUseProgram(0);
  106. }
  107. void Cube::updateVBO(void *donnees, int tailleBytes, int decalage)
  108. {
  109. // Verrouillage du VBO
  110. glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
  111. // Récupération de l'adresse du VBO
  112. void *adresseVBO = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
  113. // Si l'adresse retournée est nulle alors on arrête le transfert
  114. if(adresseVBO == NULL)
  115. {
  116. std::cout << "Erreur au niveau de la récupération du VBO" << std::endl;
  117. glBindBuffer(GL_ARRAY_BUFFER, 0);
  118. return;
  119. }
  120. // Mise à jour des données
  121. memcpy((char*)adresseVBO + decalage, donnees, tailleBytes);
  122. // Annulation du pointeur
  123. glUnmapBuffer(GL_ARRAY_BUFFER);
  124. adresseVBO = 0;
  125. // Déverrouillage du VBO
  126. glBindBuffer(GL_ARRAY_BUFFER, 0);
  127. }