return;
// set up viewpoint
+ CHECKGLERROR
qglMatrixMode(GL_PROJECTION);CHECKGLERROR
qglLoadIdentity();CHECKGLERROR
// set view pyramid
qglFrustum(-frustumx * zNear, frustumx * zNear, -frustumy * zNear, frustumy * zNear, zNear, zFar);CHECKGLERROR
- qglGetDoublev(GL_PROJECTION_MATRIX, m);
+ qglGetDoublev(GL_PROJECTION_MATRIX, m);CHECKGLERROR
backend_projectmatrix.m[0][0] = m[0];
backend_projectmatrix.m[1][0] = m[1];
backend_projectmatrix.m[2][0] = m[2];
backend_projectmatrix.m[3][3] = m[15];
qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
GL_SetupView_Orientation_Identity();
+ CHECKGLERROR
}
void GL_SetupView_Mode_PerspectiveInfiniteFarClip (double frustumx, double frustumy, double zNear)
return;
// set up viewpoint
+ CHECKGLERROR
qglMatrixMode(GL_PROJECTION);CHECKGLERROR
qglLoadIdentity();CHECKGLERROR
// set view pyramid
m[13] = 0;
m[14] = -2 * zNear * nudge;
m[15] = 0;
- qglLoadMatrixd(m);
+ qglLoadMatrixd(m);CHECKGLERROR
qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
GL_SetupView_Orientation_Identity();
+ CHECKGLERROR
backend_projectmatrix.m[0][0] = m[0];
backend_projectmatrix.m[1][0] = m[1];
backend_projectmatrix.m[2][0] = m[2];
return;
// set up viewpoint
+ CHECKGLERROR
qglMatrixMode(GL_PROJECTION);CHECKGLERROR
qglLoadIdentity();CHECKGLERROR
- qglOrtho(x1, x2, y2, y1, zNear, zFar);
- qglGetDoublev(GL_PROJECTION_MATRIX, m);
+ qglOrtho(x1, x2, y2, y1, zNear, zFar);CHECKGLERROR
+ qglGetDoublev(GL_PROJECTION_MATRIX, m);CHECKGLERROR
backend_projectmatrix.m[0][0] = m[0];
backend_projectmatrix.m[1][0] = m[1];
backend_projectmatrix.m[2][0] = m[2];
backend_projectmatrix.m[3][3] = m[15];
qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
GL_SetupView_Orientation_Identity();
+ CHECKGLERROR
}
typedef struct gltextureunit_s
int arrayenabled;
unsigned int arraycomponents;
const void *pointer_texcoord;
- float rgbscale, alphascale;
+ int rgbscale, alphascale;
int combinergb, combinealpha;
// FIXME: add more combine stuff
// texmatrixenabled exists only to avoid unnecessary texmatrix compares
GLboolean depthmask;
int colormask; // stored as bottom 4 bits: r g b a (3 2 1 0 order)
int depthtest;
+ int alphatest;
int scissortest;
unsigned int unit;
unsigned int clientunit;
{
qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
}
- qglMatrixMode(GL_TEXTURE);
- qglLoadIdentity();
- qglMatrixMode(GL_MODELVIEW);
+ qglMatrixMode(GL_TEXTURE);CHECKGLERROR
+ qglLoadIdentity();CHECKGLERROR
+ qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
if (gl_combine.integer)
{
qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);CHECKGLERROR
{
qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);CHECKGLERROR
}
+ CHECKGLERROR
}
CHECKGLERROR
}
{
memset(&gl_state, 0, sizeof(gl_state));
gl_state.depthtest = true;
+ gl_state.alphatest = false;
gl_state.blendfunc1 = GL_ONE;
gl_state.blendfunc2 = GL_ZERO;
gl_state.blend = false;
CHECKGLERROR
qglColorMask(1, 1, 1, 1);
- qglEnable(GL_CULL_FACE);CHECKGLERROR
- qglCullFace(GL_FRONT);CHECKGLERROR
- qglEnable(GL_DEPTH_TEST);CHECKGLERROR
+ qglAlphaFunc(GL_GEQUAL, 0.5);CHECKGLERROR
+ qglDisable(GL_ALPHA_TEST);CHECKGLERROR
qglBlendFunc(gl_state.blendfunc1, gl_state.blendfunc2);CHECKGLERROR
qglDisable(GL_BLEND);CHECKGLERROR
+ qglCullFace(GL_FRONT);CHECKGLERROR
+ qglEnable(GL_CULL_FACE);CHECKGLERROR
+ qglDepthFunc(GL_LEQUAL);CHECKGLERROR
+ qglEnable(GL_DEPTH_TEST);CHECKGLERROR
qglDepthMask(gl_state.depthmask);CHECKGLERROR
qglVertexPointer(3, GL_FLOAT, sizeof(float[3]), NULL);CHECKGLERROR
gl_state.unit = num;
if (qglActiveTexture)
{
+ CHECKGLERROR
qglActiveTexture(GL_TEXTURE0_ARB + gl_state.unit);
CHECKGLERROR
}
gl_state.clientunit = num;
if (qglActiveTexture)
{
+ CHECKGLERROR
qglClientActiveTexture(GL_TEXTURE0_ARB + gl_state.clientunit);
CHECKGLERROR
}
{
if (gl_state.blendfunc1 != blendfunc1 || gl_state.blendfunc2 != blendfunc2)
{
+ CHECKGLERROR
qglBlendFunc(gl_state.blendfunc1 = blendfunc1, gl_state.blendfunc2 = blendfunc2);CHECKGLERROR
if (gl_state.blendfunc2 == GL_ZERO)
{
{
if (gl_state.depthmask != state)
{
+ CHECKGLERROR
qglDepthMask(gl_state.depthmask = state);CHECKGLERROR
}
}
if (gl_state.depthtest != state)
{
gl_state.depthtest = state;
+ CHECKGLERROR
if (gl_state.depthtest)
{
qglEnable(GL_DEPTH_TEST);CHECKGLERROR
}
}
+void GL_AlphaTest(int state)
+{
+ if (gl_state.alphatest != state)
+ {
+ gl_state.alphatest = state;
+ CHECKGLERROR
+ if (gl_state.alphatest)
+ {
+ qglEnable(GL_ALPHA_TEST);CHECKGLERROR
+ }
+ else
+ {
+ qglDisable(GL_ALPHA_TEST);CHECKGLERROR
+ }
+ }
+}
+
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)
{
gl_state.colormask = state;
+ CHECKGLERROR
qglColorMask((GLboolean)r, (GLboolean)g, (GLboolean)b, (GLboolean)a);CHECKGLERROR
}
}
void GL_Clear(int mask)
{
+ CHECKGLERROR
qglClear(mask);CHECKGLERROR
}
{
BACKENDACTIVECHECK
CHECKGLERROR
+ if (gl_printcheckerror.integer && !gl_paranoid.integer)
+ {
+ Con_Printf("WARNING: gl_printcheckerror is on but gl_paranoid is off, turning it on...\n");
+ Cvar_SetValueQuick(&gl_paranoid, 1);
+ }
GL_Backend_ResetState();
}
char compilelog[MAX_INPUTLINE];
CHECKGLERROR
- programobject = qglCreateProgramObjectARB();
- CHECKGLERROR
+ programobject = qglCreateProgramObjectARB();CHECKGLERROR
if (!programobject)
return 0;
+ if (developer.integer >= 100)
+ {
+ int i;
+ Con_Printf("Compiling shader:\n");
+ if (vertexstrings_count)
+ {
+ Con_Printf("------ VERTEX SHADER ------\n");
+ for (i = 0;i < vertexstrings_count;i++)
+ Con_Print(vertexstrings_list[i]);
+ Con_Print("\n");
+ }
+ if (fragmentstrings_count)
+ {
+ Con_Printf("------ FRAGMENT SHADER ------\n");
+ for (i = 0;i < fragmentstrings_count;i++)
+ Con_Print(fragmentstrings_list[i]);
+ Con_Print("\n");
+ }
+ }
+
if (vertexstrings_count)
{
- CHECKGLERROR
- vertexshaderobject = qglCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
+ vertexshaderobject = qglCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);CHECKGLERROR
if (!vertexshaderobject)
{
qglDeleteObjectARB(programobject);
CHECKGLERROR
return 0;
}
- qglShaderSourceARB(vertexshaderobject, vertexstrings_count, vertexstrings_list, NULL);
- qglCompileShaderARB(vertexshaderobject);
- CHECKGLERROR
- qglGetObjectParameterivARB(vertexshaderobject, GL_OBJECT_COMPILE_STATUS_ARB, &vertexshadercompiled);
- qglGetInfoLogARB(vertexshaderobject, sizeof(compilelog), NULL, compilelog);
+ qglShaderSourceARB(vertexshaderobject, vertexstrings_count, vertexstrings_list, NULL);CHECKGLERROR
+ qglCompileShaderARB(vertexshaderobject);CHECKGLERROR
+ qglGetObjectParameterivARB(vertexshaderobject, GL_OBJECT_COMPILE_STATUS_ARB, &vertexshadercompiled);CHECKGLERROR
+ qglGetInfoLogARB(vertexshaderobject, sizeof(compilelog), NULL, compilelog);CHECKGLERROR
if (compilelog[0])
Con_DPrintf("vertex shader compile log:\n%s\n", compilelog);
if (!vertexshadercompiled)
{
- qglDeleteObjectARB(programobject);
- qglDeleteObjectARB(vertexshaderobject);
- CHECKGLERROR
+ qglDeleteObjectARB(programobject);CHECKGLERROR
+ qglDeleteObjectARB(vertexshaderobject);CHECKGLERROR
return 0;
}
- qglAttachObjectARB(programobject, vertexshaderobject);
- qglDeleteObjectARB(vertexshaderobject);
- CHECKGLERROR
+ qglAttachObjectARB(programobject, vertexshaderobject);CHECKGLERROR
+ qglDeleteObjectARB(vertexshaderobject);CHECKGLERROR
}
if (fragmentstrings_count)
{
- CHECKGLERROR
- fragmentshaderobject = qglCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
+ fragmentshaderobject = qglCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);CHECKGLERROR
if (!fragmentshaderobject)
{
- qglDeleteObjectARB(programobject);
- CHECKGLERROR
+ qglDeleteObjectARB(programobject);CHECKGLERROR
return 0;
}
- qglShaderSourceARB(fragmentshaderobject, fragmentstrings_count, fragmentstrings_list, NULL);
- qglCompileShaderARB(fragmentshaderobject);
- CHECKGLERROR
- qglGetObjectParameterivARB(fragmentshaderobject, GL_OBJECT_COMPILE_STATUS_ARB, &fragmentshadercompiled);
- qglGetInfoLogARB(fragmentshaderobject, sizeof(compilelog), NULL, compilelog);
+ qglShaderSourceARB(fragmentshaderobject, fragmentstrings_count, fragmentstrings_list, NULL);CHECKGLERROR
+ qglCompileShaderARB(fragmentshaderobject);CHECKGLERROR
+ qglGetObjectParameterivARB(fragmentshaderobject, GL_OBJECT_COMPILE_STATUS_ARB, &fragmentshadercompiled);CHECKGLERROR
+ qglGetInfoLogARB(fragmentshaderobject, sizeof(compilelog), NULL, compilelog);CHECKGLERROR
if (compilelog[0])
Con_DPrintf("fragment shader compile log:\n%s\n", compilelog);
if (!fragmentshadercompiled)
{
- qglDeleteObjectARB(programobject);
- qglDeleteObjectARB(fragmentshaderobject);
- CHECKGLERROR
+ qglDeleteObjectARB(programobject);CHECKGLERROR
+ qglDeleteObjectARB(fragmentshaderobject);CHECKGLERROR
return 0;
}
- qglAttachObjectARB(programobject, fragmentshaderobject);
- qglDeleteObjectARB(fragmentshaderobject);
- CHECKGLERROR
+ qglAttachObjectARB(programobject, fragmentshaderobject);CHECKGLERROR
+ qglDeleteObjectARB(fragmentshaderobject);CHECKGLERROR
}
- qglLinkProgramARB(programobject);
- CHECKGLERROR
- qglGetObjectParameterivARB(programobject, GL_OBJECT_LINK_STATUS_ARB, &programlinked);
- qglGetInfoLogARB(programobject, sizeof(compilelog), NULL, compilelog);
+ qglLinkProgramARB(programobject);CHECKGLERROR
+ qglGetObjectParameterivARB(programobject, GL_OBJECT_LINK_STATUS_ARB, &programlinked);CHECKGLERROR
+ qglGetInfoLogARB(programobject, sizeof(compilelog), NULL, compilelog);CHECKGLERROR
if (compilelog[0])
{
Con_DPrintf("program link log:\n%s\n", compilelog);
if (strstr(compilelog, "fragment shader will run in software"))
programlinked = false;
}
- CHECKGLERROR
if (!programlinked)
{
- qglDeleteObjectARB(programobject);
+ qglDeleteObjectARB(programobject);CHECKGLERROR
return 0;
}
CHECKGLERROR
Con_Printf("R_Mesh_Draw(%d, %d, %d, %08p);\n", firstvertex, numvertices, numtriangles, elements);
return;
}
- //CHECKGLERROR
+ CHECKGLERROR
renderstats.meshes++;
renderstats.meshes_elements += numelements;
if (gl_paranoid.integer)
const int *p;
if (!qglIsEnabled(GL_VERTEX_ARRAY))
Con_Print("R_Mesh_Draw: vertex array not enabled\n");
+ CHECKGLERROR
for (j = 0, size = numvertices * 3, p = (int *)((float *)gl_state.pointer_vertex + firstvertex * 3);j < size;j++, p++)
paranoidblah += *p;
if (gl_state.pointer_color)
{
if (!qglIsEnabled(GL_COLOR_ARRAY))
Con_Print("R_Mesh_Draw: color array set but not enabled\n");
+ CHECKGLERROR
for (j = 0, size = numvertices * 4, p = (int *)((float *)gl_state.pointer_color + firstvertex * 4);j < size;j++, p++)
paranoidblah += *p;
}
GL_ClientActiveTexture(i);
if (!qglIsEnabled(GL_TEXTURE_COORD_ARRAY))
Con_Print("R_Mesh_Draw: texcoord array set but not enabled\n");
+ CHECKGLERROR
for (j = 0, size = numvertices * gl_state.units[i].arraycomponents, p = (int *)((float *)gl_state.units[i].pointer_texcoord + firstvertex * gl_state.units[i].arraycomponents);j < size;j++, p++)
paranoidblah += *p;
}
backend_modelmatrix = *matrix;
Matrix4x4_Concat(&backend_modelviewmatrix, &backend_viewmatrix, matrix);
Matrix4x4_Transpose(&backend_glmodelviewmatrix, &backend_modelviewmatrix);
- qglLoadMatrixf(&backend_glmodelviewmatrix.m[0][0]);
+ CHECKGLERROR
+ qglLoadMatrixf(&backend_glmodelviewmatrix.m[0][0]);CHECKGLERROR
}
}
CHECKGLERROR
if (!gl_state.pointer_color)
{
- qglEnableClientState(GL_COLOR_ARRAY);
- CHECKGLERROR
+ qglEnableClientState(GL_COLOR_ARRAY);CHECKGLERROR
}
else if (!color4f)
{
- qglDisableClientState(GL_COLOR_ARRAY);
- CHECKGLERROR
+ qglDisableClientState(GL_COLOR_ARRAY);CHECKGLERROR
// when color array is on the glColor gets trashed, set it again
- qglColor4f(gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]);
- CHECKGLERROR
+ qglColor4f(gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]);CHECKGLERROR
}
gl_state.pointer_color = color4f;
- qglColorPointer(4, GL_FLOAT, sizeof(float[4]), gl_state.pointer_color);
- CHECKGLERROR
+ qglColorPointer(4, GL_FLOAT, sizeof(float[4]), gl_state.pointer_color);CHECKGLERROR
}
}
{
gltextureunit_t *unit = gl_state.units + unitnum;
// update array settings
+ CHECKGLERROR
if (texcoord)
{
// texcoord array
unit->pointer_texcoord = texcoord;
unit->arraycomponents = numcomponents;
GL_ClientActiveTexture(unitnum);
- qglTexCoordPointer(unit->arraycomponents, GL_FLOAT, sizeof(float) * unit->arraycomponents, unit->pointer_texcoord);
- CHECKGLERROR
+ qglTexCoordPointer(unit->arraycomponents, GL_FLOAT, sizeof(float) * unit->arraycomponents, unit->pointer_texcoord);CHECKGLERROR
}
// texture array unit is enabled, enable the array
if (!unit->arrayenabled)
if (tex1d)
{
if (unit->t1d == 0)
- qglEnable(GL_TEXTURE_1D);
+ {
+ qglEnable(GL_TEXTURE_1D);CHECKGLERROR
+ }
}
else
{
if (unit->t1d)
- qglDisable(GL_TEXTURE_1D);
+ {
+ qglDisable(GL_TEXTURE_1D);CHECKGLERROR
+ }
}
}
unit->t1d = tex1d;
- qglBindTexture(GL_TEXTURE_1D, unit->t1d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);CHECKGLERROR
}
// update 2d texture binding
if (unit->t2d != tex2d)
if (tex2d)
{
if (unit->t2d == 0)
- qglEnable(GL_TEXTURE_2D);
+ {
+ qglEnable(GL_TEXTURE_2D);CHECKGLERROR
+ }
}
else
{
if (unit->t2d)
- qglDisable(GL_TEXTURE_2D);
+ {
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ }
}
}
unit->t2d = tex2d;
- qglBindTexture(GL_TEXTURE_2D, unit->t2d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR
}
// update 3d texture binding
if (unit->t3d != tex3d)
if (tex3d)
{
if (unit->t3d == 0)
- qglEnable(GL_TEXTURE_3D);
+ {
+ qglEnable(GL_TEXTURE_3D);CHECKGLERROR
+ }
}
else
{
if (unit->t3d)
- qglDisable(GL_TEXTURE_3D);
+ {
+ qglDisable(GL_TEXTURE_3D);CHECKGLERROR
+ }
}
}
unit->t3d = tex3d;
- qglBindTexture(GL_TEXTURE_3D, unit->t3d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR
}
// update cubemap texture binding
if (unit->tcubemap != texcubemap)
if (texcubemap)
{
if (unit->tcubemap == 0)
- qglEnable(GL_TEXTURE_CUBE_MAP_ARB);
+ {
+ qglEnable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
}
else
{
if (unit->tcubemap)
- qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ {
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
}
}
unit->tcubemap = texcubemap;
- qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR
}
}
if (texnum)
{
if (unit->t1d == 0)
- qglEnable(GL_TEXTURE_1D);
+ {
+ qglEnable(GL_TEXTURE_1D);CHECKGLERROR
+ }
}
else
{
if (unit->t1d)
- qglDisable(GL_TEXTURE_1D);
+ {
+ qglDisable(GL_TEXTURE_1D);CHECKGLERROR
+ }
}
}
unit->t1d = texnum;
- qglBindTexture(GL_TEXTURE_1D, unit->t1d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);CHECKGLERROR
}
// update 2d texture binding
if (unit->t2d)
if (unitnum < backendunits)
{
if (unit->t2d)
- qglDisable(GL_TEXTURE_2D);
+ {
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ }
}
unit->t2d = 0;
- qglBindTexture(GL_TEXTURE_2D, unit->t2d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR
}
// update 3d texture binding
if (unit->t3d)
if (unitnum < backendunits)
{
if (unit->t3d)
- qglDisable(GL_TEXTURE_3D);
+ {
+ qglDisable(GL_TEXTURE_3D);CHECKGLERROR
+ }
}
unit->t3d = 0;
- qglBindTexture(GL_TEXTURE_3D, unit->t3d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR
}
// update cubemap texture binding
if (unit->tcubemap)
if (unitnum < backendunits)
{
if (unit->tcubemap)
- qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ {
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
}
unit->tcubemap = 0;
- qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR
}
}
if (unitnum < backendunits)
{
if (unit->t1d)
- qglDisable(GL_TEXTURE_1D);
+ {
+ qglDisable(GL_TEXTURE_1D);CHECKGLERROR
+ }
}
unit->t1d = 0;
- qglBindTexture(GL_TEXTURE_1D, unit->t1d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);CHECKGLERROR
}
// update 2d texture binding
if (unit->t2d != texnum)
if (texnum)
{
if (unit->t2d == 0)
- qglEnable(GL_TEXTURE_2D);
+ {
+ qglEnable(GL_TEXTURE_2D);CHECKGLERROR
+ }
}
else
{
if (unit->t2d)
- qglDisable(GL_TEXTURE_2D);
+ {
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ }
}
}
unit->t2d = texnum;
- qglBindTexture(GL_TEXTURE_2D, unit->t2d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR
}
// update 3d texture binding
if (unit->t3d)
if (unitnum < backendunits)
{
if (unit->t3d)
- qglDisable(GL_TEXTURE_3D);
+ {
+ qglDisable(GL_TEXTURE_3D);CHECKGLERROR
+ }
}
unit->t3d = 0;
- qglBindTexture(GL_TEXTURE_3D, unit->t3d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR
}
// update cubemap texture binding
if (unit->tcubemap != 0)
if (unitnum < backendunits)
{
if (unit->tcubemap)
- qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ {
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
}
unit->tcubemap = 0;
- qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR
}
}
if (unitnum < backendunits)
{
if (unit->t1d)
- qglDisable(GL_TEXTURE_1D);
+ {
+ qglDisable(GL_TEXTURE_1D);CHECKGLERROR
+ }
}
unit->t1d = 0;
- qglBindTexture(GL_TEXTURE_1D, unit->t1d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);CHECKGLERROR
}
// update 2d texture binding
if (unit->t2d)
if (unitnum < backendunits)
{
if (unit->t2d)
- qglDisable(GL_TEXTURE_2D);
+ {
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ }
}
unit->t2d = 0;
- qglBindTexture(GL_TEXTURE_2D, unit->t2d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR
}
// update 3d texture binding
if (unit->t3d != texnum)
if (texnum)
{
if (unit->t3d == 0)
- qglEnable(GL_TEXTURE_3D);
+ {
+ qglEnable(GL_TEXTURE_3D);CHECKGLERROR
+ }
}
else
{
if (unit->t3d)
- qglDisable(GL_TEXTURE_3D);
+ {
+ qglDisable(GL_TEXTURE_3D);CHECKGLERROR
+ }
}
}
unit->t3d = texnum;
- qglBindTexture(GL_TEXTURE_3D, unit->t3d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR
}
// update cubemap texture binding
if (unit->tcubemap != 0)
if (unitnum < backendunits)
{
if (unit->tcubemap)
- qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ {
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
}
unit->tcubemap = 0;
- qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR
}
}
if (unitnum < backendunits)
{
if (unit->t1d)
- qglDisable(GL_TEXTURE_1D);
+ {
+ qglDisable(GL_TEXTURE_1D);CHECKGLERROR
+ }
}
unit->t1d = 0;
- qglBindTexture(GL_TEXTURE_1D, unit->t1d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);CHECKGLERROR
}
// update 2d texture binding
if (unit->t2d)
if (unitnum < backendunits)
{
if (unit->t2d)
- qglDisable(GL_TEXTURE_2D);
+ {
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ }
}
unit->t2d = 0;
- qglBindTexture(GL_TEXTURE_2D, unit->t2d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR
}
// update 3d texture binding
if (unit->t3d)
if (unitnum < backendunits)
{
if (unit->t3d)
- qglDisable(GL_TEXTURE_3D);
+ {
+ qglDisable(GL_TEXTURE_3D);CHECKGLERROR
+ }
}
unit->t3d = 0;
- qglBindTexture(GL_TEXTURE_3D, unit->t3d);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR
}
// update cubemap texture binding
if (unit->tcubemap != texnum)
if (texnum)
{
if (unit->tcubemap == 0)
- qglEnable(GL_TEXTURE_CUBE_MAP_ARB);
+ {
+ qglEnable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
}
else
{
if (unit->tcubemap)
- qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
+ {
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
}
}
unit->tcubemap = texnum;
- qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);
- CHECKGLERROR
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR
}
}
matrix4x4_t tempmatrix;
unit->texmatrixenabled = true;
unit->matrix = *matrix;
+ CHECKGLERROR
Matrix4x4_Transpose(&tempmatrix, &unit->matrix);
- qglMatrixMode(GL_TEXTURE);
+ qglMatrixMode(GL_TEXTURE);CHECKGLERROR
GL_ActiveTexture(unitnum);
- qglLoadMatrixf(&tempmatrix.m[0][0]);
- qglMatrixMode(GL_MODELVIEW);
+ qglLoadMatrixf(&tempmatrix.m[0][0]);CHECKGLERROR
+ qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
}
}
else
if (unit->texmatrixenabled)
{
unit->texmatrixenabled = false;
- qglMatrixMode(GL_TEXTURE);
+ CHECKGLERROR
+ qglMatrixMode(GL_TEXTURE);CHECKGLERROR
GL_ActiveTexture(unitnum);
- qglLoadIdentity();
- qglMatrixMode(GL_MODELVIEW);
+ qglLoadIdentity();CHECKGLERROR
+ qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
}
}
}
void R_Mesh_TexCombine(unsigned int unitnum, int combinergb, int combinealpha, int rgbscale, int alphascale)
{
gltextureunit_t *unit = gl_state.units + unitnum;
+ CHECKGLERROR
if (gl_combine.integer)
{
// GL_ARB_texture_env_combine
}
}
-void R_Mesh_State(const rmeshstate_t *m)
+void R_Mesh_TextureState(const rmeshstate_t *m)
{
unsigned int i;
BACKENDACTIVECHECK
- R_Mesh_VertexPointer(m->pointer_vertex);
- R_Mesh_ColorPointer(m->pointer_color);
-
+ CHECKGLERROR
if (gl_backend_rebindtextures)
{
gl_backend_rebindtextures = false;
GL_SetupTextureState();
+ CHECKGLERROR
}
for (i = 0;i < backendimageunits;i++)
R_Mesh_TexMatrix(i, &m->texmatrix[i]);
R_Mesh_TexCombine(i, m->texcombinergb[i], m->texcombinealpha[i], m->texrgbscale[i], m->texalphascale[i]);
}
+ CHECKGLERROR
+}
+
+void R_Mesh_ResetTextureState(void)
+{
+ unsigned int unitnum;
+
+ BACKENDACTIVECHECK
+
+ CHECKGLERROR
+ if (gl_backend_rebindtextures)
+ {
+ gl_backend_rebindtextures = false;
+ GL_SetupTextureState();
+ CHECKGLERROR
+ }
+
+ for (unitnum = 0;unitnum < backendimageunits;unitnum++)
+ {
+ gltextureunit_t *unit = gl_state.units + unitnum;
+ // update 1d texture binding
+ if (unit->t1d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unitnum < backendunits)
+ {
+ qglDisable(GL_TEXTURE_1D);CHECKGLERROR
+ }
+ unit->t1d = 0;
+ qglBindTexture(GL_TEXTURE_1D, unit->t1d);CHECKGLERROR
+ }
+ // update 2d texture binding
+ if (unit->t2d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unitnum < backendunits)
+ {
+ qglDisable(GL_TEXTURE_2D);CHECKGLERROR
+ }
+ unit->t2d = 0;
+ qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR
+ }
+ // update 3d texture binding
+ if (unit->t3d)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unitnum < backendunits)
+ {
+ qglDisable(GL_TEXTURE_3D);CHECKGLERROR
+ }
+ unit->t3d = 0;
+ qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR
+ }
+ // update cubemap texture binding
+ if (unit->tcubemap)
+ {
+ GL_ActiveTexture(unitnum);
+ if (unitnum < backendunits)
+ {
+ qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
+ }
+ unit->tcubemap = 0;
+ qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR
+ }
+ }
+ for (unitnum = 0;unitnum < backendarrayunits;unitnum++)
+ {
+ gltextureunit_t *unit = gl_state.units + unitnum;
+ // texture array unit is disabled, disable the array
+ if (unit->arrayenabled)
+ {
+ unit->arrayenabled = false;
+ GL_ClientActiveTexture(unitnum);
+ qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
+ }
+ }
+ for (unitnum = 0;unitnum < backendunits;unitnum++)
+ {
+ gltextureunit_t *unit = gl_state.units + unitnum;
+ // no texmatrix specified, revert to identity
+ if (unit->texmatrixenabled)
+ {
+ unit->texmatrixenabled = false;
+ CHECKGLERROR
+ qglMatrixMode(GL_TEXTURE);CHECKGLERROR
+ GL_ActiveTexture(unitnum);
+ qglLoadIdentity();CHECKGLERROR
+ qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
+ }
+ if (gl_combine.integer)
+ {
+ // GL_ARB_texture_env_combine
+ if (unit->combinergb != GL_MODULATE)
+ {
+ unit->combinergb = GL_MODULATE;
+ GL_ActiveTexture(unitnum);
+ qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, unit->combinergb);CHECKGLERROR
+ }
+ if (unit->combinealpha != GL_MODULATE)
+ {
+ unit->combinealpha = GL_MODULATE;
+ GL_ActiveTexture(unitnum);
+ qglTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, unit->combinealpha);CHECKGLERROR
+ }
+ if (unit->rgbscale != 1)
+ {
+ GL_ActiveTexture(unitnum);
+ qglTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, (unit->rgbscale = 1));CHECKGLERROR
+ }
+ if (unit->alphascale != 1)
+ {
+ GL_ActiveTexture(unitnum);
+ qglTexEnvi(GL_TEXTURE_ENV, GL_ALPHA_SCALE, (unit->alphascale = 1));CHECKGLERROR
+ }
+ }
+ else
+ {
+ // normal GL texenv
+ if (unit->combinergb != GL_MODULATE)
+ {
+ unit->combinergb = GL_MODULATE;
+ GL_ActiveTexture(unitnum);
+ qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, unit->combinergb);CHECKGLERROR
+ }
+ }
+ }
}
void R_Mesh_Draw_ShowTris(int firstvertex, int numvertices, int numtriangles, const int *elements)
{
+ CHECKGLERROR
qglBegin(GL_LINES);
for (;numtriangles;numtriangles--, elements += 3)
{