]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
-CL_Video now allows multiple streams again. It is registered as a r_module
[xonotic/darkplaces.git] / gl_backend.c
index 90562380b4f2c048e327dd9d9c547f0a0bd71c0e..143387522bf38e72559aa4eb29b9ae71d1b77db1 100644 (file)
@@ -75,8 +75,6 @@ void GL_PrintError(int errornumber, char *filename, int linenumber)
 
 #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;
@@ -149,7 +147,7 @@ static void R_Mesh_CacheArray_Shutdown(void);
 void GL_Backend_AllocArrays(void)
 {
        if (!gl_backend_mempool)
-               gl_backend_mempool = Mem_AllocPool("GL_Backend");
+               gl_backend_mempool = Mem_AllocPool("GL_Backend", 0, NULL);
        R_Mesh_CacheArray_Startup();
 }
 
@@ -161,7 +159,7 @@ void GL_Backend_FreeArrays(void)
 
 static void gl_backend_start(void)
 {
-       Con_DPrint("OpenGL Backend started\n");
+       Con_Print("OpenGL Backend started\n");
        if (qglDrawRangeElements != NULL)
        {
                CHECKGLERROR
@@ -169,7 +167,7 @@ static void gl_backend_start(void)
                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);
@@ -184,7 +182,7 @@ static void gl_backend_shutdown(void)
        backendunits = 0;
        backendactive = false;
 
-       Con_DPrint("OpenGL Backend shutting down\n");
+       Con_Print("OpenGL Backend shutting down\n");
 
        GL_Backend_FreeArrays();
 }
@@ -1209,6 +1207,17 @@ qboolean SCR_ScreenShot(char *filename, qbyte *buffer1, qbyte *buffer2, qbyte *b
        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)
@@ -1293,7 +1302,7 @@ void SCR_DrawScreen (void)
                        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)
@@ -1302,7 +1311,7 @@ void SCR_DrawScreen (void)
                        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;
                        }
@@ -1343,6 +1352,59 @@ void SCR_DrawScreen (void)
 
                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();
 }
 
 /*
@@ -1355,6 +1417,9 @@ 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)
@@ -1363,47 +1428,6 @@ void SCR_UpdateScreen (void)
        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);
@@ -1418,9 +1442,9 @@ void SCR_UpdateScreen (void)
        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;
@@ -1434,9 +1458,9 @@ void SCR_UpdateScreen (void)
 
                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;
@@ -1481,12 +1505,16 @@ void SCR_UpdateScreen (void)
 // 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