+ qglDepthFunc (GL_LEQUAL);CHECKGLERROR
+
+ // set up viewpoint
+ qglMatrixMode(GL_PROJECTION);CHECKGLERROR
+ qglLoadIdentity ();CHECKGLERROR
+
+ // y is weird beause OpenGL is bottom to top, we use top to bottom
+ qglViewport(r_refdef.x, vid.realheight - (r_refdef.y + r_refdef.height), r_refdef.width, r_refdef.height);CHECKGLERROR
+
+ // depth range
+ zNear = 1.0;
+ zFar = r_mesh_farclip;
+
+ // fov angles
+ fovx = r_refdef.fov_x;
+ fovy = r_refdef.fov_y;
+ aspect = r_refdef.width / r_refdef.height;
+
+ // pyramid slopes
+ xmax = zNear * tan(fovx * M_PI / 360.0) * aspect;
+ ymax = zNear * tan(fovy * M_PI / 360.0);
+
+ // set view pyramid
+ qglFrustum(-xmax, xmax, -ymax, ymax, zNear, zFar);CHECKGLERROR
+
+ qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
+ qglLoadIdentity ();CHECKGLERROR
+
+ // put Z going up
+ qglRotatef (-90, 1, 0, 0);CHECKGLERROR
+ qglRotatef (90, 0, 0, 1);CHECKGLERROR
+ // camera rotation
+ qglRotatef (-r_refdef.viewangles[2], 1, 0, 0);CHECKGLERROR
+ qglRotatef (-r_refdef.viewangles[0], 0, 1, 0);CHECKGLERROR
+ qglRotatef (-r_refdef.viewangles[1], 0, 0, 1);CHECKGLERROR
+ // camera location
+ qglTranslatef (-r_refdef.vieworg[0], -r_refdef.vieworg[1], -r_refdef.vieworg[2]);CHECKGLERROR
+}
+
+static int mesh_blendfunc1;
+static int mesh_blendfunc2;
+static int mesh_blend;
+static GLboolean mesh_depthmask;
+static int mesh_depthtest;
+static int mesh_unit;
+static int mesh_clientunit;
+static int mesh_texture[MAX_TEXTUREUNITS];
+static float mesh_texturergbscale[MAX_TEXTUREUNITS];
+
+void GL_SetupTextureState(void)
+{
+ int i;
+ if (backendunits > 1)
+ {
+ for (i = 0;i < backendunits;i++)
+ {
+ qglActiveTexture(GL_TEXTURE0_ARB + (mesh_unit = i));CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_2D, mesh_texture[i]);CHECKGLERROR
+ if (gl_combine.integer)
+ {
+ qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_CONSTANT_ARB);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_PREVIOUS_ARB);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, GL_CONSTANT_ARB);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, GL_SRC_ALPHA);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, GL_SRC_ALPHA);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, mesh_texturergbscale[i]);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1);CHECKGLERROR
+ }
+ else
+ {
+ qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);CHECKGLERROR
+ }
+ if (mesh_texture[i])
+ {
+ qglEnable(GL_TEXTURE_2D);CHECKGLERROR
+ }
+ else
+ {
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ }
+ if (gl_mesh_drawmode.integer > 0)
+ {
+ qglClientActiveTexture(GL_TEXTURE0_ARB + (mesh_clientunit = i));CHECKGLERROR
+ qglTexCoordPointer(2, GL_FLOAT, sizeof(buf_texcoord_t), buf_texcoord[i]);CHECKGLERROR
+ if (mesh_texture[i])
+ {
+ qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
+ }
+ else
+ {
+ qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
+ }
+ }
+ }
+ }
+ else
+ {
+ qglBindTexture(GL_TEXTURE_2D, mesh_texture[0]);CHECKGLERROR
+ qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);CHECKGLERROR
+ if (mesh_texture[0])
+ {
+ qglEnable(GL_TEXTURE_2D);CHECKGLERROR
+ }
+ else
+ {
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ }
+ if (gl_mesh_drawmode.integer > 0)
+ {
+ qglTexCoordPointer(2, GL_FLOAT, sizeof(buf_texcoord_t), buf_texcoord[0]);CHECKGLERROR
+ if (mesh_texture[0])
+ {
+ qglEnableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
+ }
+ else
+ {
+ qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
+ }
+ }
+ }
+}