]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
fix external model skins (they weren't rendering)
[xonotic/darkplaces.git] / gl_backend.c
index a664871194278840e92390c2a540b353d52f50c1..c5fa542f4783654d115021070022080bcbb7d53c 100644 (file)
@@ -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
@@ -850,7 +842,7 @@ void R_Mesh_State(const rmeshstate_t *m)
 qboolean SCR_ScreenShot(char *filename, int x, int y, int width, int height)
 {
        qboolean ret;
-       int i;
+       int i, j;
        qbyte *buffer;
 
        if (!r_render.integer)
@@ -862,8 +854,13 @@ qboolean SCR_ScreenShot(char *filename, int x, int y, int width, int height)
 
        // LordHavoc: compensate for v_overbrightbits when using hardware gamma
        if (v_hwgamma.integer)
+       {
                for (i = 0;i < width * height * 3;i++)
-                       buffer[i] <<= v_overbrightbits.integer;
+               {
+                       j = buffer[i] << v_overbrightbits.integer;
+                       buffer[i] = (qbyte) (bound(0, j, 255));
+               }
+       }
 
        ret = Image_WriteTGARGB_preflipped(filename, width, height, buffer);