X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_backend.c;h=a206d951a0b1f0cbd4af1f806c140d857df334fe;hb=b29b9e54dee7965354aede860e187c6f6276a758;hp=8125cb7592588e6f4a595399256d705e22ace705;hpb=6fb3daf04a26ac42b15c02c2276f6820ffe795a8;p=xonotic%2Fdarkplaces.git diff --git a/gl_backend.c b/gl_backend.c index 8125cb75..a206d951 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -249,7 +249,7 @@ void GL_SetupView_Mode_Perspective (double fovx, double fovy, double zNear, doub // set up viewpoint qglMatrixMode(GL_PROJECTION);CHECKGLERROR - qglLoadIdentity ();CHECKGLERROR + qglLoadIdentity();CHECKGLERROR // pyramid slopes xmax = zNear * tan(fovx * M_PI / 360.0); ymax = zNear * tan(fovy * M_PI / 360.0); @@ -261,14 +261,14 @@ void GL_SetupView_Mode_Perspective (double fovx, double fovy, double zNear, doub void GL_SetupView_Mode_PerspectiveInfiniteFarClip (double fovx, double fovy, double zNear) { - double nudge, m[16]; + float nudge, m[16]; if (!r_render.integer) return; // set up viewpoint qglMatrixMode(GL_PROJECTION);CHECKGLERROR - qglLoadIdentity ();CHECKGLERROR + qglLoadIdentity();CHECKGLERROR // set view pyramid nudge = 1.0 - 1.0 / (1<<23); m[ 0] = 1.0 / tan(fovx * M_PI / 360.0); @@ -287,7 +287,7 @@ void GL_SetupView_Mode_PerspectiveInfiniteFarClip (double fovx, double fovy, dou m[13] = 0; m[14] = -2 * zNear * nudge; m[15] = 0; - qglLoadMatrixd(m); + qglLoadMatrixf(m); qglMatrixMode(GL_MODELVIEW);CHECKGLERROR GL_SetupView_Orientation_Identity(); backend_projectmatrix.m[0][0] = m[0]; @@ -315,7 +315,7 @@ void GL_SetupView_Mode_Ortho (double x1, double y1, double x2, double y2, double // set up viewpoint qglMatrixMode(GL_PROJECTION);CHECKGLERROR - qglLoadIdentity ();CHECKGLERROR + qglLoadIdentity();CHECKGLERROR qglOrtho(x1, x2, y2, y1, zNear, zFar); qglMatrixMode(GL_MODELVIEW);CHECKGLERROR GL_SetupView_Orientation_Identity(); @@ -528,35 +528,6 @@ void GL_ConvertColorsFloatToByte(int numverts) } } -void GL_DrawRangeElements(int firstvert, int endvert, int indexcount, const int *index) -{ - int arraylocked = false; - c_meshs++; - c_meshelements += indexcount; - if (indexcount == 0 || endvert == firstvert) - { - Con_Printf("GL_DrawRangeElements(%d, %d, %d, %08p);\n", firstvert, endvert, indexcount, index); - return; - } - if (gl_supportslockarrays && gl_lockarrays.integer) - { - qglLockArraysEXT(firstvert, endvert - firstvert); - CHECKGLERROR - arraylocked = true; - } - if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL) - qglDrawRangeElements(GL_TRIANGLES, firstvert, endvert, indexcount, GL_UNSIGNED_INT, (const GLuint *) index); - else - qglDrawElements(GL_TRIANGLES, indexcount, GL_UNSIGNED_INT, (const GLuint *) index); - CHECKGLERROR - if (arraylocked) - { - qglUnlockArraysEXT(); - CHECKGLERROR - arraylocked = false; - } -} - // enlarges geometry buffers if they are too small void _R_Mesh_ResizeCheck(int numverts) { @@ -571,15 +542,36 @@ void _R_Mesh_ResizeCheck(int numverts) // renders the mesh void R_Mesh_Draw(int numverts, int numtriangles, const int *elements) { - BACKENDACTIVECHECK - - CHECKGLERROR - + int numelements; + if (numtriangles == 0 || numverts == 0) + { + Con_Printf("R_Mesh_Draw(%d, %d, %08p);\n", numverts, numtriangles, elements); + return; + } + numelements = numtriangles * 3; + c_meshs++; + c_meshelements += numelements; if (gl_state.colorarray && !gl_mesh_floatcolors.integer) GL_ConvertColorsFloatToByte(numverts); if (!r_render.integer) return; - GL_DrawRangeElements(0, numverts, numtriangles * 3, elements); + if (gl_supportslockarrays && gl_lockarrays.integer) + { + qglLockArraysEXT(0, numverts); + CHECKGLERROR + if (gl_mesh_drawrangeelements.integer && qglDrawRangeElements != NULL) + qglDrawRangeElements(GL_TRIANGLES, 0, numverts, numelements, GL_UNSIGNED_INT, (const GLuint *) elements); + else + qglDrawElements(GL_TRIANGLES, numelements, GL_UNSIGNED_INT, (const GLuint *) elements); + CHECKGLERROR + qglUnlockArraysEXT(); + CHECKGLERROR + } + else + { + qglDrawElements(GL_TRIANGLES, numelements, GL_UNSIGNED_INT, (const GLuint *) elements); + CHECKGLERROR + } } // restores backend state, used when done with 3D rendering @@ -882,7 +874,10 @@ void R_ClearScreen(void) qglClearDepth(1);CHECKGLERROR if (gl_stencil) { - qglClearStencil(0);CHECKGLERROR + // LordHavoc: we use a stencil centered around 128 instead of 0, + // to avoid clamping interfering with strange shadow volume + // drawing orders + qglClearStencil(128);CHECKGLERROR } // clear the screen qglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (gl_stencil ? GL_STENCIL_BUFFER_BIT : 0));CHECKGLERROR