#define BACKENDACTIVECHECK if (!backendactive) Sys_Error("GL backend function called when backend is not active\n");
-int c_meshs, c_meshelements;
-
void SCR_ScreenShot_f (void);
static matrix4x4_t backend_viewmatrix;
static void gl_backend_start(void)
{
- Con_DPrint("OpenGL Backend started\n");
+ Con_Print("OpenGL Backend started\n");
if (qglDrawRangeElements != NULL)
{
CHECKGLERROR
CHECKGLERROR
qglGetIntegerv(GL_MAX_ELEMENTS_INDICES, &gl_maxdrawrangeelementsindices);
CHECKGLERROR
- Con_DPrintf("glDrawRangeElements detected (max vertices %i, max indices %i)\n", gl_maxdrawrangeelementsvertices, gl_maxdrawrangeelementsindices);
+ Con_Printf("glDrawRangeElements detected (max vertices %i, max indices %i)\n", gl_maxdrawrangeelementsvertices, gl_maxdrawrangeelementsindices);
}
backendunits = min(MAX_TEXTUREUNITS, gl_textureunits);
backendunits = 0;
backendactive = false;
- Con_DPrint("OpenGL Backend shutting down\n");
+ Con_Print("OpenGL Backend shutting down\n");
GL_Backend_FreeArrays();
}
qglReadPixels (x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer1);
CHECKGLERROR
+ if (scr_screenshot_gamma.value != 1)
+ {
+ 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)
if (r_stereo_sidebyside.integer)
{
r_refdef.width = vid.realwidth * size / 2.5;
- r_refdef.height = vid.realheight * size / 2.5;
+ r_refdef.height = vid.realheight * size / 2.5 * (1 - bound(0, r_letterbox.value, 100) / 100);
r_refdef.x = (vid.realwidth - r_refdef.width * 2.5) * 0.5;
r_refdef.y = (vid.realheight - r_refdef.height)/2;
if (r_stereo_side)
else
{
r_refdef.width = vid.realwidth * size;
- r_refdef.height = vid.realheight * size;
+ r_refdef.height = vid.realheight * size * (1 - bound(0, r_letterbox.value, 100) / 100);
r_refdef.x = (vid.realwidth - r_refdef.width)/2;
r_refdef.y = (vid.realheight - r_refdef.height)/2;
}
R_TimeReport("meshfinish");
}
+ r_showtrispass = 0;
+}
+
+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_GetWindowSize(&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight);
+ VID_UpdateGamma(false);
+ qglViewport(0, 0, vid.realwidth, vid.realheight);
+ //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(&r_identitymatrix);
+ // draw the loading plaque
+ pic = Draw_CachePic("gfx/loading.lmp");
+ 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(4, 2, polygonelements);
+ GL_LockArrays(0, 0);
+ R_Mesh_Finish();
+ // refresh
+ VID_Finish();
}
/*
*/
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)
if (gl_combine.integer && (!gl_combine_extension || r_textureunits.integer < 2))
Cvar_SetValueQuick(&gl_combine, 0);
- // bound viewsize
- if (scr_viewsize.value < 30)
- Cvar_Set ("viewsize","30");
- if (scr_viewsize.value > 120)
- Cvar_Set ("viewsize","120");
-
- // bound field of view
- if (scr_fov.value < 1)
- Cvar_Set ("fov","1");
- if (scr_fov.value > 170)
- Cvar_Set ("fov","170");
-
- // intermission is always full screen
- if (cl.intermission)
- sb_lines = 0;
- else
- {
- if (scr_viewsize.value >= 120)
- sb_lines = 0; // no status bar at all
- else if (scr_viewsize.value >= 110)
- sb_lines = 24; // no inventory
- else
- sb_lines = 24+16+8;
- }
-
- r_refdef.fovscale_x = 1;
- r_refdef.fovscale_y = 1;
- if (r_waterwarp.value > 0 && cl.worldmodel)
- {
- Mod_CheckLoaded(cl.worldmodel);
- if (CL_PointSuperContents(r_vieworigin) & SUPERCONTENTS_LIQUIDSMASK)
- {
- r_refdef.fovscale_x = 1 - (((sin(cl.time * 4.7) + 1) * 0.015) * r_waterwarp.value);
- r_refdef.fovscale_y = 1 - (((sin(cl.time * 3.0) + 1) * 0.015) * r_waterwarp.value);
- }
- }
-
- r_refdef.colormask[0] = 1;
- r_refdef.colormask[1] = 1;
- r_refdef.colormask[2] = 1;
-
CHECKGLERROR
qglViewport(0, 0, vid.realwidth, vid.realheight);
qglDisable(GL_SCISSOR_TEST);
if (r_stereo_redblue.integer || r_stereo_redgreen.integer || r_stereo_redcyan.integer || r_stereo_sidebyside.integer)
{
matrix4x4_t originalmatrix = r_refdef.viewentitymatrix;
- r_refdef.viewentitymatrix.m[0][3] = originalmatrix.m[0][3] + r_stereo_separation.value * -0.5f * r_refdef.viewentitymatrix.m[0][0];
- r_refdef.viewentitymatrix.m[1][3] = originalmatrix.m[1][3] + r_stereo_separation.value * -0.5f * r_refdef.viewentitymatrix.m[0][1];
- r_refdef.viewentitymatrix.m[2][3] = originalmatrix.m[2][3] + r_stereo_separation.value * -0.5f * r_refdef.viewentitymatrix.m[0][2];
+ r_refdef.viewentitymatrix.m[0][3] = originalmatrix.m[0][3] + r_stereo_separation.value * -0.5f * r_refdef.viewentitymatrix.m[0][1];
+ r_refdef.viewentitymatrix.m[1][3] = originalmatrix.m[1][3] + r_stereo_separation.value * -0.5f * r_refdef.viewentitymatrix.m[1][1];
+ r_refdef.viewentitymatrix.m[2][3] = originalmatrix.m[2][3] + r_stereo_separation.value * -0.5f * r_refdef.viewentitymatrix.m[2][1];
if (r_stereo_sidebyside.integer)
r_stereo_side = 0;
SCR_DrawScreen();
- r_refdef.viewentitymatrix.m[0][3] = originalmatrix.m[0][3] + r_stereo_separation.value * 0.5f * r_refdef.viewentitymatrix.m[0][0];
- r_refdef.viewentitymatrix.m[1][3] = originalmatrix.m[1][3] + r_stereo_separation.value * 0.5f * r_refdef.viewentitymatrix.m[0][1];
- r_refdef.viewentitymatrix.m[2][3] = originalmatrix.m[2][3] + r_stereo_separation.value * 0.5f * r_refdef.viewentitymatrix.m[0][2];
+ r_refdef.viewentitymatrix.m[0][3] = originalmatrix.m[0][3] + r_stereo_separation.value * 0.5f * r_refdef.viewentitymatrix.m[0][1];
+ r_refdef.viewentitymatrix.m[1][3] = originalmatrix.m[1][3] + r_stereo_separation.value * 0.5f * r_refdef.viewentitymatrix.m[1][1];
+ r_refdef.viewentitymatrix.m[2][3] = originalmatrix.m[2][3] + r_stereo_separation.value * 0.5f * r_refdef.viewentitymatrix.m[2][1];
if (r_stereo_sidebyside.integer)
r_stereo_side = 1;
// dynamic vertex array buffer subsystem
//===========================================================================
+// FIXME: someday this should be dynamically allocated and resized?
float varray_vertex3f[65536*3];
+float varray_svector3f[65536*3];
+float varray_tvector3f[65536*3];
+float varray_normal3f[65536*3];
float varray_color4f[65536*4];
float varray_texcoord2f[4][65536*2];
float varray_texcoord3f[4][65536*3];
-float varray_normal3f[65536*3];
int earray_element3i[65536];
+float varray_vertex3f2[65536*3];
//===========================================================================
// vertex array caching subsystem