]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
added Print versions of Printf functions and made all calls that do not need formatin...
[xonotic/darkplaces.git] / gl_backend.c
index 9f970fe63e4ed91a434ce542d3f688b17478af0a..003ccfe11afe11f9d1b36018713392719610e694 100644 (file)
@@ -155,7 +155,7 @@ void GL_Backend_FreeArrays(void)
 
 static void gl_backend_start(void)
 {
-       Con_DPrintf("OpenGL Backend started\n");
+       Con_DPrint("OpenGL Backend started\n");
        if (qglDrawRangeElements != NULL)
        {
                CHECKGLERROR
@@ -178,7 +178,7 @@ static void gl_backend_shutdown(void)
        backendunits = 0;
        backendactive = false;
 
-       Con_DPrintf("OpenGL Backend shutting down\n");
+       Con_DPrint("OpenGL Backend shutting down\n");
 
        GL_Backend_FreeArrays();
 }
@@ -345,6 +345,7 @@ static struct
        int blendfunc2;
        int blend;
        GLboolean depthmask;
+       int colormask; // stored as bottom 4 bits: r g b a (3 2 1 0 order)
        int depthtest;
        int scissortest;
        int unit;
@@ -427,6 +428,7 @@ void GL_Backend_ResetState(void)
        gl_state.blendfunc2 = GL_ZERO;
        gl_state.blend = false;
        gl_state.depthmask = GL_TRUE;
+       gl_state.colormask = 15;
        gl_state.color4f[0] = gl_state.color4f[1] = gl_state.color4f[2] = gl_state.color4f[3] = 1;
        gl_state.lockrange_first = 0;
        gl_state.lockrange_count = 0;
@@ -435,6 +437,7 @@ void GL_Backend_ResetState(void)
 
        CHECKGLERROR
 
+       qglColorMask(1, 1, 1, 1);
        qglEnable(GL_CULL_FACE);CHECKGLERROR
        qglCullFace(GL_FRONT);CHECKGLERROR
        qglEnable(GL_DEPTH_TEST);CHECKGLERROR
@@ -484,6 +487,8 @@ void GL_BlendFunc(int blendfunc1, int blendfunc2)
 {
        if (gl_state.blendfunc1 != blendfunc1 || gl_state.blendfunc2 != blendfunc2)
        {
+               if (r_showtrispass)
+                       return;
                qglBlendFunc(gl_state.blendfunc1 = blendfunc1, gl_state.blendfunc2 = blendfunc2);CHECKGLERROR
                if (gl_state.blendfunc2 == GL_ZERO)
                {
@@ -519,6 +524,8 @@ void GL_DepthMask(int state)
 {
        if (gl_state.depthmask != state)
        {
+               if (r_showtrispass)
+                       return;
                qglDepthMask(gl_state.depthmask = state);CHECKGLERROR
        }
 }
@@ -527,6 +534,8 @@ void GL_DepthTest(int state)
 {
        if (gl_state.depthtest != state)
        {
+               if (r_showtrispass)
+                       return;
                gl_state.depthtest = state;
                if (gl_state.depthtest)
                {
@@ -539,6 +548,18 @@ void GL_DepthTest(int state)
        }
 }
 
+void GL_ColorMask(int r, int g, int b, int a)
+{
+       int state = r*8 + g*4 + b*2 + a*1;
+       if (gl_state.colormask != state)
+       {
+               if (r_showtrispass)
+                       return;
+               gl_state.colormask = state;
+               qglColorMask((GLboolean)r, (GLboolean)g, (GLboolean)b, (GLboolean)a);CHECKGLERROR
+       }
+}
+
 void GL_VertexPointer(const float *p)
 {
        if (gl_state.pointer_vertex != p)
@@ -554,6 +575,8 @@ void GL_ColorPointer(const float *p)
 {
        if (gl_state.pointer_color != p)
        {
+               if (r_showtrispass)
+                       return;
                CHECKGLERROR
                if (!gl_state.pointer_color)
                {
@@ -575,6 +598,8 @@ void GL_Color(float cr, float cg, float cb, float ca)
 {
        if (gl_state.pointer_color || gl_state.color4f[0] != cr || gl_state.color4f[1] != cg || gl_state.color4f[2] != cb || gl_state.color4f[3] != ca)
        {
+               if (r_showtrispass)
+                       return;
                GL_ColorPointer(NULL);
                gl_state.color4f[0] = cr;
                gl_state.color4f[1] = cg;
@@ -586,6 +611,16 @@ void GL_Color(float cr, float cg, float cb, float ca)
        }
 }
 
+void GL_ShowTrisColor(float cr, float cg, float cb, float ca)
+{
+       if (!r_showtrispass)
+               return;
+       r_showtrispass = false;
+       GL_Color(cr * r_showtris.value, cg * r_showtris.value, cb * r_showtris.value, ca);
+       r_showtrispass = true;
+}
+
+
 void GL_LockArrays(int first, int count)
 {
        if (gl_state.lockrange_count != count || gl_state.lockrange_first != first)
@@ -628,6 +663,13 @@ void GL_ScissorTest(int state)
        CHECKGLERROR
 }
 
+void GL_Clear(int mask)
+{
+       if (r_showtrispass)
+               return;
+       qglClear(mask);CHECKGLERROR
+}
+
 void GL_TransformToScreen(const vec4_t in, vec4_t out)
 {
        vec4_t temp;
@@ -635,8 +677,8 @@ void GL_TransformToScreen(const vec4_t in, vec4_t out)
        Matrix4x4_Transform4 (&backend_viewmatrix, in, temp);
        Matrix4x4_Transform4 (&backend_projectmatrix, temp, out);
        iw = 1.0f / out[3];
-       out[0] = r_refdef.x + (out[0] * iw + 1.0f) * r_refdef.width * 0.5f;
-       out[1] = r_refdef.y + (out[1] * iw + 1.0f) * r_refdef.height * 0.5f;
+       out[0] = r_view_x + (out[0] * iw + 1.0f) * r_view_width * 0.5f;
+       out[1] = r_view_y + (out[1] * iw + 1.0f) * r_view_height * 0.5f;
        out[2] = out[2] * iw;
 }
 
@@ -672,6 +714,11 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements)
                Con_Printf("R_Mesh_Draw(%d, %d, %08p);\n", numverts, numtriangles, elements);
                return;
        }
+       if (r_showtrispass)
+       {
+               R_Mesh_Draw_ShowTris(numverts, numtriangles, elements);
+               return;
+       }
        c_meshs++;
        c_meshelements += numelements;
        CHECKGLERROR
@@ -682,13 +729,13 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements)
                        int i, j, size;
                        const int *p;
                        if (!qglIsEnabled(GL_VERTEX_ARRAY))
-                               Con_Printf("R_Mesh_Draw: vertex array not enabled\n");
+                               Con_Print("R_Mesh_Draw: vertex array not enabled\n");
                        for (j = 0, size = numverts * (int)sizeof(float[3]), p = gl_state.pointer_vertex;j < size;j += sizeof(int), p++)
                                paranoidblah += *p;
                        if (gl_state.pointer_color)
                        {
                                if (!qglIsEnabled(GL_COLOR_ARRAY))
-                                       Con_Printf("R_Mesh_Draw: color array set but not enabled\n");
+                                       Con_Print("R_Mesh_Draw: color array set but not enabled\n");
                                for (j = 0, size = numverts * (int)sizeof(float[4]), p = gl_state.pointer_color;j < size;j += sizeof(int), p++)
                                        paranoidblah += *p;
                        }
@@ -697,10 +744,10 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements)
                                if (gl_state.units[i].t1d || gl_state.units[i].t2d || gl_state.units[i].t3d || gl_state.units[i].tcubemap || gl_state.units[i].arrayenabled)
                                {
                                        if (gl_state.units[i].arrayenabled && !(gl_state.units[i].t1d || gl_state.units[i].t2d || gl_state.units[i].t3d || gl_state.units[i].tcubemap))
-                                               Con_Printf("R_Mesh_Draw: array enabled but no texture bound\n");
+                                               Con_Print("R_Mesh_Draw: array enabled but no texture bound\n");
                                        GL_ActiveTexture(i);
                                        if (!qglIsEnabled(GL_TEXTURE_COORD_ARRAY))
-                                               Con_Printf("R_Mesh_Draw: texcoord array set but not enabled\n");
+                                               Con_Print("R_Mesh_Draw: texcoord array set but not enabled\n");
                                        for (j = 0, size = numverts * ((gl_state.units[i].t3d || gl_state.units[i].tcubemap) ? (int)sizeof(float[3]) : (int)sizeof(float[2])), p = gl_state.units[i].pointer_texcoord;j < size;j += sizeof(int), p++)
                                                paranoidblah += *p;
                                }
@@ -797,9 +844,9 @@ void R_Mesh_Finish(void)
 {
        int i;
        BACKENDACTIVECHECK
-               CHECKGLERROR
+       CHECKGLERROR
        GL_LockArrays(0, 0);
-               CHECKGLERROR
+       CHECKGLERROR
 
        for (i = backendunits - 1;i >= 0;i--)
        {
@@ -872,6 +919,8 @@ void R_Mesh_State_Texture(const rmeshstate_t *m)
                GL_SetupTextureState();
        }
 
+       if (r_showtrispass)
+               return;
        for (i = 0, unit = gl_state.units;i < backendunits;i++, unit++)
        {
                if (unit->t1d != m->tex1d[i])
@@ -1005,7 +1054,7 @@ void R_Mesh_State_Texture(const rmeshstate_t *m)
        }
 }
 
-void R_Mesh_Draw_ShowTris(int numverts, int numtriangles, int *elements)
+void R_Mesh_Draw_ShowTris(int numverts, int numtriangles, const int *elements)
 {
        qglBegin(GL_LINES);
        for (;numtriangles;numtriangles--, elements += 3)
@@ -1064,7 +1113,7 @@ void R_ClearScreen(void)
                        qglClearStencil(128);CHECKGLERROR
                }
                // clear the screen
-               qglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (gl_stencil ? GL_STENCIL_BUFFER_BIT : 0));CHECKGLERROR
+               GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (gl_stencil ? GL_STENCIL_BUFFER_BIT : 0));
                // set dithering mode
                if (gl_dither.integer)
                {
@@ -1100,11 +1149,14 @@ void SCR_UpdateScreen (void)
 {
        if (gl_delayfinish.integer)
        {
-               VID_Finish ();
-
+               R_Mesh_Finish();
+               R_TimeReport("meshfinish");
+               VID_Finish();
                R_TimeReport("finish");
        }
 
+       R_Mesh_Start();
+
        if (r_textureunits.integer > gl_textureunits)
                Cvar_SetValueQuick(&r_textureunits, gl_textureunits);
        if (r_textureunits.integer < 1)
@@ -1113,6 +1165,7 @@ void SCR_UpdateScreen (void)
        if (gl_combine.integer && (!gl_combine_extension || r_textureunits.integer < 2))
                Cvar_SetValueQuick(&gl_combine, 0);
 
+showtris:
        R_TimeReport("setup");
 
        R_ClearScreen();
@@ -1194,6 +1247,21 @@ void SCR_UpdateScreen (void)
        // draw 2D stuff
        R_DrawQueue();
 
+       if (r_showtrispass)
+               r_showtrispass = false;
+       else if (r_showtris.value > 0)
+       {
+               rmeshstate_t m;
+               GL_BlendFunc(GL_ONE, GL_ONE);
+               GL_DepthTest(GL_FALSE);
+               GL_DepthMask(GL_FALSE);
+               memset(&m, 0, sizeof(m));
+               R_Mesh_State_Texture(&m);
+               r_showtrispass = true;
+               GL_ShowTrisColor(0.2,0.2,0.2,1);
+               goto showtris;
+       }
+
        if (gl_delayfinish.integer)
        {
                // tell driver to commit it's partially full geometry queue to the rendering queue
@@ -1202,8 +1270,9 @@ void SCR_UpdateScreen (void)
        }
        else
        {
-               VID_Finish ();
-
+               R_Mesh_Finish();
+               R_TimeReport("meshfinish");
+               VID_Finish();
                R_TimeReport("finish");
        }
 }
@@ -1440,13 +1509,13 @@ int R_Mesh_CacheArray(rcachearrayrequest_t *r)
        l->prev = l->next->prev;
        while (l->next->data && l->data && l->next->data->offset <= d->offset)
        {
-               //Con_Printf(">\n");
+               //Con_Print(">\n");
                l->next = l->next->next;
                l->prev = l->prev->next;
        }
        while (l->prev->data && l->data && l->prev->data->offset >= d->offset)
        {
-               //Con_Printf("<\n");
+               //Con_Print("<\n");
                l->prev = l->prev->prev;
                l->next = l->next->prev;
        }