- R_Mesh_VertexPointer(m->pointer_vertex);
- R_Mesh_ColorPointer(m->pointer_color);
-
- if (gl_backend_rebindtextures)
- {
- gl_backend_rebindtextures = false;
- GL_SetupTextureState();
- }
-
- for (i = 0;i < backendimageunits;i++)
- R_Mesh_TexBindAll(i, m->tex1d[i], m->tex[i], m->tex3d[i], m->texcubemap[i]);
- for (i = 0;i < backendarrayunits;i++)
- {
- if (m->pointer_texcoord3f[i])
- R_Mesh_TexCoordPointer(i, 3, m->pointer_texcoord3f[i]);
- else
- R_Mesh_TexCoordPointer(i, 2, m->pointer_texcoord[i]);
- }
- for (i = 0;i < backendunits;i++)
- {
- R_Mesh_TexMatrix(i, &m->texmatrix[i]);
- R_Mesh_TexCombine(i, m->texcombinergb[i], m->texcombinealpha[i], m->texrgbscale[i], m->texalphascale[i]);
- }
-}
-
-void R_Mesh_Draw_ShowTris(int firstvertex, int numvertices, int numtriangles, const int *elements)
-{
- qglBegin(GL_LINES);
- for (;numtriangles;numtriangles--, elements += 3)
- {
- qglArrayElement(elements[0]);qglArrayElement(elements[1]);
- qglArrayElement(elements[1]);qglArrayElement(elements[2]);
- qglArrayElement(elements[2]);qglArrayElement(elements[0]);
- }
- qglEnd();
- CHECKGLERROR
-}
-
-/*
-==============================================================================
-
- SCREEN SHOTS
-
-==============================================================================
-*/
-
-qboolean SCR_ScreenShot(char *filename, unsigned char *buffer1, unsigned char *buffer2, unsigned char *buffer3, int x, int y, int width, int height, qboolean flipx, qboolean flipy, qboolean flipdiagonal, qboolean jpeg, qboolean gammacorrect)
-{
- int indices[3] = {0,1,2};
- qboolean ret;
-
- if (!r_render.integer)
- return false;
-
- qglReadPixels (x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer1);
- CHECKGLERROR
-
- if (scr_screenshot_gamma.value != 1 && gammacorrect)
- {
- int i;
- double igamma = 1.0 / scr_screenshot_gamma.value;
- unsigned char ramp[256];
- for (i = 0;i < 256;i++)
- ramp[i] = (unsigned char) (pow(i * (1.0 / 255.0), igamma) * 255.0);
- for (i = 0;i < width*height*3;i++)
- buffer1[i] = ramp[buffer1[i]];
- }
-
- Image_CopyMux (buffer2, buffer1, width, height, flipx, flipy, flipdiagonal, 3, 3, indices);
-
- if (jpeg)
- ret = JPEG_SaveImage_preflipped (filename, width, height, buffer2);
- else
- ret = Image_WriteTGARGB_preflipped (filename, width, height, buffer2, buffer3);
-
- return ret;
-}
-
-//=============================================================================
-
-void R_ClearScreen(void)
-{
- if (r_render.integer)
- {
- // clear to black
- if (fogenabled)
- qglClearColor(fogcolor[0],fogcolor[1],fogcolor[2],0);
- else
- qglClearColor(0,0,0,0);
- CHECKGLERROR
- qglClearDepth(1);CHECKGLERROR
- if (gl_stencil)
- {
- // LordHavoc: we use a stencil centered around 128 instead of 0,
- // to avoid clamping interfering with strange shadow volume
- // drawing orders
- qglClearStencil(128);CHECKGLERROR
- }
- // clear the screen
- GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (gl_stencil ? GL_STENCIL_BUFFER_BIT : 0));
- // set dithering mode
- if (gl_dither.integer)
- {
- qglEnable(GL_DITHER);CHECKGLERROR
- }
- else
- {
- qglDisable(GL_DITHER);CHECKGLERROR
- }
- }
-}
-
-qboolean CL_VM_UpdateView (void);
-void SCR_DrawConsole (void);
-
-int r_stereo_side;
-
-void SCR_DrawScreen (void)
-{
- R_Mesh_Start();
-
- if (r_timereport_active)
- R_TimeReport("setup");
-
- if (cls.signon == SIGNONS)
- {
- float size;
-
- size = scr_viewsize.value * (1.0 / 100.0);
- size = min(size, 1);
-
- if (r_stereo_sidebyside.integer)
- {
- r_refdef.width = vid.width * size / 2.5;
- r_refdef.height = vid.height * size / 2.5 * (1 - bound(0, r_letterbox.value, 100) / 100);
- r_refdef.x = (vid.width - r_refdef.width * 2.5) * 0.5;
- r_refdef.y = (vid.height - r_refdef.height)/2;
- if (r_stereo_side)
- r_refdef.x += r_refdef.width * 1.5;
- }
- else
- {
- r_refdef.width = vid.width * size;
- r_refdef.height = vid.height * size * (1 - bound(0, r_letterbox.value, 100) / 100);
- r_refdef.x = (vid.width - r_refdef.width)/2;
- r_refdef.y = (vid.height - r_refdef.height)/2;
- }
-
- // LordHavoc: viewzoom (zoom in for sniper rifles, etc)
- // LordHavoc: this is designed to produce widescreen fov values
- // when the screen is wider than 4/3 width/height aspect, to do
- // this it simply assumes the requested fov is the vertical fov
- // for a 4x3 display, if the ratio is not 4x3 this makes the fov
- // higher/lower according to the ratio
- r_refdef.frustum_y = tan(scr_fov.value * cl.viewzoom * M_PI / 360.0) * (3.0/4.0);
- r_refdef.frustum_x = r_refdef.frustum_y * (float)r_refdef.width / (float)r_refdef.height / vid_pixelheight.value;
-
- r_refdef.frustum_x *= r_refdef.frustumscale_x;
- r_refdef.frustum_y *= r_refdef.frustumscale_y;
-
- if(!CL_VM_UpdateView())
- R_RenderView();
- else
- SCR_DrawConsole();
-
- if (scr_zoomwindow.integer)
- {
- float sizex = bound(10, scr_zoomwindow_viewsizex.value, 100) / 100.0;
- float sizey = bound(10, scr_zoomwindow_viewsizey.value, 100) / 100.0;
- r_refdef.width = vid.width * sizex;
- r_refdef.height = vid.height * sizey;
- r_refdef.x = (vid.width - r_refdef.width)/2;
- r_refdef.y = 0;
-
- r_refdef.frustum_y = tan(scr_zoomwindow_fov.value * cl.viewzoom * M_PI / 360.0) * (3.0/4.0);
- r_refdef.frustum_x = r_refdef.frustum_y * vid_pixelheight.value * (float)r_refdef.width / (float)r_refdef.height;
-
- r_refdef.frustum_x *= r_refdef.frustumscale_x;
- r_refdef.frustum_y *= r_refdef.frustumscale_y;
-
- if(!CL_VM_UpdateView())
- R_RenderView();
- }
- }
-
- if (!r_stereo_sidebyside.integer)
- {
- r_refdef.width = vid.width;
- r_refdef.height = vid.height;
- r_refdef.x = 0;
- r_refdef.y = 0;
- }
-
- // draw 2D stuff
- R_DrawQueue();
-
- R_Mesh_Finish();
-
- if (r_timereport_active)
- R_TimeReport("meshfinish");
-}
-
-void SCR_UpdateLoadingScreen (void)
-{
- float x, y;
- cachepic_t *pic;
- rmeshstate_t m;
- // don't do anything if not initialized yet
- if (vid_hidden)
- return;
- r_showtrispass = 0;
- VID_UpdateGamma(false);
- qglViewport(0, 0, vid.width, vid.height);
- //qglDisable(GL_SCISSOR_TEST);
- //qglDepthMask(1);
- qglColorMask(1,1,1,1);
- //qglClearColor(0,0,0,0);
- //qglClear(GL_COLOR_BUFFER_BIT);
- //qglCullFace(GL_FRONT);
- //qglDisable(GL_CULL_FACE);
- //R_ClearScreen();
- R_Textures_Frame();
- GL_SetupView_Mode_Ortho(0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100);
- R_Mesh_Start();
- R_Mesh_Matrix(&identitymatrix);
- // draw the loading plaque
- pic = Draw_CachePic("gfx/loading", false);
- x = (vid_conwidth.integer - pic->width)/2;
- y = (vid_conheight.integer - pic->height)/2;
- GL_Color(1,1,1,1);
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- GL_DepthTest(false);
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = varray_vertex3f;
- m.pointer_texcoord[0] = varray_texcoord2f[0];
- m.tex[0] = R_GetTexture(pic->tex);
- R_Mesh_State(&m);
- varray_vertex3f[0] = varray_vertex3f[9] = x;
- varray_vertex3f[1] = varray_vertex3f[4] = y;
- varray_vertex3f[3] = varray_vertex3f[6] = x + pic->width;
- varray_vertex3f[7] = varray_vertex3f[10] = y + pic->height;
- varray_texcoord2f[0][0] = 0;varray_texcoord2f[0][1] = 0;
- varray_texcoord2f[0][2] = 1;varray_texcoord2f[0][3] = 0;
- varray_texcoord2f[0][4] = 1;varray_texcoord2f[0][5] = 1;
- varray_texcoord2f[0][6] = 0;varray_texcoord2f[0][7] = 1;
- GL_LockArrays(0, 4);
- R_Mesh_Draw(0, 4, 2, polygonelements);
- GL_LockArrays(0, 0);
- R_Mesh_Finish();
- // refresh
- VID_Finish(false);
-}
-
-/*
-==================
-SCR_UpdateScreen
-
-This is called every frame, and can also be called explicitly to flush
-text to the screen.
-==================
-*/
-void SCR_UpdateScreen (void)
-{
- if (vid_hidden)
- return;
-
- if (r_textureunits.integer > gl_textureunits)
- Cvar_SetValueQuick(&r_textureunits, gl_textureunits);
- if (r_textureunits.integer < 1)
- Cvar_SetValueQuick(&r_textureunits, 1);
-
- if (gl_combine.integer && !gl_combine_extension)
- Cvar_SetValueQuick(&gl_combine, 0);
-
- r_showtrispass = 0;
-
- CHECKGLERROR
- qglViewport(0, 0, vid.width, vid.height);
- qglDisable(GL_SCISSOR_TEST);
- qglDepthMask(1);
- qglColorMask(1,1,1,1);
- qglClearColor(0,0,0,0);
- qglClear(GL_COLOR_BUFFER_BIT);