]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_draw.c
rewrote memory system entirely (hunk, cache, and zone are gone, memory pools replaced...
[xonotic/darkplaces.git] / gl_draw.c
index cb4cc1afd74ab215791320a87b98e05f62eb6d72..d9eebeb44ca70bc0f7bed524152ff8be6eb0380c 100644 (file)
--- a/gl_draw.c
+++ b/gl_draw.c
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -18,103 +18,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 */
 
-// draw.c -- this is the only file outside the refresh that touches the
-// vid buffer
-
 #include "quakedef.h"
 
-#define GL_COLOR_INDEX8_EXT     0x80E5
-
-cvar_t         qsg_version = {"qsg_version", "1"};
-cvar_t         scr_conalpha = {"scr_conalpha", "1"};
+//#define GL_COLOR_INDEX8_EXT     0x80E5
 
-byte           *draw_chars;                            // 8*8 graphic characters
-qpic_t         *draw_disc;
+cvar_t         scr_conalpha = {CVAR_SAVE, "scr_conalpha", "1"};
 
-int                    char_texture;
+rtexture_t     *char_texture;
 
 typedef struct
 {
-       int             texnum;
-       float   sl, tl, sh, th;
+       rtexture_t      *tex;
 } glpic_t;
 
-int                    conbacktexnum;
-
-/*
-=============================================================================
-
-  scrap allocation
-
-  Allocate all the little status bar obejcts into a single texture
-  to crutch up stupid hardware / drivers
-
-=============================================================================
-*/
-
-#define        MAX_SCRAPS              2
-#define        BLOCK_WIDTH             256
-#define        BLOCK_HEIGHT    256
-
-int                    scrap_allocated[MAX_SCRAPS][BLOCK_WIDTH];
-byte           scrap_texels[MAX_SCRAPS][BLOCK_WIDTH*BLOCK_HEIGHT*4];
-qboolean       scrap_dirty;
-
-// returns a texture number and the position inside it
-int Scrap_AllocBlock (int w, int h, int *x, int *y)
-{
-       int             i, j;
-       int             best, best2;
-       int             texnum;
-
-       for (texnum=0 ; texnum<MAX_SCRAPS ; texnum++)
-       {
-               best = BLOCK_HEIGHT;
-
-               for (i=0 ; i<BLOCK_WIDTH-w ; i++)
-               {
-                       best2 = 0;
-
-                       for (j=0 ; j<w ; j++)
-                       {
-                               if (scrap_allocated[texnum][i+j] >= best)
-                                       break;
-                               if (scrap_allocated[texnum][i+j] > best2)
-                                       best2 = scrap_allocated[texnum][i+j];
-                       }
-                       if (j == w)
-                       {       // this is a valid spot
-                               *x = i;
-                               *y = best = best2;
-                       }
-               }
-
-               if (best + h > BLOCK_HEIGHT)
-                       continue;
-
-               for (i=0 ; i<w ; i++)
-                       scrap_allocated[texnum][*x + i] = best + h;
-
-               return texnum;
-       }
-
-       Sys_Error ("Scrap_AllocBlock: full");
-       return 0;
-}
-
-int    scrap_uploads;
-int scraptexnum[MAX_SCRAPS];
-
-void Scrap_Upload (void)
-{
-       int             texnum;
-
-       scrap_uploads++;
-
-       for (texnum=0 ; texnum<MAX_SCRAPS ; texnum++)
-               scraptexnum[texnum] = GL_LoadTexture (va("scrapslot%d", texnum), BLOCK_WIDTH, BLOCK_HEIGHT, scrap_texels[texnum], false, true, 1);
-       scrap_dirty = false;
-}
+rtexture_t     *conbacktex;
 
 //=============================================================================
 /* Support Routines */
@@ -122,78 +39,38 @@ void Scrap_Upload (void)
 typedef struct cachepic_s
 {
        char            name[MAX_QPATH];
+       // FIXME: qpic is evil
        qpic_t          pic;
        byte            padding[32];    // for appended glpic
-} cachepic_t;
+}
+cachepic_t;
 
-#define        MAX_CACHED_PICS         128
+#define        MAX_CACHED_PICS         256
 cachepic_t     menu_cachepics[MAX_CACHED_PICS];
 int                    menu_numcachepics;
 
 byte           menuplyr_pixels[4096];
 
-int            pic_texels;
-int            pic_count;
-
-extern int GL_LoadPicTexture (qpic_t *pic);
-
-qpic_t *Draw_PicFromWad (char *name)
-{
-       qpic_t  *p;
-       glpic_t *gl;
-
-       p = W_GetLumpName (name);
-       gl = (glpic_t *)p->data;
-
-       // load little ones into the scrap
-       if (p->width < 64 && p->height < 64)
-       {
-               int             x, y;
-               int             i, j, k;
-               int             texnum;
-
-               texnum = Scrap_AllocBlock (p->width, p->height, &x, &y);
-               scrap_dirty = true;
-               k = 0;
-               for (i=0 ; i<p->height ; i++)
-                       for (j=0 ; j<p->width ; j++, k++)
-                               scrap_texels[texnum][(y+i)*BLOCK_WIDTH + x + j] = p->data[k];
-               if (!scraptexnum[texnum])
-                       scraptexnum[texnum] = GL_LoadTexture (va("scrapslot%d", texnum), BLOCK_WIDTH, BLOCK_HEIGHT, scrap_texels[texnum], false, true, 1);
-               gl->texnum = scraptexnum[texnum];
-               gl->sl = (x+0.01)/(float)BLOCK_WIDTH;
-               gl->sh = (x+p->width-0.01)/(float)BLOCK_WIDTH;
-               gl->tl = (y+0.01)/(float)BLOCK_WIDTH;
-               gl->th = (y+p->height-0.01)/(float)BLOCK_WIDTH;
-
-               pic_count++;
-               pic_texels += p->width*p->height;
-       }
-       else
-       {
-               gl->texnum = GL_LoadPicTexture (p);
-               gl->sl = 0;
-               gl->sh = 1;
-               gl->tl = 0;
-               gl->th = 1;
-       }
-       return p;
-}
+int                    pic_texels;
+int                    pic_count;
 
+rtexturepool_t *drawtexturepool;
 
 /*
 ================
 Draw_CachePic
 ================
 */
+// FIXME: qpic is evil
 qpic_t *Draw_CachePic (char *path)
 {
        cachepic_t      *pic;
        int                     i;
        qpic_t          *dat;
        glpic_t         *gl;
+       rtexture_t      *tex;
 
-       for (pic=menu_cachepics, i=0 ; i<menu_numcachepics ; pic++, i++)
+       for (pic = menu_cachepics, i = 0;i < menu_numcachepics;pic++, i++)
                if (!strcmp (path, pic->name))
                        return &pic->pic;
 
@@ -202,99 +79,103 @@ qpic_t    *Draw_CachePic (char *path)
        menu_numcachepics++;
        strcpy (pic->name, path);
 
-//
-// load the pic from disk
-//
-       dat = (qpic_t *)COM_LoadTempFile (path, false);
-       if (!dat)
-               Sys_Error ("Draw_CachePic: failed to load %s", path);
-       SwapPic (dat);
-
+       // FIXME: move this to menu code
        // HACK HACK HACK --- we need to keep the bytes for
        // the translatable player picture just for the menu
        // configuration dialog
        if (!strcmp (path, "gfx/menuplyr.lmp"))
-               memcpy (menuplyr_pixels, dat->data, dat->width*dat->height);
-
-       pic->pic.width = dat->width;
-       pic->pic.height = dat->height;
+       {
+               dat = (qpic_t *)COM_LoadFile (path, false);
+               if (!dat)
+                       Sys_Error("unable to load gfx/menuplyr.lmp");
+               SwapPic (dat);
 
-       gl = (glpic_t *)pic->pic.data;
-       gl->texnum = loadtextureimage(path, 0, 0, false, false);
-       if (!gl->texnum)
-               gl->texnum = GL_LoadPicTexture (dat);
-       gl->sl = 0;
-       gl->sh = 1;
-       gl->tl = 0;
-       gl->th = 1;
+               memcpy (menuplyr_pixels, dat->data, dat->width*dat->height);
+       }
 
-       return &pic->pic;
+       // load the pic from disk
+       if ((tex = loadtextureimage(drawtexturepool, path, 0, 0, false, false, true)))
+       {
+               // load the pic from an image file
+               pic->pic.width = image_width;
+               pic->pic.height = image_height;
+               gl = (glpic_t *)pic->pic.data;
+               gl->tex = tex;
+               return &pic->pic;
+       }
+       else
+       {
+               qpic_t *p;
+               // load the pic from gfx.wad
+               p = W_GetLumpName (path);
+               if (!p)
+                       Sys_Error ("Draw_CachePic: failed to load %s", path);
+               pic->pic.width = p->width;
+               pic->pic.height = p->height;
+               gl = (glpic_t *)pic->pic.data;
+               gl->tex = R_LoadTexture (drawtexturepool, path, p->width, p->height, p->data, TEXTYPE_QPALETTE, TEXF_ALPHA | TEXF_PRECACHE);
+               return &pic->pic;
+       }
 }
 
-extern void LoadSky_f(void);
-
 /*
 ===============
 Draw_Init
 ===============
 */
-void rmain_registercvars();
-extern int buildnumber;
-
-void gl_draw_start()
+static void gl_draw_start(void)
 {
-       int             i;
+       int i;
+       byte *draw_chars;
+
+       menu_numcachepics = 0;
 
-       char_texture = loadtextureimage ("conchars", 0, 0, false, false);
+       drawtexturepool = R_AllocTexturePool();
+       char_texture = loadtextureimage (drawtexturepool, "conchars", 0, 0, false, false, true);
        if (!char_texture)
        {
                draw_chars = W_GetLumpName ("conchars");
-               for (i=0 ; i<128*128 ; i++)
+               // convert font to proper transparent color
+               for (i = 0;i < 128 * 128;i++)
                        if (draw_chars[i] == 0)
-                               draw_chars[i] = 255;    // proper transparent color
+                               draw_chars[i] = 255;
 
-               // now turn them into textures
-               char_texture = GL_LoadTexture ("charset", 128, 128, draw_chars, false, true, 1);
+               // now turn into texture
+               char_texture = R_LoadTexture (drawtexturepool, "charset", 128, 128, draw_chars, TEXTYPE_QPALETTE, TEXF_ALPHA | TEXF_PRECACHE);
        }
 
-       conbacktexnum = loadtextureimage("gfx/conback", 0, 0, false, false);
+       conbacktex = loadtextureimage(drawtexturepool, "gfx/conback", 0, 0, false, false, true);
+}
 
-       memset(scraptexnum, 0, sizeof(scraptexnum));
+static void gl_draw_shutdown(void)
+{
+       R_FreeTexturePool(&drawtexturepool);
 
-       // get the other pics we need
-       draw_disc = Draw_PicFromWad ("disc");
+       menu_numcachepics = 0;
 }
 
-void gl_draw_shutdown()
+void SHOWLMP_clear(void);
+static void gl_draw_newmap(void)
 {
+       SHOWLMP_clear();
 }
 
-char engineversion[40];
+extern char engineversion[40];
 int engineversionx, engineversiony;
 
-extern void GL_Textures_Init();
 void GL_Draw_Init (void)
 {
        int i;
-       Cvar_RegisterVariable (&qsg_version);
        Cvar_RegisterVariable (&scr_conalpha);
 
-       Cmd_AddCommand ("loadsky", &LoadSky_f);
-
-#if defined(__linux__)
-       sprintf (engineversion, "DarkPlaces Linux   GL %.2f build %3i", (float) VERSION, buildnumber);
-#elif defined(WIN32)
-       sprintf (engineversion, "DarkPlaces Windows GL %.2f build %3i", (float) VERSION, buildnumber);
-#else
-       sprintf (engineversion, "DarkPlaces Unknown GL %.2f build %3i", (float) VERSION, buildnumber);
-#endif
        for (i = 0;i < 40 && engineversion[i];i++)
-               engineversion[i] += 0x80; // shift to orange
-       engineversionx = vid.width - strlen(engineversion) * 8 - 8;
-       engineversiony = vid.height - 8;
+               engineversion[i] |= 0x80; // shift to orange
+       engineversionx = vid.conwidth - strlen(engineversion) * 8 - 8;
+       engineversiony = vid.conheight - 8;
 
-       GL_Textures_Init();
-       R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown);
+       menu_numcachepics = 0;
+
+       R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown, gl_draw_newmap);
 }
 
 /*
@@ -326,17 +207,31 @@ void Draw_Character (int x, int y, int num)
        fcol = col*0.0625;
        size = 0.0625;
 
-       if (!r_render.value)
+       if (!r_render.integer)
                return;
-       glBindTexture(GL_TEXTURE_2D, char_texture);
+       glBindTexture(GL_TEXTURE_2D, R_GetTexture(char_texture));
+       CHECKGLERROR
        // LordHavoc: NEAREST mode on text if not scaling up
-       if ((int) vid.width < glwidth)
+       if (vid.realwidth <= (int) vid.conwidth)
        {
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+               CHECKGLERROR
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+               CHECKGLERROR
+       }
+       else
+       {
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+               CHECKGLERROR
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+               CHECKGLERROR
        }
 
-       glColor3f(1,1,1);
+       if (lighthalf)
+               glColor3f(0.5f,0.5f,0.5f);
+       else
+               glColor3f(1.0f,1.0f,1.0f);
+       CHECKGLERROR
        glBegin (GL_QUADS);
        glTexCoord2f (fcol, frow);
        glVertex2f (x, y);
@@ -347,10 +242,14 @@ void Draw_Character (int x, int y, int num)
        glTexCoord2f (fcol, frow + size);
        glVertex2f (x, y+8);
        glEnd ();
+       CHECKGLERROR
 
        // LordHavoc: revert to LINEAR mode
-       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+//     if (vid.realwidth <= (int) vid.conwidth)
+//     {
+//             glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+//             glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+//     }
 }
 
 /*
@@ -363,26 +262,39 @@ void Draw_String (int x, int y, char *str, int maxlen)
 {
        int num;
        float frow, fcol;
-       if (!r_render.value)
+       if (!r_render.integer)
                return;
-       if (y <= -8 || y >= (int) vid.height || x >= (int) vid.width || *str == 0) // completely offscreen or no text to print
+       if (y <= -8 || y >= (int) vid.conheight || x >= (int) vid.conwidth || *str == 0) // completely offscreen or no text to print
                return;
        if (maxlen < 1)
                maxlen = strlen(str);
        else if (maxlen > (int) strlen(str))
                maxlen = strlen(str);
-       glBindTexture(GL_TEXTURE_2D, char_texture);
+       glBindTexture(GL_TEXTURE_2D, R_GetTexture(char_texture));
 
        // LordHavoc: NEAREST mode on text if not scaling up
-       if ((int) vid.width < glwidth)
+       if (vid.realwidth <= (int) vid.conwidth)
        {
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+               CHECKGLERROR
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+               CHECKGLERROR
+       }
+       else
+       {
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+               CHECKGLERROR
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+               CHECKGLERROR
        }
 
-       glColor3f(1,1,1);
+       if (lighthalf)
+               glColor3f(0.5f,0.5f,0.5f);
+       else
+               glColor3f(1.0f,1.0f,1.0f);
+       CHECKGLERROR
        glBegin (GL_QUADS);
-       while (maxlen-- && x < (int) vid.width) // stop rendering when out of characters or room
+       while (maxlen-- && x < (int) vid.conwidth) // stop rendering when out of characters or room
        {
                if ((num = *str++) != 32) // skip spaces
                {
@@ -396,24 +308,45 @@ void Draw_String (int x, int y, char *str, int maxlen)
                x += 8;
        }
        glEnd ();
+       CHECKGLERROR
 
        // LordHavoc: revert to LINEAR mode
-       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+//     if (vid.realwidth < (int) vid.conwidth)
+//     {
+//             glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+//             glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+//     }
 }
 
-void Draw_GenericPic (int texnum, float red, float green, float blue, float alpha, int x, int y, int width, int height)
+void Draw_AdditiveString (int x, int y, char *str, int maxlen)
 {
-       if (!r_render.value)
+       if (!r_render.integer)
                return;
-       glColor4f(red,green,blue,alpha);
-       glBindTexture(GL_TEXTURE_2D, texnum);
+       glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+       CHECKGLERROR
+       Draw_String(x, y, str, maxlen);
+       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+       CHECKGLERROR
+}
+
+void Draw_GenericPic (rtexture_t *tex, float red, float green, float blue, float alpha, int x, int y, int width, int height)
+{
+       if (!r_render.integer)
+               return;
+       if (lighthalf)
+               glColor4f(red * 0.5f, green * 0.5f, blue * 0.5f, alpha);
+       else
+               glColor4f(red, green, blue, alpha);
+       CHECKGLERROR
+       glBindTexture(GL_TEXTURE_2D, R_GetTexture(tex));
+       CHECKGLERROR
        glBegin (GL_QUADS);
        glTexCoord2f (0, 0);glVertex2f (x, y);
        glTexCoord2f (1, 0);glVertex2f (x+width, y);
        glTexCoord2f (1, 1);glVertex2f (x+width, y+height);
        glTexCoord2f (0, 1);glVertex2f (x, y+height);
        glEnd ();
+       CHECKGLERROR
 }
 
 /*
@@ -423,21 +356,8 @@ Draw_AlphaPic
 */
 void Draw_AlphaPic (int x, int y, qpic_t *pic, float alpha)
 {
-       glpic_t                 *gl;
-
-       if (scrap_dirty)
-               Scrap_Upload ();
-       gl = (glpic_t *)pic->data;
-       if (!r_render.value)
-               return;
-       glColor4f(1,1,1,alpha);
-       glBindTexture(GL_TEXTURE_2D, gl->texnum);
-       glBegin (GL_QUADS);
-       glTexCoord2f (gl->sl, gl->tl);glVertex2f (x, y);
-       glTexCoord2f (gl->sh, gl->tl);glVertex2f (x+pic->width, y);
-       glTexCoord2f (gl->sh, gl->th);glVertex2f (x+pic->width, y+pic->height);
-       glTexCoord2f (gl->sl, gl->th);glVertex2f (x, y+pic->height);
-       glEnd ();
+       if (pic)
+               Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,alpha, x,y,pic->width, pic->height);
 }
 
 
@@ -448,21 +368,21 @@ Draw_Pic
 */
 void Draw_Pic (int x, int y, qpic_t *pic)
 {
-       glpic_t                 *gl;
+       if (pic)
+               Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,1, x,y,pic->width, pic->height);
+}
 
-       if (scrap_dirty)
-               Scrap_Upload ();
-       gl = (glpic_t *)pic->data;
-       if (!r_render.value)
-               return;
-       glColor3f(1,1,1);
-       glBindTexture(GL_TEXTURE_2D, gl->texnum);
-       glBegin (GL_QUADS);
-       glTexCoord2f (gl->sl, gl->tl);glVertex2f (x, y);
-       glTexCoord2f (gl->sh, gl->tl);glVertex2f (x+pic->width, y);
-       glTexCoord2f (gl->sh, gl->th);glVertex2f (x+pic->width, y+pic->height);
-       glTexCoord2f (gl->sl, gl->th);glVertex2f (x, y+pic->height);
-       glEnd ();
+
+void Draw_AdditivePic (int x, int y, qpic_t *pic)
+{
+       if (pic)
+       {
+               glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+               CHECKGLERROR
+               Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,1, x,y,pic->width, pic->height);
+               glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+               CHECKGLERROR
+       }
 }
 
 
@@ -477,29 +397,23 @@ void Draw_PicTranslate (int x, int y, qpic_t *pic, byte *translation)
 {
        int                             i, c;
        byte                    *trans, *src, *dest;
+       rtexture_t              *rt;
+
+       if (pic == NULL)
+               return;
 
        c = pic->width * pic->height;
        src = menuplyr_pixels;
-       dest = trans = malloc(c);
+       dest = trans = Mem_Alloc(tempmempool, c);
        for (i = 0;i < c;i++)
                *dest++ = translation[*src++];
 
-       c = GL_LoadTexture ("translatedplayerpic", pic->width, pic->height, trans, false, true, 1);
-       free(trans);
+       rt = R_LoadTexture (drawtexturepool, "translatedplayerpic", pic->width, pic->height, trans, TEXTYPE_QPALETTE, TEXF_ALPHA | TEXF_PRECACHE);
+       Mem_Free(trans);
 
-       if (!r_render.value)
+       if (!r_render.integer)
                return;
-       Draw_GenericPic (c, 1,1,1,1, x, y, pic->width, pic->height);
-       /*
-       glBindTexture(GL_TEXTURE_2D, c);
-       glColor3f(1,1,1);
-       glBegin (GL_QUADS);
-       glTexCoord2f (0, 0);glVertex2f (x, y);
-       glTexCoord2f (1, 0);glVertex2f (x+pic->width, y);
-       glTexCoord2f (1, 1);glVertex2f (x+pic->width, y+pic->height);
-       glTexCoord2f (0, 1);glVertex2f (x, y+pic->height);
-       glEnd ();
-       */
+       Draw_GenericPic (rt, 1,1,1,1, x, y, pic->width, pic->height);
 }
 
 
@@ -511,9 +425,9 @@ Draw_ConsoleBackground
 */
 void Draw_ConsoleBackground (int lines)
 {
-       Draw_GenericPic (conbacktexnum, 1,1,1,scr_conalpha.value*lines/vid.height, 0, lines - vid.height, vid.width, vid.height);
+       Draw_GenericPic (conbacktex, 1,1,1,scr_conalpha.value * lines / vid.conheight, 0, lines - vid.conheight, vid.conwidth, vid.conheight);
        // LordHavoc: draw version
-       Draw_String(engineversionx, lines - vid.height + engineversiony, engineversion, 9999);
+       Draw_String(engineversionx, lines - vid.conheight + engineversiony, engineversion, 9999);
 }
 
 /*
@@ -525,10 +439,18 @@ Fills a box of pixels with a single color
 */
 void Draw_Fill (int x, int y, int w, int h, int c)
 {
-       if (!r_render.value)
+       if (!r_render.integer)
                return;
        glDisable (GL_TEXTURE_2D);
-       glColor3f (host_basepal[c*3]/255.0, host_basepal[c*3+1]/255.0, host_basepal[c*3+2]/255.0);
+       CHECKGLERROR
+       if (lighthalf)
+       {
+               byte *tempcolor = (byte *)&d_8to24table[c];
+               glColor4ub ((byte) (tempcolor[0] >> 1), (byte) (tempcolor[1] >> 1), (byte) (tempcolor[2] >> 1), tempcolor[3]);
+       }
+       else
+               glColor4ubv ((byte *)&d_8to24table[c]);
+       CHECKGLERROR
 
        glBegin (GL_QUADS);
 
@@ -538,8 +460,11 @@ void Draw_Fill (int x, int y, int w, int h, int c)
        glVertex2f (x, y+h);
 
        glEnd ();
+       CHECKGLERROR
        glColor3f(1,1,1);
+       CHECKGLERROR
        glEnable (GL_TEXTURE_2D);
+       CHECKGLERROR
 }
 //=============================================================================
 
@@ -554,28 +479,40 @@ Setup as if the screen was 320*200
 */
 void GL_Set2D (void)
 {
-       if (!r_render.value)
+       if (!r_render.integer)
                return;
-       glViewport (glx, gly, glwidth, glheight);
+       glViewport (vid.realx, vid.realy, vid.realwidth, vid.realheight);
+       CHECKGLERROR
 
        glMatrixMode(GL_PROJECTION);
+       CHECKGLERROR
     glLoadIdentity ();
-       glOrtho  (0, vid.width, vid.height, 0, -99999, 99999);
+       CHECKGLERROR
+       glOrtho  (0, vid.conwidth, vid.conheight, 0, -99999, 99999);
+       CHECKGLERROR
 
        glMatrixMode(GL_MODELVIEW);
+       CHECKGLERROR
     glLoadIdentity ();
+       CHECKGLERROR
 
        glDisable (GL_DEPTH_TEST);
+       CHECKGLERROR
        glDisable (GL_CULL_FACE);
+       CHECKGLERROR
        glEnable (GL_BLEND);
-       glDisable (GL_ALPHA_TEST);
+       CHECKGLERROR
        glEnable(GL_TEXTURE_2D);
+       CHECKGLERROR
 
        // LordHavoc: added this
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+       CHECKGLERROR
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+       CHECKGLERROR
 
        glColor3f(1,1,1);
+       CHECKGLERROR
 }
 
 // LordHavoc: SHOWLMP stuff
@@ -591,7 +528,7 @@ typedef struct showlmp_s
 
 showlmp_t showlmp[SHOWLMP_MAXLABELS];
 
-void SHOWLMP_decodehide()
+void SHOWLMP_decodehide(void)
 {
        int i;
        byte *lmplabel;
@@ -604,15 +541,23 @@ void SHOWLMP_decodehide()
                }
 }
 
-void SHOWLMP_decodeshow()
+void SHOWLMP_decodeshow(void)
 {
        int i, k;
        byte lmplabel[256], picname[256];
        float x, y;
        strcpy(lmplabel,MSG_ReadString());
        strcpy(picname, MSG_ReadString());
-       x = MSG_ReadByte();
-       y = MSG_ReadByte();
+       if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk
+       {
+               x = MSG_ReadByte();
+               y = MSG_ReadByte();
+       }
+       else
+       {
+               x = MSG_ReadShort();
+               y = MSG_ReadShort();
+       }
        k = -1;
        for (i = 0;i < SHOWLMP_MAXLABELS;i++)
                if (showlmp[i].isactive)
@@ -635,7 +580,7 @@ void SHOWLMP_decodeshow()
        showlmp[k].y = y;
 }
 
-void SHOWLMP_drawall()
+void SHOWLMP_drawall(void)
 {
        int i;
        for (i = 0;i < SHOWLMP_MAXLABELS;i++)
@@ -643,7 +588,7 @@ void SHOWLMP_drawall()
                        Draw_Pic(showlmp[i].x, showlmp[i].y, Draw_CachePic(showlmp[i].pic));
 }
 
-void SHOWLMP_clear()
+void SHOWLMP_clear(void)
 {
        int i;
        for (i = 0;i < SHOWLMP_MAXLABELS;i++)