void draw(const VertexArray &varray, const IndexArray &iarray) { load_xform_matrices(); bool use_vbo = !varray.get_dynamic() && sys_caps.vertex_buffers; bool use_ibo = false;//!iarray.get_dynamic() && sys_caps.vertex_buffers; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); if(use_vbo) { Vertex v; glBindBuffer(GL_ARRAY_BUFFER_ARB, varray.get_buffer_object()); glVertexPointer(3, GL_SCALAR_TYPE, sizeof(Vertex), (void*)((char*)&v.pos - (char*)&v)); glNormalPointer(GL_SCALAR_TYPE, sizeof(Vertex), (void*)((char*)&v.normal - (char*)&v)); glColorPointer(4, GL_SCALAR_TYPE, sizeof(Vertex), (void*)((char*)&v.color - (char*)&v)); for(int i=0; i<MAX_TEXTURES; i++) { select_texture_unit(i); glEnableClientState(GL_TEXTURE_COORD_ARRAY); int dim = ttype[i] == TEX_1D ? 1 : (ttype[i] == TEX_3D || ttype[i] == TEX_CUBE ? 3 : 2); glTexCoordPointer(dim, GL_SCALAR_TYPE, sizeof(Vertex), (void*)((char*)&v.tex[coord_index[i]] - (char*)&v)); } glBindBuffer(GL_ARRAY_BUFFER_ARB, 0); } else { glVertexPointer(3, GL_SCALAR_TYPE, sizeof(Vertex), &varray.get_data()->pos); glNormalPointer(GL_SCALAR_TYPE, sizeof(Vertex), &varray.get_data()->normal); glColorPointer(4, GL_SCALAR_TYPE, sizeof(Vertex), &varray.get_data()->color); for(int i=0; i<MAX_TEXTURES; i++) { select_texture_unit(i); glEnableClientState(GL_TEXTURE_COORD_ARRAY); int dim = ttype[i] == TEX_1D ? 1 : (ttype[i] == TEX_3D || ttype[i] == TEX_CUBE ? 3 : 2); glTexCoordPointer(dim, GL_SCALAR_TYPE, sizeof(Vertex), &varray.get_data()->tex[coord_index[i]]); } } if(use_ibo) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, iarray.get_buffer_object()); glDrawElements(primitive_type, iarray.get_count(), GL_UNSIGNED_INT, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); } else { glDrawElements(primitive_type, iarray.get_count(), GL_UNSIGNED_INT, iarray.get_data()); } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); for(int i=0; i<MAX_TEXTURES; i++) { select_texture_unit(i); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } }