+ qglDrawElements(GL_TRIANGLES, numelements, GL_UNSIGNED_INT, elements);CHECKGLERROR
+ }
+ CHECKGLERROR
+ GL_LockArrays(0, 0);
+ CHECKGLERROR
+ }
+}
+
+// restores backend state, used when done with 3D rendering
+void R_Mesh_Finish(void)
+{
+ int i;
+ BACKENDACTIVECHECK
+ CHECKGLERROR
+ GL_LockArrays(0, 0);
+ CHECKGLERROR
+
+ for (i = backendunits - 1;i >= 0;i--)
+ {
+ if (qglActiveTexture)
+ qglActiveTexture(GL_TEXTURE0_ARB + i);CHECKGLERROR
+ if (qglClientActiveTexture)
+ qglClientActiveTexture(GL_TEXTURE0_ARB + i);CHECKGLERROR
+ qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
+ qglDisable(GL_TEXTURE_1D);CHECKGLERROR
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ if (gl_texture3d)
+ {
+ qglDisable(GL_TEXTURE_3D);CHECKGLERROR
+ }
+ if (gl_texturecubemap)
+ {
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
+ qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);CHECKGLERROR
+ if (gl_combine.integer)
+ {
+ qglTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1);CHECKGLERROR
+ }
+ }
+ qglDisableClientState(GL_COLOR_ARRAY);CHECKGLERROR
+ qglDisableClientState(GL_VERTEX_ARRAY);CHECKGLERROR
+
+ qglDisable(GL_BLEND);CHECKGLERROR
+ qglEnable(GL_DEPTH_TEST);CHECKGLERROR
+ qglDepthMask(GL_TRUE);CHECKGLERROR
+ qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);CHECKGLERROR
+}
+
+void R_Mesh_Matrix(const matrix4x4_t *matrix)
+{
+ if (memcmp(matrix, &backend_modelmatrix, sizeof(matrix4x4_t)))
+ {
+ backend_modelmatrix = *matrix;
+ Matrix4x4_Concat(&backend_modelviewmatrix, &backend_viewmatrix, matrix);
+ Matrix4x4_Transpose(&backend_glmodelviewmatrix, &backend_modelviewmatrix);
+ qglLoadMatrixf(&backend_glmodelviewmatrix.m[0][0]);
+ }
+}
+
+void R_Mesh_TextureMatrix(int unitnumber, const matrix4x4_t *matrix)
+{
+ if (memcmp(&gl_state.units[unitnumber].matrix, matrix, sizeof(matrix4x4_t)))
+ {
+ matrix4x4_t tempmatrix;
+ gl_state.units[unitnumber].matrix = *matrix;
+ Matrix4x4_Transpose(&tempmatrix, &gl_state.units[unitnumber].matrix);
+ qglMatrixMode(GL_TEXTURE);
+ GL_ActiveTexture(unitnumber);
+ qglLoadMatrixf(&tempmatrix.m[0][0]);
+ qglMatrixMode(GL_MODELVIEW);
+ }
+}
+
+void R_Mesh_State_Texture(const rmeshstate_t *m)
+{
+ int i, combinergb, combinealpha, scale, arrayis3d;
+ gltextureunit_t *unit;
+
+ BACKENDACTIVECHECK
+
+ if (gl_backend_rebindtextures)
+ {
+ gl_backend_rebindtextures = false;
+ GL_SetupTextureState();
+ }
+
+ for (i = 0, unit = gl_state.units;i < backendunits;i++, unit++)
+ {
+ if (unit->t1d != m->tex1d[i])
+ {
+ GL_ActiveTexture(i);
+ if (m->tex1d[i])