Cube.cpp 6.1 KB

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