+ if (unit->t1d)
+ qglDisable(GL_TEXTURE_1D);
+ }
+ unit->t1d = texnum;
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);
+ CHECKGLERROR
+ }
+ // update 2d texture binding
+ if (unit->t2d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t2d)
+ qglDisable(GL_TEXTURE_2D);
+ unit->t2d = 0;
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);
+ CHECKGLERROR
+ }
+ // update 3d texture binding
+ if (unit->t3d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t3d)
+ qglDisable(GL_TEXTURE_3D);
+ unit->t3d = 0;
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);
+ CHECKGLERROR
+ }
+ // update cubemap texture binding
+ if (unit->tcubemap)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->tcubemap)
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ unit->tcubemap = 0;
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
+ CHECKGLERROR
+ }
+}
+
+void R_Mesh_TexBind(unsigned int unitnum, int texnum)
+{
+ gltextureunit_t *unit = gl_state.units + unitnum;
+ if (unitnum >= backendunits)
+ return;
+ if (r_showtrispass)
+ return;
+ // update 1d texture binding
+ if (unit->t1d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t1d)
+ qglDisable(GL_TEXTURE_1D);
+ unit->t1d = 0;
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);
+ CHECKGLERROR
+ }
+ // update 2d texture binding
+ if (unit->t2d != texnum)
+ {
+ GL_ActiveTexture(unitnum);
+ if (texnum)
+ {
+ if (unit->t2d == 0)
+ qglEnable(GL_TEXTURE_2D);
+ }
+ else
+ {
+ if (unit->t2d)
+ qglDisable(GL_TEXTURE_2D);
+ }
+ unit->t2d = texnum;
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);
+ CHECKGLERROR
+ }
+ // update 3d texture binding
+ if (unit->t3d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t3d)
+ qglDisable(GL_TEXTURE_3D);
+ unit->t3d = 0;
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);
+ CHECKGLERROR
+ }
+ // update cubemap texture binding
+ if (unit->tcubemap != 0)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->tcubemap)
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ unit->tcubemap = 0;
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
+ CHECKGLERROR
+ }
+}
+
+void R_Mesh_TexBind3D(unsigned int unitnum, int texnum)
+{
+ gltextureunit_t *unit = gl_state.units + unitnum;
+ if (unitnum >= backendunits)
+ return;
+ if (r_showtrispass)
+ return;
+ // update 1d texture binding
+ if (unit->t1d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t1d)
+ qglDisable(GL_TEXTURE_1D);
+ unit->t1d = 0;
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);
+ CHECKGLERROR
+ }
+ // update 2d texture binding
+ if (unit->t2d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t2d)
+ qglDisable(GL_TEXTURE_2D);
+ unit->t2d = 0;
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);
+ CHECKGLERROR
+ }
+ // update 3d texture binding
+ if (unit->t3d != texnum)
+ {
+ GL_ActiveTexture(unitnum);
+ if (texnum)
+ {
+ if (unit->t3d == 0)
+ qglEnable(GL_TEXTURE_3D);
+ }
+ else
+ {
+ if (unit->t3d)
+ qglDisable(GL_TEXTURE_3D);
+ }
+ unit->t3d = texnum;
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);
+ CHECKGLERROR
+ }
+ // update cubemap texture binding
+ if (unit->tcubemap != 0)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->tcubemap)
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ unit->tcubemap = 0;
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
+ CHECKGLERROR
+ }
+}
+
+void R_Mesh_TexBindCubeMap(unsigned int unitnum, int texnum)
+{
+ gltextureunit_t *unit = gl_state.units + unitnum;
+ if (unitnum >= backendunits)
+ return;
+ if (r_showtrispass)
+ return;
+ // update 1d texture binding
+ if (unit->t1d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t1d)
+ qglDisable(GL_TEXTURE_1D);
+ unit->t1d = 0;
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);
+ CHECKGLERROR
+ }
+ // update 2d texture binding
+ if (unit->t2d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t2d)
+ qglDisable(GL_TEXTURE_2D);
+ unit->t2d = 0;
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);
+ CHECKGLERROR
+ }
+ // update 3d texture binding
+ if (unit->t3d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unit->t3d)
+ qglDisable(GL_TEXTURE_3D);
+ unit->t3d = 0;
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);
+ CHECKGLERROR
+ }
+ // update cubemap texture binding
+ if (unit->tcubemap != texnum)
+ {
+ GL_ActiveTexture(unitnum);
+ if (texnum)
+ {
+ if (unit->tcubemap == 0)
+ qglEnable(GL_TEXTURE_CUBE_MAP_ARB);
+ }
+ else
+ {
+ if (unit->tcubemap)
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ }
+ unit->tcubemap = texnum;
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
+ CHECKGLERROR
+ }
+}
+
+void R_Mesh_TexMatrix(unsigned int unitnum, const matrix4x4_t *matrix)
+{
+ gltextureunit_t *unit = gl_state.units + unitnum;
+ if (r_showtrispass)
+ return;
+ if (matrix->m[3][3])
+ {
+ // texmatrix specified, check if it is different
+ if (!unit->texmatrixenabled || memcmp(&unit->matrix, matrix, sizeof(matrix4x4_t)))
+ {
+ matrix4x4_t tempmatrix;
+ unit->texmatrixenabled = true;
+ unit->matrix = *matrix;
+ Matrix4x4_Transpose(&tempmatrix, &unit->matrix);
+ qglMatrixMode(GL_TEXTURE);
+ GL_ActiveTexture(unitnum);
+ qglLoadMatrixf(&tempmatrix.m[0][0]);
+ qglMatrixMode(GL_MODELVIEW);
+ }
+ }
+ else
+ {
+ // no texmatrix specified, revert to identity
+ if (unit->texmatrixenabled)
+ {
+ unit->texmatrixenabled = false;
+ qglMatrixMode(GL_TEXTURE);
+ GL_ActiveTexture(unitnum);
+ qglLoadIdentity();
+ qglMatrixMode(GL_MODELVIEW);
+ }
+ }
+}
+
+void R_Mesh_TexCombine(unsigned int unitnum, int combinergb, int combinealpha, int rgbscale, int alphascale)
+{
+ gltextureunit_t *unit = gl_state.units + unitnum;
+ if (r_showtrispass)
+ return;
+ if (gl_combine.integer)
+ {
+ // GL_ARB_texture_env_combine
+ if (!combinergb)
+ combinergb = GL_MODULATE;
+ if (!combinealpha)
+ combinealpha = GL_MODULATE;
+ if (!rgbscale)
+ rgbscale = 1;
+ if (!alphascale)
+ alphascale = 1;
+ if (unit->combinergb != combinergb)
+ {
+ unit->combinergb = combinergb;
+ GL_ActiveTexture(unitnum);
+ qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, unit->combinergb);CHECKGLERROR