OBJ.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include "OBJ.h"
  2. OBJ::OBJ()
  3. {
  4. //ctor
  5. }
  6. OBJ::~OBJ()
  7. {
  8. //destructor
  9. }
  10. void OBJ::charger( std::string const src, GLuint samplerID, float vertMulti, float textMulti )
  11. {
  12. // Attribution texture
  13. m_textID = samplerID;
  14. /// Chargement du fichier obj
  15. // Variables
  16. std::vector<float> v_coord(0); // Coordonnées des vertices
  17. std::vector<float> v_norm(0); // Normales
  18. std::vector<float> v_text(0); // Coordonnées de texture des vertices
  19. std::vector<uint32_t> v_face(0); // Stocke les faces
  20. std::ifstream fichier( src.c_str() );
  21. int taille;
  22. float nb;
  23. uint32_t id;
  24. std::string mot;
  25. // Test flux
  26. if ( !fichier ) {
  27. std::cout << "Erreur lors du chargement du fichier : " << src << std::endl;
  28. return;
  29. }
  30. // Connaître la taille du fichier
  31. fichier.seekg(0, std::ios::end);
  32. taille = fichier.tellg();
  33. fichier.seekg(0, std::ios::beg);
  34. // Lecture du fichier
  35. while ( fichier.tellg() < taille && fichier.tellg()!=-1 )
  36. {
  37. fichier >> mot;
  38. if ( mot == "v" ) { // Coordonnées des vertices
  39. for ( int i(0); i<3; i++ ) {
  40. fichier >> nb;
  41. v_coord.push_back(nb);
  42. }
  43. } else if ( mot == "vt" ) { // Coordonnées de texture des vertices
  44. for ( int i(0); i<2; i++ ) {
  45. fichier >> nb;
  46. v_text.push_back( nb );
  47. }
  48. } else if ( mot == "vn" ) { // Coordonnées des normales
  49. for ( int i(0); i<3; i++ ) {
  50. fichier >> nb;
  51. v_norm.push_back(nb);
  52. }
  53. } else if ( mot == "f" ) { // Réalisation d'une face
  54. for ( int i(0); i<9; i++ ) {
  55. fichier >> id;
  56. v_face.push_back(id);
  57. }
  58. }
  59. mot = "rien";
  60. }
  61. // Création des tableaux openGL
  62. int nbFaces( v_face.size() / 9 ); // Contient le nombre de triangles
  63. m_nbVec = nbFaces * 3; // Contient le nombre de vertices à afficher
  64. uint32_t tailleVertices( nbFaces*3*3 ); // 3 vertices de 3 coordonnées par face
  65. m_tailleVerticesBytes = tailleVertices * sizeof(float);
  66. m_vertices = new float[tailleVertices];
  67. uint32_t tailleNormales( nbFaces*3*3 ); // 3 normales de 3 coordonnées par face
  68. m_tailleNormalesBytes = tailleNormales * sizeof(float);
  69. m_normales = new float[tailleNormales];
  70. uint32_t tailleCoordText( nbFaces*3*2 ); // 3 vertices de 2 coordonnées par face
  71. m_tailleCoordTextureBytes = tailleCoordText * sizeof(float);
  72. m_coordTexture = new float[tailleCoordText];
  73. // Remplissage des tableaux openGL
  74. uint32_t i(0), j(0), k(0);
  75. for ( i = 0; i<v_face.size(); i+=3) // Remplissage des vertices
  76. {
  77. for ( j = 0; j<3; j++) {
  78. m_vertices[i+j] = v_coord[ (v_face[i]-1)*3+j ] * vertMulti;
  79. m_normales[i+j] = v_norm[ (v_face[i+2]-1)*3+j ];
  80. }
  81. }
  82. for ( i = 1; i<v_face.size(); i+=3) // Remplissage des coordonnées de texture
  83. {
  84. for ( j = 0; j<2; j++)
  85. m_coordTexture[k+j] = v_text[ (v_face[i]-1)*2+j ] * textMulti;
  86. k += 2;
  87. }
  88. /// Chargement Vertex Buffer Object
  89. // Destruction d'un éventuel ancien VBO
  90. if(glIsBuffer(m_vboID) == GL_TRUE)
  91. glDeleteBuffers(1, &m_vboID);
  92. // Génération de l'ID
  93. glGenBuffers(1, &m_vboID);
  94. // Verrouillage du VBO
  95. glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
  96. // Allocation de la mémoire vidéo
  97. glBufferData(GL_ARRAY_BUFFER, m_tailleVerticesBytes + m_tailleNormalesBytes + m_tailleCoordTextureBytes, 0, GL_STATIC_DRAW);
  98. // Transfert des données
  99. glBufferSubData(GL_ARRAY_BUFFER, 0, m_tailleVerticesBytes, m_vertices);
  100. glBufferSubData(GL_ARRAY_BUFFER, m_tailleVerticesBytes, m_tailleNormalesBytes, m_normales);
  101. glBufferSubData(GL_ARRAY_BUFFER, m_tailleVerticesBytes+m_tailleNormalesBytes, m_tailleCoordTextureBytes, m_coordTexture);
  102. // Déverrouillage de l'objet
  103. glBindBuffer(GL_ARRAY_BUFFER, 0);
  104. /// Chargement Vertex Array Object
  105. // Destruction d'un éventuel ancien VAO
  106. if(glIsVertexArray(m_vaoID) == GL_TRUE)
  107. glDeleteVertexArrays(1, &m_vaoID);
  108. // Génération de l'ID du VAO
  109. glGenVertexArrays(1, &m_vaoID);
  110. // Verrouillage du VAO
  111. glBindVertexArray(m_vaoID);
  112. // Verrouillage du VBO
  113. glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
  114. // Accès aux vertices dans la mémoire vidéo
  115. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
  116. glEnableVertexAttribArray(0);
  117. // Accès aux normales dans la mémoire vidéo
  118. glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(m_tailleVerticesBytes));
  119. glEnableVertexAttribArray(1);
  120. // Accès aux coordonnées de texture dans la mémoire vidéo
  121. glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(m_tailleVerticesBytes+m_tailleNormalesBytes));
  122. glEnableVertexAttribArray(2);
  123. // Déverrouillage du VBO
  124. glBindBuffer(GL_ARRAY_BUFFER, 0);
  125. // Déverrouillage du VAO
  126. glBindVertexArray(0);
  127. }