Advertisement
Guest User

Untitled

a guest
Jan 24th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.29 KB | None | 0 0
  1. void Batches::set_all_vao_state(void){
  2. glGenBuffers(1, &Batches::get_global_vbo());
  3. GLuint vert_byte_offset = 0;
  4.     for (int i = 0; i < Batches::get_batches_vec().size(); i++){
  5.         glGenVertexArrays(1, &Batches::get_batches_vec()[i]->get_vao());
  6.         glBindVertexArray(Batches::get_batches_vec()[i]->get_vao());
  7.         glBindBuffer(GL_ARRAY_BUFFER, (Batches::get_global_vbo()));
  8.         if (i == 0){
  9.             glBufferData(GL_ARRAY_BUFFER, Batches::get_batches_vec_vert_byte_size(), nullptr, GL_DYNAMIC_DRAW);
  10.         }
  11.         glBufferSubData(GL_ARRAY_BUFFER, vert_byte_offset, Batches::get_batches_vec()[i]->get_vertsByteSize(), Batches::get_batches_vec()[i]->get_vert_Ptr());
  12.         glEnableVertexAttribArray(0);
  13.         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 11, (char*)((sizeof(GLfloat) * 0) + vert_byte_offset));
  14.         glEnableVertexAttribArray(1);
  15.         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 11, (char*)((sizeof(GLfloat) * 3) + vert_byte_offset));
  16.         glEnableVertexAttribArray(2);
  17.         glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 11, (char*)((sizeof(GLfloat) * 6) + vert_byte_offset));
  18.         glEnableVertexAttribArray(3);
  19.         glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 11, (char*)((sizeof(GLfloat) * 9) + vert_byte_offset));
  20.         vert_byte_offset += Batches::get_batches_vec()[i]->get_vertsByteSize();
  21.         glBindVertexArray(0);
  22.     }
  23.  
  24. glGenBuffers(1, &Batches::get_global_vbo());
  25. GLuint elem_byte_offset = 0;
  26.     for (int i = 0; i < Batches::get_batches_vec().size(); i++){
  27.         glBindVertexArray(Batches::get_batches_vec()[i]->get_vao());
  28.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,Batches::get_global_vbo());
  29.         if (i == 0){
  30.             glBufferData(GL_ELEMENT_ARRAY_BUFFER, Batches::get_batches_vec_ind_byte_size(), nullptr, GL_DYNAMIC_DRAW);
  31.         }
  32.         glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, elem_byte_offset, Batches::get_batches_vec()[i]->get_indsByteSize(), Batches::get_batches_vec()[i]->get_ind_Ptr());
  33.         elem_byte_offset += Batches::get_batches_vec()[i]->get_indsByteSize();
  34.         glBindVertexArray(0);
  35.     }
  36.  
  37. glGenBuffers(1, &Batches::get_global_instance_vbo());
  38. GLuint instance_byte_offset = 0;
  39.     for (int i = 0; i < Batches::get_batches_vec().size(); i++){
  40.         glBindVertexArray(Batches::get_batches_vec()[i]->get_vao());
  41.         glBindBuffer(GL_ARRAY_BUFFER, Batches::get_global_instance_vbo());
  42.         if (i == 0){
  43.             glBufferData(GL_ARRAY_BUFFER, (Batches::get_total_num_instances_byte_size()),
  44.                             nullptr, GL_DYNAMIC_DRAW);
  45.         }
  46.        
  47.         glBufferSubData(GL_ARRAY_BUFFER, instance_byte_offset, Batches::get_batches_vec()[i]->get_instances_byte_size(),
  48.         &(Batches::get_batches_vec()[i]->get_instances_vec()[0]));
  49.        
  50.         glEnableVertexAttribArray(4);
  51.         glEnableVertexAttribArray(5);
  52.         glEnableVertexAttribArray(6);
  53.         glEnableVertexAttribArray(7);
  54.         glEnableVertexAttribArray(8);
  55.         glEnableVertexAttribArray(9);
  56.         glEnableVertexAttribArray(10);
  57.         glEnableVertexAttribArray(11);
  58.         //full transform mat
  59.         glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 0) + instance_byte_offset));
  60.         glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 4) + instance_byte_offset));
  61.         glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 8) + instance_byte_offset));
  62.         glVertexAttribPointer(7, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 12) + instance_byte_offset));
  63.         //model to world mat
  64.         glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 16) + instance_byte_offset));
  65.         glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 20) + instance_byte_offset));
  66.         glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 24) + instance_byte_offset));
  67.         glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 28) + instance_byte_offset));
  68.  
  69.         glVertexAttribDivisor(4,1);
  70.         glVertexAttribDivisor(5,1);
  71.         glVertexAttribDivisor(6,1);
  72.         glVertexAttribDivisor(7,1);
  73.         glVertexAttribDivisor(8,1);
  74.         glVertexAttribDivisor(9,1);
  75.         glVertexAttribDivisor(10,1);
  76.         glVertexAttribDivisor(11,1);
  77.  
  78.         instance_byte_offset += Batches::get_batches_vec()[i]->get_instances_byte_size();
  79.     }
  80.  
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement