static void gl_backend_start(void)
{
- Con_DPrintf("OpenGL Backend started\n");
+ Con_DPrint("OpenGL Backend started\n");
if (qglDrawRangeElements != NULL)
{
CHECKGLERROR
backendunits = 0;
backendactive = false;
- Con_DPrintf("OpenGL Backend shutting down\n");
+ Con_DPrint("OpenGL Backend shutting down\n");
GL_Backend_FreeArrays();
}
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;
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;
CHECKGLERROR
+ qglColorMask(1, 1, 1, 1);
qglEnable(GL_CULL_FACE);CHECKGLERROR
qglCullFace(GL_FRONT);CHECKGLERROR
qglEnable(GL_DEPTH_TEST);CHECKGLERROR
{
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)
{
{
if (gl_state.depthmask != state)
{
+ if (r_showtrispass)
+ return;
qglDepthMask(gl_state.depthmask = state);CHECKGLERROR
}
}
{
if (gl_state.depthtest != state)
{
+ if (r_showtrispass)
+ return;
gl_state.depthtest = state;
if (gl_state.depthtest)
{
}
}
+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)
{
if (gl_state.pointer_color != p)
{
+ if (r_showtrispass)
+ return;
CHECKGLERROR
if (!gl_state.pointer_color)
{
{
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;
}
}
+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)
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;
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;
}
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
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;
}
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;
}
{
int i;
BACKENDACTIVECHECK
- CHECKGLERROR
+ CHECKGLERROR
GL_LockArrays(0, 0);
- CHECKGLERROR
+ CHECKGLERROR
for (i = backendunits - 1;i >= 0;i--)
{
GL_SetupTextureState();
}
+ if (r_showtrispass)
+ return;
for (i = 0, unit = gl_state.units;i < backendunits;i++, unit++)
{
if (unit->t1d != m->tex1d[i])
}
}
-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)
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)
{
{
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)
if (gl_combine.integer && (!gl_combine_extension || r_textureunits.integer < 2))
Cvar_SetValueQuick(&gl_combine, 0);
+showtris:
R_TimeReport("setup");
R_ClearScreen();
// 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
}
else
{
- VID_Finish ();
-
+ R_Mesh_Finish();
+ R_TimeReport("meshfinish");
+ VID_Finish();
R_TimeReport("finish");
}
}
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;
}