void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *uindices) { // TODO: split for count > 65535? GLushort *indices = copy_gl_array(uindices, type, 1, 0, GL_UNSIGNED_SHORT, 1, 0, count); // TODO: do this in a more direct fashion. if (should_intercept_render(mode)) { glBegin(mode); for (int i = 0; i < count; i++) { glArrayElement(indices[i]); } glEnd(); free(indices); return; } bool compiling = (state.list.active && state.list.compiling); if (compiling) { renderlist_t *list = NULL; GLsizei min, max; if (compiling) list = state.list.active = extend_renderlist(state.list.active); normalize_indices(indices, &max, &min, count); list = arrays_to_renderlist(list, mode, 0, max + 1); list->indices = indices; list->len = count; end_renderlist(list); if (! compiling) { draw_renderlist(list); free_renderlist(list); } } else { LOAD_GLES(glDrawElements); gles_glDrawElements(mode, count, type, indices); free(indices); } }
void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *uindices) { // TODO: split for count > 65535? GLushort *indices = gl_copy_array(uindices, type, 1, 0, GL_UNSIGNED_SHORT, 1, 0, count, false); // TODO: do this in a more direct fashion. if (should_intercept_render(mode)) { glBegin(mode); state.block.active->artificial = true; for (int i = 0; i < count; i++) { glArrayElement(indices[i]); } glEnd(); free(indices); return; } displaylist_t *list = state.list.active; if (list) { GLsizei min, max; normalize_indices(indices, &max, &min, count); block_t *block = block_from_arrays(mode, min, max + 1); block->indices = indices; block->count = count; bl_end(block); if (list) { dl_append_block(list, block); } else { bl_draw(block); bl_free(block); } } else { LOAD_GLES(glDrawElements); gles_glDrawElements(mode, count, type, indices); free(indices); } }