X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=gl_backend.c;h=003ccfe11afe11f9d1b36018713392719610e694;hb=ff46d6ff516fda192c5adc55a5c9b82007545bd2;hp=9f970fe63e4ed91a434ce542d3f688b17478af0a;hpb=c1d9bbe13a1d1b1769f1690d94f3b49b9f16f840;p=xonotic%2Fdarkplaces.git diff --git a/gl_backend.c b/gl_backend.c index 9f970fe6..003ccfe1 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -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; }