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);
    }
}