void ImmediateModeRenderer10::end () {
    if (idxPos == 0) return;

    GL10 * gl = gl10;
    gl->glEnableClientState(GL_VERTEX_ARRAY);
    positionsBuffer.clear();
    positionsBuffer.copy<float>(positions, idxPos, 0);
    gl->glVertexPointer(3, GL_FLOAT, 0, positionsBuffer);

    if (hasCols) {
        gl->glEnableClientState(GL_COLOR_ARRAY);
        colorsBuffer.clear();
        colorsBuffer.copy<float>(colors, idxCols, 0);
        gl->glColorPointer(4, GL_FLOAT, 0, colorsBuffer);
    }

    if (hasNors) {
        gl->glEnableClientState(GL_NORMAL_ARRAY);
        normalsBuffer.clear();
        normalsBuffer.copy<float>(normals, idxNors, 0);
        gl->glNormalPointer(GL_FLOAT, 0, normalsBuffer);
    }

    if (hasTexCoords) {
        gl->glClientActiveTexture(GL_TEXTURE0);
        gl->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        texCoordsBuffer.clear();
        texCoordsBuffer.copy<float>(texCoords, idxTexCoords, 0);
        gl->glTexCoordPointer(2, GL_FLOAT, 0, texCoordsBuffer);
    }

    gl->glDrawArrays(primitiveType, 0, idxPos / 3);

    if (hasCols) gl->glDisableClientState(GL_COLOR_ARRAY);
    if (hasNors) gl->glDisableClientState(GL_NORMAL_ARRAY);
    if (hasTexCoords) gl->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}