Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Batches::set_all_vao_state(void){
- glGenBuffers(1, &Batches::get_global_vbo());
- GLuint vert_byte_offset = 0;
- for (int i = 0; i < Batches::get_batches_vec().size(); i++){
- glGenVertexArrays(1, &Batches::get_batches_vec()[i]->get_vao());
- glBindVertexArray(Batches::get_batches_vec()[i]->get_vao());
- glBindBuffer(GL_ARRAY_BUFFER, (Batches::get_global_vbo()));
- if (i == 0){
- glBufferData(GL_ARRAY_BUFFER, Batches::get_batches_vec_vert_byte_size(), nullptr, GL_DYNAMIC_DRAW);
- }
- glBufferSubData(GL_ARRAY_BUFFER, vert_byte_offset, Batches::get_batches_vec()[i]->get_vertsByteSize(), Batches::get_batches_vec()[i]->get_vert_Ptr());
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 11, (char*)((sizeof(GLfloat) * 0) + vert_byte_offset));
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 11, (char*)((sizeof(GLfloat) * 3) + vert_byte_offset));
- glEnableVertexAttribArray(2);
- glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 11, (char*)((sizeof(GLfloat) * 6) + vert_byte_offset));
- glEnableVertexAttribArray(3);
- glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 11, (char*)((sizeof(GLfloat) * 9) + vert_byte_offset));
- vert_byte_offset += Batches::get_batches_vec()[i]->get_vertsByteSize();
- glBindVertexArray(0);
- }
- glGenBuffers(1, &Batches::get_global_vbo());
- GLuint elem_byte_offset = 0;
- for (int i = 0; i < Batches::get_batches_vec().size(); i++){
- glBindVertexArray(Batches::get_batches_vec()[i]->get_vao());
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,Batches::get_global_vbo());
- if (i == 0){
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, Batches::get_batches_vec_ind_byte_size(), nullptr, GL_DYNAMIC_DRAW);
- }
- glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, elem_byte_offset, Batches::get_batches_vec()[i]->get_indsByteSize(), Batches::get_batches_vec()[i]->get_ind_Ptr());
- elem_byte_offset += Batches::get_batches_vec()[i]->get_indsByteSize();
- glBindVertexArray(0);
- }
- glGenBuffers(1, &Batches::get_global_instance_vbo());
- GLuint instance_byte_offset = 0;
- for (int i = 0; i < Batches::get_batches_vec().size(); i++){
- glBindVertexArray(Batches::get_batches_vec()[i]->get_vao());
- glBindBuffer(GL_ARRAY_BUFFER, Batches::get_global_instance_vbo());
- if (i == 0){
- glBufferData(GL_ARRAY_BUFFER, (Batches::get_total_num_instances_byte_size()),
- nullptr, GL_DYNAMIC_DRAW);
- }
- glBufferSubData(GL_ARRAY_BUFFER, instance_byte_offset, Batches::get_batches_vec()[i]->get_instances_byte_size(),
- &(Batches::get_batches_vec()[i]->get_instances_vec()[0]));
- glEnableVertexAttribArray(4);
- glEnableVertexAttribArray(5);
- glEnableVertexAttribArray(6);
- glEnableVertexAttribArray(7);
- glEnableVertexAttribArray(8);
- glEnableVertexAttribArray(9);
- glEnableVertexAttribArray(10);
- glEnableVertexAttribArray(11);
- //full transform mat
- glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 0) + instance_byte_offset));
- glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 4) + instance_byte_offset));
- glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 8) + instance_byte_offset));
- glVertexAttribPointer(7, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 12) + instance_byte_offset));
- //model to world mat
- glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 16) + instance_byte_offset));
- glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 20) + instance_byte_offset));
- glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 24) + instance_byte_offset));
- glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, (sizeof(glm::mat4) * 2), (char*)((sizeof(GLfloat) * 28) + instance_byte_offset));
- glVertexAttribDivisor(4,1);
- glVertexAttribDivisor(5,1);
- glVertexAttribDivisor(6,1);
- glVertexAttribDivisor(7,1);
- glVertexAttribDivisor(8,1);
- glVertexAttribDivisor(9,1);
- glVertexAttribDivisor(10,1);
- glVertexAttribDivisor(11,1);
- instance_byte_offset += Batches::get_batches_vec()[i]->get_instances_byte_size();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement